@adonis-agora/agent 0.79.0 → 0.80.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/CHANGELOG.md +13 -0
- package/dist/assets/spa/assets/{index-DVnnBvfn.css → index-BxmGk7Ik.css} +1 -1
- package/dist/assets/spa/assets/index-Csk8lqYx.js +9 -0
- package/dist/assets/spa/index.html +2 -2
- package/dist/providers/agent_provider.d.ts.map +1 -1
- package/dist/providers/agent_provider.js +14 -0
- package/dist/providers/agent_provider.js.map +1 -1
- package/dist/src/agent-loop.d.ts.map +1 -1
- package/dist/src/agent-loop.js +47 -1
- package/dist/src/agent-loop.js.map +1 -1
- package/dist/src/genui/catalog.d.ts +14 -0
- package/dist/src/genui/catalog.d.ts.map +1 -1
- package/dist/src/genui/catalog.js +2 -0
- package/dist/src/genui/catalog.js.map +1 -1
- package/dist/src/genui/public.d.ts +4 -3
- package/dist/src/genui/public.d.ts.map +1 -1
- package/dist/src/genui/public.js +2 -1
- package/dist/src/genui/public.js.map +1 -1
- package/dist/src/genui/sandbox-validate.d.ts +42 -0
- package/dist/src/genui/sandbox-validate.d.ts.map +1 -0
- package/dist/src/genui/sandbox-validate.js +557 -0
- package/dist/src/genui/sandbox-validate.js.map +1 -0
- package/dist/src/genui/sandbox.d.ts +6 -0
- package/dist/src/genui/sandbox.d.ts.map +1 -1
- package/dist/src/genui/sandbox.js +54 -0
- package/dist/src/genui/sandbox.js.map +1 -1
- package/dist/src/genui/tools.d.ts +16 -1
- package/dist/src/genui/tools.d.ts.map +1 -1
- package/dist/src/genui/tools.js +76 -9
- package/dist/src/genui/tools.js.map +1 -1
- package/dist/src/genui-telemetry.d.ts +232 -0
- package/dist/src/genui-telemetry.d.ts.map +1 -0
- package/dist/src/genui-telemetry.js +426 -0
- package/dist/src/genui-telemetry.js.map +1 -0
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/opencode/mcp.d.ts +2 -0
- package/dist/src/opencode/mcp.d.ts.map +1 -1
- package/dist/src/opencode/mcp.js +16 -1
- package/dist/src/opencode/mcp.js.map +1 -1
- package/dist/src/spi/agent-store.d.ts +8 -0
- package/dist/src/spi/agent-store.d.ts.map +1 -1
- package/dist/src/spi/agent-store.js.map +1 -1
- package/dist/src/spi/governance-queries.d.ts +7 -0
- package/dist/src/spi/governance-queries.d.ts.map +1 -1
- package/dist/src/spi/governance-queries.js +0 -13
- package/dist/src/spi/governance-queries.js.map +1 -1
- package/dist/src/stores/lucid-governance-queries.d.ts +2 -0
- package/dist/src/stores/lucid-governance-queries.d.ts.map +1 -1
- package/dist/src/stores/lucid-governance-queries.js +56 -0
- package/dist/src/stores/lucid-governance-queries.js.map +1 -1
- package/dist/src/stores/lucid-schema.d.ts +11 -6
- package/dist/src/stores/lucid-schema.d.ts.map +1 -1
- package/dist/src/stores/lucid-schema.js +41 -6
- package/dist/src/stores/lucid-schema.js.map +1 -1
- package/dist/src/stores/lucid.d.ts +2 -0
- package/dist/src/stores/lucid.d.ts.map +1 -1
- package/dist/src/stores/lucid.js +38 -0
- package/dist/src/stores/lucid.js.map +1 -1
- package/dist/src/testing/in-memory-governance-queries.d.ts +2 -0
- package/dist/src/testing/in-memory-governance-queries.d.ts.map +1 -1
- package/dist/src/testing/in-memory-governance-queries.js +4 -0
- package/dist/src/testing/in-memory-governance-queries.js.map +1 -1
- package/dist/src/testing/in-memory-store.d.ts +5 -0
- package/dist/src/testing/in-memory-store.d.ts.map +1 -1
- package/dist/src/testing/in-memory-store.js +14 -0
- package/dist/src/testing/in-memory-store.js.map +1 -1
- package/dist/src/types.d.ts +17 -0
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +3 -1
- package/skills/agent-governance/SKILL.md +2 -2
- package/skills/agent-setup/SKILL.md +1 -1
- package/dist/assets/spa/assets/index-Be6OClIm.js +0 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public.js","sourceRoot":"","sources":["../../../src/genui/public.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAE5D,OAAO,EACL,cAAc,EAEd,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EAInB,eAAe,EACf,YAAY,EACZ,uBAAuB,GACxB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,gBAAgB,EAEhB,iBAAiB,EAEjB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAGL,cAAc,EAGd,aAAa,EACb,eAAe,
|
|
1
|
+
{"version":3,"file":"public.js","sourceRoot":"","sources":["../../../src/genui/public.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAE5D,OAAO,EACL,cAAc,EAEd,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EAInB,eAAe,EACf,YAAY,EACZ,uBAAuB,GACxB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,gBAAgB,EAEhB,iBAAiB,EAEjB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAGL,cAAc,EAGd,aAAa,EACb,eAAe,EAGf,WAAW,EACX,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,mBAAmB,EAenB,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,yBAAyB,EACzB,uBAAuB,EAMvB,kBAAkB,EAClB,kBAAkB,EAElB,qBAAqB,EACrB,mBAAmB,EACnB,UAAU,EACV,WAAW,EACX,WAAW,GACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EAGL,WAAW,EACX,UAAU,GACX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAOL,KAAK,EACL,eAAe,EACf,uBAAuB,EACvB,6BAA6B,EAG7B,KAAK,EACL,yBAAyB,GAC1B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EAEpB,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,OAAO,EAQP,kBAAkB,EAClB,UAAU,EACV,eAAe,EACf,mBAAmB,EACnB,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EAOnB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAIL,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EAErB,aAAa,EAEb,yBAAyB,EACzB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,aAAa,EACb,cAAc,EAEd,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,kBAAkB,EAIlB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAEL,YAAY,EACZ,0BAA0B,EAC1B,YAAY,EAGZ,gBAAgB,EAIhB,YAAY,EACZ,aAAa,EACb,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAEL,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,OAAO,EACP,eAAe,EACf,UAAU,GACX,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,eAAe,EAOf,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAElB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAEL,oBAAoB,EAGpB,kBAAkB,EAGlB,cAAc,EACd,cAAc,EACd,YAAY,GACb,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { SandboxKitDocs } from './sandbox-kit.js';
|
|
2
|
+
/**
|
|
3
|
+
* Why a UI tool call was refused (or warned about) — what telemetry counts.
|
|
4
|
+
*
|
|
5
|
+
* `shape`: the input does not fit the schema (a missing wrapper, a wrong type); `syntax`: the code
|
|
6
|
+
* does not parse; `missing-app`: JSX without `App`; `bridge`: a bridge other than `agent.send`;
|
|
7
|
+
* `unknown-component` / `unknown-prop`: not in the kit's docs; `unavailable`: the component is not
|
|
8
|
+
* offered here; `other`: anything else (a thrown handler, the emit failing).
|
|
9
|
+
*/
|
|
10
|
+
export type GenuiErrorCategory = 'shape' | 'syntax' | 'missing-app' | 'bridge' | 'unknown-component' | 'unknown-prop' | 'unavailable' | 'other';
|
|
11
|
+
/** One problem with a sandbox's code, where it is. */
|
|
12
|
+
export interface SandboxCodeIssue {
|
|
13
|
+
/** `error` refuses the call; `warning` is reported with the result. */
|
|
14
|
+
severity: 'error' | 'warning';
|
|
15
|
+
category: GenuiErrorCategory;
|
|
16
|
+
field: 'jsx' | 'html' | 'jsFunctions' | 'jsExpressions';
|
|
17
|
+
/** The `jsExpressions` entry. */
|
|
18
|
+
index?: number;
|
|
19
|
+
/** 1-based, in the field's own text. */
|
|
20
|
+
line?: number;
|
|
21
|
+
/** 1-based. */
|
|
22
|
+
column?: number;
|
|
23
|
+
/** What is wrong and the one-line fix. */
|
|
24
|
+
message: string;
|
|
25
|
+
}
|
|
26
|
+
export interface ValidateSandboxCodeOptions {
|
|
27
|
+
/** The view may be JSX (a kit bundle draws it). Default: what `kit.jsx` says. */
|
|
28
|
+
jsx?: boolean;
|
|
29
|
+
/** The kit's docs: `<Component>`s and their props are checked against them. */
|
|
30
|
+
kit?: SandboxKitDocs;
|
|
31
|
+
/** Origins the policy opens for scripts (`<script src>` from elsewhere is refused). */
|
|
32
|
+
scriptOrigins?: readonly string[];
|
|
33
|
+
}
|
|
34
|
+
/** `jsx line 12:5: …` / `jsExpressions[2] line 1:3: …` — the issue as the model reads it. */
|
|
35
|
+
export declare function formatSandboxIssue(issue: SandboxCodeIssue): string;
|
|
36
|
+
/**
|
|
37
|
+
* The sandbox's code, checked: errors first (each refuses the call), then warnings. JSX when the
|
|
38
|
+
* kit allows it and the view is in `jsx` (the longer of `jsx`/`html`, as the renderer decides);
|
|
39
|
+
* otherwise the HTML and its scripts.
|
|
40
|
+
*/
|
|
41
|
+
export declare function validateSandboxCode(props: Record<string, unknown>, options?: ValidateSandboxCodeOptions): Promise<SandboxCodeIssue[]>;
|
|
42
|
+
//# sourceMappingURL=sandbox-validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox-validate.d.ts","sourceRoot":"","sources":["../../../src/genui/sandbox-validate.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD;;;;;;;GAOG;AACH,MAAM,MAAM,kBAAkB,GAC1B,OAAO,GACP,QAAQ,GACR,aAAa,GACb,QAAQ,GACR,mBAAmB,GACnB,cAAc,GACd,aAAa,GACb,OAAO,CAAC;AAEZ,sDAAsD;AACtD,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,aAAa,GAAG,eAAe,CAAC;IACxD,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,0BAA0B;IACzC,iFAAiF;IACjF,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,+EAA+E;IAC/E,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,uFAAuF;IACvF,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,6FAA6F;AAC7F,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAOlE;AAkDD;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAyB7B"}
|
|
@@ -0,0 +1,557 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The sandbox's code, checked on the server BEFORE the call is accepted — so a model that wrote a
|
|
3
|
+
* view the frame cannot draw gets a short, exact tool error ("jsx line 12:5: `flippy.send` — the
|
|
4
|
+
* bridge is `agent.send(payload)`") and its retry succeeds, instead of the user seeing a broken
|
|
5
|
+
* frame.
|
|
6
|
+
*
|
|
7
|
+
* - JSX goes through the SAME transpiler the frame runs ({@link transpileJsx}) and is parsed with
|
|
8
|
+
* acorn (+ acorn-jsx) for exact positions; `App` must be defined.
|
|
9
|
+
* - HTML: every inline `<script>` and `on*=` handler, `jsFunctions` and each `jsExpressions` entry
|
|
10
|
+
* is parsed with acorn; a `<script src>` the policy blocks is refused.
|
|
11
|
+
* - Anything that looks like a bridge (`x.send(…)` on an undeclared `x`, `agent.post(…)`) other than
|
|
12
|
+
* `agent.send` is refused.
|
|
13
|
+
* - With the kit's docs, a `<Component>` the kit does not have is refused (it would throw in the
|
|
14
|
+
* frame); a prop the component does not declare is a WARNING — the call is accepted and the model
|
|
15
|
+
* is told.
|
|
16
|
+
*
|
|
17
|
+
* The parsers are loaded on first use (`await import`): this file is part of the isomorphic genui
|
|
18
|
+
* entry, and a browser bundle that never validates never loads them.
|
|
19
|
+
*/
|
|
20
|
+
import { prepareSandboxJsx, transpileJsx } from './sandbox-jsx.js';
|
|
21
|
+
/** `jsx line 12:5: …` / `jsExpressions[2] line 1:3: …` — the issue as the model reads it. */
|
|
22
|
+
export function formatSandboxIssue(issue) {
|
|
23
|
+
const field = issue.index !== undefined ? `${issue.field}[${issue.index}]` : issue.field;
|
|
24
|
+
const where = issue.line !== undefined
|
|
25
|
+
? ` line ${issue.line}${issue.column !== undefined ? `:${issue.column}` : ''}`
|
|
26
|
+
: '';
|
|
27
|
+
return `${field}${where}: ${issue.message}`;
|
|
28
|
+
}
|
|
29
|
+
/** Names the frame puts in scope for JSX besides the kit's components. */
|
|
30
|
+
const JSX_SCOPE = new Set([
|
|
31
|
+
'useState',
|
|
32
|
+
'useEffect',
|
|
33
|
+
'useMemo',
|
|
34
|
+
'useRef',
|
|
35
|
+
'useCallback',
|
|
36
|
+
'useReducer',
|
|
37
|
+
'useId',
|
|
38
|
+
'useLayoutEffect',
|
|
39
|
+
'Fragment',
|
|
40
|
+
'React',
|
|
41
|
+
'Kit',
|
|
42
|
+
]);
|
|
43
|
+
/** Props every element takes (React's own, and attributes a component passes through). */
|
|
44
|
+
const UNIVERSAL_PROPS = new Set(['key', 'ref', 'children', 'className', 'style', 'id']);
|
|
45
|
+
const BRIDGE_HOLDERS = new Set(['window', 'globalThis', 'self', 'parent', 'top']);
|
|
46
|
+
let parsers;
|
|
47
|
+
async function loadParsers() {
|
|
48
|
+
parsers ??= (async () => {
|
|
49
|
+
const acorn = await import('acorn');
|
|
50
|
+
const jsxModule = (await import('acorn-jsx'));
|
|
51
|
+
const plugin = (jsxModule.default ?? jsxModule);
|
|
52
|
+
const JsxParser = acorn.Parser.extend(plugin());
|
|
53
|
+
return {
|
|
54
|
+
js: (code, options) => acorn.parse(code, options),
|
|
55
|
+
jsx: (code, options) => JsxParser.parse(code, options),
|
|
56
|
+
};
|
|
57
|
+
})();
|
|
58
|
+
return parsers;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The sandbox's code, checked: errors first (each refuses the call), then warnings. JSX when the
|
|
62
|
+
* kit allows it and the view is in `jsx` (the longer of `jsx`/`html`, as the renderer decides);
|
|
63
|
+
* otherwise the HTML and its scripts.
|
|
64
|
+
*/
|
|
65
|
+
export async function validateSandboxCode(props, options = {}) {
|
|
66
|
+
const { js, jsx } = await loadParsers();
|
|
67
|
+
const jsxSource = typeof props.jsx === 'string' ? props.jsx : '';
|
|
68
|
+
const html = typeof props.html === 'string' ? props.html : '';
|
|
69
|
+
const drawsJsx = jsxSource.trim() !== '' && jsxSource.trim().length >= html.trim().length;
|
|
70
|
+
const issues = [];
|
|
71
|
+
if (drawsJsx && (options.jsx ?? options.kit?.jsx === true)) {
|
|
72
|
+
issues.push(...checkJsx(jsxSource, options.kit, js, jsx));
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
issues.push(...checkHtml(html, options, js));
|
|
76
|
+
if (typeof props.jsFunctions === 'string' && props.jsFunctions.trim() !== '') {
|
|
77
|
+
issues.push(...checkScript(props.jsFunctions, 'jsFunctions', undefined, js));
|
|
78
|
+
}
|
|
79
|
+
if (Array.isArray(props.jsExpressions)) {
|
|
80
|
+
props.jsExpressions.forEach((code, index) => {
|
|
81
|
+
if (typeof code === 'string' && code.trim() !== '') {
|
|
82
|
+
issues.push(...checkScript(code, 'jsExpressions', index, js));
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return [
|
|
88
|
+
...issues.filter((issue) => issue.severity === 'error'),
|
|
89
|
+
...issues.filter((issue) => issue.severity === 'warning'),
|
|
90
|
+
];
|
|
91
|
+
}
|
|
92
|
+
// ─── JSX ────────────────────────────────────────────────────────────────────────────────────────
|
|
93
|
+
/** {@link prepareSandboxJsx} line by line, so every line stays where it was (positions match the model's text). */
|
|
94
|
+
function prepareKeepingLines(source) {
|
|
95
|
+
return source.split('\n').map(prepareSandboxJsx).join('\n');
|
|
96
|
+
}
|
|
97
|
+
function checkJsx(source, kit, js, jsx) {
|
|
98
|
+
const prepared = prepareKeepingLines(source);
|
|
99
|
+
let output;
|
|
100
|
+
try {
|
|
101
|
+
output = transpileJsx(prepared);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
const text = error instanceof Error ? error.message : String(error);
|
|
105
|
+
const at = /\s*\(at (\d+)\)\s*$/.exec(text);
|
|
106
|
+
const offset = at !== null ? Number(at[1]) : undefined;
|
|
107
|
+
return [
|
|
108
|
+
{
|
|
109
|
+
severity: 'error',
|
|
110
|
+
category: 'syntax',
|
|
111
|
+
field: 'jsx',
|
|
112
|
+
...(offset !== undefined ? position(prepared, offset) : {}),
|
|
113
|
+
message: `${at !== null ? text.slice(0, at.index) : text}${hintFor(prepared, offset)}`,
|
|
114
|
+
},
|
|
115
|
+
];
|
|
116
|
+
}
|
|
117
|
+
let ast;
|
|
118
|
+
let located = true;
|
|
119
|
+
try {
|
|
120
|
+
ast = jsx(prepared, PARSE_OPTIONS);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
// acorn-jsx is stricter than the frame in places: what counts is whether the program the frame
|
|
124
|
+
// runs (the transpiled one) parses.
|
|
125
|
+
try {
|
|
126
|
+
ast = js(output, PARSE_OPTIONS);
|
|
127
|
+
located = false;
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return [syntaxIssue(error, 'jsx', undefined, prepared)];
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
const issues = [];
|
|
134
|
+
const declared = declaredNames(ast);
|
|
135
|
+
if (!definesApp(ast)) {
|
|
136
|
+
const candidate = topLevelComponent(ast);
|
|
137
|
+
issues.push({
|
|
138
|
+
severity: 'error',
|
|
139
|
+
category: 'missing-app',
|
|
140
|
+
field: 'jsx',
|
|
141
|
+
message: candidate !== undefined
|
|
142
|
+
? `no \`App\` — rename \`function ${candidate}\` to \`function App\`; App is what gets drawn`
|
|
143
|
+
: 'no `App` — define `function App() { return <…/>; }`; App is what gets drawn',
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
issues.push(...bridgeIssues(ast, declared, 'jsx', undefined, located ? prepared : undefined));
|
|
147
|
+
if (kit !== undefined)
|
|
148
|
+
issues.push(...kitIssues(ast, declared, kit, located ? prepared : undefined));
|
|
149
|
+
return issues;
|
|
150
|
+
}
|
|
151
|
+
const PARSE_OPTIONS = {
|
|
152
|
+
ecmaVersion: 'latest',
|
|
153
|
+
sourceType: 'script',
|
|
154
|
+
locations: false,
|
|
155
|
+
allowReturnOutsideFunction: false,
|
|
156
|
+
};
|
|
157
|
+
/** Does the program define `App` at its top level (a function, a `const App = …`, a class)? */
|
|
158
|
+
function definesApp(ast) {
|
|
159
|
+
for (const statement of ast.body ?? []) {
|
|
160
|
+
if ((statement.type === 'FunctionDeclaration' || statement.type === 'ClassDeclaration') &&
|
|
161
|
+
statement.id?.name === 'App') {
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
if (statement.type === 'VariableDeclaration') {
|
|
165
|
+
for (const declarator of statement.declarations) {
|
|
166
|
+
if (declarator.id.name === 'App')
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
/** The one capitalized top-level function, when the model named its view something else. */
|
|
174
|
+
function topLevelComponent(ast) {
|
|
175
|
+
const names = (ast.body ?? [])
|
|
176
|
+
.filter((statement) => statement.type === 'FunctionDeclaration')
|
|
177
|
+
.map((statement) => statement.id?.name ?? '')
|
|
178
|
+
.filter((name) => /^[A-Z]/.test(name));
|
|
179
|
+
return names.length === 1 ? names[0] : undefined;
|
|
180
|
+
}
|
|
181
|
+
function kitIssues(ast, declared, kit, source) {
|
|
182
|
+
const components = new Map(kit.components.map((component) => [component.name, component]));
|
|
183
|
+
const issues = [];
|
|
184
|
+
const reported = new Set();
|
|
185
|
+
walk(ast, (node) => {
|
|
186
|
+
let name;
|
|
187
|
+
let attributes = [];
|
|
188
|
+
if (node.type === 'JSXOpeningElement') {
|
|
189
|
+
name = jsxName(node.name);
|
|
190
|
+
attributes = node.attributes ?? [];
|
|
191
|
+
}
|
|
192
|
+
else if (node.type === 'CallExpression' && isCreateElement(node.callee)) {
|
|
193
|
+
// The transpiled program (acorn-jsx refused the source): `React.createElement(Name, {…})`.
|
|
194
|
+
const [first] = node.arguments;
|
|
195
|
+
if (first?.type === 'Identifier')
|
|
196
|
+
name = first.name;
|
|
197
|
+
}
|
|
198
|
+
if (name === undefined || !/^[A-Z]/.test(name))
|
|
199
|
+
return;
|
|
200
|
+
const bare = name.startsWith('Kit.') ? name.slice(4) : name;
|
|
201
|
+
if (name.includes('.') && !name.startsWith('Kit.'))
|
|
202
|
+
return;
|
|
203
|
+
if (!name.startsWith('Kit.') && (declared.has(bare) || JSX_SCOPE.has(bare)))
|
|
204
|
+
return;
|
|
205
|
+
const doc = components.get(bare);
|
|
206
|
+
if (doc === undefined) {
|
|
207
|
+
if (reported.has(bare))
|
|
208
|
+
return;
|
|
209
|
+
reported.add(bare);
|
|
210
|
+
const known = kit.components.map((component) => component.name);
|
|
211
|
+
issues.push({
|
|
212
|
+
severity: 'error',
|
|
213
|
+
category: 'unknown-component',
|
|
214
|
+
field: 'jsx',
|
|
215
|
+
...(source !== undefined ? position(source, node.start) : {}),
|
|
216
|
+
message: known.length > 0
|
|
217
|
+
? `\`<${name}>\` is not a kit component — use one of ${listOf(known)}, or a plain element`
|
|
218
|
+
: `\`<${name}>\` does not exist here — use plain elements (or define ${bare} yourself)`,
|
|
219
|
+
});
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
if (doc.inherits !== undefined || doc.props.length === 0)
|
|
223
|
+
return;
|
|
224
|
+
const allowed = new Set(doc.props.map((prop) => prop.name));
|
|
225
|
+
for (const attribute of attributes) {
|
|
226
|
+
if (attribute.type !== 'JSXAttribute')
|
|
227
|
+
continue;
|
|
228
|
+
const prop = jsxName(attribute.name);
|
|
229
|
+
if (prop === undefined ||
|
|
230
|
+
allowed.has(prop) ||
|
|
231
|
+
UNIVERSAL_PROPS.has(prop) ||
|
|
232
|
+
/^(data|aria)-/.test(prop)) {
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
issues.push({
|
|
236
|
+
severity: 'warning',
|
|
237
|
+
category: 'unknown-prop',
|
|
238
|
+
field: 'jsx',
|
|
239
|
+
...(source !== undefined ? position(source, attribute.start) : {}),
|
|
240
|
+
message: `\`<${bare} ${prop}>\`: ${bare} has no prop \`${prop}\` (it takes ${listOf([...allowed])})`,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
return issues;
|
|
245
|
+
}
|
|
246
|
+
function isCreateElement(callee) {
|
|
247
|
+
return (callee.type === 'MemberExpression' &&
|
|
248
|
+
callee.object.name === 'React' &&
|
|
249
|
+
callee.property.name === 'createElement');
|
|
250
|
+
}
|
|
251
|
+
function jsxName(node) {
|
|
252
|
+
if (node === undefined || node === null)
|
|
253
|
+
return undefined;
|
|
254
|
+
if (node.type === 'JSXIdentifier')
|
|
255
|
+
return node.name;
|
|
256
|
+
if (node.type === 'JSXMemberExpression') {
|
|
257
|
+
const object = jsxName(node.object);
|
|
258
|
+
const property = jsxName(node.property);
|
|
259
|
+
return object !== undefined && property !== undefined ? `${object}.${property}` : undefined;
|
|
260
|
+
}
|
|
261
|
+
if (node.type === 'JSXNamespacedName') {
|
|
262
|
+
return `${jsxName(node.namespace)}:${jsxName(node.name)}`;
|
|
263
|
+
}
|
|
264
|
+
return undefined;
|
|
265
|
+
}
|
|
266
|
+
// ─── HTML and plain scripts ─────────────────────────────────────────────────────────────────────
|
|
267
|
+
const SCRIPT = /<script\b([^>]*)>([\s\S]*?)(<\/script\s*>|$)/gi;
|
|
268
|
+
const JS_TYPES = /^(|text\/javascript|application\/javascript|module|text\/ecmascript)$/i;
|
|
269
|
+
function checkHtml(html, options, js) {
|
|
270
|
+
const issues = [];
|
|
271
|
+
let blanked = html;
|
|
272
|
+
for (const match of html.matchAll(SCRIPT)) {
|
|
273
|
+
const attributes = match[1] ?? '';
|
|
274
|
+
const body = match[2] ?? '';
|
|
275
|
+
const at = match.index ?? 0;
|
|
276
|
+
const bodyStart = at + match[0].indexOf('>') + 1;
|
|
277
|
+
blanked =
|
|
278
|
+
blanked.slice(0, at) + match[0].replace(/[^\n]/g, ' ') + blanked.slice(at + match[0].length);
|
|
279
|
+
if (match[3] === '') {
|
|
280
|
+
issues.push({
|
|
281
|
+
severity: 'error',
|
|
282
|
+
category: 'syntax',
|
|
283
|
+
field: 'html',
|
|
284
|
+
...position(html, at),
|
|
285
|
+
message: '`<script>` is never closed — end it with `</script>`',
|
|
286
|
+
});
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
const src = /\bsrc\s*=\s*["']?([^"'\s>]+)/i.exec(attributes);
|
|
290
|
+
if (src !== null) {
|
|
291
|
+
const origin = originOf(src[1] ?? '');
|
|
292
|
+
if (origin === undefined ||
|
|
293
|
+
!(options.scriptOrigins ?? []).some((each) => allows(each, origin))) {
|
|
294
|
+
issues.push({
|
|
295
|
+
severity: 'error',
|
|
296
|
+
category: 'syntax',
|
|
297
|
+
field: 'html',
|
|
298
|
+
...position(html, at),
|
|
299
|
+
message: `\`<script src="${src[1]}">\` is blocked (the sandbox has no network) — inline the code instead`,
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
const type = /\btype\s*=\s*["']?([^"'\s>]*)/i.exec(attributes)?.[1] ?? '';
|
|
305
|
+
if (!JS_TYPES.test(type))
|
|
306
|
+
continue;
|
|
307
|
+
const parsed = parseAt(body, js, type.toLowerCase() === 'module' ? 'module' : 'script');
|
|
308
|
+
if (!parsed.ok) {
|
|
309
|
+
issues.push(syntaxIssue(parsed.error, 'html', undefined, html, bodyStart));
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
issues.push(...bridgeIssues(parsed.ast, declaredNames(parsed.ast), 'html', undefined, html, bodyStart));
|
|
313
|
+
}
|
|
314
|
+
// Inline handlers (`onclick="…"`), outside the scripts.
|
|
315
|
+
const handler = /<[a-zA-Z][^>]*?\son[a-z]+\s*=\s*("([^"]*)"|'([^']*)')/g;
|
|
316
|
+
const attribute = /\son[a-z]+\s*=\s*("([^"]*)"|'([^']*)')/g;
|
|
317
|
+
for (const tag of blanked.matchAll(handler)) {
|
|
318
|
+
const tagStart = tag.index ?? 0;
|
|
319
|
+
const whole = blanked.slice(tagStart, blanked.indexOf('>', tagStart) + 1 || undefined);
|
|
320
|
+
for (const each of whole.matchAll(attribute)) {
|
|
321
|
+
const value = each[2] ?? each[3] ?? '';
|
|
322
|
+
const valueStart = tagStart + (each.index ?? 0) + each[0].indexOf(each[1] ?? '') + 1;
|
|
323
|
+
const code = decodeEntities(value);
|
|
324
|
+
const wrapped = `(function(event){${code}\n})`;
|
|
325
|
+
const parsed = parseAt(wrapped, js, 'script');
|
|
326
|
+
if (!parsed.ok) {
|
|
327
|
+
const offset = Math.max(0, errorOffset(parsed.error) - '(function(event){'.length);
|
|
328
|
+
issues.push({
|
|
329
|
+
severity: 'error',
|
|
330
|
+
category: 'syntax',
|
|
331
|
+
field: 'html',
|
|
332
|
+
...position(html, valueStart + Math.min(offset, value.length)),
|
|
333
|
+
message: `${errorText(parsed.error)} in an inline handler`,
|
|
334
|
+
});
|
|
335
|
+
continue;
|
|
336
|
+
}
|
|
337
|
+
issues.push(...bridgeIssues(parsed.ast, declaredNames(parsed.ast), 'html', undefined, html, valueStart - '(function(event){'.length));
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
return dedupe(issues);
|
|
341
|
+
}
|
|
342
|
+
function checkScript(code, field, index, js) {
|
|
343
|
+
const parsed = parseAt(code, js, 'script');
|
|
344
|
+
if (!parsed.ok)
|
|
345
|
+
return [syntaxIssue(parsed.error, field, index, code)];
|
|
346
|
+
return bridgeIssues(parsed.ast, declaredNames(parsed.ast), field, index, code);
|
|
347
|
+
}
|
|
348
|
+
function parseAt(code, js, sourceType) {
|
|
349
|
+
try {
|
|
350
|
+
return { ok: true, ast: js(code, { ...PARSE_OPTIONS, sourceType }) };
|
|
351
|
+
}
|
|
352
|
+
catch (error) {
|
|
353
|
+
return { ok: false, error };
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
function originOf(url) {
|
|
357
|
+
const match = /^(https:\/\/[^/?#]+)/i.exec(url);
|
|
358
|
+
return match?.[1]?.toLowerCase();
|
|
359
|
+
}
|
|
360
|
+
function allows(pattern, origin) {
|
|
361
|
+
const lower = pattern.toLowerCase();
|
|
362
|
+
if (!lower.includes('*.'))
|
|
363
|
+
return lower === origin;
|
|
364
|
+
const suffix = lower.replace('https://*.', '');
|
|
365
|
+
return origin.startsWith('https://') && origin.slice(8).endsWith(`.${suffix}`);
|
|
366
|
+
}
|
|
367
|
+
function decodeEntities(text) {
|
|
368
|
+
return text
|
|
369
|
+
.replace(/"/g, '"')
|
|
370
|
+
.replace(/'|'/g, "'")
|
|
371
|
+
.replace(/</g, '<')
|
|
372
|
+
.replace(/>/g, '>')
|
|
373
|
+
.replace(/&/g, '&');
|
|
374
|
+
}
|
|
375
|
+
// ─── The bridge ─────────────────────────────────────────────────────────────────────────────────
|
|
376
|
+
/**
|
|
377
|
+
* Calls that look like a way out of the frame but are not `agent.send`: `flippy.send(…)` on an
|
|
378
|
+
* undeclared name, `window.app.send(…)`, `agent.post(…)`.
|
|
379
|
+
*/
|
|
380
|
+
function bridgeIssues(ast, declared, field, index, source, base = 0) {
|
|
381
|
+
const issues = [];
|
|
382
|
+
walk(ast, (node) => {
|
|
383
|
+
if (node.type !== 'CallExpression')
|
|
384
|
+
return;
|
|
385
|
+
const callee = node.callee;
|
|
386
|
+
if (callee.type !== 'MemberExpression' || callee.computed === true)
|
|
387
|
+
return;
|
|
388
|
+
const method = callee.property.name;
|
|
389
|
+
const object = callee.object;
|
|
390
|
+
let holder;
|
|
391
|
+
if (object.type === 'Identifier')
|
|
392
|
+
holder = object.name;
|
|
393
|
+
else if (object.type === 'MemberExpression' &&
|
|
394
|
+
object.computed !== true &&
|
|
395
|
+
BRIDGE_HOLDERS.has(object.object.name ?? '')) {
|
|
396
|
+
const inner = object.property.name;
|
|
397
|
+
if (inner === 'agent')
|
|
398
|
+
holder = 'agent';
|
|
399
|
+
else if (inner !== undefined)
|
|
400
|
+
holder = `${object.object.name}.${inner}`;
|
|
401
|
+
}
|
|
402
|
+
if (holder === undefined)
|
|
403
|
+
return;
|
|
404
|
+
const where = {
|
|
405
|
+
...(index !== undefined ? { index } : {}),
|
|
406
|
+
...(source !== undefined ? position(source, base + callee.start) : {}),
|
|
407
|
+
};
|
|
408
|
+
if (holder === 'agent') {
|
|
409
|
+
if (method === 'send' || declared.has('agent'))
|
|
410
|
+
return;
|
|
411
|
+
issues.push({
|
|
412
|
+
severity: 'error',
|
|
413
|
+
category: 'bridge',
|
|
414
|
+
field,
|
|
415
|
+
...where,
|
|
416
|
+
message: `\`agent.${method}\` — the bridge has one method: \`agent.send(payload)\``,
|
|
417
|
+
});
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
if (method !== 'send')
|
|
421
|
+
return;
|
|
422
|
+
const root = holder.split('.')[0] ?? holder;
|
|
423
|
+
if (!holder.includes('.') && declared.has(root))
|
|
424
|
+
return;
|
|
425
|
+
issues.push({
|
|
426
|
+
severity: 'error',
|
|
427
|
+
category: 'bridge',
|
|
428
|
+
field,
|
|
429
|
+
...where,
|
|
430
|
+
message: `\`${holder}.send\` — the bridge is \`agent.send(payload)\``,
|
|
431
|
+
});
|
|
432
|
+
});
|
|
433
|
+
return issues;
|
|
434
|
+
}
|
|
435
|
+
// ─── AST helpers ────────────────────────────────────────────────────────────────────────────────
|
|
436
|
+
function walk(node, visit) {
|
|
437
|
+
if (Array.isArray(node)) {
|
|
438
|
+
for (const item of node)
|
|
439
|
+
walk(item, visit);
|
|
440
|
+
return;
|
|
441
|
+
}
|
|
442
|
+
if (typeof node !== 'object' || node === null || typeof node.type !== 'string')
|
|
443
|
+
return;
|
|
444
|
+
visit(node);
|
|
445
|
+
for (const [key, value] of Object.entries(node)) {
|
|
446
|
+
if (key === 'type' || key === 'start' || key === 'end' || key === 'loc')
|
|
447
|
+
continue;
|
|
448
|
+
if (typeof value === 'object' && value !== null)
|
|
449
|
+
walk(value, visit);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
/** Every name the program binds anywhere (conservative: scope is ignored). */
|
|
453
|
+
function declaredNames(ast) {
|
|
454
|
+
const names = new Set();
|
|
455
|
+
const bind = (pattern) => {
|
|
456
|
+
if (typeof pattern !== 'object' || pattern === null)
|
|
457
|
+
return;
|
|
458
|
+
const node = pattern;
|
|
459
|
+
switch (node.type) {
|
|
460
|
+
case 'Identifier':
|
|
461
|
+
names.add(node.name);
|
|
462
|
+
return;
|
|
463
|
+
case 'ObjectPattern':
|
|
464
|
+
for (const property of node.properties) {
|
|
465
|
+
bind(property.type === 'RestElement' ? property.argument : property.value);
|
|
466
|
+
}
|
|
467
|
+
return;
|
|
468
|
+
case 'ArrayPattern':
|
|
469
|
+
for (const element of node.elements)
|
|
470
|
+
bind(element);
|
|
471
|
+
return;
|
|
472
|
+
case 'RestElement':
|
|
473
|
+
bind(node.argument);
|
|
474
|
+
return;
|
|
475
|
+
case 'AssignmentPattern':
|
|
476
|
+
bind(node.left);
|
|
477
|
+
return;
|
|
478
|
+
}
|
|
479
|
+
};
|
|
480
|
+
walk(ast, (node) => {
|
|
481
|
+
if (node.type === 'VariableDeclarator')
|
|
482
|
+
bind(node.id);
|
|
483
|
+
else if (node.type === 'FunctionDeclaration' ||
|
|
484
|
+
node.type === 'FunctionExpression' ||
|
|
485
|
+
node.type === 'ArrowFunctionExpression') {
|
|
486
|
+
if (node.id !== null && node.id !== undefined)
|
|
487
|
+
bind(node.id);
|
|
488
|
+
for (const param of node.params)
|
|
489
|
+
bind(param);
|
|
490
|
+
}
|
|
491
|
+
else if (node.type === 'ClassDeclaration' && node.id !== null)
|
|
492
|
+
bind(node.id);
|
|
493
|
+
else if (node.type === 'CatchClause' && node.param !== null)
|
|
494
|
+
bind(node.param);
|
|
495
|
+
else if (node.type === 'ImportSpecifier' || node.type === 'ImportDefaultSpecifier')
|
|
496
|
+
bind(node.local);
|
|
497
|
+
});
|
|
498
|
+
return names;
|
|
499
|
+
}
|
|
500
|
+
function position(source, offset) {
|
|
501
|
+
const before = source.slice(0, Math.max(0, Math.min(offset, source.length)));
|
|
502
|
+
const lines = before.split('\n');
|
|
503
|
+
return { line: lines.length, column: (lines[lines.length - 1]?.length ?? 0) + 1 };
|
|
504
|
+
}
|
|
505
|
+
function errorOffset(error) {
|
|
506
|
+
const pos = error.pos;
|
|
507
|
+
return typeof pos === 'number' ? pos : 0;
|
|
508
|
+
}
|
|
509
|
+
/** acorn's message without its `(line:column)` suffix. */
|
|
510
|
+
function errorText(error) {
|
|
511
|
+
const text = error instanceof Error ? error.message : String(error);
|
|
512
|
+
return text.replace(/\s*\(\d+:\d+\)\s*$/, '');
|
|
513
|
+
}
|
|
514
|
+
function syntaxIssue(error, field, index, source, base = 0) {
|
|
515
|
+
const offset = base + errorOffset(error);
|
|
516
|
+
return {
|
|
517
|
+
severity: 'error',
|
|
518
|
+
category: 'syntax',
|
|
519
|
+
field,
|
|
520
|
+
...(index !== undefined ? { index } : {}),
|
|
521
|
+
...position(source, offset),
|
|
522
|
+
message: `${errorText(error)}${hintFor(source, offset)}`,
|
|
523
|
+
};
|
|
524
|
+
}
|
|
525
|
+
/** A one-line fix for the syntax errors models make most. */
|
|
526
|
+
function hintFor(source, offset) {
|
|
527
|
+
if (offset === undefined)
|
|
528
|
+
return '';
|
|
529
|
+
const lineStart = source.lastIndexOf('\n', Math.max(0, offset - 1)) + 1;
|
|
530
|
+
const lineEnd = source.indexOf('\n', offset);
|
|
531
|
+
const line = source.slice(lineStart, lineEnd < 0 ? undefined : lineEnd);
|
|
532
|
+
if (/^\s*(type|interface)\s+\w+/.test(line) ||
|
|
533
|
+
/\)\s*:\s*[\w.]+[\w.<>[\]|]*\s*(=>|\{)/.test(line) ||
|
|
534
|
+
/\b(useState|useRef|useMemo)<|\bas\s+(const|[A-Z]\w*|string|number)\b/.test(line)) {
|
|
535
|
+
return ' — plain JavaScript only: drop the TypeScript types';
|
|
536
|
+
}
|
|
537
|
+
if (/\b(class|for)=/.test(line) && /</.test(line))
|
|
538
|
+
return '';
|
|
539
|
+
if (/<\/?[A-Za-z]/.test(line))
|
|
540
|
+
return ' — check that every JSX tag is closed in order';
|
|
541
|
+
return '';
|
|
542
|
+
}
|
|
543
|
+
function listOf(names, max = 12) {
|
|
544
|
+
const shown = names.slice(0, max).map((name) => `\`${name}\``);
|
|
545
|
+
return names.length > max ? `${shown.join(', ')}…` : shown.join(', ');
|
|
546
|
+
}
|
|
547
|
+
function dedupe(issues) {
|
|
548
|
+
const seen = new Set();
|
|
549
|
+
return issues.filter((issue) => {
|
|
550
|
+
const key = formatSandboxIssue(issue);
|
|
551
|
+
if (seen.has(key))
|
|
552
|
+
return false;
|
|
553
|
+
seen.add(key);
|
|
554
|
+
return true;
|
|
555
|
+
});
|
|
556
|
+
}
|
|
557
|
+
//# sourceMappingURL=sandbox-validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox-validate.js","sourceRoot":"","sources":["../../../src/genui/sandbox-validate.ts"],"names":[],"mappings":"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"}
|