Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ jobs:
- name: Install dependencies
run: npm ci

- name: Install linux native bindings
run: npm install @rolldown/binding-linux-x64-gnu @tailwindcss/oxide-linux-x64-gnu @unrs/resolver-binding-linux-x64-gnu --no-save

- name: Typecheck
run: npm run typecheck

Expand Down
1 change: 1 addition & 0 deletions .github/workflows/secret-guard.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ jobs:
PATTERNS="${MAC_HOME}[^/]+/|${LINUX_HOME}[^/]+/"
MATCHES=$(git grep -nE "$PATTERNS" -- '*.md' '*.ts' '*.tsx' '*.js' '*.json' '*.yaml' '*.yml' '*.sh' '*.py' \
| grep -v '^.github/workflows/secret-guard.yml:' \
| grep -v '^\.planning/' \
| grep -vE '(/Users/yourname/|/Users/USERNAME/|/Users/\$USER/|/home/yourname/|/home/USERNAME/|/home/\$USER/)' \
|| true)
if [ -n "$MATCHES" ]; then
Expand Down
24 changes: 12 additions & 12 deletions apps/memroos/src/__tests__/proxy.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -183,44 +183,44 @@ describe("proxy", () => {

it("requires app-host session auth for the Understand page", async () => {
const response = await proxy(
new NextRequest("https://memroos.epiloguecapital.com/understand?token=graph-token", {
headers: { host: "memroos.epiloguecapital.com" },
new NextRequest("https://memroos.example.com/understand?token=graph-token", {
headers: { host: "memroos.example.com" },
})
);

expect(response.status).toBe(307);
expect(response.headers.get("location")).toBe("https://memroos.epiloguecapital.com/login");
expect(response.headers.get("location")).toBe("https://memroos.example.com/login");
});

it("requires app-host session auth before Understand JSON token authorization", async () => {
const response = await proxy(
new NextRequest("https://memroos.epiloguecapital.com/knowledge-graph.json?token=graph-token", {
headers: { host: "memroos.epiloguecapital.com" },
new NextRequest("https://memroos.example.com/knowledge-graph.json?token=graph-token", {
headers: { host: "memroos.example.com" },
})
);

expect(response.status).toBe(307);
expect(response.headers.get("location")).toBe("https://memroos.epiloguecapital.com/login");
expect(response.headers.get("location")).toBe("https://memroos.example.com/login");
});

it("treats the Epilogue Capital MemRoOS alias as an app host", async () => {
it("treats a custom domain as an app host", async () => {
const loginResponse = await proxy(
new NextRequest("https://memroos.epiloguecapital.com/login", {
headers: { host: "memroos.epiloguecapital.com" },
new NextRequest("https://memroos.example.com/login", {
headers: { host: "memroos.example.com" },
})
);

expect(loginResponse.status).toBe(200);
expect(loginResponse.headers.get("location")).toBeNull();

const appResponse = await proxy(
new NextRequest("https://memroos.epiloguecapital.com/dispatch", {
headers: { host: "memroos.epiloguecapital.com" },
new NextRequest("https://memroos.example.com/dispatch", {
headers: { host: "memroos.example.com" },
})
);

expect(appResponse.status).toBe(307);
expect(appResponse.headers.get("location")).toBe("https://memroos.epiloguecapital.com/login");
expect(appResponse.headers.get("location")).toBe("https://memroos.example.com/login");
});

it("serves the public landing on memroos.localhost for local preview", async () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,15 @@ const { POST: memoryPost } = await import("@/app/api/memory/add/route");
function makeDispatchRequest(body: object) {
return new Request("http://localhost/api/dispatch", {
method: "POST",
headers: { "content-type": "application/json", "x-forwarded-for": "10.0.0.1" },
headers: { "content-type": "application/json", "x-forwarded-for": "203.0.113.1" },
body: JSON.stringify(body),
});
}

function makeMemoryRequest(body: object) {
return new Request("http://localhost/api/memory/add", {
method: "POST",
headers: { "content-type": "application/json", "x-forwarded-for": "10.0.0.2" },
headers: { "content-type": "application/json", "x-forwarded-for": "203.0.113.2" },
body: JSON.stringify(body),
});
}
Expand Down
12 changes: 6 additions & 6 deletions apps/memroos/src/lib/__tests__/env.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@ import { loadMemroosEnv } from "../env";

describe("loadMemroosEnv", () => {
it("applies local development defaults", () => {
const env = loadMemroosEnv({ HOME: "/Users/tester" });
const env = loadMemroosEnv({ HOME: "/Users/USERNAME" });

expect(env.MEM0_URL).toBe("http://localhost:3201");
expect(env.SQLITE_DB_PATH).toBe("data/conversations.db");
expect(env.AGENT_CONFIGS_PATH).toBe("/Users/tester/github/knowledge/agent-configs");
expect(env.CLAUDE_MEMORY_PATH).toBe("/Users/tester/.claude/projects");
expect(env.AGENT_CONFIGS_PATH).toBe("/Users/USERNAME/github/knowledge/agent-configs");
expect(env.CLAUDE_MEMORY_PATH).toBe("/Users/USERNAME/.claude/projects");
});

it("preserves explicit configured values", () => {
const env = loadMemroosEnv({
HOME: "/Users/tester",
HOME: "/Users/USERNAME",
MEM0_URL: "http://127.0.0.1:3201",
SQLITE_DB_PATH: "/tmp/memroos.db",
HERMES_MEMORY_PATH: "/tmp/hermes",
Expand All @@ -25,10 +25,10 @@ describe("loadMemroosEnv", () => {
});

it("fails closed on malformed configured values", () => {
expect(() => loadMemroosEnv({ HOME: "/Users/tester", MEM0_URL: "localhost:3201" })).toThrow(
expect(() => loadMemroosEnv({ HOME: "/Users/USERNAME", MEM0_URL: "localhost:3201" })).toThrow(
/Invalid environment configuration/
);
expect(() => loadMemroosEnv({ HOME: "/Users/tester", SQLITE_DB_PATH: "" })).toThrow(
expect(() => loadMemroosEnv({ HOME: "/Users/USERNAME", SQLITE_DB_PATH: "" })).toThrow(
/Invalid environment configuration/
);
});
Expand Down
2 changes: 1 addition & 1 deletion apps/memroos/src/lib/__tests__/okf.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ describe("OKF memory bundle support", () => {
agent: "claude",
date: "2026-06-13T18:00:00.000Z",
type: "project",
source: "/Users/luis/.claude/projects/foo/memory/foo.md",
source: "/Users/USERNAME/.claude/projects/foo/memory/foo.md",
};

it("maps a memory entry into a conformant OKF concept with MemRoOS extension fields", () => {
Expand Down
14 changes: 1 addition & 13 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
"install:skill-curation": "node scripts/install-skill-curation-launchd.mjs",
"profiles:check": "node scripts/validate-operating-profiles.mjs",
"first-run:check": "node scripts/first-run-wizard.mjs --check",
"install": "bash install.sh",
"setup": "bash install.sh",
"check:roadmap-priority": "node scripts/check-roadmap-priority.mjs"
},
"overrides": {
Expand Down
2 changes: 1 addition & 1 deletion services/memory/healthcheck.sh
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ TG_CHAT_ID="${TELEGRAM_CHAT_ID:-}"
DISCORD_WEBHOOK_URL="${DISCORD_KNOWLEDGE_WEBHOOK:-}"
SENDGRID_API_KEY="${SENDGRID_API_KEY:-}"
ALERT_EMAIL_FROM="${ALERT_EMAIL_FROM:-alerts@memroos.ai}"
ALERT_EMAIL_TO="${ALERT_EMAIL_TO:-${ALERT_EMAIL:-luis@epiloguecapital.com}}"
ALERT_EMAIL_TO="${ALERT_EMAIL_TO:-${ALERT_EMAIL:-alerts@example.com}}"
MEM0_CPU_ALERT_THRESHOLD="${MEM0_CPU_ALERT_THRESHOLD:-200}" # % — triggers at 2+ cores

mkdir -p "$ALERT_STATE_DIR"
Expand Down
Loading