ccgateway 0.1.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 (75) hide show
  1. package/README.md +252 -0
  2. package/bin/ccg-dev.sh +3 -0
  3. package/dist/agents.d.ts +17 -0
  4. package/dist/agents.d.ts.map +1 -0
  5. package/dist/agents.js +45 -0
  6. package/dist/agents.js.map +1 -0
  7. package/dist/chat.d.ts +14 -0
  8. package/dist/chat.d.ts.map +1 -0
  9. package/dist/chat.js +104 -0
  10. package/dist/chat.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +501 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/config.d.ts +53 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/config.js +70 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/context.d.ts +45 -0
  20. package/dist/context.d.ts.map +1 -0
  21. package/dist/context.js +201 -0
  22. package/dist/context.js.map +1 -0
  23. package/dist/daemon.d.ts +27 -0
  24. package/dist/daemon.d.ts.map +1 -0
  25. package/dist/daemon.js +207 -0
  26. package/dist/daemon.js.map +1 -0
  27. package/dist/heartbeat.d.ts +42 -0
  28. package/dist/heartbeat.d.ts.map +1 -0
  29. package/dist/heartbeat.js +153 -0
  30. package/dist/heartbeat.js.map +1 -0
  31. package/dist/logger.d.ts +15 -0
  32. package/dist/logger.d.ts.map +1 -0
  33. package/dist/logger.js +70 -0
  34. package/dist/logger.js.map +1 -0
  35. package/dist/messaging.d.ts +43 -0
  36. package/dist/messaging.d.ts.map +1 -0
  37. package/dist/messaging.js +132 -0
  38. package/dist/messaging.js.map +1 -0
  39. package/dist/migrate.d.ts +24 -0
  40. package/dist/migrate.d.ts.map +1 -0
  41. package/dist/migrate.js +356 -0
  42. package/dist/migrate.js.map +1 -0
  43. package/dist/plugin.d.ts +63 -0
  44. package/dist/plugin.d.ts.map +1 -0
  45. package/dist/plugin.js +93 -0
  46. package/dist/plugin.js.map +1 -0
  47. package/dist/plugins/discord-gateway.d.ts +32 -0
  48. package/dist/plugins/discord-gateway.d.ts.map +1 -0
  49. package/dist/plugins/discord-gateway.js +208 -0
  50. package/dist/plugins/discord-gateway.js.map +1 -0
  51. package/dist/plugins/slack-gateway.d.ts +35 -0
  52. package/dist/plugins/slack-gateway.d.ts.map +1 -0
  53. package/dist/plugins/slack-gateway.js +291 -0
  54. package/dist/plugins/slack-gateway.js.map +1 -0
  55. package/dist/router.d.ts +44 -0
  56. package/dist/router.d.ts.map +1 -0
  57. package/dist/router.js +103 -0
  58. package/dist/router.js.map +1 -0
  59. package/dist/sessions.d.ts +55 -0
  60. package/dist/sessions.d.ts.map +1 -0
  61. package/dist/sessions.js +160 -0
  62. package/dist/sessions.js.map +1 -0
  63. package/dist/skills.d.ts +58 -0
  64. package/dist/skills.d.ts.map +1 -0
  65. package/dist/skills.js +194 -0
  66. package/dist/skills.js.map +1 -0
  67. package/dist/spawner.d.ts +29 -0
  68. package/dist/spawner.d.ts.map +1 -0
  69. package/dist/spawner.js +54 -0
  70. package/dist/spawner.js.map +1 -0
  71. package/dist/types.d.ts +22 -0
  72. package/dist/types.d.ts.map +1 -0
  73. package/dist/types.js +4 -0
  74. package/dist/types.js.map +1 -0
  75. package/package.json +48 -0
