can1357/oh-my-pi · error · OmpTypeError
merge requires an object schema
Error message
merge requires an object schema
What it means
Object-merging combinators (`merge` and related n-ary object operations) can only operate on schemas whose underlying IR is an object type. If any operand resolves to a non-object type (string, array, union, primitive), the operation is undefined and omptype throws.
Source
Thrown at packages/omptype/src/type.ts:3245
}
const ir: IR = members.length === 0 ? { k: "never" } : members.length === 1 ? members[0] : { k: "union", members };
return makeType(ir, [], {});
}
function buildAnd(definitions: readonly unknown[], resolve?: AliasResolver): InternalType;
function buildAnd<output, input>(definitions: readonly unknown[], resolve?: AliasResolver): FluentType<output, input>;
function buildAnd(definitions: readonly unknown[], resolve?: AliasResolver): InternalType {
if (definitions.length === 0) return makeType({ k: "unknown" }, [], {});
let ir = parseDef(definitions[0], resolve);
for (let index = 1; index < definitions.length; index++) {
ir = intersect(ir, parseDef(definitions[index], resolve));
}
return makeType(ir, [], {});
}
function requireNaryObject(ir: IR): ObjectIR {
const resolved = resolveAlias(ir);
if (resolved.k !== "object") throw new OmpTypeError("merge requires an object schema");
return resolved;
}
function buildMerge(definitions: readonly unknown[], resolve?: AliasResolver): InternalType;
function buildMerge<output, input>(definitions: readonly unknown[], resolve?: AliasResolver): FluentType<output, input>;
function buildMerge(definitions: readonly unknown[], resolve?: AliasResolver): InternalType {
if (definitions.length === 0) return makeType({ k: "anyobject" }, [], {});
let object = requireNaryObject(parseDef(definitions[0], resolve));
for (let index = 1; index < definitions.length; index++) {
object = mergeObjects(object, requireNaryObject(parseDef(definitions[index], resolve)));
}
return makeType(object, [], {});
}
function buildPipe(definitions: readonly unknown[], resolve?: AliasResolver): InternalType;
function buildPipe<output, input>(definitions: readonly unknown[], resolve?: AliasResolver): FluentType<output, input>;
function buildPipe(definitions: readonly unknown[], resolve?: AliasResolver): InternalType {
if (definitions.length === 0) return makeType({ k: "unknown" }, [], {});View on GitHub (pinned to 9690622007)
Solutions
- Ensure every argument to merge is an object-typed schema (`type({...})` with object literal definition or `type` object blocks).
- If an operand is a union of objects, merge the individual object members or pick one branch.
- Check aliases referenced in the merge resolve to object definitions.
Example fix
// before
type.merge({ a: "string" }, "string[]")
// after
type.merge({ a: "string" }, { b: "string[]" }) Defensive patterns
Strategy: validation
Validate before calling
const isObjectSchema = (t: unknown) => { try { return (t as { expression?: string }).expression !== undefined && typeof (t as { json?(): unknown }).json === 'function'; } catch { return false; } }; Type guard
const isMergeable = (t: unknown): boolean => { try { const r = (t as InternalType); return r.expression.startsWith('{'); } catch { return false; } }; Try / catch
try { const merged = type.merge(a, b); } catch (e) { if (e instanceof OmpTypeError && e.message.includes('merge requires an object schema')) logNonObjectOperand(); else throw e; } Prevention
- Only pass object-literal schemas to merge
- Resolve aliases used in merges to confirm they are object types
- Annotate schema constants with their kind so refactors to unions are caught early
When it happens
Trigger: Passing a non-object schema to `type.merge(...)` or a composed merge, e.g. `type.merge({ a: "string" }, "string[]")`, or merging an alias that resolves to a primitive/union.
Common situations: Merging schema constants where one was changed to a union or array during refactoring; passing a morph/mapped type whose resolved kind is not object; dynamically assembling schemas from config where one entry is a primitive validator.
Related errors
- anthropic-messages: ${data.summary}
- Schema contains a circular object graph — cannot enforce str
- Schema node has no type, combinator, or $ref — cannot enforc
- Validation failed for tool "${toolCall.name}":\n${errors}\n\
- ClinePass model catalog response is missing clinePass
AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31).
Data as JSON: /api/errors/a93228e2224d2e51.
Report an issue: GitHub.