@rethinkingstudio/clawpilot 2.1.6 → 2.1.7-beta.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 (63) hide show
  1. package/dist/ccconnect/api-client.d.ts +78 -0
  2. package/dist/ccconnect/api-client.js +98 -0
  3. package/dist/ccconnect/api-client.js.map +1 -0
  4. package/dist/ccconnect/local-runtime.d.ts +15 -0
  5. package/dist/ccconnect/local-runtime.js +181 -0
  6. package/dist/ccconnect/local-runtime.js.map +1 -0
  7. package/dist/ccconnect/project-config.d.ts +25 -0
  8. package/dist/ccconnect/project-config.js +309 -0
  9. package/dist/ccconnect/project-config.js.map +1 -0
  10. package/dist/commands/install.js +1 -0
  11. package/dist/commands/install.js.map +1 -1
  12. package/dist/commands/local-handlers.js +46 -0
  13. package/dist/commands/local-handlers.js.map +1 -1
  14. package/dist/commands/pair.d.ts +4 -0
  15. package/dist/commands/pair.js +87 -12
  16. package/dist/commands/pair.js.map +1 -1
  17. package/dist/commands/run.js +36 -1
  18. package/dist/commands/run.js.map +1 -1
  19. package/dist/commands/session-key.js +5 -2
  20. package/dist/commands/session-key.js.map +1 -1
  21. package/dist/commands/status.js +41 -4
  22. package/dist/commands/status.js.map +1 -1
  23. package/dist/config/config.d.ts +9 -1
  24. package/dist/config/config.js +30 -4
  25. package/dist/config/config.js.map +1 -1
  26. package/dist/hermes/agent-bridge.js +46 -2
  27. package/dist/hermes/agent-bridge.js.map +1 -1
  28. package/dist/hermes/home.d.ts +23 -0
  29. package/dist/hermes/home.js +250 -0
  30. package/dist/hermes/home.js.map +1 -0
  31. package/dist/hermes/model-catalog.js +10 -9
  32. package/dist/hermes/model-catalog.js.map +1 -1
  33. package/dist/i18n/index.js +2 -2
  34. package/dist/i18n/index.js.map +1 -1
  35. package/dist/index.js +7 -3
  36. package/dist/index.js.map +1 -1
  37. package/dist/media/assistant-attachments.d.ts +2 -0
  38. package/dist/media/assistant-attachments.js +18 -18
  39. package/dist/media/assistant-attachments.js.map +1 -1
  40. package/dist/platform/service-manager.js +9 -0
  41. package/dist/platform/service-manager.js.map +1 -1
  42. package/dist/relay/agent-status.d.ts +55 -0
  43. package/dist/relay/agent-status.js +294 -0
  44. package/dist/relay/agent-status.js.map +1 -0
  45. package/dist/relay/ccconnect-relay-manager.d.ts +13 -0
  46. package/dist/relay/ccconnect-relay-manager.js +1105 -0
  47. package/dist/relay/ccconnect-relay-manager.js.map +1 -0
  48. package/dist/relay/hermes-relay-manager.js +225 -53
  49. package/dist/relay/hermes-relay-manager.js.map +1 -1
  50. package/dist/relay/relay-command-dispatcher.d.ts +14 -0
  51. package/dist/relay/relay-command-dispatcher.js +25 -0
  52. package/dist/relay/relay-command-dispatcher.js.map +1 -0
  53. package/dist/relay/relay-manager.js +60 -29
  54. package/dist/relay/relay-manager.js.map +1 -1
  55. package/dist/relay/relay-method-registry.d.ts +9 -0
  56. package/dist/relay/relay-method-registry.js +61 -0
  57. package/dist/relay/relay-method-registry.js.map +1 -0
  58. package/dist/relay/relay-watchdog.d.ts +2 -0
  59. package/dist/relay/relay-watchdog.js +31 -0
  60. package/dist/relay/relay-watchdog.js.map +1 -0
  61. package/package.json +1 -1
  62. package/scripts/hermes_agent_bridge.py +14 -2
  63. package/scripts/verify-build-config.mjs +1 -3