@@ -0,0 +1,153 @@
1
+ import { existsSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { execSync } from "node:child_process";
4
+ // ── Constants ──────────────────────────────────────────────────────────────
5
+ const CRON_MARKER_BEGIN = "# BEGIN ccgateway heartbeats";
6
+ const CRON_MARKER_END = "# END ccgateway heartbeats";
7
+ const HEARTBEAT_PROMPT = "Read HEARTBEAT.md. Follow it strictly. If nothing needs attention, reply HEARTBEAT_OK.";
8
+ // ── HeartbeatManager ──────────────────────────────────────────────────────
9
+ export class HeartbeatManager {
10
+ agents;
11
+ spawner;
12
+ heartbeats;
13
+ constructor(agents, spawner, heartbeats) {
14
+ this.agents = agents;
15
+ this.spawner = spawner;
16
+ this.heartbeats = heartbeats;
17
+ }
18
+ /**
19
+ * Run a heartbeat for an agent.
20
+ * - If no HEARTBEAT.md exists in the workspace, returns silent.
21
+ * - If the agent responds with "HEARTBEAT_OK", returns silent.
22
+ * - Otherwise returns the response.
23
+ */
24
+ async runHeartbeat(agentId) {
25
+ // 1. Get agent config, validate
26
+ const agent = this.agents.getAgent(agentId);
27
+ if (!agent) {
28
+ throw new Error(`Agent "${agentId}" not found`);
29
+ }
30
+ // 2. Check if HEARTBEAT.md exists in workspace
31
+ const heartbeatPath = join(agent.workspace, "HEARTBEAT.md");
32
+ if (!existsSync(heartbeatPath)) {
33
+ return { silent: true };
34
+ }
35
+ // 3. Spawn claude --print with heartbeat prompt
36
+ const result = await this.spawner.spawn({
37
+ workspace: agent.workspace,
38
+ message: HEARTBEAT_PROMPT,
39
+ systemPrompt: "",
40
+ model: agent.model,
41
+ allowedTools: agent.allowedTools,
42
+ });
43
+ // 4. Check if response is HEARTBEAT_OK
44
+ const trimmed = result.response.trim();
45
+ if (trimmed === "HEARTBEAT_OK") {
46
+ return { silent: true };
47
+ }
48
+ // 5. Otherwise return the response
49
+ return { silent: false, response: result.response };
50
+ }
51
+ /**
52
+ * Generate crontab lines from heartbeats config.
53
+ * Format: <cron> TZ=<tz> ccg heartbeat run <agent>
54
+ */
55
+ generateCronLines() {
56
+ return this.heartbeats.map((hb) => `${hb.cron} TZ=${hb.tz} ccg heartbeat run ${hb.agent}`);
57
+ }
58
+ /**
59
+ * Install cron jobs to system crontab.
60
+ * Returns the generated crontab lines (for display).
61
+ */
62
+ installCron() {
63
+ const lines = this.generateCronLines();
64
+ if (lines.length === 0) {
65
+ return "(no heartbeats configured)";
66
+ }
67
+ // Read existing crontab
68
+ let existing = "";
69
+ try {
70
+ existing = execSync("crontab -l 2>/dev/null", {
71
+ encoding: "utf-8",
72
+ });
73
+ }
74
+ catch {
75
+ // No existing crontab — that's fine
76
+ }
77
+ // Remove any existing ccgateway section
78
+ const cleaned = this.removeCcgSection(existing);
79
+ // Build new crontab
80
+ const ccgSection = [
81
+ CRON_MARKER_BEGIN,
82
+ ...lines,
83
+ CRON_MARKER_END,
84
+ ].join("\n");
85
+ const newCrontab = cleaned.trim()
86
+ ? `${cleaned.trim()}\n${ccgSection}\n`
87
+ : `${ccgSection}\n`;
88
+ // Install
89
+ execSync(`echo ${JSON.stringify(newCrontab)} | crontab -`, {
90
+ encoding: "utf-8",
91
+ });
92
+ return lines.join("\n");
93
+ }
94
+ /**
95
+ * Remove ccgateway cron jobs from system crontab.
96
+ */
97
+ uninstallCron() {
98
+ let existing = "";
99
+ try {
100
+ existing = execSync("crontab -l 2>/dev/null", {
101
+ encoding: "utf-8",
102
+ });
103
+ }
104
+ catch {
105
+ return; // No crontab to clean
106
+ }
107
+ const cleaned = this.removeCcgSection(existing);
108
+ if (cleaned.trim() === "") {
109
+ // Remove crontab entirely if empty
110
+ try {
111
+ execSync("crontab -r 2>/dev/null", { encoding: "utf-8" });
112
+ }
113
+ catch {
114
+ // Already empty
115
+ }
116
+ }
117
+ else {
118
+ execSync(`echo ${JSON.stringify(cleaned.trim() + "\n")} | crontab -`, {
119
+ encoding: "utf-8",
120
+ });
121
+ }
122
+ }
123
+ /**
124
+ * List configured heartbeats.
125
+ */
126
+ listHeartbeats() {
127
+ return this.heartbeats;
128
+ }
129
+ // ── Private helpers ────────────────────────────────────────────────────
130
+ /**
131
+ * Remove the ccgateway section from crontab content.
132
+ */
133
+ removeCcgSection(crontab) {
134
+ const lines = crontab.split("\n");
135
+ const result = [];
136
+ let inSection = false;
137
+ for (const line of lines) {
138
+ if (line.trim() === CRON_MARKER_BEGIN) {
139
+ inSection = true;
140
+ continue;
141
+ }
142
+ if (line.trim() === CRON_MARKER_END) {
143
+ inSection = false;
144
+ continue;
145
+ }
146
+ if (!inSection) {
147
+ result.push(line);
148
+ }
149
+ }
150
+ return result.join("\n");
151
+ }
152
+ }
153
+ //# sourceMappingURL=heartbeat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../src/heartbeat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export type LogLevel = "debug" | "info" | "warn" | "error";
2
+ /**
3
+ * Configure the logger.
4
+ */
5
+ export declare function configureLogger(opts: {
6
+ level?: LogLevel;
7
+ file?: boolean;
8
+ }): void;
9
+ export declare const logger: {
10
+ debug: (msg: string) => Promise<void>;
11
+ info: (msg: string) => Promise<void>;
12
+ warn: (msg: string) => Promise<void>;
13
+ error: (msg: string) => Promise<void>;
14
+ };
15
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AA4C3D;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GAAG,IAAI,CAGP;AAuBD,eAAO,MAAM,MAAM;iBACJ,MAAM;gBACP,MAAM;gBACN,MAAM;iBACL,MAAM;CACpB,CAAC"}
package/dist/logger.js ADDED
@@ -0,0 +1,70 @@
1
+ import { appendFile, mkdir } from "node:fs/promises";
2
+ import { existsSync } from "node:fs";
3
+ import { join, dirname } from "node:path";
4
+ import { getCcgHome } from "./config.js";
5
+ const LEVEL_ORDER = {
6
+ debug: 0,
7
+ info: 1,
8
+ warn: 2,
9
+ error: 3,
10
+ };
11
+ // ── State ───────────────────────────────────────────────────────────────────
12
+ let minLevel = "info";
13
+ let fileLogging = false;
14
+ // ── Helpers ─────────────────────────────────────────────────────────────────
15
+ function timestamp() {
16
+ const now = new Date();
17
+ const pad = (n) => String(n).padStart(2, "0");
18
+ return (`${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())} ` +
19
+ `${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}`);
20
+ }
21
+ function logFilePath() {
22
+ return join(getCcgHome(), "logs", "ccgateway.log");
23
+ }
24
+ function format(level, message) {
25
+ return `[${timestamp()}] [${level.toUpperCase()}] ${message}`;
26
+ }
27
+ async function writeToFile(line) {
28
+ const path = logFilePath();
29
+ const dir = dirname(path);
30
+ if (!existsSync(dir)) {
31
+ await mkdir(dir, { recursive: true });
32
+ }
33
+ await appendFile(path, line + "\n", "utf-8");
34
+ }
35
+ // ── Public API ──────────────────────────────────────────────────────────────
36
+ /**
37
+ * Configure the logger.
38
+ */
39
+ export function configureLogger(opts) {
40
+ if (opts.level !== undefined)
41
+ minLevel = opts.level;
42
+ if (opts.file !== undefined)
43
+ fileLogging = opts.file;
44
+ }
45
+ /**
46
+ * Core log function.
47
+ */
48
+ async function log(level, message) {
49
+ if (LEVEL_ORDER[level] < LEVEL_ORDER[minLevel])
50
+ return;
51
+ const line = format(level, message);
52
+ // Always write to stdout
53
+ if (level === "error") {
54
+ process.stderr.write(line + "\n");
55
+ }
56
+ else {
57
+ process.stdout.write(line + "\n");
58
+ }
59
+ // Optionally write to file
60
+ if (fileLogging) {
61
+ await writeToFile(line);
62
+ }
63
+ }
64
+ export const logger = {
65
+ debug: (msg) => log("debug", msg),
66
+ info: (msg) => log("info", msg),
67
+ warn: (msg) => log("warn", msg),
68
+ error: (msg) => log("error", msg),
69
+ };
70
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { AgentRegistry } from "./agents.js";
2
+ import type { MessageRouter } from "./router.js";
3
+ import type { PluginLoader } from "./plugin.js";
4
+ import type { BindingConfig } from "./config.js";
5
+ export interface InboxMessage {
6
+ from: string;
7
+ content: string;
8
+ ts: number;
9
+ read: boolean;
10
+ }
11
+ export declare class CrossAgentMessenger {
12
+ private agents;
13
+ private bindings;
14
+ private plugins;
15
+ private ccgHome;
16
+ private router?;
17
+ constructor(agents: AgentRegistry, bindings: BindingConfig[], plugins: PluginLoader, ccgHome: string);
18
+ /** Set the router for internal message routing (called after router is created) */
19
+ setRouter(router: MessageRouter): void;
20
+ /**
21
+ * Send a message to an agent. Uses channel-native messaging if the agent
22
+ * has a gateway binding, otherwise falls back to file-based inbox.
23
+ */
24
+ send(toAgentId: string, content: string, fromAgentId?: string): Promise<void>;
25
+ /**
26
+ * Direct file-based inbox write.
27
+ * Appends to $CCG_HOME/agents/{toAgentId}/inbox.jsonl
28
+ */
29
+ sendToInbox(toAgentId: string, content: string, fromAgentId?: string): Promise<void>;
30
+ /**
31
+ * Read unread inbox messages for an agent.
32
+ */
33
+ readInbox(agentId: string): Promise<InboxMessage[]>;
34
+ /**
35
+ * Mark all inbox messages as read.
36
+ */
37
+ markInboxRead(agentId: string): Promise<void>;
38
+ /**
39
+ * Get inbox file path for an agent.
40
+ */
41
+ getInboxPath(agentId: string): string;
42
+ }
43
+ //# sourceMappingURL=messaging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messaging.d.ts","sourceRoot":"","sources":["../src/messaging.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAOjD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,CAAC;CACf;AAID,qBAAa,mBAAmB;IAI5B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,OAAO;IANjB,OAAO,CAAC,MAAM,CAAC,CAAgB;gBAGrB,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,MAAM;IAGzB,mFAAmF;IACnF,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAItC;;;OAGG;IACG,IAAI,CACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC;IAoEhB;;;OAGG;IACG,WAAW,CACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC;IAkBhB;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAqBzD;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBnD;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CAGtC"}
@@ -0,0 +1,132 @@
1
+ import { appendFile, readFile, writeFile, mkdir } from "node:fs/promises";
2
+ import { existsSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ // ── CrossAgentMessenger ──────────────────────────────────────────────────
5
+ export class CrossAgentMessenger {
6
+ agents;
7
+ bindings;
8
+ plugins;
9
+ ccgHome;
10
+ router;
11
+ constructor(agents, bindings, plugins, ccgHome) {
12
+ this.agents = agents;
13
+ this.bindings = bindings;
14
+ this.plugins = plugins;
15
+ this.ccgHome = ccgHome;
16
+ }
17
+ /** Set the router for internal message routing (called after router is created) */
18
+ setRouter(router) {
19
+ this.router = router;
20
+ }
21
+ /**
22
+ * Send a message to an agent. Uses channel-native messaging if the agent
23
+ * has a gateway binding, otherwise falls back to file-based inbox.
24
+ */
25
+ async send(toAgentId, content, fromAgentId) {
26
+ // Validate target agent exists
27
+ const targetAgent = this.agents.getAgent(toAgentId);
28
+ if (!targetAgent) {
29
+ throw new Error(`Agent "${toAgentId}" not found`);
30
+ }
31
+ // 1. Find target agent's primary binding (first binding where agent matches)
32
+ const binding = this.bindings.find((b) => b.agent === toAgentId);
33
+ if (binding) {
34
+ // 2a. Post to Discord/Slack for human visibility (optional)
35
+ const gatewayPlugins = this.plugins.getPluginsByType("gateway");
36
+ const plugin = gatewayPlugins.find((p) => p.name === `${binding.gateway}-gateway`);
37
+ if (plugin && typeof plugin.sendToChannel === "function") {
38
+ let senderBotId = binding.bot;
39
+ if (fromAgentId) {
40
+ const senderBinding = this.bindings.find((b) => b.agent === fromAgentId && b.gateway === binding.gateway);
41
+ if (senderBinding) {
42
+ senderBotId = senderBinding.bot;
43
+ }
44
+ }
45
+ // Post to channel so humans can see the cross-agent message
46
+ await plugin.sendToChannel(binding.channel, senderBotId, content);
47
+ }
48
+ // 2b. Route internally so the target agent actually processes it.
49
+ // Bot messages are ignored by the gateway, so we route directly.
50
+ if (this.router) {
51
+ const response = await this.router.route({
52
+ from: {
53
+ gateway: "internal",
54
+ channel: binding.channel,
55
+ user: fromAgentId || "system",
56
+ userId: fromAgentId || "system",
57
+ messageId: `xagent-${Date.now()}`,
58
+ },
59
+ to: { agent: toAgentId },
60
+ content,
61
+ attachments: [],
62
+ });
63
+ // Post the agent's response back to their channel for visibility
64
+ if (plugin && typeof plugin.sendToChannel === "function") {
65
+ await plugin.sendToChannel(binding.channel, binding.bot, response);
66
+ }
67
+ }
68
+ return;
69
+ }
70
+ // 3. No binding or no usable gateway plugin — fall back to inbox
71
+ await this.sendToInbox(toAgentId, content, fromAgentId);
72
+ }
73
+ /**
74
+ * Direct file-based inbox write.
75
+ * Appends to $CCG_HOME/agents/{toAgentId}/inbox.jsonl
76
+ */
77
+ async sendToInbox(toAgentId, content, fromAgentId) {
78
+ const msg = {
79
+ from: fromAgentId || "system",
80
+ content,
81
+ ts: Date.now(),
82
+ read: false,
83
+ };
84
+ const inboxPath = this.getInboxPath(toAgentId);
85
+ const dir = join(this.ccgHome, "agents", toAgentId);
86
+ if (!existsSync(dir)) {
87
+ await mkdir(dir, { recursive: true });
88
+ }
89
+ await appendFile(inboxPath, JSON.stringify(msg) + "\n", "utf-8");
90
+ }
91
+ /**
92
+ * Read unread inbox messages for an agent.
93
+ */
94
+ async readInbox(agentId) {
95
+ const inboxPath = this.getInboxPath(agentId);
96
+ if (!existsSync(inboxPath)) {
97
+ return [];
98
+ }
99
+ const raw = await readFile(inboxPath, "utf-8");
100
+ const lines = raw.split("\n").filter((l) => l.trim().length > 0);
101
+ if (lines.length === 0) {
102
+ return [];
103
+ }
104
+ const messages = lines.map((line) => JSON.parse(line));
105
+ return messages.filter((m) => !m.read);
106
+ }
107
+ /**
108
+ * Mark all inbox messages as read.
109
+ */
110
+ async markInboxRead(agentId) {
111
+ const inboxPath = this.getInboxPath(agentId);
112
+ if (!existsSync(inboxPath)) {
113
+ return;
114
+ }
115
+ const raw = await readFile(inboxPath, "utf-8");
116
+ const lines = raw.split("\n").filter((l) => l.trim().length > 0);
117
+ if (lines.length === 0) {
118
+ return;
119
+ }
120
+ const messages = lines.map((line) => JSON.parse(line));
121
+ const updated = messages.map((m) => ({ ...m, read: true }));
122
+ const content = updated.map((m) => JSON.stringify(m)).join("\n") + "\n";
123
+ await writeFile(inboxPath, content, "utf-8");
124
+ }
125
+ /**
126
+ * Get inbox file path for an agent.
127
+ */
128
+ getInboxPath(agentId) {
129
+ return join(this.ccgHome, "agents", agentId, "inbox.jsonl");
130
+ }
131
+ }
132
+ //# sourceMappingURL=messaging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messaging.js","sourceRoot":"","sources":["../src/messaging.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export interface MigrateOptions {
2
+ configPath?: string;
3
+ dryRun?: boolean;
4
+ }
5
+ /**
6
+ * Strip provider prefix from a model name.
7
+ * e.g. "anthropic/claude-opus-4-6" -> "claude-opus-4-6"
8
+ */
9
+ export declare function stripModelPrefix(model: string): string;
10
+ /**
11
+ * Generate a Discord bot token env var name.
12
+ * e.g. "ginger" -> "DISCORD_GINGER_TOKEN"
13
+ */
14
+ export declare function botTokenEnvVar(accountName: string): string;
15
+ /**
16
+ * Migrate from OpenClaw configuration to ccgateway config.
17
+ */
18
+ export declare function migrateFromOpenClaw(options?: MigrateOptions): Promise<void>;
19
+ /**
20
+ * Interactive setup for new users (no OpenClaw).
21
+ * Creates the ~/.ccgateway/ structure with a minimal starter config.
22
+ */
23
+ export declare function initNew(): Promise<void>;
24
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAwED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAItD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmIrF;AAmMD;;;GAGG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAkD7C"}