@a1hvdy/cc-openclaw 0.6.0 → 0.7.1
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/src/engines/persistent-session.js +13 -0
- package/dist/src/engines/persistent-session.js.map +1 -1
- package/dist/src/lib/config.d.ts +2 -0
- package/dist/src/lib/config.js +19 -0
- package/dist/src/lib/config.js.map +1 -1
- package/dist/src/lib/trajectory.d.ts +1 -1
- package/dist/src/lib/trajectory.js.map +1 -1
- package/dist/src/lib/vendor-paths.d.ts +6 -4
- package/dist/src/lib/vendor-paths.js +21 -14
- package/dist/src/lib/vendor-paths.js.map +1 -1
- package/dist/src/openai-compat/openai-compat.d.ts +7 -1
- package/dist/src/openai-compat/openai-compat.js +35 -4
- package/dist/src/openai-compat/openai-compat.js.map +1 -1
- package/dist/src/openai-compat/sse-translator.d.ts +23 -3
- package/dist/src/openai-compat/sse-translator.js +45 -6
- package/dist/src/openai-compat/sse-translator.js.map +1 -1
- package/dist/src/types.d.ts +9 -0
- package/package.json +2 -3
- package/vendor/base-oneshot-session.d.ts +0 -87
- package/vendor/base-oneshot-session.js +0 -227
- package/vendor/base-oneshot-session.js.map +0 -1
- package/vendor/circuit-breaker.d.ts +0 -21
- package/vendor/circuit-breaker.js +0 -47
- package/vendor/circuit-breaker.js.map +0 -1
- package/vendor/consensus.d.ts +0 -20
- package/vendor/consensus.js +0 -52
- package/vendor/consensus.js.map +0 -1
- package/vendor/constants.d.ts +0 -130
- package/vendor/constants.js +0 -139
- package/vendor/constants.js.map +0 -1
- package/vendor/council.d.ts +0 -67
- package/vendor/council.js +0 -913
- package/vendor/council.js.map +0 -1
- package/vendor/embedded-server.d.ts +0 -25
- package/vendor/embedded-server.js +0 -373
- package/vendor/embedded-server.js.map +0 -1
- package/vendor/inbox-manager.d.ts +0 -38
- package/vendor/inbox-manager.js +0 -111
- package/vendor/inbox-manager.js.map +0 -1
- package/vendor/index.d.ts +0 -63
- package/vendor/index.js +0 -705
- package/vendor/index.js.map +0 -1
- package/vendor/logger.d.ts +0 -16
- package/vendor/logger.js +0 -44
- package/vendor/logger.js.map +0 -1
- package/vendor/models.d.ts +0 -69
- package/vendor/models.js +0 -289
- package/vendor/models.js.map +0 -1
- package/vendor/openai-compat.d.ts +0 -197
- package/vendor/openai-compat.js +0 -765
- package/vendor/openai-compat.js.map +0 -1
- package/vendor/persistent-codex-session.d.ts +0 -16
- package/vendor/persistent-codex-session.js +0 -105
- package/vendor/persistent-codex-session.js.map +0 -1
- package/vendor/persistent-cursor-session.d.ts +0 -21
- package/vendor/persistent-cursor-session.js +0 -241
- package/vendor/persistent-cursor-session.js.map +0 -1
- package/vendor/persistent-custom-session.d.ts +0 -78
- package/vendor/persistent-custom-session.js +0 -937
- package/vendor/persistent-custom-session.js.map +0 -1
- package/vendor/persistent-gemini-session.d.ts +0 -21
- package/vendor/persistent-gemini-session.js +0 -216
- package/vendor/persistent-gemini-session.js.map +0 -1
- package/vendor/persistent-session.d.ts +0 -74
- package/vendor/persistent-session.js +0 -698
- package/vendor/persistent-session.js.map +0 -1
- package/vendor/proxy/anthropic-adapter.d.ts +0 -136
- package/vendor/proxy/anthropic-adapter.js +0 -392
- package/vendor/proxy/anthropic-adapter.js.map +0 -1
- package/vendor/proxy/handler.d.ts +0 -39
- package/vendor/proxy/handler.js +0 -323
- package/vendor/proxy/handler.js.map +0 -1
- package/vendor/proxy/schema-cleaner.d.ts +0 -11
- package/vendor/proxy/schema-cleaner.js +0 -34
- package/vendor/proxy/schema-cleaner.js.map +0 -1
- package/vendor/proxy/thought-cache.d.ts +0 -19
- package/vendor/proxy/thought-cache.js +0 -53
- package/vendor/proxy/thought-cache.js.map +0 -1
- package/vendor/session-manager.d.ts +0 -211
- package/vendor/session-manager.js +0 -1345
- package/vendor/session-manager.js.map +0 -1
- package/vendor/skill-resolver.js +0 -107
- package/vendor/types.d.ts +0 -466
- package/vendor/types.js +0 -8
- package/vendor/types.js.map +0 -1
- package/vendor/validation.d.ts +0 -31
- package/vendor/validation.js +0 -104
- package/vendor/validation.js.map +0 -1
package/vendor/inbox-manager.js
DELETED
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cross-session messaging (inbox) manager.
|
|
3
|
-
*
|
|
4
|
-
* Manages message delivery between sessions. Idle sessions receive messages
|
|
5
|
-
* immediately; busy sessions queue for later delivery via deliverInbox().
|
|
6
|
-
*/
|
|
7
|
-
import { MAX_INBOX_SIZE } from './constants.js';
|
|
8
|
-
export class InboxManager {
|
|
9
|
-
inboxes = new Map();
|
|
10
|
-
static escapeXmlAttr(s) {
|
|
11
|
-
return s.replace(/&/g, '&').replace(/"/g, '"').replace(/</g, '<').replace(/>/g, '>');
|
|
12
|
-
}
|
|
13
|
-
wrapCrossSessionMessage(msg) {
|
|
14
|
-
const esc = InboxManager.escapeXmlAttr;
|
|
15
|
-
const attrs = `from="${esc(msg.from)}"${msg.summary ? ` summary="${esc(msg.summary)}"` : ''}`;
|
|
16
|
-
return `<cross-session-message ${attrs}>\n${msg.text}\n</cross-session-message>`;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Send a message from one session to another (or broadcast with to='*').
|
|
20
|
-
* Returns whether the message was delivered immediately or queued.
|
|
21
|
-
*/
|
|
22
|
-
async sendTo(from, to, message, lookup, summary, onBroadcastError) {
|
|
23
|
-
if (!lookup.exists(from))
|
|
24
|
-
throw new Error(`Sender session '${from}' not found`);
|
|
25
|
-
if (to !== '*' && !lookup.exists(to))
|
|
26
|
-
throw new Error(`Target session '${to}' not found`);
|
|
27
|
-
const inboxMsg = {
|
|
28
|
-
from,
|
|
29
|
-
text: message,
|
|
30
|
-
timestamp: new Date().toISOString(),
|
|
31
|
-
read: false,
|
|
32
|
-
summary,
|
|
33
|
-
};
|
|
34
|
-
// Broadcast
|
|
35
|
-
if (to === '*') {
|
|
36
|
-
let delivered = 0;
|
|
37
|
-
for (const name of lookup.allNames()) {
|
|
38
|
-
if (name === from)
|
|
39
|
-
continue;
|
|
40
|
-
try {
|
|
41
|
-
const ok = await this._deliverOrQueue(name, inboxMsg, lookup);
|
|
42
|
-
if (ok)
|
|
43
|
-
delivered++;
|
|
44
|
-
}
|
|
45
|
-
catch (err) {
|
|
46
|
-
onBroadcastError?.(name, err);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
return { delivered: delivered > 0, queued: delivered === 0 };
|
|
50
|
-
}
|
|
51
|
-
const delivered = await this._deliverOrQueue(to, inboxMsg, lookup);
|
|
52
|
-
return { delivered, queued: !delivered };
|
|
53
|
-
}
|
|
54
|
-
/** Read inbox messages for a session. */
|
|
55
|
-
inbox(name, unreadOnly = true) {
|
|
56
|
-
const box = this.inboxes.get(name) || [];
|
|
57
|
-
return unreadOnly ? box.filter((m) => !m.read) : box;
|
|
58
|
-
}
|
|
59
|
-
/** Deliver all queued unread messages to a session, mark as read. */
|
|
60
|
-
async deliverInbox(name, lookup) {
|
|
61
|
-
const managed = lookup.getSession(name);
|
|
62
|
-
if (!managed)
|
|
63
|
-
throw new Error(`Session '${name}' not found`);
|
|
64
|
-
const box = this.inboxes.get(name);
|
|
65
|
-
if (!box || box.length === 0)
|
|
66
|
-
return 0;
|
|
67
|
-
const unread = box.filter((m) => !m.read);
|
|
68
|
-
if (unread.length === 0)
|
|
69
|
-
return 0;
|
|
70
|
-
const formatted = unread.map((m) => this.wrapCrossSessionMessage(m)).join('\n\n');
|
|
71
|
-
await managed.session.send(formatted, { waitForComplete: false });
|
|
72
|
-
for (const m of unread)
|
|
73
|
-
m.read = true;
|
|
74
|
-
return unread.length;
|
|
75
|
-
}
|
|
76
|
-
/** Clear inbox for a session. */
|
|
77
|
-
clear(name) {
|
|
78
|
-
this.inboxes.delete(name);
|
|
79
|
-
}
|
|
80
|
-
// ── Private ─────────────────────────────────────────────────────────────
|
|
81
|
-
async _deliverOrQueue(sessionName, msg, lookup) {
|
|
82
|
-
const managed = lookup.getSession(sessionName);
|
|
83
|
-
if (!managed)
|
|
84
|
-
return false;
|
|
85
|
-
// If session is idle, deliver directly
|
|
86
|
-
if (!managed.session.isBusy && managed.session.isReady) {
|
|
87
|
-
try {
|
|
88
|
-
await managed.session.send(this.wrapCrossSessionMessage(msg), { waitForComplete: false });
|
|
89
|
-
msg.read = true;
|
|
90
|
-
return true;
|
|
91
|
-
}
|
|
92
|
-
catch {
|
|
93
|
-
// Fall through to queue
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
// Queue in inbox (with size cap — drop oldest read messages first)
|
|
97
|
-
if (!this.inboxes.has(sessionName))
|
|
98
|
-
this.inboxes.set(sessionName, []);
|
|
99
|
-
const box = this.inboxes.get(sessionName);
|
|
100
|
-
if (box.length >= MAX_INBOX_SIZE) {
|
|
101
|
-
const readIdx = box.findIndex((m) => m.read);
|
|
102
|
-
if (readIdx >= 0)
|
|
103
|
-
box.splice(readIdx, 1);
|
|
104
|
-
else
|
|
105
|
-
box.shift(); // drop oldest unread as last resort
|
|
106
|
-
}
|
|
107
|
-
box.push(msg);
|
|
108
|
-
return false;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
//# sourceMappingURL=inbox-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"inbox-manager.js","sourceRoot":"","sources":["../../src/inbox-manager.ts"],"names":[],"mappings":"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"}
|
package/vendor/index.d.ts
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* openclaw-claude-code — Plugin entry point
|
|
3
|
-
*
|
|
4
|
-
* Registers tools, hooks, and HTTP routes with the OpenClaw Plugin SDK.
|
|
5
|
-
* When used standalone (no OpenClaw), exports SessionManager for direct use.
|
|
6
|
-
*
|
|
7
|
-
* Lazy initialisation: SessionManager and EmbeddedServer are created only on
|
|
8
|
-
* the first tool call. While the plugin is registered but never used, it
|
|
9
|
-
* consumes no memory beyond the tool schema definitions.
|
|
10
|
-
*/
|
|
11
|
-
export { SessionManager } from './session-manager.js';
|
|
12
|
-
export { PersistentClaudeSession } from './persistent-session.js';
|
|
13
|
-
export { BaseOneShotSession, type OneShotEngineConfig } from './base-oneshot-session.js';
|
|
14
|
-
export { PersistentCodexSession } from './persistent-codex-session.js';
|
|
15
|
-
export { PersistentGeminiSession } from './persistent-gemini-session.js';
|
|
16
|
-
export { PersistentCursorSession } from './persistent-cursor-session.js';
|
|
17
|
-
export { PersistentCustomSession } from './persistent-custom-session.js';
|
|
18
|
-
export { Council, getDefaultCouncilConfig } from './council.js';
|
|
19
|
-
export { parseConsensus, stripConsensusTags, hasConsensusMarker } from './consensus.js';
|
|
20
|
-
export { sanitizeCwd, validateRegex, validateName } from './validation.js';
|
|
21
|
-
export { type Logger, createConsoleLogger, nullLogger } from './logger.js';
|
|
22
|
-
export { CircuitBreaker } from './circuit-breaker.js';
|
|
23
|
-
export { InboxManager, type SessionLookup } from './inbox-manager.js';
|
|
24
|
-
export type { ISession } from './types.js';
|
|
25
|
-
export * from './types.js';
|
|
26
|
-
/** OpenClaw Plugin SDK interface (minimal typing for what we use) */
|
|
27
|
-
interface PluginAPI {
|
|
28
|
-
pluginConfig: Record<string, unknown>;
|
|
29
|
-
logger: {
|
|
30
|
-
info(...args: unknown[]): void;
|
|
31
|
-
error(...args: unknown[]): void;
|
|
32
|
-
warn(...args: unknown[]): void;
|
|
33
|
-
};
|
|
34
|
-
registerTool(def: {
|
|
35
|
-
name: string;
|
|
36
|
-
label?: string;
|
|
37
|
-
description: string;
|
|
38
|
-
parameters: Record<string, unknown>;
|
|
39
|
-
execute: (toolCallId: string, params: Record<string, unknown>) => Promise<unknown>;
|
|
40
|
-
}): void;
|
|
41
|
-
on(event: string, handler: (event: Record<string, unknown>, ctx?: unknown) => Promise<void>): void;
|
|
42
|
-
registerHttpRoute(def: {
|
|
43
|
-
path: string;
|
|
44
|
-
auth?: string;
|
|
45
|
-
match?: string;
|
|
46
|
-
handler: (...args: unknown[]) => Promise<boolean>;
|
|
47
|
-
}): void;
|
|
48
|
-
registerService(def: {
|
|
49
|
-
id: string;
|
|
50
|
-
start: () => void;
|
|
51
|
-
stop: () => void;
|
|
52
|
-
}): void;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* OpenClaw plugin object — standard format
|
|
56
|
-
*/
|
|
57
|
-
declare const plugin: {
|
|
58
|
-
id: string;
|
|
59
|
-
name: string;
|
|
60
|
-
description: string;
|
|
61
|
-
register(api: PluginAPI): void;
|
|
62
|
-
};
|
|
63
|
-
export default plugin;
|