@lawrencehui/citio 0.2.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/.dockerignore +8 -0
- package/Dockerfile +47 -0
- package/LICENSE +21 -0
- package/README.md +305 -0
- package/citio.example.yaml +43 -0
- package/dist/adapters/slack.d.ts +22 -0
- package/dist/adapters/slack.d.ts.map +1 -0
- package/dist/adapters/slack.js +624 -0
- package/dist/adapters/slack.js.map +1 -0
- package/dist/cli/init.d.ts +3 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +1464 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/ops.d.ts +13 -0
- package/dist/cli/ops.d.ts.map +1 -0
- package/dist/cli/ops.js +167 -0
- package/dist/cli/ops.js.map +1 -0
- package/dist/config/schema.d.ts +81 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +65 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/core/agent-runner.d.ts +38 -0
- package/dist/core/agent-runner.d.ts.map +1 -0
- package/dist/core/agent-runner.js +531 -0
- package/dist/core/agent-runner.js.map +1 -0
- package/dist/core/mcp-entry.d.ts +7 -0
- package/dist/core/mcp-entry.d.ts.map +1 -0
- package/dist/core/mcp-entry.js +390 -0
- package/dist/core/mcp-entry.js.map +1 -0
- package/dist/core/provider-config.d.ts +2 -0
- package/dist/core/provider-config.d.ts.map +1 -0
- package/dist/core/provider-config.js +53 -0
- package/dist/core/provider-config.js.map +1 -0
- package/dist/core/session-manager.d.ts +15 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +78 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/skills.d.ts +24 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +111 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/workspace.d.ts +13 -0
- package/dist/core/workspace.d.ts.map +1 -0
- package/dist/core/workspace.js +238 -0
- package/dist/core/workspace.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +152 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/app-state.d.ts +5 -0
- package/dist/utils/app-state.d.ts.map +1 -0
- package/dist/utils/app-state.js +35 -0
- package/dist/utils/app-state.js.map +1 -0
- package/dist/utils/claude.d.ts +4 -0
- package/dist/utils/claude.d.ts.map +1 -0
- package/dist/utils/claude.js +65 -0
- package/dist/utils/claude.js.map +1 -0
- package/dist/utils/codex.d.ts +5 -0
- package/dist/utils/codex.d.ts.map +1 -0
- package/dist/utils/codex.js +17 -0
- package/dist/utils/codex.js.map +1 -0
- package/dist/utils/env.d.ts +2 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +16 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/installer-state.d.ts +33 -0
- package/dist/utils/installer-state.d.ts.map +1 -0
- package/dist/utils/installer-state.js +152 -0
- package/dist/utils/installer-state.js.map +1 -0
- package/dist/utils/runtime-env.d.ts +3 -0
- package/dist/utils/runtime-env.d.ts.map +1 -0
- package/dist/utils/runtime-env.js +24 -0
- package/dist/utils/runtime-env.js.map +1 -0
- package/dist/utils/secret-store.d.ts +18 -0
- package/dist/utils/secret-store.d.ts.map +1 -0
- package/dist/utils/secret-store.js +78 -0
- package/dist/utils/secret-store.js.map +1 -0
- package/dist/utils/slack-onboarding.d.ts +22 -0
- package/dist/utils/slack-onboarding.d.ts.map +1 -0
- package/dist/utils/slack-onboarding.js +205 -0
- package/dist/utils/slack-onboarding.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import https from "node:https";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import { execFileSync } from "node:child_process";
|
|
4
|
+
export function buildCitioSlackManifest(options = {}) {
|
|
5
|
+
const appName = options.appName || "Citio";
|
|
6
|
+
return {
|
|
7
|
+
display_information: {
|
|
8
|
+
name: appName,
|
|
9
|
+
description: "Slack-native autonomous CTO agent",
|
|
10
|
+
long_description: "Citio is a self-hosted autonomous CTO agent for Slack. It helps engineering teams investigate bugs, check CloudWatch logs, make safe repository changes, create pull requests, and report progress back into Slack while keeping the control plane and credentials inside your own infrastructure.",
|
|
11
|
+
background_color: "#1d1c1d",
|
|
12
|
+
},
|
|
13
|
+
features: {
|
|
14
|
+
app_home: {
|
|
15
|
+
home_tab_enabled: false,
|
|
16
|
+
messages_tab_enabled: true,
|
|
17
|
+
messages_tab_read_only_enabled: false,
|
|
18
|
+
},
|
|
19
|
+
assistant_view: {
|
|
20
|
+
assistant_description: "Investigates bugs, checks logs, makes code changes, and opens PRs from Slack.",
|
|
21
|
+
suggested_prompts: [
|
|
22
|
+
{
|
|
23
|
+
title: "Investigate a bug",
|
|
24
|
+
message: "There is a bug in the login flow. Can you investigate it and suggest a fix?",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
title: "Check deploy health",
|
|
28
|
+
message: "Can you check the latest deployment and review the logs for errors?",
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
title: "Open a PR",
|
|
32
|
+
message: "Can you make the smallest safe fix for this issue and open a PR?",
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
bot_user: {
|
|
37
|
+
display_name: "citio",
|
|
38
|
+
always_online: false,
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
oauth_config: {
|
|
42
|
+
scopes: {
|
|
43
|
+
bot: [
|
|
44
|
+
"app_mentions:read",
|
|
45
|
+
"assistant:write",
|
|
46
|
+
"channels:history",
|
|
47
|
+
"chat:write",
|
|
48
|
+
"groups:history",
|
|
49
|
+
"im:history",
|
|
50
|
+
"mpim:history",
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
settings: {
|
|
55
|
+
event_subscriptions: {
|
|
56
|
+
bot_events: [
|
|
57
|
+
"app_mention",
|
|
58
|
+
"message.im",
|
|
59
|
+
// Required by the Assistant view (adapters/slack.ts uses Bolt's Assistant):
|
|
60
|
+
// without these, Socket Mode never delivers assistant-thread events and
|
|
61
|
+
// the assistant pane silently does nothing.
|
|
62
|
+
"assistant_thread_started",
|
|
63
|
+
"assistant_thread_context_changed",
|
|
64
|
+
// Ambient mode: plain messages in the bot's home channel
|
|
65
|
+
"message.channels",
|
|
66
|
+
"message.groups",
|
|
67
|
+
],
|
|
68
|
+
},
|
|
69
|
+
interactivity: {
|
|
70
|
+
is_enabled: true,
|
|
71
|
+
},
|
|
72
|
+
org_deploy_enabled: false,
|
|
73
|
+
socket_mode_enabled: true,
|
|
74
|
+
token_rotation_enabled: false,
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function callSlackApi(method, token, payload) {
|
|
79
|
+
const body = new URLSearchParams({
|
|
80
|
+
token,
|
|
81
|
+
...payload,
|
|
82
|
+
}).toString();
|
|
83
|
+
return new Promise((resolve, reject) => {
|
|
84
|
+
const req = https.request({
|
|
85
|
+
method: "POST",
|
|
86
|
+
hostname: "slack.com",
|
|
87
|
+
path: `/api/${method}`,
|
|
88
|
+
headers: {
|
|
89
|
+
"content-type": "application/x-www-form-urlencoded",
|
|
90
|
+
"content-length": Buffer.byteLength(body),
|
|
91
|
+
},
|
|
92
|
+
}, (res) => {
|
|
93
|
+
let data = "";
|
|
94
|
+
res.setEncoding("utf8");
|
|
95
|
+
res.on("data", (chunk) => {
|
|
96
|
+
data += chunk;
|
|
97
|
+
});
|
|
98
|
+
res.on("end", () => {
|
|
99
|
+
try {
|
|
100
|
+
resolve(JSON.parse(data));
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
reject(new Error(`Slack ${method} returned invalid JSON: ${String(error)}`));
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
req.on("error", (error) => {
|
|
108
|
+
reject(error);
|
|
109
|
+
});
|
|
110
|
+
req.write(body);
|
|
111
|
+
req.end();
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
function formatSlackErrors(response) {
|
|
115
|
+
if (!response.errors || response.errors.length === 0) {
|
|
116
|
+
return response.error || "unknown_error";
|
|
117
|
+
}
|
|
118
|
+
return response.errors
|
|
119
|
+
.map((entry) => {
|
|
120
|
+
const pointer = entry.pointer ? ` (${entry.pointer})` : "";
|
|
121
|
+
return `${entry.message || "invalid manifest"}${pointer}`;
|
|
122
|
+
})
|
|
123
|
+
.join("; ");
|
|
124
|
+
}
|
|
125
|
+
export async function createCitioSlackApp(configToken, options = {}) {
|
|
126
|
+
const manifest = buildCitioSlackManifest(options);
|
|
127
|
+
const manifestJson = JSON.stringify(manifest);
|
|
128
|
+
const validation = await callSlackApi("apps.manifest.validate", configToken, {
|
|
129
|
+
manifest: manifestJson,
|
|
130
|
+
});
|
|
131
|
+
if (!validation.ok) {
|
|
132
|
+
throw new Error(`Slack manifest validation failed: ${formatSlackErrors(validation)}`);
|
|
133
|
+
}
|
|
134
|
+
const created = await callSlackApi("apps.manifest.create", configToken, {
|
|
135
|
+
manifest: manifestJson,
|
|
136
|
+
});
|
|
137
|
+
if (!created.ok || !created.app_id || !created.oauth_authorize_url) {
|
|
138
|
+
throw new Error(`Slack app creation failed: ${formatSlackErrors(created)}`);
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
appId: created.app_id,
|
|
142
|
+
oauthAuthorizeUrl: created.oauth_authorize_url,
|
|
143
|
+
settingsUrl: `https://api.slack.com/apps/${created.app_id}`,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
export function openBrowser(url) {
|
|
147
|
+
try {
|
|
148
|
+
switch (os.platform()) {
|
|
149
|
+
case "darwin":
|
|
150
|
+
execFileSync("open", [url], { stdio: "ignore" });
|
|
151
|
+
return true;
|
|
152
|
+
case "win32":
|
|
153
|
+
execFileSync("cmd", ["/c", "start", "", url], { stdio: "ignore" });
|
|
154
|
+
return true;
|
|
155
|
+
default:
|
|
156
|
+
execFileSync("xdg-open", [url], { stdio: "ignore" });
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
export function validateSlackBotToken(token) {
|
|
165
|
+
if (!token) {
|
|
166
|
+
return "Slack bot token is required.";
|
|
167
|
+
}
|
|
168
|
+
if (!token.startsWith("xoxb-")) {
|
|
169
|
+
return "Slack bot token must start with xoxb-.";
|
|
170
|
+
}
|
|
171
|
+
return undefined;
|
|
172
|
+
}
|
|
173
|
+
export function validateSlackAppToken(token) {
|
|
174
|
+
if (!token) {
|
|
175
|
+
return "Slack app token is required.";
|
|
176
|
+
}
|
|
177
|
+
if (!token.startsWith("xapp-")) {
|
|
178
|
+
return "Slack app token must start with xapp-.";
|
|
179
|
+
}
|
|
180
|
+
return undefined;
|
|
181
|
+
}
|
|
182
|
+
export function validateSlackConfigToken(token) {
|
|
183
|
+
if (!token) {
|
|
184
|
+
return "Slack config token is required.";
|
|
185
|
+
}
|
|
186
|
+
if (!token.startsWith("xoxe")) {
|
|
187
|
+
return "Slack config token should start with xoxe.";
|
|
188
|
+
}
|
|
189
|
+
return undefined;
|
|
190
|
+
}
|
|
191
|
+
/** Live-check a saved bot token via auth.test. Returns workspace/bot identity when valid. */
|
|
192
|
+
export async function testSlackBotToken(token) {
|
|
193
|
+
try {
|
|
194
|
+
const res = await callSlackApi("auth.test", token, {});
|
|
195
|
+
if (res.ok) {
|
|
196
|
+
const r = res;
|
|
197
|
+
return { ok: true, team: r.team, botUser: r.user };
|
|
198
|
+
}
|
|
199
|
+
return { ok: false };
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
return { ok: false };
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=slack-onboarding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-onboarding.js","sourceRoot":"","sources":["../../src/utils/slack-onboarding.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lawrencehui/citio",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Self-hosted AI coding agents that live in Slack \u2014 run Claude Code or Codex in your own infra, ship PRs, and keep every credential behind a controlled MCP tool layer.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"slack",
|
|
7
|
+
"ai-agent",
|
|
8
|
+
"claude-code",
|
|
9
|
+
"codex",
|
|
10
|
+
"mcp",
|
|
11
|
+
"devops",
|
|
12
|
+
"self-hosted",
|
|
13
|
+
"aws-ecs",
|
|
14
|
+
"coding-agent"
|
|
15
|
+
],
|
|
16
|
+
"homepage": "https://github.com/lawrencehui/Citio#readme",
|
|
17
|
+
"bugs": {
|
|
18
|
+
"url": "https://github.com/lawrencehui/Citio/issues"
|
|
19
|
+
},
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "git+https://github.com/lawrencehui/Citio.git"
|
|
23
|
+
},
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"author": "Lawrence Hui <hkc.lawrence@gmail.com>",
|
|
26
|
+
"type": "module",
|
|
27
|
+
"main": "dist/index.js",
|
|
28
|
+
"bin": {
|
|
29
|
+
"citio": "./dist/cli/init.js"
|
|
30
|
+
},
|
|
31
|
+
"files": [
|
|
32
|
+
"dist",
|
|
33
|
+
"Dockerfile",
|
|
34
|
+
".dockerignore",
|
|
35
|
+
"citio.example.yaml"
|
|
36
|
+
],
|
|
37
|
+
"publishConfig": {
|
|
38
|
+
"access": "public"
|
|
39
|
+
},
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=22"
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"dev": "tsx src/index.ts",
|
|
45
|
+
"build": "tsc && chmod +x dist/cli/init.js",
|
|
46
|
+
"init": "tsx src/cli/init.ts",
|
|
47
|
+
"start": "node dist/index.js",
|
|
48
|
+
"typecheck": "tsc --noEmit",
|
|
49
|
+
"test": "tsx --test test/**/*.test.ts",
|
|
50
|
+
"prepublishOnly": "npm run build",
|
|
51
|
+
"status": "tsx src/cli/init.ts status",
|
|
52
|
+
"destroy": "tsx src/cli/init.ts destroy",
|
|
53
|
+
"manifest": "tsx src/cli/init.ts manifest"
|
|
54
|
+
},
|
|
55
|
+
"dependencies": {
|
|
56
|
+
"@aws-sdk/client-ec2": "^3.1019.0",
|
|
57
|
+
"@aws-sdk/client-ecr": "^3.1019.0",
|
|
58
|
+
"@aws-sdk/client-ecs": "^3.1019.0",
|
|
59
|
+
"@aws-sdk/client-efs": "^3.1019.0",
|
|
60
|
+
"@aws-sdk/client-iam": "^3.1019.0",
|
|
61
|
+
"@aws-sdk/client-sts": "^3.1019.0",
|
|
62
|
+
"@clack/prompts": "^1.1.0",
|
|
63
|
+
"@modelcontextprotocol/sdk": "^1.28.0",
|
|
64
|
+
"@slack/bolt": "^4.6.0",
|
|
65
|
+
"dotenv": "^17.3.1",
|
|
66
|
+
"keytar": "^7.9.0",
|
|
67
|
+
"picocolors": "^1.1.1",
|
|
68
|
+
"yaml": "^2.8.3",
|
|
69
|
+
"zod": "^4.3.6"
|
|
70
|
+
},
|
|
71
|
+
"devDependencies": {
|
|
72
|
+
"@types/node": "^25.5.0",
|
|
73
|
+
"tsx": "^4.21.0",
|
|
74
|
+
"typescript": "^6.0.2"
|
|
75
|
+
}
|
|
76
|
+
}
|