@chime-io/plugin-opencode 1.0.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.
@@ -0,0 +1,4 @@
1
+
2
+ > @chime-io/plugin-opencode@1.0.0 build /home/runner/work/chime-io/chime-io/packages/opencode
3
+ > tsc -b
4
+
@@ -0,0 +1,69 @@
1
+ export interface SessionSummary {
2
+ additions?: number;
3
+ deletions?: number;
4
+ files?: number;
5
+ }
6
+ export interface OpenCodeSession {
7
+ id: string;
8
+ title?: string;
9
+ slug?: string;
10
+ parentID?: string | null;
11
+ summary?: SessionSummary;
12
+ }
13
+ export interface OpenCodeErrorLike {
14
+ message?: string;
15
+ name?: string;
16
+ data?: {
17
+ message?: string;
18
+ };
19
+ }
20
+ export interface OpenCodeAssistantInfo {
21
+ role?: string;
22
+ error?: OpenCodeErrorLike | string;
23
+ }
24
+ export interface OpenCodeTextPart {
25
+ type: 'text';
26
+ text?: string;
27
+ }
28
+ export interface OpenCodeToolPart {
29
+ type: 'tool';
30
+ state?: {
31
+ status?: string;
32
+ title?: string;
33
+ error?: OpenCodeErrorLike | string;
34
+ };
35
+ }
36
+ export interface OpenCodePatchPart {
37
+ type: 'patch';
38
+ files?: string[];
39
+ }
40
+ export type OpenCodeMessagePart = OpenCodeTextPart | OpenCodeToolPart | OpenCodePatchPart;
41
+ export interface OpenCodeConversationMessage {
42
+ info?: OpenCodeAssistantInfo;
43
+ parts?: OpenCodeMessagePart[];
44
+ }
45
+ export interface OpenCodeNotification {
46
+ agent: 'opencode';
47
+ kind: 'session.completed' | 'session.error' | 'interaction.question' | 'interaction.permission';
48
+ title: string;
49
+ lines: string[];
50
+ metadata: {
51
+ sessionId: string;
52
+ };
53
+ }
54
+ export interface OpenCodeEventFormatter {
55
+ formatSessionCompleted(session: OpenCodeSession): Promise<OpenCodeNotification>;
56
+ formatSessionError(session: OpenCodeSession, errorMessage?: string): Promise<OpenCodeNotification>;
57
+ formatQuestion(session: OpenCodeSession, questionText?: string): OpenCodeNotification;
58
+ formatPermission(session: OpenCodeSession, title?: string): OpenCodeNotification;
59
+ }
60
+ export interface CreateOpenCodeEventFormatterOptions {
61
+ listMessages(sessionId: string): Promise<OpenCodeConversationMessage[]>;
62
+ }
63
+ export declare function truncateText(value: unknown, maxLength?: number): string;
64
+ export declare function formatChangeSummary(session: Pick<OpenCodeSession, 'summary'>): string;
65
+ export declare function extractErrorMessage(error: OpenCodeErrorLike | string | null | undefined): string;
66
+ export declare function extractLastResultFromMessages(messages: OpenCodeConversationMessage[]): string;
67
+ export declare function extractLastErrorFromMessages(messages: OpenCodeConversationMessage[]): string;
68
+ export declare function createOpenCodeEventFormatter({ listMessages, }: CreateOpenCodeEventFormatterOptions): OpenCodeEventFormatter;
69
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
package/dist/format.js ADDED
@@ -0,0 +1,152 @@
1
+ const MAX_RESULT_LENGTH = 160;
2
+ function normalizeSummaryText(value) {
3
+ return String(value ?? '').replace(/\s+/g, ' ').trim();
4
+ }
5
+ export function truncateText(value, maxLength = MAX_RESULT_LENGTH) {
6
+ const normalized = normalizeSummaryText(value);
7
+ if (!normalized)
8
+ return '';
9
+ if (normalized.length <= maxLength)
10
+ return normalized;
11
+ return `${normalized.slice(0, maxLength - 3).trimEnd()}...`;
12
+ }
13
+ export function formatChangeSummary(session) {
14
+ if (!session.summary)
15
+ return '';
16
+ const { additions = 0, deletions = 0, files = 0 } = session.summary;
17
+ const parts = [];
18
+ if (additions > 0)
19
+ parts.push(`+${additions}`);
20
+ if (deletions > 0)
21
+ parts.push(`-${deletions}`);
22
+ if (files > 0)
23
+ parts.push(`${files} file${files === 1 ? '' : 's'}`);
24
+ return parts.join(' · ');
25
+ }
26
+ export function extractErrorMessage(error) {
27
+ if (!error)
28
+ return '';
29
+ if (typeof error === 'string')
30
+ return truncateText(error);
31
+ if (typeof error.data?.message === 'string' && error.data.message.trim()) {
32
+ return truncateText(error.data.message);
33
+ }
34
+ if (typeof error.message === 'string' && error.message.trim()) {
35
+ return truncateText(error.message);
36
+ }
37
+ if (typeof error.name === 'string' && error.name.trim()) {
38
+ return truncateText(error.name);
39
+ }
40
+ return truncateText(String(error));
41
+ }
42
+ export function extractLastResultFromMessages(messages) {
43
+ for (let messageIndex = messages.length - 1; messageIndex >= 0; messageIndex -= 1) {
44
+ const message = messages[messageIndex];
45
+ if (message?.info?.role !== 'assistant')
46
+ continue;
47
+ const parts = Array.isArray(message.parts) ? message.parts : [];
48
+ for (let partIndex = parts.length - 1; partIndex >= 0; partIndex -= 1) {
49
+ const part = parts[partIndex];
50
+ if (part?.type === 'text' && part.text) {
51
+ const text = truncateText(part.text);
52
+ if (text)
53
+ return text;
54
+ }
55
+ if (part?.type === 'tool' &&
56
+ part.state?.status === 'completed' &&
57
+ part.state.title) {
58
+ return truncateText(`工具:${part.state.title}`);
59
+ }
60
+ if (part?.type === 'patch' &&
61
+ Array.isArray(part.files) &&
62
+ part.files.length > 0) {
63
+ const listedFiles = part.files.slice(0, 2).join(', ');
64
+ const remainder = part.files.length > 2 ? ` 等${part.files.length}个文件` : '';
65
+ return truncateText(`修改:${listedFiles}${remainder}`);
66
+ }
67
+ }
68
+ }
69
+ return '';
70
+ }
71
+ export function extractLastErrorFromMessages(messages) {
72
+ for (let messageIndex = messages.length - 1; messageIndex >= 0; messageIndex -= 1) {
73
+ const message = messages[messageIndex];
74
+ if (message?.info?.role !== 'assistant')
75
+ continue;
76
+ const assistantError = extractErrorMessage(message.info.error);
77
+ if (assistantError)
78
+ return assistantError;
79
+ const parts = Array.isArray(message.parts) ? message.parts : [];
80
+ for (let partIndex = parts.length - 1; partIndex >= 0; partIndex -= 1) {
81
+ const part = parts[partIndex];
82
+ if (part?.type === 'tool' && part.state?.status === 'error') {
83
+ const toolError = extractErrorMessage(part.state.error);
84
+ if (toolError)
85
+ return toolError;
86
+ if (part.state.title)
87
+ return truncateText(`工具失败:${part.state.title}`);
88
+ }
89
+ }
90
+ }
91
+ return '';
92
+ }
93
+ function getShortSessionId(sessionId) {
94
+ return String(sessionId).slice(0, 8);
95
+ }
96
+ export function createOpenCodeEventFormatter({ listMessages, }) {
97
+ return {
98
+ async formatSessionCompleted(session) {
99
+ const messages = await listMessages(session.id);
100
+ const changeSummary = formatChangeSummary(session);
101
+ const lastResult = extractLastResultFromMessages(messages);
102
+ return {
103
+ agent: 'opencode',
104
+ kind: 'session.completed',
105
+ title: `OpenCode · ${session.title ?? session.slug ?? getShortSessionId(session.id)}`,
106
+ lines: [
107
+ changeSummary || `主会话已完成 · session ${getShortSessionId(session.id)}`,
108
+ lastResult,
109
+ ].filter((line) => Boolean(line)),
110
+ metadata: { sessionId: session.id },
111
+ };
112
+ },
113
+ async formatSessionError(session, errorMessage) {
114
+ const messages = await listMessages(session.id);
115
+ const resolvedError = errorMessage || extractLastErrorFromMessages(messages);
116
+ return {
117
+ agent: 'opencode',
118
+ kind: 'session.error',
119
+ title: `OpenCode · ${session.title ?? session.slug ?? getShortSessionId(session.id)}`,
120
+ lines: [`出错啦:${resolvedError || 'Unknown error'}`],
121
+ metadata: { sessionId: session.id },
122
+ };
123
+ },
124
+ formatQuestion(session, questionText) {
125
+ return {
126
+ agent: 'opencode',
127
+ kind: 'interaction.question',
128
+ title: `OpenCode · ${session.title ?? session.slug ?? getShortSessionId(session.id)}`,
129
+ lines: [
130
+ questionText
131
+ ? `Agent 正在等你回答:${truncateText(questionText)}`
132
+ : 'Agent 正在等你回答',
133
+ ],
134
+ metadata: { sessionId: session.id },
135
+ };
136
+ },
137
+ formatPermission(session, title) {
138
+ return {
139
+ agent: 'opencode',
140
+ kind: 'interaction.permission',
141
+ title: `OpenCode · ${session.title ?? session.slug ?? getShortSessionId(session.id)}`,
142
+ lines: [
143
+ title
144
+ ? `Agent 需要你的确认:${truncateText(title)}`
145
+ : 'Agent 需要你的确认',
146
+ ],
147
+ metadata: { sessionId: session.id },
148
+ };
149
+ },
150
+ };
151
+ }
152
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { createOpenCodeNotifierPlugin, type OpenCodeClient } from "./notifier-plugin.js";
2
+ export declare function OpenCodeTelegramPlugin({ client, }: {
3
+ client: OpenCodeClient;
4
+ }): Promise<ReturnType<typeof createOpenCodeNotifierPlugin>>;
5
+ export default OpenCodeTelegramPlugin;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,4BAA4B,EAE5B,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAC;AAkB9B,wBAAsB,sBAAsB,CAAC,EAC3C,MAAM,GACP,EAAE;IACD,MAAM,EAAE,cAAc,CAAC;CACxB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC,CA2B3D;AAED,eAAe,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,46 @@
1
+ import { createNotifier } from "@telnotify/core";
2
+ import { createTelegramChannel } from "@telnotify/telegram";
3
+ import { createOpenCodeNotifierPlugin, } from "./notifier-plugin.js";
4
+ function createLogger(client) {
5
+ return {
6
+ async warn(message, extra) {
7
+ if (!client.app?.log)
8
+ return;
9
+ await client.app.log({
10
+ body: {
11
+ service: "telnotify-opencode-plugin",
12
+ level: "warn",
13
+ message,
14
+ ...(extra ? { extra } : {}),
15
+ },
16
+ });
17
+ },
18
+ };
19
+ }
20
+ export async function OpenCodeTelegramPlugin({ client, }) {
21
+ const token = process.env.TELEGRAM_BOT_TOKEN;
22
+ const userId = process.env.TELEGRAM_USER_ID;
23
+ const parseMode = process.env.TELEGRAM_PARSE_MODE === "MarkdownV2"
24
+ ? "MarkdownV2"
25
+ : process.env.TELEGRAM_PARSE_MODE === "Markdown"
26
+ ? "Markdown"
27
+ : "HTML";
28
+ const silent = process.env.TELEGRAM_SILENT === "1";
29
+ const notifier = createNotifier({
30
+ channels: [
31
+ createTelegramChannel({
32
+ token: token ?? "",
33
+ userId: userId ?? "",
34
+ parseMode,
35
+ silent,
36
+ }),
37
+ ],
38
+ });
39
+ return createOpenCodeNotifierPlugin({
40
+ client,
41
+ notifier,
42
+ logger: createLogger(client),
43
+ });
44
+ }
45
+ export default OpenCodeTelegramPlugin;
46
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EACL,4BAA4B,GAG7B,MAAM,sBAAsB,CAAC;AAE9B,SAAS,YAAY,CAAC,MAAsB;IAC1C,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK;YACvB,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG;gBAAE,OAAO;YAC7B,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;gBACnB,IAAI,EAAE;oBACJ,OAAO,EAAE,2BAA2B;oBACpC,KAAK,EAAE,MAAM;oBACb,OAAO;oBACP,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC5B;aACF,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,EAC3C,MAAM,GAGP;IACC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAC5C,MAAM,SAAS,GACb,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,YAAY;QAC9C,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,UAAU;YAC9C,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,MAAM,CAAC;IACf,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,GAAG,CAAC;IAEnD,MAAM,QAAQ,GAAG,cAAc,CAAC;QAC9B,QAAQ,EAAE;YACR,qBAAqB,CAAC;gBACpB,KAAK,EAAE,KAAK,IAAI,EAAE;gBAClB,MAAM,EAAE,MAAM,IAAI,EAAE;gBACpB,SAAS;gBACT,MAAM;aACP,CAAC;SACH;KACF,CAAC,CAAC;IAEH,OAAO,4BAA4B,CAAC;QAClC,MAAM;QACN,QAAQ;QACR,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC;KAC7B,CAAC,CAAC;AACL,CAAC;AAED,eAAe,sBAAsB,CAAC"}
@@ -0,0 +1,90 @@
1
+ import type { Notifier } from '@telnotify/core';
2
+ import { type OpenCodeConversationMessage, type OpenCodeErrorLike, type OpenCodeSession } from './format.js';
3
+ interface SessionGetResult {
4
+ data?: OpenCodeSession;
5
+ error?: unknown;
6
+ }
7
+ interface SessionListMessagesArgsPrimary {
8
+ sessionID: string;
9
+ limit: number;
10
+ }
11
+ interface SessionListMessagesArgsSecondary {
12
+ path: {
13
+ id: string;
14
+ };
15
+ query: {
16
+ limit: number;
17
+ };
18
+ }
19
+ type SessionMessagesArgs = SessionListMessagesArgsPrimary | SessionListMessagesArgsSecondary;
20
+ interface SessionMessagesResult {
21
+ data?: OpenCodeConversationMessage[];
22
+ }
23
+ interface OpenCodeSessionApi {
24
+ get(args: {
25
+ sessionID: string;
26
+ }): Promise<SessionGetResult>;
27
+ messages?(args: SessionMessagesArgs): Promise<SessionMessagesResult | OpenCodeConversationMessage[]>;
28
+ }
29
+ interface OpenCodeAppApi {
30
+ log?(input: {
31
+ body: {
32
+ service: string;
33
+ level: 'warn';
34
+ message: string;
35
+ extra?: Record<string, unknown>;
36
+ };
37
+ }): Promise<unknown>;
38
+ }
39
+ export interface OpenCodeClient {
40
+ session?: OpenCodeSessionApi;
41
+ app?: OpenCodeAppApi;
42
+ }
43
+ export interface Logger {
44
+ warn(message: string, extra?: Record<string, unknown>): Promise<void>;
45
+ }
46
+ interface ToolExecuteInput {
47
+ tool?: string;
48
+ sessionID?: string;
49
+ callID?: string;
50
+ }
51
+ interface ToolExecuteOutput {
52
+ args?: {
53
+ questions?: Array<{
54
+ question?: string;
55
+ }>;
56
+ };
57
+ }
58
+ interface PermissionEventProperties {
59
+ id?: string;
60
+ permissionID?: string;
61
+ sessionID?: string;
62
+ title?: string;
63
+ }
64
+ interface SessionEventProperties {
65
+ sessionID?: string;
66
+ status?: {
67
+ type?: string;
68
+ } | 'busy';
69
+ error?: OpenCodeErrorLike | string;
70
+ info?: OpenCodeSession;
71
+ }
72
+ export interface OpenCodeEventEnvelope {
73
+ event: {
74
+ type: string;
75
+ properties?: PermissionEventProperties & SessionEventProperties;
76
+ };
77
+ }
78
+ export interface OpenCodeNotifierPlugin {
79
+ 'tool.execute.before': (input: ToolExecuteInput, output: ToolExecuteOutput) => Promise<void>;
80
+ 'tool.execute.after': (input: ToolExecuteInput) => Promise<void>;
81
+ event: (payload: OpenCodeEventEnvelope) => Promise<void>;
82
+ }
83
+ export interface CreateOpenCodeNotifierPluginOptions {
84
+ client: OpenCodeClient;
85
+ notifier: Notifier;
86
+ logger: Logger;
87
+ }
88
+ export declare function createOpenCodeNotifierPlugin({ client, notifier, logger, }: CreateOpenCodeNotifierPluginOptions): OpenCodeNotifierPlugin;
89
+ export {};
90
+ //# sourceMappingURL=notifier-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifier-plugin.d.ts","sourceRoot":"","sources":["../src/notifier-plugin.ts"],"names":[],"mappings":"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"}