BREAKING CHANGE: Convert repository to IronClaw-only package with strict external dependency on globally installed `openclaw` runtime. ### Changes - Remove entire OpenClaw core source from repository (src/agents/*, src/acp/*, src/commands/*, and related modules) - Implement CLI delegation: non-bootstrap commands now delegate to global `openclaw` binary via external contract - Remove local OpenClaw path resolution from web app; always spawn global `openclaw` binary instead of local scripts - Rename package.json scripts: `pnpm openclaw` → `pnpm ironclaw`, `openclaw:rpc` → `ironclaw:rpc` - Update bootstrap flow to verify and install global OpenClaw when missing - Migrate web workspace/profile logic to align with OpenClaw state paths - Add migration contract tests for stream-json, session subscribe, and profile resolution behaviors - Update build/release pipeline for IronClaw-only artifacts - Update documentation for new peer + global installation model ### Architecture IronClaw is now strictly a frontend/UI/bootstrap layer: - `npx ironclaw` bootstraps OpenClaw (if missing), runs guided onboarding - IronClaw UI serves on localhost:3100 - OpenClaw Gateway runs on standard port 18789 - Communication via stable CLI contracts and Gateway WebSocket protocol only ### Migration Users must have `openclaw` installed globally: npm install -g openclaw Existing IronClaw profiles and sessions remain compatible through gateway protocol stability. Refs: bootstrap_dev_testing, ironclaw_frontend_split, strict-external-openclaw
32 lines
847 B
TypeScript
32 lines
847 B
TypeScript
import { buildDispatchInboundCaptureMock } from "./dispatch-inbound-capture.js";
|
|
|
|
// Define locally since original module was removed
|
|
type MsgContext = {
|
|
senderId: string;
|
|
channelId: string;
|
|
chatId: string;
|
|
text: string;
|
|
[key: string]: unknown;
|
|
};
|
|
|
|
export type InboundContextCapture = {
|
|
ctx: MsgContext | undefined;
|
|
};
|
|
|
|
export function createInboundContextCapture(): InboundContextCapture {
|
|
return { ctx: undefined };
|
|
}
|
|
|
|
export async function buildDispatchInboundContextCapture(
|
|
importOriginal: <T extends Record<string, unknown>>() => Promise<T>,
|
|
capture: InboundContextCapture,
|
|
) {
|
|
const actual = await importOriginal<Record<string, unknown>>();
|
|
return buildDispatchInboundCaptureMock(
|
|
actual as { dispatchInbound?: (ctx: unknown) => Promise<void> },
|
|
(ctx) => {
|
|
capture.ctx = ctx as MsgContext;
|
|
},
|
|
);
|
|
}
|