@parkinglot/protocol 0.1.0
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/LICENSE +21 -0
- package/dist/constants.d.ts +4 -0
- package/dist/constants.js +7 -0
- package/dist/constants.js.map +1 -0
- package/dist/envelope.d.ts +53 -0
- package/dist/envelope.js +40 -0
- package/dist/envelope.js.map +1 -0
- package/dist/errors.d.ts +17 -0
- package/dist/errors.js +45 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/methods.d.ts +189 -0
- package/dist/methods.js +77 -0
- package/dist/methods.js.map +1 -0
- package/dist/runtime.d.ts +10 -0
- package/dist/runtime.js +9 -0
- package/dist/runtime.js.map +1 -0
- package/dist/schemas.d.ts +238 -0
- package/dist/schemas.js +153 -0
- package/dist/schemas.js.map +1 -0
- package/dist/types.d.ts +68 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +49 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 ParkingLot contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAgB,CAAC;AAEjD,kDAAkD;AAClD,MAAM,CAAC,MAAM,aAAa,GAAG,YAAqB,CAAC;AAEnD,MAAM,UAAU,YAAY;IAC1B,OAAO,aAAa,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { ErrorCode } from './errors.js';
|
|
2
|
+
import type { Method, ParamsMap, ResultMap } from './methods.js';
|
|
3
|
+
import type { ContextSnapshot } from './types.js';
|
|
4
|
+
/**
|
|
5
|
+
* 请求信封。params 可省略(NoopParams 命令)。
|
|
6
|
+
* sessionId / tabId 为 server 寻址后注入的目标字段(与 Response 信封对称),
|
|
7
|
+
* CLI/HTTP 客户端可选传入,extension 收到的请求总是携带已解析的目标。
|
|
8
|
+
*/
|
|
9
|
+
export interface Request<M extends Method = Method> {
|
|
10
|
+
id: string;
|
|
11
|
+
method: M;
|
|
12
|
+
params?: ParamsMap[M];
|
|
13
|
+
sessionId?: string;
|
|
14
|
+
tabId?: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 命令结果信封。三个公共字段统一携带寻址与连续性信息:
|
|
18
|
+
* - sessionId / tabId:本次命令实际作用的会话与标签页(寻址解析结果)
|
|
19
|
+
* - context:页面上下文快照(url/title/navId)——Agent 连续性的"自证"
|
|
20
|
+
* data 存放命令特有结果。
|
|
21
|
+
*/
|
|
22
|
+
export interface CommandResult<M extends Method = Method> {
|
|
23
|
+
sessionId?: string;
|
|
24
|
+
tabId?: number;
|
|
25
|
+
context?: ContextSnapshot;
|
|
26
|
+
data: ResultMap[M];
|
|
27
|
+
}
|
|
28
|
+
export interface Response<M extends Method = Method> {
|
|
29
|
+
id: string;
|
|
30
|
+
result: CommandResult<M>;
|
|
31
|
+
}
|
|
32
|
+
export interface ErrorBody {
|
|
33
|
+
code: ErrorCode;
|
|
34
|
+
message: string;
|
|
35
|
+
data?: Record<string, unknown>;
|
|
36
|
+
}
|
|
37
|
+
/** 错误信封(Response 的失败形态,与成功 Response 共用 id)。 */
|
|
38
|
+
export interface ProtocolError {
|
|
39
|
+
id: string;
|
|
40
|
+
error: ErrorBody;
|
|
41
|
+
}
|
|
42
|
+
export declare const EVENT_NAMES: readonly ["extension.connected", "extension.disconnected", "extension.tab-activated", "page.navigated", "approval.requested", "approval.responded", "approval.respond"];
|
|
43
|
+
export type EventName = (typeof EVENT_NAMES)[number];
|
|
44
|
+
/** 事件消息(extension → server,server 按需转发给订阅方)。 */
|
|
45
|
+
export interface EventMessage {
|
|
46
|
+
event: EventName;
|
|
47
|
+
params: Record<string, unknown>;
|
|
48
|
+
}
|
|
49
|
+
export type Message = Request | Response | ProtocolError | EventMessage;
|
|
50
|
+
export declare function isRequest(value: unknown): value is Request;
|
|
51
|
+
export declare function isResponse(value: unknown): value is Response;
|
|
52
|
+
export declare function isError(value: unknown): value is ProtocolError;
|
|
53
|
+
export declare function isEvent(value: unknown): value is EventMessage;
|
package/dist/envelope.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export const EVENT_NAMES = [
|
|
2
|
+
'extension.connected',
|
|
3
|
+
'extension.disconnected',
|
|
4
|
+
'extension.tab-activated',
|
|
5
|
+
'page.navigated',
|
|
6
|
+
'approval.requested',
|
|
7
|
+
'approval.responded',
|
|
8
|
+
// 扩展 → server 控制事件:popup 对 HITL 请求的批准/拒绝
|
|
9
|
+
'approval.respond',
|
|
10
|
+
// Network.* 为扩展点:v1 不实现页面级网络事件
|
|
11
|
+
];
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// 类型守卫(wire 层判别,供 WS/HTTP 消息路由使用)
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
function isRecord(value) {
|
|
16
|
+
return typeof value === 'object' && value !== null;
|
|
17
|
+
}
|
|
18
|
+
export function isRequest(value) {
|
|
19
|
+
return (isRecord(value) &&
|
|
20
|
+
typeof value.id === 'string' &&
|
|
21
|
+
typeof value.method === 'string' &&
|
|
22
|
+
(value.params === undefined || isRecord(value.params)));
|
|
23
|
+
}
|
|
24
|
+
export function isResponse(value) {
|
|
25
|
+
return (isRecord(value) &&
|
|
26
|
+
typeof value.id === 'string' &&
|
|
27
|
+
isRecord(value.result) &&
|
|
28
|
+
'data' in value.result);
|
|
29
|
+
}
|
|
30
|
+
export function isError(value) {
|
|
31
|
+
return (isRecord(value) &&
|
|
32
|
+
typeof value.id === 'string' &&
|
|
33
|
+
isRecord(value.error) &&
|
|
34
|
+
typeof value.error.code === 'string' &&
|
|
35
|
+
typeof value.error.message === 'string');
|
|
36
|
+
}
|
|
37
|
+
export function isEvent(value) {
|
|
38
|
+
return isRecord(value) && typeof value.event === 'string' && isRecord(value.params);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=envelope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envelope.js","sourceRoot":"","sources":["../src/envelope.ts"],"names":[],"mappings":"AA+CA,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,qBAAqB;IACrB,wBAAwB;IACxB,yBAAyB;IACzB,gBAAgB;IAChB,oBAAoB;IACpB,oBAAoB;IACpB,yCAAyC;IACzC,kBAAkB;IAClB,+BAA+B;CACvB,CAAC;AAYX,8EAA8E;AAC9E,kCAAkC;AAClC,8EAA8E;AAE9E,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;QAC5B,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;QAChC,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CACvD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;QAC5B,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,MAAM,CACvB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;QAC5B,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;QACrB,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ;QACpC,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,KAAK,QAAQ,CACxC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACtF,CAAC"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 协议错误码与错误类型。
|
|
3
|
+
* 错误码是 wire 协议的一部分:extension 与 server 两侧都必须使用同一套枚举。
|
|
4
|
+
*/
|
|
5
|
+
export declare const ERROR_CODES: readonly ["INVALID_REQUEST", "INVALID_PARAMS", "UNKNOWN_METHOD", "MESSAGE_TOO_LARGE", "EXTENSION_OFFLINE", "EXTENSION_NO_TAB", "SESSION_NOT_FOUND", "SESSION_TAB_CLOSED", "TIMEOUT", "TARGET_NOT_FOUND", "TARGET_AMBIGUOUS", "URL_INVALID", "HOST_NOT_ALLOWED", "EVAL_DISABLED", "PENDING_APPROVAL", "APPROVAL_DENIED", "APPROVAL_TIMEOUT", "INTERNAL"];
|
|
6
|
+
export type ErrorCode = (typeof ERROR_CODES)[number];
|
|
7
|
+
export interface ProtocolErrorData {
|
|
8
|
+
requestId?: string;
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
}
|
|
11
|
+
/** 协议层错误:携带稳定的机器可读 code,供 CLI/Agent 决策。 */
|
|
12
|
+
export declare class ParkinglotError extends Error {
|
|
13
|
+
readonly code: ErrorCode;
|
|
14
|
+
readonly data: ProtocolErrorData | undefined;
|
|
15
|
+
constructor(code: ErrorCode, message: string, data?: ProtocolErrorData);
|
|
16
|
+
}
|
|
17
|
+
export declare function isErrorCode(value: unknown): value is ErrorCode;
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 协议错误码与错误类型。
|
|
3
|
+
* 错误码是 wire 协议的一部分:extension 与 server 两侧都必须使用同一套枚举。
|
|
4
|
+
*/
|
|
5
|
+
export const ERROR_CODES = [
|
|
6
|
+
// 信封/参数层
|
|
7
|
+
'INVALID_REQUEST',
|
|
8
|
+
'INVALID_PARAMS',
|
|
9
|
+
'UNKNOWN_METHOD',
|
|
10
|
+
'MESSAGE_TOO_LARGE',
|
|
11
|
+
// 连接层
|
|
12
|
+
'EXTENSION_OFFLINE',
|
|
13
|
+
'EXTENSION_NO_TAB',
|
|
14
|
+
// 会话/寻址层
|
|
15
|
+
'SESSION_NOT_FOUND',
|
|
16
|
+
'SESSION_TAB_CLOSED',
|
|
17
|
+
// 执行层
|
|
18
|
+
'TIMEOUT',
|
|
19
|
+
'TARGET_NOT_FOUND',
|
|
20
|
+
'TARGET_AMBIGUOUS',
|
|
21
|
+
'URL_INVALID',
|
|
22
|
+
'HOST_NOT_ALLOWED',
|
|
23
|
+
'EVAL_DISABLED',
|
|
24
|
+
// HITL 层
|
|
25
|
+
'PENDING_APPROVAL',
|
|
26
|
+
'APPROVAL_DENIED',
|
|
27
|
+
'APPROVAL_TIMEOUT',
|
|
28
|
+
// 兜底
|
|
29
|
+
'INTERNAL',
|
|
30
|
+
];
|
|
31
|
+
/** 协议层错误:携带稳定的机器可读 code,供 CLI/Agent 决策。 */
|
|
32
|
+
export class ParkinglotError extends Error {
|
|
33
|
+
code;
|
|
34
|
+
data;
|
|
35
|
+
constructor(code, message, data) {
|
|
36
|
+
super(message);
|
|
37
|
+
this.name = 'ParkinglotError';
|
|
38
|
+
this.code = code;
|
|
39
|
+
this.data = data;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export function isErrorCode(value) {
|
|
43
|
+
return typeof value === 'string' && ERROR_CODES.includes(value);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,SAAS;IACT,iBAAiB;IACjB,gBAAgB;IAChB,gBAAgB;IAChB,mBAAmB;IACnB,MAAM;IACN,mBAAmB;IACnB,kBAAkB;IAClB,SAAS;IACT,mBAAmB;IACnB,oBAAoB;IACpB,MAAM;IACN,SAAS;IACT,kBAAkB;IAClB,kBAAkB;IAClB,aAAa;IACb,kBAAkB;IAClB,eAAe;IACf,SAAS;IACT,kBAAkB;IAClB,iBAAiB;IACjB,kBAAkB;IAClB,KAAK;IACL,UAAU;CACF,CAAC;AASX,2CAA2C;AAC3C,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAC/B,IAAI,CAAY;IAChB,IAAI,CAAgC;IAE7C,YAAY,IAAe,EAAE,OAAe,EAAE,IAAwB;QACpE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,WAAiC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzF,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @parkinglot/protocol — 共享协议层。
|
|
3
|
+
*
|
|
4
|
+
* 内容:消息信封(Request/Response/Error/Event)、命令全集与类型映射、
|
|
5
|
+
* 公共类型(ContextSnapshot/PageSnapshot/ElementInfo/SessionInfo…)、
|
|
6
|
+
* 错误码、Zod 校验 schema。
|
|
7
|
+
*
|
|
8
|
+
* 协议权威文档:skills/parkinglot/references/protocol.md
|
|
9
|
+
*/
|
|
10
|
+
export { PROTOCOL_NAME, PROTOCOL_VERSION, protocolName } from './constants.js';
|
|
11
|
+
export * from './errors.js';
|
|
12
|
+
export * from './types.js';
|
|
13
|
+
export * from './methods.js';
|
|
14
|
+
export * from './envelope.js';
|
|
15
|
+
export * from './schemas.js';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @parkinglot/protocol — 共享协议层。
|
|
3
|
+
*
|
|
4
|
+
* 内容:消息信封(Request/Response/Error/Event)、命令全集与类型映射、
|
|
5
|
+
* 公共类型(ContextSnapshot/PageSnapshot/ElementInfo/SessionInfo…)、
|
|
6
|
+
* 错误码、Zod 校验 schema。
|
|
7
|
+
*
|
|
8
|
+
* 协议权威文档:skills/parkinglot/references/protocol.md
|
|
9
|
+
*/
|
|
10
|
+
export { PROTOCOL_NAME, PROTOCOL_VERSION, protocolName } from './constants.js';
|
|
11
|
+
export * from './errors.js';
|
|
12
|
+
export * from './types.js';
|
|
13
|
+
export * from './methods.js';
|
|
14
|
+
export * from './envelope.js';
|
|
15
|
+
export * from './schemas.js';
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE/E,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import type { ElementInfo, PageSnapshot, SearchPagination, SearchResult, SessionInfo, TabInfo, Viewport } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* 命令全集(v1)。method 名与 CLI 子命令一一对应(kebab-case)。
|
|
4
|
+
* 分类:导航 / 交互 / 滚动截图 / 提取 / 页面内网络 / 标签页 / 等待 / 会话 / 高级。
|
|
5
|
+
*/
|
|
6
|
+
export declare const METHODS: readonly ["goto", "back", "forward", "reload", "click", "click-text", "fill", "type", "press", "hover", "select", "scroll", "screenshot", "extract", "get-page-info", "fetch", "search", "list-tabs", "create-tab", "close-tab", "activate-tab", "wait", "ping", "get-status", "eval"];
|
|
7
|
+
export type Method = (typeof METHODS)[number];
|
|
8
|
+
/** HITL 分类:'always'=写操作需批准;'never'=只读;'conditional'=视参数(fetch 的 HTTP method)。 */
|
|
9
|
+
export type WriteAccess = 'always' | 'never' | 'conditional';
|
|
10
|
+
export interface MethodMeta {
|
|
11
|
+
writeAccess: WriteAccess;
|
|
12
|
+
summary: string;
|
|
13
|
+
}
|
|
14
|
+
export declare const METHOD_META: Record<Method, MethodMeta>;
|
|
15
|
+
export type NoopParams = Record<string, never>;
|
|
16
|
+
export interface GotoParams {
|
|
17
|
+
url: string;
|
|
18
|
+
waitUntil?: 'load' | 'domcontentloaded';
|
|
19
|
+
}
|
|
20
|
+
export interface ClickParams {
|
|
21
|
+
selector: string;
|
|
22
|
+
}
|
|
23
|
+
export interface ClickTextParams {
|
|
24
|
+
text: string;
|
|
25
|
+
}
|
|
26
|
+
export interface FillParams {
|
|
27
|
+
selector: string;
|
|
28
|
+
value: string;
|
|
29
|
+
}
|
|
30
|
+
export interface TypeParams {
|
|
31
|
+
selector: string;
|
|
32
|
+
text: string;
|
|
33
|
+
}
|
|
34
|
+
export interface PressParams {
|
|
35
|
+
selector?: string;
|
|
36
|
+
key: string;
|
|
37
|
+
}
|
|
38
|
+
export interface HoverParams {
|
|
39
|
+
selector: string;
|
|
40
|
+
}
|
|
41
|
+
export interface SelectParams {
|
|
42
|
+
selector: string;
|
|
43
|
+
/** value 与 label 至少提供其一 */
|
|
44
|
+
value?: string;
|
|
45
|
+
label?: string;
|
|
46
|
+
}
|
|
47
|
+
export interface ScrollParams {
|
|
48
|
+
/** direction 与 amount 二选一;提供 selector 则滚动该元素 */
|
|
49
|
+
direction?: 'up' | 'down' | 'top' | 'bottom';
|
|
50
|
+
amount?: number;
|
|
51
|
+
selector?: string;
|
|
52
|
+
}
|
|
53
|
+
export interface ScreenshotParams {
|
|
54
|
+
format?: 'png' | 'jpeg';
|
|
55
|
+
fullPage?: boolean;
|
|
56
|
+
/** 由 CLI 侧解析后写入的本地路径(协议不负责写文件) */
|
|
57
|
+
path?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface ExtractParams {
|
|
60
|
+
mode?: 'text' | 'structured';
|
|
61
|
+
/** 返回文本的最大字符数(LLM 上下文裁剪) */
|
|
62
|
+
limit?: number;
|
|
63
|
+
}
|
|
64
|
+
export interface FetchParams {
|
|
65
|
+
url: string;
|
|
66
|
+
method?: string;
|
|
67
|
+
headers?: Record<string, string>;
|
|
68
|
+
body?: string;
|
|
69
|
+
returnType?: 'text' | 'json' | 'binary';
|
|
70
|
+
}
|
|
71
|
+
export interface SearchParams {
|
|
72
|
+
query: string;
|
|
73
|
+
engine?: string;
|
|
74
|
+
/** 结果页页码(1-based,默认 1;每页 ~10 条) */
|
|
75
|
+
page?: number;
|
|
76
|
+
}
|
|
77
|
+
export interface CreateTabParams {
|
|
78
|
+
url: string;
|
|
79
|
+
}
|
|
80
|
+
export interface CloseTabParams {
|
|
81
|
+
tabId?: number;
|
|
82
|
+
}
|
|
83
|
+
export interface ActivateTabParams {
|
|
84
|
+
tabId: number;
|
|
85
|
+
}
|
|
86
|
+
export interface WaitParams {
|
|
87
|
+
/** ms / selector / condition 至少提供其一 */
|
|
88
|
+
ms?: number;
|
|
89
|
+
selector?: string;
|
|
90
|
+
condition?: 'networkidle' | 'load';
|
|
91
|
+
}
|
|
92
|
+
export interface EvalParams {
|
|
93
|
+
expression: string;
|
|
94
|
+
}
|
|
95
|
+
export interface ParamsMap {
|
|
96
|
+
goto: GotoParams;
|
|
97
|
+
back: NoopParams;
|
|
98
|
+
forward: NoopParams;
|
|
99
|
+
reload: NoopParams;
|
|
100
|
+
click: ClickParams;
|
|
101
|
+
'click-text': ClickTextParams;
|
|
102
|
+
fill: FillParams;
|
|
103
|
+
type: TypeParams;
|
|
104
|
+
press: PressParams;
|
|
105
|
+
hover: HoverParams;
|
|
106
|
+
select: SelectParams;
|
|
107
|
+
scroll: ScrollParams;
|
|
108
|
+
screenshot: ScreenshotParams;
|
|
109
|
+
extract: ExtractParams;
|
|
110
|
+
'get-page-info': NoopParams;
|
|
111
|
+
fetch: FetchParams;
|
|
112
|
+
search: SearchParams;
|
|
113
|
+
'list-tabs': NoopParams;
|
|
114
|
+
'create-tab': CreateTabParams;
|
|
115
|
+
'close-tab': CloseTabParams;
|
|
116
|
+
'activate-tab': ActivateTabParams;
|
|
117
|
+
wait: WaitParams;
|
|
118
|
+
ping: NoopParams;
|
|
119
|
+
'get-status': NoopParams;
|
|
120
|
+
eval: EvalParams;
|
|
121
|
+
}
|
|
122
|
+
export interface ElementActionResult {
|
|
123
|
+
element: ElementInfo;
|
|
124
|
+
}
|
|
125
|
+
export interface ResultMap {
|
|
126
|
+
goto: Record<string, never>;
|
|
127
|
+
back: Record<string, never>;
|
|
128
|
+
forward: Record<string, never>;
|
|
129
|
+
reload: Record<string, never>;
|
|
130
|
+
click: ElementActionResult;
|
|
131
|
+
'click-text': ElementActionResult;
|
|
132
|
+
fill: ElementActionResult;
|
|
133
|
+
type: ElementActionResult;
|
|
134
|
+
press: ElementActionResult;
|
|
135
|
+
hover: ElementActionResult;
|
|
136
|
+
select: ElementActionResult;
|
|
137
|
+
scroll: {
|
|
138
|
+
viewport: Viewport;
|
|
139
|
+
};
|
|
140
|
+
screenshot: {
|
|
141
|
+
data?: string;
|
|
142
|
+
path?: string;
|
|
143
|
+
};
|
|
144
|
+
extract: {
|
|
145
|
+
snapshot: PageSnapshot;
|
|
146
|
+
};
|
|
147
|
+
'get-page-info': {
|
|
148
|
+
url: string;
|
|
149
|
+
title: string;
|
|
150
|
+
viewport: Viewport;
|
|
151
|
+
scrollY: number;
|
|
152
|
+
};
|
|
153
|
+
fetch: {
|
|
154
|
+
status: number;
|
|
155
|
+
statusText?: string;
|
|
156
|
+
headers: Record<string, string>;
|
|
157
|
+
body: string;
|
|
158
|
+
};
|
|
159
|
+
search: {
|
|
160
|
+
results: SearchResult[];
|
|
161
|
+
pagination?: SearchPagination;
|
|
162
|
+
};
|
|
163
|
+
'list-tabs': {
|
|
164
|
+
tabs: TabInfo[];
|
|
165
|
+
};
|
|
166
|
+
'create-tab': {
|
|
167
|
+
tab: TabInfo;
|
|
168
|
+
};
|
|
169
|
+
'close-tab': Record<string, never>;
|
|
170
|
+
'activate-tab': {
|
|
171
|
+
tab: TabInfo;
|
|
172
|
+
};
|
|
173
|
+
wait: Record<string, never>;
|
|
174
|
+
ping: {
|
|
175
|
+
pong: 'pong';
|
|
176
|
+
protocolVersion: string;
|
|
177
|
+
extensionConnected: boolean;
|
|
178
|
+
};
|
|
179
|
+
'get-status': {
|
|
180
|
+
extensionConnected: boolean;
|
|
181
|
+
sessions: SessionInfo[];
|
|
182
|
+
config: Record<string, unknown>;
|
|
183
|
+
};
|
|
184
|
+
eval: {
|
|
185
|
+
value: unknown;
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
export type ParamsOf<M extends Method> = ParamsMap[M];
|
|
189
|
+
export type ResultOf<M extends Method> = ResultMap[M];
|
package/dist/methods.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 命令全集(v1)。method 名与 CLI 子命令一一对应(kebab-case)。
|
|
3
|
+
* 分类:导航 / 交互 / 滚动截图 / 提取 / 页面内网络 / 标签页 / 等待 / 会话 / 高级。
|
|
4
|
+
*/
|
|
5
|
+
export const METHODS = [
|
|
6
|
+
// 导航
|
|
7
|
+
'goto',
|
|
8
|
+
'back',
|
|
9
|
+
'forward',
|
|
10
|
+
'reload',
|
|
11
|
+
// 交互
|
|
12
|
+
'click',
|
|
13
|
+
'click-text',
|
|
14
|
+
'fill',
|
|
15
|
+
'type',
|
|
16
|
+
'press',
|
|
17
|
+
'hover',
|
|
18
|
+
'select',
|
|
19
|
+
// 滚动 / 视图
|
|
20
|
+
'scroll',
|
|
21
|
+
'screenshot',
|
|
22
|
+
// 提取
|
|
23
|
+
'extract',
|
|
24
|
+
'get-page-info',
|
|
25
|
+
// 页面内网络
|
|
26
|
+
'fetch',
|
|
27
|
+
'search',
|
|
28
|
+
// 标签页
|
|
29
|
+
'list-tabs',
|
|
30
|
+
'create-tab',
|
|
31
|
+
'close-tab',
|
|
32
|
+
'activate-tab',
|
|
33
|
+
// 等待
|
|
34
|
+
'wait',
|
|
35
|
+
// 会话
|
|
36
|
+
'ping',
|
|
37
|
+
'get-status',
|
|
38
|
+
// 高级(默认禁用)
|
|
39
|
+
'eval',
|
|
40
|
+
];
|
|
41
|
+
export const METHOD_META = {
|
|
42
|
+
// 导航
|
|
43
|
+
goto: { writeAccess: 'always', summary: '导航到指定 URL' },
|
|
44
|
+
back: { writeAccess: 'always', summary: '后退到上一页' },
|
|
45
|
+
forward: { writeAccess: 'always', summary: '前进到下一页' },
|
|
46
|
+
reload: { writeAccess: 'always', summary: '重新加载当前页' },
|
|
47
|
+
// 交互
|
|
48
|
+
click: { writeAccess: 'always', summary: '按 CSS 选择器点击元素' },
|
|
49
|
+
'click-text': { writeAccess: 'always', summary: '按可见文本点击元素' },
|
|
50
|
+
fill: { writeAccess: 'always', summary: '填充输入框(整体替换)' },
|
|
51
|
+
type: { writeAccess: 'always', summary: '聚焦后逐键输入' },
|
|
52
|
+
press: { writeAccess: 'always', summary: '按下键盘按键' },
|
|
53
|
+
hover: { writeAccess: 'always', summary: '悬停在元素上' },
|
|
54
|
+
select: { writeAccess: 'always', summary: '选择下拉选项' },
|
|
55
|
+
// 滚动 / 视图
|
|
56
|
+
scroll: { writeAccess: 'always', summary: '滚动页面或元素' },
|
|
57
|
+
screenshot: { writeAccess: 'never', summary: '截图(viewport 或整页)' },
|
|
58
|
+
// 提取
|
|
59
|
+
extract: { writeAccess: 'never', summary: '提取页面可读文本快照' },
|
|
60
|
+
'get-page-info': { writeAccess: 'never', summary: '获取页面 URL/标题/视口/滚动位置' },
|
|
61
|
+
// 页面内网络
|
|
62
|
+
fetch: { writeAccess: 'conditional', summary: '在页面上下文发起网络请求(带登录态)' },
|
|
63
|
+
search: { writeAccess: 'never', summary: '用搜索引擎查询并返回结果列表' },
|
|
64
|
+
// 标签页
|
|
65
|
+
'list-tabs': { writeAccess: 'never', summary: '列出所有标签页' },
|
|
66
|
+
'create-tab': { writeAccess: 'always', summary: '新建标签页' },
|
|
67
|
+
'close-tab': { writeAccess: 'always', summary: '关闭标签页' },
|
|
68
|
+
'activate-tab': { writeAccess: 'always', summary: '激活(切换到)标签页' },
|
|
69
|
+
// 等待
|
|
70
|
+
wait: { writeAccess: 'never', summary: '等待时间/元素/加载条件' },
|
|
71
|
+
// 会话
|
|
72
|
+
ping: { writeAccess: 'never', summary: '连通性检查(pong + 版本)' },
|
|
73
|
+
'get-status': { writeAccess: 'never', summary: '获取 server/扩展/session 状态摘要' },
|
|
74
|
+
// 高级
|
|
75
|
+
eval: { writeAccess: 'always', summary: '在页面上下文执行 JS(默认禁用)' },
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=methods.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"methods.js","sourceRoot":"","sources":["../src/methods.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 运行时子路径导出:不引入 zod/schemas,供浏览器端(extension)使用。
|
|
3
|
+
* 类型可从主包或此处导入(type-only,编译期消除)。
|
|
4
|
+
*/
|
|
5
|
+
export { PROTOCOL_NAME, PROTOCOL_VERSION, protocolName } from './constants.js';
|
|
6
|
+
export { ERROR_CODES, ParkinglotError, isErrorCode, type ErrorCode, type ProtocolErrorData, } from './errors.js';
|
|
7
|
+
export { EVENT_NAMES, isError, isEvent, isRequest, isResponse, type CommandResult, type ErrorBody, type EventMessage, type EventName, type Message, type ProtocolError, type Request, type Response, } from './envelope.js';
|
|
8
|
+
export { METHOD_META, METHODS, type Method, type MethodMeta, type WriteAccess } from './methods.js';
|
|
9
|
+
export type { ActivateTabParams, ClickParams, ClickTextParams, CloseTabParams, CreateTabParams, EvalParams, FetchParams, FillParams, GotoParams, HoverParams, NoopParams, ParamsMap, ParamsOf, PressParams, ResultMap, ResultOf, ScrollParams, ScreenshotParams, SearchParams, SelectParams, TypeParams, WaitParams, } from './methods.js';
|
|
10
|
+
export type { ContextSnapshot, ElementBox, ElementInfo, Locator, PageSnapshot, SearchPagination, SearchResult, SessionInfo, SessionMode, TabInfo, Viewport, } from './types.js';
|
package/dist/runtime.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 运行时子路径导出:不引入 zod/schemas,供浏览器端(extension)使用。
|
|
3
|
+
* 类型可从主包或此处导入(type-only,编译期消除)。
|
|
4
|
+
*/
|
|
5
|
+
export { PROTOCOL_NAME, PROTOCOL_VERSION, protocolName } from './constants.js';
|
|
6
|
+
export { ERROR_CODES, ParkinglotError, isErrorCode, } from './errors.js';
|
|
7
|
+
export { EVENT_NAMES, isError, isEvent, isRequest, isResponse, } from './envelope.js';
|
|
8
|
+
export { METHOD_META, METHODS } from './methods.js';
|
|
9
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EACL,WAAW,EACX,eAAe,EACf,WAAW,GAGZ,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,WAAW,EACX,OAAO,EACP,OAAO,EACP,SAAS,EACT,UAAU,GASX,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,OAAO,EAAkD,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { Method } from './methods.js';
|
|
3
|
+
import type { ParamsMap } from './methods.js';
|
|
4
|
+
/**
|
|
5
|
+
* Zod 校验层。原则(Postel's Law):
|
|
6
|
+
* - 发送保守:schema 精确到每个命令的参数形状
|
|
7
|
+
* - 接收宽容:未知字段默认 strip,缺省字段用 optional/默认值
|
|
8
|
+
*/
|
|
9
|
+
export declare const contextSchema: z.ZodObject<{
|
|
10
|
+
url: z.ZodString;
|
|
11
|
+
title: z.ZodString;
|
|
12
|
+
navId: z.ZodNumber;
|
|
13
|
+
tabId: z.ZodNumber;
|
|
14
|
+
}, z.core.$strip>;
|
|
15
|
+
export declare const viewportSchema: z.ZodObject<{
|
|
16
|
+
width: z.ZodNumber;
|
|
17
|
+
height: z.ZodNumber;
|
|
18
|
+
}, z.core.$strip>;
|
|
19
|
+
export declare const elementInfoSchema: z.ZodObject<{
|
|
20
|
+
tag: z.ZodString;
|
|
21
|
+
text: z.ZodOptional<z.ZodString>;
|
|
22
|
+
attrs: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
23
|
+
box: z.ZodOptional<z.ZodObject<{
|
|
24
|
+
x: z.ZodNumber;
|
|
25
|
+
y: z.ZodNumber;
|
|
26
|
+
width: z.ZodNumber;
|
|
27
|
+
height: z.ZodNumber;
|
|
28
|
+
}, z.core.$strip>>;
|
|
29
|
+
}, z.core.$strip>;
|
|
30
|
+
export declare const paramsSchemas: {
|
|
31
|
+
goto: z.ZodObject<{
|
|
32
|
+
url: z.ZodString;
|
|
33
|
+
waitUntil: z.ZodOptional<z.ZodEnum<{
|
|
34
|
+
load: "load";
|
|
35
|
+
domcontentloaded: "domcontentloaded";
|
|
36
|
+
}>>;
|
|
37
|
+
}, z.core.$strip>;
|
|
38
|
+
back: z.ZodObject<{}, z.core.$strip>;
|
|
39
|
+
forward: z.ZodObject<{}, z.core.$strip>;
|
|
40
|
+
reload: z.ZodObject<{}, z.core.$strip>;
|
|
41
|
+
click: z.ZodObject<{
|
|
42
|
+
selector: z.ZodString;
|
|
43
|
+
}, z.core.$strip>;
|
|
44
|
+
'click-text': z.ZodObject<{
|
|
45
|
+
text: z.ZodString;
|
|
46
|
+
}, z.core.$strip>;
|
|
47
|
+
fill: z.ZodObject<{
|
|
48
|
+
selector: z.ZodString;
|
|
49
|
+
value: z.ZodString;
|
|
50
|
+
}, z.core.$strip>;
|
|
51
|
+
type: z.ZodObject<{
|
|
52
|
+
selector: z.ZodString;
|
|
53
|
+
text: z.ZodString;
|
|
54
|
+
}, z.core.$strip>;
|
|
55
|
+
press: z.ZodObject<{
|
|
56
|
+
selector: z.ZodOptional<z.ZodString>;
|
|
57
|
+
key: z.ZodString;
|
|
58
|
+
}, z.core.$strip>;
|
|
59
|
+
hover: z.ZodObject<{
|
|
60
|
+
selector: z.ZodString;
|
|
61
|
+
}, z.core.$strip>;
|
|
62
|
+
select: z.ZodObject<{
|
|
63
|
+
selector: z.ZodString;
|
|
64
|
+
value: z.ZodOptional<z.ZodString>;
|
|
65
|
+
label: z.ZodOptional<z.ZodString>;
|
|
66
|
+
}, z.core.$strip>;
|
|
67
|
+
scroll: z.ZodObject<{
|
|
68
|
+
direction: z.ZodOptional<z.ZodEnum<{
|
|
69
|
+
up: "up";
|
|
70
|
+
down: "down";
|
|
71
|
+
top: "top";
|
|
72
|
+
bottom: "bottom";
|
|
73
|
+
}>>;
|
|
74
|
+
amount: z.ZodOptional<z.ZodNumber>;
|
|
75
|
+
selector: z.ZodOptional<z.ZodString>;
|
|
76
|
+
}, z.core.$strip>;
|
|
77
|
+
screenshot: z.ZodObject<{
|
|
78
|
+
format: z.ZodOptional<z.ZodEnum<{
|
|
79
|
+
png: "png";
|
|
80
|
+
jpeg: "jpeg";
|
|
81
|
+
}>>;
|
|
82
|
+
fullPage: z.ZodOptional<z.ZodBoolean>;
|
|
83
|
+
path: z.ZodOptional<z.ZodString>;
|
|
84
|
+
}, z.core.$strip>;
|
|
85
|
+
extract: z.ZodObject<{
|
|
86
|
+
mode: z.ZodOptional<z.ZodEnum<{
|
|
87
|
+
text: "text";
|
|
88
|
+
structured: "structured";
|
|
89
|
+
}>>;
|
|
90
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
91
|
+
}, z.core.$strip>;
|
|
92
|
+
'get-page-info': z.ZodObject<{}, z.core.$strip>;
|
|
93
|
+
fetch: z.ZodObject<{
|
|
94
|
+
url: z.ZodString;
|
|
95
|
+
method: z.ZodOptional<z.ZodString>;
|
|
96
|
+
headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
97
|
+
body: z.ZodOptional<z.ZodString>;
|
|
98
|
+
returnType: z.ZodOptional<z.ZodEnum<{
|
|
99
|
+
text: "text";
|
|
100
|
+
json: "json";
|
|
101
|
+
binary: "binary";
|
|
102
|
+
}>>;
|
|
103
|
+
}, z.core.$strip>;
|
|
104
|
+
search: z.ZodObject<{
|
|
105
|
+
query: z.ZodString;
|
|
106
|
+
engine: z.ZodOptional<z.ZodString>;
|
|
107
|
+
page: z.ZodOptional<z.ZodNumber>;
|
|
108
|
+
}, z.core.$strip>;
|
|
109
|
+
'list-tabs': z.ZodObject<{}, z.core.$strip>;
|
|
110
|
+
'create-tab': z.ZodObject<{
|
|
111
|
+
url: z.ZodString;
|
|
112
|
+
}, z.core.$strip>;
|
|
113
|
+
'close-tab': z.ZodObject<{
|
|
114
|
+
tabId: z.ZodOptional<z.ZodNumber>;
|
|
115
|
+
}, z.core.$strip>;
|
|
116
|
+
'activate-tab': z.ZodObject<{
|
|
117
|
+
tabId: z.ZodNumber;
|
|
118
|
+
}, z.core.$strip>;
|
|
119
|
+
wait: z.ZodObject<{
|
|
120
|
+
ms: z.ZodOptional<z.ZodNumber>;
|
|
121
|
+
selector: z.ZodOptional<z.ZodString>;
|
|
122
|
+
condition: z.ZodOptional<z.ZodEnum<{
|
|
123
|
+
load: "load";
|
|
124
|
+
networkidle: "networkidle";
|
|
125
|
+
}>>;
|
|
126
|
+
}, z.core.$strip>;
|
|
127
|
+
ping: z.ZodObject<{}, z.core.$strip>;
|
|
128
|
+
'get-status': z.ZodObject<{}, z.core.$strip>;
|
|
129
|
+
eval: z.ZodObject<{
|
|
130
|
+
expression: z.ZodString;
|
|
131
|
+
}, z.core.$strip>;
|
|
132
|
+
};
|
|
133
|
+
export type ParamsSchemaOf<M extends Method> = (typeof paramsSchemas)[M];
|
|
134
|
+
/** 按 method 校验命令参数。未知字段被 strip,返回规范化后的参数。 */
|
|
135
|
+
export declare function validateParams<M extends Method>(method: M, params: unknown): {
|
|
136
|
+
success: true;
|
|
137
|
+
data: ParamsMap[M];
|
|
138
|
+
} | {
|
|
139
|
+
success: false;
|
|
140
|
+
error: z.ZodError;
|
|
141
|
+
};
|
|
142
|
+
export declare const requestSchema: z.ZodObject<{
|
|
143
|
+
id: z.ZodString;
|
|
144
|
+
method: z.ZodEnum<{
|
|
145
|
+
goto: "goto";
|
|
146
|
+
back: "back";
|
|
147
|
+
forward: "forward";
|
|
148
|
+
reload: "reload";
|
|
149
|
+
click: "click";
|
|
150
|
+
"click-text": "click-text";
|
|
151
|
+
fill: "fill";
|
|
152
|
+
type: "type";
|
|
153
|
+
press: "press";
|
|
154
|
+
hover: "hover";
|
|
155
|
+
select: "select";
|
|
156
|
+
scroll: "scroll";
|
|
157
|
+
screenshot: "screenshot";
|
|
158
|
+
extract: "extract";
|
|
159
|
+
"get-page-info": "get-page-info";
|
|
160
|
+
fetch: "fetch";
|
|
161
|
+
search: "search";
|
|
162
|
+
"list-tabs": "list-tabs";
|
|
163
|
+
"create-tab": "create-tab";
|
|
164
|
+
"close-tab": "close-tab";
|
|
165
|
+
"activate-tab": "activate-tab";
|
|
166
|
+
wait: "wait";
|
|
167
|
+
ping: "ping";
|
|
168
|
+
"get-status": "get-status";
|
|
169
|
+
eval: "eval";
|
|
170
|
+
}>;
|
|
171
|
+
params: z.ZodOptional<z.ZodUnknown>;
|
|
172
|
+
sessionId: z.ZodOptional<z.ZodString>;
|
|
173
|
+
tabId: z.ZodOptional<z.ZodNumber>;
|
|
174
|
+
}, z.core.$strip>;
|
|
175
|
+
export declare const commandResultSchema: z.ZodObject<{
|
|
176
|
+
sessionId: z.ZodOptional<z.ZodString>;
|
|
177
|
+
tabId: z.ZodOptional<z.ZodNumber>;
|
|
178
|
+
context: z.ZodOptional<z.ZodObject<{
|
|
179
|
+
url: z.ZodString;
|
|
180
|
+
title: z.ZodString;
|
|
181
|
+
navId: z.ZodNumber;
|
|
182
|
+
tabId: z.ZodNumber;
|
|
183
|
+
}, z.core.$strip>>;
|
|
184
|
+
data: z.ZodUnknown;
|
|
185
|
+
}, z.core.$strip>;
|
|
186
|
+
export declare const responseSchema: z.ZodObject<{
|
|
187
|
+
id: z.ZodString;
|
|
188
|
+
result: z.ZodObject<{
|
|
189
|
+
sessionId: z.ZodOptional<z.ZodString>;
|
|
190
|
+
tabId: z.ZodOptional<z.ZodNumber>;
|
|
191
|
+
context: z.ZodOptional<z.ZodObject<{
|
|
192
|
+
url: z.ZodString;
|
|
193
|
+
title: z.ZodString;
|
|
194
|
+
navId: z.ZodNumber;
|
|
195
|
+
tabId: z.ZodNumber;
|
|
196
|
+
}, z.core.$strip>>;
|
|
197
|
+
data: z.ZodUnknown;
|
|
198
|
+
}, z.core.$strip>;
|
|
199
|
+
}, z.core.$strip>;
|
|
200
|
+
export declare const errorSchema: z.ZodObject<{
|
|
201
|
+
id: z.ZodString;
|
|
202
|
+
error: z.ZodObject<{
|
|
203
|
+
code: z.ZodEnum<{
|
|
204
|
+
INVALID_REQUEST: "INVALID_REQUEST";
|
|
205
|
+
INVALID_PARAMS: "INVALID_PARAMS";
|
|
206
|
+
UNKNOWN_METHOD: "UNKNOWN_METHOD";
|
|
207
|
+
MESSAGE_TOO_LARGE: "MESSAGE_TOO_LARGE";
|
|
208
|
+
EXTENSION_OFFLINE: "EXTENSION_OFFLINE";
|
|
209
|
+
EXTENSION_NO_TAB: "EXTENSION_NO_TAB";
|
|
210
|
+
SESSION_NOT_FOUND: "SESSION_NOT_FOUND";
|
|
211
|
+
SESSION_TAB_CLOSED: "SESSION_TAB_CLOSED";
|
|
212
|
+
TIMEOUT: "TIMEOUT";
|
|
213
|
+
TARGET_NOT_FOUND: "TARGET_NOT_FOUND";
|
|
214
|
+
TARGET_AMBIGUOUS: "TARGET_AMBIGUOUS";
|
|
215
|
+
URL_INVALID: "URL_INVALID";
|
|
216
|
+
HOST_NOT_ALLOWED: "HOST_NOT_ALLOWED";
|
|
217
|
+
EVAL_DISABLED: "EVAL_DISABLED";
|
|
218
|
+
PENDING_APPROVAL: "PENDING_APPROVAL";
|
|
219
|
+
APPROVAL_DENIED: "APPROVAL_DENIED";
|
|
220
|
+
APPROVAL_TIMEOUT: "APPROVAL_TIMEOUT";
|
|
221
|
+
INTERNAL: "INTERNAL";
|
|
222
|
+
}>;
|
|
223
|
+
message: z.ZodString;
|
|
224
|
+
data: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
225
|
+
}, z.core.$strip>;
|
|
226
|
+
}, z.core.$strip>;
|
|
227
|
+
export declare const eventSchema: z.ZodObject<{
|
|
228
|
+
event: z.ZodEnum<{
|
|
229
|
+
"extension.connected": "extension.connected";
|
|
230
|
+
"extension.disconnected": "extension.disconnected";
|
|
231
|
+
"extension.tab-activated": "extension.tab-activated";
|
|
232
|
+
"page.navigated": "page.navigated";
|
|
233
|
+
"approval.requested": "approval.requested";
|
|
234
|
+
"approval.responded": "approval.responded";
|
|
235
|
+
"approval.respond": "approval.respond";
|
|
236
|
+
}>;
|
|
237
|
+
params: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
238
|
+
}, z.core.$strip>;
|
package/dist/schemas.js
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ERROR_CODES } from './errors.js';
|
|
3
|
+
import { EVENT_NAMES } from './envelope.js';
|
|
4
|
+
import { METHODS } from './methods.js';
|
|
5
|
+
/**
|
|
6
|
+
* Zod 校验层。原则(Postel's Law):
|
|
7
|
+
* - 发送保守:schema 精确到每个命令的参数形状
|
|
8
|
+
* - 接收宽容:未知字段默认 strip,缺省字段用 optional/默认值
|
|
9
|
+
*/
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// 公共形状
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
export const contextSchema = z.object({
|
|
14
|
+
url: z.string(),
|
|
15
|
+
title: z.string(),
|
|
16
|
+
navId: z.number().int().nonnegative(),
|
|
17
|
+
tabId: z.number().int().nonnegative(),
|
|
18
|
+
});
|
|
19
|
+
export const viewportSchema = z.object({
|
|
20
|
+
width: z.number().nonnegative(),
|
|
21
|
+
height: z.number().nonnegative(),
|
|
22
|
+
});
|
|
23
|
+
export const elementInfoSchema = z.object({
|
|
24
|
+
tag: z.string(),
|
|
25
|
+
text: z.string().optional(),
|
|
26
|
+
attrs: z.record(z.string(), z.string()),
|
|
27
|
+
box: z.object({ x: z.number(), y: z.number(), width: z.number(), height: z.number() }).optional(),
|
|
28
|
+
});
|
|
29
|
+
const httpUrlSchema = z.string().url();
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
// 每个命令的参数 schema
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
const noopSchema = z.object({});
|
|
34
|
+
export const paramsSchemas = {
|
|
35
|
+
// 导航
|
|
36
|
+
goto: z.object({
|
|
37
|
+
url: httpUrlSchema,
|
|
38
|
+
waitUntil: z.enum(['load', 'domcontentloaded']).optional(),
|
|
39
|
+
}),
|
|
40
|
+
back: noopSchema,
|
|
41
|
+
forward: noopSchema,
|
|
42
|
+
reload: noopSchema,
|
|
43
|
+
// 交互
|
|
44
|
+
click: z.object({ selector: z.string().min(1) }),
|
|
45
|
+
'click-text': z.object({ text: z.string().min(1) }),
|
|
46
|
+
fill: z.object({ selector: z.string().min(1), value: z.string() }),
|
|
47
|
+
type: z.object({ selector: z.string().min(1), text: z.string() }),
|
|
48
|
+
press: z.object({ selector: z.string().min(1).optional(), key: z.string().min(1) }),
|
|
49
|
+
hover: z.object({ selector: z.string().min(1) }),
|
|
50
|
+
select: z
|
|
51
|
+
.object({
|
|
52
|
+
selector: z.string().min(1),
|
|
53
|
+
value: z.string().optional(),
|
|
54
|
+
label: z.string().optional(),
|
|
55
|
+
})
|
|
56
|
+
.refine((p) => p.value !== undefined || p.label !== undefined, {
|
|
57
|
+
message: 'select 需要提供 value 或 label(至少其一)',
|
|
58
|
+
}),
|
|
59
|
+
// 滚动 / 视图
|
|
60
|
+
scroll: z
|
|
61
|
+
.object({
|
|
62
|
+
direction: z.enum(['up', 'down', 'top', 'bottom']).optional(),
|
|
63
|
+
amount: z.number().optional(),
|
|
64
|
+
selector: z.string().min(1).optional(),
|
|
65
|
+
})
|
|
66
|
+
.refine((p) => p.direction !== undefined || p.amount !== undefined || p.selector !== undefined, {
|
|
67
|
+
message: 'scroll 需要提供 direction / amount / selector(至少其一)',
|
|
68
|
+
}),
|
|
69
|
+
screenshot: z.object({
|
|
70
|
+
format: z.enum(['png', 'jpeg']).optional(),
|
|
71
|
+
fullPage: z.boolean().optional(),
|
|
72
|
+
path: z.string().optional(),
|
|
73
|
+
}),
|
|
74
|
+
// 提取
|
|
75
|
+
extract: z.object({
|
|
76
|
+
mode: z.enum(['text', 'structured']).optional(),
|
|
77
|
+
limit: z.number().int().positive().optional(),
|
|
78
|
+
}),
|
|
79
|
+
'get-page-info': noopSchema,
|
|
80
|
+
// 页面内网络
|
|
81
|
+
fetch: z.object({
|
|
82
|
+
url: httpUrlSchema,
|
|
83
|
+
method: z.string().optional(),
|
|
84
|
+
headers: z.record(z.string(), z.string()).optional(),
|
|
85
|
+
body: z.string().optional(),
|
|
86
|
+
returnType: z.enum(['text', 'json', 'binary']).optional(),
|
|
87
|
+
}),
|
|
88
|
+
search: z.object({
|
|
89
|
+
query: z.string().min(1),
|
|
90
|
+
engine: z.string().optional(),
|
|
91
|
+
page: z.number().int().min(1).optional(),
|
|
92
|
+
}),
|
|
93
|
+
// 标签页
|
|
94
|
+
'list-tabs': noopSchema,
|
|
95
|
+
'create-tab': z.object({ url: httpUrlSchema }),
|
|
96
|
+
'close-tab': z.object({ tabId: z.number().int().nonnegative().optional() }),
|
|
97
|
+
'activate-tab': z.object({ tabId: z.number().int().nonnegative() }),
|
|
98
|
+
// 等待
|
|
99
|
+
wait: z
|
|
100
|
+
.object({
|
|
101
|
+
ms: z.number().nonnegative().optional(),
|
|
102
|
+
selector: z.string().min(1).optional(),
|
|
103
|
+
condition: z.enum(['networkidle', 'load']).optional(),
|
|
104
|
+
})
|
|
105
|
+
.refine((p) => p.ms !== undefined || p.selector !== undefined || p.condition !== undefined, {
|
|
106
|
+
message: 'wait 需要提供 ms / selector / condition(至少其一)',
|
|
107
|
+
}),
|
|
108
|
+
// 会话
|
|
109
|
+
ping: noopSchema,
|
|
110
|
+
'get-status': noopSchema,
|
|
111
|
+
// 高级
|
|
112
|
+
eval: z.object({ expression: z.string().min(1) }),
|
|
113
|
+
};
|
|
114
|
+
/** 按 method 校验命令参数。未知字段被 strip,返回规范化后的参数。 */
|
|
115
|
+
export function validateParams(method, params) {
|
|
116
|
+
const result = paramsSchemas[method].safeParse(params ?? {});
|
|
117
|
+
return result.success
|
|
118
|
+
? { success: true, data: result.data }
|
|
119
|
+
: { success: false, error: result.error };
|
|
120
|
+
}
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
// 信封 schema
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
export const requestSchema = z.object({
|
|
125
|
+
id: z.string().min(1),
|
|
126
|
+
method: z.enum(METHODS),
|
|
127
|
+
params: z.unknown().optional(),
|
|
128
|
+
sessionId: z.string().optional(),
|
|
129
|
+
tabId: z.number().int().nonnegative().optional(),
|
|
130
|
+
});
|
|
131
|
+
export const commandResultSchema = z.object({
|
|
132
|
+
sessionId: z.string().optional(),
|
|
133
|
+
tabId: z.number().int().nonnegative().optional(),
|
|
134
|
+
context: contextSchema.optional(),
|
|
135
|
+
data: z.unknown(),
|
|
136
|
+
});
|
|
137
|
+
export const responseSchema = z.object({
|
|
138
|
+
id: z.string().min(1),
|
|
139
|
+
result: commandResultSchema,
|
|
140
|
+
});
|
|
141
|
+
export const errorSchema = z.object({
|
|
142
|
+
id: z.string().min(1),
|
|
143
|
+
error: z.object({
|
|
144
|
+
code: z.enum(ERROR_CODES),
|
|
145
|
+
message: z.string(),
|
|
146
|
+
data: z.record(z.string(), z.unknown()).optional(),
|
|
147
|
+
}),
|
|
148
|
+
});
|
|
149
|
+
export const eventSchema = z.object({
|
|
150
|
+
event: z.enum(EVENT_NAMES),
|
|
151
|
+
params: z.record(z.string(), z.unknown()),
|
|
152
|
+
});
|
|
153
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/** 公共数据形状(wire 协议的一部分,两端共享)。 */
|
|
2
|
+
export interface Viewport {
|
|
3
|
+
width: number;
|
|
4
|
+
height: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* 上下文快照:每个命令响应都必须携带,Agent 据此自证"看到的是哪个页面"。
|
|
8
|
+
* - url / title 变化 → 页面跳转了
|
|
9
|
+
* - navId 递增 → 发生了导航(goto/back/forward/reload/SPA 路由,按实现能力)
|
|
10
|
+
* - tabId 变化 → 焦点被切走
|
|
11
|
+
*/
|
|
12
|
+
export interface ContextSnapshot {
|
|
13
|
+
url: string;
|
|
14
|
+
title: string;
|
|
15
|
+
navId: number;
|
|
16
|
+
tabId: number;
|
|
17
|
+
}
|
|
18
|
+
export interface ElementBox {
|
|
19
|
+
x: number;
|
|
20
|
+
y: number;
|
|
21
|
+
width: number;
|
|
22
|
+
height: number;
|
|
23
|
+
}
|
|
24
|
+
export interface ElementInfo {
|
|
25
|
+
tag: string;
|
|
26
|
+
text?: string;
|
|
27
|
+
attrs: Record<string, string>;
|
|
28
|
+
box?: ElementBox;
|
|
29
|
+
}
|
|
30
|
+
export interface PageSnapshot {
|
|
31
|
+
context: ContextSnapshot;
|
|
32
|
+
visibleText: string;
|
|
33
|
+
viewport: Viewport;
|
|
34
|
+
scrollY: number;
|
|
35
|
+
}
|
|
36
|
+
export interface TabInfo {
|
|
37
|
+
id: number;
|
|
38
|
+
title: string;
|
|
39
|
+
url: string;
|
|
40
|
+
active: boolean;
|
|
41
|
+
}
|
|
42
|
+
export type SessionMode = 'auto' | 'ask';
|
|
43
|
+
export interface SessionInfo {
|
|
44
|
+
id: string;
|
|
45
|
+
tabId?: number;
|
|
46
|
+
mode: SessionMode;
|
|
47
|
+
createdAt: string;
|
|
48
|
+
lastUsedAt: string;
|
|
49
|
+
}
|
|
50
|
+
export interface SearchResult {
|
|
51
|
+
title: string;
|
|
52
|
+
url: string;
|
|
53
|
+
snippet?: string;
|
|
54
|
+
}
|
|
55
|
+
/** search 的分页信息(哪一页的什么查询),便于 Agent 续取后续结果。 */
|
|
56
|
+
export interface SearchPagination {
|
|
57
|
+
query: string;
|
|
58
|
+
engine: string;
|
|
59
|
+
page: number;
|
|
60
|
+
}
|
|
61
|
+
/** 定位器表示:CSS 选择器或可见文本(v1 两种,后续可扩展 css=/text=/role= 前缀)。 */
|
|
62
|
+
export type Locator = {
|
|
63
|
+
type: 'css';
|
|
64
|
+
value: string;
|
|
65
|
+
} | {
|
|
66
|
+
type: 'text';
|
|
67
|
+
value: string;
|
|
68
|
+
};
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,gCAAgC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@parkinglot/protocol",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Shared protocol for ParkingLot: message envelope, command set, common types, validation.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"parkinglot",
|
|
8
|
+
"browser",
|
|
9
|
+
"agent",
|
|
10
|
+
"protocol",
|
|
11
|
+
"cdp",
|
|
12
|
+
"playwright"
|
|
13
|
+
],
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "git+https://github.com/myz-suite/parkinglot.git"
|
|
17
|
+
},
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist"
|
|
23
|
+
],
|
|
24
|
+
"type": "module",
|
|
25
|
+
"main": "./dist/index.js",
|
|
26
|
+
"types": "./dist/index.d.ts",
|
|
27
|
+
"exports": {
|
|
28
|
+
".": {
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"default": "./dist/index.js"
|
|
31
|
+
},
|
|
32
|
+
"./runtime": {
|
|
33
|
+
"types": "./dist/runtime.d.ts",
|
|
34
|
+
"default": "./dist/runtime.js"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"typescript": "^5.7.0",
|
|
39
|
+
"vitest": "^3.0.0"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"zod": "^4.5.4"
|
|
43
|
+
},
|
|
44
|
+
"scripts": {
|
|
45
|
+
"build": "tsc -p tsconfig.build.json",
|
|
46
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
47
|
+
"test": "vitest run"
|
|
48
|
+
}
|
|
49
|
+
}
|