@@ -0,0 +1,78 @@
1
+ export interface CCConnectClientOptions {
2
+ managementUrl: string;
3
+ managementToken?: string;
4
+ }
5
+ export interface CCConnectStatus {
6
+ bridge?: {
7
+ enabled?: boolean;
8
+ port?: number;
9
+ path?: string;
10
+ token?: string;
11
+ };
12
+ }
13
+ export interface CCConnectProject {
14
+ name: string;
15
+ agent_type?: string;
16
+ sessions_count?: number;
17
+ heartbeat_enabled?: boolean;
18
+ platforms?: string[];
19
+ }
20
+ export interface CCConnectProjectDetail extends CCConnectProject {
21
+ work_dir?: string;
22
+ mode?: string;
23
+ agent_mode?: string;
24
+ active_session_keys?: string[];
25
+ platform_configs?: Array<{
26
+ type?: string;
27
+ [key: string]: unknown;
28
+ }>;
29
+ }
30
+ export interface CCConnectSessionSummary {
31
+ id: string;
32
+ session_key: string;
33
+ name?: string;
34
+ platform?: string;
35
+ agent_type?: string;
36
+ active?: boolean;
37
+ live?: boolean;
38
+ created_at?: string;
39
+ updated_at?: string;
40
+ history_count?: number;
41
+ last_message?: {
42
+ role?: string;
43
+ content?: string;
44
+ timestamp?: string;
45
+ } | null;
46
+ user_name?: string;
47
+ chat_name?: string;
48
+ }
49
+ export interface CCConnectSessionDetail extends CCConnectSessionSummary {
50
+ agent_session_id?: string;
51
+ history?: Array<{
52
+ role?: string;
53
+ content?: string;
54
+ timestamp?: string;
55
+ }>;
56
+ }
57
+ export declare class CCConnectManagementClient {
58
+ private readonly baseUrl;
59
+ private readonly token?;
60
+ constructor(options: CCConnectClientOptions);
61
+ status(): Promise<CCConnectStatus>;
62
+ listProjects(): Promise<CCConnectProject[]>;
63
+ getProject(project: string): Promise<CCConnectProjectDetail>;
64
+ listSessions(project: string): Promise<CCConnectSessionSummary[]>;
65
+ getSession(project: string, id: string, historyLimit?: number): Promise<CCConnectSessionDetail>;
66
+ createSession(project: string, sessionKey: string, name: string): Promise<CCConnectSessionSummary>;
67
+ send(project: string, sessionKey: string, message: string): Promise<void>;
68
+ private get;
69
+ private post;
70
+ private request;
71
+ }
72
+ export declare function encodeCCConnectSessionKey(project: string, sessionKey: string, sessionId: string): string;
73
+ export declare function decodeCCConnectSessionKey(encoded: string): {
74
+ project: string;
75
+ sessionKey: string;
76
+ sessionId: string;
77
+ };
78
+ export declare function timestampMs(value: string | undefined): number;
@@ -0,0 +1,98 @@
1
+ export class CCConnectManagementClient {
2
+ baseUrl;
3
+ token;
4
+ constructor(options) {
5
+ this.baseUrl = `${options.managementUrl.replace(/\/+$/, "")}/api/v1`;
6
+ this.token = options.managementToken;
7
+ }
8
+ async status() {
9
+ return this.get("/status");
10
+ }
11
+ async listProjects() {
12
+ const data = await this.get("/projects");
13
+ return data.projects ?? [];
14
+ }
15
+ async getProject(project) {
16
+ return this.get(`/projects/${encodeURIComponent(project)}`);
17
+ }
18
+ async listSessions(project) {
19
+ const data = await this.get(`/projects/${encodeURIComponent(project)}/sessions`);
20
+ return data.sessions ?? [];
21
+ }
22
+ async getSession(project, id, historyLimit = 50) {
23
+ return this.get(`/projects/${encodeURIComponent(project)}/sessions/${encodeURIComponent(id)}?history_limit=${historyLimit}`);
24
+ }
25
+ async createSession(project, sessionKey, name) {
26
+ const data = await this.post(`/projects/${encodeURIComponent(project)}/sessions`, { session_key: sessionKey, name });
27
+ return data;
28
+ }
29
+ async send(project, sessionKey, message) {
30
+ await this.post(`/projects/${encodeURIComponent(project)}/send`, {
31
+ session_key: sessionKey,
32
+ message,
33
+ });
34
+ }
35
+ async get(path) {
36
+ return this.request("GET", path);
37
+ }
38
+ async post(path, body) {
39
+ return this.request("POST", path, body);
40
+ }
41
+ async request(method, path, body) {
42
+ const headers = {};
43
+ if (this.token)
44
+ headers.Authorization = `Bearer ${this.token}`;
45
+ if (body !== undefined)
46
+ headers["Content-Type"] = "application/json";
47
+ const response = await fetch(`${this.baseUrl}${path}`, {
48
+ method,
49
+ headers,
50
+ body: body === undefined ? undefined : JSON.stringify(body),
51
+ });
52
+ const text = await response.text();
53
+ let parsed;
54
+ if (text) {
55
+ parsed = JSON.parse(text);
56
+ }
57
+ if (!response.ok) {
58
+ const error = parsed && typeof parsed === "object" && "error" in parsed
59
+ ? String(parsed.error)
60
+ : text;
61
+ throw new Error(`cc-connect ${method} ${path} failed: HTTP ${response.status} ${error}`);
62
+ }
63
+ if (parsed && typeof parsed === "object" && "ok" in parsed) {
64
+ const envelope = parsed;
65
+ if (envelope.ok === false) {
66
+ throw new Error(envelope.error ?? `cc-connect ${method} ${path} failed`);
67
+ }
68
+ return envelope.data;
69
+ }
70
+ return parsed;
71
+ }
72
+ }
73
+ export function encodeCCConnectSessionKey(project, sessionKey, sessionId) {
74
+ return [
75
+ "ccconnect",
76
+ encodeURIComponent(project),
77
+ encodeURIComponent(sessionKey),
78
+ encodeURIComponent(sessionId),
79
+ ].join(":");
80
+ }
81
+ export function decodeCCConnectSessionKey(encoded) {
82
+ const parts = encoded.split(":");
83
+ if (parts.length < 4 || parts[0] !== "ccconnect") {
84
+ throw new Error(`invalid cc-connect session key: ${encoded}`);
85
+ }
86
+ return {
87
+ project: decodeURIComponent(parts[1]),
88
+ sessionKey: decodeURIComponent(parts[2]),
89
+ sessionId: decodeURIComponent(parts.slice(3).join(":")),
90
+ };
91
+ }
92
+ export function timestampMs(value) {
93
+ if (!value)
94
+ return Date.now();
95
+ const parsed = Date.parse(value);
96
+ return Number.isFinite(parsed) ? parsed : Date.now();
97
+ }
98
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/ccconnect/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface CCConnectRuntimeReady {
2
+ managementUrl: string;
3
+ managementToken?: string;
4
+ bridgeUrl: string;
5
+ bridgeToken?: string;
6
+ }
7
+ interface EnsureOptions {
8
+ managementUrl?: string;
9
+ managementToken?: string;
10
+ bridgeUrl?: string;
11
+ bridgeToken?: string;
12
+ workDir?: string;
13
+ }
14
+ export declare function ensureLocalCCConnectRuntime(opts?: EnsureOptions): Promise<CCConnectRuntimeReady>;
15
+ export {};
@@ -0,0 +1,181 @@
1
+ import { spawn } from "child_process";
2
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
3
+ import { homedir, hostname } from "os";
4
+ import { dirname, join } from "path";
5
+ import { randomBytes } from "crypto";
6
+ import { CCConnectManagementClient } from "./api-client.js";
7
+ const DEFAULT_MANAGEMENT_URL = "http://127.0.0.1:9820";
8
+ const DEFAULT_BRIDGE_URL = "ws://127.0.0.1:9810/bridge/ws";
9
+ const DEFAULT_CONFIG_PATH = join(homedir(), ".cc-connect", "config.toml");
10
+ let spawned = false;
11
+ export async function ensureLocalCCConnectRuntime(opts = {}) {
12
+ const config = ensureCCConnectConfig(opts);
13
+ const managementUrl = opts.managementUrl?.trim() || DEFAULT_MANAGEMENT_URL;
14
+ const bridgeUrl = opts.bridgeUrl?.trim() || DEFAULT_BRIDGE_URL;
15
+ if (!await canReachManagement(managementUrl, opts.managementToken || config.managementToken)) {
16
+ startCCConnect(config.configPath);
17
+ }
18
+ const ready = await waitForCCConnect({
19
+ managementUrl,
20
+ managementToken: opts.managementToken || config.managementToken,
21
+ bridgeUrl,
22
+ bridgeToken: opts.bridgeToken || config.bridgeToken,
23
+ });
24
+ return {
25
+ managementUrl,
26
+ managementToken: ready.managementToken,
27
+ bridgeUrl: ready.bridgeUrl,
28
+ bridgeToken: ready.bridgeToken,
29
+ };
30
+ }
31
+ function ensureCCConnectConfig(opts) {
32
+ const configPath = DEFAULT_CONFIG_PATH;
33
+ const current = existsSync(configPath) ? readFileSync(configPath, "utf-8") : "";
34
+ const parsed = parseManagedTokens(current);
35
+ const managementToken = opts.managementToken?.trim() || parsed.managementToken || randomBytes(16).toString("hex");
36
+ const bridgeToken = opts.bridgeToken?.trim() || parsed.bridgeToken || randomBytes(16).toString("hex");
37
+ // If the user already has a real cc-connect config, do not rewrite it.
38
+ if (current && !isDefaultTemplateConfig(current)) {
39
+ return { configPath, managementToken, bridgeToken };
40
+ }
41
+ const workDir = opts.workDir?.trim() || process.cwd();
42
+ const projectName = sanitizeProjectName(hostname()) || "pocketclaw";
43
+ const next = renderManagedConfig({ projectName, workDir, managementToken, bridgeToken });
44
+ mkdirSync(dirname(configPath), { recursive: true });
45
+ writeFileSync(configPath, next, "utf-8");
46
+ return { configPath, managementToken, bridgeToken };
47
+ }
48
+ function renderManagedConfig(params) {
49
+ const workDir = escapeTomlString(params.workDir);
50
+ return `# Generated by ClawPilot for PocketClaw.
51
+ # You can later edit this with cc-connect web if you want to add real chat platforms.
52
+
53
+ data_dir = ""
54
+ language = ""
55
+
56
+ [log]
57
+ level = "info"
58
+
59
+ [[projects]]
60
+ name = "${escapeTomlString(params.projectName)}"
61
+
62
+ [projects.agent]
63
+ type = "claudecode"
64
+
65
+ [projects.agent.options]
66
+ work_dir = "${workDir}"
67
+ mode = "default"
68
+
69
+ # cc-connect currently requires at least one configured platform.
70
+ # PocketClaw talks through [bridge], so this inert local LINE webhook is only
71
+ # used to satisfy cc-connect startup validation and does not require user setup.
72
+ [[projects.platforms]]
73
+ type = "line"
74
+
75
+ [projects.platforms.options]
76
+ channel_secret = "pocketclaw-placeholder"
77
+ channel_token = "pocketclaw-placeholder"
78
+ port = "0"
79
+ callback_path = "/_pocketclaw_placeholder"
80
+
81
+ [bridge]
82
+ enabled = true
83
+ port = 9810
84
+ token = "${escapeTomlString(params.bridgeToken)}"
85
+ cors_origins = ["*"]
86
+
87
+ [management]
88
+ enabled = true
89
+ port = 9820
90
+ token = "${escapeTomlString(params.managementToken)}"
91
+ cors_origins = ["*"]
92
+ `;
93
+ }
94
+ function isDefaultTemplateConfig(text) {
95
+ return text.includes('work_dir = "/path/to/your/project"')
96
+ || text.includes('app_id = "your-feishu-app-id"')
97
+ || text.includes('app_secret = "your-feishu-app-secret"')
98
+ || text.includes("# Generated by ClawPilot for PocketClaw.");
99
+ }
100
+ function parseManagedTokens(text) {
101
+ return {
102
+ managementToken: extractSectionString(text, "management", "token"),
103
+ bridgeToken: extractSectionString(text, "bridge", "token"),
104
+ };
105
+ }
106
+ function extractSectionString(text, section, key) {
107
+ const sectionPattern = new RegExp(`\\[${section}\\]([\\s\\S]*?)(?:\\n\\[|$)`);
108
+ const sectionMatch = text.match(sectionPattern);
109
+ if (!sectionMatch)
110
+ return undefined;
111
+ const valueMatch = sectionMatch[1].match(new RegExp(`^\\s*${key}\\s*=\\s*"([^"]*)"`, "m"));
112
+ return valueMatch?.[1]?.trim() || undefined;
113
+ }
114
+ async function canReachManagement(managementUrl, managementToken) {
115
+ try {
116
+ const client = new CCConnectManagementClient({ managementUrl, managementToken });
117
+ await client.status();
118
+ return true;
119
+ }
120
+ catch {
121
+ return false;
122
+ }
123
+ }
124
+ function startCCConnect(configPath) {
125
+ if (spawned)
126
+ return;
127
+ spawned = true;
128
+ const command = resolveCCConnectCommand();
129
+ const child = spawn(command.bin, [...command.args, "--config", configPath, "--force"], {
130
+ detached: true,
131
+ stdio: "ignore",
132
+ });
133
+ child.unref();
134
+ }
135
+ function resolveCCConnectCommand() {
136
+ if (process.env.CCCONNECT_BIN?.trim()) {
137
+ return { bin: process.env.CCCONNECT_BIN.trim(), args: [] };
138
+ }
139
+ // Prefer an installed binary. Fall back to npx so a fresh ClawPilot install
140
+ // can bootstrap cc-connect without requiring the user to know that it exists.
141
+ return process.platform === "win32"
142
+ ? { bin: "cmd", args: ["/c", "where cc-connect >nul 2>nul && cc-connect || npx -y cc-connect"] }
143
+ : { bin: "sh", args: ["-lc", "command -v cc-connect >/dev/null 2>&1 && exec cc-connect \"$@\" || exec npx -y cc-connect \"$@\"", "cc-connect"] };
144
+ }
145
+ async function waitForCCConnect(initial) {
146
+ let lastError = "unknown";
147
+ for (let attempt = 0; attempt < 20; attempt += 1) {
148
+ try {
149
+ const client = new CCConnectManagementClient({
150
+ managementUrl: initial.managementUrl,
151
+ managementToken: initial.managementToken,
152
+ });
153
+ const status = await client.status();
154
+ await client.listProjects();
155
+ const bridge = status.bridge;
156
+ const bridgePath = bridge?.path || "/bridge/ws";
157
+ const bridgePort = bridge?.port || 9810;
158
+ return {
159
+ managementUrl: initial.managementUrl,
160
+ managementToken: initial.managementToken,
161
+ bridgeUrl: initial.bridgeUrl || `ws://127.0.0.1:${bridgePort}${bridgePath}`,
162
+ bridgeToken: initial.bridgeToken || bridge?.token,
163
+ };
164
+ }
165
+ catch (error) {
166
+ lastError = error instanceof Error ? error.message : String(error);
167
+ await new Promise((resolve) => setTimeout(resolve, 1000));
168
+ }
169
+ }
170
+ throw new Error(`cc-connect did not become ready: ${lastError}`);
171
+ }
172
+ function sanitizeProjectName(value) {
173
+ return value
174
+ .replace(/[^\w.-]+/g, "-")
175
+ .replace(/^-+|-+$/g, "")
176
+ .slice(0, 48);
177
+ }
178
+ function escapeTomlString(value) {
179
+ return value.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
180
+ }
181
+ //# sourceMappingURL=local-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-runtime.js","sourceRoot":"","sources":["../../src/ccconnect/local-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export interface CreateCCConnectProjectParams {
2
+ name?: string;
3
+ workDir?: string;
4
+ agentType?: string;
5
+ mode?: string;
6
+ }
7
+ export interface CCConnectProjectCandidate {
8
+ name: string;
9
+ path: string;
10
+ source: "history" | "configured" | "common";
11
+ markers: string[];
12
+ existingProjectName?: string;
13
+ }
14
+ export declare function createCCConnectProject(params: CreateCCConnectProjectParams): {
15
+ name: string;
16
+ workDir: string;
17
+ agentType: string;
18
+ mode: string;
19
+ configPath: string;
20
+ };
21
+ export declare function restartCCConnect(configPath?: string): void;
22
+ export declare function discoverCCConnectProjects(existingProjects: Array<{
23
+ name: string;
24
+ workDir?: string;
25
+ }>): CCConnectProjectCandidate[];