@olane/o-lane 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1495 -0
- package/dist/src/capabilities/enums/o-capability.type-enum.d.ts +11 -0
- package/dist/src/capabilities/enums/o-capability.type-enum.d.ts.map +1 -0
- package/dist/src/capabilities/enums/o-capability.type-enum.js +11 -0
- package/dist/src/capabilities/index.d.ts +6 -0
- package/dist/src/capabilities/index.d.ts.map +1 -0
- package/dist/src/capabilities/index.js +5 -0
- package/dist/src/capabilities/interfaces/o-capability.config.d.ts +11 -0
- package/dist/src/capabilities/interfaces/o-capability.config.d.ts.map +1 -0
- package/dist/src/capabilities/interfaces/o-capability.config.js +1 -0
- package/dist/src/capabilities/interfaces/o-capability.intelligence-result.d.ts +5 -0
- package/dist/src/capabilities/interfaces/o-capability.intelligence-result.d.ts.map +1 -0
- package/dist/src/capabilities/interfaces/o-capability.intelligence-result.js +3 -0
- package/dist/src/capabilities/interfaces/o-capability.result-interface.d.ts +9 -0
- package/dist/src/capabilities/interfaces/o-capability.result-interface.d.ts.map +1 -0
- package/dist/src/capabilities/interfaces/o-capability.result-interface.js +1 -0
- package/dist/src/capabilities/o-capability.d.ts +16 -0
- package/dist/src/capabilities/o-capability.d.ts.map +1 -0
- package/dist/src/capabilities/o-capability.intelligence.d.ts +6 -0
- package/dist/src/capabilities/o-capability.intelligence.d.ts.map +1 -0
- package/dist/src/capabilities/o-capability.intelligence.js +40 -0
- package/dist/src/capabilities/o-capability.js +20 -0
- package/dist/src/capabilities/o-capability.result.d.ts +27 -0
- package/dist/src/capabilities/o-capability.result.d.ts.map +1 -0
- package/dist/src/capabilities/o-capability.result.js +27 -0
- package/dist/src/capabilities-all/o-capability.all.d.ts +5 -0
- package/dist/src/capabilities-all/o-capability.all.d.ts.map +1 -0
- package/dist/src/capabilities-all/o-capability.all.js +12 -0
- package/dist/src/capabilities-configure/interfaces/o-capability.configure-config.d.ts +8 -0
- package/dist/src/capabilities-configure/interfaces/o-capability.configure-config.d.ts.map +1 -0
- package/dist/src/capabilities-configure/interfaces/o-capability.configure-config.js +1 -0
- package/dist/src/capabilities-configure/o-capability.configure-result.d.ts +6 -0
- package/dist/src/capabilities-configure/o-capability.configure-result.d.ts.map +1 -0
- package/dist/src/capabilities-configure/o-capability.configure-result.js +3 -0
- package/dist/src/capabilities-configure/o-capability.configure.d.ts +16 -0
- package/dist/src/capabilities-configure/o-capability.configure.d.ts.map +1 -0
- package/dist/src/capabilities-configure/o-capability.configure.js +43 -0
- package/dist/src/capabilities-evaluate/o-capability.evaluate.d.ts +9 -0
- package/dist/src/capabilities-evaluate/o-capability.evaluate.d.ts.map +1 -0
- package/dist/src/capabilities-evaluate/o-capability.evaluate.js +15 -0
- package/dist/src/capabilities-multiple-step/interfaces/o-capability.multiple-step-config.d.ts +12 -0
- package/dist/src/capabilities-multiple-step/interfaces/o-capability.multiple-step-config.d.ts.map +1 -0
- package/dist/src/capabilities-multiple-step/interfaces/o-capability.multiple-step-config.js +1 -0
- package/dist/src/capabilities-multiple-step/o-capability.multiple-step.d.ts +14 -0
- package/dist/src/capabilities-multiple-step/o-capability.multiple-step.d.ts.map +1 -0
- package/dist/src/capabilities-multiple-step/o-capability.multiple-step.js +36 -0
- package/dist/src/capabilities-search/interfaces/o-capability.search-config.d.ts +12 -0
- package/dist/src/capabilities-search/interfaces/o-capability.search-config.d.ts.map +1 -0
- package/dist/src/capabilities-search/interfaces/o-capability.search-config.js +1 -0
- package/dist/src/capabilities-search/o-capability.search-result.d.ts +7 -0
- package/dist/src/capabilities-search/o-capability.search-result.d.ts.map +1 -0
- package/dist/src/capabilities-search/o-capability.search-result.js +8 -0
- package/dist/src/capabilities-search/o-capability.search.d.ts +27 -0
- package/dist/src/capabilities-search/o-capability.search.d.ts.map +1 -0
- package/dist/src/capabilities-search/o-capability.search.js +108 -0
- package/dist/src/capabilities-task/interfaces/o-capability.task-config.d.ts +15 -0
- package/dist/src/capabilities-task/interfaces/o-capability.task-config.d.ts.map +1 -0
- package/dist/src/capabilities-task/interfaces/o-capability.task-config.js +1 -0
- package/dist/src/capabilities-task/o-capability.task-result.d.ts +5 -0
- package/dist/src/capabilities-task/o-capability.task-result.d.ts.map +1 -0
- package/dist/src/capabilities-task/o-capability.task-result.js +3 -0
- package/dist/src/capabilities-task/o-capability.task.d.ts +20 -0
- package/dist/src/capabilities-task/o-capability.task.d.ts.map +1 -0
- package/dist/src/capabilities-task/o-capability.task.js +81 -0
- package/dist/src/enum/o-lane.status-enum.d.ts +10 -0
- package/dist/src/enum/o-lane.status-enum.d.ts.map +1 -0
- package/dist/src/enum/o-lane.status-enum.js +10 -0
- package/dist/src/index.d.ts +17 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +16 -0
- package/dist/src/intent/index.d.ts +2 -0
- package/dist/src/intent/index.d.ts.map +1 -0
- package/dist/src/intent/index.js +1 -0
- package/dist/src/intent/interfaces/o-intent.config.d.ts +4 -0
- package/dist/src/intent/interfaces/o-intent.config.d.ts.map +1 -0
- package/dist/src/intent/interfaces/o-intent.config.js +1 -0
- package/dist/src/intent/o-intent.d.ts +10 -0
- package/dist/src/intent/o-intent.d.ts.map +1 -0
- package/dist/src/intent/o-intent.js +18 -0
- package/dist/src/intent-encoder/index.d.ts +2 -0
- package/dist/src/intent-encoder/index.d.ts.map +1 -0
- package/dist/src/intent-encoder/index.js +1 -0
- package/dist/src/intent-encoder/o-intent.encoder.d.ts +4 -0
- package/dist/src/intent-encoder/o-intent.encoder.d.ts.map +1 -0
- package/dist/src/intent-encoder/o-intent.encoder.js +3 -0
- package/dist/src/interfaces/configure.result.d.ts +7 -0
- package/dist/src/interfaces/configure.result.d.ts.map +1 -0
- package/dist/src/interfaces/configure.result.js +1 -0
- package/dist/src/interfaces/handshake.result.d.ts +13 -0
- package/dist/src/interfaces/handshake.result.d.ts.map +1 -0
- package/dist/src/interfaces/handshake.result.js +8 -0
- package/dist/src/interfaces/index.d.ts +8 -0
- package/dist/src/interfaces/index.d.ts.map +1 -0
- package/dist/src/interfaces/index.js +7 -0
- package/dist/src/interfaces/o-lane-query.config.d.ts +6 -0
- package/dist/src/interfaces/o-lane-query.config.d.ts.map +1 -0
- package/dist/src/interfaces/o-lane-query.config.js +1 -0
- package/dist/src/interfaces/o-lane-task.config.d.ts +10 -0
- package/dist/src/interfaces/o-lane-task.config.d.ts.map +1 -0
- package/dist/src/interfaces/o-lane-task.config.js +1 -0
- package/dist/src/interfaces/o-lane-type.enum.d.ts +8 -0
- package/dist/src/interfaces/o-lane-type.enum.d.ts.map +1 -0
- package/dist/src/interfaces/o-lane-type.enum.js +8 -0
- package/dist/src/interfaces/o-lane.config.d.ts +18 -0
- package/dist/src/interfaces/o-lane.config.d.ts.map +1 -0
- package/dist/src/interfaces/o-lane.config.js +1 -0
- package/dist/src/interfaces/o-lane.result.d.ts +6 -0
- package/dist/src/interfaces/o-lane.result.d.ts.map +1 -0
- package/dist/src/interfaces/o-lane.result.js +1 -0
- package/dist/src/manager/interfaces/o-lane.manager-config.d.ts +4 -0
- package/dist/src/manager/interfaces/o-lane.manager-config.d.ts.map +1 -0
- package/dist/src/manager/interfaces/o-lane.manager-config.js +1 -0
- package/dist/src/manager/o-lane.manager.d.ts +18 -0
- package/dist/src/manager/o-lane.manager.d.ts.map +1 -0
- package/dist/src/manager/o-lane.manager.js +50 -0
- package/dist/src/o-lane.context.d.ts +10 -0
- package/dist/src/o-lane.context.d.ts.map +1 -0
- package/dist/src/o-lane.context.js +28 -0
- package/dist/src/o-lane.d.ts +40 -0
- package/dist/src/o-lane.d.ts.map +1 -0
- package/dist/src/o-lane.js +202 -0
- package/dist/src/o-lane.tool.d.ts +16 -0
- package/dist/src/o-lane.tool.d.ts.map +1 -0
- package/dist/src/o-lane.tool.js +64 -0
- package/dist/src/prompts/agent.prompt.d.ts +2 -0
- package/dist/src/prompts/agent.prompt.d.ts.map +1 -0
- package/dist/src/prompts/agent.prompt.js +118 -0
- package/dist/src/prompts/configure.prompt.d.ts +2 -0
- package/dist/src/prompts/configure.prompt.d.ts.map +1 -0
- package/dist/src/prompts/configure.prompt.js +40 -0
- package/dist/src/prompts/custom.prompt.d.ts +2 -0
- package/dist/src/prompts/custom.prompt.d.ts.map +1 -0
- package/dist/src/prompts/custom.prompt.js +73 -0
- package/dist/src/storage/o-lane.storage.d.ts +5 -0
- package/dist/src/storage/o-lane.storage.d.ts.map +1 -0
- package/dist/src/storage/o-lane.storage.js +11 -0
- package/dist/src/utils/encoder.utils.d.ts +6 -0
- package/dist/src/utils/encoder.utils.d.ts.map +1 -0
- package/dist/src/utils/encoder.utils.js +8 -0
- package/dist/test/ai.spec.d.ts +2 -0
- package/dist/test/ai.spec.d.ts.map +1 -0
- package/dist/test/ai.spec.js +19 -0
- package/package.json +68 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { oObject } from '@olane/o-core';
|
|
2
|
+
import { oLane } from '../o-lane.js';
|
|
3
|
+
import { oLaneStatus } from '../enum/o-lane.status-enum.js';
|
|
4
|
+
export class oLaneManager extends oObject {
|
|
5
|
+
constructor(config) {
|
|
6
|
+
super();
|
|
7
|
+
this.config = config;
|
|
8
|
+
this.lanes = [];
|
|
9
|
+
}
|
|
10
|
+
get maxLanes() {
|
|
11
|
+
return this.config?.maxLanes || 100;
|
|
12
|
+
}
|
|
13
|
+
async createLane(config) {
|
|
14
|
+
const lane = new oLane(config);
|
|
15
|
+
this.lanes.push(lane);
|
|
16
|
+
if (this.activeLanes.length > this.maxLanes) {
|
|
17
|
+
throw new Error('Max lanes reached');
|
|
18
|
+
}
|
|
19
|
+
if (this.staleLanes.length > this.maxLanes) {
|
|
20
|
+
this.cleanLanes();
|
|
21
|
+
}
|
|
22
|
+
return lane;
|
|
23
|
+
}
|
|
24
|
+
cleanLanes() {
|
|
25
|
+
this.logger.info(`Cleaning ${this.staleLanes.length} stale lanes`);
|
|
26
|
+
this.lanes = this.lanes.filter((l) => l.status < oLaneStatus.COMPLETED);
|
|
27
|
+
}
|
|
28
|
+
cancelLane(lane) {
|
|
29
|
+
this.lanes = this.lanes.filter((l) => {
|
|
30
|
+
if (l.id === lane.id) {
|
|
31
|
+
lane.cancel();
|
|
32
|
+
}
|
|
33
|
+
return l.id !== lane.id;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
getLane(id) {
|
|
37
|
+
return this.lanes.find((l) => l.id === id);
|
|
38
|
+
}
|
|
39
|
+
async teardown() {
|
|
40
|
+
for (const lane of this.lanes) {
|
|
41
|
+
await lane.cancel();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
get activeLanes() {
|
|
45
|
+
return this.lanes.filter((l) => l.status === oLaneStatus.RUNNING);
|
|
46
|
+
}
|
|
47
|
+
get staleLanes() {
|
|
48
|
+
return this.lanes.filter((l) => l.status >= oLaneStatus.COMPLETED);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"o-lane.context.d.ts","sourceRoot":"","sources":["../../src/o-lane.context.ts"],"names":[],"mappings":"AAAA,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAgB;gBACnB,OAAO,EAAE,GAAG;IAIxB,GAAG,CAAC,KAAK,EAAE,MAAM;IAIjB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE;IAUzB,KAAK;IAIL,MAAM;IAIN,QAAQ;CAGT"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export class oLaneContext {
|
|
2
|
+
constructor(context) {
|
|
3
|
+
this.context = [];
|
|
4
|
+
this.context = context;
|
|
5
|
+
}
|
|
6
|
+
add(value) {
|
|
7
|
+
this.context.push(value);
|
|
8
|
+
}
|
|
9
|
+
addAll(contexts) {
|
|
10
|
+
try {
|
|
11
|
+
for (const context of contexts) {
|
|
12
|
+
this.context.push(context);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
catch (e) {
|
|
16
|
+
console.error('Error adding contexts: ', e);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
clear() {
|
|
20
|
+
this.context = [];
|
|
21
|
+
}
|
|
22
|
+
toJSON() {
|
|
23
|
+
return this.context;
|
|
24
|
+
}
|
|
25
|
+
toString() {
|
|
26
|
+
return '\n\n' + this.context.join('\n') + '\n\n';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { oObject } from '@olane/o-core';
|
|
2
|
+
import { oLaneConfig } from './interfaces/o-lane.config.js';
|
|
3
|
+
import { CID } from 'multiformats';
|
|
4
|
+
import { oIntent } from './intent/index.js';
|
|
5
|
+
import { oIntentEncoder } from './intent-encoder/index.js';
|
|
6
|
+
import { oLaneStatus } from './enum/o-lane.status-enum.js';
|
|
7
|
+
import { oCapabilityConfig, oCapabilityResult } from './capabilities/index.js';
|
|
8
|
+
export declare class oLane extends oObject {
|
|
9
|
+
protected readonly config: oLaneConfig;
|
|
10
|
+
sequence: oCapabilityResult[];
|
|
11
|
+
cid: CID | undefined;
|
|
12
|
+
id: string;
|
|
13
|
+
parentLaneId: string | undefined;
|
|
14
|
+
intentEncoder: oIntentEncoder;
|
|
15
|
+
MAX_CYCLES: number;
|
|
16
|
+
status: oLaneStatus;
|
|
17
|
+
result: oCapabilityResult | undefined;
|
|
18
|
+
constructor(config: oLaneConfig);
|
|
19
|
+
get intent(): oIntent;
|
|
20
|
+
toCIDInput(): any;
|
|
21
|
+
toJSON(): {
|
|
22
|
+
config: any;
|
|
23
|
+
sequence: oCapabilityResult[];
|
|
24
|
+
result: oCapabilityResult | undefined;
|
|
25
|
+
};
|
|
26
|
+
addSequence(result: oCapabilityResult): void;
|
|
27
|
+
toCID(): Promise<CID>;
|
|
28
|
+
store(): Promise<void>;
|
|
29
|
+
get agentHistory(): string;
|
|
30
|
+
preflight(): Promise<void>;
|
|
31
|
+
execute(): Promise<oCapabilityResult | undefined>;
|
|
32
|
+
get capabilities(): import("./capabilities/o-capability.js").oCapability[];
|
|
33
|
+
resultToConfig(result: any): oCapabilityConfig;
|
|
34
|
+
doCapability(currentStep: oCapabilityResult): Promise<oCapabilityResult>;
|
|
35
|
+
loop(): Promise<oCapabilityResult>;
|
|
36
|
+
postflight(response?: oCapabilityResult): Promise<oCapabilityResult | undefined>;
|
|
37
|
+
cancel(): void;
|
|
38
|
+
get node(): import("./o-lane.tool.js").oLaneTool;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=o-lane.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"o-lane.d.ts","sourceRoot":"","sources":["../../src/o-lane.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,OAAO,EAER,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAInC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EAElB,MAAM,yBAAyB,CAAC;AAGjC,qBAAa,KAAM,SAAQ,OAAO;IAUpB,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,WAAW;IAT3C,QAAQ,EAAE,iBAAiB,EAAE,CAAM;IACnC,GAAG,EAAE,GAAG,GAAG,SAAS,CAAC;IACrB,EAAE,EAAE,MAAM,CAAY;IACtB,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,aAAa,EAAE,cAAc,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAM;IACxB,MAAM,EAAE,WAAW,CAAuB;IAC1C,MAAM,EAAE,iBAAiB,GAAG,SAAS,CAAC;gBAEd,MAAM,EAAE,WAAW;IAalD,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,UAAU,IAAI,GAAG;IAQjB,MAAM;;;;;IAQN,WAAW,CAAC,MAAM,EAAE,iBAAiB;IAgB/B,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC;IAUrB,KAAK;IAeX,IAAI,YAAY,WA8Bf;IACK,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAK1B,OAAO,IAAI,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAevD,IAAI,YAAY,2DAEf;IAED,cAAc,CAAC,MAAM,EAAE,GAAG,GAAG,iBAAiB;IAaxC,YAAY,CAChB,WAAW,EAAE,iBAAiB,GAC7B,OAAO,CAAC,iBAAiB,CAAC;IAevB,IAAI,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAqClC,UAAU,CACd,QAAQ,CAAC,EAAE,iBAAiB,GAC3B,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAYzC,MAAM;IAKN,IAAI,IAAI,yCAEP;CACF"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { oError, oErrorCodes, oObject, } from '@olane/o-core';
|
|
2
|
+
import { CID } from 'multiformats';
|
|
3
|
+
import * as json from 'multiformats/codecs/json';
|
|
4
|
+
import { sha256 } from 'multiformats/hashes/sha2';
|
|
5
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
6
|
+
import { oIntentEncoder } from './intent-encoder/index.js';
|
|
7
|
+
import { oLaneStatus } from './enum/o-lane.status-enum.js';
|
|
8
|
+
import { oCapabilityResult, oCapabilityType, } from './capabilities/index.js';
|
|
9
|
+
import { ALL_CAPABILITIES } from './capabilities-all/o-capability.all.js';
|
|
10
|
+
export class oLane extends oObject {
|
|
11
|
+
constructor(config) {
|
|
12
|
+
super('o-lane:' + `[${config.intent.value}]`);
|
|
13
|
+
this.config = config;
|
|
14
|
+
this.sequence = [];
|
|
15
|
+
this.id = uuidv4();
|
|
16
|
+
this.MAX_CYCLES = 20;
|
|
17
|
+
this.status = oLaneStatus.PENDING;
|
|
18
|
+
this.sequence = Object.assign([], this.config.sequence || []);
|
|
19
|
+
this.parentLaneId = this.config.parentLaneId;
|
|
20
|
+
this.intentEncoder = new oIntentEncoder();
|
|
21
|
+
// set a max cycles if one is not provided
|
|
22
|
+
if (!!process.env.MAX_CYCLES) {
|
|
23
|
+
this.MAX_CYCLES = parseInt(process.env.MAX_CYCLES);
|
|
24
|
+
}
|
|
25
|
+
this.MAX_CYCLES = this.config.maxCycles || this.MAX_CYCLES;
|
|
26
|
+
}
|
|
27
|
+
get intent() {
|
|
28
|
+
return this.config.intent;
|
|
29
|
+
}
|
|
30
|
+
toCIDInput() {
|
|
31
|
+
return {
|
|
32
|
+
intent: this.config.intent,
|
|
33
|
+
address: this.config.caller?.toString(),
|
|
34
|
+
context: this.config.context?.toString() || '',
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
toJSON() {
|
|
38
|
+
return {
|
|
39
|
+
config: this.toCIDInput(),
|
|
40
|
+
sequence: this.sequence,
|
|
41
|
+
result: this.result,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
addSequence(result) {
|
|
45
|
+
this.sequence.push(result);
|
|
46
|
+
if (this.config.streamTo) {
|
|
47
|
+
this.node
|
|
48
|
+
.use(this.config.streamTo, {
|
|
49
|
+
method: 'receive_stream',
|
|
50
|
+
params: {
|
|
51
|
+
data: result.result || result.error || '',
|
|
52
|
+
},
|
|
53
|
+
})
|
|
54
|
+
.catch((error) => {
|
|
55
|
+
this.logger.error('Error sending agent stream: ', error);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async toCID() {
|
|
60
|
+
if (this.cid) {
|
|
61
|
+
return this.cid;
|
|
62
|
+
}
|
|
63
|
+
const bytes = json.encode(this.toCIDInput());
|
|
64
|
+
const hash = await sha256.digest(bytes);
|
|
65
|
+
const cid = CID.create(1, json.code, hash);
|
|
66
|
+
return cid;
|
|
67
|
+
}
|
|
68
|
+
async store() {
|
|
69
|
+
this.logger.debug('Storing plan...');
|
|
70
|
+
const cid = await this.toCID();
|
|
71
|
+
const params = {
|
|
72
|
+
key: cid.toString(),
|
|
73
|
+
value: JSON.stringify(this.toJSON()),
|
|
74
|
+
};
|
|
75
|
+
this.logger.debug('Storing plan params: ', params);
|
|
76
|
+
// await this.node.use(oAddress.lane(), {
|
|
77
|
+
// method: 'put',
|
|
78
|
+
// params: params,
|
|
79
|
+
// });
|
|
80
|
+
}
|
|
81
|
+
get agentHistory() {
|
|
82
|
+
const added = {};
|
|
83
|
+
return (this.sequence
|
|
84
|
+
?.filter((s) => {
|
|
85
|
+
if (added[s.id]) {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
added[s.id] = true;
|
|
89
|
+
return true;
|
|
90
|
+
})
|
|
91
|
+
?.map((s, index) => {
|
|
92
|
+
const result = s.result || s.error;
|
|
93
|
+
return `[Cycle ${index + 1} Begin ${s.id}]\n
|
|
94
|
+
Cycle Intent: ${s.config?.intent}\n
|
|
95
|
+
Cycle Result:\n
|
|
96
|
+
${typeof result === 'string'
|
|
97
|
+
? result
|
|
98
|
+
: JSON.stringify({
|
|
99
|
+
...result,
|
|
100
|
+
}, null, 2)} \n[Cycle ${index + 1} End ${s.id}]`;
|
|
101
|
+
})
|
|
102
|
+
.join('\n') || '');
|
|
103
|
+
}
|
|
104
|
+
async preflight() {
|
|
105
|
+
this.logger.debug('Preflight...');
|
|
106
|
+
this.status = oLaneStatus.PREFLIGHT;
|
|
107
|
+
}
|
|
108
|
+
async execute() {
|
|
109
|
+
this.logger.debug('Executing...');
|
|
110
|
+
await this.preflight();
|
|
111
|
+
this.status = oLaneStatus.RUNNING;
|
|
112
|
+
try {
|
|
113
|
+
this.result = await this.loop();
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
this.logger.error('Error in execute: ', error);
|
|
117
|
+
this.status = oLaneStatus.FAILED;
|
|
118
|
+
}
|
|
119
|
+
await this.postflight(this.result);
|
|
120
|
+
this.status = oLaneStatus.COMPLETED;
|
|
121
|
+
return this.result;
|
|
122
|
+
}
|
|
123
|
+
get capabilities() {
|
|
124
|
+
return this.config.capabilities || ALL_CAPABILITIES.map((c) => new c());
|
|
125
|
+
}
|
|
126
|
+
resultToConfig(result) {
|
|
127
|
+
const obj = result.result || result.error;
|
|
128
|
+
return {
|
|
129
|
+
...result.config,
|
|
130
|
+
history: this.agentHistory,
|
|
131
|
+
params: typeof obj === 'object' ? obj : {},
|
|
132
|
+
laneConfig: {
|
|
133
|
+
...this.config,
|
|
134
|
+
sequence: this.sequence, // pass the full sequence to the next capability
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
async doCapability(currentStep) {
|
|
139
|
+
const capabilityType = currentStep.type;
|
|
140
|
+
for (const capability of this.capabilities) {
|
|
141
|
+
if (capability.type === capabilityType && currentStep.config) {
|
|
142
|
+
const capabilityConfig = this.resultToConfig(currentStep);
|
|
143
|
+
const result = await capability.execute({
|
|
144
|
+
...capabilityConfig,
|
|
145
|
+
});
|
|
146
|
+
return result;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
throw new oError(oErrorCodes.INVALID_CAPABILITY, 'Unknown capability');
|
|
150
|
+
}
|
|
151
|
+
async loop() {
|
|
152
|
+
if (!this.node) {
|
|
153
|
+
throw new Error('Node not set');
|
|
154
|
+
}
|
|
155
|
+
let iterations = 0;
|
|
156
|
+
let currentStep = new oCapabilityResult({
|
|
157
|
+
type: oCapabilityType.EVALUATE,
|
|
158
|
+
result: null,
|
|
159
|
+
config: {
|
|
160
|
+
laneConfig: this.config,
|
|
161
|
+
intent: this.intent,
|
|
162
|
+
node: this.node,
|
|
163
|
+
history: this.agentHistory,
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
while (iterations++ < this.MAX_CYCLES &&
|
|
167
|
+
this.status === oLaneStatus.RUNNING) {
|
|
168
|
+
// update the history
|
|
169
|
+
if (currentStep.config) {
|
|
170
|
+
currentStep.config.history = this.agentHistory;
|
|
171
|
+
}
|
|
172
|
+
// perform the latest capability
|
|
173
|
+
const result = await this.doCapability(currentStep);
|
|
174
|
+
this.addSequence(result);
|
|
175
|
+
if (result.type === oCapabilityType.STOP) {
|
|
176
|
+
return result;
|
|
177
|
+
}
|
|
178
|
+
// update the current step
|
|
179
|
+
currentStep = result;
|
|
180
|
+
}
|
|
181
|
+
throw new Error('Plan failed');
|
|
182
|
+
}
|
|
183
|
+
async postflight(response) {
|
|
184
|
+
this.logger.debug('Postflight...');
|
|
185
|
+
this.status = oLaneStatus.POSTFLIGHT;
|
|
186
|
+
try {
|
|
187
|
+
await this.store();
|
|
188
|
+
this.logger.debug('Saving plan...', response);
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
this.logger.error('Error in postflight: ', error);
|
|
192
|
+
}
|
|
193
|
+
return response;
|
|
194
|
+
}
|
|
195
|
+
cancel() {
|
|
196
|
+
this.logger.debug('Cancelling lane...');
|
|
197
|
+
this.status = oLaneStatus.CANCELLED;
|
|
198
|
+
}
|
|
199
|
+
get node() {
|
|
200
|
+
return this.config.currentNode;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { oRequest } from '@olane/o-core';
|
|
2
|
+
import { oNodeConfig, oNodeTool } from '@olane/o-node';
|
|
3
|
+
import { oHandshakeResult } from './interfaces/index.js';
|
|
4
|
+
export declare class oLaneTool extends oNodeTool {
|
|
5
|
+
private manager;
|
|
6
|
+
constructor(config: oNodeConfig);
|
|
7
|
+
_tool_handshake(handshake: oRequest): Promise<oHandshakeResult>;
|
|
8
|
+
/**
|
|
9
|
+
* Where all intents go to be resolved.
|
|
10
|
+
* @param request
|
|
11
|
+
* @returns
|
|
12
|
+
*/
|
|
13
|
+
_tool_intent(request: oRequest): Promise<any>;
|
|
14
|
+
teardown(): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=o-lane.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"o-lane.tool.d.ts","sourceRoot":"","sources":["../../src/o-lane.tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,QAAQ,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAOzD,qBAAa,SAAU,SAAQ,SAAS;IACtC,OAAO,CAAC,OAAO,CAAe;gBAElB,MAAM,EAAE,WAAW;IAKzB,eAAe,CAAC,SAAS,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAyBrE;;;;OAIG;IACG,YAAY,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC;IA2B7C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAIhC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { oAddress } from '@olane/o-core';
|
|
2
|
+
import { oNodeTool } from '@olane/o-node';
|
|
3
|
+
import { oCapabilityType } from './capabilities/index.js';
|
|
4
|
+
import { oIntent } from './intent/index.js';
|
|
5
|
+
import { oLaneContext } from './o-lane.context.js';
|
|
6
|
+
import { oLaneManager } from './manager/o-lane.manager.js';
|
|
7
|
+
import { oCapabilityResult } from './capabilities/o-capability.result.js';
|
|
8
|
+
export class oLaneTool extends oNodeTool {
|
|
9
|
+
constructor(config) {
|
|
10
|
+
super(config);
|
|
11
|
+
this.manager = new oLaneManager();
|
|
12
|
+
}
|
|
13
|
+
async _tool_handshake(handshake) {
|
|
14
|
+
this.logger.debug('Performing handshake with intent: ', handshake.params.intent);
|
|
15
|
+
let tools = await this.myTools();
|
|
16
|
+
let methods = this.methods;
|
|
17
|
+
const { tool } = handshake.params;
|
|
18
|
+
if (tool) {
|
|
19
|
+
tools = tools.filter((t) => t === tool);
|
|
20
|
+
methods = { tool: this.methods[tool] };
|
|
21
|
+
}
|
|
22
|
+
return new oCapabilityResult({
|
|
23
|
+
result: {
|
|
24
|
+
tools: tools.filter((t) => t !== 'handshake' && t !== 'intent'),
|
|
25
|
+
methods: methods,
|
|
26
|
+
},
|
|
27
|
+
type: oCapabilityType.HANDSHAKE,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Where all intents go to be resolved.
|
|
32
|
+
* @param request
|
|
33
|
+
* @returns
|
|
34
|
+
*/
|
|
35
|
+
async _tool_intent(request) {
|
|
36
|
+
this.logger.debug('Intent resolution called: ', request.params);
|
|
37
|
+
const { intent, context, streamTo } = request.params;
|
|
38
|
+
const pc = await this.manager.createLane({
|
|
39
|
+
intent: new oIntent({ intent: intent }),
|
|
40
|
+
currentNode: this,
|
|
41
|
+
caller: this.address,
|
|
42
|
+
streamTo: streamTo ? new oAddress(streamTo) : undefined,
|
|
43
|
+
context: context
|
|
44
|
+
? new oLaneContext([
|
|
45
|
+
`[Chat History Context Begin]\n${context}\n[Chat History Context End]`,
|
|
46
|
+
])
|
|
47
|
+
: undefined,
|
|
48
|
+
});
|
|
49
|
+
const response = await pc.execute();
|
|
50
|
+
this.logger.debug('Intent resolution response: ', response);
|
|
51
|
+
return {
|
|
52
|
+
result: response?.result,
|
|
53
|
+
error: response?.error,
|
|
54
|
+
cycles: pc.sequence.length,
|
|
55
|
+
sequence: pc.sequence.map((s) => {
|
|
56
|
+
return s.result;
|
|
57
|
+
}),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
async teardown() {
|
|
61
|
+
await this.manager.teardown();
|
|
62
|
+
await super.teardown();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.prompt.d.ts","sourceRoot":"","sources":["../../../src/prompts/agent.prompt.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,WACf,MAAM,WACL,MAAM,gBACD,MAAM,qBACD,MAAM,WA6HxB,CAAC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { CUSTOM_AGENT_PROMPT } from './custom.prompt.js';
|
|
2
|
+
export const AGENT_PROMPT = (intent, context, agentHistory, extraInstructions) => CUSTOM_AGENT_PROMPT(intent, context, agentHistory, `
|
|
3
|
+
Every Step Instructions:
|
|
4
|
+
1. Review the provided user intent, context and agent history
|
|
5
|
+
2. If you can complete the user intent, return the "Stop Response" using the [RETURN INSTRUCTIONS] steps
|
|
6
|
+
3. If the intent is already completed in past cycles, return the "Stop Response" using the [RETURN INSTRUCTIONS] steps
|
|
7
|
+
4. If you experience 3 similar errors in a row, return the "Stop Response" indicating an error and follow the [RETURN INSTRUCTIONS] steps
|
|
8
|
+
5. Review the current step number and perform the instructions associated with that step
|
|
9
|
+
6. Start with step 1
|
|
10
|
+
|
|
11
|
+
Step 1 - Evaluate the intent
|
|
12
|
+
1. A complex step means there are multiple actions required to complete the user's intent
|
|
13
|
+
2. If the intent is not-complex, continue to step 2
|
|
14
|
+
3. If the intent is complex, break it up into a list of simple concise intents. Return the "Complex Intent Response" using the [RETURN INSTRUCTIONS]
|
|
15
|
+
|
|
16
|
+
Step 2 - Search for tools and context
|
|
17
|
+
1. If all entities and tool addresses are known within the user intent, continue to step 4
|
|
18
|
+
2. If you know the tool address to use to complete the user intent, continue to step 4
|
|
19
|
+
3. If there are unknown tool addresses or entities within the user intent, generate search queries to resolve the unknown entities.
|
|
20
|
+
4. Use the o://mcp search tool to find model context protocol servers (MCP servers) that can help you add tooling that could help you complete the user intent.
|
|
21
|
+
5. If there is a placeholder address used (o://.../placeholder), do not extract the contents of the placeholder address unless necessary for completing the user intent.
|
|
22
|
+
6. Use the search results data & tooling to help you resolve the unknown entities.
|
|
23
|
+
7. Continue to step 3.
|
|
24
|
+
|
|
25
|
+
Step 3 - Filter Search Results
|
|
26
|
+
1. If all search results are relevant to the user intent resolution, continue to step 4.
|
|
27
|
+
2. Filter the search results for information that may contain supporting data or tooling that can help complete the user intent.
|
|
28
|
+
3. If you do not see anything that can help you. Return the "Stop Response" using the [RETURN INSTRUCTIONS]
|
|
29
|
+
4. Continue to step 4
|
|
30
|
+
|
|
31
|
+
Step 4 - Configure the target tool address use
|
|
32
|
+
1. Identify the tool address that most likely will help you complete the user intent.
|
|
33
|
+
2. Review the provided context for past cycles that contain configuration instructions for the target tool address.
|
|
34
|
+
3. If there is no configuration instructions for the target tool address, return the "Configure Response" using the [RETURN INSTRUCTIONS]
|
|
35
|
+
4. If the tool use configuration is already known, continue to step 5
|
|
36
|
+
|
|
37
|
+
Step 5 - Use target tool address
|
|
38
|
+
1. If the target tool address configuration is known, return the "Use Tool Response" using the [RETURN INSTRUCTIONS]
|
|
39
|
+
2. If the target tool address with the same configuration has failed in the past cycles, return the "Error Response" using the [RETURN INSTRUCTIONS] steps to indicate the error.
|
|
40
|
+
3. Using this filtered tool list, return the "Use Tool Response" using the [RETURN INSTRUCTIONS] steps to return a series of addresses and respective intents to align with the current user intent resolution goal
|
|
41
|
+
4. Continue to step 6
|
|
42
|
+
|
|
43
|
+
Step 6 - Review the tool use results
|
|
44
|
+
1. Analyze each tool use result
|
|
45
|
+
2. Summarize the result of each tool use in 1 concise sentence
|
|
46
|
+
3. In the summary, clearly mention if it succeeded or failed
|
|
47
|
+
4. If it failed, make sure to include why it failed
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
`, `
|
|
51
|
+
[RETURN INSTRUCTIONS BEGIN]
|
|
52
|
+
These are the types of cycle responses: "Complex Intent Response", "Search Response", "Use Tool Response", "Stop Response", "Error Response", "Configure Response".
|
|
53
|
+
|
|
54
|
+
All Return Step Instructions:
|
|
55
|
+
1. Do not explain your reasoning process, just return the output in the correct format.
|
|
56
|
+
2. Determine what type of results we have
|
|
57
|
+
3. Output the respective results using the matching output type.
|
|
58
|
+
4. Generate a reasoning key value pair for why this result was returned.
|
|
59
|
+
5. The reasoning should be no longer than 1 sentence.
|
|
60
|
+
6. Do not include \`\`\`json or \`\`\` in your output.
|
|
61
|
+
|
|
62
|
+
Complex Intent Results:
|
|
63
|
+
{
|
|
64
|
+
"intents": [
|
|
65
|
+
"simple intent 1",
|
|
66
|
+
"simple intent 2",
|
|
67
|
+
"simple intent 3",
|
|
68
|
+
],
|
|
69
|
+
"reasoning": string,
|
|
70
|
+
"type": "multiple_step",
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
Configure Response:
|
|
74
|
+
{
|
|
75
|
+
"intent": string,
|
|
76
|
+
"toolAddress": string,
|
|
77
|
+
"reasoning": string,
|
|
78
|
+
"type": "configure",
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
Search Response:
|
|
82
|
+
{
|
|
83
|
+
"queries": [
|
|
84
|
+
{
|
|
85
|
+
"query": "vector database query key terms to search for",
|
|
86
|
+
"limit": number,
|
|
87
|
+
}
|
|
88
|
+
],
|
|
89
|
+
"isExternal": boolean,
|
|
90
|
+
"reasoning": string,
|
|
91
|
+
"type": "search",
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
Stop Response:
|
|
95
|
+
{
|
|
96
|
+
"result": string,
|
|
97
|
+
"reasoning": string,
|
|
98
|
+
"type": "stop",
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
Error Response:
|
|
102
|
+
{
|
|
103
|
+
"result": "string explaining the error",
|
|
104
|
+
"reasoning": string,
|
|
105
|
+
"type": "evaluate",
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
Use Tool Response:
|
|
109
|
+
{
|
|
110
|
+
"task": {
|
|
111
|
+
"address": string,
|
|
112
|
+
"payload": { "method": string, "params": any }
|
|
113
|
+
}
|
|
114
|
+
"type": "task",
|
|
115
|
+
}
|
|
116
|
+
[RETURN INSTRUCTIONS END]
|
|
117
|
+
|
|
118
|
+
`, extraInstructions);
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const CONFIGURE_INSTRUCTIONS = "\n Configure Request Instructions:\n1. Review the provided user intent and context\n2. If you can complete the user intent, return the answer using the [RETURN INSTRUCTIONS] steps\n3. If you experience an error trying to use a tool more than 2 times, stop here and follow the [RETURN INSTRUCTIONS] steps to indicate the error.\n3. Review the current step number and perform the instructions associated with that step.\n4. Start with step 1\n\nStep 1 - Validate the intent\n1. If the intent is not a configure request, continue to step 5\n2. If the context provided would suggest that the intent is already solved, continue to step 5\n2. Continue to step 2\n\nStep 2 - Choose Method\n1. Review the method options and metadata to determine the best method to resolve the user's intent.\n2. Choose the best method to resolve the user's intent.\n3. Continue to step 3\n\nStep 3 - Select Parameters\n1. Review the parameters for the selected best method.\n2. Extract the parameter values from the agent history, provided context and intent. Do NOT use a parameter value that is not mentioned previously.\n3. Do not use placeholder values for parameter values.\n4. Do not use parameter values that are not explicitly mentioned in the agent history, provided context or intent.\n3. Identify missing parameter values.\n4. If you have enough information to complete the configure request, go to step 5.\n5. Continue to step 4\n\nStep 4 - Search for missing parameter values\n1. Identify other methods that can be used to resolve the missing parameter values.\n2. Identify methods that can be used to resolve the missing parameter values.\n3. Continue to step 5\n\nStep 5 - Finish\n1. If the intent seems to be already solved, return answer results.\n1. If this is not a configure request, return an error.\n2. If you are missing parameter values, generate the intents for the \"Complex Intent\" results using other methods or search to help.\n2. If you have enough information to complete the configure request, follow the [RETURN INSTRUCTIONS] steps to return the \"configure results\".\n3. If you do not have enough information to complete the configure request, return an error.\n\n ";
|
|
2
|
+
//# sourceMappingURL=configure.prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure.prompt.d.ts","sourceRoot":"","sources":["../../../src/prompts/configure.prompt.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,woEAuChC,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export const CONFIGURE_INSTRUCTIONS = `
|
|
2
|
+
Configure Request Instructions:
|
|
3
|
+
1. Review the provided user intent and context
|
|
4
|
+
2. If you can complete the user intent, return the answer using the [RETURN INSTRUCTIONS] steps
|
|
5
|
+
3. If you experience an error trying to use a tool more than 2 times, stop here and follow the [RETURN INSTRUCTIONS] steps to indicate the error.
|
|
6
|
+
3. Review the current step number and perform the instructions associated with that step.
|
|
7
|
+
4. Start with step 1
|
|
8
|
+
|
|
9
|
+
Step 1 - Validate the intent
|
|
10
|
+
1. If the intent is not a configure request, continue to step 5
|
|
11
|
+
2. If the context provided would suggest that the intent is already solved, continue to step 5
|
|
12
|
+
2. Continue to step 2
|
|
13
|
+
|
|
14
|
+
Step 2 - Choose Method
|
|
15
|
+
1. Review the method options and metadata to determine the best method to resolve the user's intent.
|
|
16
|
+
2. Choose the best method to resolve the user's intent.
|
|
17
|
+
3. Continue to step 3
|
|
18
|
+
|
|
19
|
+
Step 3 - Select Parameters
|
|
20
|
+
1. Review the parameters for the selected best method.
|
|
21
|
+
2. Extract the parameter values from the agent history, provided context and intent. Do NOT use a parameter value that is not mentioned previously.
|
|
22
|
+
3. Do not use placeholder values for parameter values.
|
|
23
|
+
4. Do not use parameter values that are not explicitly mentioned in the agent history, provided context or intent.
|
|
24
|
+
3. Identify missing parameter values.
|
|
25
|
+
4. If you have enough information to complete the configure request, go to step 5.
|
|
26
|
+
5. Continue to step 4
|
|
27
|
+
|
|
28
|
+
Step 4 - Search for missing parameter values
|
|
29
|
+
1. Identify other methods that can be used to resolve the missing parameter values.
|
|
30
|
+
2. Identify methods that can be used to resolve the missing parameter values.
|
|
31
|
+
3. Continue to step 5
|
|
32
|
+
|
|
33
|
+
Step 5 - Finish
|
|
34
|
+
1. If the intent seems to be already solved, return answer results.
|
|
35
|
+
1. If this is not a configure request, return an error.
|
|
36
|
+
2. If you are missing parameter values, generate the intents for the "Complex Intent" results using other methods or search to help.
|
|
37
|
+
2. If you have enough information to complete the configure request, follow the [RETURN INSTRUCTIONS] steps to return the "configure results".
|
|
38
|
+
3. If you do not have enough information to complete the configure request, return an error.
|
|
39
|
+
|
|
40
|
+
`;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom.prompt.d.ts","sourceRoot":"","sources":["../../../src/prompts/custom.prompt.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,WACtB,MAAM,WACL,MAAM,gBACD,MAAM,qBACD,MAAM,sBACL,MAAM,qBACP,MAAM,WAyE1B,CAAC"}
|