@adminiumjs/llm 0.1.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/dist/apply/diff.d.ts +79 -0
- package/dist/apply/diff.d.ts.map +1 -0
- package/dist/apply/diff.js +459 -0
- package/dist/apply/diff.js.map +1 -0
- package/dist/apply/index.d.ts +6 -0
- package/dist/apply/index.d.ts.map +1 -0
- package/dist/apply/index.js +6 -0
- package/dist/apply/index.js.map +1 -0
- package/dist/apply/normalize.d.ts +55 -0
- package/dist/apply/normalize.d.ts.map +1 -0
- package/dist/apply/normalize.js +232 -0
- package/dist/apply/normalize.js.map +1 -0
- package/dist/apply/plan.d.ts +206 -0
- package/dist/apply/plan.d.ts.map +1 -0
- package/dist/apply/plan.js +422 -0
- package/dist/apply/plan.js.map +1 -0
- package/dist/apply/suggestion-id.d.ts +103 -0
- package/dist/apply/suggestion-id.d.ts.map +1 -0
- package/dist/apply/suggestion-id.js +121 -0
- package/dist/apply/suggestion-id.js.map +1 -0
- package/dist/crypto.d.ts +48 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +35 -0
- package/dist/crypto.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/prompt/builder.d.ts +27 -0
- package/dist/prompt/builder.d.ts.map +1 -0
- package/dist/prompt/builder.js +263 -0
- package/dist/prompt/builder.js.map +1 -0
- package/dist/prompt/chunker.d.ts +89 -0
- package/dist/prompt/chunker.d.ts.map +1 -0
- package/dist/prompt/chunker.js +383 -0
- package/dist/prompt/chunker.js.map +1 -0
- package/dist/prompt/index.d.ts +14 -0
- package/dist/prompt/index.d.ts.map +1 -0
- package/dist/prompt/index.js +14 -0
- package/dist/prompt/index.js.map +1 -0
- package/dist/prompt/serializer.d.ts +138 -0
- package/dist/prompt/serializer.d.ts.map +1 -0
- package/dist/prompt/serializer.js +178 -0
- package/dist/prompt/serializer.js.map +1 -0
- package/dist/prompt/templates/v1.d.ts +41 -0
- package/dist/prompt/templates/v1.d.ts.map +1 -0
- package/dist/prompt/templates/v1.js +312 -0
- package/dist/prompt/templates/v1.js.map +1 -0
- package/dist/prompt/token-estimate.d.ts +16 -0
- package/dist/prompt/token-estimate.d.ts.map +1 -0
- package/dist/prompt/token-estimate.js +20 -0
- package/dist/prompt/token-estimate.js.map +1 -0
- package/dist/prompt/types.d.ts +134 -0
- package/dist/prompt/types.d.ts.map +1 -0
- package/dist/prompt/types.js +44 -0
- package/dist/prompt/types.js.map +1 -0
- package/dist/providers/anthropic.d.ts +3 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +65 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/factory.d.ts +3 -0
- package/dist/providers/factory.d.ts.map +1 -0
- package/dist/providers/factory.js +37 -0
- package/dist/providers/factory.js.map +1 -0
- package/dist/providers/http.d.ts +56 -0
- package/dist/providers/http.d.ts.map +1 -0
- package/dist/providers/http.js +148 -0
- package/dist/providers/http.js.map +1 -0
- package/dist/providers/index.d.ts +15 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +15 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/model-catalog.d.ts +21 -0
- package/dist/providers/model-catalog.d.ts.map +1 -0
- package/dist/providers/model-catalog.js +121 -0
- package/dist/providers/model-catalog.js.map +1 -0
- package/dist/providers/ollama.d.ts +3 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +55 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai-compatible.d.ts +3 -0
- package/dist/providers/openai-compatible.d.ts.map +1 -0
- package/dist/providers/openai-compatible.js +50 -0
- package/dist/providers/openai-compatible.js.map +1 -0
- package/dist/providers/openai.d.ts +18 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +68 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/types.d.ts +112 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +55 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/response/errors.d.ts +60 -0
- package/dist/response/errors.d.ts.map +1 -0
- package/dist/response/errors.js +101 -0
- package/dist/response/errors.js.map +1 -0
- package/dist/response/extract.d.ts +38 -0
- package/dist/response/extract.d.ts.map +1 -0
- package/dist/response/extract.js +77 -0
- package/dist/response/extract.js.map +1 -0
- package/dist/response/index.d.ts +8 -0
- package/dist/response/index.d.ts.map +1 -0
- package/dist/response/index.js +8 -0
- package/dist/response/index.js.map +1 -0
- package/dist/response/merge.d.ts +53 -0
- package/dist/response/merge.d.ts.map +1 -0
- package/dist/response/merge.js +348 -0
- package/dist/response/merge.js.map +1 -0
- package/dist/response/referential.d.ts +113 -0
- package/dist/response/referential.d.ts.map +1 -0
- package/dist/response/referential.js +556 -0
- package/dist/response/referential.js.map +1 -0
- package/dist/response/schema.d.ts +506 -0
- package/dist/response/schema.d.ts.map +1 -0
- package/dist/response/schema.js +191 -0
- package/dist/response/schema.js.map +1 -0
- package/dist/response/validate.d.ts +29 -0
- package/dist/response/validate.d.ts.map +1 -0
- package/dist/response/validate.js +167 -0
- package/dist/response/validate.js.map +1 -0
- package/dist/types.d.ts +95 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +49 -0
- package/dist/types.js.map +1 -0
- package/package.json +30 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `LlmResponseV1` — the one response contract shared by the direct-API and BYO
|
|
3
|
+
* paths (06-llm-assist.md §1, §6.1). Shipped verbatim from §6.1: field names
|
|
4
|
+
* and shapes are load-bearing — the golden fixtures in §6.3 and every
|
|
5
|
+
* downstream consumer (validate.ts, normalize.ts, diff.ts) depend on them.
|
|
6
|
+
*
|
|
7
|
+
* ONE intentional adaptation to Zod 4 is marked below (`L10n`): the doc's
|
|
8
|
+
* `z.record(LocaleCode, …)` cannot be used literally — in Zod 3 an enum-keyed
|
|
9
|
+
* record was partial, but in Zod 4 it is exhaustive (every enum key required),
|
|
10
|
+
* which would reject a 2-locale response (§6.3). Nor may the key be a strict
|
|
11
|
+
* enum: §7.2 stage 5 (`LLM_LOCALE_KEYS`) is the SOLE owner of locale-key
|
|
12
|
+
* validation, and it must be per-item — a single stray/non-canonical key (a
|
|
13
|
+
* BCP-47 'en-US', an unrequested 'pt_BR') must drop only that one suggestion,
|
|
14
|
+
* not fail the whole run at Zod (stage 4, fatal). So the key is typed
|
|
15
|
+
* `z.string()`: any string key parses here, and validate.ts checks the exact
|
|
16
|
+
* requested-locale set contextually (Zod alone can't know the run's locale list).
|
|
17
|
+
*
|
|
18
|
+
* Version negotiation (§4.3) is appended after the verbatim schema.
|
|
19
|
+
*/
|
|
20
|
+
import { z } from 'zod';
|
|
21
|
+
export const SCHEMA_VERSION = 'adminium.llm/v1';
|
|
22
|
+
export const SUPPORTED_SCHEMA_VERSIONS = [SCHEMA_VERSION];
|
|
23
|
+
export const LOCALES = ['en_US', 'de_DE', 'ar_EG', 'zh_CN', 'zh_TW', 'cs_CZ', 'da_DK', 'fr_FR'];
|
|
24
|
+
export const LocaleCode = z.enum(LOCALES);
|
|
25
|
+
/** Localized text: keys must be exactly the run's requested locales — enforced
|
|
26
|
+
* contextually in validate.ts stage 5 (Zod alone can't know the run's locale
|
|
27
|
+
* list). The key schema is `z.string()`, NOT `LocaleCode`: a stray or
|
|
28
|
+
* non-canonical locale key must be a per-item `LLM_LOCALE_KEYS` drop (stage 5),
|
|
29
|
+
* never a fatal `LLM_SCHEMA_INVALID` at Zod (stage 4) that discards the whole
|
|
30
|
+
* run. The value still enforces a non-empty string. */
|
|
31
|
+
export const L10n = z.record(z.string(), z.string().min(1));
|
|
32
|
+
export const Confidence = z.number().min(0).max(1);
|
|
33
|
+
export const Tone = z.enum(['pos', 'warn', 'danger', 'accent', 'muted']);
|
|
34
|
+
export const PiiKind = z.enum(['email', 'phone', 'name', 'address', 'gov-id', 'dob',
|
|
35
|
+
'financial', 'credentials', 'health', 'ip', 'location', 'other']);
|
|
36
|
+
export const Masking = z.enum(['mask-email', 'mask-partial', 'last4', 'redact', 'hash', 'none']);
|
|
37
|
+
export const Agg = z.enum(['count', 'sum', 'avg', 'min', 'max']);
|
|
38
|
+
export const RelationKind = z.enum(['many-to-one', 'one-to-one', 'many-to-many-via']);
|
|
39
|
+
const LucideIcon = z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'kebab-case lucide icon name');
|
|
40
|
+
const Slug = z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/);
|
|
41
|
+
const Reason = z.string().min(1).max(200);
|
|
42
|
+
export const PiiSuggestion = z.object({
|
|
43
|
+
kind: PiiKind, masking: Masking, reason: Reason, confidence: Confidence,
|
|
44
|
+
});
|
|
45
|
+
export const ColumnSuggestion = z.object({
|
|
46
|
+
column: z.string().min(1),
|
|
47
|
+
label: L10n,
|
|
48
|
+
description: L10n.optional(),
|
|
49
|
+
pii: PiiSuggestion.nullable().default(null),
|
|
50
|
+
});
|
|
51
|
+
export const PageTemplateSuggestion = z.object({
|
|
52
|
+
template: z.string().min(1), // membership in LLM_ALLOWED_TEMPLATES checked referentially
|
|
53
|
+
rank: z.number().int().min(1),
|
|
54
|
+
triggers: z.array(z.string()).min(1),
|
|
55
|
+
reason: Reason,
|
|
56
|
+
confidence: Confidence,
|
|
57
|
+
});
|
|
58
|
+
export const Microcopy = z.object({
|
|
59
|
+
emptyState: z.object({ headline: L10n, guidance: L10n }),
|
|
60
|
+
pageSubtitle: L10n,
|
|
61
|
+
});
|
|
62
|
+
export const TableSuggestion = z.object({
|
|
63
|
+
table: z.string().min(1), // qualified "schema.table"
|
|
64
|
+
confidence: Confidence,
|
|
65
|
+
label: L10n,
|
|
66
|
+
description: L10n,
|
|
67
|
+
icon: LucideIcon,
|
|
68
|
+
displayColumn: z.string().nullable(),
|
|
69
|
+
naturalKey: z.array(z.string().min(1)).min(1).nullable(),
|
|
70
|
+
pageTemplates: z.array(PageTemplateSuggestion).max(3).default([]),
|
|
71
|
+
microcopy: Microcopy.optional(),
|
|
72
|
+
columns: z.array(ColumnSuggestion).default([]),
|
|
73
|
+
});
|
|
74
|
+
export const EnumSuggestion = z.object({
|
|
75
|
+
table: z.string().min(1),
|
|
76
|
+
column: z.string().min(1),
|
|
77
|
+
kind: z.enum(['workflow', 'category']),
|
|
78
|
+
order: z.array(z.string()).nullable(), // permutation-checked referentially
|
|
79
|
+
terminal: z.array(z.string()).optional(),
|
|
80
|
+
tones: z.record(z.string(), Tone),
|
|
81
|
+
reason: Reason,
|
|
82
|
+
confidence: Confidence,
|
|
83
|
+
});
|
|
84
|
+
export const ConfirmedRelation = z.object({
|
|
85
|
+
fromTable: z.string(), fromColumns: z.array(z.string()).min(1),
|
|
86
|
+
toTable: z.string(), toColumns: z.array(z.string()).min(1),
|
|
87
|
+
semantics: z.string().max(120),
|
|
88
|
+
correct: z.boolean(),
|
|
89
|
+
confidence: Confidence,
|
|
90
|
+
});
|
|
91
|
+
export const InferredRelation = z.object({
|
|
92
|
+
fromTable: z.string(), fromColumns: z.array(z.string()).min(1),
|
|
93
|
+
toTable: z.string(), toColumns: z.array(z.string()).min(1),
|
|
94
|
+
kind: RelationKind,
|
|
95
|
+
viaTable: z.string().optional(),
|
|
96
|
+
evidence: Reason,
|
|
97
|
+
confidence: Confidence,
|
|
98
|
+
});
|
|
99
|
+
export const NavGroupSuggestion = z.object({
|
|
100
|
+
id: Slug,
|
|
101
|
+
label: L10n,
|
|
102
|
+
icon: LucideIcon,
|
|
103
|
+
order: z.number().int().min(0),
|
|
104
|
+
tables: z.array(z.string()).min(1),
|
|
105
|
+
confidence: Confidence,
|
|
106
|
+
});
|
|
107
|
+
export const WidgetSuggestion = z.object({
|
|
108
|
+
widget: z.string().min(1), // membership in LLM_ALLOWED_WIDGETS checked referentially
|
|
109
|
+
rank: z.number().int().min(1),
|
|
110
|
+
span: z.union([z.literal(3), z.literal(4), z.literal(6), z.literal(8), z.literal(12)]),
|
|
111
|
+
table: z.string().min(1),
|
|
112
|
+
metricColumn: z.string().optional(),
|
|
113
|
+
dimensionColumn: z.string().optional(),
|
|
114
|
+
timeColumn: z.string().optional(),
|
|
115
|
+
agg: Agg.optional(),
|
|
116
|
+
titleEn: z.string().max(60),
|
|
117
|
+
reason: Reason,
|
|
118
|
+
confidence: Confidence,
|
|
119
|
+
});
|
|
120
|
+
export const DashboardSuggestion = z.object({
|
|
121
|
+
id: Slug,
|
|
122
|
+
domain: z.string().max(40),
|
|
123
|
+
label: L10n,
|
|
124
|
+
order: z.number().int().min(0),
|
|
125
|
+
tables: z.array(z.string()).min(1),
|
|
126
|
+
widgets: z.array(WidgetSuggestion).max(8),
|
|
127
|
+
});
|
|
128
|
+
export const LlmResponseV1 = z.object({
|
|
129
|
+
schema_version: z.literal(SCHEMA_VERSION),
|
|
130
|
+
run_id: z.string().optional(),
|
|
131
|
+
error: z.string().optional(), // model-declared inability; if set, all else ignored
|
|
132
|
+
tables: z.array(TableSuggestion).default([]),
|
|
133
|
+
enums: z.array(EnumSuggestion).default([]),
|
|
134
|
+
relations: z.object({
|
|
135
|
+
confirmed: z.array(ConfirmedRelation).default([]),
|
|
136
|
+
inferred: z.array(InferredRelation).default([]),
|
|
137
|
+
}).default({ confirmed: [], inferred: [] }),
|
|
138
|
+
navGroups: z.array(NavGroupSuggestion).max(7).default([]),
|
|
139
|
+
dashboards: z.array(DashboardSuggestion).max(6).default([]),
|
|
140
|
+
notes: z.array(z.string().max(300)).max(5).optional(),
|
|
141
|
+
}).strict();
|
|
142
|
+
// ─── Version negotiation (§4.3) ──────────────────────────────────────────────
|
|
143
|
+
/**
|
|
144
|
+
* Prompt-contract version. §4.3 colocates the authoritative constant in
|
|
145
|
+
* prompt/templates/v1.ts (06-T03); it is mirrored here so the response contract
|
|
146
|
+
* and its version negotiation are self-contained and need no cross-subdir
|
|
147
|
+
* import. Both must stay equal to `'adminium.prompt/v1.1'`.
|
|
148
|
+
*
|
|
149
|
+
* v1 → v1.1: the trigger-taxonomy `page-builder` row was removed from the §5.2
|
|
150
|
+
* user template (page-builder is `recommendable: false` and absent from
|
|
151
|
+
* `LLM_ALLOWED_TEMPLATES`; the taxonomy now matches the injected allowed list) —
|
|
152
|
+
* see prompt/templates/v1.ts. Wording-only; the response contract
|
|
153
|
+
* (`adminium.llm/v1`) is unchanged.
|
|
154
|
+
*/
|
|
155
|
+
export const PROMPT_VERSION = 'adminium.prompt/v1.1';
|
|
156
|
+
/** Fatal code raised by stage 3 of the pipeline (§7.2) on an unknown contract. */
|
|
157
|
+
export const VERSION_MISMATCH_CODE = 'LLM_VERSION_MISMATCH';
|
|
158
|
+
/** Rendered verbatim in the paste UI when a response targets an unknown contract (§4.3). */
|
|
159
|
+
export const VERSION_MISMATCH_HINT = 'Regenerate the prompt in Studio (Settings → AI) — this response was produced for an unsupported contract version.';
|
|
160
|
+
/**
|
|
161
|
+
* Predicate: is `version` a contract version this build still validates?
|
|
162
|
+
*
|
|
163
|
+
* When v2 ships, v1 stays in {@link SUPPORTED_SCHEMA_VERSIONS} and keeps
|
|
164
|
+
* validating against the frozen v1 schema (§4.3) — a user may paste a response
|
|
165
|
+
* generated from a prompt downloaded weeks earlier. `supported` is injectable so
|
|
166
|
+
* that forward-compatibility (a supported-but-older version) is testable today.
|
|
167
|
+
*/
|
|
168
|
+
export function isSupportedSchemaVersion(version, supported = SUPPORTED_SCHEMA_VERSIONS) {
|
|
169
|
+
return typeof version === 'string' && supported.includes(version);
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Negotiate a response's declared `schema_version` (§4.3): a supported version
|
|
173
|
+
* (including a supported-but-older one) resolves `ok`; anything else is a fatal
|
|
174
|
+
* rejection carrying `LLM_VERSION_MISMATCH` and the regeneration hint.
|
|
175
|
+
*/
|
|
176
|
+
export function negotiateSchemaVersion(version, supported = SUPPORTED_SCHEMA_VERSIONS) {
|
|
177
|
+
if (isSupportedSchemaVersion(version, supported)) {
|
|
178
|
+
return { ok: true, version };
|
|
179
|
+
}
|
|
180
|
+
const found = typeof version === 'string'
|
|
181
|
+
? `"${version}"`
|
|
182
|
+
: 'a missing or non-string schema_version';
|
|
183
|
+
return {
|
|
184
|
+
ok: false,
|
|
185
|
+
code: VERSION_MISMATCH_CODE,
|
|
186
|
+
found: version,
|
|
187
|
+
message: `Unsupported schema_version (${found}). ${VERSION_MISMATCH_HINT}`,
|
|
188
|
+
hint: VERSION_MISMATCH_HINT,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/response/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type LlmValidationError } from './errors.js';
|
|
2
|
+
import { type ReferentialContext } from './referential.js';
|
|
3
|
+
import { LlmResponseV1 } from './schema.js';
|
|
4
|
+
/**
|
|
5
|
+
* Everything {@link validateResponse} needs: the referential context (snapshot,
|
|
6
|
+
* locales, registry allow-lists) plus the stage-3 supported-version list and the
|
|
7
|
+
* stage-7 expected run id.
|
|
8
|
+
*/
|
|
9
|
+
export interface ValidationContext extends ReferentialContext {
|
|
10
|
+
/** Expected run id (the ULID embedded in the prompt). Enables the §7.2 stage-7 warning. */
|
|
11
|
+
runId?: string;
|
|
12
|
+
/** Override for `SUPPORTED_SCHEMA_VERSIONS` (testable forward-compat, §4.3). */
|
|
13
|
+
supportedVersions?: readonly string[];
|
|
14
|
+
}
|
|
15
|
+
export interface ValidationResult {
|
|
16
|
+
/** The cleaned, validated response — absent iff a fatal error stopped the run. */
|
|
17
|
+
response?: LlmResponseV1;
|
|
18
|
+
/** Fatal + per-item errors, most-actionable first within each stage. */
|
|
19
|
+
errors: LlmValidationError[];
|
|
20
|
+
/** Non-blocking notices (icon fallback, run-id mismatch). */
|
|
21
|
+
warnings: LlmValidationError[];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Validate a raw model reply against the run's snapshot and registries. Runs the
|
|
25
|
+
* full §7.2 pipeline; returns the cleaned response plus every error/warning with
|
|
26
|
+
* a precise JSON path. Never throws.
|
|
27
|
+
*/
|
|
28
|
+
export declare function validateResponse(rawText: string, ctx: ValidationContext): ValidationResult;
|
|
29
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/response/validate.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAkB,KAAK,kBAAkB,EAAa,MAAM,aAAa,CAAC;AACjF,OAAO,EAIL,KAAK,kBAAkB,EAGxB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAA0B,MAAM,aAAa,CAAC;AAEpE;;;;GAIG;AACH,MAAM,WAAW,iBAAkB,SAAQ,kBAAkB;IAC3D,2FAA2F;IAC3F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,kFAAkF;IAClF,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,wEAAwE;IACxE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,6DAA6D;IAC7D,QAAQ,EAAE,kBAAkB,EAAE,CAAC;CAChC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,GAAG,gBAAgB,CAkF1F"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The staged validation pipeline (06-llm-assist.md §7.2).
|
|
3
|
+
*
|
|
4
|
+
* 1 extract → recover the JSON object (fences/prose stripped, truncation
|
|
5
|
+
* detected) — fatal
|
|
6
|
+
* 2 parse → `JSON.parse` — fatal
|
|
7
|
+
* 3 version → `schema_version` supported; model-declared `error` key
|
|
8
|
+
* — fatal
|
|
9
|
+
* 4 zod → `LlmResponseV1.safeParse`, issues mapped to paths — fatal
|
|
10
|
+
* 5 locale → every localized object has exactly the run's locales — per-item
|
|
11
|
+
* 6 referential → §7.3 cross-checks vs the snapshot + registries — per-item
|
|
12
|
+
* 7 run-bind → `run_id` present and ≠ ctx.runId — warning
|
|
13
|
+
*
|
|
14
|
+
* Fatal errors reject the whole run (`response` is absent). Per-item errors drop
|
|
15
|
+
* only the offending suggestion (and its dependents) and let the rest through —
|
|
16
|
+
* `response` is the cleaned result. Warnings drop nothing.
|
|
17
|
+
*
|
|
18
|
+
* Browser-safe: only Zod + type-only engine imports flow through here.
|
|
19
|
+
*/
|
|
20
|
+
import { extractJsonObject } from './extract.js';
|
|
21
|
+
import { formatJsonPath, makeError } from './errors.js';
|
|
22
|
+
import { applyPrunes, createPrunes, mergePrunes, runReferentialChecks, } from './referential.js';
|
|
23
|
+
import { LlmResponseV1, negotiateSchemaVersion } from './schema.js';
|
|
24
|
+
/**
|
|
25
|
+
* Validate a raw model reply against the run's snapshot and registries. Runs the
|
|
26
|
+
* full §7.2 pipeline; returns the cleaned response plus every error/warning with
|
|
27
|
+
* a precise JSON path. Never throws.
|
|
28
|
+
*/
|
|
29
|
+
export function validateResponse(rawText, ctx) {
|
|
30
|
+
const warnings = [];
|
|
31
|
+
// ── Stage 1 — extract ──────────────────────────────────────────────────────
|
|
32
|
+
const extracted = extractJsonObject(rawText);
|
|
33
|
+
if (!extracted.ok)
|
|
34
|
+
return { errors: [extracted.error], warnings };
|
|
35
|
+
// ── Stage 2 — parse ────────────────────────────────────────────────────────
|
|
36
|
+
let parsed;
|
|
37
|
+
try {
|
|
38
|
+
parsed = JSON.parse(extracted.json);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
return {
|
|
42
|
+
errors: [makeError('LLM_JSON_PARSE', '', `The response is not valid JSON: ${messageOf(error)}`)],
|
|
43
|
+
warnings,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const record = typeof parsed === 'object' && parsed !== null ? parsed : {};
|
|
47
|
+
// ── Stage 3 — version + model-declared error ───────────────────────────────
|
|
48
|
+
const negotiation = negotiateSchemaVersion(record.schema_version, ctx.supportedVersions);
|
|
49
|
+
if (!negotiation.ok) {
|
|
50
|
+
return {
|
|
51
|
+
errors: [
|
|
52
|
+
makeError('LLM_VERSION_MISMATCH', 'schema_version', negotiation.message, {
|
|
53
|
+
hint: negotiation.hint,
|
|
54
|
+
}),
|
|
55
|
+
],
|
|
56
|
+
warnings,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
if (typeof record.error === 'string' && record.error.length > 0) {
|
|
60
|
+
return {
|
|
61
|
+
errors: [
|
|
62
|
+
makeError('LLM_MODEL_DECLINED', 'error', `The model declined to produce enrichment: ${record.error}`),
|
|
63
|
+
],
|
|
64
|
+
warnings,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
// ── Stage 4 — Zod ──────────────────────────────────────────────────────────
|
|
68
|
+
const zod = LlmResponseV1.safeParse(parsed);
|
|
69
|
+
if (!zod.success) {
|
|
70
|
+
const errors = zod.error.issues.map((issue) => makeError('LLM_SCHEMA_INVALID', formatJsonPath(issue.path), issue.message));
|
|
71
|
+
return { errors, warnings };
|
|
72
|
+
}
|
|
73
|
+
const response = zod.data;
|
|
74
|
+
// ── Stage 5 — locale keys (per-item) ───────────────────────────────────────
|
|
75
|
+
const locale = checkLocales(response, ctx.locales);
|
|
76
|
+
// ── Stage 6 — referential (per-item) ───────────────────────────────────────
|
|
77
|
+
const referential = runReferentialChecks(response, ctx);
|
|
78
|
+
warnings.push(...referential.warnings);
|
|
79
|
+
const errors = [...locale.errors, ...referential.errors];
|
|
80
|
+
const cleaned = applyPrunes(response, mergePrunes(locale.prunes, referential.prunes));
|
|
81
|
+
// ── Stage 7 — run binding (warning) ────────────────────────────────────────
|
|
82
|
+
if (ctx.runId !== undefined &&
|
|
83
|
+
typeof cleaned.run_id === 'string' &&
|
|
84
|
+
cleaned.run_id !== ctx.runId) {
|
|
85
|
+
warnings.push(makeError('LLM_RUN_MISMATCH', 'run_id', 'This response looks like it was generated from a different prompt export.'));
|
|
86
|
+
}
|
|
87
|
+
return { response: cleaned, errors, warnings };
|
|
88
|
+
}
|
|
89
|
+
function localeKeysMatch(obj, expected) {
|
|
90
|
+
if (obj === undefined)
|
|
91
|
+
return true;
|
|
92
|
+
const keys = Object.keys(obj);
|
|
93
|
+
if (keys.length !== expected.size)
|
|
94
|
+
return false;
|
|
95
|
+
return keys.every((key) => expected.has(key));
|
|
96
|
+
}
|
|
97
|
+
function checkLocales(response, locales) {
|
|
98
|
+
const expected = new Set(locales);
|
|
99
|
+
const errors = [];
|
|
100
|
+
const prunes = createPrunes();
|
|
101
|
+
const localeMessage = (obj) => {
|
|
102
|
+
const found = Object.keys(obj);
|
|
103
|
+
return `Localized text must use exactly the requested locales [${[...expected].join(', ')}]; found [${found.join(', ')}]. The suggestion was discarded.`;
|
|
104
|
+
};
|
|
105
|
+
response.tables.forEach((table, i) => {
|
|
106
|
+
if (!localeKeysMatch(table.label, expected)) {
|
|
107
|
+
errors.push(makeError('LLM_LOCALE_KEYS', `tables[${i}].label`, localeMessage(table.label)));
|
|
108
|
+
prunes.tables.add(i);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (!localeKeysMatch(table.description, expected)) {
|
|
112
|
+
errors.push(makeError('LLM_LOCALE_KEYS', `tables[${i}].description`, localeMessage(table.description)));
|
|
113
|
+
prunes.tables.add(i);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
table.columns.forEach((column, j) => {
|
|
117
|
+
if (!localeKeysMatch(column.label, expected)) {
|
|
118
|
+
errors.push(makeError('LLM_LOCALE_KEYS', `tables[${i}].columns[${j}].label`, localeMessage(column.label)));
|
|
119
|
+
addColumnDrop(prunes, i, j);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (column.description !== undefined && !localeKeysMatch(column.description, expected)) {
|
|
123
|
+
errors.push(makeError('LLM_LOCALE_KEYS', `tables[${i}].columns[${j}].description`, localeMessage(column.description)));
|
|
124
|
+
addColumnDrop(prunes, i, j);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
const microcopy = table.microcopy;
|
|
128
|
+
if (microcopy) {
|
|
129
|
+
const micro = [
|
|
130
|
+
[microcopy.emptyState.headline, `tables[${i}].microcopy.emptyState.headline`],
|
|
131
|
+
[microcopy.emptyState.guidance, `tables[${i}].microcopy.emptyState.guidance`],
|
|
132
|
+
[microcopy.pageSubtitle, `tables[${i}].microcopy.pageSubtitle`],
|
|
133
|
+
];
|
|
134
|
+
for (const [obj, path] of micro) {
|
|
135
|
+
if (!localeKeysMatch(obj, expected)) {
|
|
136
|
+
errors.push(makeError('LLM_LOCALE_KEYS', path, localeMessage(obj)));
|
|
137
|
+
prunes.dropMicrocopy.add(i);
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
response.navGroups.forEach((group, i) => {
|
|
144
|
+
if (!localeKeysMatch(group.label, expected)) {
|
|
145
|
+
errors.push(makeError('LLM_LOCALE_KEYS', `navGroups[${i}].label`, localeMessage(group.label)));
|
|
146
|
+
prunes.navGroups.add(i);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
response.dashboards.forEach((dashboard, i) => {
|
|
150
|
+
if (!localeKeysMatch(dashboard.label, expected)) {
|
|
151
|
+
errors.push(makeError('LLM_LOCALE_KEYS', `dashboards[${i}].label`, localeMessage(dashboard.label)));
|
|
152
|
+
prunes.dashboards.add(i);
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
return { errors, prunes };
|
|
156
|
+
}
|
|
157
|
+
function addColumnDrop(prunes, tableIndex, columnIndex) {
|
|
158
|
+
const set = prunes.columns.get(tableIndex);
|
|
159
|
+
if (set)
|
|
160
|
+
set.add(columnIndex);
|
|
161
|
+
else
|
|
162
|
+
prunes.columns.set(tableIndex, new Set([columnIndex]));
|
|
163
|
+
}
|
|
164
|
+
function messageOf(error) {
|
|
165
|
+
return error instanceof Error ? error.message : String(error);
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/response/validate.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared `@adminium/llm` contract types (06-llm-assist.md §2, §7.1): the
|
|
3
|
+
* normalized `EnrichmentSet` both paths reduce to, the provider identifiers, and
|
|
4
|
+
* the run status machine.
|
|
5
|
+
*
|
|
6
|
+
* Browser-safe: this module imports only pure-Zod / pure-TS types. The engine
|
|
7
|
+
* reference is a type-only re-export (erased at build time) so no DB-driver code
|
|
8
|
+
* can reach `@adminium/dashboard` through here.
|
|
9
|
+
*/
|
|
10
|
+
import { z } from 'zod';
|
|
11
|
+
import type { ConfirmedRelation, DashboardSuggestion, EnumSuggestion, InferredRelation, LocaleCode, Microcopy, NavGroupSuggestion, PiiSuggestion } from './response/schema.js';
|
|
12
|
+
/**
|
|
13
|
+
* The classified schema IR a run is built, validated and normalized against
|
|
14
|
+
* (05-introspection-engine.md). Re-exported here so every `@adminium/llm`
|
|
15
|
+
* module names the model from one place; the referential checks (§7.3) and the
|
|
16
|
+
* heuristic→EnrichmentSet normalizer both consume it. Type-only: no runtime edge
|
|
17
|
+
* to `@adminium/engine`, keeping this package browser-safe.
|
|
18
|
+
*/
|
|
19
|
+
export type { DatabaseModel } from '@adminium/engine';
|
|
20
|
+
export declare const PROVIDER_IDS: readonly ["anthropic", "openai", "openai-compatible", "ollama", "adminium-managed"];
|
|
21
|
+
export declare const providerIdSchema: z.ZodEnum<{
|
|
22
|
+
anthropic: "anthropic";
|
|
23
|
+
openai: "openai";
|
|
24
|
+
"openai-compatible": "openai-compatible";
|
|
25
|
+
ollama: "ollama";
|
|
26
|
+
"adminium-managed": "adminium-managed";
|
|
27
|
+
}>;
|
|
28
|
+
export type ProviderId = z.infer<typeof providerIdSchema>;
|
|
29
|
+
/**
|
|
30
|
+
* `adminium_llm_runs.status` states. Transitions (§7.4):
|
|
31
|
+
* draft → running | awaiting_response
|
|
32
|
+
* running | awaiting_response → validated | failed | discarded
|
|
33
|
+
* validated → applied | partially_applied | discarded
|
|
34
|
+
* applied | partially_applied | failed | discarded → (terminal)
|
|
35
|
+
*/
|
|
36
|
+
export declare const LLM_RUN_STATUSES: readonly ["draft", "running", "awaiting_response", "validated", "applied", "partially_applied", "failed", "discarded"];
|
|
37
|
+
export declare const llmRunStatusSchema: z.ZodEnum<{
|
|
38
|
+
draft: "draft";
|
|
39
|
+
running: "running";
|
|
40
|
+
awaiting_response: "awaiting_response";
|
|
41
|
+
validated: "validated";
|
|
42
|
+
applied: "applied";
|
|
43
|
+
partially_applied: "partially_applied";
|
|
44
|
+
failed: "failed";
|
|
45
|
+
discarded: "discarded";
|
|
46
|
+
}>;
|
|
47
|
+
export type LlmRunStatus = z.infer<typeof llmRunStatusSchema>;
|
|
48
|
+
/** States a run can never leave (§7.4: "Runs are immutable after `applied`"). */
|
|
49
|
+
export declare const TERMINAL_LLM_RUN_STATUSES: readonly ["applied", "partially_applied", "failed", "discarded"];
|
|
50
|
+
export declare function isTerminalRunStatus(status: LlmRunStatus): boolean;
|
|
51
|
+
/** One table's normalized enrichment (labels, keys, templates, micro-copy, per-column). */
|
|
52
|
+
export interface EnrichmentTable {
|
|
53
|
+
label: Partial<Record<LocaleCode, string>>;
|
|
54
|
+
description?: Partial<Record<LocaleCode, string>>;
|
|
55
|
+
icon?: string;
|
|
56
|
+
displayColumn?: string | null;
|
|
57
|
+
naturalKey?: string[] | null;
|
|
58
|
+
templates: {
|
|
59
|
+
template: string;
|
|
60
|
+
rank: number;
|
|
61
|
+
reason?: string;
|
|
62
|
+
confidence: number;
|
|
63
|
+
}[];
|
|
64
|
+
microcopy?: Microcopy;
|
|
65
|
+
columns: Record<string, {
|
|
66
|
+
label: Partial<Record<LocaleCode, string>>;
|
|
67
|
+
description?: Partial<Record<LocaleCode, string>>;
|
|
68
|
+
pii?: PiiSuggestion | null;
|
|
69
|
+
}>;
|
|
70
|
+
/** heuristic entries use fixed 0.5. */
|
|
71
|
+
confidence: number;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* The normalized enrichment both the heuristic baseline (from `@adminium/engine`)
|
|
75
|
+
* and a validated `LlmResponseV1` reduce to, so they diff field-by-field (§7.1).
|
|
76
|
+
* `tables` is keyed by `"schema.table"`; `enums` by `"schema.table.column"`.
|
|
77
|
+
*/
|
|
78
|
+
export interface EnrichmentSet {
|
|
79
|
+
source: 'heuristic' | 'llm';
|
|
80
|
+
llmRunId?: string;
|
|
81
|
+
tables: Record<string, EnrichmentTable>;
|
|
82
|
+
enums: Record<string, EnumSuggestion>;
|
|
83
|
+
inferredRelations: InferredRelation[];
|
|
84
|
+
/**
|
|
85
|
+
* Confirmed relations the LLM REJECTS (`correct: false`) — a declared FK it
|
|
86
|
+
* wants suppressed (§8.3 `relation_suppressed`). Carried so the diff can raise
|
|
87
|
+
* a `rejects-heuristic` row a human must confirm (§8.2, acceptance criterion
|
|
88
|
+
* 12); an accepted one never enters a confidence-gated bulk set. The heuristic
|
|
89
|
+
* baseline never populates this (it accepts every declared FK).
|
|
90
|
+
*/
|
|
91
|
+
suppressedRelations: ConfirmedRelation[];
|
|
92
|
+
navGroups: NavGroupSuggestion[];
|
|
93
|
+
dashboards: DashboardSuggestion[];
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,SAAS,EACT,kBAAkB,EAClB,aAAa,EACd,MAAM,sBAAsB,CAAC;AAE9B;;;;;;GAMG;AACH,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAItD,eAAO,MAAM,YAAY,qFAMf,CAAC;AAEX,eAAO,MAAM,gBAAgB;;;;;;EAAuB,CAAC;AACrD,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAI1D;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,wHASnB,CAAC;AAEX,eAAO,MAAM,kBAAkB;;;;;;;;;EAA2B,CAAC;AAC3D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,iFAAiF;AACjF,eAAO,MAAM,yBAAyB,kEAKM,CAAC;AAE7C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAEjE;AAID,2FAA2F;AAC3F,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3C,WAAW,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACrF,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,OAAO,EAAE,MAAM,CACb,MAAM,EACN;QACE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;QAC3C,WAAW,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;QAClD,GAAG,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;KAC5B,CACF,CAAC;IACF,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,WAAW,GAAG,KAAK,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACxC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACtC,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC;;;;;;OAMG;IACH,mBAAmB,EAAE,iBAAiB,EAAE,CAAC;IACzC,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,UAAU,EAAE,mBAAmB,EAAE,CAAC;CACnC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared `@adminium/llm` contract types (06-llm-assist.md §2, §7.1): the
|
|
3
|
+
* normalized `EnrichmentSet` both paths reduce to, the provider identifiers, and
|
|
4
|
+
* the run status machine.
|
|
5
|
+
*
|
|
6
|
+
* Browser-safe: this module imports only pure-Zod / pure-TS types. The engine
|
|
7
|
+
* reference is a type-only re-export (erased at build time) so no DB-driver code
|
|
8
|
+
* can reach `@adminium/dashboard` through here.
|
|
9
|
+
*/
|
|
10
|
+
import { z } from 'zod';
|
|
11
|
+
// ─── Provider identity (§3.1) ────────────────────────────────────────────────
|
|
12
|
+
export const PROVIDER_IDS = [
|
|
13
|
+
'anthropic',
|
|
14
|
+
'openai',
|
|
15
|
+
'openai-compatible',
|
|
16
|
+
'ollama',
|
|
17
|
+
'adminium-managed',
|
|
18
|
+
];
|
|
19
|
+
export const providerIdSchema = z.enum(PROVIDER_IDS);
|
|
20
|
+
// ─── Run status machine (§7.4) ───────────────────────────────────────────────
|
|
21
|
+
/**
|
|
22
|
+
* `adminium_llm_runs.status` states. Transitions (§7.4):
|
|
23
|
+
* draft → running | awaiting_response
|
|
24
|
+
* running | awaiting_response → validated | failed | discarded
|
|
25
|
+
* validated → applied | partially_applied | discarded
|
|
26
|
+
* applied | partially_applied | failed | discarded → (terminal)
|
|
27
|
+
*/
|
|
28
|
+
export const LLM_RUN_STATUSES = [
|
|
29
|
+
'draft',
|
|
30
|
+
'running',
|
|
31
|
+
'awaiting_response',
|
|
32
|
+
'validated',
|
|
33
|
+
'applied',
|
|
34
|
+
'partially_applied',
|
|
35
|
+
'failed',
|
|
36
|
+
'discarded',
|
|
37
|
+
];
|
|
38
|
+
export const llmRunStatusSchema = z.enum(LLM_RUN_STATUSES);
|
|
39
|
+
/** States a run can never leave (§7.4: "Runs are immutable after `applied`"). */
|
|
40
|
+
export const TERMINAL_LLM_RUN_STATUSES = [
|
|
41
|
+
'applied',
|
|
42
|
+
'partially_applied',
|
|
43
|
+
'failed',
|
|
44
|
+
'discarded',
|
|
45
|
+
];
|
|
46
|
+
export function isTerminalRunStatus(status) {
|
|
47
|
+
return TERMINAL_LLM_RUN_STATUSES.includes(status);
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAsBxB,gFAAgF;AAEhF,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,WAAW;IACX,QAAQ;IACR,mBAAmB;IACnB,QAAQ;IACR,kBAAkB;CACV,CAAC;AAEX,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAGrD,gFAAgF;AAEhF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,OAAO;IACP,SAAS;IACT,mBAAmB;IACnB,WAAW;IACX,SAAS;IACT,mBAAmB;IACnB,QAAQ;IACR,WAAW;CACH,CAAC;AAEX,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAG3D,iFAAiF;AACjF,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,SAAS;IACT,mBAAmB;IACnB,QAAQ;IACR,WAAW;CAC+B,CAAC;AAE7C,MAAM,UAAU,mBAAmB,CAAC,MAAoB;IACtD,OAAQ,yBAAqD,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACjF,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@adminiumjs/llm",
|
|
3
|
+
"version": "0.1.0-rc.1",
|
|
4
|
+
"license": "AGPL-3.0-only",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/MoSofi/Adminium.git",
|
|
8
|
+
"directory": "packages/llm"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://adminium.dev",
|
|
11
|
+
"bugs": "https://github.com/MoSofi/Adminium/issues",
|
|
12
|
+
"type": "module",
|
|
13
|
+
"description": "LLM assist: provider clients, prompt builder, BYO round-trip",
|
|
14
|
+
"main": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"default": "./dist/index.js"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@adminium/engine": "npm:@adminiumjs/engine@0.1.0-rc.1",
|
|
24
|
+
"@adminium/widgets": "npm:@adminiumjs/widgets@0.1.0-rc.1",
|
|
25
|
+
"zod": "^4.4.3"
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"dist"
|
|
29
|
+
]
|
|
30
|
+
}
|