wowok_agent
Version:
Create, collaborate, and transact on your own terms with the AI-driven web3 collaboration protocol.
135 lines (122 loc) • 5.95 kB
text/typescript
/**
* Provide AI with Basic WoWok event queries:
* for real-time detail tracking.
*/
import { Protocol } from 'wowok';
export interface EventBase {
id: {eventSeq: string; txDigest: string};
sender: string;
type: string | 'NewArbEvent' | 'NewOrderEvent' | 'NewProgressEvent' | 'PresentServiceEvent';
type_raw: string;
time: string;
}
export interface NewArbEvent extends EventBase {
arb: string,
arbitration: string,
order: string,
}
export interface NewOrderEvent extends EventBase {
order: string,
service: string,
progress?: string | null,
amount: string,
}
export interface NewProgressEvent extends EventBase {
progress: string,
machine: string,
task?: string | null,
}
export interface PresentServiceEvent extends EventBase {
demand: string,
service: string,
recommendation: string,
}
export interface NewEntityEvent extends EventBase {
resource: string,
address: string,
}
export interface EventAnswer {
data: EventBase[];
hasNextPage: boolean;
nextCursor?: {eventSeq: string; txDigest: string} | null;
}
export interface EventCursor {
eventSeq: string;
txDigest: string
}
export interface EventQuery {
type: 'OnNewArb' | 'OnPresentService' | 'OnNewProgress' | 'OnNewOrder';
/** optional paging cursor */
cursor?: EventCursor | null | undefined;
/** maximum number of items per page, default to [QUERY_MAX_RESULT_LIMIT] if not specified. */
limit?: number | null | undefined;
/** query result ordering, default to false (ascending order), oldest record first. */
order?: 'ascending' | 'descending' | null | undefined;
}
export const query_events_json = async (json:string) : Promise<string> => {
try {
const q : EventQuery = JSON.parse(json);
return JSON.stringify({data:await query_events(q)});
} catch (e) {
return JSON.stringify({error:e?.toString()})
}
}
export const query_events = (query: EventQuery) : Promise<EventAnswer | undefined> => {
switch(query.type) {
case 'OnNewArb':
return newArbEvents(query.cursor, query.limit, query.order)
case 'OnNewProgress':
return newProgressEvents(query.cursor, query.limit, query.order)
case 'OnPresentService':
return presentServiceEvents(query.cursor, query.limit, query.order)
case 'OnNewOrder':
return newOrderEvents(query.cursor, query.limit, query.order)
}
}
const newArbEvents = async(cursor?: EventCursor | null, limit?: number | null, order?: 'ascending' | 'descending' | null) : Promise<EventAnswer> => {
return await events(Protocol.Instance().package('wowok') + '::arb::NewArbEvent', cursor, limit, order)
}
const presentServiceEvents = async(cursor?: EventCursor | null, limit?: number | null, order?: 'ascending' | 'descending' | null) : Promise<EventAnswer> => {
return await events(Protocol.Instance().package('wowok') + '::demand::PresentEvent', cursor, limit, order)
}
const newProgressEvents = async(cursor?: EventCursor | null, limit?: number | null, order?: 'ascending' | 'descending' | null) : Promise<EventAnswer> => {
return await events(Protocol.Instance().package('wowok') + '::progress::NewProgressEvent', cursor, limit, order)
}
const newOrderEvents = async(cursor?: EventCursor | null, limit?: number | null, order?: 'ascending' | 'descending' | null) : Promise<EventAnswer> => {
return await events(Protocol.Instance().package('wowok') + '::order::NewOrderEvent', cursor, limit, order)
}
const events = async(type:string, cursor?: EventCursor | null, limit?: number | null, order?: 'ascending' | 'descending' | null) : Promise<EventAnswer> => {
const res = await Protocol.Client().queryEvents({query:{MoveEventType:type}, cursor:cursor, limit:limit, order:order});
const data = res?.data?.map((v:any) => {
if (v?.packageId === Protocol.Instance().package('wowok')) {
if (v?.type?.includes('::order::NewOrderEvent')) {
return {
id: v?.id, time: v?.timestampMs, type_raw:v?.type, sender:v?.sender, type:'NewOrderEvent',
order: v?.parsedJson?.object, service: v?.parsedJson?.service, progress: v?.parsedJson?.progress, amount: v?.parsedJson?.amount
} as NewOrderEvent
} else if (v?.type?.includes('::demand::PresentEvent')) {
return {
id: v?.id, time: v?.timestampMs, type_raw:v?.type, sender:v?.sender, type:'NewOrderEvent',
demand:v?.parsedJson?.object, service: v?.parsedJson?.service, recommendation:v?.parsedJson?.tips
} as PresentServiceEvent
} else if (v?.type?.includes('::progress::NewProgressEvent')) {
return {
id: v?.id, time: v?.timestampMs, type_raw:v?.type, sender:v?.sender, type:'NewOrderEvent',
progress:v?.parsedJson?.object, machine: v?.parsedJson?.machine, task:v?.parsedJson?.task
} as NewProgressEvent
} else if (v?.type?.includes('::arb::NewArbEvent')) {
return {
id: v?.id, time: v?.timestampMs, type_raw:v?.type, sender:v?.sender, type:'NewOrderEvent',
arb:v?.parsedJson?.object, arbitration:v?.parsedJson?.arbitration, order:v?.parsedJson?.order
} as NewArbEvent
} else if (v?.type?.includes('::entity::NewEntityEvent')) {
return {
id: v?.id, time: v?.timestampMs, type_raw:v?.type, sender:v?.sender, type:'NewOrderEvent',
resource:v?.parsedJson?.resource?.some, address:v?.parsedJson?.target,
} as NewEntityEvent
}
}
return {id: v?.id, time: v?.timestampMs, type_raw:v?.type, sender:v?.sender, type:'',}
})
return {data:data, hasNextPage:res?.hasNextPage, nextCursor:res?.nextCursor}
}