@konneal/engine 0.2.61 → 0.2.63

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.
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  handleAsk
3
- } from "./chunk-4C3GYKAZ.js";
3
+ } from "./chunk-U2CNCNMG.js";
4
4
  import "./chunk-TPV5GPY2.js";
5
5
  import "./chunk-SPKPH54J.js";
6
6
  import "./chunk-A3QHHUN5.js";
7
7
  import "./chunk-LVZTWUVJ.js";
8
8
  import "./chunk-2PCUAJJO.js";
9
- import "./chunk-WNGEWG3J.js";
9
+ import "./chunk-D6CMIRMB.js";
10
10
  import "./chunk-3FYJM7LH.js";
11
11
  export {
12
12
  handleAsk
@@ -6,7 +6,7 @@ import {
6
6
  registerNote,
7
7
  registerTokens,
8
8
  searchRegister
9
- } from "./chunk-WNGEWG3J.js";
9
+ } from "./chunk-D6CMIRMB.js";
10
10
  import "./chunk-3FYJM7LH.js";
11
11
  export {
12
12
  buildRegisterQuery,
@@ -84,7 +84,7 @@ function buildRegisterQuery(tokens) {
84
84
  return `(holder LIKE ?${n} OR model LIKE ?${n} OR num LIKE ?${n})`;
85
85
  });
86
86
  return {
87
- sql: `SELECT num, family, holder, model, year, status, pdf_key FROM certificates WHERE ${clauses.join(" OR ")} LIMIT 6`,
87
+ sql: `SELECT num, family, holder, model, year, status, pdf_key FROM certificates WHERE family = ?FAMILY AND (${clauses.join(" OR ")}) LIMIT 6`,
88
88
  params
89
89
  };
90
90
  }
