mirror of
https://github.com/stablyai/orca.git
synced 2026-11-13 09:27:29 +00:00
* feat(plugins): build-less TypeScript workers A worker's main may be .ts/.mts. The plugin host installs module.registerHooks scoped to the plugin folder: .ts files are transpiled with the frames' sucrase options (lines kept, inline source map, source maps on), relative imports fall back to the frames' candidate files, and a value import of the type-only 'orca/worker' fails with a clear error. Needs engines.orca >=1.4.246. * feat(plugins): components panels hot reload with their state - In dev folders a save swaps only the hidden guest: keyed memory atoms are handed to the new guest (ui.retain → ui.hydrate memory), dropped when an atom's version changes. - A save that fails to load keeps the last good render and shows an inline file:line:col error banner; the next good save clears it. A subtle Reloaded mark follows a reload. - Transpile and import errors carry line and column; dev worker restarts keep storage. * feat(plugins): orca plugin dev watch One command for the inner loop: refreshes .orca/types, dev-loads the folder, follows its frame and worker logs (plugins.getLogs gains an optional cursor), prints reloads (optional devChangeCount on list entries) and status changes, and unloads on Ctrl-C. --json streams NDJSON events for agents. * feat(skills): orca-plugin-authoring bundled skill guide A guide for agents to build Orca plugins end to end (decision table, build-less rules, the dev watch loop, test/check, validate, release-entry, approvals, gotchas) with references generated from the component catalog, host API table, event schemas, manifest schema and CLI specs, checked for drift. Fixes the components template's Reset to set(count, 0). * feat(plugins): orca plugin dev watch --check; test kit details in the authoring skill - --check runs orca plugin check after the load and after each reload (one at a time; saves made meanwhile fold into one rerun) and prints each panel's render or errors inline, as a `check` event with --json. Local folders only, since it runs the plugin's code here. - The orca-plugin-authoring guide's Test and check section now documents orca plugin test and check from #36969 exactly (JSON results, exit codes, test placement, the orca/testing kit and its common mistakes), and the loop uses dev watch --check. * refactor(plugins): move the components renderer's timing and helper constants to their own module
44 lines
1.6 KiB
JavaScript
44 lines
1.6 KiB
JavaScript
// Loads src TypeScript modules from a plain Node script, so the generator and the validator run the
|
|
// exact runtime schemas without a TypeScript loader.
|
|
import { mkdirSync, mkdtempSync, rmSync } from 'node:fs'
|
|
import { createRequire } from 'node:module'
|
|
import path from 'node:path'
|
|
import * as esbuild from 'esbuild'
|
|
|
|
export const REPO_ROOT = path.resolve(import.meta.dirname, '..', '..')
|
|
|
|
function loadBundle(entry) {
|
|
// Why under out/: the bundle keeps zod external, so it must resolve from the repo's node_modules.
|
|
mkdirSync(path.join(REPO_ROOT, 'out'), { recursive: true })
|
|
const buildDir = mkdtempSync(path.join(REPO_ROOT, 'out', 'plugin-schemas-'))
|
|
try {
|
|
const outfile = path.join(buildDir, 'bundle.cjs')
|
|
esbuild.buildSync({
|
|
...entry,
|
|
bundle: true,
|
|
platform: 'node',
|
|
format: 'cjs',
|
|
outfile,
|
|
logLevel: 'error',
|
|
packages: 'external'
|
|
})
|
|
return createRequire(import.meta.url)(outfile)
|
|
} finally {
|
|
rmSync(buildDir, { recursive: true, force: true })
|
|
}
|
|
}
|
|
|
|
export function loadPluginSchemaModule(fileName) {
|
|
return loadBundle({ entryPoints: [path.join(REPO_ROOT, 'src', 'shared', 'plugins', fileName)] })
|
|
}
|
|
|
|
/** One bundle for several repo-relative modules, exposed as `{ [name]: moduleExports }`. */
|
|
export function loadRepoTypeScriptModules(modules) {
|
|
const contents = Object.entries(modules)
|
|
.map(([name, file]) => `export * as ${name} from ${JSON.stringify(`./${file}`)}`)
|
|
.join('\n')
|
|
return loadBundle({
|
|
stdin: { contents, resolveDir: REPO_ROOT, loader: 'ts', sourcefile: 'modules.ts' }
|
|
})
|
|
}
|