codex-anywhere 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.
- package/CONTRIBUTING.md +98 -0
- package/LICENSE +73 -0
- package/README.md +163 -0
- package/dist/agentMessageStreams.d.ts +3 -0
- package/dist/agentMessageStreams.d.ts.map +1 -0
- package/dist/agentMessageStreams.js +10 -0
- package/dist/agentMessageStreams.js.map +1 -0
- package/dist/app.d.ts +17 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +18 -0
- package/dist/app.js.map +1 -0
- package/dist/approval.d.ts +12 -0
- package/dist/approval.d.ts.map +1 -0
- package/dist/approval.js +42 -0
- package/dist/approval.js.map +1 -0
- package/dist/bootstrap.d.ts +22 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +31 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/bridge.d.ts +22 -0
- package/dist/bridge.d.ts.map +1 -0
- package/dist/bridge.js +2861 -0
- package/dist/bridge.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +58 -0
- package/dist/cli.js.map +1 -0
- package/dist/codexAppServer.d.ts +13 -0
- package/dist/codexAppServer.d.ts.map +1 -0
- package/dist/codexAppServer.js +115 -0
- package/dist/codexAppServer.js.map +1 -0
- package/dist/configuration.d.ts +17 -0
- package/dist/configuration.d.ts.map +1 -0
- package/dist/configuration.js +27 -0
- package/dist/configuration.js.map +1 -0
- package/dist/harnessState.d.ts +15 -0
- package/dist/harnessState.d.ts.map +1 -0
- package/dist/harnessState.js +55 -0
- package/dist/harnessState.js.map +1 -0
- package/dist/harnessStateCli.d.ts +3 -0
- package/dist/harnessStateCli.d.ts.map +1 -0
- package/dist/harnessStateCli.js +13 -0
- package/dist/harnessStateCli.js.map +1 -0
- package/dist/interactive.d.ts +8 -0
- package/dist/interactive.d.ts.map +1 -0
- package/dist/interactive.js +24 -0
- package/dist/interactive.js.map +1 -0
- package/dist/localCommandInteractions.d.ts +22 -0
- package/dist/localCommandInteractions.d.ts.map +1 -0
- package/dist/localCommandInteractions.js +412 -0
- package/dist/localCommandInteractions.js.map +1 -0
- package/dist/omxCommands.d.ts +10 -0
- package/dist/omxCommands.d.ts.map +1 -0
- package/dist/omxCommands.js +146 -0
- package/dist/omxCommands.js.map +1 -0
- package/dist/onboarding.d.ts +3 -0
- package/dist/onboarding.d.ts.map +1 -0
- package/dist/onboarding.js +41 -0
- package/dist/onboarding.js.map +1 -0
- package/dist/paths.d.ts +3 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +22 -0
- package/dist/paths.js.map +1 -0
- package/dist/persistence.d.ts +6 -0
- package/dist/persistence.d.ts.map +1 -0
- package/dist/persistence.js +61 -0
- package/dist/persistence.js.map +1 -0
- package/dist/preflight.d.ts +3 -0
- package/dist/preflight.d.ts.map +1 -0
- package/dist/preflight.js +25 -0
- package/dist/preflight.js.map +1 -0
- package/dist/service.d.ts +58 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +322 -0
- package/dist/service.js.map +1 -0
- package/dist/sessions.d.ts +7 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +20 -0
- package/dist/sessions.js.map +1 -0
- package/dist/slashCommands.d.ts +13 -0
- package/dist/slashCommands.d.ts.map +1 -0
- package/dist/slashCommands.js +150 -0
- package/dist/slashCommands.js.map +1 -0
- package/dist/telegram.d.ts +21 -0
- package/dist/telegram.d.ts.map +1 -0
- package/dist/telegram.js +103 -0
- package/dist/telegram.js.map +1 -0
- package/dist/telegramFormatting.d.ts +18 -0
- package/dist/telegramFormatting.d.ts.map +1 -0
- package/dist/telegramFormatting.js +380 -0
- package/dist/telegramFormatting.js.map +1 -0
- package/dist/threadState.d.ts +3 -0
- package/dist/threadState.d.ts.map +1 -0
- package/dist/threadState.js +28 -0
- package/dist/threadState.js.map +1 -0
- package/dist/turnControls.d.ts +7 -0
- package/dist/turnControls.d.ts.map +1 -0
- package/dist/turnControls.js +20 -0
- package/dist/turnControls.js.map +1 -0
- package/dist/types.d.ts +121 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
const TELEGRAM_UNSUPPORTED_OMX_MESSAGES = new Map([
|
|
2
|
+
[
|
|
3
|
+
"resume",
|
|
4
|
+
"Use omx resume from a terminal. It re-attaches an interactive Codex session and is not a good Telegram flow.",
|
|
5
|
+
],
|
|
6
|
+
[
|
|
7
|
+
"ralph",
|
|
8
|
+
"Use $ralph in the Telegram thread, or run omx ralph from a terminal. /omx ralph is intentionally blocked here because it launches a long-lived interactive Codex session.",
|
|
9
|
+
],
|
|
10
|
+
[
|
|
11
|
+
"autoresearch",
|
|
12
|
+
"Use omx autoresearch from a terminal. It launches a longer-lived supervisor flow that is not yet managed directly by Telegram.",
|
|
13
|
+
],
|
|
14
|
+
[
|
|
15
|
+
"setup",
|
|
16
|
+
"Run omx setup from a terminal. It modifies your OMX installation and project wiring, so it is intentionally not exposed through Telegram.",
|
|
17
|
+
],
|
|
18
|
+
[
|
|
19
|
+
"uninstall",
|
|
20
|
+
"Run omx uninstall from a terminal. It is intentionally not exposed through Telegram because it is destructive.",
|
|
21
|
+
],
|
|
22
|
+
[
|
|
23
|
+
"agents-init",
|
|
24
|
+
"Run omx agents-init from a terminal. It writes AGENTS.md files and is intentionally kept out of Telegram.",
|
|
25
|
+
],
|
|
26
|
+
[
|
|
27
|
+
"deepinit",
|
|
28
|
+
"Run omx deepinit from a terminal. It writes AGENTS.md files and is intentionally kept out of Telegram.",
|
|
29
|
+
],
|
|
30
|
+
]);
|
|
31
|
+
const TELEGRAM_SKILL_FIRST_ROOTS = new Set([
|
|
32
|
+
"deep-interview",
|
|
33
|
+
"ralplan",
|
|
34
|
+
"autopilot",
|
|
35
|
+
"ralph",
|
|
36
|
+
"cancel",
|
|
37
|
+
]);
|
|
38
|
+
export function buildOmxHelpText() {
|
|
39
|
+
return [
|
|
40
|
+
"OMX in Telegram:",
|
|
41
|
+
"Most OMX commands are ordinary local CLI commands and do not require tmux.",
|
|
42
|
+
"",
|
|
43
|
+
"Good Telegram OMX commands:",
|
|
44
|
+
"/omx status",
|
|
45
|
+
"/omx doctor",
|
|
46
|
+
"/omx version",
|
|
47
|
+
"/omx explore ...",
|
|
48
|
+
"/omx sparkshell ...",
|
|
49
|
+
"/omx ask ...",
|
|
50
|
+
"/omx hooks status",
|
|
51
|
+
"/omx tmux-hook status",
|
|
52
|
+
"/omx session ...",
|
|
53
|
+
"/omx reasoning [low|medium|high|xhigh]",
|
|
54
|
+
"",
|
|
55
|
+
"TMUX-backed OMX runtime commands:",
|
|
56
|
+
"/omx team 3:executor \"task\"",
|
|
57
|
+
"/omx team status <team>",
|
|
58
|
+
"/omx team await <team> --json",
|
|
59
|
+
"/omx team shutdown <team>",
|
|
60
|
+
"/omx team api <operation> --input '{...}' --json",
|
|
61
|
+
"/omx sparkshell --tmux-pane <pane-id> --tail-lines 400",
|
|
62
|
+
"",
|
|
63
|
+
"Skill-style OMX commands like /omx deep-interview and /omx ralplan are routed into the current thread as $skills.",
|
|
64
|
+
"Use $team for the team workflow entrypoint; Codex Anywhere treats that as the real OMX tmux runtime path.",
|
|
65
|
+
"Use terminal OMX for setup, uninstall, resume, and other interactive/admin flows.",
|
|
66
|
+
].join("\n");
|
|
67
|
+
}
|
|
68
|
+
export function tokenizeOmxArgs(input) {
|
|
69
|
+
const tokens = [];
|
|
70
|
+
let current = "";
|
|
71
|
+
let quote = null;
|
|
72
|
+
let escaping = false;
|
|
73
|
+
for (const char of input.trim()) {
|
|
74
|
+
if (escaping) {
|
|
75
|
+
current += char;
|
|
76
|
+
escaping = false;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (char === "\\") {
|
|
80
|
+
escaping = true;
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (quote) {
|
|
84
|
+
if (char === quote) {
|
|
85
|
+
quote = null;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
current += char;
|
|
89
|
+
}
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (char === "'" || char === "\"") {
|
|
93
|
+
quote = char;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (/\s/.test(char)) {
|
|
97
|
+
if (current) {
|
|
98
|
+
tokens.push(current);
|
|
99
|
+
current = "";
|
|
100
|
+
}
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
current += char;
|
|
104
|
+
}
|
|
105
|
+
if (escaping || quote) {
|
|
106
|
+
throw new Error("Unclosed quote or trailing escape in /omx arguments.");
|
|
107
|
+
}
|
|
108
|
+
if (current) {
|
|
109
|
+
tokens.push(current);
|
|
110
|
+
}
|
|
111
|
+
return tokens;
|
|
112
|
+
}
|
|
113
|
+
export function planOmxCommand(args) {
|
|
114
|
+
const argv = tokenizeOmxArgs(args);
|
|
115
|
+
if (argv.length === 0) {
|
|
116
|
+
return { kind: "help", argv };
|
|
117
|
+
}
|
|
118
|
+
const root = argv[0].toLowerCase();
|
|
119
|
+
if (TELEGRAM_SKILL_FIRST_ROOTS.has(root)) {
|
|
120
|
+
return {
|
|
121
|
+
kind: "skill",
|
|
122
|
+
argv,
|
|
123
|
+
skillText: `$${argv.join(" ")}`,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
if (root === "team" && argv[1]?.toLowerCase() === "resume") {
|
|
127
|
+
return {
|
|
128
|
+
kind: "unsupported",
|
|
129
|
+
argv,
|
|
130
|
+
message: "Use omx team resume from a terminal. It re-attaches tmux runtime state and is intentionally not driven from Telegram.",
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
if (root === "hud" && argv.some((entry) => entry === "--watch")) {
|
|
134
|
+
return {
|
|
135
|
+
kind: "unsupported",
|
|
136
|
+
argv,
|
|
137
|
+
message: "Use omx hud --watch from a terminal. The watch mode is interactive and not suitable for Telegram delivery.",
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
const directMessage = TELEGRAM_UNSUPPORTED_OMX_MESSAGES.get(root);
|
|
141
|
+
if (directMessage) {
|
|
142
|
+
return { kind: "unsupported", argv, message: directMessage };
|
|
143
|
+
}
|
|
144
|
+
return { kind: "execute", argv };
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=omxCommands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"omxCommands.js","sourceRoot":"","sources":["../src/omxCommands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../src/onboarding.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,wBAAsB,cAAc,CAAC,mBAAmB,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CA8BvF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import readline from "node:readline/promises";
|
|
4
|
+
export async function runSetupWizard(defaultWorkspaceCwd) {
|
|
5
|
+
const rl = readline.createInterface({
|
|
6
|
+
input: process.stdin,
|
|
7
|
+
output: process.stdout,
|
|
8
|
+
});
|
|
9
|
+
try {
|
|
10
|
+
console.log("Welcome to Codex Anywhere.");
|
|
11
|
+
console.log("This one-time setup asks only for your Telegram bot token and workspace path.\n");
|
|
12
|
+
const telegramBotToken = await promptForRequired(rl, "Telegram bot token (from BotFather): ");
|
|
13
|
+
const workspacePrompt = `Workspace path for Codex tasks [${defaultWorkspaceCwd}]: `;
|
|
14
|
+
const workspaceInput = (await rl.question(workspacePrompt)).trim();
|
|
15
|
+
const workspaceCwd = path.resolve(workspaceInput || defaultWorkspaceCwd);
|
|
16
|
+
if (!fs.existsSync(workspaceCwd)) {
|
|
17
|
+
throw new Error(`Workspace path does not exist: ${workspaceCwd}`);
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
version: 1,
|
|
21
|
+
telegramBotToken,
|
|
22
|
+
workspaceCwd,
|
|
23
|
+
ownerUserId: null,
|
|
24
|
+
pollTimeoutSeconds: 20,
|
|
25
|
+
streamEditIntervalMs: 1500,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
rl.close();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async function promptForRequired(rl, question) {
|
|
33
|
+
while (true) {
|
|
34
|
+
const answer = (await rl.question(question)).trim();
|
|
35
|
+
if (answer.length > 0) {
|
|
36
|
+
return answer;
|
|
37
|
+
}
|
|
38
|
+
console.log("This field is required.");
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=onboarding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../src/onboarding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAI9C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,mBAA2B;IAC9D,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,iFAAiF,CAAC,CAAC;QAE/F,MAAM,gBAAgB,GAAG,MAAM,iBAAiB,CAAC,EAAE,EAAE,uCAAuC,CAAC,CAAC;QAC9F,MAAM,eAAe,GAAG,mCAAmC,mBAAmB,KAAK,CAAC;QACpF,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACnE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,mBAAmB,CAAC,CAAC;QAEzE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,kCAAkC,YAAY,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,OAAO;YACL,OAAO,EAAE,CAAC;YACV,gBAAgB;YAChB,YAAY;YACZ,WAAW,EAAE,IAAI;YACjB,kBAAkB,EAAE,EAAE;YACtB,oBAAoB,EAAE,IAAI;SAC3B,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,EAAsB,EACtB,QAAgB;IAEhB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACpD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACzC,CAAC;AACH,CAAC"}
|
package/dist/paths.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,wBAAgB,eAAe,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,YAAY,CAMlF"}
|
package/dist/paths.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export function getStoragePaths(env = process.env) {
|
|
4
|
+
const root = resolveStorageRoot(env);
|
|
5
|
+
return {
|
|
6
|
+
configPath: path.join(root, "config.json"),
|
|
7
|
+
statePath: path.join(root, "state.json"),
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function resolveStorageRoot(env) {
|
|
11
|
+
return env.CODEX_ANYWHERE_HOME ?? defaultStorageRoot(env);
|
|
12
|
+
}
|
|
13
|
+
function defaultStorageRoot(env) {
|
|
14
|
+
const homeDir = os.homedir();
|
|
15
|
+
if (process.platform === "win32") {
|
|
16
|
+
const appDataRoot = env.APPDATA ?? path.join(homeDir, "AppData", "Roaming");
|
|
17
|
+
return path.join(appDataRoot, "codex-anywhere");
|
|
18
|
+
}
|
|
19
|
+
const xdgConfigHome = env.XDG_CONFIG_HOME ?? path.join(homeDir, ".config");
|
|
20
|
+
return path.join(xdgConfigHome, "codex-anywhere");
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,MAAM,UAAU,eAAe,CAAC,MAAyB,OAAO,CAAC,GAAG;IAClE,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC;QAC1C,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC;KACzC,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAsB;IAChD,OAAO,GAAG,CAAC,mBAAmB,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAsB;IAChD,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,aAAa,GAAG,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC3E,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { StoredConfig, StoredState } from "./types.js";
|
|
2
|
+
export declare function loadConfig(configPath: string): Promise<StoredConfig | null>;
|
|
3
|
+
export declare function saveConfig(configPath: string, config: StoredConfig): Promise<void>;
|
|
4
|
+
export declare function loadState(statePath: string): Promise<StoredState>;
|
|
5
|
+
export declare function saveState(statePath: string, state: StoredState): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=persistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../src/persistence.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAQ5D,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAEjF;AAED,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAExF;AAED,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAqBvE;AAED,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpF"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
const DEFAULT_STATE = {
|
|
4
|
+
version: 1,
|
|
5
|
+
lastUpdateId: null,
|
|
6
|
+
chats: {},
|
|
7
|
+
};
|
|
8
|
+
export async function loadConfig(configPath) {
|
|
9
|
+
return readJsonFile(configPath);
|
|
10
|
+
}
|
|
11
|
+
export async function saveConfig(configPath, config) {
|
|
12
|
+
await writeJsonFile(configPath, config);
|
|
13
|
+
}
|
|
14
|
+
export async function loadState(statePath) {
|
|
15
|
+
const state = (await readJsonFile(statePath)) ?? structuredClone(DEFAULT_STATE);
|
|
16
|
+
for (const chat of Object.values(state.chats)) {
|
|
17
|
+
chat.freshThread ??= false;
|
|
18
|
+
chat.turnControlTurnId ??= null;
|
|
19
|
+
chat.turnControlMessageId ??= null;
|
|
20
|
+
chat.verbose ??= false;
|
|
21
|
+
chat.queueNextArmed ??= false;
|
|
22
|
+
chat.queuedTurnInput ??= null;
|
|
23
|
+
chat.pendingTurnInput ??= null;
|
|
24
|
+
chat.pendingMention ??= null;
|
|
25
|
+
chat.model ??= null;
|
|
26
|
+
chat.reasoningEffort ??= null;
|
|
27
|
+
chat.personality ??= null;
|
|
28
|
+
chat.collaborationModeName ??= null;
|
|
29
|
+
chat.collaborationMode ??= null;
|
|
30
|
+
chat.serviceTier ??= null;
|
|
31
|
+
chat.approvalPolicy ??= null;
|
|
32
|
+
chat.lastAssistantMessage ??= null;
|
|
33
|
+
}
|
|
34
|
+
return state;
|
|
35
|
+
}
|
|
36
|
+
export async function saveState(statePath, state) {
|
|
37
|
+
await writeJsonFile(statePath, state);
|
|
38
|
+
}
|
|
39
|
+
async function readJsonFile(filePath) {
|
|
40
|
+
try {
|
|
41
|
+
const contents = await fs.readFile(filePath, "utf8");
|
|
42
|
+
return JSON.parse(contents);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
if (isFileMissing(error)) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async function writeJsonFile(filePath, value) {
|
|
52
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
53
|
+
await fs.writeFile(filePath, `${JSON.stringify(value, null, 2)}\n`, "utf8");
|
|
54
|
+
if (process.platform !== "win32") {
|
|
55
|
+
await fs.chmod(filePath, 0o600);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function isFileMissing(error) {
|
|
59
|
+
return error instanceof Error && "code" in error && error.code === "ENOENT";
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=persistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../src/persistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5E"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { TelegramBotApi } from "./telegram.js";
|
|
3
|
+
export async function runPreflightChecks(config) {
|
|
4
|
+
assertCodexAvailable();
|
|
5
|
+
await assertTelegramTokenWorks(config.telegramBotToken);
|
|
6
|
+
}
|
|
7
|
+
function assertCodexAvailable() {
|
|
8
|
+
const result = spawnSync("codex", ["--help"], {
|
|
9
|
+
stdio: "ignore",
|
|
10
|
+
});
|
|
11
|
+
if (result.error) {
|
|
12
|
+
throw new Error("`codex` was not found on PATH. Install/authenticate Codex first, then run `pnpm run connect` again.");
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
async function assertTelegramTokenWorks(token) {
|
|
16
|
+
const api = new TelegramBotApi(token);
|
|
17
|
+
try {
|
|
18
|
+
await api.getMe();
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
22
|
+
throw new Error(`Telegram bot token check failed: ${message}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=preflight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAoB;IAC3D,oBAAoB,EAAE,CAAC;IACvB,MAAM,wBAAwB,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,oBAAoB;IAC3B,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE;QAC5C,KAAK,EAAE,QAAQ;KAChB,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,qGAAqG,CACtG,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,KAAa;IACnD,MAAM,GAAG,GAAG,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,oCAAoC,OAAO,EAAE,CAAC,CAAC;IACjE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { StoredConfig, StoragePaths } from "./types.js";
|
|
2
|
+
export type BackgroundServiceCommand = "install-service" | "start-service" | "stop-service" | "service-status" | "uninstall-service";
|
|
3
|
+
export interface LaunchAgentSpec {
|
|
4
|
+
label: string;
|
|
5
|
+
domainTarget: string;
|
|
6
|
+
serviceTarget: string;
|
|
7
|
+
plistPath: string;
|
|
8
|
+
stdoutPath: string;
|
|
9
|
+
stderrPath: string;
|
|
10
|
+
workingDirectory: string;
|
|
11
|
+
storageRoot: string;
|
|
12
|
+
programArguments: string[];
|
|
13
|
+
environmentVariables: Record<string, string>;
|
|
14
|
+
}
|
|
15
|
+
interface ExecFileResult {
|
|
16
|
+
stdout: string;
|
|
17
|
+
stderr: string;
|
|
18
|
+
}
|
|
19
|
+
interface ServiceExecOptions {
|
|
20
|
+
cwd?: string;
|
|
21
|
+
env?: NodeJS.ProcessEnv;
|
|
22
|
+
}
|
|
23
|
+
type ServiceExecFile = (file: string, args: string[], options?: ServiceExecOptions) => Promise<ExecFileResult>;
|
|
24
|
+
export interface RunBackgroundServiceCommandOptions {
|
|
25
|
+
cwd?: string;
|
|
26
|
+
env?: NodeJS.ProcessEnv;
|
|
27
|
+
platform?: NodeJS.Platform;
|
|
28
|
+
packageRoot?: string;
|
|
29
|
+
storagePaths?: StoragePaths;
|
|
30
|
+
loadConfig?: (configPath: string) => Promise<StoredConfig | null>;
|
|
31
|
+
saveConfig?: (configPath: string, config: StoredConfig) => Promise<void>;
|
|
32
|
+
runSetupWizard?: (defaultWorkspaceCwd: string) => Promise<StoredConfig>;
|
|
33
|
+
runPreflightChecks?: (config: StoredConfig) => Promise<void>;
|
|
34
|
+
execFile?: ServiceExecFile;
|
|
35
|
+
log?: (message: string) => void;
|
|
36
|
+
homeDir?: string;
|
|
37
|
+
uid?: number;
|
|
38
|
+
nodePath?: string;
|
|
39
|
+
tsxCliPath?: string;
|
|
40
|
+
}
|
|
41
|
+
export declare function buildMacosLaunchAgentSpec(options: {
|
|
42
|
+
repoCwd: string;
|
|
43
|
+
storageRoot: string;
|
|
44
|
+
homeDir: string;
|
|
45
|
+
uid: number;
|
|
46
|
+
pathEnv: string;
|
|
47
|
+
programArguments: string[];
|
|
48
|
+
extraEnv?: Record<string, string | undefined>;
|
|
49
|
+
}): LaunchAgentSpec;
|
|
50
|
+
export declare function renderLaunchAgentPlist(spec: LaunchAgentSpec): string;
|
|
51
|
+
export declare function runBackgroundServiceCommand(command: BackgroundServiceCommand, options?: RunBackgroundServiceCommandOptions): Promise<void>;
|
|
52
|
+
export declare function resolveServiceProgramArguments(options: {
|
|
53
|
+
packageRoot: string;
|
|
54
|
+
nodePath: string;
|
|
55
|
+
tsxCliPath?: string;
|
|
56
|
+
}): Promise<string[]>;
|
|
57
|
+
export {};
|
|
58
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|