@duckcodeailabs/dql-cli 1.12.8 → 1.12.9
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/dist/assets/dql-notebook/assets/{AgentAnswerCard-D1VcQOTJ.js → AgentAnswerCard-DbI0CAsX.js} +1 -1
- package/dist/assets/dql-notebook/assets/{AgentLogPage-DKvtW4Fq.js → AgentLogPage-BbMhuJps.js} +1 -1
- package/dist/assets/dql-notebook/assets/{AiBuildDialog-apJ4HoK3.js → AiBuildDialog-DNgkam6H.js} +1 -1
- package/dist/assets/dql-notebook/assets/{AiBuildResult-CvNitmsw.js → AiBuildResult-BuTao779.js} +1 -1
- package/dist/assets/dql-notebook/assets/{AiSidePanel-B2cqbPJr.js → AiSidePanel-D-EhCOEd.js} +1 -1
- package/dist/assets/dql-notebook/assets/{AnalyticsHome-D5I-Okbz.js → AnalyticsHome-BTjkolBn.js} +1 -1
- package/dist/assets/dql-notebook/assets/{AppsView-DLtjogVz.js → AppsView-B3jlWoNm.js} +3 -3
- package/dist/assets/dql-notebook/assets/{BlockStudio-BmNsIfNK.js → BlockStudio-DTFHMR3y.js} +1 -1
- package/dist/assets/dql-notebook/assets/{BusinessArtifactView-Bvn5X8uW.js → BusinessArtifactView-DGiHB7OS.js} +1 -1
- package/dist/assets/dql-notebook/assets/{DbtFirstModelingPage-DnpVGZJv.js → DbtFirstModelingPage-D-fv_dS2.js} +1 -1
- package/dist/assets/dql-notebook/assets/{GitPage-C_5u2aCj.js → GitPage-BWzPKyws.js} +1 -1
- package/dist/assets/dql-notebook/assets/{GlobalAiRail-ZOHo4H6j.js → GlobalAiRail-CGvBUci2.js} +1 -1
- package/dist/assets/dql-notebook/assets/{GovernedContextPage-CUaYIqfd.js → GovernedContextPage-CxkrtqyP.js} +1 -1
- package/dist/assets/dql-notebook/assets/{HelpDocsPage-6SmmBvJh.js → HelpDocsPage-C7IX_7xh.js} +1 -1
- package/dist/assets/dql-notebook/assets/{HomePage-LDu8z_nW.js → HomePage-e0CObjOb.js} +1 -1
- package/dist/assets/dql-notebook/assets/{LineageDAG-VFSCvevO.js → LineageDAG-DV6T_0ha.js} +1 -1
- package/dist/assets/dql-notebook/assets/{LineageDetailView-CuGG_JDv.js → LineageDetailView-ZVJiCqua.js} +1 -1
- package/dist/assets/dql-notebook/assets/{LineageDrawer-B2SVsEw1.js → LineageDrawer-DQdzGIoL.js} +1 -1
- package/dist/assets/dql-notebook/assets/{LineagePathBreadcrumb-qWhGM3bh.js → LineagePathBreadcrumb-6gFsnWlN.js} +1 -1
- package/dist/assets/dql-notebook/assets/{MiniLineageGraph-BHxUFWDi.js → MiniLineageGraph-BlJYiAY0.js} +1 -1
- package/dist/assets/dql-notebook/assets/{NewBlockModal-oo3fU5OW.js → NewBlockModal-DaxBAFLu.js} +1 -1
- package/dist/assets/dql-notebook/assets/{NewNotebookModal-Bl78Nnjz.js → NewNotebookModal-B7GPLsYc.js} +1 -1
- package/dist/assets/dql-notebook/assets/NotebookEditor-RuxFQnQC.js +202 -0
- package/dist/assets/dql-notebook/assets/{ReadinessPage-CL2EJLKo.js → ReadinessPage-m8jlEKzQ.js} +1 -1
- package/dist/assets/dql-notebook/assets/{SetupOnboarding-Cqw2NuAn.js → SetupOnboarding-ClldPV4C.js} +1 -1
- package/dist/assets/dql-notebook/assets/{TrustBadge-C4jIUuEE.js → TrustBadge-C0FyL1ZO.js} +1 -1
- package/dist/assets/dql-notebook/assets/{UnifiedAgentRunPanel-CZjUHLl5.js → UnifiedAgentRunPanel-Bd1qmRFx.js} +1 -1
- package/dist/assets/dql-notebook/assets/{answer-to-notebook-mhY-MBsX.js → answer-to-notebook-CgVDBH0o.js} +1 -1
- package/dist/assets/dql-notebook/assets/{arrow-left-CwMW-Dnz.js → arrow-left-XTRkwgdW.js} +1 -1
- package/dist/assets/dql-notebook/assets/{arrow-right-CJ_6d0z7.js → arrow-right-BUYb7B8y.js} +1 -1
- package/dist/assets/dql-notebook/assets/{book-open-text-B2q44mou.js → book-open-text-CQHKAXcN.js} +1 -1
- package/dist/assets/dql-notebook/assets/{bot-CbsSLtXR.js → bot-D9ODKCwi.js} +1 -1
- package/dist/assets/dql-notebook/assets/{chevron-up-DSMkEFrK.js → chevron-up-BR57nCns.js} +1 -1
- package/dist/assets/dql-notebook/assets/{circle-x-C5hi2hCq.js → circle-x-B3MKf4hs.js} +1 -1
- package/dist/assets/dql-notebook/assets/{dagre.esm-BT65gOyC.js → dagre.esm-BWViOEog.js} +1 -1
- package/dist/assets/dql-notebook/assets/{external-link-sDmXu1pG.js → external-link-D2rxGhQ_.js} +1 -1
- package/dist/assets/dql-notebook/assets/{grip-vertical-Ca_E_fRZ.js → grip-vertical-Bzs7bIWP.js} +1 -1
- package/dist/assets/dql-notebook/assets/{index-CcZ8Dw84.js → index-CDpukm0G.js} +2 -2
- package/dist/assets/dql-notebook/assets/{link-2-DaVaJfdX.js → link-2-D6nW0_qQ.js} +1 -1
- package/dist/assets/dql-notebook/assets/{list-tree-DMGqPCsV.js → list-tree-MH5kYamM.js} +1 -1
- package/dist/assets/dql-notebook/assets/{maximize-2-CVJP65sF.js → maximize-2-C3bEmsdA.js} +1 -1
- package/dist/assets/dql-notebook/assets/{minimize-2-BnsbPUr5.js → minimize-2-cji4jKmJ.js} +1 -1
- package/dist/assets/dql-notebook/assets/{panel-right-open-BTTos1w4.js → panel-right-open-T-_o8FS9.js} +1 -1
- package/dist/assets/dql-notebook/assets/{pencil-BDR0kEX-.js → pencil-BzJ_vZuL.js} +1 -1
- package/dist/assets/dql-notebook/assets/{rotate-ccw-DrQw5ZrW.js → rotate-ccw-CqSfrg2J.js} +1 -1
- package/dist/assets/dql-notebook/assets/{semantic-fields-CgqeBot0.js → semantic-fields-BXNCrm72.js} +1 -1
- package/dist/assets/dql-notebook/assets/{star-DBVkbHOE.js → star-C22MG8pV.js} +1 -1
- package/dist/assets/dql-notebook/assets/{triangle-alert-_FtKJhjm.js → triangle-alert-BtoT0VL-.js} +1 -1
- package/dist/assets/dql-notebook/assets/{usePersistedAgentThreadId-BG1TZXp_.js → usePersistedAgentThreadId-BL9P0gFB.js} +1 -1
- package/dist/assets/dql-notebook/assets/{user-round-DkUToep7.js → user-round-CpifcAyh.js} +1 -1
- package/dist/assets/dql-notebook/assets/{wand-sparkles-TgacCrJg.js → wand-sparkles-BiOywrQh.js} +1 -1
- package/dist/assets/dql-notebook/assets/{workflow-z-B8gUF9.js → workflow-DDvVMZ2B.js} +1 -1
- package/dist/assets/dql-notebook/assets/{wrench-CgXGBYJ-.js → wrench-CoKg2kyO.js} +1 -1
- package/dist/assets/dql-notebook/assets/{x-FQc3jbQ8.js → x-CCmr0LQ8.js} +1 -1
- package/dist/assets/dql-notebook/index.html +1 -1
- package/dist/local-runtime.d.ts +21 -0
- package/dist/local-runtime.d.ts.map +1 -1
- package/dist/local-runtime.js +87 -6
- package/dist/local-runtime.js.map +1 -1
- package/dist/package.json +10 -10
- package/package.json +10 -10
- package/dist/assets/dql-notebook/assets/NotebookEditor-BWMX6Xfi.js +0 -202
package/dist/local-runtime.js
CHANGED
|
@@ -21,7 +21,7 @@ import { fetchLatestPublishedDqlVersion, resolveDqlRuntimeVersionStatus } from '
|
|
|
21
21
|
import { resolveRetrievalHealthStatus } from './retrieval-health.js';
|
|
22
22
|
import { createDqlAgentProviderRunner, resolveAgentFollowUpContext } from './llm/providers/dql-agent-provider.js';
|
|
23
23
|
import { listRemoteMcpSettings, saveRemoteMcpSettings } from './llm/mcp-config.js';
|
|
24
|
-
import { ClaudeProvider, ConversationStore, advanceThreadState, buildConversationSnapshot, conversationHistoryFromContext, recallRelevantTurns, renderConversationEnvelopeForPrompt, GeminiProvider, MemoryStore, OllamaProvider, OpenAIProvider, buildBlockBusinessFingerprint, buildBlockSqlFingerprints, buildAnalysisQuestionPlan, composeSemanticQueryForQuestion, aggregationIntegrityIssuesForSql, buildLocalContextPack, applyContextPackCompatibility, toAgentRetrievalEvidence, prepareConversationPath, defaultMemoryPath, ensureDefaultMemoryFiles, ensureAgentProjectReady, isAgentProjectIndexReady, currentMetadataFingerprint, ensureMetadataCatalogFresh, readIndexedDomainKnowledge, readIndexedKnowledge360, compactSemanticRuntimeFailure, classifyAnalyticalFailure, propose, proposePlan, recordGovernedCorrection, HintStore, defaultHintIndexPath, ensureHintIndexFresh, listHintsFromGit, getHintEvaluationFromGit, getCorrectionTraceFromGit, inspectGovernedHint, editGovernedHintCandidate, reopenGovernedHint, retireHint, supersedeHint, hintsConflict, mineJoinPatterns, reviewGovernedHint, AgentRunEngine, SqliteAgentRunStore, defaultAgentRunGates, createLlmAgentRunPlanner, createHybridRouter, computeResultStats, buildDeterministicDashboardStory, synthesizeAnswer, streamOrGenerate, narrateResult, buildProposePreview, buildFromPrompt, internalRelationIdsInSql, defaultAgentRunStorePath, defaultAgentRunSqlitePath, resolveLocalOwner, resolveProposeConfig, recordQueryRun, recordRuntimeSchemaSnapshot, latestRuntimeSchemaSnapshotForProject, loadSkills, migrateLegacySkills, configuredSkillsPath, skillsDir, draftDomainSkillBootstrap, buildDomainSkillBootstrapPrompt, mergeDomainSkillBootstrapEnrichment, writeSkill, deleteSkill, deriveGeneratedDraftSlug, deriveAnalyticalRepair, reindexProject, invalidateAgentProjectState, recordAgentRuntimeVersion, resolveDomainContextEnvelope, projectEmbeddingProvider, isHashedEmbeddingProvider, clearProjectEmbeddingCache, upgradeVectorIndexForProject, openMetadataCatalog, defaultKgPath, planAppFromPrompt, KGStore, planResearch, loadSemanticMetrics, cascadeTraceToEvidenceRouteSteps, createCascadeAnswerResult, createCascadeTrace, routeReasoningEffort, routeForCascadeAnswerTier, clampReasoningEffort, bumpReasoningEffort, resolveThinkingMode, coerceThinkingMode, upsertGeneratedDqlArtifactDraft, loadAgentSemanticLayer, isTrustedConversationTurn, analyticalError, withAnalyticalErrorOrigin, withAnalyticalErrorOriginSync, } from '@duckcodeailabs/dql-agent';
|
|
24
|
+
import { ClaudeProvider, ConversationStore, advanceThreadState, buildConversationSnapshot, conversationHistoryFromContext, recallRelevantTurns, renderConversationEnvelopeForPrompt, GeminiProvider, MemoryStore, OllamaProvider, OpenAIProvider, buildBlockBusinessFingerprint, buildBlockSqlFingerprints, buildAnalysisQuestionPlan, composeSemanticQueryForQuestion, aggregationIntegrityIssuesForSql, buildLocalContextPack, applyContextPackCompatibility, toAgentRetrievalEvidence, prepareConversationPath, defaultMemoryPath, ensureDefaultMemoryFiles, ensureAgentProjectReady, isAgentProjectIndexReady, currentMetadataFingerprint, ensureMetadataCatalogFresh, readIndexedDomainKnowledge, readIndexedKnowledge360, compactSemanticRuntimeFailure, classifyAnalyticalFailure, propose, proposePlan, recordGovernedCorrection, HintStore, defaultHintIndexPath, ensureHintIndexFresh, listHintsFromGit, getHintEvaluationFromGit, getCorrectionTraceFromGit, inspectGovernedHint, editGovernedHintCandidate, reopenGovernedHint, retireHint, supersedeHint, hintsConflict, mineJoinPatterns, reviewGovernedHint, AgentRunEngine, SqliteAgentRunStore, defaultAgentRunGates, createLlmAgentRunPlanner, createHybridRouter, computeResultStats, buildDeterministicDashboardStory, synthesizeAnswer, streamOrGenerate, narrateResult, buildProposePreview, buildFromPrompt, internalRelationIdsInSql, defaultAgentRunStorePath, defaultAgentRunSqlitePath, resolveLocalOwner, resolveProposeConfig, recordQueryRun, recordRuntimeSchemaSnapshot, latestRuntimeSchemaSnapshotForProject, loadSkills, migrateLegacySkills, configuredSkillsPath, skillsDir, draftDomainSkillBootstrap, buildDomainSkillBootstrapPrompt, mergeDomainSkillBootstrapEnrichment, writeSkill, deleteSkill, deriveGeneratedDraftSlug, deriveAnalyticalRepair, reindexProject, invalidateAgentProjectState, recordAgentRuntimeVersion, resolveDomainContextEnvelope, projectEmbeddingProvider, isHashedEmbeddingProvider, clearProjectEmbeddingCache, upgradeVectorIndexForProject, openMetadataCatalog, defaultKgPath, planAppFromPrompt, KGStore, planResearch, loadSemanticMetrics, cascadeTraceToEvidenceRouteSteps, createCascadeAnswerResult, createCascadeTrace, routeReasoningEffort, routeForCascadeAnswerTier, clampReasoningEffort, bumpReasoningEffort, resolveThinkingMode, coerceThinkingMode, upsertGeneratedDqlArtifactDraft, loadAgentSemanticLayer, isTrustedConversationTurn, resolveInternalRelationIds, analyticalError, withAnalyticalErrorOrigin, withAnalyticalErrorOriginSync, } from '@duckcodeailabs/dql-agent';
|
|
25
25
|
import { addSqlResultFilter, filterableResultColumns, replaceBlockStudioSql } from './sql-result-filter.js';
|
|
26
26
|
import { gatherProposeEnrichment } from './propose-enrich.js';
|
|
27
27
|
import { handleAppsApi, proposeAppAiBuild, recommendVisualization } from './apps-api.js';
|
|
@@ -12917,10 +12917,26 @@ export async function startLocalServer(opts) {
|
|
|
12917
12917
|
res.end(serializeJSON({ cellType: cell.type, result: null }));
|
|
12918
12918
|
return;
|
|
12919
12919
|
}
|
|
12920
|
-
|
|
12920
|
+
// DECODE, THEN VALIDATE. A leaked `source::db.schema.table` is an internal
|
|
12921
|
+
// retrieval key whose suffix IS the physical relation, so rejecting the
|
|
12922
|
+
// cell and asking the user (or another AI round trip) to repair it was
|
|
12923
|
+
// busywork for a mechanical substitution. Anything still unresolvable
|
|
12924
|
+
// after this — a BARE `source::orders`, which names no database or
|
|
12925
|
+
// schema — genuinely cannot be decoded and still fails here.
|
|
12926
|
+
let decodedSql = resolveInternalRelationIds(executableSql, EMPTY_SCHEMA_GROUNDING);
|
|
12927
|
+
let bareResolution = null;
|
|
12928
|
+
if (internalDqlRelationIdValidationError(decodedSql, 'x')) {
|
|
12929
|
+
bareResolution = await resolveBareInternalRelationIds(decodedSql, executor, cellConnection);
|
|
12930
|
+
decodedSql = bareResolution.sql;
|
|
12931
|
+
}
|
|
12932
|
+
const internalRelationError = internalDqlRelationIdValidationError(decodedSql, cell.type === 'dql' ? 'DQL query' : 'Notebook query',
|
|
12933
|
+
// A probe that came back empty is PROOF the relation is not visible
|
|
12934
|
+
// to this connection, so the refusal states that instead of sending
|
|
12935
|
+
// the user to an AI repair that cannot conjure a missing table.
|
|
12936
|
+
bareResolution ? { probed: true, ambiguous: bareResolution.ambiguous } : undefined);
|
|
12921
12937
|
if (internalRelationError)
|
|
12922
12938
|
throw new DqlInternalRelationIdError(internalRelationError);
|
|
12923
|
-
const prepared = prepareLocalExecution(
|
|
12939
|
+
const prepared = prepareLocalExecution(decodedSql, cellConnection, projectRoot, projectConfig);
|
|
12924
12940
|
const app = loadRuntimeApp(projectRoot, typeof body.appId === 'string' ? body.appId : activePersonaAppId());
|
|
12925
12941
|
assertAppAccess({ app, domain: resolved.domain ?? app?.domain, level: 'execute' });
|
|
12926
12942
|
const semanticExecution = semanticCompose?.compiled
|
|
@@ -12980,7 +12996,10 @@ export async function startLocalServer(opts) {
|
|
|
12980
12996
|
tests: plan?.tests,
|
|
12981
12997
|
result: normalized,
|
|
12982
12998
|
executionTarget: executionTargetDescriptor(body),
|
|
12983
|
-
|
|
12999
|
+
// Report the statement that ACTUALLY ran. `executableSql` is the
|
|
13000
|
+
// pre-decode text, so showing it would put a `source::` identity in
|
|
13001
|
+
// front of the user that the warehouse never saw.
|
|
13002
|
+
compiledSql: semanticCompose?.compiled?.sql ?? decodedSql,
|
|
12984
13003
|
engine: semanticCompose?.compiled?.engine,
|
|
12985
13004
|
...(semanticExecution ? {
|
|
12986
13005
|
semanticTrace: semanticExecution.semanticTrace,
|
|
@@ -15667,6 +15686,8 @@ const AGENT_PREVIEW_FORBIDDEN_SQL = [
|
|
|
15667
15686
|
function withAnalyticalCompilationOrigin(stage, fn) {
|
|
15668
15687
|
return withAnalyticalErrorOriginSync({ origin: 'dql_compilation', stage }, fn);
|
|
15669
15688
|
}
|
|
15689
|
+
/** No dbt grounding — decoding an internal id needs none for a qualified suffix. */
|
|
15690
|
+
const EMPTY_SCHEMA_GROUNDING = { tables: [], joinKeys: [], byKey: new Map() };
|
|
15670
15691
|
export function clampAnalyticalRowBound(rowLimit) {
|
|
15671
15692
|
return Number.isFinite(rowLimit) ? Math.max(1, Math.min(10_000, Math.floor(rowLimit))) : 200;
|
|
15672
15693
|
}
|
|
@@ -16155,11 +16176,19 @@ function readOnlySqlValidationError(sql, subject, dialect = 'duckdb') {
|
|
|
16155
16176
|
}
|
|
16156
16177
|
return null;
|
|
16157
16178
|
}
|
|
16158
|
-
function internalDqlRelationIdValidationError(sql, subject) {
|
|
16179
|
+
function internalDqlRelationIdValidationError(sql, subject, probe) {
|
|
16159
16180
|
const internalIds = internalRelationIdsInSql(stripSqlStringsAndComments(sql));
|
|
16160
16181
|
if (internalIds.length === 0)
|
|
16161
16182
|
return null;
|
|
16162
|
-
|
|
16183
|
+
const plural = internalIds.length === 1 ? '' : 's';
|
|
16184
|
+
const head = `${subject} contains internal DQL graph relation identifier${plural} ${internalIds.join(', ')}.`;
|
|
16185
|
+
if (probe?.ambiguous.length) {
|
|
16186
|
+
return `${head} ${probe.ambiguous.join(', ')} matched more than one schema in this connection, so the name alone does not identify a relation. Qualify it as database.schema.table.`;
|
|
16187
|
+
}
|
|
16188
|
+
if (probe?.probed) {
|
|
16189
|
+
return `${head} DQL checked this connection and no relation with that name is visible to it. Qualify it as database.schema.table, or connect to the source that holds it.`;
|
|
16190
|
+
}
|
|
16191
|
+
return `${head} Use the physical database.schema.table relation instead, or choose Ask AI to fix from the notebook error.`;
|
|
16163
16192
|
}
|
|
16164
16193
|
function parseHintLessonInput(value) {
|
|
16165
16194
|
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
@@ -23303,6 +23332,58 @@ ${predicates.map((predicate) => ` ${predicate}`).join(' OR\n')}
|
|
|
23303
23332
|
ORDER BY table_schema, table_name, ordinal_position
|
|
23304
23333
|
LIMIT 400`;
|
|
23305
23334
|
}
|
|
23335
|
+
/**
|
|
23336
|
+
* Resolve a BARE internal graph identity (`source::orders` — a name with no
|
|
23337
|
+
* database or schema) against the warehouse.
|
|
23338
|
+
*
|
|
23339
|
+
* A qualified identity decodes mechanically, but a bare one carries no
|
|
23340
|
+
* location, so the old behaviour was to reject the cell and hand the user an
|
|
23341
|
+
* "Ask AI to fix" button. That was an LLM round trip for a lookup: the name is
|
|
23342
|
+
* unambiguous whenever exactly one relation in the connection answers to it.
|
|
23343
|
+
* Probe for it, and only refuse when the answer is genuinely zero or many —
|
|
23344
|
+
* at which point the refusal can say which it was.
|
|
23345
|
+
*
|
|
23346
|
+
* Runs ONLY after a decode has already failed, so the happy path pays nothing.
|
|
23347
|
+
*/
|
|
23348
|
+
export async function resolveBareInternalRelationIds(sql, executor, connection) {
|
|
23349
|
+
const bare = internalRelationIdsInSql(stripSqlStringsAndComments(sql))
|
|
23350
|
+
.filter((id) => !id.slice(id.indexOf('::') + 2).includes('.'));
|
|
23351
|
+
if (bare.length === 0)
|
|
23352
|
+
return { sql, resolved: [], ambiguous: [] };
|
|
23353
|
+
const names = bare.map((id) => id.slice(id.indexOf('::') + 2));
|
|
23354
|
+
const probeSql = buildNamedRelationProbeSql(names);
|
|
23355
|
+
if (!probeSql)
|
|
23356
|
+
return { sql, resolved: [], ambiguous: [] };
|
|
23357
|
+
let rows = [];
|
|
23358
|
+
try {
|
|
23359
|
+
const probe = await executor.executeQuery(probeSql, [], {}, connection);
|
|
23360
|
+
rows = (probe?.rows ?? []);
|
|
23361
|
+
}
|
|
23362
|
+
catch {
|
|
23363
|
+
// The probe is best-effort. A warehouse that cannot answer it leaves the
|
|
23364
|
+
// identity unresolved, which is the same outcome as not probing at all.
|
|
23365
|
+
return { sql, resolved: [], ambiguous: [] };
|
|
23366
|
+
}
|
|
23367
|
+
const resolved = [];
|
|
23368
|
+
const ambiguous = [];
|
|
23369
|
+
let out = sql;
|
|
23370
|
+
for (const id of bare) {
|
|
23371
|
+
const name = id.slice(id.indexOf('::') + 2).toLowerCase();
|
|
23372
|
+
const matches = new Set(rows
|
|
23373
|
+
.filter((row) => String(row.table_name ?? '').toLowerCase() === name)
|
|
23374
|
+
.map((row) => `${String(row.table_schema ?? '')}.${String(row.table_name ?? '')}`));
|
|
23375
|
+
if (matches.size !== 1) {
|
|
23376
|
+
if (matches.size > 1)
|
|
23377
|
+
ambiguous.push(id);
|
|
23378
|
+
continue;
|
|
23379
|
+
}
|
|
23380
|
+
const target = [...matches][0];
|
|
23381
|
+
const idPattern = id.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
23382
|
+
out = out.replace(new RegExp(`\\b${idPattern}`, 'g'), target);
|
|
23383
|
+
resolved.push({ from: id, to: target });
|
|
23384
|
+
}
|
|
23385
|
+
return { sql: out, resolved, ambiguous };
|
|
23386
|
+
}
|
|
23306
23387
|
export function buildRuntimeSchemaSearchSql(question) {
|
|
23307
23388
|
const terms = Array.from(agentSchemaTokens(question))
|
|
23308
23389
|
.map((term) => term.toLowerCase().replace(/[^a-z0-9_]/g, ''))
|