donobu 2.46.0 → 2.46.3
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/dist/assets/generated/version +1 -1
- package/dist/esm/assets/generated/version +1 -1
- package/dist/esm/lib/DonobuExtendedPage.d.ts +12 -10
- package/dist/esm/lib/DonobuExtendedPage.d.ts.map +1 -1
- package/dist/esm/lib/PageAi.d.ts +103 -77
- package/dist/esm/lib/PageAi.d.ts.map +1 -1
- package/dist/esm/lib/PageAi.js +152 -272
- package/dist/esm/lib/PageAi.js.map +1 -1
- package/dist/esm/lib/originalGotoRegistry.d.ts +5 -0
- package/dist/esm/lib/originalGotoRegistry.d.ts.map +1 -0
- package/dist/esm/lib/originalGotoRegistry.js +30 -0
- package/dist/esm/lib/originalGotoRegistry.js.map +1 -0
- package/dist/esm/lib/pageAi/cache.d.ts +84 -0
- package/dist/esm/lib/pageAi/cache.d.ts.map +1 -0
- package/dist/esm/lib/pageAi/cache.js +207 -0
- package/dist/esm/lib/pageAi/cache.js.map +1 -0
- package/dist/esm/lib/pageAi/cacheEntryBuilder.d.ts +17 -0
- package/dist/esm/lib/pageAi/cacheEntryBuilder.d.ts.map +1 -0
- package/dist/esm/lib/pageAi/cacheEntryBuilder.js +25 -0
- package/dist/esm/lib/pageAi/cacheEntryBuilder.js.map +1 -0
- package/dist/esm/lib/testExtension.d.ts.map +1 -1
- package/dist/esm/lib/testExtension.js +284 -282
- package/dist/esm/lib/testExtension.js.map +1 -1
- package/dist/esm/lib/utils/selfHealing.js +2 -2
- package/dist/esm/lib/utils/selfHealing.js.map +1 -1
- package/dist/esm/managers/CodeGenerator.d.ts +8 -0
- package/dist/esm/managers/CodeGenerator.d.ts.map +1 -1
- package/dist/esm/managers/CodeGenerator.js +104 -1
- package/dist/esm/managers/CodeGenerator.js.map +1 -1
- package/dist/esm/managers/PageInspector.d.ts +5 -11
- package/dist/esm/managers/PageInspector.d.ts.map +1 -1
- package/dist/esm/managers/PageInspector.js +4 -25
- package/dist/esm/managers/PageInspector.js.map +1 -1
- package/dist/esm/tools/ChooseSelectOptionTool.d.ts +2 -2
- package/dist/esm/tools/ChooseSelectOptionTool.d.ts.map +1 -1
- package/dist/esm/tools/ChooseSelectOptionTool.js.map +1 -1
- package/dist/esm/tools/ClickTool.d.ts +2 -2
- package/dist/esm/tools/ClickTool.d.ts.map +1 -1
- package/dist/esm/tools/ClickTool.js.map +1 -1
- package/dist/esm/tools/HoverOverElementTool.d.ts +2 -2
- package/dist/esm/tools/HoverOverElementTool.d.ts.map +1 -1
- package/dist/esm/tools/HoverOverElementTool.js.map +1 -1
- package/dist/esm/tools/InputRandomizedEmailAddressTool.d.ts +2 -2
- package/dist/esm/tools/InputRandomizedEmailAddressTool.d.ts.map +1 -1
- package/dist/esm/tools/InputRandomizedEmailAddressTool.js.map +1 -1
- package/dist/esm/tools/InputTextTool.d.ts +2 -2
- package/dist/esm/tools/InputTextTool.d.ts.map +1 -1
- package/dist/esm/tools/InputTextTool.js.map +1 -1
- package/dist/esm/tools/PressKeyTool.d.ts +2 -2
- package/dist/esm/tools/PressKeyTool.d.ts.map +1 -1
- package/dist/esm/tools/PressKeyTool.js.map +1 -1
- package/dist/esm/tools/ReplayableInteraction.d.ts +5 -4
- package/dist/esm/tools/ReplayableInteraction.d.ts.map +1 -1
- package/dist/esm/tools/ReplayableInteraction.js +11 -10
- package/dist/esm/tools/ReplayableInteraction.js.map +1 -1
- package/dist/esm/tools/ScrollPageTool.d.ts +2 -2
- package/dist/esm/tools/ScrollPageTool.d.ts.map +1 -1
- package/dist/esm/tools/ScrollPageTool.js.map +1 -1
- package/dist/esm/tools/SolveMfaChallenge.d.ts +2 -2
- package/dist/esm/tools/SolveMfaChallenge.d.ts.map +1 -1
- package/dist/esm/tools/SolveMfaChallenge.js.map +1 -1
- package/dist/lib/DonobuExtendedPage.d.ts +12 -10
- package/dist/lib/DonobuExtendedPage.d.ts.map +1 -1
- package/dist/lib/PageAi.d.ts +103 -77
- package/dist/lib/PageAi.d.ts.map +1 -1
- package/dist/lib/PageAi.js +152 -272
- package/dist/lib/PageAi.js.map +1 -1
- package/dist/lib/originalGotoRegistry.d.ts +5 -0
- package/dist/lib/originalGotoRegistry.d.ts.map +1 -0
- package/dist/lib/originalGotoRegistry.js +30 -0
- package/dist/lib/originalGotoRegistry.js.map +1 -0
- package/dist/lib/pageAi/cache.d.ts +84 -0
- package/dist/lib/pageAi/cache.d.ts.map +1 -0
- package/dist/lib/pageAi/cache.js +207 -0
- package/dist/lib/pageAi/cache.js.map +1 -0
- package/dist/lib/pageAi/cacheEntryBuilder.d.ts +17 -0
- package/dist/lib/pageAi/cacheEntryBuilder.d.ts.map +1 -0
- package/dist/lib/pageAi/cacheEntryBuilder.js +25 -0
- package/dist/lib/pageAi/cacheEntryBuilder.js.map +1 -0
- package/dist/lib/testExtension.d.ts.map +1 -1
- package/dist/lib/testExtension.js +284 -282
- package/dist/lib/testExtension.js.map +1 -1
- package/dist/lib/utils/selfHealing.js +2 -2
- package/dist/lib/utils/selfHealing.js.map +1 -1
- package/dist/managers/CodeGenerator.d.ts +8 -0
- package/dist/managers/CodeGenerator.d.ts.map +1 -1
- package/dist/managers/CodeGenerator.js +104 -1
- package/dist/managers/CodeGenerator.js.map +1 -1
- package/dist/managers/PageInspector.d.ts +5 -11
- package/dist/managers/PageInspector.d.ts.map +1 -1
- package/dist/managers/PageInspector.js +4 -25
- package/dist/managers/PageInspector.js.map +1 -1
- package/dist/tools/ChooseSelectOptionTool.d.ts +2 -2
- package/dist/tools/ChooseSelectOptionTool.d.ts.map +1 -1
- package/dist/tools/ChooseSelectOptionTool.js.map +1 -1
- package/dist/tools/ClickTool.d.ts +2 -2
- package/dist/tools/ClickTool.d.ts.map +1 -1
- package/dist/tools/ClickTool.js.map +1 -1
- package/dist/tools/HoverOverElementTool.d.ts +2 -2
- package/dist/tools/HoverOverElementTool.d.ts.map +1 -1
- package/dist/tools/HoverOverElementTool.js.map +1 -1
- package/dist/tools/InputRandomizedEmailAddressTool.d.ts +2 -2
- package/dist/tools/InputRandomizedEmailAddressTool.d.ts.map +1 -1
- package/dist/tools/InputRandomizedEmailAddressTool.js.map +1 -1
- package/dist/tools/InputTextTool.d.ts +2 -2
- package/dist/tools/InputTextTool.d.ts.map +1 -1
- package/dist/tools/InputTextTool.js.map +1 -1
- package/dist/tools/PressKeyTool.d.ts +2 -2
- package/dist/tools/PressKeyTool.d.ts.map +1 -1
- package/dist/tools/PressKeyTool.js.map +1 -1
- package/dist/tools/ReplayableInteraction.d.ts +5 -4
- package/dist/tools/ReplayableInteraction.d.ts.map +1 -1
- package/dist/tools/ReplayableInteraction.js +11 -10
- package/dist/tools/ReplayableInteraction.js.map +1 -1
- package/dist/tools/ScrollPageTool.d.ts +2 -2
- package/dist/tools/ScrollPageTool.d.ts.map +1 -1
- package/dist/tools/ScrollPageTool.js.map +1 -1
- package/dist/tools/SolveMfaChallenge.d.ts +2 -2
- package/dist/tools/SolveMfaChallenge.d.ts.map +1 -1
- package/dist/tools/SolveMfaChallenge.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { ProposedToolCall } from '../../models/ProposedToolCall';
|
|
2
|
+
/**
|
|
3
|
+
* Cache key used to identify a unique `page.ai` invocation. Keep this structure
|
|
4
|
+
* aligned with the code generator so replayed runs remain deterministic.
|
|
5
|
+
*/
|
|
6
|
+
export type PageAiCacheKey = {
|
|
7
|
+
pageUrl: string;
|
|
8
|
+
instruction: string | null;
|
|
9
|
+
schema: Record<string, unknown> | null;
|
|
10
|
+
allowedTools: string[];
|
|
11
|
+
maxToolCalls: number | null;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Full payload persisted in the cache. Contains both the identifying key and
|
|
15
|
+
* the tool calls required to replay an autonomous flow deterministically.
|
|
16
|
+
*/
|
|
17
|
+
export type PageAiCacheEntry = PageAiCacheKey & {
|
|
18
|
+
toolCallCache: ProposedToolCall[];
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* JSON structure stored on disk. We keep it deliberately simple so tooling
|
|
22
|
+
* (CodeGenerator, tests) can emit files without depending on application code.
|
|
23
|
+
*/
|
|
24
|
+
export type PageAiCacheContents = {
|
|
25
|
+
caches: PageAiCacheEntry[];
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Minimal interface for cache clients. Implementations can be file-backed,
|
|
29
|
+
* in-memory (useful for tests), or even remote services.
|
|
30
|
+
*/
|
|
31
|
+
export interface PageAiCache {
|
|
32
|
+
get(key: PageAiCacheKey): Promise<ProposedToolCall[] | null>;
|
|
33
|
+
put(entry: PageAiCacheEntry): Promise<void>;
|
|
34
|
+
delete(key: PageAiCacheKey): Promise<boolean>;
|
|
35
|
+
snapshot(): Promise<PageAiCacheContents>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* File-backed implementation used by the Playwright fixture. Protects reads and
|
|
39
|
+
* writes with an OS-level lock so concurrent processes do not corrupt the file.
|
|
40
|
+
*/
|
|
41
|
+
export declare class FilePageAiCache implements PageAiCache {
|
|
42
|
+
private readonly cacheFilepath;
|
|
43
|
+
constructor(cacheFilepath: string);
|
|
44
|
+
get(key: PageAiCacheKey): Promise<ProposedToolCall[] | null>;
|
|
45
|
+
put(entry: PageAiCacheEntry): Promise<void>;
|
|
46
|
+
delete(key: PageAiCacheKey): Promise<boolean>;
|
|
47
|
+
/**
|
|
48
|
+
* Returns an in-memory snapshot of the cache content in the same shape used
|
|
49
|
+
* on disk. This is handy for code generation scenarios where we want to emit
|
|
50
|
+
* a `donobu.json` file without touching the real cache.
|
|
51
|
+
*/
|
|
52
|
+
snapshot(): Promise<PageAiCacheContents>;
|
|
53
|
+
/**
|
|
54
|
+
* Lazily creates an empty cache file. Using the `'wx'` flag keeps the method
|
|
55
|
+
* idempotent even when multiple processes start simultaneously.
|
|
56
|
+
*/
|
|
57
|
+
private ensureCacheFileExists;
|
|
58
|
+
/**
|
|
59
|
+
* Determines whether two cache descriptors refer to the same invocation.
|
|
60
|
+
* `JSON.stringify` comparisons are sufficient here because the structures are
|
|
61
|
+
* small and deterministic.
|
|
62
|
+
*/
|
|
63
|
+
private matchesKey;
|
|
64
|
+
/**
|
|
65
|
+
* Performs a structural equality check for key fields that are collections.
|
|
66
|
+
*/
|
|
67
|
+
private areEqual;
|
|
68
|
+
/**
|
|
69
|
+
* Reads and normalises the cache file, self-healing the structure when the
|
|
70
|
+
* JSON is missing expected fields.
|
|
71
|
+
*/
|
|
72
|
+
private readCacheFile;
|
|
73
|
+
/**
|
|
74
|
+
* Writes the provided cache array back to disk using the canonical JSON
|
|
75
|
+
* structure.
|
|
76
|
+
*/
|
|
77
|
+
private writeCacheFile;
|
|
78
|
+
/**
|
|
79
|
+
* Helper that serialises access to the cache file. The callback operates on
|
|
80
|
+
* the current in-memory cache and can optionally return a new array to persist.
|
|
81
|
+
*/
|
|
82
|
+
private withCacheLock;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../../src/lib/pageAi/cache.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEjE;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACvC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG;IAC9C,aAAa,EAAE,gBAAgB,EAAE,CAAC;CACnC,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC,CAAC;IAC7D,GAAG,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,QAAQ,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAC1C;AAOD;;;GAGG;AACH,qBAAa,eAAgB,YAAW,WAAW;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,MAAM;IAE5C,GAAG,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC;IAW5D,GAAG,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB3C,MAAM,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAyB1D;;;;OAIG;IACU,QAAQ,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAqBrD;;;OAGG;YACW,qBAAqB;IAiBnC;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAUlB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAOhB;;;OAGG;YACW,aAAa;IA8B3B;;;OAGG;YACW,cAAc;IAQ5B;;;OAGG;YACW,aAAa;CA0B5B"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.FilePageAiCache = void 0;
|
|
40
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
41
|
+
const LockFile = __importStar(require("proper-lockfile"));
|
|
42
|
+
/**
|
|
43
|
+
* File-backed implementation used by the Playwright fixture. Protects reads and
|
|
44
|
+
* writes with an OS-level lock so concurrent processes do not corrupt the file.
|
|
45
|
+
*/
|
|
46
|
+
class FilePageAiCache {
|
|
47
|
+
constructor(cacheFilepath) {
|
|
48
|
+
this.cacheFilepath = cacheFilepath;
|
|
49
|
+
}
|
|
50
|
+
async get(key) {
|
|
51
|
+
return this.withCacheLock(async (cache) => {
|
|
52
|
+
const matchingEntry = cache.find((entry) => this.matchesKey(entry, key));
|
|
53
|
+
return {
|
|
54
|
+
cache,
|
|
55
|
+
result: matchingEntry?.toolCallCache ?? null,
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
async put(entry) {
|
|
60
|
+
await this.withCacheLock(async (cache) => {
|
|
61
|
+
const existingIndex = cache.findIndex((candidate) => this.matchesKey(candidate, entry));
|
|
62
|
+
const modifiedCache = existingIndex === -1 ? [...cache, entry] : [...cache];
|
|
63
|
+
if (existingIndex !== -1) {
|
|
64
|
+
modifiedCache[existingIndex] = entry;
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
cache: modifiedCache,
|
|
68
|
+
result: undefined,
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
async delete(key) {
|
|
73
|
+
return this.withCacheLock(async (cache) => {
|
|
74
|
+
const targetIndex = cache.findIndex((entry) => this.matchesKey(entry, key));
|
|
75
|
+
if (targetIndex === -1) {
|
|
76
|
+
return {
|
|
77
|
+
cache,
|
|
78
|
+
result: false,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
const modifiedCache = [
|
|
82
|
+
...cache.slice(0, targetIndex),
|
|
83
|
+
...cache.slice(targetIndex + 1),
|
|
84
|
+
];
|
|
85
|
+
return {
|
|
86
|
+
cache: modifiedCache,
|
|
87
|
+
result: true,
|
|
88
|
+
};
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Returns an in-memory snapshot of the cache content in the same shape used
|
|
93
|
+
* on disk. This is handy for code generation scenarios where we want to emit
|
|
94
|
+
* a `donobu.json` file without touching the real cache.
|
|
95
|
+
*/
|
|
96
|
+
async snapshot() {
|
|
97
|
+
return this.withCacheLock(async (cache) => {
|
|
98
|
+
const clonedEntries = cache.map((entry) => ({
|
|
99
|
+
...entry,
|
|
100
|
+
allowedTools: [...entry.allowedTools],
|
|
101
|
+
toolCallCache: JSON.parse(JSON.stringify(entry.toolCallCache)),
|
|
102
|
+
schema: entry.schema === null
|
|
103
|
+
? null
|
|
104
|
+
: JSON.parse(JSON.stringify(entry.schema)),
|
|
105
|
+
}));
|
|
106
|
+
return {
|
|
107
|
+
cache,
|
|
108
|
+
result: {
|
|
109
|
+
caches: clonedEntries,
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Lazily creates an empty cache file. Using the `'wx'` flag keeps the method
|
|
116
|
+
* idempotent even when multiple processes start simultaneously.
|
|
117
|
+
*/
|
|
118
|
+
async ensureCacheFileExists() {
|
|
119
|
+
try {
|
|
120
|
+
await promises_1.default.writeFile(this.cacheFilepath, JSON.stringify({ caches: [] }, null, 2), {
|
|
121
|
+
encoding: 'utf-8',
|
|
122
|
+
flag: 'wx',
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
if (error.code !== 'EEXIST') {
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Determines whether two cache descriptors refer to the same invocation.
|
|
133
|
+
* `JSON.stringify` comparisons are sufficient here because the structures are
|
|
134
|
+
* small and deterministic.
|
|
135
|
+
*/
|
|
136
|
+
matchesKey(entry, key) {
|
|
137
|
+
return (entry.pageUrl === key.pageUrl &&
|
|
138
|
+
entry.instruction === key.instruction &&
|
|
139
|
+
this.areEqual(entry.schema, key.schema) &&
|
|
140
|
+
this.areEqual(entry.allowedTools, key.allowedTools) &&
|
|
141
|
+
entry.maxToolCalls === key.maxToolCalls);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Performs a structural equality check for key fields that are collections.
|
|
145
|
+
*/
|
|
146
|
+
areEqual(left, right) {
|
|
147
|
+
return JSON.stringify(left) === JSON.stringify(right);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Reads and normalises the cache file, self-healing the structure when the
|
|
151
|
+
* JSON is missing expected fields.
|
|
152
|
+
*/
|
|
153
|
+
async readCacheFile() {
|
|
154
|
+
try {
|
|
155
|
+
const raw = await promises_1.default.readFile(this.cacheFilepath, 'utf-8');
|
|
156
|
+
const parsed = JSON.parse(raw);
|
|
157
|
+
if (typeof parsed !== 'object' || parsed === null) {
|
|
158
|
+
throw new Error('Invalid cache file format: expected an object with a caches array.');
|
|
159
|
+
}
|
|
160
|
+
if (!Array.isArray(parsed.caches)) {
|
|
161
|
+
parsed.caches = [];
|
|
162
|
+
await promises_1.default.writeFile(this.cacheFilepath, JSON.stringify(parsed, null, 2), 'utf-8');
|
|
163
|
+
}
|
|
164
|
+
return parsed.caches;
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
if (error.code === 'ENOENT') {
|
|
168
|
+
return [];
|
|
169
|
+
}
|
|
170
|
+
throw error;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Writes the provided cache array back to disk using the canonical JSON
|
|
175
|
+
* structure.
|
|
176
|
+
*/
|
|
177
|
+
async writeCacheFile(cache) {
|
|
178
|
+
await promises_1.default.writeFile(this.cacheFilepath, JSON.stringify({ caches: cache }, null, 2), 'utf-8');
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Helper that serialises access to the cache file. The callback operates on
|
|
182
|
+
* the current in-memory cache and can optionally return a new array to persist.
|
|
183
|
+
*/
|
|
184
|
+
async withCacheLock(operation) {
|
|
185
|
+
await this.ensureCacheFileExists();
|
|
186
|
+
const release = await LockFile.lock(this.cacheFilepath, {
|
|
187
|
+
retries: {
|
|
188
|
+
retries: 5,
|
|
189
|
+
minTimeout: 100,
|
|
190
|
+
maxTimeout: 1000,
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
try {
|
|
194
|
+
const currentCache = await this.readCacheFile();
|
|
195
|
+
const { cache, result } = await operation(currentCache);
|
|
196
|
+
if (cache !== currentCache) {
|
|
197
|
+
await this.writeCacheFile(cache);
|
|
198
|
+
}
|
|
199
|
+
return result;
|
|
200
|
+
}
|
|
201
|
+
finally {
|
|
202
|
+
await release();
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
exports.FilePageAiCache = FilePageAiCache;
|
|
207
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../../src/lib/pageAi/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { FlowMetadata } from '../../models/FlowMetadata';
|
|
2
|
+
import { ProposedToolCall } from '../../models/ProposedToolCall';
|
|
3
|
+
import { PageAiCacheEntry } from './cache';
|
|
4
|
+
type CacheMetadata = Pick<FlowMetadata, 'overallObjective' | 'resultJsonSchema' | 'allowedTools' | 'maxToolCalls'>;
|
|
5
|
+
/**
|
|
6
|
+
* Utility for translating flow metadata into cache entries. By centralising the
|
|
7
|
+
* logic here, both the runtime (`PageAi`) and the code generator can build
|
|
8
|
+
* matching cache files without duplicating knowledge about the schema.
|
|
9
|
+
*/
|
|
10
|
+
export declare class PageAiCacheEntryBuilder {
|
|
11
|
+
/**
|
|
12
|
+
* Produces a cache entry that mirrors the format persisted by the runtime.
|
|
13
|
+
*/
|
|
14
|
+
static fromMetadata(pageUrl: string, metadata: CacheMetadata, toolCallCache: ProposedToolCall[]): PageAiCacheEntry;
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=cacheEntryBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cacheEntryBuilder.d.ts","sourceRoot":"","sources":["../../../../src/lib/pageAi/cacheEntryBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C,KAAK,aAAa,GAAG,IAAI,CACvB,YAAY,EACZ,kBAAkB,GAAG,kBAAkB,GAAG,cAAc,GAAG,cAAc,CAC1E,CAAC;AAEF;;;;GAIG;AACH,qBAAa,uBAAuB;IAClC;;OAEG;WACW,YAAY,CACxB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,aAAa,EACvB,aAAa,EAAE,gBAAgB,EAAE,GAChC,gBAAgB;CAUpB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PageAiCacheEntryBuilder = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Utility for translating flow metadata into cache entries. By centralising the
|
|
6
|
+
* logic here, both the runtime (`PageAi`) and the code generator can build
|
|
7
|
+
* matching cache files without duplicating knowledge about the schema.
|
|
8
|
+
*/
|
|
9
|
+
class PageAiCacheEntryBuilder {
|
|
10
|
+
/**
|
|
11
|
+
* Produces a cache entry that mirrors the format persisted by the runtime.
|
|
12
|
+
*/
|
|
13
|
+
static fromMetadata(pageUrl, metadata, toolCallCache) {
|
|
14
|
+
return {
|
|
15
|
+
pageUrl,
|
|
16
|
+
instruction: metadata.overallObjective,
|
|
17
|
+
schema: metadata.resultJsonSchema,
|
|
18
|
+
allowedTools: metadata.allowedTools,
|
|
19
|
+
maxToolCalls: metadata.maxToolCalls,
|
|
20
|
+
toolCallCache,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.PageAiCacheEntryBuilder = PageAiCacheEntryBuilder;
|
|
25
|
+
//# sourceMappingURL=cacheEntryBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cacheEntryBuilder.js","sourceRoot":"","sources":["../../../../src/lib/pageAi/cacheEntryBuilder.ts"],"names":[],"mappings":";;;AASA;;;;GAIG;AACH,MAAa,uBAAuB;IAClC;;OAEG;IACI,MAAM,CAAC,YAAY,CACxB,OAAe,EACf,QAAuB,EACvB,aAAiC;QAEjC,OAAO;YACL,OAAO;YACP,WAAW,EAAE,QAAQ,CAAC,gBAAgB;YACtC,MAAM,EAAE,QAAQ,CAAC,gBAAgB;YACjC,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,aAAa;SACd,CAAC;IACJ,CAAC;CACF;AAlBD,0DAkBC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testExtension.d.ts","sourceRoot":"","sources":["../../../src/lib/testExtension.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"testExtension.d.ts","sourceRoot":"","sources":["../../../src/lib/testExtension.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAoDjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAepE,cAAc,iBAAiB,CAAC;AAoBhC,eAAO,MAAM,IAAI;mBACA,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC;gBACrD,SAAS;UACf,kBAAkB;wGAwHxB,CAAC"}
|