Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
0d179aa
Add missing plugin manifests and remove all legacy name references
ApiliumDevTeam Mar 6, 2026
318886e
Replace ASCII banner art to spell MAYROS instead of legacy project name
ApiliumDevTeam Mar 6, 2026
94c87fd
Replace CLI banner with Mayros pixel avatar art
ApiliumDevTeam Mar 6, 2026
2316ed0
Bump to v0.1.6, fix analytics id hint, add code-tools configSchema, a…
ApiliumDevTeam Mar 6, 2026
a760447
Use dynamic VERSION in TUI welcome screen and sync extensions to 0.1.6
ApiliumDevTeam Mar 6, 2026
efc11e1
Add /mouse toggle and fix /kg empty output
ApiliumDevTeam Mar 6, 2026
188ae09
Disable mouse reporting by default for native text selection
ApiliumDevTeam Mar 7, 2026
e777416
Fix /kg handler to reference available memory tools generically
ApiliumDevTeam Mar 7, 2026
8eb144b
Improve /kg handler with tool fallback and diagnostic hint
ApiliumDevTeam Mar 7, 2026
76b2189
Enable semantic ecosystem plugins by default
ApiliumDevTeam Mar 7, 2026
70e1f25
Allow semantic plugins to start with zero config
ApiliumDevTeam Mar 7, 2026
9ea3818
Enable Cortex auto-start by default and symlink binary
ApiliumDevTeam Mar 7, 2026
fb72cdf
Fix Cortex GitHub repo owner for auto-install and updates
ApiliumDevTeam Mar 7, 2026
3bdd8cf
Change default Cortex port from 8080 to 19090
ApiliumDevTeam Mar 7, 2026
b5f2857
Add Cortex CLI, gateway methods, TUI view, and resilience auto-restart
ApiliumDevTeam Mar 7, 2026
835d36b
Fix SSRF mock coverage for resolvePinnedHostnameWithPolicy in tests
ApiliumDevTeam Mar 7, 2026
fc723b6
Auto-start gateway and Cortex before TUI, adapt sidecar for Cortex 0.3.7
ApiliumDevTeam Mar 7, 2026
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
24 changes: 0 additions & 24 deletions docs/docs.json
Original file line number Diff line number Diff line change
Expand Up @@ -259,30 +259,6 @@
"source": "/camera",
"destination": "/nodes/camera"
},
{
"source": "/clawd",
"destination": "/start/mayros"
},
{
"source": "/start/clawd",
"destination": "/start/mayros"
},
{
"source": "/start/clawd/",
"destination": "/start/mayros"
},
{
"source": "/clawhub",
"destination": "/tools/skills-hub"
},
{
"source": "/clawdhub",
"destination": "/tools/skills-hub"
},
{
"source": "/tools/clawdhub",
"destination": "/tools/skills-hub"
},
{
"source": "/configuration",
"destination": "/gateway/configuration"
Expand Down
9 changes: 6 additions & 3 deletions extensions/agent-mesh/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ export type AgentMeshConfig = {

const DEFAULT_NAMESPACE = "mayros";
const DEFAULT_HOST = "127.0.0.1";
const DEFAULT_PORT = 8080;
const DEFAULT_PORT = 19090;
const DEFAULT_MAX_SHARED_NAMESPACES = 50;
const DEFAULT_DELEGATION_TIMEOUT = 300;
const DEFAULT_AUTO_MERGE = true;
Expand Down Expand Up @@ -192,8 +192,11 @@ export function parseBackgroundConfig(raw: unknown): BackgroundConfig {

export const agentMeshConfigSchema = {
parse(value: unknown): AgentMeshConfig {
if (!value || typeof value !== "object" || Array.isArray(value)) {
throw new Error("agent mesh config required");
if (value === null || value === undefined) {
value = {};
}
if (typeof value !== "object" || Array.isArray(value)) {
throw new Error("agent mesh config must be an object");
}
const cfg = value as Record<string, unknown>;
assertAllowedKeys(
Expand Down
14 changes: 7 additions & 7 deletions extensions/agent-mesh/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ describe("agent mesh config", () => {
const config = agentMeshConfigSchema.parse({});

expect(config.cortex.host).toBe("127.0.0.1");
expect(config.cortex.port).toBe(8080);
expect(config.cortex.port).toBe(19090);
expect(config.cortex.authToken).toBe(undefined);
expect(config.agentNamespace).toBe("mayros");
expect(config.mesh.maxSharedNamespaces).toBe(50);
Expand Down Expand Up @@ -721,7 +721,7 @@ describe("delegation engine", () => {
};

const nsMgr = new NamespaceManager(mockClient, "mayros", 50);
const cortexClient = new CortexClient({ host: "127.0.0.1", port: 8080 });
const cortexClient = new CortexClient({ host: "127.0.0.1", port: 19090 });
const engine = new DelegationEngine(cortexClient, "mayros", nsMgr);

const ctx = await engine.prepareContext("Review the TypeScript backend code", "parent-agent");
Expand Down Expand Up @@ -761,7 +761,7 @@ describe("delegation engine", () => {
};

const nsMgr = new NamespaceManager(mockClient, "mayros", 50);
const cortexClient = new CortexClient({ host: "127.0.0.1", port: 8080 });
const cortexClient = new CortexClient({ host: "127.0.0.1", port: 19090 });
const engine = new DelegationEngine(cortexClient, "mayros", nsMgr);

const ctx = {
Expand Down Expand Up @@ -803,7 +803,7 @@ describe("delegation engine", () => {
};

const nsMgr = new NamespaceManager(mockClient, "mayros", 50);
const cortexClient = new CortexClient({ host: "127.0.0.1", port: 8080 });
const cortexClient = new CortexClient({ host: "127.0.0.1", port: 19090 });
const engine = new DelegationEngine(cortexClient, "mayros", nsMgr);

const result = engine.getInjectedContext("nonexistent");
Expand Down Expand Up @@ -898,7 +898,7 @@ describe("knowledge fusion", () => {

try {
const fusionEngine = new KnowledgeFusion(
new CortexClient({ host: "127.0.0.1", port: 8080 }),
new CortexClient({ host: "127.0.0.1", port: 19090 }),
"mayros",
);

Expand All @@ -924,7 +924,7 @@ describe("knowledge fusion", () => {
const { KnowledgeFusion } = await import("./knowledge-fusion.js");

const fusion = new KnowledgeFusion(
new CortexClient({ host: "127.0.0.1", port: 8080 }),
new CortexClient({ host: "127.0.0.1", port: 19090 }),
"mayros",
);
expect(fusion).toBeTruthy();
Expand All @@ -934,7 +934,7 @@ describe("knowledge fusion", () => {
const { KnowledgeFusion } = await import("./knowledge-fusion.js");

const fusion = new KnowledgeFusion(
new CortexClient({ host: "127.0.0.1", port: 8080, authToken: "Bearer secret" }),
new CortexClient({ host: "127.0.0.1", port: 19090, authToken: "Bearer secret" }),
"mayros",
);
expect(fusion).toBeTruthy();
Expand Down
2 changes: 1 addition & 1 deletion extensions/agent-mesh/knowledge-fusion.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ describe("KnowledgeFusion", () => {
});

function createFusion(ns = "mayros") {
return new KnowledgeFusion(new CortexClient({ host: "localhost", port: 8080 }), ns);
return new KnowledgeFusion(new CortexClient({ host: "localhost", port: 19090 }), ns);
}

// ----- additive strategy -----
Expand Down
2 changes: 1 addition & 1 deletion extensions/agent-mesh/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@apilium/mayros-agent-mesh",
"version": "0.1.4",
"version": "0.1.6",
"private": true,
"description": "Mayros multi-agent coordination mesh with shared namespaces, delegation, and knowledge fusion",
"type": "module",
Expand Down
50 changes: 50 additions & 0 deletions extensions/analytics/mayros.plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
{
"id": "analytics",
"kind": "observability",
"uiHints": {
"enabled": {
"label": "Enable Analytics",
"help": "Opt-in usage analytics collection (default: false)"
},
"privacyMode": {
"label": "Privacy Mode",
"placeholder": "anonymous",
"help": "\"anonymous\" hashes IDs, \"identified\" keeps raw, \"off\" disables collection"
},
"endpoint": {
"label": "Endpoint",
"placeholder": "https://analytics.apilium.com/batch",
"help": "HTTP endpoint for batch event delivery (empty = local-only logging)"
},
"maxBufferSize": {
"label": "Max Buffer Size",
"placeholder": "500",
"advanced": true,
"help": "Maximum events in buffer before flush"
},
"flushIntervalMs": {
"label": "Flush Interval (ms)",
"placeholder": "30000",
"advanced": true,
"help": "Interval between automatic flushes"
},
"eventTtlMs": {
"label": "Event TTL (ms)",
"placeholder": "3600000",
"advanced": true,
"help": "Time-to-live for buffered events"
}
},
"configSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"enabled": { "type": "boolean" },
"privacyMode": { "type": "string", "enum": ["anonymous", "identified", "off"] },
"endpoint": { "type": "string" },
"maxBufferSize": { "type": "number", "minimum": 1, "maximum": 10000 },
"flushIntervalMs": { "type": "number", "minimum": 1000 },
"eventTtlMs": { "type": "number", "minimum": 60000 }
}
}
}
4 changes: 2 additions & 2 deletions extensions/analytics/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@apilium/mayros-plugin-analytics",
"version": "0.1.0",
"name": "@apilium/mayros-analytics",
"version": "0.1.6",
"private": true,
"type": "module",
"main": "index.ts",
Expand Down
2 changes: 1 addition & 1 deletion extensions/bash-sandbox/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@apilium/mayros-bash-sandbox",
"version": "0.1.4",
"version": "0.1.6",
"private": true,
"description": "Bash command sandbox with domain allowlist, command blocklist, and dangerous pattern detection",
"type": "module",
Expand Down
2 changes: 1 addition & 1 deletion extensions/bluebubbles/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@apilium/mayros-bluebubbles",
"version": "0.1.4",
"version": "0.1.6",
"description": "Mayros BlueBubbles channel plugin",
"license": "MIT",
"type": "module",
Expand Down
25 changes: 25 additions & 0 deletions extensions/browser-automation/mayros.plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"id": "browser-automation",
"kind": "tool",
"uiHints": {
"cdpPort": {
"label": "CDP Port",
"placeholder": "9222",
"help": "Chrome DevTools Protocol remote debugging port"
},
"cdpHost": {
"label": "CDP Host",
"placeholder": "127.0.0.1",
"advanced": true,
"help": "Hostname where Chrome is listening for CDP connections"
}
},
"configSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"cdpPort": { "type": "number", "minimum": 1, "maximum": 65535 },
"cdpHost": { "type": "string" }
}
}
}
2 changes: 1 addition & 1 deletion extensions/ci-plugin/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@apilium/mayros-ci-plugin",
"version": "0.1.4",
"version": "0.1.6",
"description": "CI/CD pipeline integration for Mayros — GitHub Actions and GitLab CI providers",
"type": "module",
"dependencies": {
Expand Down
14 changes: 12 additions & 2 deletions extensions/ci-plugin/providers/github.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,12 @@ describe("GitHubProvider", () => {
});

it("triggerRun sends correct payload", async () => {
mf().mockResolvedValue({ ok: true, status: 204 } as Response);
// First call is the dispatch (204 no body), subsequent calls are polling
mf()
.mockResolvedValueOnce({ ok: true, status: 204 } as Response)
.mockResolvedValue(
jsonResponse({ total_count: 1, workflow_runs: [makeRun({ head_branch: "main" })] }),
);

const run = await provider.triggerRun("owner/repo", {
branch: "main",
Expand All @@ -148,7 +153,12 @@ describe("GitHubProvider", () => {
});

it("triggerRun defaults to ci.yml workflow", async () => {
mf().mockResolvedValue({ ok: true, status: 204 } as Response);
// First call is the dispatch (204 no body), subsequent calls are polling
mf()
.mockResolvedValueOnce({ ok: true, status: 204 } as Response)
.mockResolvedValue(
jsonResponse({ total_count: 1, workflow_runs: [makeRun({ head_branch: "main" })] }),
);

await provider.triggerRun("owner/repo", { branch: "main" });

Expand Down
7 changes: 5 additions & 2 deletions extensions/code-indexer/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,11 @@ const DEFAULT_EXTENSIONS = [".ts", ".tsx", ".js", ".jsx", ".mts", ".mjs"];

export const codeIndexerConfigSchema = {
parse(value: unknown): CodeIndexerConfig {
if (!value || typeof value !== "object" || Array.isArray(value)) {
throw new Error("code-indexer config required");
if (value === null || value === undefined) {
value = {};
}
if (typeof value !== "object" || Array.isArray(value)) {
throw new Error("code-indexer config must be an object");
}
const cfg = value as Record<string, unknown>;
assertAllowedKeys(
Expand Down
2 changes: 1 addition & 1 deletion extensions/code-indexer/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ describe("code-indexer config", () => {

expect(config).toBeDefined();
expect(config?.cortex?.host).toBe("127.0.0.1");
expect(config?.cortex?.port).toBe(8080);
expect(config?.cortex?.port).toBe(19090);
expect(config?.agentNamespace).toBe("mayros");
expect(config?.paths).toEqual(["src", "extensions"]);
expect(config?.maxFiles).toBe(5000);
Expand Down
2 changes: 1 addition & 1 deletion extensions/code-indexer/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@apilium/mayros-code-indexer",
"version": "0.1.4",
"version": "0.1.6",
"private": true,
"description": "Mayros code indexer plugin — regex-based codebase scanning with RDF triple storage in Cortex",
"type": "module",
Expand Down
44 changes: 43 additions & 1 deletion extensions/code-tools/mayros.plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,47 @@
"name": "Code Tools",
"description": "File read/write/edit, glob, grep, ls, and shell tools for local code interaction",
"version": "0.1.4",
"kind": "coding"
"kind": "coding",
"configSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"workspaceRoot": { "type": "string" },
"maxFileSizeBytes": { "type": "number", "minimum": 1024, "maximum": 50000000 },
"shellTimeout": { "type": "number", "minimum": 1000, "maximum": 600000 },
"maxGlobResults": { "type": "number", "minimum": 10, "maximum": 5000 },
"maxGrepResults": { "type": "number", "minimum": 1, "maximum": 500 },
"shellEnabled": { "type": "boolean" }
}
},
"uiHints": {
"workspaceRoot": {
"label": "Workspace Root",
"help": "Root directory for file operations. All paths are resolved relative to this."
},
"maxFileSizeBytes": {
"label": "Max File Size",
"placeholder": "2097152",
"help": "Maximum file size in bytes for read operations (1024-50000000)"
},
"shellTimeout": {
"label": "Shell Timeout",
"placeholder": "120000",
"help": "Maximum execution time in milliseconds for shell commands (1000-600000)"
},
"maxGlobResults": {
"label": "Max Glob Results",
"placeholder": "200",
"help": "Maximum number of glob results returned (10-5000)"
},
"maxGrepResults": {
"label": "Max Grep Results",
"placeholder": "50",
"help": "Maximum number of grep results returned (1-500)"
},
"shellEnabled": {
"label": "Shell Enabled",
"help": "Whether shell command execution is allowed"
}
}
}
2 changes: 1 addition & 1 deletion extensions/code-tools/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@apilium/mayros-code-tools",
"version": "0.1.4",
"version": "0.1.6",
"private": true,
"type": "module",
"dependencies": {
Expand Down
9 changes: 6 additions & 3 deletions extensions/code-tools/tools/code-shell-interactive.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,13 @@ export function registerCodeShellInteractive(api: MayrosPluginApi, cfg: CodeTool
}

const startTime = Date.now();
// Hard cap: cfg.shellTimeout is the max the user can request; use it
// as the outer guard so a hanging PTY never leaks beyond this limit.
// Hard cap: the hard timeout must exceed the soft timeout so the soft
// kill path has a chance to resolve with partial output. Add a 5s
// buffer (capped to cfg.shellTimeout) so a hanging PTY never leaks.
const hardTimeout =
typeof p.timeout === "number" ? timeout : Math.min(60000, cfg.shellTimeout);
typeof p.timeout === "number"
? Math.min(timeout + 5000, cfg.shellTimeout)
: Math.min(60000, cfg.shellTimeout);

return new Promise((resolve, reject) => {
let output = "";
Expand Down
2 changes: 1 addition & 1 deletion extensions/copilot-proxy/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@apilium/mayros-copilot-proxy",
"version": "0.1.4",
"version": "0.1.6",
"private": true,
"description": "Mayros Copilot Proxy provider plugin",
"type": "module",
Expand Down
2 changes: 1 addition & 1 deletion extensions/cortex-sync/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@apilium/mayros-cortex-sync",
"version": "0.1.4",
"version": "0.1.6",
"private": true,
"description": "Cortex DAG synchronization — peer discovery, delta sync, and cross-device knowledge replication",
"type": "module",
Expand Down
Loading
Loading