import React, { useState, useEffect, createContext, useContext } from 'react';
import type {
ActionMessages,
AppContextValue,
PendingActionMessage,
ChatMessages,
SubtleAiImageOpts,
SubtleAiCompleteOpts,
GetMemoryOpts,
AgentProps,
ActionProps,
PromptProps,
ParserProps,
PerceptionProps,
SchedulerProps,
ServerProps,
} from './types';
import {
AppContext,
EpochContext,
} from './context';
import {
DefaultAgentComponents,
} from './default-components';
// Note: this comment is used to remove imports before running tsdoc
// END IMPORTS
//
const makeSymbol = () => Symbol('propsKey');
/**
* Represents an agent component.
*
* The `Agent` component is used to register an agent with the application context.
* It takes an `AgentProps` object as its props and registers the agent with the app context.
* The `Agent` component should be used as a parent component for other components that need access to the agent.
*
* @param props The props for the `Agent` component.
* @returns The rendered `Agent` component.
*
* @example
* ```tsx
*
* {/* child components *\/}
*
* ```
*/
export const Agent: React.FC = (props: AgentProps) => {
const [symbol, setSymbol] = useState(makeSymbol);
// bind to app context
const appContext = (useContext(AppContext) as unknown) as AppContextValue;
useEffect(() => {
// console.log('Agent component useEffect', props, appContext);
return () => {
// console.log('Agent component cleanup', props, appContext);
appContext.unregisterAgent(symbol);
};
}, [appContext]);
appContext.registerAgent(symbol, props);
return React.createElement(React.Fragment, {}, [
React.createElement(DefaultAgentComponents, { key: 0 }),
React.createElement(React.Fragment, { key: 1 }, props.children),
]);
};
export const RawAgent: React.FC = (props: AgentProps) => {
const [symbol, setSymbol] = useState(makeSymbol);
// bind to app context
const appContext = (useContext(AppContext) as unknown) as AppContextValue;
useEffect(() => {
// console.log('Agent component useEffect', props, appContext);
return () => {
// console.log('Agent component cleanup', props, appContext);
appContext.unregisterAgent(symbol);
};
}, [appContext]);
appContext.registerAgent(symbol, props);
return React.createElement(React.Fragment, {}, props.children);
};
export const Action: React.FC = (props: ActionProps) => {
const [symbol, setSymbol] = useState(makeSymbol);
// bind to app context
const appContext = (useContext(AppContext) as unknown) as AppContextValue;
useEffect(() => {
// console.log('Action component useEffect', props, appContext);
return () => {
// console.log('Action component cleanup', props, appContext);
appContext.unregisterAction(symbol);
};
}, [appContext]);
appContext.registerAction(symbol, props);
return null;
};
export const Prompt: React.FC = (props: PromptProps) => {
const [symbol, setSymbol] = useState(makeSymbol);
// bind to app context
const appContext = (useContext(AppContext) as unknown) as AppContextValue;
useEffect(() => {
// console.log('Prompt unregister', props, appContext);
return () => {
// console.log('Prompt register', props, appContext);
appContext.unregisterPrompt(symbol);
};
}, [appContext]);
appContext.registerPrompt(symbol, props);
return React.createElement(React.Fragment, {}, props.children);
};
export const Parser: React.FC = (props: ParserProps) => {
const [symbol, setSymbol] = useState(makeSymbol);
// bind to app context
const appContext = (useContext(AppContext) as unknown) as AppContextValue;
useEffect(() => {
// console.log('Parser component useEffect', props, appContext);
return () => {
// console.log('Parser component cleanup', props, appContext);
appContext.unregisterParser(symbol);
};
}, [appContext]);
appContext.registerParser(symbol, props);
return null;
};
export const Perception: React.FC = (props: PerceptionProps) => {
const [symbol, setSymbol] = useState(makeSymbol);
// bind to app context
const appContext = (useContext(AppContext) as unknown) as AppContextValue;
useEffect(() => {
// console.log('Perception component useEffect', props, appContext);
return () => {
// console.log('Perception component cleanup', props, appContext);
appContext.unregisterPerception(symbol);
};
}, [appContext]);
appContext.registerPerception(symbol, props);
return null;
};
export const Scheduler: React.FC = (props: SchedulerProps) => {
const [symbol, setSymbol] = useState(makeSymbol);
// bind to app context
const appContext = (useContext(AppContext) as unknown) as AppContextValue;
useEffect(() => {
// console.log('Schedule component useEffect', props, appContext);
return () => {
// console.log('Schedule component cleanup', props, appContext);
appContext.unregisterScheduler(symbol);
};
}, [appContext]);
appContext.registerScheduler(symbol, props);
return null;
};
export const Server: React.FC = (props: ServerProps) => {
const [symbol, setSymbol] = useState(makeSymbol);
// bind to app context
const appContext = (useContext(AppContext) as unknown) as AppContextValue;
useEffect(() => {
// console.log('Schedule component useEffect', props, appContext);
return () => {
// console.log('Schedule component cleanup', props, appContext);
appContext.unregisterServer(symbol);
};
}, [appContext]);
appContext.registerServer(symbol, props);
// return React.createElement(React.Fragment, {}, props.children);
return null;
};
//
export class ExtendableMessageEvent extends MessageEvent