@sider-ai/chrome-openclaw-sider 1.0.31

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 (61) hide show
  1. package/README.md +75 -0
  2. package/README.zh_CN.md +108 -0
  3. package/dist/account-cW9SLuNu.d.ts +75 -0
  4. package/dist/index.d.ts +12 -0
  5. package/dist/index.js +87 -0
  6. package/dist/setup-entry.d.ts +6 -0
  7. package/dist/setup-entry.js +11 -0
  8. package/dist/setup-plugin-api.d.ts +7 -0
  9. package/dist/setup-plugin-api.js +4 -0
  10. package/dist/src/account.d.ts +6 -0
  11. package/dist/src/account.js +260 -0
  12. package/dist/src/auth.d.ts +30 -0
  13. package/dist/src/auth.js +225 -0
  14. package/dist/src/channel-auto-title.d.ts +6 -0
  15. package/dist/src/channel-auto-title.js +102 -0
  16. package/dist/src/channel-builders.d.ts +105 -0
  17. package/dist/src/channel-builders.js +238 -0
  18. package/dist/src/channel-hooks.d.ts +30 -0
  19. package/dist/src/channel-hooks.js +380 -0
  20. package/dist/src/channel-monitor.d.ts +34 -0
  21. package/dist/src/channel-monitor.js +335 -0
  22. package/dist/src/channel-parts.d.ts +26 -0
  23. package/dist/src/channel-parts.js +32 -0
  24. package/dist/src/channel-relay.d.ts +117 -0
  25. package/dist/src/channel-relay.js +574 -0
  26. package/dist/src/channel-runtime.d.ts +33 -0
  27. package/dist/src/channel-runtime.js +138 -0
  28. package/dist/src/channel-send-result.d.ts +19 -0
  29. package/dist/src/channel-send-result.js +126 -0
  30. package/dist/src/channel-send.d.ts +73 -0
  31. package/dist/src/channel-send.js +291 -0
  32. package/dist/src/channel-session-model.d.ts +19 -0
  33. package/dist/src/channel-session-model.js +244 -0
  34. package/dist/src/channel-shared.d.ts +153 -0
  35. package/dist/src/channel-shared.js +96 -0
  36. package/dist/src/channel-state.d.ts +93 -0
  37. package/dist/src/channel-state.js +475 -0
  38. package/dist/src/channel-streaming.d.ts +117 -0
  39. package/dist/src/channel-streaming.js +681 -0
  40. package/dist/src/channel-types.d.ts +209 -0
  41. package/dist/src/channel-types.js +40 -0
  42. package/dist/src/channel-typing.d.ts +17 -0
  43. package/dist/src/channel-typing.js +79 -0
  44. package/dist/src/channel-util.d.ts +78 -0
  45. package/dist/src/channel-util.js +604 -0
  46. package/dist/src/channel.d.ts +14 -0
  47. package/dist/src/channel.js +834 -0
  48. package/dist/src/channel.setup.d.ts +10 -0
  49. package/dist/src/channel.setup.js +9 -0
  50. package/dist/src/config.d.ts +18 -0
  51. package/dist/src/config.js +38 -0
  52. package/dist/src/inbound-media.d.ts +37 -0
  53. package/dist/src/inbound-media.js +148 -0
  54. package/dist/src/media-upload.d.ts +87 -0
  55. package/dist/src/media-upload.js +1308 -0
  56. package/dist/src/setup-core.d.ts +72 -0
  57. package/dist/src/setup-core.js +343 -0
  58. package/dist/src/user-agent.d.ts +4 -0
  59. package/dist/src/user-agent.js +6 -0
  60. package/openclaw.plugin.json +96 -0
  61. package/package.json +47 -0
