@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.
@@ -1 +1 @@
1
- {"version":3,"file":"dql-agent-provider.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/dql-agent-provider.ts"],"names":[],"mappings":"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"}
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
- return denied('compile_and_run_dql', reason);
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
- return denied('validate_and_run_sql', reason);
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: unresolved[0], admitted };
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
- maxProviderDispatches: limits?.maxProviderDispatches ?? (state.turnClass === 'research' ? 12 : state.turnClass === 'analytics' || state.turnClass === 'prior_result' ? 10 : 2),
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
- : 'DQL could not complete a safe analytical tool path from the current metadata snapshot.';
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();