opencode-discord-presence 0.1.5 → 0.2.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/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +117 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/config.d.ts +0 -45
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -65
- package/dist/config.js.map +0 -1
- package/dist/i18n/index.d.ts +0 -10
- package/dist/i18n/index.d.ts.map +0 -1
- package/dist/i18n/index.js +0 -32
- package/dist/i18n/index.js.map +0 -1
- package/dist/i18n/locales/en.d.ts +0 -3
- package/dist/i18n/locales/en.d.ts.map +0 -1
- package/dist/i18n/locales/en.js +0 -13
- package/dist/i18n/locales/en.js.map +0 -1
- package/dist/i18n/locales/ja.d.ts +0 -3
- package/dist/i18n/locales/ja.d.ts.map +0 -1
- package/dist/i18n/locales/ja.js +0 -13
- package/dist/i18n/locales/ja.js.map +0 -1
- package/dist/i18n/locales/ko.d.ts +0 -14
- package/dist/i18n/locales/ko.d.ts.map +0 -1
- package/dist/i18n/locales/ko.js +0 -14
- package/dist/i18n/locales/ko.js.map +0 -1
- package/dist/i18n/locales/zh.d.ts +0 -3
- package/dist/i18n/locales/zh.d.ts.map +0 -1
- package/dist/i18n/locales/zh.js +0 -13
- package/dist/i18n/locales/zh.js.map +0 -1
- package/dist/plugin.d.ts +0 -38
- package/dist/plugin.d.ts.map +0 -1
- package/dist/plugin.js +0 -144
- package/dist/plugin.js.map +0 -1
- package/dist/services/discord-rpc.d.ts +0 -83
- package/dist/services/discord-rpc.d.ts.map +0 -1
- package/dist/services/discord-rpc.js +0 -200
- package/dist/services/discord-rpc.js.map +0 -1
- package/dist/types/index.d.ts +0 -68
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -6
- package/dist/types/index.js.map +0 -1
- package/dist/utils/format.d.ts +0 -45
- package/dist/utils/format.d.ts.map +0 -1
- package/dist/utils/format.js +0 -103
- package/dist/utils/format.js.map +0 -1
- package/dist/utils/particle.d.ts +0 -34
- package/dist/utils/particle.d.ts.map +0 -1
- package/dist/utils/particle.js +0 -83
- package/dist/utils/particle.js.map +0 -1
- package/dist/utils/project.d.ts +0 -32
- package/dist/utils/project.d.ts.map +0 -1
- package/dist/utils/project.js +0 -81
- package/dist/utils/project.js.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import type { Plugin } from "@opencode-ai/plugin";
|
|
2
|
+
interface PresenceConfig {
|
|
3
|
+
enabled: boolean;
|
|
4
|
+
clientId: string;
|
|
5
|
+
showSessionTime: boolean;
|
|
6
|
+
}
|
|
7
|
+
declare function getConfig(): PresenceConfig;
|
|
8
|
+
export declare const OpenCodeDiscordPresence: Plugin;
|
|
3
9
|
export default OpenCodeDiscordPresence;
|
|
4
|
-
export { getConfig }
|
|
10
|
+
export { getConfig };
|
|
5
11
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
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;IAChB,eAAe,EAAE,OAAO,CAAA;CACzB;AAED,iBAAS,SAAS,IAAI,cAAc,CAMnC;AAmFD,eAAO,MAAM,uBAAuB,EAAE,MA4BrC,CAAA;AAED,eAAe,uBAAuB,CAAA;AACtC,OAAO,EAAE,SAAS,EAAE,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,119 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
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
|
+
showSessionTime: true,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
class DiscordRPC {
|
|
13
|
+
clientId;
|
|
14
|
+
client = null;
|
|
15
|
+
connected = false;
|
|
16
|
+
connecting = false;
|
|
17
|
+
retryCount = 0;
|
|
18
|
+
sessionStart = null;
|
|
19
|
+
constructor(clientId) {
|
|
20
|
+
this.clientId = clientId;
|
|
21
|
+
}
|
|
22
|
+
async connect() {
|
|
23
|
+
if (this.connected || this.connecting)
|
|
24
|
+
return this.connected;
|
|
25
|
+
this.connecting = true;
|
|
26
|
+
try {
|
|
27
|
+
this.client = new Client({ clientId: this.clientId });
|
|
28
|
+
this.client.on("ready", () => {
|
|
29
|
+
this.connected = true;
|
|
30
|
+
this.connecting = false;
|
|
31
|
+
this.retryCount = 0;
|
|
32
|
+
console.log("[discord-presence] Connected");
|
|
33
|
+
});
|
|
34
|
+
this.client.on("disconnected", () => {
|
|
35
|
+
this.connected = false;
|
|
36
|
+
console.log("[discord-presence] Disconnected");
|
|
37
|
+
this.scheduleReconnect();
|
|
38
|
+
});
|
|
39
|
+
await this.client.login();
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
this.connecting = false;
|
|
44
|
+
this.scheduleReconnect();
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
scheduleReconnect() {
|
|
49
|
+
if (this.retryCount >= MAX_RETRIES)
|
|
50
|
+
return;
|
|
51
|
+
this.retryCount++;
|
|
52
|
+
setTimeout(() => this.connect(), RECONNECT_DELAY);
|
|
53
|
+
}
|
|
54
|
+
startSession() {
|
|
55
|
+
this.sessionStart = new Date();
|
|
56
|
+
}
|
|
57
|
+
async setPresence(details, state) {
|
|
58
|
+
if (!this.connected || !this.client?.user)
|
|
59
|
+
return;
|
|
60
|
+
const activity = {
|
|
61
|
+
details,
|
|
62
|
+
state,
|
|
63
|
+
largeImageKey: "opencode-logo",
|
|
64
|
+
largeImageText: "OpenCode",
|
|
65
|
+
};
|
|
66
|
+
if (this.sessionStart) {
|
|
67
|
+
activity.startTimestamp = this.sessionStart;
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
await this.client.user.setActivity(activity);
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
console.warn("[discord-presence] Failed to update:", error);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async clear() {
|
|
77
|
+
if (!this.connected || !this.client?.user)
|
|
78
|
+
return;
|
|
79
|
+
try {
|
|
80
|
+
await this.client.user.clearActivity();
|
|
81
|
+
}
|
|
82
|
+
catch { }
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
let rpc = null;
|
|
86
|
+
let currentAgent = "OpenCode";
|
|
87
|
+
let currentModel = "";
|
|
88
|
+
export const OpenCodeDiscordPresence = async (ctx) => {
|
|
89
|
+
const config = getConfig();
|
|
90
|
+
if (!config.enabled)
|
|
91
|
+
return {};
|
|
92
|
+
rpc = new DiscordRPC(config.clientId);
|
|
93
|
+
await rpc.connect();
|
|
94
|
+
rpc.startSession();
|
|
95
|
+
const updatePresence = async (idle = false) => {
|
|
96
|
+
if (!rpc)
|
|
97
|
+
return;
|
|
98
|
+
const details = idle ? `${currentAgent} is idle` : `Working with ${currentAgent}`;
|
|
99
|
+
const state = currentModel || undefined;
|
|
100
|
+
await rpc.setPresence(details, state);
|
|
101
|
+
};
|
|
102
|
+
return {
|
|
103
|
+
"chat.message": async (input) => {
|
|
104
|
+
if (input.agent)
|
|
105
|
+
currentAgent = input.agent;
|
|
106
|
+
if (input.model)
|
|
107
|
+
currentModel = String(input.model).split("-")[0];
|
|
108
|
+
await updatePresence(false);
|
|
109
|
+
},
|
|
110
|
+
event: async ({ event }) => {
|
|
111
|
+
if (event.type === "session.idle") {
|
|
112
|
+
await updatePresence(true);
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
};
|
|
3
117
|
export default OpenCodeDiscordPresence;
|
|
4
|
-
export { getConfig }
|
|
118
|
+
export { getConfig };
|
|
5
119
|
//# 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":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAoB,MAAM,sBAAsB,CAAA;AAE/D,MAAM,iBAAiB,GAAG,qBAAqB,CAAA;AAC/C,MAAM,eAAe,GAAG,IAAI,CAAA;AAC5B,MAAM,WAAW,GAAG,EAAE,CAAA;AAQtB,SAAS,SAAS;IAChB,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,OAAO;QACzD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,iBAAiB;QACrE,eAAe,EAAE,IAAI;KACtB,CAAA;AACH,CAAC;AAED,MAAM,UAAU;IAOM;IANZ,MAAM,GAAkB,IAAI,CAAA;IAC5B,SAAS,GAAG,KAAK,CAAA;IACjB,UAAU,GAAG,KAAK,CAAA;IAClB,UAAU,GAAG,CAAC,CAAA;IACd,YAAY,GAAgB,IAAI,CAAA;IAExC,YAAoB,QAAgB;QAAhB,aAAQ,GAAR,QAAQ,CAAQ;IAAG,CAAC;IAExC,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC,SAAS,CAAA;QAE5D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QACtB,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;YAErD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;gBACrB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;gBACvB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAA;gBACnB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAA;YAC7C,CAAC,CAAC,CAAA;YAEF,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;gBAClC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;gBACtB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAA;gBAC9C,IAAI,CAAC,iBAAiB,EAAE,CAAA;YAC1B,CAAC,CAAC,CAAA;YAEF,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;YACzB,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;YACvB,IAAI,CAAC,iBAAiB,EAAE,CAAA;YACxB,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAEO,iBAAiB;QACvB,IAAI,IAAI,CAAC,UAAU,IAAI,WAAW;YAAE,OAAM;QAC1C,IAAI,CAAC,UAAU,EAAE,CAAA;QACjB,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,CAAA;IACnD,CAAC;IAED,YAAY;QACV,IAAI,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAe,EAAE,KAAc;QAC/C,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI;YAAE,OAAM;QAEjD,MAAM,QAAQ,GAAgB;YAC5B,OAAO;YACP,KAAK;YACL,aAAa,EAAE,eAAe;YAC9B,cAAc,EAAE,UAAU;SAC3B,CAAA;QAED,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,QAAQ,CAAC,cAAc,GAAG,IAAI,CAAC,YAAY,CAAA;QAC7C,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAA;QAC7D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI;YAAE,OAAM;QACjD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAA;QACxC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;CACF;AAED,IAAI,GAAG,GAAsB,IAAI,CAAA;AACjC,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,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACrC,MAAM,GAAG,CAAC,OAAO,EAAE,CAAA;IACnB,GAAG,CAAC,YAAY,EAAE,CAAA;IAElB,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,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;QACH,CAAC;KACF,CAAA;AACH,CAAC,CAAA;AAED,eAAe,uBAAuB,CAAA;AACtC,OAAO,EAAE,SAAS,EAAE,CAAA"}
|
package/package.json
CHANGED
package/dist/config.d.ts
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Configuration management for Discord Presence plugin
|
|
3
|
-
* @module opencode-discord-presence/config
|
|
4
|
-
*
|
|
5
|
-
* Handles plugin configuration with sensible defaults and user overrides.
|
|
6
|
-
* Configuration is typically passed from opencode.json.
|
|
7
|
-
*/
|
|
8
|
-
import type { DiscordPresenceConfig } from "./types/index.js";
|
|
9
|
-
/**
|
|
10
|
-
* Default Discord Application ID
|
|
11
|
-
* Users can override this with their own Application ID if needed.
|
|
12
|
-
* This ID should be replaced with the actual shared Application ID
|
|
13
|
-
* created in Discord Developer Portal.
|
|
14
|
-
*/
|
|
15
|
-
export declare const DEFAULT_APPLICATION_ID = "1466770544748662819";
|
|
16
|
-
/**
|
|
17
|
-
* Default configuration for the Discord Presence plugin
|
|
18
|
-
*
|
|
19
|
-
* All options are enabled by default for the best out-of-box experience.
|
|
20
|
-
*/
|
|
21
|
-
export declare const defaultConfig: DiscordPresenceConfig;
|
|
22
|
-
/**
|
|
23
|
-
* Merge user configuration with defaults
|
|
24
|
-
*
|
|
25
|
-
* @param userConfig - Partial user configuration from opencode.json
|
|
26
|
-
* @returns Complete configuration with defaults applied
|
|
27
|
-
*
|
|
28
|
-
* @example
|
|
29
|
-
* ```typescript
|
|
30
|
-
* // User wants to disable token usage display
|
|
31
|
-
* const config = getConfig({ showTokenUsage: false })
|
|
32
|
-
* // config.enabled === true (default)
|
|
33
|
-
* // config.showTokenUsage === false (user override)
|
|
34
|
-
* // config.showSessionTime === true (default)
|
|
35
|
-
* ```
|
|
36
|
-
*/
|
|
37
|
-
export declare function getConfig(userConfig: Partial<DiscordPresenceConfig>): DiscordPresenceConfig;
|
|
38
|
-
/**
|
|
39
|
-
* Validate configuration and return warnings for invalid values
|
|
40
|
-
*
|
|
41
|
-
* @param config - Configuration to validate
|
|
42
|
-
* @returns Array of warning messages
|
|
43
|
-
*/
|
|
44
|
-
export declare function validateConfig(config: DiscordPresenceConfig): string[];
|
|
45
|
-
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAE7D;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,wBAAwB,CAAA;AAE3D;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,qBAO3B,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,qBAAqB,CAAC,GAAG,qBAAqB,CAK3F;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,EAAE,CActE"}
|
package/dist/config.js
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Configuration management for Discord Presence plugin
|
|
3
|
-
* @module opencode-discord-presence/config
|
|
4
|
-
*
|
|
5
|
-
* Handles plugin configuration with sensible defaults and user overrides.
|
|
6
|
-
* Configuration is typically passed from opencode.json.
|
|
7
|
-
*/
|
|
8
|
-
/**
|
|
9
|
-
* Default Discord Application ID
|
|
10
|
-
* Users can override this with their own Application ID if needed.
|
|
11
|
-
* This ID should be replaced with the actual shared Application ID
|
|
12
|
-
* created in Discord Developer Portal.
|
|
13
|
-
*/
|
|
14
|
-
export const DEFAULT_APPLICATION_ID = "1466770544748662819";
|
|
15
|
-
/**
|
|
16
|
-
* Default configuration for the Discord Presence plugin
|
|
17
|
-
*
|
|
18
|
-
* All options are enabled by default for the best out-of-box experience.
|
|
19
|
-
*/
|
|
20
|
-
export const defaultConfig = {
|
|
21
|
-
enabled: true,
|
|
22
|
-
applicationId: DEFAULT_APPLICATION_ID,
|
|
23
|
-
showSessionTime: true,
|
|
24
|
-
showTokenUsage: true,
|
|
25
|
-
showProjectName: true,
|
|
26
|
-
language: "auto",
|
|
27
|
-
};
|
|
28
|
-
/**
|
|
29
|
-
* Merge user configuration with defaults
|
|
30
|
-
*
|
|
31
|
-
* @param userConfig - Partial user configuration from opencode.json
|
|
32
|
-
* @returns Complete configuration with defaults applied
|
|
33
|
-
*
|
|
34
|
-
* @example
|
|
35
|
-
* ```typescript
|
|
36
|
-
* // User wants to disable token usage display
|
|
37
|
-
* const config = getConfig({ showTokenUsage: false })
|
|
38
|
-
* // config.enabled === true (default)
|
|
39
|
-
* // config.showTokenUsage === false (user override)
|
|
40
|
-
* // config.showSessionTime === true (default)
|
|
41
|
-
* ```
|
|
42
|
-
*/
|
|
43
|
-
export function getConfig(userConfig) {
|
|
44
|
-
return {
|
|
45
|
-
...defaultConfig,
|
|
46
|
-
...userConfig,
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Validate configuration and return warnings for invalid values
|
|
51
|
-
*
|
|
52
|
-
* @param config - Configuration to validate
|
|
53
|
-
* @returns Array of warning messages
|
|
54
|
-
*/
|
|
55
|
-
export function validateConfig(config) {
|
|
56
|
-
const warnings = [];
|
|
57
|
-
if (config.applicationId === DEFAULT_APPLICATION_ID) {
|
|
58
|
-
warnings.push("Using default Discord Application ID. For custom branding, create your own app at https://discord.com/developers/applications");
|
|
59
|
-
}
|
|
60
|
-
if (!config.applicationId) {
|
|
61
|
-
warnings.push("Discord Application ID is required for Rich Presence to work");
|
|
62
|
-
}
|
|
63
|
-
return warnings;
|
|
64
|
-
}
|
|
65
|
-
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,qBAAqB,CAAA;AAE3D;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAA0B;IAClD,OAAO,EAAE,IAAI;IACb,aAAa,EAAE,sBAAsB;IACrC,eAAe,EAAE,IAAI;IACrB,cAAc,EAAE,IAAI;IACpB,eAAe,EAAE,IAAI;IACrB,QAAQ,EAAE,MAAM;CACjB,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,SAAS,CAAC,UAA0C;IAClE,OAAO;QACL,GAAG,aAAa;QAChB,GAAG,UAAU;KACd,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,MAA6B;IAC1D,MAAM,QAAQ,GAAa,EAAE,CAAA;IAE7B,IAAI,MAAM,CAAC,aAAa,KAAK,sBAAsB,EAAE,CAAC;QACpD,QAAQ,CAAC,IAAI,CACX,+HAA+H,CAChI,CAAA;IACH,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QAC1B,QAAQ,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAA;IAC/E,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC"}
|
package/dist/i18n/index.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { type Locale } from "./locales/ko.js";
|
|
2
|
-
export type SupportedLanguage = "ko" | "en" | "ja" | "zh" | "auto";
|
|
3
|
-
export declare const supportedLanguages: Exclude<SupportedLanguage, "auto">[];
|
|
4
|
-
export declare function getLocale(language?: SupportedLanguage): Locale;
|
|
5
|
-
export declare function getAvailableLanguages(): Array<{
|
|
6
|
-
code: string;
|
|
7
|
-
name: string;
|
|
8
|
-
}>;
|
|
9
|
-
export type { Locale } from "./locales/ko.js";
|
|
10
|
-
//# sourceMappingURL=index.d.ts.map
|
package/dist/i18n/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAM,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAGjD,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAA;AASlE,eAAO,MAAM,kBAAkB,EAA2B,OAAO,CAAC,iBAAiB,EAAE,MAAM,CAAC,EAAE,CAAA;AAa9F,wBAAgB,SAAS,CAAC,QAAQ,GAAE,iBAA0B,GAAG,MAAM,CAMtE;AAED,wBAAgB,qBAAqB,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAK7E;AAED,YAAY,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA"}
|
package/dist/i18n/index.js
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { en } from "./locales/en.js";
|
|
2
|
-
import { ja } from "./locales/ja.js";
|
|
3
|
-
import { ko } from "./locales/ko.js";
|
|
4
|
-
import { zh } from "./locales/zh.js";
|
|
5
|
-
const locales = {
|
|
6
|
-
ko,
|
|
7
|
-
en,
|
|
8
|
-
ja,
|
|
9
|
-
zh,
|
|
10
|
-
};
|
|
11
|
-
export const supportedLanguages = Object.keys(locales);
|
|
12
|
-
function detectSystemLanguage() {
|
|
13
|
-
const env = process.env.LANG || process.env.LANGUAGE || process.env.LC_ALL || "";
|
|
14
|
-
const langCode = env.split("_")[0]?.toLowerCase();
|
|
15
|
-
if (langCode && langCode in locales) {
|
|
16
|
-
return langCode;
|
|
17
|
-
}
|
|
18
|
-
return "en";
|
|
19
|
-
}
|
|
20
|
-
export function getLocale(language = "auto") {
|
|
21
|
-
if (language === "auto") {
|
|
22
|
-
return locales[detectSystemLanguage()];
|
|
23
|
-
}
|
|
24
|
-
return locales[language] || locales.en;
|
|
25
|
-
}
|
|
26
|
-
export function getAvailableLanguages() {
|
|
27
|
-
return Object.values(locales).map((locale) => ({
|
|
28
|
-
code: locale.code,
|
|
29
|
-
name: locale.name,
|
|
30
|
-
}));
|
|
31
|
-
}
|
|
32
|
-
//# sourceMappingURL=index.js.map
|
package/dist/i18n/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAA;AACpC,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAA;AACpC,OAAO,EAAE,EAAE,EAAe,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAA;AAIpC,MAAM,OAAO,GAAuD;IAClE,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE;CACH,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAyC,CAAA;AAE9F,SAAS,oBAAoB;IAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAA;IAChF,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAA;IAEjD,IAAI,QAAQ,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC;QACpC,OAAO,QAA8C,CAAA;IACvD,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,WAA8B,MAAM;IAC5D,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAA;IACxC,CAAC;IAED,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,EAAE,CAAA;AACxC,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC7C,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;KAClB,CAAC,CAAC,CAAA;AACL,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../../src/i18n/locales/en.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAErC,eAAO,MAAM,EAAE,EAAE,MAahB,CAAA"}
|
package/dist/i18n/locales/en.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export const en = {
|
|
2
|
-
code: "en",
|
|
3
|
-
name: "English",
|
|
4
|
-
presence: {
|
|
5
|
-
active: (agent) => `Working with ${agent}`,
|
|
6
|
-
idle: (agent) => `${agent} is idle`,
|
|
7
|
-
},
|
|
8
|
-
status: {
|
|
9
|
-
opencode: "OpenCode",
|
|
10
|
-
tokens: (count) => `${count} tokens`,
|
|
11
|
-
},
|
|
12
|
-
};
|
|
13
|
-
//# sourceMappingURL=en.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"en.js","sourceRoot":"","sources":["../../../src/i18n/locales/en.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,EAAE,GAAW;IACxB,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,SAAS;IAEf,QAAQ,EAAE;QACR,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,gBAAgB,KAAK,EAAE;QAClD,IAAI,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,GAAG,KAAK,UAAU;KAC5C;IAED,MAAM,EAAE;QACN,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,GAAG,KAAK,SAAS;KAC7C;CACF,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ja.d.ts","sourceRoot":"","sources":["../../../src/i18n/locales/ja.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAErC,eAAO,MAAM,EAAE,EAAE,MAahB,CAAA"}
|
package/dist/i18n/locales/ja.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export const ja = {
|
|
2
|
-
code: "ja",
|
|
3
|
-
name: "日本語",
|
|
4
|
-
presence: {
|
|
5
|
-
active: (agent) => `${agent}で作業中`,
|
|
6
|
-
idle: (agent) => `${agent}は休憩中`,
|
|
7
|
-
},
|
|
8
|
-
status: {
|
|
9
|
-
opencode: "OpenCode",
|
|
10
|
-
tokens: (count) => `${count}トークン`,
|
|
11
|
-
},
|
|
12
|
-
};
|
|
13
|
-
//# sourceMappingURL=ja.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ja.js","sourceRoot":"","sources":["../../../src/i18n/locales/ja.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,EAAE,GAAW;IACxB,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,KAAK;IAEX,QAAQ,EAAE;QACR,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,GAAG,KAAK,MAAM;QACzC,IAAI,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,GAAG,KAAK,MAAM;KACxC;IAED,MAAM,EAAE;QACN,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,GAAG,KAAK,MAAM;KAC1C;CACF,CAAA"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export interface Locale {
|
|
2
|
-
code: string;
|
|
3
|
-
name: string;
|
|
4
|
-
presence: {
|
|
5
|
-
active: (agent: string) => string;
|
|
6
|
-
idle: (agent: string) => string;
|
|
7
|
-
};
|
|
8
|
-
status: {
|
|
9
|
-
opencode: string;
|
|
10
|
-
tokens: (count: string) => string;
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
export declare const ko: Locale;
|
|
14
|
-
//# sourceMappingURL=ko.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ko.d.ts","sourceRoot":"","sources":["../../../src/i18n/locales/ko.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE;QACR,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;QACjC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;KAChC,CAAA;IACD,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,CAAA;QAChB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;KAClC,CAAA;CACF;AAED,eAAO,MAAM,EAAE,EAAE,MAahB,CAAA"}
|
package/dist/i18n/locales/ko.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { withParticle } from "../../utils/particle.js";
|
|
2
|
-
export const ko = {
|
|
3
|
-
code: "ko",
|
|
4
|
-
name: "한국어",
|
|
5
|
-
presence: {
|
|
6
|
-
active: (agent) => `${withParticle(agent, "을/를")} 갈구는중`,
|
|
7
|
-
idle: (agent) => `${withParticle(agent, "은/는")} 휴식중`,
|
|
8
|
-
},
|
|
9
|
-
status: {
|
|
10
|
-
opencode: "OpenCode",
|
|
11
|
-
tokens: (count) => `${count} 토큰`,
|
|
12
|
-
},
|
|
13
|
-
};
|
|
14
|
-
//# sourceMappingURL=ko.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ko.js","sourceRoot":"","sources":["../../../src/i18n/locales/ko.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAetD,MAAM,CAAC,MAAM,EAAE,GAAW;IACxB,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,KAAK;IAEX,QAAQ,EAAE;QACR,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,GAAG,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO;QAC/D,IAAI,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,GAAG,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM;KAC7D;IAED,MAAM,EAAE;QACN,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,GAAG,KAAK,KAAK;KACzC;CACF,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"zh.d.ts","sourceRoot":"","sources":["../../../src/i18n/locales/zh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAErC,eAAO,MAAM,EAAE,EAAE,MAahB,CAAA"}
|
package/dist/i18n/locales/zh.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export const zh = {
|
|
2
|
-
code: "zh",
|
|
3
|
-
name: "中文",
|
|
4
|
-
presence: {
|
|
5
|
-
active: (agent) => `正在使用 ${agent}`,
|
|
6
|
-
idle: (agent) => `${agent} 休息中`,
|
|
7
|
-
},
|
|
8
|
-
status: {
|
|
9
|
-
opencode: "OpenCode",
|
|
10
|
-
tokens: (count) => `${count} 令牌`,
|
|
11
|
-
},
|
|
12
|
-
};
|
|
13
|
-
//# sourceMappingURL=zh.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"zh.js","sourceRoot":"","sources":["../../../src/i18n/locales/zh.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,EAAE,GAAW;IACxB,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IAEV,QAAQ,EAAE;QACR,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,QAAQ,KAAK,EAAE;QAC1C,IAAI,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,GAAG,KAAK,MAAM;KACxC;IAED,MAAM,EAAE;QACN,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,GAAG,KAAK,KAAK;KACzC;CACF,CAAA"}
|
package/dist/plugin.d.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Main plugin implementation for OpenCode Discord Presence
|
|
3
|
-
* @module opencode-discord-presence/plugin
|
|
4
|
-
*
|
|
5
|
-
* This is the core plugin that integrates with OpenCode to display
|
|
6
|
-
* Rich Presence in Discord, showing:
|
|
7
|
-
* - Current AI agent being used
|
|
8
|
-
* - Current model
|
|
9
|
-
* - Activity status (active/idle)
|
|
10
|
-
* - Optional: session time, token usage, project name
|
|
11
|
-
*/
|
|
12
|
-
import type { Plugin } from "@opencode-ai/plugin";
|
|
13
|
-
/**
|
|
14
|
-
* OpenCode Discord Presence Plugin
|
|
15
|
-
*
|
|
16
|
-
* Displays your current OpenCode session status in Discord Rich Presence.
|
|
17
|
-
* Integrates with OpenCode's event system to track agent changes,
|
|
18
|
-
* model usage, and session state.
|
|
19
|
-
*
|
|
20
|
-
* @param ctx - Plugin context from OpenCode
|
|
21
|
-
* @returns Plugin hooks object
|
|
22
|
-
*
|
|
23
|
-
* @example
|
|
24
|
-
* ```typescript
|
|
25
|
-
* // In opencode.json
|
|
26
|
-
* {
|
|
27
|
-
* "plugins": ["opencode-discord-presence"],
|
|
28
|
-
* "discordPresence": {
|
|
29
|
-
* "enabled": true,
|
|
30
|
-
* "showSessionTime": true,
|
|
31
|
-
* "showTokenUsage": true,
|
|
32
|
-
* "showProjectName": true
|
|
33
|
-
* }
|
|
34
|
-
* }
|
|
35
|
-
* ```
|
|
36
|
-
*/
|
|
37
|
-
export declare const OpenCodeDiscordPresence: Plugin;
|
|
38
|
-
//# sourceMappingURL=plugin.d.ts.map
|
package/dist/plugin.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAQjD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,uBAAuB,EAAE,MA0HrC,CAAA"}
|
package/dist/plugin.js
DELETED
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Main plugin implementation for OpenCode Discord Presence
|
|
3
|
-
* @module opencode-discord-presence/plugin
|
|
4
|
-
*
|
|
5
|
-
* This is the core plugin that integrates with OpenCode to display
|
|
6
|
-
* Rich Presence in Discord, showing:
|
|
7
|
-
* - Current AI agent being used
|
|
8
|
-
* - Current model
|
|
9
|
-
* - Activity status (active/idle)
|
|
10
|
-
* - Optional: session time, token usage, project name
|
|
11
|
-
*/
|
|
12
|
-
import { getConfig, validateConfig } from "./config.js";
|
|
13
|
-
import { getLocale } from "./i18n/index.js";
|
|
14
|
-
import { DiscordRPCService } from "./services/discord-rpc.js";
|
|
15
|
-
import { formatModelName, formatTokens } from "./utils/format.js";
|
|
16
|
-
import { getProjectName } from "./utils/project.js";
|
|
17
|
-
/**
|
|
18
|
-
* OpenCode Discord Presence Plugin
|
|
19
|
-
*
|
|
20
|
-
* Displays your current OpenCode session status in Discord Rich Presence.
|
|
21
|
-
* Integrates with OpenCode's event system to track agent changes,
|
|
22
|
-
* model usage, and session state.
|
|
23
|
-
*
|
|
24
|
-
* @param ctx - Plugin context from OpenCode
|
|
25
|
-
* @returns Plugin hooks object
|
|
26
|
-
*
|
|
27
|
-
* @example
|
|
28
|
-
* ```typescript
|
|
29
|
-
* // In opencode.json
|
|
30
|
-
* {
|
|
31
|
-
* "plugins": ["opencode-discord-presence"],
|
|
32
|
-
* "discordPresence": {
|
|
33
|
-
* "enabled": true,
|
|
34
|
-
* "showSessionTime": true,
|
|
35
|
-
* "showTokenUsage": true,
|
|
36
|
-
* "showProjectName": true
|
|
37
|
-
* }
|
|
38
|
-
* }
|
|
39
|
-
* ```
|
|
40
|
-
*/
|
|
41
|
-
export const OpenCodeDiscordPresence = async (ctx) => {
|
|
42
|
-
// Get configuration (would be passed from opencode.json in real usage)
|
|
43
|
-
const config = getConfig({});
|
|
44
|
-
// Validate and warn about configuration issues
|
|
45
|
-
const warnings = validateConfig(config);
|
|
46
|
-
for (const warning of warnings) {
|
|
47
|
-
console.warn(`[discord-presence] ${warning}`);
|
|
48
|
-
}
|
|
49
|
-
if (!config.enabled) {
|
|
50
|
-
console.log("[discord-presence] Plugin is disabled");
|
|
51
|
-
return {};
|
|
52
|
-
}
|
|
53
|
-
// Initialize Discord RPC service
|
|
54
|
-
const rpc = DiscordRPCService.getInstance(config.applicationId);
|
|
55
|
-
// Connect to Discord (non-blocking, will retry on failure)
|
|
56
|
-
rpc.connect().catch((error) => {
|
|
57
|
-
console.warn("[discord-presence] Initial connection failed:", error);
|
|
58
|
-
});
|
|
59
|
-
const locale = getLocale(config.language);
|
|
60
|
-
// State tracking
|
|
61
|
-
let currentAgent = "OpenCode";
|
|
62
|
-
let currentModel = "";
|
|
63
|
-
const sessionTokens = { input: 0, output: 0 };
|
|
64
|
-
const startTimestamp = Date.now();
|
|
65
|
-
// Get project name from context
|
|
66
|
-
const projectName = config.showProjectName ? getProjectName(undefined, ctx.directory) : undefined;
|
|
67
|
-
/**
|
|
68
|
-
* Build the state line for Rich Presence
|
|
69
|
-
* Combines model name, token usage, and project name as configured
|
|
70
|
-
*/
|
|
71
|
-
const buildStateLine = () => {
|
|
72
|
-
const parts = [];
|
|
73
|
-
if (currentModel) {
|
|
74
|
-
parts.push(currentModel);
|
|
75
|
-
}
|
|
76
|
-
if (config.showTokenUsage && (sessionTokens.input > 0 || sessionTokens.output > 0)) {
|
|
77
|
-
parts.push(formatTokens(sessionTokens));
|
|
78
|
-
}
|
|
79
|
-
if (config.showProjectName && projectName) {
|
|
80
|
-
parts.push(projectName);
|
|
81
|
-
}
|
|
82
|
-
return parts.length > 0 ? parts.join(" | ") : undefined;
|
|
83
|
-
};
|
|
84
|
-
const setActivePresence = async () => {
|
|
85
|
-
await rpc.updatePresence({
|
|
86
|
-
details: locale.presence.active(currentAgent),
|
|
87
|
-
state: buildStateLine(),
|
|
88
|
-
startTimestamp: config.showSessionTime ? startTimestamp : undefined,
|
|
89
|
-
largeImageKey: "opencode-logo",
|
|
90
|
-
largeImageText: locale.status.opencode,
|
|
91
|
-
});
|
|
92
|
-
};
|
|
93
|
-
const setIdlePresence = async () => {
|
|
94
|
-
await rpc.updatePresence({
|
|
95
|
-
details: locale.presence.idle(currentAgent),
|
|
96
|
-
state: buildStateLine(),
|
|
97
|
-
largeImageKey: "opencode-logo",
|
|
98
|
-
largeImageText: locale.status.opencode,
|
|
99
|
-
});
|
|
100
|
-
};
|
|
101
|
-
// Return plugin hooks
|
|
102
|
-
return {
|
|
103
|
-
/**
|
|
104
|
-
* Hook called when a new chat message is sent
|
|
105
|
-
* Used to track current agent and model
|
|
106
|
-
*/
|
|
107
|
-
"chat.message": async (input, _output) => {
|
|
108
|
-
// Update agent from input
|
|
109
|
-
if (input.agent) {
|
|
110
|
-
currentAgent = input.agent;
|
|
111
|
-
}
|
|
112
|
-
// Update model from input
|
|
113
|
-
if (input.model) {
|
|
114
|
-
currentModel = formatModelName(input.model);
|
|
115
|
-
}
|
|
116
|
-
// Update presence to show active state
|
|
117
|
-
await setActivePresence();
|
|
118
|
-
},
|
|
119
|
-
/**
|
|
120
|
-
* Hook for all events
|
|
121
|
-
* Used to track session state and token usage
|
|
122
|
-
*/
|
|
123
|
-
event: async ({ event }) => {
|
|
124
|
-
// Handle session idle event
|
|
125
|
-
if (event.type === "session.idle") {
|
|
126
|
-
await setIdlePresence();
|
|
127
|
-
}
|
|
128
|
-
if (event.type === "message.updated") {
|
|
129
|
-
const info = event.properties?.info;
|
|
130
|
-
if (info && info.role === "assistant" && "tokens" in info) {
|
|
131
|
-
sessionTokens.input += info.tokens.input || 0;
|
|
132
|
-
sessionTokens.output += info.tokens.output || 0;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
// Handle session end/completion
|
|
136
|
-
if (event.type === "session.compacted") {
|
|
137
|
-
// Reset token count for new session
|
|
138
|
-
sessionTokens.input = 0;
|
|
139
|
-
sessionTokens.output = 0;
|
|
140
|
-
}
|
|
141
|
-
},
|
|
142
|
-
};
|
|
143
|
-
};
|
|
144
|
-
//# sourceMappingURL=plugin.js.map
|
package/dist/plugin.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
|