@@ -0,0 +1,209 @@
1
+ import { OpenClawConfig, ReplyPayload, ChannelPlugin } from 'openclaw/plugin-sdk';
2
+ import { R as ResolvedSiderAccount } from '../account-cW9SLuNu.js';
3
+ import { WebSocket } from 'ws';
4
+ import 'openclaw/plugin-sdk/setup';
5
+ import './auth.js';
6
+ import 'openclaw/plugin-sdk/plugin-entry';
7
+ import 'openclaw/plugin-sdk/config-runtime';
8
+
9
+ type ChannelMeta = ChannelPlugin["meta"];
10
+ declare const DEFAULT_MEDIA_SAVE_MAX_BYTES: number;
11
+ declare const DEFAULT_MEDIA_UPLOAD_SKIP_MAX_BYTES: number;
12
+ declare const DEFAULT_MONITOR_KEEPALIVE_MS = 10000;
13
+ declare const DEFAULT_MONITOR_PONG_TIMEOUT_MS = 30000;
14
+ declare const DEFAULT_STRUCTURED_PAYLOAD_MAX_CHARS = 12000;
15
+ declare const SIDER_SESSION_BINDING_TTL_MS: number;
16
+ declare const SIDER_SESSION_BINDING_MAX = 512;
17
+ declare const SIDER_RUN_STATE_TTL_MS: number;
18
+ declare const SIDER_RUN_STATE_MAX = 1024;
19
+ type SiderPart = {
20
+ id?: string;
21
+ type: string;
22
+ spec_version?: number;
23
+ payload?: unknown;
24
+ meta?: unknown;
25
+ };
26
+ type SiderAggregation = {
27
+ id: string;
28
+ index: number;
29
+ final: boolean;
30
+ };
31
+ type SiderInboundAck = {
32
+ type: "ack";
33
+ session_id?: string;
34
+ id?: string;
35
+ client_req_id?: string;
36
+ };
37
+ type SiderInboundRealtimeMessage = {
38
+ type: "message";
39
+ session_id?: string;
40
+ message_id?: string;
41
+ source_role?: string;
42
+ created_at?: number;
43
+ aggregation?: SiderAggregation;
44
+ parts?: SiderPart[];
45
+ meta?: Record<string, unknown>;
46
+ };
47
+ type SiderInboundRealtimeEvent = {
48
+ type: "event";
49
+ session_id?: string;
50
+ event_id?: string;
51
+ event_type?: string;
52
+ source_role?: string;
53
+ created_at?: number;
54
+ payload?: unknown;
55
+ meta?: unknown;
56
+ };
57
+ type SiderSampleEvent = {
58
+ eventType: string;
59
+ payload: Record<string, unknown>;
60
+ meta?: Record<string, unknown>;
61
+ };
62
+ type SiderUsageTotals = {
63
+ input?: number;
64
+ output?: number;
65
+ cacheRead?: number;
66
+ cacheWrite?: number;
67
+ total?: number;
68
+ };
69
+ type SiderParsedToolCall = {
70
+ toolName?: string;
71
+ toolCallId?: string;
72
+ toolArgs?: unknown;
73
+ };
74
+ type SiderParsedAssistantOutput = {
75
+ stopReason?: string;
76
+ thinkingText?: string;
77
+ toolCalls: SiderParsedToolCall[];
78
+ };
79
+ type SiderRunState = {
80
+ runId: string;
81
+ aggregationId: string;
82
+ nextAggregationIndex: number;
83
+ managedByReplyPipeline: boolean;
84
+ sessionKey?: string;
85
+ sessionId?: string;
86
+ accountId?: string;
87
+ provider?: string;
88
+ model?: string;
89
+ usage: SiderUsageTotals;
90
+ queuedMessageParts: SiderPart[];
91
+ messageFlushChain: Promise<void>;
92
+ flushScheduled: boolean;
93
+ pendingFinalText?: string;
94
+ pendingFinalThinking?: string;
95
+ pendingFinalStopReason?: string;
96
+ updatedAt: number;
97
+ };
98
+ type SiderRealtimeLaneState = {
99
+ active: boolean;
100
+ streamId?: string;
101
+ seq: number;
102
+ };
103
+ type SiderAnswerRealtimeLaneState = SiderRealtimeLaneState & {
104
+ blockDeltaCount: number;
105
+ partialDeltaCount: number;
106
+ streamDeltaMode: "undecided" | "partial" | "block";
107
+ partialSnapshot: string;
108
+ accumulatedBlockText: string;
109
+ assistantSeq: number;
110
+ fallbackAssistantSeq: number;
111
+ fallbackTextSource: "none" | "stream" | "final_payload";
112
+ fallbackCurrentText: string;
113
+ fallbackTextPrefix: string;
114
+ };
115
+ type SiderReasoningRealtimeLaneState = SiderRealtimeLaneState & {
116
+ snapshot: string;
117
+ deltaCount: number;
118
+ };
119
+ type SiderStreamState = {
120
+ answer: SiderAnswerRealtimeLaneState;
121
+ reasoning: SiderReasoningRealtimeLaneState;
122
+ persistedFinalText: boolean;
123
+ pendingFinalPayloads: ReplyPayload[];
124
+ sessionKey?: string;
125
+ currentRunId?: string;
126
+ streamEventQueue: Promise<void>;
127
+ };
128
+ type SiderSessionBinding = {
129
+ account: ResolvedSiderAccount;
130
+ sessionId: string;
131
+ lastSeenAt: number;
132
+ toolSeq: number;
133
+ currentRunId?: string;
134
+ currentToolCallId?: string;
135
+ callIdByToolCallId: Map<string, string>;
136
+ };
137
+ type SiderToolHookPayload = {
138
+ sessionKey?: string;
139
+ phase: "start" | "end" | "error";
140
+ toolName?: string;
141
+ toolCallId?: string;
142
+ runId?: string;
143
+ params?: Record<string, unknown>;
144
+ result?: unknown;
145
+ error?: string;
146
+ durationMs?: number;
147
+ };
148
+ type SiderInboundReplaced = {
149
+ type: "replaced";
150
+ reason?: string;
151
+ };
152
+ type SiderInboundPing = {
153
+ type: "ping";
154
+ };
155
+ type SiderInboundPong = {
156
+ type: "pong";
157
+ };
158
+ type SiderInboundFrame = SiderInboundAck | SiderInboundRealtimeMessage | SiderInboundRealtimeEvent | SiderInboundReplaced | SiderInboundPing | SiderInboundPong;
159
+ type SiderPendingAck = {
160
+ sessionId: string;
161
+ clientReqId?: string;
162
+ timeout: ReturnType<typeof setTimeout>;
163
+ resolve: (id: string) => void;
164
+ reject: (err: Error) => void;
165
+ };
166
+ type SiderRelaySocketReadyWaiter = {
167
+ timeout: ReturnType<typeof setTimeout>;
168
+ resolve: (ws: WebSocket) => void;
169
+ reject: (err: Error) => void;
170
+ };
171
+ type SiderRelaySocketState = {
172
+ ws: WebSocket | null;
173
+ accountSignature?: string;
174
+ relayId?: string;
175
+ pendingAcksBySession: Map<string, SiderPendingAck[]>;
176
+ pendingAcksByClientReqId: Map<string, SiderPendingAck>;
177
+ readyWaiters: Set<SiderRelaySocketReadyWaiter>;
178
+ };
179
+ type SiderMonitorLogger = {
180
+ info: (msg: string) => void;
181
+ warn: (msg: string) => void;
182
+ error: (msg: string) => void;
183
+ };
184
+ type SiderInboundMessageHandler = (params: {
185
+ cfg: OpenClawConfig;
186
+ account: ResolvedSiderAccount;
187
+ event: SiderInboundRealtimeMessage;
188
+ }) => Promise<void>;
189
+ type SiderRelayMonitorRegistration = {
190
+ cfg: OpenClawConfig;
191
+ account: ResolvedSiderAccount;
192
+ monitorSignature: string;
193
+ subscribers: Set<string>;
194
+ controller: AbortController;
195
+ runner: Promise<void>;
196
+ restartRequested: boolean;
197
+ log?: SiderMonitorLogger;
198
+ onInboundMessage?: SiderInboundMessageHandler;
199
+ };
200
+ type ParsedInboundMedia = {
201
+ url?: string;
202
+ mimeType?: string;
203
+ fileName?: string;
204
+ objectKey?: string;
205
+ fileId?: string;
206
+ };
207
+ declare const meta: ChannelMeta;
208
+
209
+ export { DEFAULT_MEDIA_SAVE_MAX_BYTES, DEFAULT_MEDIA_UPLOAD_SKIP_MAX_BYTES, DEFAULT_MONITOR_KEEPALIVE_MS, DEFAULT_MONITOR_PONG_TIMEOUT_MS, DEFAULT_STRUCTURED_PAYLOAD_MAX_CHARS, type ParsedInboundMedia, SIDER_RUN_STATE_MAX, SIDER_RUN_STATE_TTL_MS, SIDER_SESSION_BINDING_MAX, SIDER_SESSION_BINDING_TTL_MS, type SiderAggregation, type SiderAnswerRealtimeLaneState, type SiderInboundAck, type SiderInboundFrame, type SiderInboundMessageHandler, type SiderInboundPing, type SiderInboundPong, type SiderInboundRealtimeEvent, type SiderInboundRealtimeMessage, type SiderInboundReplaced, type SiderMonitorLogger, type SiderParsedAssistantOutput, type SiderParsedToolCall, type SiderPart, type SiderPendingAck, type SiderRealtimeLaneState, type SiderReasoningRealtimeLaneState, type SiderRelayMonitorRegistration, type SiderRelaySocketReadyWaiter, type SiderRelaySocketState, type SiderRunState, type SiderSampleEvent, type SiderSessionBinding, type SiderStreamState, type SiderToolHookPayload, type SiderUsageTotals, meta };
@@ -0,0 +1,40 @@
1
+ import {
2
+ SIDER_CHANNEL_ALIASES,
3
+ SIDER_CHANNEL_BLURB,
4
+ SIDER_CHANNEL_DOCS_LABEL,
5
+ SIDER_CHANNEL_DOCS_PATH,
6
+ SIDER_CHANNEL_ID,
7
+ SIDER_CHANNEL_LABEL,
8
+ SIDER_CHANNEL_SELECTION_LABEL
9
+ } from "./config.js";
10
+ const DEFAULT_MEDIA_SAVE_MAX_BYTES = 20 * 1024 * 1024 * 1024;
11
+ const DEFAULT_MEDIA_UPLOAD_SKIP_MAX_BYTES = 1024 * 1024 * 1024;
12
+ const DEFAULT_MONITOR_KEEPALIVE_MS = 1e4;
13
+ const DEFAULT_MONITOR_PONG_TIMEOUT_MS = 3e4;
14
+ const DEFAULT_STRUCTURED_PAYLOAD_MAX_CHARS = 12e3;
15
+ const SIDER_SESSION_BINDING_TTL_MS = 6 * 60 * 60 * 1e3;
16
+ const SIDER_SESSION_BINDING_MAX = 512;
17
+ const SIDER_RUN_STATE_TTL_MS = 6 * 60 * 60 * 1e3;
18
+ const SIDER_RUN_STATE_MAX = 1024;
19
+ const meta = {
20
+ id: SIDER_CHANNEL_ID,
21
+ label: SIDER_CHANNEL_LABEL,
22
+ selectionLabel: SIDER_CHANNEL_SELECTION_LABEL,
23
+ docsPath: SIDER_CHANNEL_DOCS_PATH,
24
+ docsLabel: SIDER_CHANNEL_DOCS_LABEL,
25
+ blurb: SIDER_CHANNEL_BLURB,
26
+ aliases: [...SIDER_CHANNEL_ALIASES],
27
+ order: 97
28
+ };
29
+ export {
30
+ DEFAULT_MEDIA_SAVE_MAX_BYTES,
31
+ DEFAULT_MEDIA_UPLOAD_SKIP_MAX_BYTES,
32
+ DEFAULT_MONITOR_KEEPALIVE_MS,
33
+ DEFAULT_MONITOR_PONG_TIMEOUT_MS,
34
+ DEFAULT_STRUCTURED_PAYLOAD_MAX_CHARS,
35
+ SIDER_RUN_STATE_MAX,
36
+ SIDER_RUN_STATE_TTL_MS,
37
+ SIDER_SESSION_BINDING_MAX,
38
+ SIDER_SESSION_BINDING_TTL_MS,
39
+ meta
40
+ };
@@ -0,0 +1,17 @@
1
+ import { R as ResolvedSiderAccount } from '../account-cW9SLuNu.js';
2
+ import 'openclaw/plugin-sdk/setup';
3
+ import './auth.js';
4
+ import 'openclaw/plugin-sdk';
5
+ import 'openclaw/plugin-sdk/plugin-entry';
6
+ import 'openclaw/plugin-sdk/config-runtime';
7
+
8
+ declare function acquireSiderTyping(params: {
9
+ account: ResolvedSiderAccount;
10
+ sessionId: string;
11
+ }): void;
12
+ declare function releaseSiderTyping(params: {
13
+ account: ResolvedSiderAccount;
14
+ sessionId: string;
15
+ }): void;
16
+
17
+ export { acquireSiderTyping, releaseSiderTyping };
@@ -0,0 +1,79 @@
1
+ import { buildTypingEvent } from "./channel-builders.js";
2
+ import { sendSiderEventBestEffort } from "./channel-relay.js";
3
+ import { logWarn } from "./channel-runtime.js";
4
+ const KEEPALIVE_INTERVAL_MS = 2500;
5
+ const states = /* @__PURE__ */ new Map();
6
+ const resolveKey = (accountId, sessionId) => `${accountId}:${sessionId}`;
7
+ function fireTyping(state, typingState, context) {
8
+ const event = buildTypingEvent({
9
+ state: typingState,
10
+ sessionId: state.sessionId,
11
+ accountId: state.account.accountId
12
+ });
13
+ void sendSiderEventBestEffort({
14
+ account: state.account,
15
+ sessionId: state.sessionId,
16
+ event,
17
+ context
18
+ }).catch(
19
+ (err) => logWarn(`sider ${context} failed`, {
20
+ accountId: state.account.accountId,
21
+ sessionId: state.sessionId,
22
+ error: String(err)
23
+ })
24
+ );
25
+ }
26
+ function acquireSiderTyping(params) {
27
+ const accountId = params.account.accountId;
28
+ const sessionId = params.sessionId;
29
+ if (!accountId || !sessionId) {
30
+ return;
31
+ }
32
+ const key = resolveKey(accountId, sessionId);
33
+ let state = states.get(key);
34
+ if (!state) {
35
+ state = {
36
+ key,
37
+ account: params.account,
38
+ sessionId,
39
+ refCount: 0
40
+ };
41
+ states.set(key, state);
42
+ } else {
43
+ state.account = params.account;
44
+ }
45
+ state.refCount += 1;
46
+ if (state.refCount === 1) {
47
+ fireTyping(state, "typing", "typing.start");
48
+ state.keepaliveTimer = setInterval(
49
+ () => fireTyping(state, "typing", "typing.keepalive"),
50
+ KEEPALIVE_INTERVAL_MS
51
+ );
52
+ }
53
+ }
54
+ function releaseSiderTyping(params) {
55
+ const accountId = params.account.accountId;
56
+ const sessionId = params.sessionId;
57
+ if (!accountId || !sessionId) {
58
+ return;
59
+ }
60
+ const key = resolveKey(accountId, sessionId);
61
+ const state = states.get(key);
62
+ if (!state || state.refCount <= 0) {
63
+ return;
64
+ }
65
+ state.refCount -= 1;
66
+ if (state.refCount > 0) {
67
+ return;
68
+ }
69
+ if (state.keepaliveTimer) {
70
+ clearInterval(state.keepaliveTimer);
71
+ state.keepaliveTimer = void 0;
72
+ }
73
+ fireTyping(state, "idle", "typing.stop");
74
+ states.delete(state.key);
75
+ }
76
+ export {
77
+ acquireSiderTyping,
78
+ releaseSiderTyping
79
+ };
@@ -0,0 +1,78 @@
1
+ import { OpenClawConfig } from 'openclaw/plugin-sdk';
2
+ import { SiderUsageTotals, SiderRunState, SiderPart, ParsedInboundMedia, SiderParsedAssistantOutput } from './channel-types.js';
3
+ import '../account-cW9SLuNu.js';
4
+ import 'openclaw/plugin-sdk/setup';
5
+ import './auth.js';
6
+ import 'openclaw/plugin-sdk/plugin-entry';
7
+ import 'openclaw/plugin-sdk/config-runtime';
8
+ import 'ws';
9
+
10
+ declare function hasFiniteNumber(value: unknown): value is number;
11
+ declare function addUsageTotals(target: SiderUsageTotals, next?: SiderUsageTotals): void;
12
+ declare function hasUsageTotals(usage?: SiderUsageTotals): boolean;
13
+ declare function firstUsageCount(...values: unknown[]): number | undefined;
14
+ declare function toJsonSafeValue(value: unknown): unknown;
15
+ declare function clipText(text: string, maxChars?: number): string;
16
+ declare function appendStructuredPayloadField(payload: Record<string, unknown>, fieldName: string, value: unknown, maxChars?: number): void;
17
+ declare function extractToolResultText(result: unknown): string;
18
+ declare function extractToolResultMediaUrls(result: unknown): string[];
19
+ declare function toRecord(value: unknown): Record<string, unknown> | null;
20
+ declare function getSocketCloseInfo(closeInfo?: {
21
+ code?: number;
22
+ reason?: string | Buffer;
23
+ wasClean?: boolean;
24
+ }): {
25
+ code?: number;
26
+ reason?: string;
27
+ wasClean?: boolean;
28
+ };
29
+ declare function describeSocketClose(closeInfo?: {
30
+ code?: number;
31
+ reason?: string | Buffer;
32
+ wasClean?: boolean;
33
+ }): string;
34
+ declare function decodeBase64AttachmentBuffer(raw: string): Buffer;
35
+ declare function updateSiderSessionTitle(params: {
36
+ sessionId: string;
37
+ title: string;
38
+ authorization: string;
39
+ }): Promise<void>;
40
+ declare function persistInlineAttachmentBuffer(params: {
41
+ cfg: OpenClawConfig;
42
+ accountId?: string | null;
43
+ buffer: Buffer;
44
+ contentType?: string;
45
+ fileName?: string;
46
+ }): Promise<{
47
+ path: string;
48
+ contentType?: string;
49
+ }>;
50
+ declare function parseTextFromPart(part: SiderPart): string | null;
51
+ declare function collectTextPartValues(parts: readonly SiderPart[]): Set<string>;
52
+ declare function filterDuplicateTextParts(params: {
53
+ parts: readonly SiderPart[];
54
+ seenTexts?: Set<string>;
55
+ }): {
56
+ parts: SiderPart[];
57
+ duplicateTexts: string[];
58
+ seenTexts: Set<string>;
59
+ };
60
+ declare function parseMediaFromPart(part: SiderPart): ParsedInboundMedia | null;
61
+ declare function describeInboundMediaReference(item: ParsedInboundMedia): string | undefined;
62
+ declare function buildEventMeta(params: {
63
+ accountId: string;
64
+ }): Record<string, unknown>;
65
+ declare function formatUsageForMessageMeta(usage?: SiderUsageTotals): Record<string, unknown> | undefined;
66
+ declare function parseUsageTotals(value: unknown): SiderUsageTotals | undefined;
67
+ declare function choosePreferredUsageTotals(...candidates: Array<SiderUsageTotals | undefined>): SiderUsageTotals | undefined;
68
+ declare function parseUsageFromAssistantLike(value: unknown): SiderUsageTotals | undefined;
69
+ declare function buildMessageMeta(params: {
70
+ accountId: string;
71
+ runState?: SiderRunState;
72
+ stopReason?: string;
73
+ }): Record<string, unknown>;
74
+ declare function isAbortedAssistantStopReason(stopReason?: string): boolean;
75
+ declare function parseAssistantOutput(lastAssistant: unknown): SiderParsedAssistantOutput | null;
76
+ declare function mergeTextSegments(previous: string, next: string): string;
77
+
78
+ export { addUsageTotals, appendStructuredPayloadField, buildEventMeta, buildMessageMeta, choosePreferredUsageTotals, clipText, collectTextPartValues, decodeBase64AttachmentBuffer, describeInboundMediaReference, describeSocketClose, extractToolResultMediaUrls, extractToolResultText, filterDuplicateTextParts, firstUsageCount, formatUsageForMessageMeta, getSocketCloseInfo, hasFiniteNumber, hasUsageTotals, isAbortedAssistantStopReason, mergeTextSegments, parseAssistantOutput, parseMediaFromPart, parseTextFromPart, parseUsageFromAssistantLike, parseUsageTotals, persistInlineAttachmentBuffer, toJsonSafeValue, toRecord, updateSiderSessionTitle };