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.
Files changed (53) hide show
  1. package/dist/index.d.ts +9 -3
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +117 -3
  4. package/dist/index.js.map +1 -1
  5. package/package.json +1 -1
  6. package/dist/config.d.ts +0 -45
  7. package/dist/config.d.ts.map +0 -1
  8. package/dist/config.js +0 -65
  9. package/dist/config.js.map +0 -1
  10. package/dist/i18n/index.d.ts +0 -10
  11. package/dist/i18n/index.d.ts.map +0 -1
  12. package/dist/i18n/index.js +0 -32
  13. package/dist/i18n/index.js.map +0 -1
  14. package/dist/i18n/locales/en.d.ts +0 -3
  15. package/dist/i18n/locales/en.d.ts.map +0 -1
  16. package/dist/i18n/locales/en.js +0 -13
  17. package/dist/i18n/locales/en.js.map +0 -1
  18. package/dist/i18n/locales/ja.d.ts +0 -3
  19. package/dist/i18n/locales/ja.d.ts.map +0 -1
  20. package/dist/i18n/locales/ja.js +0 -13
  21. package/dist/i18n/locales/ja.js.map +0 -1
  22. package/dist/i18n/locales/ko.d.ts +0 -14
  23. package/dist/i18n/locales/ko.d.ts.map +0 -1
  24. package/dist/i18n/locales/ko.js +0 -14
  25. package/dist/i18n/locales/ko.js.map +0 -1
  26. package/dist/i18n/locales/zh.d.ts +0 -3
  27. package/dist/i18n/locales/zh.d.ts.map +0 -1
  28. package/dist/i18n/locales/zh.js +0 -13
  29. package/dist/i18n/locales/zh.js.map +0 -1
  30. package/dist/plugin.d.ts +0 -38
  31. package/dist/plugin.d.ts.map +0 -1
  32. package/dist/plugin.js +0 -144
  33. package/dist/plugin.js.map +0 -1
  34. package/dist/services/discord-rpc.d.ts +0 -83
  35. package/dist/services/discord-rpc.d.ts.map +0 -1
  36. package/dist/services/discord-rpc.js +0 -200
  37. package/dist/services/discord-rpc.js.map +0 -1
  38. package/dist/types/index.d.ts +0 -68
  39. package/dist/types/index.d.ts.map +0 -1
  40. package/dist/types/index.js +0 -6
  41. package/dist/types/index.js.map +0 -1
  42. package/dist/utils/format.d.ts +0 -45
  43. package/dist/utils/format.d.ts.map +0 -1
  44. package/dist/utils/format.js +0 -103
  45. package/dist/utils/format.js.map +0 -1
  46. package/dist/utils/particle.d.ts +0 -34
  47. package/dist/utils/particle.d.ts.map +0 -1
  48. package/dist/utils/particle.js +0 -83
  49. package/dist/utils/particle.js.map +0 -1
  50. package/dist/utils/project.d.ts +0 -32
  51. package/dist/utils/project.d.ts.map +0 -1
  52. package/dist/utils/project.js +0 -81
  53. package/dist/utils/project.js.map +0 -1
package/dist/index.d.ts CHANGED
@@ -1,5 +1,11 @@
1
- import { OpenCodeDiscordPresence } from "./plugin.js";
2
- export { OpenCodeDiscordPresence };
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 } from "./config.js";
10
+ export { getConfig };
5
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
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"}
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 { OpenCodeDiscordPresence } from "./plugin.js";
2
- export { OpenCodeDiscordPresence };
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 } from "./config.js";
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":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-discord-presence",
3
- "version": "0.1.5",
3
+ "version": "0.2.0",
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",
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
@@ -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
@@ -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"}
@@ -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
@@ -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"}
@@ -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
@@ -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,3 +0,0 @@
1
- import type { Locale } from "./ko.js";
2
- export declare const en: Locale;
3
- //# sourceMappingURL=en.d.ts.map
@@ -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"}
@@ -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,3 +0,0 @@
1
- import type { Locale } from "./ko.js";
2
- export declare const ja: Locale;
3
- //# sourceMappingURL=ja.d.ts.map
@@ -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"}
@@ -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"}
@@ -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,3 +0,0 @@
1
- import type { Locale } from "./ko.js";
2
- export declare const zh: Locale;
3
- //# sourceMappingURL=zh.d.ts.map
@@ -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"}
@@ -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
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}