@polyxd/runtime 0.4.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 +202 -0
- package/NOTICE +224 -0
- package/README.md +85 -0
- package/dist/adapters/anthropic.d.ts +22 -0
- package/dist/adapters/anthropic.js +48 -0
- package/dist/adapters/anthropic.js.map +1 -0
- package/dist/adapters/gemini.d.ts +14 -0
- package/dist/adapters/gemini.js +42 -0
- package/dist/adapters/gemini.js.map +1 -0
- package/dist/adapters/http.d.ts +25 -0
- package/dist/adapters/http.js +92 -0
- package/dist/adapters/http.js.map +1 -0
- package/dist/adapters/openai.d.ts +31 -0
- package/dist/adapters/openai.js +89 -0
- package/dist/adapters/openai.js.map +1 -0
- package/dist/audit.d.ts +17 -0
- package/dist/audit.js +48 -0
- package/dist/audit.js.map +1 -0
- package/dist/catalog.generated.d.ts +4 -0
- package/dist/catalog.generated.js +618 -0
- package/dist/catalog.generated.js.map +1 -0
- package/dist/direction.d.ts +22 -0
- package/dist/direction.js +95 -0
- package/dist/direction.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/memory.d.ts +25 -0
- package/dist/memory.js +38 -0
- package/dist/memory.js.map +1 -0
- package/dist/parse.d.ts +15 -0
- package/dist/parse.js +35 -0
- package/dist/parse.js.map +1 -0
- package/dist/prompt.d.ts +47 -0
- package/dist/prompt.js +242 -0
- package/dist/prompt.js.map +1 -0
- package/dist/runtime.d.ts +131 -0
- package/dist/runtime.js +190 -0
- package/dist/runtime.js.map +1 -0
- package/dist/types.d.ts +104 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { type MemoryStore } from "./memory.ts";
|
|
2
|
+
import type { Audit, Capability, Direction, Generator, Message, Report, UIDocument, Usage } from "./types.ts";
|
|
3
|
+
export interface RuntimeOptions {
|
|
4
|
+
generator: Generator;
|
|
5
|
+
/** The product's Design Direction, applied in the prompt and in the checks. */
|
|
6
|
+
direction?: Direction;
|
|
7
|
+
/** Where the screen shown for each intent is remembered. No memory when left out. */
|
|
8
|
+
memory?: MemoryStore;
|
|
9
|
+
/** How many times a failed document goes back to the model with its problems. Default 2. */
|
|
10
|
+
maxRepairs?: number;
|
|
11
|
+
/** Send warnings back for repair too, not only errors. Default false. */
|
|
12
|
+
repairWarnings?: boolean;
|
|
13
|
+
/** How many of the Direction's exemplars go in the prompt, chosen by relevance. Default 2. */
|
|
14
|
+
exemplars?: number;
|
|
15
|
+
/** Turns an exemplar's `document` path into the document. Exemplars given as paths are skipped without it. */
|
|
16
|
+
resolveExemplar?: (path: string) => unknown | Promise<unknown>;
|
|
17
|
+
/** The components generated screens may use. Default: every surface component in the spec. */
|
|
18
|
+
components?: string[];
|
|
19
|
+
/**
|
|
20
|
+
* Replaces the default document checks (`staticAudit` from `@polyxd/verifier/static`) with your
|
|
21
|
+
* own. It gets the same options the verifier takes. The generated-document checks still run.
|
|
22
|
+
*/
|
|
23
|
+
audit?: Audit;
|
|
24
|
+
/** Privacy-safe events: counts, timings, validity and check ids. Never the ask, the data or the document. */
|
|
25
|
+
onEvent?: (event: RuntimeEvent) => void;
|
|
26
|
+
}
|
|
27
|
+
/** One request for a screen. */
|
|
28
|
+
export interface Ask {
|
|
29
|
+
/** What the person asked, in their words. */
|
|
30
|
+
ask: string;
|
|
31
|
+
/** A stable key for what they're trying to do, such as `money.send`. Memory is kept by it. */
|
|
32
|
+
intent: string;
|
|
33
|
+
/** The capabilities the surface may trigger, by name. */
|
|
34
|
+
capabilities?: Record<string, Capability>;
|
|
35
|
+
/** The host data the surface binds to. Documents are checked against it. */
|
|
36
|
+
data?: unknown;
|
|
37
|
+
/** A spec pattern the surface should follow, when the host already knows. */
|
|
38
|
+
pattern?: string;
|
|
39
|
+
signal?: AbortSignal;
|
|
40
|
+
}
|
|
41
|
+
export interface Result {
|
|
42
|
+
/** The accepted document; after giving up, the last one that parsed, if any. */
|
|
43
|
+
document: UIDocument | undefined;
|
|
44
|
+
/** What the checks found in `document`. `report.valid` is false when the runtime gave up. */
|
|
45
|
+
report: Report;
|
|
46
|
+
/** How many times the model was called. */
|
|
47
|
+
attempts: number;
|
|
48
|
+
usage: Usage;
|
|
49
|
+
}
|
|
50
|
+
/** What a stream yields, in order: `started`, then per attempt its `text` and `attempt`, then `repaired` if a repair worked, then `done` or `error`. */
|
|
51
|
+
export type Progress = {
|
|
52
|
+
type: "started";
|
|
53
|
+
remembered: boolean;
|
|
54
|
+
exemplars: number;
|
|
55
|
+
} | {
|
|
56
|
+
type: "text";
|
|
57
|
+
attempt: number;
|
|
58
|
+
text: string;
|
|
59
|
+
} | {
|
|
60
|
+
type: "attempt";
|
|
61
|
+
attempt: number;
|
|
62
|
+
report: Report;
|
|
63
|
+
} | {
|
|
64
|
+
type: "repaired";
|
|
65
|
+
attempt: number;
|
|
66
|
+
report: Report;
|
|
67
|
+
} | {
|
|
68
|
+
type: "done";
|
|
69
|
+
result: Result;
|
|
70
|
+
} | {
|
|
71
|
+
type: "error";
|
|
72
|
+
reason: ErrorReason;
|
|
73
|
+
error?: unknown;
|
|
74
|
+
result?: Result;
|
|
75
|
+
};
|
|
76
|
+
export type ErrorReason = "invalid" | "aborted" | "generator" | "setup";
|
|
77
|
+
/** The events `onEvent` receives. Numbers, booleans and check ids only. */
|
|
78
|
+
export type RuntimeEvent = {
|
|
79
|
+
type: "started";
|
|
80
|
+
maxAttempts: number;
|
|
81
|
+
exemplars: number;
|
|
82
|
+
remembered: boolean;
|
|
83
|
+
promptChars: number;
|
|
84
|
+
} | {
|
|
85
|
+
type: "text";
|
|
86
|
+
attempt: number;
|
|
87
|
+
chars: number;
|
|
88
|
+
} | {
|
|
89
|
+
type: "attempt";
|
|
90
|
+
attempt: number;
|
|
91
|
+
ms: number;
|
|
92
|
+
chars: number;
|
|
93
|
+
valid: boolean;
|
|
94
|
+
errors: number;
|
|
95
|
+
warnings: number;
|
|
96
|
+
checks: string[];
|
|
97
|
+
inputTokens: number;
|
|
98
|
+
outputTokens: number;
|
|
99
|
+
} | {
|
|
100
|
+
type: "repaired";
|
|
101
|
+
attempt: number;
|
|
102
|
+
} | {
|
|
103
|
+
type: "done";
|
|
104
|
+
attempts: number;
|
|
105
|
+
ms: number;
|
|
106
|
+
warnings: number;
|
|
107
|
+
checks: string[];
|
|
108
|
+
inputTokens: number;
|
|
109
|
+
outputTokens: number;
|
|
110
|
+
} | {
|
|
111
|
+
type: "error";
|
|
112
|
+
reason: ErrorReason;
|
|
113
|
+
attempts: number;
|
|
114
|
+
ms: number;
|
|
115
|
+
status?: number;
|
|
116
|
+
checks?: string[];
|
|
117
|
+
};
|
|
118
|
+
export interface Runtime {
|
|
119
|
+
/** Generates, checks and repairs a document for one ask. */
|
|
120
|
+
generate(ask: Ask, options?: {
|
|
121
|
+
onProgress?: (progress: Progress) => void;
|
|
122
|
+
}): Promise<Result>;
|
|
123
|
+
/** The same, as an async iterator of progress. Stopping early aborts the model call. */
|
|
124
|
+
stream(ask: Ask): AsyncGenerator<Progress, void, undefined>;
|
|
125
|
+
/** The exact prompt `generate` would send first, for inspection and tests. */
|
|
126
|
+
prompt(ask: Ask): Promise<{
|
|
127
|
+
system: string;
|
|
128
|
+
messages: Message[];
|
|
129
|
+
}>;
|
|
130
|
+
}
|
|
131
|
+
export declare function createRuntime(options: RuntimeOptions): Runtime;
|
package/dist/runtime.js
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { checkDocument, generatedChecks, toReport } from "./audit.js";
|
|
2
|
+
import { GeneratorError } from "./adapters/http.js";
|
|
3
|
+
import { directionRules, relevantExemplars } from "./direction.js";
|
|
4
|
+
import { forMemory } from "./memory.js";
|
|
5
|
+
import { parseDocument } from "./parse.js";
|
|
6
|
+
import { repairPrompt, systemPrompt, userPrompt } from "./prompt.js";
|
|
7
|
+
const now = () => (typeof performance !== "undefined" ? performance.now() : Date.now());
|
|
8
|
+
const checkIds = (findings) => [...new Set(findings.map((f) => f.check))].sort();
|
|
9
|
+
const aborted = (signal, err) => signal?.aborted === true || err?.name === "AbortError";
|
|
10
|
+
export function createRuntime(options) {
|
|
11
|
+
const maxAttempts = Math.max(0, options.maxRepairs ?? 2) + 1;
|
|
12
|
+
const rules = directionRules(options.direction);
|
|
13
|
+
const system = systemPrompt({ components: options.components });
|
|
14
|
+
async function exemplarsFor(ask) {
|
|
15
|
+
const chosen = relevantExemplars(options.direction?.exemplars ?? [], ask.ask, ask.intent, options.exemplars ?? 2);
|
|
16
|
+
const out = [];
|
|
17
|
+
for (const e of chosen) {
|
|
18
|
+
const doc = typeof e.document === "string" ? (options.resolveExemplar ? await options.resolveExemplar(e.document) : undefined) : e.document;
|
|
19
|
+
if (doc && typeof doc === "object")
|
|
20
|
+
out.push({ request: e.request, document: doc });
|
|
21
|
+
}
|
|
22
|
+
return out;
|
|
23
|
+
}
|
|
24
|
+
async function prepare(ask) {
|
|
25
|
+
const previous = options.memory ? await options.memory.get(ask.intent) : undefined;
|
|
26
|
+
const exemplars = await exemplarsFor(ask);
|
|
27
|
+
const user = userPrompt({ ask: ask.ask, intent: ask.intent, pattern: ask.pattern, capabilities: ask.capabilities, data: ask.data, direction: options.direction, exemplars, previous });
|
|
28
|
+
return { user, remembered: previous !== undefined, exemplars: exemplars.length };
|
|
29
|
+
}
|
|
30
|
+
async function check(doc, ask) {
|
|
31
|
+
const checked = ask.data !== undefined ? { ...doc, data: ask.data } : doc;
|
|
32
|
+
const auditOptions = { rules, emphasisBudget: options.direction?.profile?.emphasisBudget, missingData: ask.data !== undefined ? "error" : "warning" };
|
|
33
|
+
if (ask.capabilities)
|
|
34
|
+
auditOptions.registry = { name: "ask", capabilities: ask.capabilities };
|
|
35
|
+
const found = options.audit ? await options.audit(checked, auditOptions) : checkDocument(checked, auditOptions);
|
|
36
|
+
return [...found, ...generatedChecks(doc, options.direction, options.components)];
|
|
37
|
+
}
|
|
38
|
+
async function run(ask, onProgress, signal) {
|
|
39
|
+
const started = now();
|
|
40
|
+
const ms = () => Math.round(now() - started);
|
|
41
|
+
const event = (e) => {
|
|
42
|
+
try {
|
|
43
|
+
options.onEvent?.(e);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// An analytics hook never breaks generation.
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const usage = { inputTokens: 0, outputTokens: 0 };
|
|
50
|
+
let attempts = 0;
|
|
51
|
+
const fail = (reason, error, result) => {
|
|
52
|
+
onProgress({ type: "error", reason, error, result });
|
|
53
|
+
event({ type: "error", reason, attempts, ms: ms(), ...(error instanceof GeneratorError && error.status !== undefined ? { status: error.status } : {}), ...(result ? { checks: checkIds(result.report.findings) } : {}) });
|
|
54
|
+
};
|
|
55
|
+
let prepared;
|
|
56
|
+
try {
|
|
57
|
+
prepared = await prepare(ask);
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
fail("setup", err);
|
|
61
|
+
throw err;
|
|
62
|
+
}
|
|
63
|
+
onProgress({ type: "started", remembered: prepared.remembered, exemplars: prepared.exemplars });
|
|
64
|
+
event({ type: "started", maxAttempts, exemplars: prepared.exemplars, remembered: prepared.remembered, promptChars: system.length + prepared.user.length });
|
|
65
|
+
let messages = [{ role: "user", content: prepared.user }];
|
|
66
|
+
let last = { document: undefined, report: toReport([]) };
|
|
67
|
+
while (attempts < maxAttempts) {
|
|
68
|
+
attempts++;
|
|
69
|
+
const attempt = attempts;
|
|
70
|
+
const attemptStarted = now();
|
|
71
|
+
let chars = 0;
|
|
72
|
+
let text;
|
|
73
|
+
let used;
|
|
74
|
+
try {
|
|
75
|
+
if (signal?.aborted)
|
|
76
|
+
throw signal.reason ?? new DOMException("Aborted", "AbortError");
|
|
77
|
+
const out = await options.generator.generate({
|
|
78
|
+
system,
|
|
79
|
+
messages,
|
|
80
|
+
signal,
|
|
81
|
+
onText: (piece) => {
|
|
82
|
+
chars += piece.length;
|
|
83
|
+
onProgress({ type: "text", attempt, text: piece });
|
|
84
|
+
event({ type: "text", attempt, chars: piece.length });
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
if (signal?.aborted)
|
|
88
|
+
throw signal.reason ?? new DOMException("Aborted", "AbortError");
|
|
89
|
+
({ text, usage: used } = typeof out === "string" ? { text: out, usage: undefined } : out);
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
fail(aborted(signal, err) ? "aborted" : "generator", err);
|
|
93
|
+
throw err;
|
|
94
|
+
}
|
|
95
|
+
// A generator that doesn't stream still shows its text once.
|
|
96
|
+
if (chars === 0 && text) {
|
|
97
|
+
chars = text.length;
|
|
98
|
+
onProgress({ type: "text", attempt, text });
|
|
99
|
+
event({ type: "text", attempt, chars });
|
|
100
|
+
}
|
|
101
|
+
const u = { inputTokens: used?.inputTokens ?? 0, outputTokens: used?.outputTokens ?? 0 };
|
|
102
|
+
usage.inputTokens += u.inputTokens;
|
|
103
|
+
usage.outputTokens += u.outputTokens;
|
|
104
|
+
const parsed = parseDocument(text);
|
|
105
|
+
const findings = parsed.error !== undefined ? [{ severity: "error", check: "json:parse", message: parsed.error }] : await check(parsed.document, ask);
|
|
106
|
+
const report = toReport(findings);
|
|
107
|
+
const document = parsed.document;
|
|
108
|
+
onProgress({ type: "attempt", attempt, report });
|
|
109
|
+
event({ type: "attempt", attempt, ms: Math.round(now() - attemptStarted), chars, valid: report.valid, errors: report.errors, warnings: report.warnings, checks: checkIds(report.findings), ...u });
|
|
110
|
+
if (document)
|
|
111
|
+
last = { document, report };
|
|
112
|
+
else if (!last.document)
|
|
113
|
+
last = { document: undefined, report };
|
|
114
|
+
const blocking = report.findings.filter((f) => f.severity === "error" || (options.repairWarnings && attempt < maxAttempts));
|
|
115
|
+
if (document && !blocking.length) {
|
|
116
|
+
if (attempt > 1) {
|
|
117
|
+
onProgress({ type: "repaired", attempt, report });
|
|
118
|
+
event({ type: "repaired", attempt });
|
|
119
|
+
}
|
|
120
|
+
if (options.memory) {
|
|
121
|
+
try {
|
|
122
|
+
await options.memory.set(ask.intent, forMemory(document));
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// Memory is a convenience: a full or unavailable store doesn't lose a good document.
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const result = { document, report, attempts, usage };
|
|
129
|
+
onProgress({ type: "done", result });
|
|
130
|
+
event({ type: "done", attempts, ms: ms(), warnings: report.warnings, checks: checkIds(report.findings), ...usage });
|
|
131
|
+
return result;
|
|
132
|
+
}
|
|
133
|
+
messages = [
|
|
134
|
+
{ role: "user", content: prepared.user },
|
|
135
|
+
{ role: "assistant", content: text },
|
|
136
|
+
{ role: "user", content: repairPrompt(blocking) },
|
|
137
|
+
];
|
|
138
|
+
}
|
|
139
|
+
const result = { document: last.document, report: { ...last.report, valid: false }, attempts, usage };
|
|
140
|
+
fail("invalid", undefined, result);
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
143
|
+
/** An abort signal that follows the ask's and can also be aborted by the runtime. */
|
|
144
|
+
function linked(signal) {
|
|
145
|
+
const controller = new AbortController();
|
|
146
|
+
if (signal?.aborted)
|
|
147
|
+
controller.abort(signal.reason);
|
|
148
|
+
else
|
|
149
|
+
signal?.addEventListener("abort", () => controller.abort(signal.reason), { once: true });
|
|
150
|
+
return controller;
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
generate: (ask, opts = {}) => run(ask, opts.onProgress ?? (() => { }), ask.signal),
|
|
154
|
+
async *stream(ask) {
|
|
155
|
+
const controller = linked(ask.signal);
|
|
156
|
+
const queue = [];
|
|
157
|
+
let wake;
|
|
158
|
+
let finished = false;
|
|
159
|
+
const push = (p) => {
|
|
160
|
+
queue.push(p);
|
|
161
|
+
wake?.();
|
|
162
|
+
};
|
|
163
|
+
run(ask, push, controller.signal).then(() => { }, () => { }).finally(() => {
|
|
164
|
+
finished = true;
|
|
165
|
+
wake?.();
|
|
166
|
+
});
|
|
167
|
+
try {
|
|
168
|
+
for (;;) {
|
|
169
|
+
if (queue.length) {
|
|
170
|
+
yield queue.shift();
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
if (finished)
|
|
174
|
+
return;
|
|
175
|
+
await new Promise((resolve) => (wake = resolve));
|
|
176
|
+
wake = undefined;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
finally {
|
|
180
|
+
if (!finished)
|
|
181
|
+
controller.abort(new DOMException("The stream was closed", "AbortError"));
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
async prompt(ask) {
|
|
185
|
+
const { user } = await prepare(ask);
|
|
186
|
+
return { system, messages: [{ role: "user", content: user }] };
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type { UIDocument } from "@polyxd/core";
|
|
2
|
+
import type { Capability, CapabilityRegistry } from "@polyxd/spec/capabilities";
|
|
3
|
+
import type { Rule } from "@polyxd/spec/patterns";
|
|
4
|
+
export type { UIDocument, Capability, CapabilityRegistry, Rule };
|
|
5
|
+
/** A component as the generator is told about it (from the spec, at build time). */
|
|
6
|
+
export interface CatalogComponent {
|
|
7
|
+
name: string;
|
|
8
|
+
/** Shell components are the product's authored frame and never appear in a generated document. */
|
|
9
|
+
shell: boolean;
|
|
10
|
+
/** Its props and when to use it, as one entry of the system prompt. */
|
|
11
|
+
line: string;
|
|
12
|
+
}
|
|
13
|
+
/** A spec pattern: what the generator is told, and the checks a document that declares it must pass. */
|
|
14
|
+
export interface CatalogPattern {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
summary: string;
|
|
18
|
+
whenToUse: string[];
|
|
19
|
+
structure: string[];
|
|
20
|
+
checks: Rule[];
|
|
21
|
+
}
|
|
22
|
+
/** A Design Direction (`direction.schema.json`). Only the parts the runtime reads are typed. */
|
|
23
|
+
export interface Direction {
|
|
24
|
+
name: string;
|
|
25
|
+
version?: string;
|
|
26
|
+
designSystem?: string;
|
|
27
|
+
profile?: {
|
|
28
|
+
density?: "compact" | "comfortable" | "spacious";
|
|
29
|
+
emphasisBudget?: number;
|
|
30
|
+
dataDisplay?: "auto" | "prefer-charts" | "prefer-tables" | "prefer-metrics";
|
|
31
|
+
motion?: "none" | "subtle" | "expressive";
|
|
32
|
+
disclosure?: "show-everything" | "progressive";
|
|
33
|
+
freedom?: "strict" | "guided" | "open";
|
|
34
|
+
};
|
|
35
|
+
voice?: Record<string, any>;
|
|
36
|
+
patterns?: {
|
|
37
|
+
prefer?: string[];
|
|
38
|
+
disallow?: string[];
|
|
39
|
+
custom?: string[];
|
|
40
|
+
};
|
|
41
|
+
rules?: Rule[];
|
|
42
|
+
/** `document` is a path in the schema; the runtime also takes the document itself. */
|
|
43
|
+
exemplars?: {
|
|
44
|
+
request: string;
|
|
45
|
+
document: string | UIDocument;
|
|
46
|
+
}[];
|
|
47
|
+
}
|
|
48
|
+
/** An exemplar ready for the prompt: the request and the document it was answered with. */
|
|
49
|
+
export interface Exemplar {
|
|
50
|
+
request: string;
|
|
51
|
+
document: UIDocument;
|
|
52
|
+
}
|
|
53
|
+
export interface Message {
|
|
54
|
+
role: "user" | "assistant";
|
|
55
|
+
content: string;
|
|
56
|
+
}
|
|
57
|
+
export interface Usage {
|
|
58
|
+
inputTokens: number;
|
|
59
|
+
outputTokens: number;
|
|
60
|
+
}
|
|
61
|
+
/** What the runtime asks of a model: one system prompt, a short conversation, and streaming text. */
|
|
62
|
+
export interface GenerateRequest {
|
|
63
|
+
system: string;
|
|
64
|
+
messages: Message[];
|
|
65
|
+
signal?: AbortSignal;
|
|
66
|
+
/** Called with each piece of text as it arrives. */
|
|
67
|
+
onText?: (text: string) => void;
|
|
68
|
+
}
|
|
69
|
+
export interface GeneratorOutput {
|
|
70
|
+
text: string;
|
|
71
|
+
usage?: Partial<Usage>;
|
|
72
|
+
}
|
|
73
|
+
/** Any model behind one call. The adapters implement it; so can your own code or a fake in tests. */
|
|
74
|
+
export interface Generator {
|
|
75
|
+
/** A short name for the adapter, such as "anthropic". */
|
|
76
|
+
readonly name: string;
|
|
77
|
+
generate(request: GenerateRequest): Promise<GeneratorOutput | string>;
|
|
78
|
+
}
|
|
79
|
+
export interface Finding {
|
|
80
|
+
severity: "error" | "warning";
|
|
81
|
+
/** A check id such as `spec`, `pattern:root-is-confirm`, `rule:money-moves-in-confirm` or `json:parse`. */
|
|
82
|
+
check: string;
|
|
83
|
+
message: string;
|
|
84
|
+
}
|
|
85
|
+
export interface Report {
|
|
86
|
+
/** No errors. Warnings don't make a document invalid. */
|
|
87
|
+
valid: boolean;
|
|
88
|
+
errors: number;
|
|
89
|
+
warnings: number;
|
|
90
|
+
findings: Finding[];
|
|
91
|
+
}
|
|
92
|
+
/** What the runtime passes to the checks: the same shape as the verifier's `staticAudit` options. */
|
|
93
|
+
export interface AuditOptions {
|
|
94
|
+
/** Only the capabilities offered for this ask. */
|
|
95
|
+
registry?: CapabilityRegistry;
|
|
96
|
+
/** The Direction's rules and its compiled voice. */
|
|
97
|
+
rules?: Rule[];
|
|
98
|
+
/** The Direction's `profile.emphasisBudget`. */
|
|
99
|
+
emphasisBudget?: number;
|
|
100
|
+
/** How a binding that reads nothing from the data is reported: "error" when the ask carries data, "warning" when it doesn't. */
|
|
101
|
+
missingData?: "warning" | "error";
|
|
102
|
+
}
|
|
103
|
+
/** A document check. `staticAudit` from `@polyxd/verifier/static` fits this shape, and is the default. */
|
|
104
|
+
export type Audit = (doc: any, options: AuditOptions) => Finding[] | Promise<Finding[]>;
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@polyxd/runtime",
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "Generates a spec-valid Polyxd UI document for an ask with the model you choose: applies a Design Direction, validates and repairs, streams, and remembers the screen per intent",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"default": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./package.json": "./package.json"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"README.md",
|
|
19
|
+
"LICENSE",
|
|
20
|
+
"NOTICE"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsc -b",
|
|
24
|
+
"build:catalog": "node scripts/build-catalog.ts",
|
|
25
|
+
"test": "node --test \"test/**/*.test.ts\""
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@polyxd/core": "^0.4.0",
|
|
29
|
+
"@polyxd/spec": "^0.4.0",
|
|
30
|
+
"@polyxd/verifier": "^0.4.0"
|
|
31
|
+
},
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "git+https://github.com/visualfart/polyxd.git",
|
|
35
|
+
"directory": "packages/runtime"
|
|
36
|
+
},
|
|
37
|
+
"homepage": "https://polyxd.com",
|
|
38
|
+
"bugs": "https://github.com/visualfart/polyxd/issues",
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public"
|
|
41
|
+
}
|
|
42
|
+
}
|