@duckcodeailabs/dql-cli 1.14.4 → 1.14.6
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/llm/providers/dql-agent-provider.d.ts.map +1 -1
- package/dist/llm/providers/dql-agent-provider.js +102 -8
- package/dist/llm/providers/dql-agent-provider.js.map +1 -1
- package/dist/llm/types.d.ts +2 -0
- package/dist/llm/types.d.ts.map +1 -1
- package/dist/local-runtime.d.ts.map +1 -1
- package/dist/local-runtime.js +62 -6
- package/dist/local-runtime.js.map +1 -1
- package/dist/metricflow.d.ts.map +1 -1
- package/dist/metricflow.js +8 -1
- package/dist/metricflow.js.map +1 -1
- package/dist/package.json +10 -10
- package/package.json +10 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dql-agent-provider.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/dql-agent-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAUL,KAAK,2BAA2B,EACjC,MAAM,2BAA2B,CAAC;AAInC,OAAO,EAoBL,KAAK,WAAW,EAEhB,KAAK,wBAAwB,EAE7B,KAAK,oBAAoB,EAIzB,KAAK,aAAa,EAGlB,KAAK,oBAAoB,EAEzB,KAAK,gBAAgB,EAoCrB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EAIpB,KAAK,6BAA6B,EAIlC,KAAK,+BAA+B,EACpC,KAAK,sBAAsB,EAE3B,KAAK,eAAe,EAErB,MAAM,2BAA2B,CAAC;AAkBnC,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAA4B,UAAU,EAAE,MAAM,aAAa,CAAC;AACtG,OAAO,EAAE,oBAAoB,EAAkC,MAAM,yBAAyB,CAAC;AAQ/F;;;;GAIG;AACH,KAAK,gBAAgB,GACjB,OAAO,CAAC,UAAU,EAAE,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,eAAe,CAAC,GACnF,aAAa,GACb,OAAO,CAAC;AAoFZ;;;;GAIG;AACH,iBAAS,0BAA0B,CAAC,KAAK,EAAE;IACzC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,2BAA2B,CAAC,OAAO,CAAC,CAAC;IAC5C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,2BAA2B,CA0B9B;AA2cD,KAAK,wBAAwB,GAAG,QAAQ,GAAG,WAAW,GAAG,gBAAgB,GAAG,kBAAkB,CAAC;AA8D/F;;;;;;;;;GASG;AACH,iBAAS,oCAAoC,CAAC,KAAK,EAAE;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,wBAAwB,CAAC;IAC/B,UAAU,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC9C,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,6BAA6B,CAAC,GAAG,SAAS,CAAC;CAC9E,GAAG,MAAM,GAAG,SAAS,CA0HrB;AAogBD;;;;;;;GAOG;AACH,iBAAS,sBAAsB,CAC7B,KAAK,EAAE,eAAe,EACtB,MAAM,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAAE,IAEpD,OAAO,eAAe,KAAG,OAAO,CAAC,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"dql-agent-provider.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/dql-agent-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1448,6 +1448,33 @@ function createAskV2LaneHandler(state, limits) {
|
|
|
1448
1448
|
...(relationshipPathIds.length ? { relationshipPathIds } : {}),
|
|
1449
1449
|
});
|
|
1450
1450
|
if (!allowed.ok) {
|
|
1451
|
+
// NEVER-DEAD-END CONCESSION. The progression rule exists to stop a
|
|
1452
|
+
// model from finishing without trying the executable tiers — but a
|
|
1453
|
+
// model that has inspected them and TWICE chosen to finish rather
|
|
1454
|
+
// than write exploratory SQL it cannot ground has made an honest
|
|
1455
|
+
// judgment (observed live: certified empty + semantic unavailable
|
|
1456
|
+
// on a 3,373-model repo; sonnet declined to invent Snowflake SQL
|
|
1457
|
+
// and the kernel burned the whole dispatch budget re-denying).
|
|
1458
|
+
// Concede on the SECOND identical denial: close the turn as a
|
|
1459
|
+
// typed gap. No SQL runs, no prose is trusted; the reader gets an
|
|
1460
|
+
// honest refusal in 3 dispatches instead of a timeout in 6.
|
|
1461
|
+
if (name === 'finish_answer'
|
|
1462
|
+
&& allowed.reasonCode === 'ASK_V2_TOOL_PROGRESSION_REQUIRED'
|
|
1463
|
+
&& !completed
|
|
1464
|
+
&& state.observations.some((observation) => observation.tool === 'finish_answer'
|
|
1465
|
+
&& observation.reasonCode === 'ASK_V2_TOOL_PROGRESSION_REQUIRED')) {
|
|
1466
|
+
observe('finish_answer', 'ineligible', 'ASK_V2_REMAINING_TIERS_DECLINED', {
|
|
1467
|
+
origin: 'agent_control',
|
|
1468
|
+
...(allowed.safeNextTools?.length ? { safeAction: `use:${allowed.safeNextTools.join(',')}` } : {}),
|
|
1469
|
+
});
|
|
1470
|
+
finishAskAgentV2Turn(state, {
|
|
1471
|
+
version: 2,
|
|
1472
|
+
kind: 'gap',
|
|
1473
|
+
reasonCode: 'ASK_V2_REMAINING_TIERS_DECLINED',
|
|
1474
|
+
origin: 'agent_control',
|
|
1475
|
+
});
|
|
1476
|
+
return { finished: true, conceded: true, reasonCode: 'ASK_V2_REMAINING_TIERS_DECLINED' };
|
|
1477
|
+
}
|
|
1451
1478
|
const clarificationPreFreeze = name === 'request_clarification'
|
|
1452
1479
|
&& (allowed.reasonCode === 'ASK_V2_CLARIFICATION_NOT_MATERIALLY_AMBIGUOUS'
|
|
1453
1480
|
|| allowed.reasonCode === 'ASK_V2_TOOL_PROGRESSION_REQUIRED');
|
|
@@ -2705,7 +2732,22 @@ function createAskV2LaneHandler(state, limits) {
|
|
|
2705
2732
|
? 'GOVERNED_RELATIONAL_IDENTIFIER_OR_PATH_NOT_ADMITTED'
|
|
2706
2733
|
: 'GOVERNED_RELATIONAL_EXECUTION_UNAVAILABLE';
|
|
2707
2734
|
observe('compile_and_run_dql', 'ineligible', reason, { tier: 'governed_relational', candidateIds: selectedCandidateIds, origin: 'validation' });
|
|
2708
|
-
|
|
2735
|
+
// A bare "not admitted" is unactionable — the model guessed wrong
|
|
2736
|
+
// IDs once and will guess again until the budget dies. Name the
|
|
2737
|
+
// admitted relational identifiers and path handles verbatim, the
|
|
2738
|
+
// same teaching contract the semantic tier's refusals carry.
|
|
2739
|
+
const admittedRelational = visibleCandidates()
|
|
2740
|
+
.filter(relationLike)
|
|
2741
|
+
.slice(0, 16)
|
|
2742
|
+
.map((candidate) => v2CandidateId(candidate));
|
|
2743
|
+
return {
|
|
2744
|
+
...denied('compile_and_run_dql', reason),
|
|
2745
|
+
...(reason === 'GOVERNED_RELATIONAL_IDENTIFIER_OR_PATH_NOT_ADMITTED' ? {
|
|
2746
|
+
admittedRelationalIds: admittedRelational,
|
|
2747
|
+
admittedRelationshipPathIds: state.relationshipPathHandles.slice(0, 8).map((path) => path.id),
|
|
2748
|
+
usage: 'Re-send compile_and_run_dql using measureIds/dimensionIds/expectedOutputIds from admittedRelationalIds verbatim and relationshipPathIds from admittedRelationshipPathIds. Invented identifiers are never admitted.',
|
|
2749
|
+
} : {}),
|
|
2750
|
+
};
|
|
2709
2751
|
}
|
|
2710
2752
|
// The local host mints a V2-only authorization before compiling the
|
|
2711
2753
|
// DQL program. This is the frozen boundary: the compiler and
|
|
@@ -2819,7 +2861,22 @@ function createAskV2LaneHandler(state, limits) {
|
|
|
2819
2861
|
if (!outputs || !validation.ok || (!v2Prepare && !legacyPrepare) || !input.executeAgenticGeneratedSql) {
|
|
2820
2862
|
const reason = !outputs ? 'EXPLORATORY_OUTPUT_IDENTIFIER_NOT_ADMITTED' : validation.ok ? 'EXPLORATORY_EXECUTION_CAPABILITY_UNAVAILABLE' : 'EXPLORATORY_SQL_VALIDATION_FAILED';
|
|
2821
2863
|
observe('validate_and_run_sql', 'ineligible', reason, { tier: 'exploratory_sql', candidateIds: outputIds, origin: 'validation' });
|
|
2822
|
-
|
|
2864
|
+
// Same teaching contract as the semantic/relational refusals: a
|
|
2865
|
+
// model told only "not admitted" guesses identifiers until the
|
|
2866
|
+
// budget dies. Name the admitted output IDs verbatim.
|
|
2867
|
+
const admittedOutputs = reason === 'EXPLORATORY_OUTPUT_IDENTIFIER_NOT_ADMITTED'
|
|
2868
|
+
? visibleCandidates().slice(0, 24).map((candidate) => v2CandidateId(candidate))
|
|
2869
|
+
: [];
|
|
2870
|
+
return {
|
|
2871
|
+
...denied('validate_and_run_sql', reason),
|
|
2872
|
+
...(admittedOutputs.length ? {
|
|
2873
|
+
admittedOutputIds: admittedOutputs,
|
|
2874
|
+
usage: 'Re-send validate_and_run_sql with expectedOutputIds drawn from admittedOutputIds verbatim; each must name a card your SQL actually selects.',
|
|
2875
|
+
} : {}),
|
|
2876
|
+
...(reason === 'EXPLORATORY_SQL_VALIDATION_FAILED' && !validation.ok && 'reason' in validation && validation.reason ? {
|
|
2877
|
+
usage: String(validation.reason).slice(0, 400),
|
|
2878
|
+
} : {}),
|
|
2879
|
+
};
|
|
2823
2880
|
}
|
|
2824
2881
|
try {
|
|
2825
2882
|
const selectedCandidateIds = [...new Set(outputIds)];
|
|
@@ -2999,7 +3056,7 @@ function createAskV2LaneHandler(state, limits) {
|
|
|
2999
3056
|
// simply that the user asked for a field this project has never modeled.
|
|
3000
3057
|
// "Not enough context" for an unmodeled term reads as a system failure;
|
|
3001
3058
|
// the truthful answer names the term and the governed alternatives.
|
|
3002
|
-
const requestedUnmodeledTerm = () => {
|
|
3059
|
+
const requestedUnmodeledTerm = async () => {
|
|
3003
3060
|
const plan = buildAnalysisQuestionPlan(input.question);
|
|
3004
3061
|
const requirements = buildAnalyticalRequirementSet({ question: input.question });
|
|
3005
3062
|
// A "dimension term" can actually be a member VALUE ("beverage
|
|
@@ -3018,6 +3075,9 @@ function createAskV2LaneHandler(state, limits) {
|
|
|
3018
3075
|
// A time noun is a grain served by any admitted time axis, not a
|
|
3019
3076
|
// field of its own; "by month" must never read as unmodeled.
|
|
3020
3077
|
&& !/^(?:day|week|month|quarter|year|season|period)s?$/i.test(term)
|
|
3078
|
+
// Generic request nouns ("the % DOD ACM value", "the revenue info")
|
|
3079
|
+
// name HOW the user wants the answer, not a field to resolve.
|
|
3080
|
+
&& !/^(?:value|info|information|detail|data|number|figure|result|stat|statistic|total|summary|breakdown)s?$/i.test(term)
|
|
3021
3081
|
// The lexical by-phrase extractor can emit run-together noise
|
|
3022
3082
|
// ("month_using_the_revenue_semantic_metric"). Only a clean one- or
|
|
3023
3083
|
// two-word business noun is a claim worth refusing over.
|
|
@@ -3048,10 +3108,31 @@ function createAskV2LaneHandler(state, limits) {
|
|
|
3048
3108
|
});
|
|
3049
3109
|
if (unresolved.length === 0)
|
|
3050
3110
|
return undefined;
|
|
3111
|
+
// Retention is a ranking, not the model: a term absent from the 80
|
|
3112
|
+
// retained cards can still be modeled a thousand times over in a large
|
|
3113
|
+
// catalog. Only the HOST's whole-catalog lookup may authorize a
|
|
3114
|
+
// "not modeled" claim; without that proof, no refusal.
|
|
3115
|
+
const catalogCheck = input.catalogTermMentioned;
|
|
3116
|
+
if (!catalogCheck)
|
|
3117
|
+
return undefined;
|
|
3118
|
+
let confirmed;
|
|
3119
|
+
for (const term of unresolved) {
|
|
3120
|
+
try {
|
|
3121
|
+
if (!(await catalogCheck(term))) {
|
|
3122
|
+
confirmed = term;
|
|
3123
|
+
break;
|
|
3124
|
+
}
|
|
3125
|
+
}
|
|
3126
|
+
catch {
|
|
3127
|
+
return undefined;
|
|
3128
|
+
}
|
|
3129
|
+
}
|
|
3130
|
+
if (!confirmed)
|
|
3131
|
+
return undefined;
|
|
3051
3132
|
const admitted = [...new Set(all
|
|
3052
3133
|
.filter((candidate) => v2SemanticCandidateMatchesRole(candidate, 'dimension'))
|
|
3053
3134
|
.map((candidate) => candidate.semanticRuntimeName ?? candidate.name))].slice(0, 6);
|
|
3054
|
-
return { term:
|
|
3135
|
+
return { term: confirmed, admitted };
|
|
3055
3136
|
};
|
|
3056
3137
|
const hostFirst = !state.exactCertifiedCandidateId
|
|
3057
3138
|
&& state.tierStates?.certified?.status !== 'complete'
|
|
@@ -3101,7 +3182,7 @@ function createAskV2LaneHandler(state, limits) {
|
|
|
3101
3182
|
// needed the term to resolve.
|
|
3102
3183
|
if (!state.terminalOutcome
|
|
3103
3184
|
&& (state.turnClass === 'analytics' || state.turnClass === 'prior_result' || state.turnClass === 'clarification_response')) {
|
|
3104
|
-
const unmodeled = requestedUnmodeledTerm();
|
|
3185
|
+
const unmodeled = await requestedUnmodeledTerm();
|
|
3105
3186
|
if (unmodeled) {
|
|
3106
3187
|
observeAskAgentV2Tool(state, {
|
|
3107
3188
|
version: 1,
|
|
@@ -3145,7 +3226,14 @@ function createAskV2LaneHandler(state, limits) {
|
|
|
3145
3226
|
// was shown "stopped at its own orchestration budget" instead of the
|
|
3146
3227
|
// rows DQL was holding. Ten matches the run-level ceiling so the two
|
|
3147
3228
|
// budgets cannot disagree about how much room the analyst really has.
|
|
3148
|
-
|
|
3229
|
+
// PHYSICAL sends, not logical round trips: a wrapper provider (the
|
|
3230
|
+
// claude-code/codex passthrough) spends TWO physical sends per
|
|
3231
|
+
// logical turn, so a cap of 10 gave those providers only five turns —
|
|
3232
|
+
// the cold big-repo discovery ladder alone costs five, leaving zero
|
|
3233
|
+
// room to apply a taught refusal. Sixteen restores eight logical
|
|
3234
|
+
// turns for wrappers; 1:1 text providers are still bounded by the
|
|
3235
|
+
// tool-call ceiling and the run deadline long before this guard.
|
|
3236
|
+
maxProviderDispatches: limits?.maxProviderDispatches ?? (state.turnClass === 'research' ? 12 : state.turnClass === 'analytics' || state.turnClass === 'prior_result' ? 24 : 4),
|
|
3149
3237
|
// The kernel owns current availability. Native transports evaluate it
|
|
3150
3238
|
// before each API tool declaration; text transports receive the same
|
|
3151
3239
|
// update after every observation. This reserves a final *LLM action*
|
|
@@ -3375,6 +3463,9 @@ function createAskV2LaneHandler(state, limits) {
|
|
|
3375
3463
|
askAgentV2Outcome: { version: 2, kind: 'finish_answer', reasonCode: contextualEvidenceBound ? 'ASK_V2_CONTEXTUAL_ANSWER' : 'ASK_V2_GENERAL_UNGROUNDED_ANSWER', origin: 'narration' },
|
|
3376
3464
|
};
|
|
3377
3465
|
}
|
|
3466
|
+
if (state.terminalOutcome?.reasonCode === 'ASK_V2_REMAINING_TIERS_DECLINED') {
|
|
3467
|
+
return askV2NoAnswer(input, 'gap', 'ASK_V2_REMAINING_TIERS_DECLINED', 'agent_control');
|
|
3468
|
+
}
|
|
3378
3469
|
const progress = kernel.toolPolicy();
|
|
3379
3470
|
if (progress.terminalActionToolNames?.length) {
|
|
3380
3471
|
observe('finish_answer', 'ineligible', 'ASK_V2_TOOL_PROGRESSION_REQUIRED', {
|
|
@@ -3383,7 +3474,7 @@ function createAskV2LaneHandler(state, limits) {
|
|
|
3383
3474
|
});
|
|
3384
3475
|
return askV2NoAnswer(input, 'gap', 'ASK_V2_TOOL_PROGRESSION_REQUIRED', 'agent_control');
|
|
3385
3476
|
}
|
|
3386
|
-
return askV2NoAnswer(input, 'gap', 'ASK_V2_NO_EXECUTABLE_TOOL_RESULT', 'tool', undefined, requestedUnmodeledTerm());
|
|
3477
|
+
return askV2NoAnswer(input, 'gap', 'ASK_V2_NO_EXECUTABLE_TOOL_RESULT', 'tool', undefined, await requestedUnmodeledTerm());
|
|
3387
3478
|
};
|
|
3388
3479
|
}
|
|
3389
3480
|
/**
|
|
@@ -3860,7 +3951,9 @@ function askV2NoAnswer(input, kind, reasonCode, origin, safeActionOverride, mode
|
|
|
3860
3951
|
: 'The selected governed query did not complete on the current connection. Review the connection and trace, then retry.'
|
|
3861
3952
|
: modelingGap
|
|
3862
3953
|
? `"${modelingGap.term}" is not modeled in this project's governed data, so no query can compute it.${modelingGap.admitted.length ? ` Governed groupings available: ${modelingGap.admitted.join(', ')}.` : ''} Ask with one of those instead, or model "${modelingGap.term}" and re-sync.`
|
|
3863
|
-
:
|
|
3954
|
+
: reasonCode === 'ASK_V2_REMAINING_TIERS_DECLINED'
|
|
3955
|
+
? 'No certified block or semantic metric covers this question, and the analyst declined to run unverified exploratory SQL against this snapshot. No query was executed. Use Research for a deeper investigation, certify a block for this question, or name the exact model/columns to query.'
|
|
3956
|
+
: 'DQL could not complete a safe analytical tool path from the current metadata snapshot.';
|
|
3864
3957
|
return {
|
|
3865
3958
|
kind: 'no_answer',
|
|
3866
3959
|
sourceTier: 'no_answer',
|
|
@@ -5727,6 +5820,7 @@ export function createDqlAgentProviderRunner(id, providerOverride) {
|
|
|
5727
5820
|
// SQL-boundary guard is needed because it can never execute a
|
|
5728
5821
|
// provider-authored query.
|
|
5729
5822
|
...(req.probeAllowlistedLiteral ? { probeAllowlistedLiteral: req.probeAllowlistedLiteral } : {}),
|
|
5823
|
+
...(req.catalogTermMentioned ? { catalogTermMentioned: req.catalogTermMentioned } : {}),
|
|
5730
5824
|
prepareExploratorySqlExecution: req.prepareExploratorySqlExecution
|
|
5731
5825
|
? async (sql, ...args) => {
|
|
5732
5826
|
guardSnapshot();
|