feat: initial public release (MAESTRO v0.1.0)

Open-source release of MAESTRO, an agent orchestration platform that runs
LLM-driven tasks through sandboxed tools, with a web UI. Apache-2.0.
See README.md and docs/ (getting-started, configuration, architecture).
This commit is contained in:
clade
2026-06-03 04:01:14 +00:00
committed by swallow
commit 7049a874f3
825 changed files with 184390 additions and 0 deletions
+31
View File
@@ -0,0 +1,31 @@
---
description: E2E click+read fixture for the Playwright runtime
params:
- name: title
type: string
---
/**
* Loads a data: URL (no network), clicks a button, and returns the textContent
* the click revealed. Exercises the full chromium spin-up + main({ context })
* dispatch path without needing a real HTTP server.
*/
async function main({ context, params }) {
const html = `data:text/html,${encodeURIComponent(`
<!doctype html>
<html><body>
<h1 id="title">${params.title}</h1>
<button id="reveal" onclick="document.getElementById('out').textContent='revealed:' + document.getElementById('title').textContent">Reveal</button>
<span id="out"></span>
</body></html>
`)}`;
const page = await context.newPage();
try {
await page.goto(html);
await page.locator('#reveal').click();
return await page.locator('#out').textContent();
} finally {
await page.close();
}
}
module.exports = main;
+14
View File
@@ -0,0 +1,14 @@
/**
* Browser-macro without frontmatter. Verifies the playwright runtime doesn't
* insist on session_profile_id when the script doesn't ask for one.
*/
async function main({ context }) {
const page = await context.newPage();
try {
await page.goto('data:text/html,<title>hello</title><body>no-session</body>');
return await page.title();
} finally {
await page.close();
}
}
module.exports = main;
+10
View File
@@ -0,0 +1,10 @@
/**
* Returns a circular object — tests that the runner handles JSON.stringify failure
* gracefully (reports serializationError instead of crashing the child process).
*/
async function main() {
const o = { a: 1 };
o.self = o;
return o;
}
module.exports = main;
+25
View File
@@ -0,0 +1,25 @@
---
description: Log in and grab the dashboard table
params:
- name: user
type: string
- name: pass
type: string
session_profile_id: 7
recording_source: rec-test.json
---
async function main({ context, params }) {
const page = await context.newPage();
try {
await page.goto('https://example.com/login');
await page.locator('[data-testid="username"]').fill(params.user);
await page.locator('[data-testid="password"]').fill(params.pass);
await page.locator('button[type="submit"]').click();
const __text = await page.locator('[data-testid="dashboard"]').textContent();
return __text;
} finally {
await page.close();
}
}
module.exports = main;
+6
View File
@@ -0,0 +1,6 @@
async function main() {
console.error('hello from stderr');
console.error('second line');
return 'done';
}
module.exports = main;
+2
View File
@@ -0,0 +1,2 @@
async function main() { return 42; }
module.exports = main;
+2
View File
@@ -0,0 +1,2 @@
async function main() { throw new Error('boom from user script'); }
module.exports = main;
+7
View File
@@ -0,0 +1,7 @@
// Hangs forever — keeps the event loop alive so the parent's timeout fires.
async function main() {
await new Promise((_resolve) => {
setInterval(() => {}, 1_000_000);
});
}
module.exports = main;