cimux-mcp 0.1.1 → 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/dist/bin.d.ts +2 -0
- package/dist/bin.js +4 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli/cimux-cli.js +31 -2
- package/dist/cli/cimux-cli.js.map +1 -1
- package/dist/index.d.ts +1 -3
- package/dist/index.js +1 -22
- package/dist/index.js.map +1 -1
- package/dist/install/cimux-install-plan.d.ts +1 -1
- package/dist/install/cimux-install-plan.js +72 -5
- package/dist/install/cimux-install-plan.js.map +1 -1
- package/dist/mcp/cimux-mcp-server.js +12 -1
- package/dist/mcp/cimux-mcp-server.js.map +1 -1
- package/dist/service/cimux-mailbox-service.d.ts +17 -1
- package/dist/service/cimux-mailbox-service.js +24 -0
- package/dist/service/cimux-mailbox-service.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
- package/scripts/mail-viewer.mjs +324 -0
package/dist/bin.d.ts
ADDED
package/dist/bin.js
ADDED
package/dist/bin.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,CAAC,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
package/dist/cli/cimux-cli.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import path from "node:path";
|
|
1
2
|
import { applyInstallPlan, createInstallPlan } from "../install/cimux-install-plan.js";
|
|
2
3
|
import { defaultDatabasePath, runCimuxMcpServer } from "../mcp/cimux-mcp-server.js";
|
|
3
4
|
import { resolveRuntimeMailbox } from "../runtime/mailbox-runtime.js";
|
|
4
|
-
import { ackContext, checkInbox, createInboxNotification, readContext, registerSession, sendContext } from "../service/cimux-mailbox-service.js";
|
|
5
|
+
import { ackContext, checkInbox, createInboxNotification, createSessionBrief, listMailboxes, readContext, registerSession, sendContext } from "../service/cimux-mailbox-service.js";
|
|
5
6
|
import { SQLiteCimuxStore } from "../storage/sqlite-cimux-store.js";
|
|
6
7
|
import { name, version } from "../version.js";
|
|
7
8
|
export async function runCimuxCli(argv, env = process.env, cwd = process.cwd(), io = console) {
|
|
@@ -22,6 +23,15 @@ export async function runCimuxCli(argv, env = process.env, cwd = process.cwd(),
|
|
|
22
23
|
if (command === "notify") {
|
|
23
24
|
return await runNotifyCommand(argv, env, cwd, io);
|
|
24
25
|
}
|
|
26
|
+
if (command === "brief") {
|
|
27
|
+
return await runBriefCommand(argv, env, cwd, io);
|
|
28
|
+
}
|
|
29
|
+
if (command === "mailboxes") {
|
|
30
|
+
return await withStore(env, async (store) => {
|
|
31
|
+
writeJson(io, await listMailboxes(store));
|
|
32
|
+
return 0;
|
|
33
|
+
});
|
|
34
|
+
}
|
|
25
35
|
if (command === "install") {
|
|
26
36
|
return runInstallCommand(argv, io);
|
|
27
37
|
}
|
|
@@ -110,8 +120,19 @@ async function runNotifyCommand(argv, env, cwd, io) {
|
|
|
110
120
|
return 0;
|
|
111
121
|
});
|
|
112
122
|
}
|
|
123
|
+
async function runBriefCommand(argv, env, cwd, io) {
|
|
124
|
+
return withStore(env, async (store) => {
|
|
125
|
+
const { mailbox } = resolveRuntimeMailboxFromArgs(argv, env, cwd);
|
|
126
|
+
// Runs from a SessionStart hook: register the session's mailbox, then
|
|
127
|
+
// print the norms so agents use Cimux without being prompted.
|
|
128
|
+
await store.createMailbox(mailbox);
|
|
129
|
+
const result = await createSessionBrief(store, { mailbox });
|
|
130
|
+
io.log(result.message);
|
|
131
|
+
return 0;
|
|
132
|
+
});
|
|
133
|
+
}
|
|
113
134
|
function runInstallCommand(argv, io) {
|
|
114
|
-
const plan = createInstallPlan();
|
|
135
|
+
const plan = createInstallPlan({ packageCommand: resolvePackageCommand() });
|
|
115
136
|
if (!argv.includes("--dry-run")) {
|
|
116
137
|
const results = applyInstallPlan(plan);
|
|
117
138
|
for (const result of results) {
|
|
@@ -127,6 +148,12 @@ function runInstallCommand(argv, io) {
|
|
|
127
148
|
}
|
|
128
149
|
return 0;
|
|
129
150
|
}
|
|
151
|
+
function resolvePackageCommand() {
|
|
152
|
+
// GUI-launched harnesses (e.g. the Codex desktop app) do not inherit the
|
|
153
|
+
// shell PATH, so write the absolute path of the running bin into config.
|
|
154
|
+
const binPath = process.argv[1];
|
|
155
|
+
return binPath && path.isAbsolute(binPath) ? binPath : "cimux";
|
|
156
|
+
}
|
|
130
157
|
async function withStore(env, callback) {
|
|
131
158
|
const store = new SQLiteCimuxStore(env.CIMUX_DB_PATH ?? defaultDatabasePath());
|
|
132
159
|
try {
|
|
@@ -186,7 +213,9 @@ function usage() {
|
|
|
186
213
|
" cimux mcp",
|
|
187
214
|
" cimux install [--dry-run]",
|
|
188
215
|
" cimux notify [--mailbox <harness/name> | --harness <name>]",
|
|
216
|
+
" cimux brief [--mailbox <harness/name> | --harness <name>]",
|
|
189
217
|
" cimux register [--mailbox <harness/name> | --harness <name>]",
|
|
218
|
+
" cimux mailboxes",
|
|
190
219
|
" cimux send --from <mailbox> --to <mailbox> --title <title> --summary <summary> --body <body> [--tags a,b]",
|
|
191
220
|
" cimux check --mailbox <harness/name> [--all]",
|
|
192
221
|
" cimux read --mailbox <harness/name> --id <context-id>",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cimux-cli.js","sourceRoot":"","sources":["../../src/cli/cimux-cli.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cimux-cli.js","sourceRoot":"","sources":["../../src/cli/cimux-cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,15 +1,13 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
1
|
export { name, version } from "./version.js";
|
|
3
2
|
export declare function getProjectStage(): string;
|
|
4
3
|
export type { AckState, Artifacts, CodeSnippetArtifact, CommitArtifact, ContextPackage, ContextPackagePreview, CreateContextPackageInput, FileArtifact, FunctionArtifact, Mailbox, MailboxName, NormalizedCreateContextPackageInput, PullRequestArtifact, UrlArtifact } from "./model/context-package.js";
|
|
5
4
|
export type { AckContextPackageOptions, ContextPackageStore, ListInboxPreviewsOptions, MailboxStore } from "./storage/mailbox-store.js";
|
|
6
5
|
export type { RegisterMailboxInput, RegisterMailboxResult } from "./registration/mailbox-registration.js";
|
|
7
6
|
export { ackStateSchema, artifactsSchema, codeSnippetArtifactSchema, commitArtifactSchema, contextPackagePreviewSchema, contextPackageSchema, createContextPackagePreview, createContextPackageInputSchema, DEFAULT_INBOX_PREVIEW_LIMIT, fileArtifactSchema, functionArtifactSchema, MAX_INBOX_PREVIEW_LIMIT, mailboxNameSchema, mailboxSchema, normalizeInboxPreviewLimit, PREVIEW_SUMMARY_MAX_LENGTH, PREVIEW_TAG_MAX_COUNT, PREVIEW_TITLE_MAX_LENGTH, pullRequestArtifactSchema, urlArtifactSchema } from "./model/context-package.js";
|
|
8
|
-
export { ackContext, checkInbox, ContextPackageNotFoundError, createInboxNotification, MailboxAccessError, readContext, registerSession, sendContext } from "./service/cimux-mailbox-service.js";
|
|
7
|
+
export { ackContext, checkInbox, ContextPackageNotFoundError, createInboxNotification, createSessionBrief, listMailboxes, MailboxAccessError, readContext, registerSession, sendContext } from "./service/cimux-mailbox-service.js";
|
|
9
8
|
export { runCimuxCli } from "./cli/cimux-cli.js";
|
|
10
9
|
export { applyInstallPlan, createInstallPlan } from "./install/cimux-install-plan.js";
|
|
11
10
|
export { createCimuxMcpServer, defaultDatabasePath, runCimuxMcpServer } from "./mcp/cimux-mcp-server.js";
|
|
12
11
|
export { resolveRuntimeMailbox } from "./runtime/mailbox-runtime.js";
|
|
13
12
|
export { inferMailboxName, registerMailboxInputSchema, registerMailbox } from "./registration/mailbox-registration.js";
|
|
14
13
|
export { SQLiteCimuxStore, UnknownMailboxError } from "./storage/sqlite-cimux-store.js";
|
|
15
|
-
export declare function isCliEntrypoint(argvPath?: string | undefined, modulePath?: string): boolean;
|
package/dist/index.js
CHANGED
|
@@ -1,34 +1,13 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import fs from "node:fs";
|
|
3
|
-
import { fileURLToPath } from "node:url";
|
|
4
|
-
import { runCimuxCli } from "./cli/cimux-cli.js";
|
|
5
1
|
export { name, version } from "./version.js";
|
|
6
2
|
export function getProjectStage() {
|
|
7
3
|
return "local-mvp";
|
|
8
4
|
}
|
|
9
5
|
export { ackStateSchema, artifactsSchema, codeSnippetArtifactSchema, commitArtifactSchema, contextPackagePreviewSchema, contextPackageSchema, createContextPackagePreview, createContextPackageInputSchema, DEFAULT_INBOX_PREVIEW_LIMIT, fileArtifactSchema, functionArtifactSchema, MAX_INBOX_PREVIEW_LIMIT, mailboxNameSchema, mailboxSchema, normalizeInboxPreviewLimit, PREVIEW_SUMMARY_MAX_LENGTH, PREVIEW_TAG_MAX_COUNT, PREVIEW_TITLE_MAX_LENGTH, pullRequestArtifactSchema, urlArtifactSchema } from "./model/context-package.js";
|
|
10
|
-
export { ackContext, checkInbox, ContextPackageNotFoundError, createInboxNotification, MailboxAccessError, readContext, registerSession, sendContext } from "./service/cimux-mailbox-service.js";
|
|
6
|
+
export { ackContext, checkInbox, ContextPackageNotFoundError, createInboxNotification, createSessionBrief, listMailboxes, MailboxAccessError, readContext, registerSession, sendContext } from "./service/cimux-mailbox-service.js";
|
|
11
7
|
export { runCimuxCli } from "./cli/cimux-cli.js";
|
|
12
8
|
export { applyInstallPlan, createInstallPlan } from "./install/cimux-install-plan.js";
|
|
13
9
|
export { createCimuxMcpServer, defaultDatabasePath, runCimuxMcpServer } from "./mcp/cimux-mcp-server.js";
|
|
14
10
|
export { resolveRuntimeMailbox } from "./runtime/mailbox-runtime.js";
|
|
15
11
|
export { inferMailboxName, registerMailboxInputSchema, registerMailbox } from "./registration/mailbox-registration.js";
|
|
16
12
|
export { SQLiteCimuxStore, UnknownMailboxError } from "./storage/sqlite-cimux-store.js";
|
|
17
|
-
if (isCliEntrypoint()) {
|
|
18
|
-
process.exitCode = await runCimuxCli(process.argv.slice(2));
|
|
19
|
-
}
|
|
20
|
-
export function isCliEntrypoint(argvPath = process.argv[1], modulePath = fileURLToPath(import.meta.url)) {
|
|
21
|
-
if (!argvPath) {
|
|
22
|
-
return false;
|
|
23
|
-
}
|
|
24
|
-
// npm link and global installs usually invoke the bin through a symlink.
|
|
25
|
-
// Compare real paths so the published command still reaches runCimuxCli.
|
|
26
|
-
try {
|
|
27
|
-
return fs.realpathSync(argvPath) === fs.realpathSync(modulePath);
|
|
28
|
-
}
|
|
29
|
-
catch {
|
|
30
|
-
// argv[1] may not be a resolvable path when embedded or bundled.
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
13
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,UAAU,eAAe;IAC7B,OAAO,WAAW,CAAC;AACrB,CAAC;AA6BD,OAAO,EACL,cAAc,EACd,eAAe,EACf,yBAAyB,EACzB,oBAAoB,EACpB,2BAA2B,EAC3B,oBAAoB,EACpB,2BAA2B,EAC3B,+BAA+B,EAC/B,2BAA2B,EAC3B,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,EACjB,aAAa,EACb,0BAA0B,EAC1B,0BAA0B,EAC1B,qBAAqB,EACrB,wBAAwB,EACxB,yBAAyB,EACzB,iBAAiB,EAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,UAAU,EACV,UAAU,EACV,2BAA2B,EAC3B,uBAAuB,EACvB,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,WAAW,EACZ,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EACL,gBAAgB,EAChB,0BAA0B,EAC1B,eAAe,EAChB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC"}
|
|
@@ -10,7 +10,6 @@ export function createInstallPlan(input = {}) {
|
|
|
10
10
|
const parsed = installPlanInputSchema.parse(input);
|
|
11
11
|
const codexHome = path.join(parsed.homeDirectory, ".codex");
|
|
12
12
|
const claudeHome = path.join(parsed.homeDirectory, ".claude");
|
|
13
|
-
// Codex has no hook system, so it only gets the MCP server.
|
|
14
13
|
return {
|
|
15
14
|
targets: [
|
|
16
15
|
{
|
|
@@ -20,12 +19,35 @@ export function createInstallPlan(input = {}) {
|
|
|
20
19
|
format: "toml",
|
|
21
20
|
snippet: createCodexMcpSnippet(parsed.packageCommand)
|
|
22
21
|
},
|
|
22
|
+
{
|
|
23
|
+
harness: "codex",
|
|
24
|
+
// Codex hooks share Claude Code's shape; Codex asks the user to trust
|
|
25
|
+
// a hook on first use and after any change to it.
|
|
26
|
+
path: path.join(codexHome, "hooks.json"),
|
|
27
|
+
purpose: "Notify on unread mail each prompt; brief the agent on its mailbox at session start.",
|
|
28
|
+
format: "json",
|
|
29
|
+
snippet: createHookSnippet(parsed.packageCommand, "codex")
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
harness: "codex",
|
|
33
|
+
path: path.join(codexHome, "AGENTS.md"),
|
|
34
|
+
purpose: "Teach Codex agents to check and send Cimux mail without prompting.",
|
|
35
|
+
format: "markdown",
|
|
36
|
+
snippet: createAgentNormsSnippet()
|
|
37
|
+
},
|
|
23
38
|
{
|
|
24
39
|
harness: "claude",
|
|
25
40
|
path: path.join(claudeHome, "settings.json"),
|
|
26
|
-
purpose: "
|
|
41
|
+
purpose: "Notify on unread mail each prompt; brief the agent on its mailbox at session start.",
|
|
27
42
|
format: "json",
|
|
28
|
-
snippet:
|
|
43
|
+
snippet: createHookSnippet(parsed.packageCommand, "claude")
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
harness: "claude",
|
|
47
|
+
path: path.join(claudeHome, "CLAUDE.md"),
|
|
48
|
+
purpose: "Teach Claude Code agents to check and send Cimux mail without prompting.",
|
|
49
|
+
format: "markdown",
|
|
50
|
+
snippet: createAgentNormsSnippet()
|
|
29
51
|
},
|
|
30
52
|
{
|
|
31
53
|
harness: "claude",
|
|
@@ -46,6 +68,9 @@ function applyInstallTarget(target) {
|
|
|
46
68
|
if (target.format === "toml") {
|
|
47
69
|
return applyTomlTarget(target);
|
|
48
70
|
}
|
|
71
|
+
if (target.format === "markdown") {
|
|
72
|
+
return applyMarkdownTarget(target);
|
|
73
|
+
}
|
|
49
74
|
return applyJsonTarget(target);
|
|
50
75
|
}
|
|
51
76
|
function applyTomlTarget(target) {
|
|
@@ -66,6 +91,24 @@ function applyTomlTarget(target) {
|
|
|
66
91
|
backupPath
|
|
67
92
|
};
|
|
68
93
|
}
|
|
94
|
+
function applyMarkdownTarget(target) {
|
|
95
|
+
const existing = readTextIfExists(target.path);
|
|
96
|
+
if (existing?.includes(AGENT_NORMS_MARKER)) {
|
|
97
|
+
return {
|
|
98
|
+
path: target.path,
|
|
99
|
+
status: "unchanged",
|
|
100
|
+
backupPath: null
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
const backupPath = existing === null ? null : writeBackup(target.path, existing);
|
|
104
|
+
const next = existing === null ? target.snippet : appendBlock(existing, target.snippet);
|
|
105
|
+
fs.writeFileSync(target.path, next, "utf8");
|
|
106
|
+
return {
|
|
107
|
+
path: target.path,
|
|
108
|
+
status: existing === null ? "created" : "updated",
|
|
109
|
+
backupPath
|
|
110
|
+
};
|
|
111
|
+
}
|
|
69
112
|
function applyJsonTarget(target) {
|
|
70
113
|
const existingText = readTextIfExists(target.path);
|
|
71
114
|
const existingValue = existingText === null ? {} : parseJsonObject(existingText, target.path);
|
|
@@ -158,7 +201,8 @@ startup_timeout_sec = 10
|
|
|
158
201
|
tool_timeout_sec = 60
|
|
159
202
|
`;
|
|
160
203
|
}
|
|
161
|
-
|
|
204
|
+
// Codex and Claude Code share the same hooks JSON shape and event names.
|
|
205
|
+
function createHookSnippet(packageCommand, harness) {
|
|
162
206
|
return JSON.stringify({
|
|
163
207
|
hooks: {
|
|
164
208
|
UserPromptSubmit: [
|
|
@@ -166,7 +210,17 @@ function createClaudeHookSnippet(packageCommand) {
|
|
|
166
210
|
hooks: [
|
|
167
211
|
{
|
|
168
212
|
type: "command",
|
|
169
|
-
command: `${packageCommand} notify --harness
|
|
213
|
+
command: `${packageCommand} notify --harness ${harness}`
|
|
214
|
+
}
|
|
215
|
+
]
|
|
216
|
+
}
|
|
217
|
+
],
|
|
218
|
+
SessionStart: [
|
|
219
|
+
{
|
|
220
|
+
hooks: [
|
|
221
|
+
{
|
|
222
|
+
type: "command",
|
|
223
|
+
command: `${packageCommand} brief --harness ${harness}`
|
|
170
224
|
}
|
|
171
225
|
]
|
|
172
226
|
}
|
|
@@ -174,6 +228,19 @@ function createClaudeHookSnippet(packageCommand) {
|
|
|
174
228
|
}
|
|
175
229
|
}, null, 2);
|
|
176
230
|
}
|
|
231
|
+
const AGENT_NORMS_MARKER = "<!-- cimux:norms -->";
|
|
232
|
+
function createAgentNormsSnippet() {
|
|
233
|
+
return `${AGENT_NORMS_MARKER}
|
|
234
|
+
## Cimux agent mail
|
|
235
|
+
|
|
236
|
+
You have a Cimux mailbox (MCP server \`cimux\`). Follow these norms without being asked:
|
|
237
|
+
|
|
238
|
+
- When notified of unread context packages, call \`check_inbox\`, use \`read_context\` on what is relevant, and \`ack_context\` after loading it.
|
|
239
|
+
- When you finish work whose outcome another agent or a future session may need (root causes, decisions, gotchas, handoffs), send it with \`send_context\`: short title, tight summary, full detail in the body, artifact pointers instead of pasted file contents.
|
|
240
|
+
- Find recipients with \`list_mailboxes\`; only existing mailboxes can receive mail. Register your own with \`register_session\` if unsure.
|
|
241
|
+
<!-- cimux:end -->
|
|
242
|
+
`;
|
|
243
|
+
}
|
|
177
244
|
function createClaudeMcpSnippet(packageCommand) {
|
|
178
245
|
return JSON.stringify({
|
|
179
246
|
mcpServers: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cimux-install-plan.js","sourceRoot":"","sources":["../../src/install/cimux-install-plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IAClD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;CACvD,CAAC,CAAC;AAsBH,MAAM,UAAU,iBAAiB,CAAC,QAA0B,EAAE;IAC5D,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAE9D,
|
|
1
|
+
{"version":3,"file":"cimux-install-plan.js","sourceRoot":"","sources":["../../src/install/cimux-install-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
4
4
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
5
|
import { createContextPackageInputSchema } from "../model/context-package.js";
|
|
6
6
|
import { registerMailboxInputSchema } from "../registration/mailbox-registration.js";
|
|
7
|
-
import { ackContext, ackContextInputSchema, checkInbox, checkInboxInputSchema, readContext, readContextInputSchema, registerSession, sendContext } from "../service/cimux-mailbox-service.js";
|
|
7
|
+
import { ackContext, ackContextInputSchema, checkInbox, checkInboxInputSchema, listMailboxes, readContext, readContextInputSchema, registerSession, sendContext } from "../service/cimux-mailbox-service.js";
|
|
8
8
|
import { SQLiteCimuxStore } from "../storage/sqlite-cimux-store.js";
|
|
9
9
|
import { version } from "../version.js";
|
|
10
10
|
export function createCimuxMcpServer(databasePath = defaultDatabasePath()) {
|
|
@@ -18,6 +18,17 @@ export function createCimuxMcpServer(databasePath = defaultDatabasePath()) {
|
|
|
18
18
|
description: "Register or infer the current agent mailbox. Branch names are preferred over task/folder names.",
|
|
19
19
|
inputSchema: registerMailboxInputSchema.shape
|
|
20
20
|
}, async (input) => toToolResult(await registerSession(store, input)));
|
|
21
|
+
server.registerTool("list_mailboxes", {
|
|
22
|
+
title: "List Mailboxes",
|
|
23
|
+
description: "List registered mailbox names. Use this to find the recipient before send_context.",
|
|
24
|
+
inputSchema: {}
|
|
25
|
+
}, async () => {
|
|
26
|
+
// Names only: this response is read by agents, so keep it token-lean.
|
|
27
|
+
const result = await listMailboxes(store);
|
|
28
|
+
return toToolResult({
|
|
29
|
+
mailboxes: result.mailboxes.map((mailbox) => mailbox.name)
|
|
30
|
+
});
|
|
31
|
+
});
|
|
21
32
|
server.registerTool("send_context", {
|
|
22
33
|
title: "Send Context",
|
|
23
34
|
description: "Send a structured Context Package to an existing mailbox. Unknown mailboxes are rejected.",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cimux-mcp-server.js","sourceRoot":"","sources":["../../src/mcp/cimux-mcp-server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cimux-mcp-server.js","sourceRoot":"","sources":["../../src/mcp/cimux-mcp-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import type { ContextPackage, ContextPackagePreview, CreateContextPackageInput } from "../model/context-package.js";
|
|
2
|
+
import type { ContextPackage, ContextPackagePreview, CreateContextPackageInput, Mailbox } from "../model/context-package.js";
|
|
3
3
|
import { type RegisterMailboxInput, type RegisterMailboxResult } from "../registration/mailbox-registration.js";
|
|
4
4
|
import type { ContextPackageStore, MailboxStore } from "../storage/mailbox-store.js";
|
|
5
5
|
export declare const checkInboxInputSchema: z.ZodObject<{
|
|
@@ -49,11 +49,19 @@ export declare const inboxNotificationInputSchema: z.ZodObject<{
|
|
|
49
49
|
mailbox: string;
|
|
50
50
|
limit?: number | undefined;
|
|
51
51
|
}>;
|
|
52
|
+
export declare const sessionBriefInputSchema: z.ZodObject<{
|
|
53
|
+
mailbox: z.ZodString;
|
|
54
|
+
}, "strip", z.ZodTypeAny, {
|
|
55
|
+
mailbox: string;
|
|
56
|
+
}, {
|
|
57
|
+
mailbox: string;
|
|
58
|
+
}>;
|
|
52
59
|
export type CimuxStore = MailboxStore & ContextPackageStore;
|
|
53
60
|
export type CheckInboxInput = z.input<typeof checkInboxInputSchema>;
|
|
54
61
|
export type ReadContextInput = z.input<typeof readContextInputSchema>;
|
|
55
62
|
export type AckContextInput = z.input<typeof ackContextInputSchema>;
|
|
56
63
|
export type InboxNotificationInput = z.input<typeof inboxNotificationInputSchema>;
|
|
64
|
+
export type SessionBriefInput = z.input<typeof sessionBriefInputSchema>;
|
|
57
65
|
export type SendContextResult = {
|
|
58
66
|
contextPackage: ContextPackage;
|
|
59
67
|
};
|
|
@@ -70,6 +78,12 @@ export type AckContextResult = {
|
|
|
70
78
|
export type InboxNotificationResult = {
|
|
71
79
|
message: string | null;
|
|
72
80
|
};
|
|
81
|
+
export type SessionBriefResult = {
|
|
82
|
+
message: string;
|
|
83
|
+
};
|
|
84
|
+
export type ListMailboxesResult = {
|
|
85
|
+
mailboxes: Mailbox[];
|
|
86
|
+
};
|
|
73
87
|
export declare class MailboxAccessError extends Error {
|
|
74
88
|
readonly mailbox: string;
|
|
75
89
|
readonly contextPackageId: string;
|
|
@@ -85,3 +99,5 @@ export declare function checkInbox(store: CimuxStore, input: CheckInboxInput): P
|
|
|
85
99
|
export declare function readContext(store: CimuxStore, input: ReadContextInput): Promise<ReadContextResult>;
|
|
86
100
|
export declare function ackContext(store: CimuxStore, input: AckContextInput): Promise<AckContextResult>;
|
|
87
101
|
export declare function createInboxNotification(store: CimuxStore, input: InboxNotificationInput): Promise<InboxNotificationResult>;
|
|
102
|
+
export declare function createSessionBrief(store: CimuxStore, input: SessionBriefInput): Promise<SessionBriefResult>;
|
|
103
|
+
export declare function listMailboxes(store: MailboxStore): Promise<ListMailboxesResult>;
|
|
@@ -18,6 +18,9 @@ export const inboxNotificationInputSchema = z.object({
|
|
|
18
18
|
mailbox: mailboxNameSchema,
|
|
19
19
|
limit: z.number().int().positive().max(10).default(10)
|
|
20
20
|
});
|
|
21
|
+
export const sessionBriefInputSchema = z.object({
|
|
22
|
+
mailbox: mailboxNameSchema
|
|
23
|
+
});
|
|
21
24
|
export class MailboxAccessError extends Error {
|
|
22
25
|
mailbox;
|
|
23
26
|
contextPackageId;
|
|
@@ -109,6 +112,27 @@ export async function createInboxNotification(store, input) {
|
|
|
109
112
|
message: `Cimux: ${previews.length} unread context package(s) for ${parsed.mailbox} from ${senderText}${suffix}. Call check_inbox to preview.`
|
|
110
113
|
};
|
|
111
114
|
}
|
|
115
|
+
export async function createSessionBrief(store, input) {
|
|
116
|
+
const parsed = sessionBriefInputSchema.parse(input);
|
|
117
|
+
const previews = await store.listInboxPreviews(parsed.mailbox, {
|
|
118
|
+
unreadOnly: true,
|
|
119
|
+
limit: 10
|
|
120
|
+
});
|
|
121
|
+
const unread = previews.length === 0
|
|
122
|
+
? "no unread mail"
|
|
123
|
+
: `${previews.length} unread — call check_inbox before starting`;
|
|
124
|
+
// Injected at session start so agents send handoffs without being asked.
|
|
125
|
+
// Keep it short: this costs tokens in every session.
|
|
126
|
+
return {
|
|
127
|
+
message: [
|
|
128
|
+
`Cimux mailbox: ${parsed.mailbox} (${unread}).`,
|
|
129
|
+
"When you finish work another agent or session may need, send a handoff with send_context. Ack packages after loading them."
|
|
130
|
+
].join("\n")
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
export async function listMailboxes(store) {
|
|
134
|
+
return { mailboxes: await store.listMailboxes() };
|
|
135
|
+
}
|
|
112
136
|
async function assertPackageBelongsToMailbox(store, id, mailbox) {
|
|
113
137
|
const contextPackage = await store.getContextPackage(id);
|
|
114
138
|
if (!contextPackage) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cimux-mailbox-service.js","sourceRoot":"","sources":["../../src/service/cimux-mailbox-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,oBAAoB,EACpB,+BAA+B,EAC/B,iBAAiB,EAClB,MAAM,6BAA6B,CAAC;AAOrC,OAAO,EACL,eAAe,EAGhB,MAAM,yCAAyC,CAAC;AAGjD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,OAAO,EAAE,iBAAiB;IAC1B,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACrC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CAC9C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,OAAO,EAAE,iBAAiB;IAC1B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CACtB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,sBAAsB,CAAC,MAAM,CAAC;IACjE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;CACtC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC;IACnD,OAAO,EAAE,iBAAiB;IAC1B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACvD,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"cimux-mailbox-service.js","sourceRoot":"","sources":["../../src/service/cimux-mailbox-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,oBAAoB,EACpB,+BAA+B,EAC/B,iBAAiB,EAClB,MAAM,6BAA6B,CAAC;AAOrC,OAAO,EACL,eAAe,EAGhB,MAAM,yCAAyC,CAAC;AAGjD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,OAAO,EAAE,iBAAiB;IAC1B,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACrC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CAC9C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,OAAO,EAAE,iBAAiB;IAC1B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CACtB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,sBAAsB,CAAC,MAAM,CAAC;IACjE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;CACtC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC;IACnD,OAAO,EAAE,iBAAiB;IAC1B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACvD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,OAAO,EAAE,iBAAiB;CAC3B,CAAC,CAAC;AAsCH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IACtB;IAA0B;IAA/C,YAAqB,OAAe,EAAW,gBAAwB;QACrE,KAAK,CAAC,mBAAmB,gBAAgB,wBAAwB,OAAO,EAAE,CAAC,CAAC;QADzD,YAAO,GAAP,OAAO,CAAQ;QAAW,qBAAgB,GAAhB,gBAAgB,CAAQ;QAErE,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IAC/B;IAArB,YAAqB,gBAAwB;QAC3C,KAAK,CAAC,4BAA4B,gBAAgB,EAAE,CAAC,CAAC;QADnC,qBAAgB,GAAhB,gBAAgB,CAAQ;QAE3C,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;IAC5C,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAmB,EACnB,KAA2B;IAE3B,OAAO,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAiB,EACjB,KAAgC;IAEhC,MAAM,MAAM,GAAG,+BAA+B,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE5D,8EAA8E;IAC9E,gEAAgE;IAChE,MAAM,cAAc,GAAG,oBAAoB,CAAC,KAAK,CAAC;QAChD,GAAG,MAAM;QACT,EAAE,EAAE,sBAAsB,EAAE;QAC5B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,MAAM,EAAE,IAAI;QACZ,GAAG,EAAE;YACH,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,IAAI;SACX;KACF,CAAC,CAAC;IAEH,OAAO;QACL,cAAc,EAAE,MAAM,KAAK,CAAC,oBAAoB,CAAC,cAAc,CAAC;KACjE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,KAAiB,EACjB,KAAsB;IAEtB,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAElD,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,MAAM,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE;YACtD,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;SAC/D,CAAC;KACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAiB,EACjB,KAAuB;IAEvB,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,6BAA6B,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAEtE,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjE,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,2BAA2B,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,EAAE,cAAc,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,KAAiB,EACjB,KAAsB;IAEtB,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,6BAA6B,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAEtE,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,EAAE;QAC9D,KAAK,EAAE,MAAM,CAAC,OAAO;QACrB,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;KAC5D,CAAC,CAAC;IACH,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,2BAA2B,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,EAAE,cAAc,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,KAAiB,EACjB,KAA6B;IAE7B,MAAM,MAAM,GAAG,4BAA4B,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE;QAC7D,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,gBAAgB,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAE3E,8EAA8E;IAC9E,8EAA8E;IAC9E,OAAO;QACL,OAAO,EAAE,UAAU,QAAQ,CAAC,MAAM,kCAAkC,MAAM,CAAC,OAAO,SAAS,UAAU,GAAG,MAAM,gCAAgC;KAC/I,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAiB,EACjB,KAAwB;IAExB,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE;QAC7D,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,EAAE;KACV,CAAC,CAAC;IAEH,MAAM,MAAM,GACV,QAAQ,CAAC,MAAM,KAAK,CAAC;QACnB,CAAC,CAAC,gBAAgB;QAClB,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,4CAA4C,CAAC;IAErE,yEAAyE;IACzE,qDAAqD;IACrD,OAAO;QACL,OAAO,EAAE;YACP,kBAAkB,MAAM,CAAC,OAAO,KAAK,MAAM,IAAI;YAC/C,4HAA4H;SAC7H,CAAC,IAAI,CAAC,IAAI,CAAC;KACb,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAmB;IACrD,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC,aAAa,EAAE,EAAE,CAAC;AACpD,CAAC;AAED,KAAK,UAAU,6BAA6B,CAC1C,KAAiB,EACjB,EAAU,EACV,OAAe;IAEf,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,2BAA2B,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,6EAA6E;IAC7E,+EAA+E;IAC/E,IAAI,cAAc,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;QACzC,MAAM,IAAI,kBAAkB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB;IAC7B,OAAO,OAAO,UAAU,EAAE,EAAE,CAAC;AAC/B,CAAC"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export declare const name = "cimux";
|
|
2
|
-
export declare const version = "0.
|
|
2
|
+
export declare const version = "0.2.0";
|
package/dist/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cimux-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Local-first mailbox for intentional AI agent context handoffs.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mcp",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"license": "MIT",
|
|
22
22
|
"type": "module",
|
|
23
23
|
"bin": {
|
|
24
|
-
"cimux": "./dist/
|
|
24
|
+
"cimux": "./dist/bin.js"
|
|
25
25
|
},
|
|
26
26
|
"files": [
|
|
27
27
|
"dist",
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Read-only web viewer for the local cimux database.
|
|
3
|
+
// Usage: node cimux-viewer.mjs [port] [dbPath]
|
|
4
|
+
import { createServer } from "node:http";
|
|
5
|
+
import { DatabaseSync } from "node:sqlite";
|
|
6
|
+
import os from "node:os";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
|
|
9
|
+
const port = Number(process.argv[2] ?? 4767);
|
|
10
|
+
const dbPath =
|
|
11
|
+
process.argv[3] ?? path.join(os.homedir(), ".cimux", "cimux.sqlite");
|
|
12
|
+
|
|
13
|
+
function readState() {
|
|
14
|
+
// Open read-only per request: never blocks writers, never marks mail read.
|
|
15
|
+
const db = new DatabaseSync(dbPath, { readOnly: true });
|
|
16
|
+
try {
|
|
17
|
+
const mailboxes = db
|
|
18
|
+
.prepare("select name, created_at, last_seen_at from mailboxes order by name")
|
|
19
|
+
.all();
|
|
20
|
+
const packages = db
|
|
21
|
+
.prepare(
|
|
22
|
+
`select id, from_mailbox, to_mailbox, title, summary, body, tags_json,
|
|
23
|
+
artifacts_json, payload_json, created_at, read_at, ack_json
|
|
24
|
+
from context_packages order by created_at desc limit 200`
|
|
25
|
+
)
|
|
26
|
+
.all()
|
|
27
|
+
.map((row) => ({
|
|
28
|
+
id: row.id,
|
|
29
|
+
from: row.from_mailbox,
|
|
30
|
+
to: row.to_mailbox,
|
|
31
|
+
title: row.title,
|
|
32
|
+
summary: row.summary,
|
|
33
|
+
body: row.body,
|
|
34
|
+
tags: JSON.parse(row.tags_json),
|
|
35
|
+
artifacts: JSON.parse(row.artifacts_json),
|
|
36
|
+
payload: JSON.parse(row.payload_json),
|
|
37
|
+
createdAt: row.created_at,
|
|
38
|
+
readAt: row.read_at,
|
|
39
|
+
ack: JSON.parse(row.ack_json)
|
|
40
|
+
}));
|
|
41
|
+
return { dbPath, mailboxes, packages };
|
|
42
|
+
} finally {
|
|
43
|
+
db.close();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const page = `<!doctype html>
|
|
48
|
+
<html lang="en">
|
|
49
|
+
<head>
|
|
50
|
+
<meta charset="utf-8">
|
|
51
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
52
|
+
<title>cimux mail</title>
|
|
53
|
+
<style>
|
|
54
|
+
:root {
|
|
55
|
+
--ground:#eef1ef; --pane:#f7f9f7; --surface:#ffffff; --ink:#1f262a;
|
|
56
|
+
--muted:#5c6771; --faint:#8a949c; --line:#dce2e0; --line-soft:#e7ebe9;
|
|
57
|
+
--accent:#196e63; --accent-soft:#e0eeea; --sel:#d5e8e3;
|
|
58
|
+
--unread:#1d7fd1; --green:#3d7a46; --green-soft:#e6f0e7;
|
|
59
|
+
--tag:#eceff0; --code:#f0f2f1;
|
|
60
|
+
}
|
|
61
|
+
@media (prefers-color-scheme: dark) {
|
|
62
|
+
:root {
|
|
63
|
+
--ground:#101416; --pane:#171c1f; --surface:#1d2327; --ink:#dbe2e5;
|
|
64
|
+
--muted:#8d99a1; --faint:#68737b; --line:#2b3438; --line-soft:#232b2f;
|
|
65
|
+
--accent:#4fb8a8; --accent-soft:#1c302c; --sel:#22423c;
|
|
66
|
+
--unread:#4da3e8; --green:#82bd8b; --green-soft:#1e2c20;
|
|
67
|
+
--tag:#252d31; --code:#20272b;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
* { box-sizing:border-box; }
|
|
71
|
+
html, body { height:100%; }
|
|
72
|
+
body { margin:0; background:var(--ground); color:var(--ink);
|
|
73
|
+
font:13.5px/1.45 -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
|
|
74
|
+
-webkit-font-smoothing:antialiased; }
|
|
75
|
+
.mono { font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; }
|
|
76
|
+
|
|
77
|
+
.app { display:grid; grid-template-columns: 200px 340px 1fr;
|
|
78
|
+
grid-template-rows: 44px 1fr; height:100vh; }
|
|
79
|
+
@media (max-width: 900px) { .app { grid-template-columns: 170px 1fr; }
|
|
80
|
+
.reader { display:none; } }
|
|
81
|
+
|
|
82
|
+
/* toolbar */
|
|
83
|
+
.toolbar { grid-column: 1 / -1; display:flex; align-items:center; gap:0.75rem;
|
|
84
|
+
padding:0 1rem; background:var(--pane); border-bottom:1px solid var(--line); }
|
|
85
|
+
.toolbar .brand { font-weight:700; font-size:0.85rem; letter-spacing:0.02em; }
|
|
86
|
+
.toolbar .brand span { color:var(--accent); }
|
|
87
|
+
.toolbar .db { color:var(--faint); font-size:0.68rem; }
|
|
88
|
+
.toolbar .live { margin-left:auto; color:var(--muted); font-size:0.72rem; }
|
|
89
|
+
.toolbar .live::before { content:""; display:inline-block; width:7px; height:7px;
|
|
90
|
+
border-radius:50%; background:var(--green); margin-right:0.4rem; }
|
|
91
|
+
|
|
92
|
+
/* folders */
|
|
93
|
+
.folders { background:var(--pane); border-right:1px solid var(--line);
|
|
94
|
+
padding:0.75rem 0.5rem; overflow-y:auto; }
|
|
95
|
+
.folders h2 { font-size:0.65rem; text-transform:uppercase; letter-spacing:0.1em;
|
|
96
|
+
color:var(--faint); margin:0.25rem 0 0.4rem 0.6rem; font-weight:700; }
|
|
97
|
+
.folder { display:flex; align-items:center; gap:0.5rem; width:100%;
|
|
98
|
+
background:none; border:none; color:var(--ink); font:inherit; font-size:0.8rem;
|
|
99
|
+
padding:0.38rem 0.6rem; border-radius:6px; cursor:pointer; }
|
|
100
|
+
.folder:hover { background:var(--line-soft); }
|
|
101
|
+
.folder.active { background:var(--sel); color:var(--accent); font-weight:600; }
|
|
102
|
+
.folder .icon { width:0.95rem; text-align:center; opacity:0.75; }
|
|
103
|
+
.folder .count { margin-left:auto; font-size:0.68rem; font-weight:700;
|
|
104
|
+
font-variant-numeric:tabular-nums; color:var(--muted); }
|
|
105
|
+
.folder.active .count { color:var(--accent); }
|
|
106
|
+
.folder:focus-visible, .row:focus-visible { outline:2px solid var(--accent); outline-offset:-2px; }
|
|
107
|
+
|
|
108
|
+
/* message list */
|
|
109
|
+
.list { background:var(--surface); border-right:1px solid var(--line);
|
|
110
|
+
overflow-y:auto; }
|
|
111
|
+
.listhead { position:sticky; top:0; background:var(--surface); z-index:1;
|
|
112
|
+
padding:0.55rem 1rem; border-bottom:1px solid var(--line);
|
|
113
|
+
font-size:0.72rem; color:var(--muted); display:flex; }
|
|
114
|
+
.listhead b { color:var(--ink); margin-right:0.35rem; }
|
|
115
|
+
.listhead .n { margin-left:auto; font-variant-numeric:tabular-nums; }
|
|
116
|
+
.row { display:grid; grid-template-columns: 14px 1fr auto; column-gap:0.5rem;
|
|
117
|
+
width:100%; text-align:left; background:none; border:none; color:inherit;
|
|
118
|
+
font:inherit; padding:0.6rem 0.9rem 0.6rem 0.6rem; cursor:pointer;
|
|
119
|
+
border-bottom:1px solid var(--line-soft); align-items:baseline; }
|
|
120
|
+
.row:hover { background:var(--line-soft); }
|
|
121
|
+
.row.selected { background:var(--sel); }
|
|
122
|
+
.dot { width:8px; height:8px; border-radius:50%; margin-top:0.32rem; justify-self:center; }
|
|
123
|
+
.row[data-unread="true"] .dot { background:var(--unread); }
|
|
124
|
+
.row .from { font-size:0.78rem; color:var(--muted); }
|
|
125
|
+
.row[data-unread="true"] .from, .row[data-unread="true"] .subj { font-weight:650; color:var(--ink); }
|
|
126
|
+
.row .time { grid-column:3; font-size:0.7rem; color:var(--faint);
|
|
127
|
+
font-variant-numeric:tabular-nums; white-space:nowrap; }
|
|
128
|
+
.row .subj { grid-column:2 / 4; font-size:0.82rem; margin-top:0.1rem;
|
|
129
|
+
overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
130
|
+
.row .snip { grid-column:2 / 4; font-size:0.75rem; color:var(--faint); margin-top:0.1rem;
|
|
131
|
+
display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; }
|
|
132
|
+
.row .flags { grid-column:2 / 4; margin-top:0.25rem; display:flex; gap:0.3rem; }
|
|
133
|
+
.empty { color:var(--faint); text-align:center; padding:3rem 1rem; font-size:0.8rem; }
|
|
134
|
+
|
|
135
|
+
/* reading pane */
|
|
136
|
+
.reader { background:var(--surface); overflow-y:auto; }
|
|
137
|
+
.reader .placeholder { height:100%; display:flex; align-items:center;
|
|
138
|
+
justify-content:center; color:var(--faint); font-size:0.85rem; }
|
|
139
|
+
.mail { max-width:720px; padding:1.4rem 1.75rem 3rem; }
|
|
140
|
+
.mail h1 { font-size:1.15rem; font-weight:650; margin:0 0 0.75rem; line-height:1.3; }
|
|
141
|
+
.envelope { border:1px solid var(--line); border-radius:8px; padding:0.7rem 0.9rem;
|
|
142
|
+
font-size:0.78rem; display:grid; grid-template-columns:auto 1fr; gap:0.2rem 0.75rem; }
|
|
143
|
+
.envelope dt { color:var(--faint); }
|
|
144
|
+
.envelope dd { margin:0; }
|
|
145
|
+
.pill { display:inline-block; font-size:0.68rem; font-weight:700; border-radius:99px;
|
|
146
|
+
padding:0.12rem 0.55rem; }
|
|
147
|
+
.p-unread { background:color-mix(in srgb, var(--unread) 14%, transparent); color:var(--unread); }
|
|
148
|
+
.p-read { background:var(--tag); color:var(--muted); }
|
|
149
|
+
.p-ack { background:var(--green-soft); color:var(--green); }
|
|
150
|
+
.p-tag { background:var(--tag); color:var(--muted); font-weight:600; }
|
|
151
|
+
.mail .bodytext { white-space:pre-wrap; overflow-wrap:break-word;
|
|
152
|
+
font-size:0.85rem; line-height:1.6; margin:1.25rem 0; }
|
|
153
|
+
.mail h3 { font-size:0.68rem; text-transform:uppercase; letter-spacing:0.1em;
|
|
154
|
+
color:var(--faint); margin:1.5rem 0 0.5rem; }
|
|
155
|
+
.att { border:1px solid var(--line); border-radius:6px; padding:0.5rem 0.75rem;
|
|
156
|
+
margin-bottom:0.4rem; font-size:0.78rem; display:flex; gap:0.5rem; align-items:baseline; }
|
|
157
|
+
.att .kind { font-size:0.65rem; font-weight:700; text-transform:uppercase;
|
|
158
|
+
letter-spacing:0.05em; color:var(--accent); }
|
|
159
|
+
.att .note { color:var(--faint); }
|
|
160
|
+
.meta { color:var(--faint); font-size:0.72rem; }
|
|
161
|
+
</style>
|
|
162
|
+
</head>
|
|
163
|
+
<body>
|
|
164
|
+
<div class="app">
|
|
165
|
+
<div class="toolbar">
|
|
166
|
+
<span class="brand"><span>cimux</span> mail</span>
|
|
167
|
+
<span class="db mono" id="db"></span>
|
|
168
|
+
<span class="live" id="live">live</span>
|
|
169
|
+
</div>
|
|
170
|
+
<nav class="folders">
|
|
171
|
+
<h2>Mailboxes</h2>
|
|
172
|
+
<div id="folders"></div>
|
|
173
|
+
</nav>
|
|
174
|
+
<section class="list" aria-label="Messages">
|
|
175
|
+
<div class="listhead" id="listhead"></div>
|
|
176
|
+
<div id="rows"></div>
|
|
177
|
+
</section>
|
|
178
|
+
<section class="reader" id="reader" aria-label="Message">
|
|
179
|
+
<div class="placeholder">Select a message</div>
|
|
180
|
+
</section>
|
|
181
|
+
</div>
|
|
182
|
+
<script>
|
|
183
|
+
let state = null;
|
|
184
|
+
let folder = "__all__";
|
|
185
|
+
let selectedId = null;
|
|
186
|
+
|
|
187
|
+
function esc(s) {
|
|
188
|
+
return String(s).replace(/[&<>"']/g, (c) =>
|
|
189
|
+
({ "&":"&","<":"<",">":">",'"':""","'":"'" }[c]));
|
|
190
|
+
}
|
|
191
|
+
function fmtShort(iso) {
|
|
192
|
+
const d = new Date(iso), now = new Date();
|
|
193
|
+
if (d.toDateString() === now.toDateString())
|
|
194
|
+
return d.toLocaleTimeString(undefined,{hour:"2-digit",minute:"2-digit"});
|
|
195
|
+
return d.toLocaleDateString(undefined,{month:"short",day:"numeric"});
|
|
196
|
+
}
|
|
197
|
+
function fmtLong(iso) {
|
|
198
|
+
if (!iso) return "";
|
|
199
|
+
return new Date(iso).toLocaleString(undefined,
|
|
200
|
+
{weekday:"short",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"});
|
|
201
|
+
}
|
|
202
|
+
function shown() {
|
|
203
|
+
return state.packages.filter((p) => folder === "__all__" || p.to === folder);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function render() {
|
|
207
|
+
if (!state) return;
|
|
208
|
+
document.getElementById("db").textContent = state.dbPath;
|
|
209
|
+
|
|
210
|
+
const unreadBy = {};
|
|
211
|
+
for (const p of state.packages) if (!p.readAt) unreadBy[p.to] = (unreadBy[p.to] ?? 0) + 1;
|
|
212
|
+
const allUnread = state.packages.filter((p) => !p.readAt).length;
|
|
213
|
+
|
|
214
|
+
document.getElementById("folders").innerHTML =
|
|
215
|
+
folderBtn("__all__", "📥", "All mail", allUnread) +
|
|
216
|
+
state.mailboxes.map((m) =>
|
|
217
|
+
folderBtn(m.name, "🗂", m.name, unreadBy[m.name] ?? 0)).join("");
|
|
218
|
+
for (const b of document.querySelectorAll(".folder"))
|
|
219
|
+
b.onclick = () => { folder = b.dataset.box; render(); };
|
|
220
|
+
|
|
221
|
+
const msgs = shown();
|
|
222
|
+
document.getElementById("listhead").innerHTML =
|
|
223
|
+
"<b>" + esc(folder === "__all__" ? "All mail" : folder) + "</b>" +
|
|
224
|
+
'<span class="n">' + msgs.length + " message" + (msgs.length === 1 ? "" : "s") + "</span>";
|
|
225
|
+
|
|
226
|
+
document.getElementById("rows").innerHTML = msgs.length
|
|
227
|
+
? msgs.map(row).join("")
|
|
228
|
+
: '<p class="empty">No mail here yet.</p>';
|
|
229
|
+
for (const r of document.querySelectorAll(".row"))
|
|
230
|
+
r.onclick = () => { selectedId = r.dataset.id; render(); };
|
|
231
|
+
|
|
232
|
+
const current = state.packages.find((p) => p.id === selectedId);
|
|
233
|
+
document.getElementById("reader").innerHTML = current
|
|
234
|
+
? mail(current)
|
|
235
|
+
: '<div class="placeholder">Select a message</div>';
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function folderBtn(id, icon, label, count) {
|
|
239
|
+
return '<button class="folder' + (folder === id ? " active" : "") +
|
|
240
|
+
'" data-box="' + esc(id) + '"><span class="icon">' + icon + "</span>" +
|
|
241
|
+
'<span class="mono">' + esc(label) + "</span>" +
|
|
242
|
+
(count ? '<span class="count">' + count + "</span>" : "") + "</button>";
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
function row(p) {
|
|
246
|
+
const acked = p.ack.status === "acknowledged";
|
|
247
|
+
return '<button class="row' + (p.id === selectedId ? " selected" : "") +
|
|
248
|
+
'" data-id="' + esc(p.id) + '" data-unread="' + !p.readAt + '">' +
|
|
249
|
+
'<span class="dot"></span>' +
|
|
250
|
+
'<span class="from mono">' + esc(p.from) + "</span>" +
|
|
251
|
+
'<span class="time">' + fmtShort(p.createdAt) + "</span>" +
|
|
252
|
+
'<span class="subj">' + esc(p.title) + "</span>" +
|
|
253
|
+
'<span class="snip">' + esc(p.summary) + "</span>" +
|
|
254
|
+
(acked ? '<span class="flags"><span class="pill p-ack">✓ acked</span></span>' : "") +
|
|
255
|
+
"</button>";
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
function mail(p) {
|
|
259
|
+
const acked = p.ack.status === "acknowledged";
|
|
260
|
+
const atts = Object.entries(p.artifacts)
|
|
261
|
+
.flatMap(([kind, items]) => (Array.isArray(items) ? items : []).map((a) =>
|
|
262
|
+
'<div class="att"><span class="kind">' + esc(kind.replace(/s$/, "")) + "</span>" +
|
|
263
|
+
'<span class="mono">' +
|
|
264
|
+
esc(a.path ?? a.url ?? a.sha ?? a.name ?? a.label ?? JSON.stringify(a)) + "</span>" +
|
|
265
|
+
(a.note ? '<span class="note">' + esc(a.note) + "</span>" : "") + "</div>"))
|
|
266
|
+
.join("");
|
|
267
|
+
return '<article class="mail">' +
|
|
268
|
+
"<h1>" + esc(p.title) + "</h1>" +
|
|
269
|
+
'<dl class="envelope">' +
|
|
270
|
+
"<dt>From</dt><dd class=\\"mono\\">" + esc(p.from) + "</dd>" +
|
|
271
|
+
"<dt>To</dt><dd class=\\"mono\\">" + esc(p.to) + "</dd>" +
|
|
272
|
+
"<dt>Date</dt><dd>" + fmtLong(p.createdAt) + "</dd>" +
|
|
273
|
+
"<dt>Status</dt><dd>" +
|
|
274
|
+
(!p.readAt ? '<span class="pill p-unread">unread</span>'
|
|
275
|
+
: '<span class="pill p-read">read ' + fmtLong(p.readAt) + "</span>") +
|
|
276
|
+
(acked ? ' <span class="pill p-ack">acked by ' + esc(p.ack.ackBy) + "</span>" : "") +
|
|
277
|
+
"</dd>" +
|
|
278
|
+
(p.tags.length ? "<dt>Tags</dt><dd>" +
|
|
279
|
+
p.tags.map((t) => '<span class="pill p-tag">' + esc(t) + "</span>").join(" ") +
|
|
280
|
+
"</dd>" : "") +
|
|
281
|
+
"</dl>" +
|
|
282
|
+
'<div class="bodytext">' + esc(p.body) + "</div>" +
|
|
283
|
+
(atts ? "<h3>Artifacts</h3>" + atts : "") +
|
|
284
|
+
(acked && p.ack.note ? '<h3>Ack note</h3><p class="meta">' + esc(p.ack.note) + "</p>" : "") +
|
|
285
|
+
'<h3>Package id</h3><p class="meta mono">' + esc(p.id) + "</p>" +
|
|
286
|
+
"</article>";
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
async function tick() {
|
|
290
|
+
try {
|
|
291
|
+
const res = await fetch("/api/state");
|
|
292
|
+
state = await res.json();
|
|
293
|
+
if (!selectedId && state.packages.length) selectedId = state.packages[0].id;
|
|
294
|
+
document.getElementById("live").textContent = "live";
|
|
295
|
+
render();
|
|
296
|
+
} catch {
|
|
297
|
+
document.getElementById("live").textContent = "reconnecting…";
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
tick();
|
|
301
|
+
setInterval(tick, 2000);
|
|
302
|
+
</script>
|
|
303
|
+
</body>
|
|
304
|
+
</html>`;
|
|
305
|
+
|
|
306
|
+
const server = createServer((req, res) => {
|
|
307
|
+
try {
|
|
308
|
+
if (req.url === "/api/state") {
|
|
309
|
+
res.writeHead(200, { "content-type": "application/json" });
|
|
310
|
+
res.end(JSON.stringify(readState()));
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
res.writeHead(200, { "content-type": "text/html; charset=utf-8" });
|
|
314
|
+
res.end(page);
|
|
315
|
+
} catch (error) {
|
|
316
|
+
res.writeHead(500, { "content-type": "text/plain" });
|
|
317
|
+
res.end(String(error));
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
server.listen(port, "127.0.0.1", () => {
|
|
322
|
+
console.log(`cimux mail viewer (read-only) on http://localhost:${port}`);
|
|
323
|
+
console.log(`database: ${dbPath}`);
|
|
324
|
+
});
|