@@ -97,7 +97,7 @@ async function searchRegister(db, query, force = false) {
97
97
  const family = queryFamily(query);
98
98
  if (family) {
99
99
  sql = sql.replace(/\?(\d+)/g, (_, n) => `?${Number(n) + 1}`);
100
- sql = sql.replace(" WHERE ", " WHERE family = ?1 AND ");
100
+ sql = sql.replace("?FAMILY", "?1");
101
101
  params.unshift(family.replace(/^[A-Za-z]+/, ""));
102
102
  }
103
103
  try {
@@ -68,7 +68,7 @@ import {
68
68
  certificateLinks,
69
69
  registerNote,
70
70
  searchRegister
71
- } from "./chunk-WNGEWG3J.js";
71
+ } from "./chunk-D6CMIRMB.js";
72
72
  import {
73
73
  P
74
74
  } from "./chunk-3FYJM7LH.js";
@@ -1892,7 +1892,7 @@ async function runTool(db, call) {
1892
1892
  if (call.name !== "register_search") return null;
1893
1893
  const query = String(call.args?.query ?? "").trim().slice(0, 160);
1894
1894
  if (!query) return null;
1895
- const { searchRegister: searchRegister2, registerNote: registerNote2 } = await import("./certificates-VTQDOZX5.js");
1895
+ const { searchRegister: searchRegister2, registerNote: registerNote2 } = await import("./certificates-IQU7GQCJ.js");
1896
1896
  const reg = await searchRegister2(db, query, true);
1897
1897
  const output = reg?.rows?.length ? registerNote2(reg.rows) : `No certificate was found for "${query}" in the certificates database (the register snapshot). State this as the search's result, with the searched string visible.`;
1898
1898
  return { name: call.name, query, output };
@@ -2303,7 +2303,7 @@ async function handleAsk(env, ctx, req, tier, key) {
2303
2303
  const graphDocNumbers = await graphExpand(env, understanding);
2304
2304
  const eNote = await editionNote(env, understanding);
2305
2305
  let register = await searchRegister(env.DB, q.query);
2306
- if (withImage && !register?.rows?.length && /certificate|certified|certification/i.test(q.query)) {
2306
+ if (withImage && /certificate|certified|certification/i.test(q.query)) {
2307
2307
  const np = await extractNameplate(env.AI, MODELS.member, withImage);
2308
2308
  if (np?.manufacturer) {
2309
2309
  const bridged = await searchRegister(env.DB, nameplateRegisterQuery(np, q.query));
@@ -6,7 +6,7 @@ import {
6
6
  modelGroundingBlock,
7
7
  scoreFaithfulness,
8
8
  scoreJudge
9
- } from "../../chunk-4C3GYKAZ.js";
9
+ } from "../../chunk-U2CNCNMG.js";
10
10
  import {
11
11
  handleSearch
12
12
  } from "../../chunk-FLNX4O7C.js";
@@ -63,7 +63,7 @@ import {
63
63
  sha256Hex,
64
64
  today
65
65
  } from "../../chunk-2PCUAJJO.js";
66
- import "../../chunk-WNGEWG3J.js";
66
+ import "../../chunk-D6CMIRMB.js";
67
67
  import {
68
68
  P,
69
69
  setProfile
@@ -959,7 +959,7 @@ async function handleMcp(env, ctx, req, tier, key) {
959
959
  // stream:false forces the JSON lane (anon defaults to SSE)
960
960
  body: JSON.stringify({ ...args, stream: false })
961
961
  });
962
- const res = name === "ask" ? await (await import("../../ask-VWPVYMJY.js")).handleAsk(env, ctx, inner, tier, key) : await (await import("../../search-PBOODCMQ.js")).handleSearch(env, ctx, inner, tier, key);
962
+ const res = name === "ask" ? await (await import("../../ask-R442D7HU.js")).handleAsk(env, ctx, inner, tier, key) : await (await import("../../search-PBOODCMQ.js")).handleSearch(env, ctx, inner, tier, key);
963
963
  return res.json().catch(() => ({ error: { message: "tool transport failed", status: res.status } }));
964
964
  });
965
965
  if (out.ok && "accepted" in out) return new Response(null, { status: 202 });
package/package.json CHANGED
@@ -27,7 +27,7 @@
27
27
  "playwright": "^1.62.1",
28
28
  "yaml": "^2.9.1"
29
29
  },
30
- "version": "0.2.61",
30
+ "version": "0.2.63",
31
31
  "description": "The Konneal engine: the publisher-agnostic build pipeline and API plane for standards intelligence (retrieval, answer contract, verdicts, evaluation).",
32
32
  "license": "BSD-3-Clause",
33
33
  "type": "module",
@@ -624,9 +624,11 @@ let convEntities: Array<{ entity: string; kind: string }> = [];
624
624
  let register = await searchRegister(env.DB, q.query);
625
625
  // the nameplate bridge (TODO.new-era/6's image lane): a certificate
626
626
  // question WITH a photograph carries its manufacturer in the pixels —
627
- // one vision call extracts it, and those tokens re-query the register
628
- // so the answer cites the actual certificate rows
629
- if (withImage && !register?.rows?.length && /certificate|certified|certification/i.test(q.query)) {
627
+ // one vision call extracts it, and those tokens re-query the register.
628
+ // Fires whenever a photo is present: the text lane's tokens are the
629
+ // question's stopwords ("this", "have") and can match an unrelated
630
+ // holder, and the photograph's own reading is authoritative over them.
631
+ if (withImage && /certificate|certified|certification/i.test(q.query)) {
630
632
  const np = await extractNameplate((env as any).AI, MODELS.member, withImage);
631
633
  if (np?.manufacturer) {
632
634
  const bridged = await searchRegister(env.DB, nameplateRegisterQuery(np, q.query));
@@ -84,7 +84,7 @@ export function buildRegisterQuery(tokens: string[]): { sql: string; params: str
84
84
  return `(holder LIKE ?${n} OR model LIKE ?${n} OR num LIKE ?${n})`;
85
85
  });
86
86
  return {
87
- sql: `SELECT num, family, holder, model, year, status, pdf_key FROM certificates WHERE ${clauses.join(" OR ")} LIMIT 6`,
87
+ sql: `SELECT num, family, holder, model, year, status, pdf_key FROM certificates WHERE family = ?FAMILY AND (${clauses.join(" OR ")}) LIMIT 6`,
88
88
  params,
89
89
  };
90
90
  }
@@ -104,7 +104,7 @@ export async function searchRegister(db: any, query: string, force = false): Pro
104
104
  // the prepend shifts every token placeholder by one: renumber them,
105
105
  // or each token binds the family string and nothing matches
106
106
  sql = sql.replace(/\?(\d+)/g, (_, n) => `?${Number(n) + 1}`);
107
- sql = sql.replace(" WHERE ", " WHERE family = ?1 AND ");
107
+ sql = sql.replace("?FAMILY", "?1");
108
108
  params.unshift(family.replace(/^[A-Za-z]+/, ""));
109
109
  }
110
110
  try {