kibi-cli 2.36.0 → 2.39.0
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/cli-json-command.d.ts.map +1 -1
- package/dist/cli-json-command.js +4 -0
- package/dist/cli-operation-metadata.d.ts +1 -1
- package/dist/cli-operation-metadata.js +1 -1
- package/dist/cli-register-foundation.d.ts.map +1 -1
- package/dist/cli-register-foundation.js +2 -1
- package/dist/cli-register-maintenance.d.ts.map +1 -1
- package/dist/cli-register-maintenance.js +5 -0
- package/dist/cli-register-reporting.d.ts.map +1 -1
- package/dist/cli-register-reporting.js +1 -0
- package/dist/cli-validate.d.ts.map +1 -1
- package/dist/cli-validate.js +21 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +19 -1
- package/dist/commands/aggregated-checks.d.ts.map +1 -1
- package/dist/commands/aggregated-checks.js +89 -16
- package/dist/commands/coverage.d.ts +1 -0
- package/dist/commands/coverage.d.ts.map +1 -1
- package/dist/commands/coverage.js +40 -0
- package/dist/commands/doctor.d.ts +5 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +70 -35
- package/dist/commands/github-init.d.ts.map +1 -1
- package/dist/commands/github-init.js +4 -2
- package/dist/commands/hook-managers.d.ts +43 -0
- package/dist/commands/hook-managers.d.ts.map +1 -0
- package/dist/commands/hook-managers.js +426 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +40 -5
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +9 -3
- package/dist/commands/sync/persistence.d.ts.map +1 -1
- package/dist/commands/sync/persistence.js +49 -1
- package/dist/commands/telemetry.d.ts +7 -0
- package/dist/commands/telemetry.d.ts.map +1 -0
- package/dist/commands/telemetry.js +23 -0
- package/dist/decision-firmness.d.ts.map +1 -1
- package/dist/decision-firmness.js +11 -14
- package/dist/engine-limits.d.ts.map +1 -1
- package/dist/engine-limits.js +8 -10
- package/dist/entity-body-context.d.ts.map +1 -1
- package/dist/entity-body-context.js +39 -36
- package/dist/extractors/markdown.d.ts +6 -0
- package/dist/extractors/markdown.d.ts.map +1 -1
- package/dist/extractors/markdown.js +21 -0
- package/dist/extractors/symbol-coordinates.d.ts.map +1 -1
- package/dist/extractors/symbol-coordinates.js +23 -4
- package/dist/firm-decision-edit.d.ts.map +1 -1
- package/dist/firm-decision-edit.js +1 -3
- package/dist/intent-search.d.ts +5 -1
- package/dist/intent-search.d.ts.map +1 -1
- package/dist/intent-search.js +118 -33
- package/dist/logic/ir.d.ts.map +1 -1
- package/dist/logic/ir.js +82 -108
- package/dist/operations/bootstrap/discovery-evidence.d.ts.map +1 -1
- package/dist/operations/bootstrap/discovery-evidence.js +44 -2
- package/dist/operations/bootstrap/discovery.d.ts.map +1 -1
- package/dist/operations/bootstrap/discovery.js +1 -0
- package/dist/operations/bootstrap/guidance-actions.d.ts.map +1 -1
- package/dist/operations/bootstrap/guidance-actions.js +2 -1
- package/dist/operations/bootstrap/plugin-offers.d.ts +11 -2
- package/dist/operations/bootstrap/plugin-offers.d.ts.map +1 -1
- package/dist/operations/bootstrap/plugin-offers.js +48 -9
- package/dist/operations/proof/claim-bindings.d.ts.map +1 -1
- package/dist/operations/proof/claim-bindings.js +1 -0
- package/dist/operations/proof/code-certificates.d.ts +2 -0
- package/dist/operations/proof/code-certificates.d.ts.map +1 -1
- package/dist/operations/proof/code-certificates.js +34 -14
- package/dist/operations/proof/code-models.d.ts.map +1 -1
- package/dist/operations/proof/code-models.js +19 -5
- package/dist/operations/proof/code-runner.d.ts +16 -0
- package/dist/operations/proof/code-runner.d.ts.map +1 -1
- package/dist/operations/proof/code-runner.js +42 -6
- package/dist/operations/proof/explain.d.ts +63 -0
- package/dist/operations/proof/explain.d.ts.map +1 -1
- package/dist/operations/proof/explain.js +162 -0
- package/dist/operations/semantic-advisor/analyze-prose.d.ts +9 -1
- package/dist/operations/semantic-advisor/analyze-prose.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/analyze-prose.js +21 -0
- package/dist/operations/semantic-advisor/case-preview.d.ts +24 -0
- package/dist/operations/semantic-advisor/case-preview.d.ts.map +1 -0
- package/dist/operations/semantic-advisor/case-preview.js +216 -0
- package/dist/operations/semantic-advisor/shared.d.ts.map +1 -1
- package/dist/operations/semantic-advisor/shared.js +3 -0
- package/dist/operations/semantic-advisor/types.d.ts +23 -0
- package/dist/operations/semantic-advisor/types.d.ts.map +1 -1
- package/dist/plugins/approved-source-analyzers.generated.d.ts +11 -8
- package/dist/plugins/approved-source-analyzers.generated.d.ts.map +1 -1
- package/dist/plugins/approved-source-analyzers.generated.js +11 -8
- package/dist/plugins/compose-search-hints.d.ts +29 -0
- package/dist/plugins/compose-search-hints.d.ts.map +1 -0
- package/dist/plugins/compose-search-hints.js +94 -0
- package/dist/plugins/external-allowlist.d.ts +7 -0
- package/dist/plugins/external-allowlist.d.ts.map +1 -1
- package/dist/plugins/external-allowlist.js +11 -0
- package/dist/plugins/registry.d.ts +8 -1
- package/dist/plugins/registry.d.ts.map +1 -1
- package/dist/plugins/registry.js +22 -3
- package/dist/plugins/source-classification.d.ts +2 -2
- package/dist/plugins/source-classification.d.ts.map +1 -1
- package/dist/plugins/source-classification.js +25 -1
- package/dist/prolog/codec.d.ts.map +1 -1
- package/dist/prolog/codec.js +10 -20
- package/dist/public/impact/coverage-depth-quality.d.ts.map +1 -1
- package/dist/public/impact/coverage-depth-quality.js +32 -16
- package/dist/public/impact/full-kb-quality.d.ts +6 -0
- package/dist/public/impact/full-kb-quality.d.ts.map +1 -1
- package/dist/public/impact/full-kb-quality.js +8 -3
- package/dist/public/impact/requirement-quality.d.ts.map +1 -1
- package/dist/public/impact/requirement-quality.js +56 -29
- package/dist/public/operations/catalog.d.ts +44 -4
- package/dist/public/operations/catalog.d.ts.map +1 -1
- package/dist/public/operations/check-executor.d.ts +6 -0
- package/dist/public/operations/check-executor.d.ts.map +1 -1
- package/dist/public/operations/check-executor.js +34 -2
- package/dist/public/operations/discovery-executors.d.ts +5 -1
- package/dist/public/operations/discovery-executors.d.ts.map +1 -1
- package/dist/public/operations/discovery-executors.js +65 -4
- package/dist/public/operations/evidence-floor.d.ts +8 -1
- package/dist/public/operations/evidence-floor.d.ts.map +1 -1
- package/dist/public/operations/evidence-floor.js +3 -4
- package/dist/public/operations/migration-plan.d.ts.map +1 -1
- package/dist/public/operations/migration-plan.js +41 -10
- package/dist/public/operations/node-ports.d.ts.map +1 -1
- package/dist/public/operations/node-ports.js +3 -1
- package/dist/public/operations/repair-plan.d.ts +46 -0
- package/dist/public/operations/repair-plan.d.ts.map +1 -1
- package/dist/public/operations/repair-plan.js +110 -1
- package/dist/public/operations/schema6-check-actions.js +1 -1
- package/dist/public/operations/source-analysis-cache.d.ts +22 -0
- package/dist/public/operations/source-analysis-cache.d.ts.map +1 -0
- package/dist/public/operations/source-analysis-cache.js +157 -0
- package/dist/public/operations/specs/check-rules.generated.d.ts +1 -1
- package/dist/public/operations/specs/check-rules.generated.d.ts.map +1 -1
- package/dist/public/operations/specs/check-rules.generated.js +2 -1
- package/dist/public/operations/specs/check.d.ts +1 -1
- package/dist/public/operations/specs/discovery.d.ts +7 -2
- package/dist/public/operations/specs/discovery.d.ts.map +1 -1
- package/dist/public/operations/specs/discovery.js +7 -2
- package/dist/public/operations/specs/mutation-schemas.d.ts +36 -1
- package/dist/public/operations/specs/mutation-schemas.d.ts.map +1 -1
- package/dist/public/operations/specs/mutation-schemas.js +30 -0
- package/dist/public/operations/specs/upsert.d.ts +36 -1
- package/dist/public/operations/specs/upsert.d.ts.map +1 -1
- package/dist/public/operations/symbol-granularity-check.d.ts +3 -1
- package/dist/public/operations/symbol-granularity-check.d.ts.map +1 -1
- package/dist/public/operations/symbol-granularity-check.js +21 -7
- package/dist/public/proof-protocol.d.ts +6 -1
- package/dist/public/proof-protocol.d.ts.map +1 -1
- package/dist/public/proof-protocol.js +12 -3
- package/dist/public/proof-sources.d.ts +2 -0
- package/dist/public/proof-sources.d.ts.map +1 -1
- package/dist/public/proof-sources.js +32 -6
- package/dist/public/schemas/entity.d.ts.map +1 -1
- package/dist/public/schemas/entity.js +59 -0
- package/dist/public/skills/kibi-bootstrap/SKILL.md +2 -2
- package/dist/public/skills/kibi-commit-review/SKILL.md +6 -2
- package/dist/public/skills/kibi-decisions/SKILL.md +7 -2
- package/dist/public/skills/kibi-decisions/resources/signoff-views.md +3 -1
- package/dist/public/skills/kibi-usage/SKILL.md +50 -3
- package/dist/public/skills/kibi-usage/resources/fact-lanes.md +34 -0
- package/dist/public/skills/kibi-usage/resources/proof.md +13 -5
- package/dist/public/skills/kibi-usage/resources/workflows.md +10 -0
- package/dist/relationships/shards.d.ts +2 -0
- package/dist/relationships/shards.d.ts.map +1 -1
- package/dist/relationships/shards.js +25 -1
- package/dist/schemas/entity.schema.json +98 -1
- package/dist/search-answer.d.ts +3 -2
- package/dist/search-answer.d.ts.map +1 -1
- package/dist/search-answer.js +57 -4
- package/dist/search-hints.d.ts +58 -0
- package/dist/search-hints.d.ts.map +1 -0
- package/dist/search-hints.js +187 -0
- package/dist/search-ranking.d.ts +7 -0
- package/dist/search-ranking.d.ts.map +1 -1
- package/dist/search-ranking.js +54 -56
- package/dist/search-token-cache.d.ts +30 -0
- package/dist/search-token-cache.d.ts.map +1 -0
- package/dist/search-token-cache.js +86 -0
- package/dist/traceability/impact-knowledge.d.ts.map +1 -1
- package/dist/traceability/impact-knowledge.js +2 -0
- package/dist/traceability/temp-kb.d.ts.map +1 -1
- package/dist/traceability/temp-kb.js +11 -1
- package/dist/types/entities.d.ts +12 -0
- package/dist/types/entities.d.ts.map +1 -1
- package/dist/usage-telemetry.d.ts +20 -0
- package/dist/usage-telemetry.d.ts.map +1 -0
- package/dist/usage-telemetry.js +93 -0
- package/dist/utils/branch-resolver.d.ts.map +1 -1
- package/dist/utils/branch-resolver.js +1 -0
- package/dist/utils/rule-registry.generated.d.ts +5 -0
- package/dist/utils/rule-registry.generated.d.ts.map +1 -1
- package/dist/utils/rule-registry.generated.js +6 -0
- package/package.json +5 -4
- package/schema/entities.pl +12 -0
- package/src/public/impact/coverage-depth-quality.ts +59 -21
- package/src/public/impact/full-kb-quality.ts +15 -1
- package/src/public/impact/requirement-quality.ts +95 -38
- package/src/public/operations/check-executor.ts +41 -1
- package/src/public/operations/discovery-executors.ts +92 -4
- package/src/public/operations/evidence-floor.ts +15 -3
- package/src/public/operations/migration-plan.ts +41 -9
- package/src/public/operations/node-ports.ts +3 -1
- package/src/public/operations/repair-plan.ts +152 -1
- package/src/public/operations/schema6-check-actions.ts +1 -1
- package/src/public/operations/source-analysis-cache.ts +196 -0
- package/src/public/operations/specs/check-rules.generated.ts +2 -1
- package/src/public/operations/specs/discovery.ts +8 -2
- package/src/public/operations/specs/mutation-schemas.ts +34 -0
- package/src/public/operations/symbol-granularity-check.ts +25 -5
- package/src/public/proof-protocol-types.d.ts +1 -1
- package/src/public/proof-protocol.ts +18 -4
- package/src/public/proof-sources.ts +37 -6
- package/src/public/schemas/entity.ts +65 -0
- package/src/public/skills/kibi-bootstrap/SKILL.md +2 -2
- package/src/public/skills/kibi-commit-review/SKILL.md +6 -2
- package/src/public/skills/kibi-decisions/SKILL.md +7 -2
- package/src/public/skills/kibi-decisions/resources/signoff-views.md +3 -1
- package/src/public/skills/kibi-usage/SKILL.md +50 -3
- package/src/public/skills/kibi-usage/resources/fact-lanes.md +34 -0
- package/src/public/skills/kibi-usage/resources/proof.md +13 -5
- package/src/public/skills/kibi-usage/resources/workflows.md +10 -0
- package/src/schemas/entity.schema.json +98 -1
|
@@ -41,6 +41,10 @@ const STRING_FIELDS = new Set([
|
|
|
41
41
|
"canonical_key",
|
|
42
42
|
"claim_key",
|
|
43
43
|
"claim_text",
|
|
44
|
+
"dimension_waiver",
|
|
45
|
+
"dimension_waiver_approved_by",
|
|
46
|
+
"case_waiver",
|
|
47
|
+
"case_waiver_approved_by",
|
|
44
48
|
"predicate_name",
|
|
45
49
|
"predicate_namespace",
|
|
46
50
|
"rule_hash",
|
|
@@ -151,6 +155,30 @@ function parsePrologList(value) {
|
|
|
151
155
|
}
|
|
152
156
|
return values;
|
|
153
157
|
}
|
|
158
|
+
/**
|
|
159
|
+
* Assert a batch of relationships, keeping each one that succeeds, and return
|
|
160
|
+
* the 1-based positions of those that failed. Null when the store could not
|
|
161
|
+
* run the batch at all, so the caller retries every relationship.
|
|
162
|
+
*/
|
|
163
|
+
async function assertRelationshipsReporting(prolog, chunk) {
|
|
164
|
+
try {
|
|
165
|
+
const rels = chunk.map(({ rel, fromId, toId }) => `rel(${toPrologAtom(rel.type)}, ${toPrologAtom(fromId)}, ${toPrologAtom(toId)})`);
|
|
166
|
+
const result = await prolog.query(`kb_assert_relationships_reporting([${rels.join(", ")}], Failed)`);
|
|
167
|
+
// rationale: a non-string answer fails to parse below and the catch
|
|
168
|
+
// returns null too; the type test only narrows for the parser.
|
|
169
|
+
// Stryker disable next-line ConditionalExpression
|
|
170
|
+
if (!result.success || typeof result.bindings.Failed !== "string") {
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
const failed = parsePrologList(result.bindings.Failed).map(Number);
|
|
174
|
+
if (failed.some((position) => !Number.isInteger(position)))
|
|
175
|
+
return null;
|
|
176
|
+
return new Set(failed);
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
154
182
|
function sourceLookupCandidates(sourceFile) {
|
|
155
183
|
return [
|
|
156
184
|
...new Set([
|
|
@@ -418,6 +446,8 @@ prolog, results, entityIds, options = {}) {
|
|
|
418
446
|
for (const field of [
|
|
419
447
|
"approved_by",
|
|
420
448
|
"approval_ref",
|
|
449
|
+
"failure_side_waiver",
|
|
450
|
+
"failure_side_waiver_approved_by",
|
|
421
451
|
"rationale",
|
|
422
452
|
]) {
|
|
423
453
|
const value = entity.type === "req" ? entity[field] : undefined;
|
|
@@ -618,7 +648,25 @@ export async function persistRelationships(prolog, results, shardRelationships,
|
|
|
618
648
|
kbModified = true;
|
|
619
649
|
continue;
|
|
620
650
|
}
|
|
621
|
-
|
|
651
|
+
// One failing relationship (a dangling link is enough) rolls the whole
|
|
652
|
+
// batch back. Keep the ones that do assert in one more round trip and
|
|
653
|
+
// retry only the failures one by one for their exact errors, instead of
|
|
654
|
+
// one round trip per relationship of the batch.
|
|
655
|
+
const failedPositions = relationshipBatchRunner
|
|
656
|
+
? await assertRelationshipsReporting(prolog, chunk)
|
|
657
|
+
: null;
|
|
658
|
+
const retried = failedPositions === null
|
|
659
|
+
? chunk
|
|
660
|
+
: chunk.filter((_, index) => failedPositions.has(index + 1));
|
|
661
|
+
if (failedPositions !== null) {
|
|
662
|
+
chunk.forEach((item, index) => {
|
|
663
|
+
if (failedPositions.has(index + 1))
|
|
664
|
+
return;
|
|
665
|
+
countEdge(item.rel.type, item.fromId, item.toId);
|
|
666
|
+
kbModified = true;
|
|
667
|
+
});
|
|
668
|
+
}
|
|
669
|
+
for (const item of retried) {
|
|
622
670
|
try {
|
|
623
671
|
const single = await prolog.query(item.goal);
|
|
624
672
|
if (single.success) {
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CommandResult } from "../cli-command.js";
|
|
2
|
+
export type TelemetryAction = "status" | "enable" | "disable";
|
|
3
|
+
/** `kibi telemetry [status|enable|disable]`: show or persist the choice. */
|
|
4
|
+
export declare function telemetryCommand(action: string | undefined, options?: {
|
|
5
|
+
format?: "json" | "text";
|
|
6
|
+
}, env?: NodeJS.ProcessEnv): Promise<CommandResult>;
|
|
7
|
+
//# sourceMappingURL=telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/commands/telemetry.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAG9D,4EAA4E;AAC5E,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAAO,EAC1C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAAC,aAAa,CAAC,CAsBxB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// implements REQ-kibi-anonymous-usage-telemetry
|
|
2
|
+
import { TELEMETRY_DOCS_URL, setTelemetryPreference, telemetryStatus, } from "kibi-agent-core/usage-telemetry";
|
|
3
|
+
// implements REQ-kibi-anonymous-usage-telemetry
|
|
4
|
+
/** `kibi telemetry [status|enable|disable]`: show or persist the choice. */
|
|
5
|
+
export async function telemetryCommand(action, options = {}, env = process.env) {
|
|
6
|
+
const chosen = action ?? "status";
|
|
7
|
+
if (chosen !== "status" && chosen !== "enable" && chosen !== "disable") {
|
|
8
|
+
console.error(`Error: unknown telemetry action "${chosen}"; use status, enable or disable`);
|
|
9
|
+
return { exitCode: 1 };
|
|
10
|
+
}
|
|
11
|
+
if (chosen !== "status") {
|
|
12
|
+
setTelemetryPreference(chosen === "enable" ? "enabled" : "disabled", env);
|
|
13
|
+
}
|
|
14
|
+
const status = telemetryStatus(env);
|
|
15
|
+
if (options.format === "json") {
|
|
16
|
+
console.log(JSON.stringify({ ...status, docs: TELEMETRY_DOCS_URL }));
|
|
17
|
+
return { exitCode: 0 };
|
|
18
|
+
}
|
|
19
|
+
console.log(`Anonymous usage telemetry is ${status.enabled ? "on" : "off"} (${status.reason}).`);
|
|
20
|
+
console.log(`Settings and queue: ${status.directory}`);
|
|
21
|
+
console.log(`What is collected: ${TELEMETRY_DOCS_URL}`);
|
|
22
|
+
return { exitCode: 0 };
|
|
23
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decision-firmness.d.ts","sourceRoot":"","sources":["../src/decision-firmness.ts"],"names":[],"mappings":"AA4BA,sCAAsC;AAEtC,eAAO,MAAM,eAAe,6CAA8C,CAAC;AAG3E,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAExD,yEAAyE;AAEzE,eAAO,MAAM,gBAAgB,EAAE,QAAoB,CAAC;AAEpD,wCAAwC;AAExC,eAAO,MAAM,cAAc,yBAA0B,CAAC;AAEtD,0EAA0E;AAE1E,eAAO,MAAM,wBAAwB,qBAAqB,CAAC;AAE3D,+DAA+D;AAE/D,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAIxC;;;;GAIG;AAEH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAEzE;AAGD,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,
|
|
1
|
+
{"version":3,"file":"decision-firmness.d.ts","sourceRoot":"","sources":["../src/decision-firmness.ts"],"names":[],"mappings":"AA4BA,sCAAsC;AAEtC,eAAO,MAAM,eAAe,6CAA8C,CAAC;AAG3E,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAExD,yEAAyE;AAEzE,eAAO,MAAM,gBAAgB,EAAE,QAAoB,CAAC;AAEpD,wCAAwC;AAExC,eAAO,MAAM,cAAc,yBAA0B,CAAC;AAEtD,0EAA0E;AAE1E,eAAO,MAAM,wBAAwB,qBAAqB,CAAC;AAE3D,+DAA+D;AAE/D,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAIxC;;;;GAIG;AAEH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAEzE;AAGD,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAE5D;AAGD,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAEtD;AAED;;;;;;;GAOG;AAEH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,OAAO,GACf,QAAQ,GAAG,SAAS,CAItB;AAED;;;;GAIG;AAEH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAEzE;AAED,uEAAuE;AAEvE,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAI9D;AAED;;;GAGG;AAEH,wBAAgB,WAAW,CAAC,MAAM,EAAE;IAClC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,GAAG,MAAM,GAAG,SAAS,CAcrB;AAMD;;;GAGG;AAEH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgBxD"}
|
|
@@ -50,13 +50,11 @@ export function supersedeAcknowledgement(from, to) {
|
|
|
50
50
|
}
|
|
51
51
|
// implements REQ-kb-decision-firmness
|
|
52
52
|
export function isFirmness(value) {
|
|
53
|
-
return (
|
|
54
|
-
FIRMNESS_VALUES.includes(value));
|
|
53
|
+
return FIRMNESS_VALUES.includes(value);
|
|
55
54
|
}
|
|
56
55
|
// implements REQ-kb-decision-firmness
|
|
57
56
|
export function carriesFirmness(type) {
|
|
58
|
-
return (
|
|
59
|
-
FIRMNESS_TYPES.includes(type));
|
|
57
|
+
return FIRMNESS_TYPES.includes(type);
|
|
60
58
|
}
|
|
61
59
|
/**
|
|
62
60
|
* The firmness a decision is read with: the authored value, else what its
|
|
@@ -111,7 +109,7 @@ export function firmnessRef(entity) {
|
|
|
111
109
|
return undefined;
|
|
112
110
|
}
|
|
113
111
|
function wordCount(text) {
|
|
114
|
-
return text.split(/\s
|
|
112
|
+
return text.split(/\s/).filter((word) => /[\p{L}\p{N}]/u.test(word)).length;
|
|
115
113
|
}
|
|
116
114
|
/**
|
|
117
115
|
* Words of prose under the body's "Why this changed" heading (nested
|
|
@@ -119,19 +117,18 @@ function wordCount(text) {
|
|
|
119
117
|
*/
|
|
120
118
|
// implements REQ-kb-decision-firmness
|
|
121
119
|
export function whyThisChangedWords(body) {
|
|
122
|
-
|
|
123
|
-
|
|
120
|
+
// The open section's heading level, 0 outside one (and for the preamble,
|
|
121
|
+
// whose empty heading never matches).
|
|
122
|
+
let level = 0;
|
|
124
123
|
let words = 0;
|
|
125
|
-
for (const section of
|
|
126
|
-
if (
|
|
127
|
-
level =
|
|
128
|
-
|
|
129
|
-
if (level === null &&
|
|
130
|
-
section.level > 0 &&
|
|
124
|
+
for (const section of parseBodySections(body)) {
|
|
125
|
+
if (section.level <= level)
|
|
126
|
+
level = 0;
|
|
127
|
+
if (level === 0 &&
|
|
131
128
|
WHY_THIS_CHANGED.test(section.heading.replace(/^[*_`\s]+/, ""))) {
|
|
132
129
|
level = section.level;
|
|
133
130
|
}
|
|
134
|
-
if (level
|
|
131
|
+
if (level > 0)
|
|
135
132
|
words += wordCount(section.text);
|
|
136
133
|
}
|
|
137
134
|
return words;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine-limits.d.ts","sourceRoot":"","sources":["../src/engine-limits.ts"],"names":[],"mappings":"AA6BA,2DAA2D;AAE3D,eAAO,MAAM,yBAAyB,yBAAyB,CAAC;AAEhE,iEAAiE;AAEjE,eAAO,MAAM,0BAA0B,mCAAmC,CAAC;AAE3E,eAAO,MAAM,+BAA+B,qCACR,CAAC;AAErC;;;GAGG;AAEH,eAAO,MAAM,6BAA6B,SAAU,CAAC;AAIrD,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC,CAAC;AAGH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"engine-limits.d.ts","sourceRoot":"","sources":["../src/engine-limits.ts"],"names":[],"mappings":"AA6BA,2DAA2D;AAE3D,eAAO,MAAM,yBAAyB,yBAAyB,CAAC;AAEhE,iEAAiE;AAEjE,eAAO,MAAM,0BAA0B,mCAAmC,CAAC;AAE3E,eAAO,MAAM,+BAA+B,qCACR,CAAC;AAErC;;;GAGG;AAEH,eAAO,MAAM,6BAA6B,SAAU,CAAC;AAIrD,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC,CAAC;AAGH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAAC;AAcH;;;;GAIG;AAEH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,GACb,iBAAiB,GAAG,SAAS,CAiB/B;AAED,8DAA8D;AAE9D,wBAAgB,kBAAkB,CAChC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,iBAAiB,GAAG,SAAS,CAO/B;AAED;;;;;;;;;GASG;AAEH,eAAO,MAAM,8BAA8B,QAI5B,CAAC;AAKhB;;;;;GAKG;AAEH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,iBAAiB,GACxB,MAAM,CAMR;AAED,KAAK,aAAa,GAAG;IACnB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;;GAGG;AAEH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,aAAa,EACvD,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,iBAAiB,GACxB,CAAC,GAAG,CAAC,aAAa,GAAG;IAAE,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAA;CAAE,CAAC,CAiBvE;AAiBD,qEAAqE;AAErE,qBAAa,qBAAsB,SAAQ,KAAK;IAIlC,QAAQ,CAAC,aAAa,EAAE,mBAAmB;IAHvD,QAAQ,CAAC,IAAI,0BAA6B;IAC1C,QAAQ,CAAC,SAAS,SAAS;gBAEN,aAAa,EAAE,mBAAmB;CAIxD;AAED;;;GAGG;AAEH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,GACb,mBAAmB,GAAG,IAAI,CAkB5B;AAED,wDAAwD;AAExD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAQ5D"}
|
package/dist/engine-limits.js
CHANGED
|
@@ -41,6 +41,9 @@ export const ENGINE_READ_INFERENCE_LIMIT_ENV = "KIBI_ENGINE_READ_INFERENCE_LIMIT
|
|
|
41
41
|
export const ENGINE_READ_TIME_LIMIT_CAP_MS = 115_000;
|
|
42
42
|
const ENGINE_READ_INFERENCE_LIMIT_CAP = 1_000_000_000_000;
|
|
43
43
|
function boundedInteger(value, max) {
|
|
44
|
+
// rationale: Number.isSafeInteger already rejects non-numbers; the typeof
|
|
45
|
+
// check only narrows the type for the comparisons below.
|
|
46
|
+
// Stryker disable next-line ConditionalExpression
|
|
44
47
|
return typeof value === "number" &&
|
|
45
48
|
Number.isSafeInteger(value) &&
|
|
46
49
|
value > 0 &&
|
|
@@ -73,16 +76,11 @@ export function normalizeQueryLimits(value) {
|
|
|
73
76
|
/** Read limits configured through the environment, if any. */
|
|
74
77
|
// implements REQ-core-engine-read-limits
|
|
75
78
|
export function queryLimitsFromEnv(env = process.env) {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
if (!raw)
|
|
79
|
-
return undefined;
|
|
80
|
-
const parsed = Number(raw);
|
|
81
|
-
return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : undefined;
|
|
82
|
-
};
|
|
79
|
+
// Number() maps blank or unset values to 0 or NaN, which
|
|
80
|
+
// normalizeQueryLimits drops along with every other unusable budget.
|
|
83
81
|
return normalizeQueryLimits({
|
|
84
|
-
timeMs:
|
|
85
|
-
inferences:
|
|
82
|
+
timeMs: Number(env[ENGINE_READ_TIME_LIMIT_ENV]),
|
|
83
|
+
inferences: Number(env[ENGINE_READ_INFERENCE_LIMIT_ENV]),
|
|
86
84
|
});
|
|
87
85
|
}
|
|
88
86
|
/**
|
|
@@ -179,7 +177,7 @@ export function queryLimitExceededOf(error) {
|
|
|
179
177
|
return { kind, limit };
|
|
180
178
|
}
|
|
181
179
|
const match = error.message.match(QUERY_LIMIT_MESSAGE);
|
|
182
|
-
if (match
|
|
180
|
+
if (match === null)
|
|
183
181
|
return null;
|
|
184
182
|
return {
|
|
185
183
|
kind: match[1] === "time" ? "time" : "inferences",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-body-context.d.ts","sourceRoot":"","sources":["../src/entity-body-context.ts"],"names":[],"mappings":"AAkBA;;;;;GAKG;AAEH,4EAA4E;AAE5E,eAAO,MAAM,qBAAqB,uFAQxB,CAAC;AAEX,iEAAiE;AAEjE,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,wEAAwE;AAExE,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC,sEAAsE;AAEtE,eAAO,MAAM,mBAAmB,2BAA2B,CAAC;AAQ5D,2EAA2E;AAE3E,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC,CAAC;AAEH,qEAAqE;AAErE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzD;
|
|
1
|
+
{"version":3,"file":"entity-body-context.d.ts","sourceRoot":"","sources":["../src/entity-body-context.ts"],"names":[],"mappings":"AAkBA;;;;;GAKG;AAEH,4EAA4E;AAE5E,eAAO,MAAM,qBAAqB,uFAQxB,CAAC;AAEX,iEAAiE;AAEjE,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,wEAAwE;AAExE,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC,sEAAsE;AAEtE,eAAO,MAAM,mBAAmB,2BAA2B,CAAC;AAQ5D,2EAA2E;AAE3E,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC,CAAC;AAEH,qEAAqE;AAErE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzD;AAgDD,kFAAkF;AAElF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CA2B7D;AAED;;;GAGG;AAEH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK3D;AAED,iEAAiE;AAEjE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKvD;AAED,gDAAgD;AAEhD,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC;IACnC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC,CAAC;AAEH,oDAAoD;AAEpD,eAAO,MAAM,sBAAsB,qDAMzB,CAAC;AAEX;;;;GAIG;AAEH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAK5E;AASD;;;;GAIG;AAEH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,aAAkB,GAC1B,MAAM,CAER;AASD,gFAAgF;AAEhF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAOnE;AAGD,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,EAAE,EAAE,OAAO,CAAC;IACZ,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,aAAa,CAAC;IAC9C,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAAC;AAEH;;;;GAIG;AAEH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,GACpB,iBAAiB,CAmBnB;AAED,4EAA4E;AAE5E,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,GACpB,OAAO,CAET;AAWD,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,WAAW,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAEH;;;;;;GAMG;AAEH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,EACrB,YAAY,UAAQ,GACnB,cAAc,GAAG,IAAI,CAWvB;AAED,yEAAyE;AAEzE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAE5D;AAED,2EAA2E;AAE3E,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,GAClC,MAAM,CAYR;AAED,kEAAkE;AAElE,eAAO,MAAM,oBAAoB,gVAC8S,CAAC;AAEhV,sFAAsF;AAEtF,eAAO,MAAM,iBAAiB,iNACkL,CAAC;AAEjN,0EAA0E;AAE1E,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,CAAC,CAAC;AA2BH;;;;GAIG;AAEH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CACjC,GAAG,MAAM,CAOT;AAED;;;;;;GAMG;AAEH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CACjC,GAAG,MAAM,CAgDT;AASD;;;;GAIG;AAEH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,aAAkB,GACzB,MAAM,GAAG,SAAS,CAEpB"}
|
|
@@ -46,7 +46,7 @@ const CONTEXT_HEADING = new RegExp(`^(?:${CONTEXT_HEADING_WORDS.join("|")})\\b`,
|
|
|
46
46
|
/** True when a heading's text starts with a context heading word. */
|
|
47
47
|
// implements REQ-kb-entity-body-context
|
|
48
48
|
export function isContextHeading(heading) {
|
|
49
|
-
return CONTEXT_HEADING.test(heading.
|
|
49
|
+
return CONTEXT_HEADING.test(heading.replace(/^[*_`\s]+/, ""));
|
|
50
50
|
}
|
|
51
51
|
/**
|
|
52
52
|
* Classify every line of a body. A line under a context heading stays in
|
|
@@ -55,26 +55,35 @@ export function isContextHeading(heading) {
|
|
|
55
55
|
*/
|
|
56
56
|
function classifyLines(body) {
|
|
57
57
|
const classified = [];
|
|
58
|
-
|
|
58
|
+
// The open context section's heading level, 0 outside one.
|
|
59
|
+
let contextLevel = 0;
|
|
59
60
|
for (const line of body.replace(/\r\n?/g, "\n").split("\n")) {
|
|
60
61
|
const match = HEADING_LINE.exec(line);
|
|
61
62
|
if (match === null) {
|
|
62
63
|
classified.push({
|
|
63
64
|
line,
|
|
64
65
|
level: 0,
|
|
66
|
+
// rationale: prose rows' heading is never read (sections take the
|
|
67
|
+
// heading of a heading row, and "" or any non-heading word is not a
|
|
68
|
+
// context heading).
|
|
69
|
+
// Stryker disable next-line StringLiteral
|
|
65
70
|
heading: "",
|
|
66
|
-
inContext: contextLevel
|
|
71
|
+
inContext: contextLevel > 0,
|
|
67
72
|
});
|
|
68
73
|
continue;
|
|
69
74
|
}
|
|
75
|
+
// rationale: the regex always captures the hashes; ?. only satisfies the
|
|
76
|
+
// indexed-access type.
|
|
77
|
+
// Stryker disable next-line OptionalChaining
|
|
70
78
|
const level = match[1]?.length ?? 1;
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
if (
|
|
79
|
+
// The pattern already drops surrounding blanks, so only a closing
|
|
80
|
+
// sequence of hashes is left to strip.
|
|
81
|
+
const heading = (match[2] ?? "").replace(/[ \t]+#+$/, "");
|
|
82
|
+
if (level <= contextLevel)
|
|
83
|
+
contextLevel = 0;
|
|
84
|
+
if (contextLevel === 0 && isContextHeading(heading))
|
|
75
85
|
contextLevel = level;
|
|
76
|
-
}
|
|
77
|
-
classified.push({ line, level, heading, inContext: contextLevel !== null });
|
|
86
|
+
classified.push({ line, level, heading, inContext: contextLevel > 0 });
|
|
78
87
|
}
|
|
79
88
|
return classified;
|
|
80
89
|
}
|
|
@@ -167,7 +176,7 @@ export function contextProse(type, body, _entity = {}) {
|
|
|
167
176
|
function tokens(text) {
|
|
168
177
|
return text
|
|
169
178
|
.toLowerCase()
|
|
170
|
-
.split(/[^\p{L}\p{N}]
|
|
179
|
+
.split(/[^\p{L}\p{N}]/u)
|
|
171
180
|
.filter((token) => token !== "");
|
|
172
181
|
}
|
|
173
182
|
/** Normalized token-set Jaccard similarity of two texts (0 when both empty). */
|
|
@@ -175,13 +184,12 @@ function tokens(text) {
|
|
|
175
184
|
export function tokenSetJaccard(left, right) {
|
|
176
185
|
const a = new Set(tokens(left));
|
|
177
186
|
const b = new Set(tokens(right));
|
|
178
|
-
if (a.size === 0 && b.size === 0)
|
|
179
|
-
return 0;
|
|
180
187
|
let shared = 0;
|
|
181
188
|
for (const token of a)
|
|
182
189
|
if (b.has(token))
|
|
183
190
|
shared += 1;
|
|
184
|
-
|
|
191
|
+
const union = a.size + b.size - shared;
|
|
192
|
+
return union === 0 ? 0 : shared / union;
|
|
185
193
|
}
|
|
186
194
|
/**
|
|
187
195
|
* Judge an entity's body context: at least MIN_CONTEXT_WORDS words of
|
|
@@ -199,11 +207,9 @@ export function assessContext(type, body, entity) {
|
|
|
199
207
|
if (words < MIN_CONTEXT_WORDS)
|
|
200
208
|
return { ok: false, reason: "too_short", words };
|
|
201
209
|
const references = [
|
|
202
|
-
|
|
203
|
-
type === "req"
|
|
204
|
-
|
|
205
|
-
: "",
|
|
206
|
-
].filter((text) => text.trim() !== "");
|
|
210
|
+
entity.title,
|
|
211
|
+
type === "req" ? entity.semantic_text : undefined,
|
|
212
|
+
].filter((text) => typeof text === "string");
|
|
207
213
|
if (references.some((reference) => tokenSetJaccard(prose, reference) >= RESTATEMENT_JACCARD)) {
|
|
208
214
|
return { ok: false, reason: "restatement", words };
|
|
209
215
|
}
|
|
@@ -230,17 +236,15 @@ const TYPE_LABEL = {
|
|
|
230
236
|
*/
|
|
231
237
|
// implements REQ-kb-entity-body-context
|
|
232
238
|
export function contextFinding(type, id, body, entity, acknowledged = false) {
|
|
233
|
-
const
|
|
234
|
-
if (
|
|
235
|
-
return null;
|
|
236
|
-
if (acknowledged)
|
|
239
|
+
const { reason, words } = assessContext(type, body, entity);
|
|
240
|
+
if (reason === undefined || acknowledged)
|
|
237
241
|
return null;
|
|
238
242
|
return {
|
|
239
243
|
type,
|
|
240
244
|
id,
|
|
241
|
-
reason
|
|
242
|
-
words
|
|
243
|
-
description: `${TYPE_LABEL[type] ?? type} ${id} has no body context: ${missingContextDescription(type,
|
|
245
|
+
reason,
|
|
246
|
+
words,
|
|
247
|
+
description: `${TYPE_LABEL[type] ?? type} ${id} has no body context: ${missingContextDescription(type, reason)}`,
|
|
244
248
|
suggestion: CONTEXT_MISSING_HINT,
|
|
245
249
|
};
|
|
246
250
|
}
|
|
@@ -271,13 +275,12 @@ export const RESERVED_TAG_HINT = "review:context-missing is reserved for entitie
|
|
|
271
275
|
function blockquote(text) {
|
|
272
276
|
return text
|
|
273
277
|
.replace(/\r\n?/g, "\n")
|
|
274
|
-
.trim()
|
|
275
278
|
.split("\n")
|
|
276
279
|
.map((line) => (line.trim() === "" ? ">" : `> ${line}`))
|
|
277
280
|
.join("\n");
|
|
278
281
|
}
|
|
279
282
|
function contextSectionBlock(context) {
|
|
280
|
-
return `## Context\n\n${context
|
|
283
|
+
return `## Context\n\n${context}`;
|
|
281
284
|
}
|
|
282
285
|
function sourceSectionBlock(source) {
|
|
283
286
|
const sourceLines = [];
|
|
@@ -333,19 +336,19 @@ export function reviseRequirementBody(input) {
|
|
|
333
336
|
open = null;
|
|
334
337
|
continue;
|
|
335
338
|
}
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
const
|
|
341
|
-
.trim()
|
|
339
|
+
// A context run always opens with its context heading; a later one
|
|
340
|
+
// starts a block only at the same or a higher level.
|
|
341
|
+
if (open === null ||
|
|
342
|
+
(row.level <= openLevel && isContextHeading(row.heading))) {
|
|
343
|
+
const key = row.heading
|
|
342
344
|
.replace(/^[*_`\s]+/, "")
|
|
343
|
-
.
|
|
344
|
-
|
|
345
|
+
.replace(/\W.*/, "")
|
|
346
|
+
.toLowerCase();
|
|
347
|
+
open = { key, lines: [] };
|
|
345
348
|
openLevel = row.level;
|
|
346
349
|
blocks.push(open);
|
|
347
350
|
}
|
|
348
|
-
open
|
|
351
|
+
open.lines.push(row.line);
|
|
349
352
|
}
|
|
350
353
|
const used = new Set();
|
|
351
354
|
const parts = [input.statement.trim()];
|
|
@@ -37,6 +37,8 @@ export interface ExtractedEntity {
|
|
|
37
37
|
proof_exempt_reason?: string;
|
|
38
38
|
approved_by?: string;
|
|
39
39
|
approval_ref?: string;
|
|
40
|
+
failure_side_waiver?: string;
|
|
41
|
+
failure_side_waiver_approved_by?: string;
|
|
40
42
|
rationale?: string;
|
|
41
43
|
exempts_claims?: string[];
|
|
42
44
|
expects?: "success" | "rejection" | "error";
|
|
@@ -62,6 +64,10 @@ export interface ExtractedEntity {
|
|
|
62
64
|
canonical_key?: string;
|
|
63
65
|
claim_key?: string;
|
|
64
66
|
claim_text?: string;
|
|
67
|
+
dimension_waiver?: string;
|
|
68
|
+
dimension_waiver_approved_by?: string;
|
|
69
|
+
case_waiver?: string;
|
|
70
|
+
case_waiver_approved_by?: string;
|
|
65
71
|
predicate_name?: string;
|
|
66
72
|
predicate_namespace?: string;
|
|
67
73
|
predicate_arity?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/extractors/markdown.ts"],"names":[],"mappings":"AAsBA,OAAO,EAEL,KAAK,QAAQ,EAGd,MAAM,yBAAyB,CAAC;AAMjC,OAAO,EACL,KAAK,YAAY,EAElB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,aAAa,EACnB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,KAAK,YAAY,EAElB,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/extractors/markdown.ts"],"names":[],"mappings":"AAsBA,OAAO,EAEL,KAAK,QAAQ,EAGd,MAAM,yBAAyB,CAAC;AAMjC,OAAO,EACL,KAAK,YAAY,EAElB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,aAAa,EACnB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,KAAK,YAAY,EAElB,MAAM,4BAA4B,CAAC;AA4EpC,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,iBAAiB,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,YAAY,CAAC;IACpE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,0BAA0B,CAAC,EAAE,4BAA4B,CAAC;IAC1D,qBAAqB,CAAC,EAAE,eAAe,GAAG,UAAU,GAAG,OAAO,CAAC;IAC/D,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,YAAY,CAAC;IAC3D,wBAAwB,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACnD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,+BAA+B,CAAC,EAAE,MAAM,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IAC5C,cAAc,CAAC,EAAE,aAAa,CAAC;IAC/B,cAAc,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IACzC,cAAc,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAEzC,SAAS,CAAC,EACN,SAAS,GACT,gBAAgB,GAChB,aAAa,GACb,MAAM,GACN,kBAAkB,GAClB,WAAW,GACX,aAAa,GACb,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EACL,IAAI,GACJ,KAAK,GACL,IAAI,GACJ,KAAK,GACL,IAAI,GACJ,KAAK,GACL,SAAS,GACT,UAAU,GACV,WAAW,GACX,UAAU,CAAC;IACf,UAAU,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;CACzD;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,eAAe,CAAC;IACxB,aAAa,EAAE,qBAAqB,EAAE,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAuMD,qBAAa,gBAAiB,SAAQ,KAAK;IAOhC,QAAQ,EAAE,MAAM;IANlB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;gBAG5B,OAAO,EAAE,MAAM,EACR,QAAQ,EAAE,MAAM,EACvB,OAAO,CAAC,EAAE;QACR,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB;IAYM,QAAQ;CAUlB;AA2DD;;;;;GAKG;AAEH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQlE;AAED;;;;;GAKG;AAEH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAeD,wBAAgB,sBAAsB,CAEpC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,UAAU,EAAE,MAAM,GACjB,MAAM,EAAE,CAkDV;AA8kBD,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,gBAAgB,CAElB;AAGD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAatE;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CASjE;AASD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAQpE"}
|
|
@@ -43,6 +43,10 @@ const FACT_STRING_FIELDS = [
|
|
|
43
43
|
"canonical_key",
|
|
44
44
|
"claim_key",
|
|
45
45
|
"claim_text",
|
|
46
|
+
"dimension_waiver",
|
|
47
|
+
"dimension_waiver_approved_by",
|
|
48
|
+
"case_waiver",
|
|
49
|
+
"case_waiver_approved_by",
|
|
46
50
|
"predicate_name",
|
|
47
51
|
"predicate_namespace",
|
|
48
52
|
"rule_ir",
|
|
@@ -511,6 +515,23 @@ function extractFromMarkdownContent(content, filePath) {
|
|
|
511
515
|
}
|
|
512
516
|
entity[field] = data[field];
|
|
513
517
|
}
|
|
518
|
+
// implements REQ-kibi-happy-path-gap
|
|
519
|
+
// A requirement with no failure side to test records why, and who
|
|
520
|
+
// accepted it; the waiver counts only once approved.
|
|
521
|
+
for (const field of [
|
|
522
|
+
"failure_side_waiver",
|
|
523
|
+
"failure_side_waiver_approved_by",
|
|
524
|
+
]) {
|
|
525
|
+
if (type !== "req" || data[field] === undefined)
|
|
526
|
+
continue;
|
|
527
|
+
if (typeof data[field] !== "string" || data[field].trim() === "") {
|
|
528
|
+
throw new FrontmatterError(`Invalid ${field}; expected a non-empty string`, filePath, {
|
|
529
|
+
classification: "Invalid Failure Side Waiver",
|
|
530
|
+
hint: "Set failure_side_waiver to why the requirement has no input or attempt to refuse, and failure_side_waiver_approved_by to the person who accepted it.",
|
|
531
|
+
});
|
|
532
|
+
}
|
|
533
|
+
entity[field] = data[field];
|
|
534
|
+
}
|
|
514
535
|
// implements REQ-core-validation-rules
|
|
515
536
|
// Why the requirement exists; requirement-rationale-missing reads it.
|
|
516
537
|
if (type === "req" && data.rationale !== undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symbol-coordinates.d.ts","sourceRoot":"","sources":["../../src/extractors/symbol-coordinates.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"symbol-coordinates.d.ts","sourceRoot":"","sources":["../../src/extractors/symbol-coordinates.ts"],"names":[],"mappings":"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"}
|
|
@@ -335,7 +335,26 @@ export function mergeCoordinatesWithManifest(symbolRecords, coordinateArtifact,
|
|
|
335
335
|
throw new CoordinateArtifactError(coordinateArtifact.reason);
|
|
336
336
|
}
|
|
337
337
|
}
|
|
338
|
-
const
|
|
338
|
+
const readSourceText = options.resolveSourceText ?? defaultResolveSourceText;
|
|
339
|
+
// Many symbols share a source file: read and hash each file once per merge.
|
|
340
|
+
const sourceTexts = new Map();
|
|
341
|
+
const resolveSourceText = (sourceFile) => {
|
|
342
|
+
if (!sourceTexts.has(sourceFile)) {
|
|
343
|
+
sourceTexts.set(sourceFile, readSourceText(sourceFile));
|
|
344
|
+
}
|
|
345
|
+
return sourceTexts.get(sourceFile) ?? null;
|
|
346
|
+
};
|
|
347
|
+
const sourceHashes = new Map();
|
|
348
|
+
const sourceHashOf = (sourceFile) => {
|
|
349
|
+
// rationale: hashing is a pure function of the text, which is read once
|
|
350
|
+
// above, so recomputing the hash changes only the time a merge takes.
|
|
351
|
+
// Stryker disable next-line ConditionalExpression
|
|
352
|
+
if (!sourceHashes.has(sourceFile)) {
|
|
353
|
+
const text = resolveSourceText(sourceFile);
|
|
354
|
+
sourceHashes.set(sourceFile, text === null ? null : coordinateSourceHash(text));
|
|
355
|
+
}
|
|
356
|
+
return sourceHashes.get(sourceFile) ?? null;
|
|
357
|
+
};
|
|
339
358
|
const rawCoordinates = coordinateArtifact?.coordinates ?? {};
|
|
340
359
|
return symbolRecords.map((symbolRecord) => {
|
|
341
360
|
const stripped = stripGeneratedFields(symbolRecord);
|
|
@@ -371,9 +390,9 @@ export function mergeCoordinatesWithManifest(symbolRecords, coordinateArtifact,
|
|
|
371
390
|
candidate.sourceFile !== recordSourceFile) {
|
|
372
391
|
return stripped;
|
|
373
392
|
}
|
|
374
|
-
const
|
|
375
|
-
|
|
376
|
-
|
|
393
|
+
const currentSourceHash = sourceHashOf(candidate.sourceFile);
|
|
394
|
+
// `sourceHash` is a valid hash here, so an unreadable file never matches.
|
|
395
|
+
if (currentSourceHash !== sourceHash) {
|
|
377
396
|
return stripped;
|
|
378
397
|
}
|
|
379
398
|
return overlaySpan(stripped, candidate);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firm-decision-edit.d.ts","sourceRoot":"","sources":["../src/firm-decision-edit.ts"],"names":[],"mappings":"AAqBA,wEAAwE;AAExE,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACxC,IAAI,EAAE,MAAM,CAAC;CACd,CAAC,CAAC;AAEH,mEAAmE;AAEnE,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,CAAC;AAiB7E;;;;;GAKG;AAEH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,gBAAgB,GACtB,kBAAkB,EAAE,CAsBtB;AAED;;;;GAIG;AAEH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAMT;AAED;;;;GAIG;AAEH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,gBAAgB,GACtB,kBAAkB,EAAE,
|
|
1
|
+
{"version":3,"file":"firm-decision-edit.d.ts","sourceRoot":"","sources":["../src/firm-decision-edit.ts"],"names":[],"mappings":"AAqBA,wEAAwE;AAExE,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACxC,IAAI,EAAE,MAAM,CAAC;CACd,CAAC,CAAC;AAEH,mEAAmE;AAEnE,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,CAAC;AAiB7E;;;;;GAKG;AAEH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,gBAAgB,GACtB,kBAAkB,EAAE,CAsBtB;AAED;;;;GAIG;AAEH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAMT;AAED;;;;GAIG;AAEH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,gBAAgB,GACtB,kBAAkB,EAAE,CAQtB;AAED,8DAA8D;AAE9D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD"}
|
|
@@ -79,9 +79,7 @@ export function unapprovedFirmEdit(before, after) {
|
|
|
79
79
|
"firm")
|
|
80
80
|
return [];
|
|
81
81
|
const changed = decisionClaimChanges(before, after);
|
|
82
|
-
|
|
83
|
-
return [];
|
|
84
|
-
return changed;
|
|
82
|
+
return citesNewHumanWords(before, after) ? [] : changed;
|
|
85
83
|
}
|
|
86
84
|
/** What to do instead of editing a firm decision in place. */
|
|
87
85
|
// implements REQ-kb-firm-decision-edit
|
package/dist/intent-search.d.ts
CHANGED
|
@@ -61,6 +61,7 @@ type GraphEdge = Readonly<{
|
|
|
61
61
|
from: string;
|
|
62
62
|
to: string;
|
|
63
63
|
}>;
|
|
64
|
+
export declare const NON_GOVERNING_STATUSES: Set<string>;
|
|
64
65
|
/** Workspace file paths the question names in its text, in order, once each. */
|
|
65
66
|
export declare function questionPaths(query: string): string[];
|
|
66
67
|
/** The signal tokens intent ranking compares (stop words dropped, stemmed). */
|
|
@@ -69,7 +70,10 @@ export declare function intentTokens(value: string): readonly string[];
|
|
|
69
70
|
export type MarkdownBodyCache = Map<string, string | null>;
|
|
70
71
|
export declare function rankIntentEntities(entities: readonly Record<string, unknown>[], options: IntentSearchOptions, workspaceRoot: string, graphEdges?: readonly GraphEdge[], bodyCache?: MarkdownBodyCache): Promise<IntentSearchResult>;
|
|
71
72
|
export declare function graphGoal(seedIds: readonly string[], depth: 1 | 2): string;
|
|
72
|
-
export declare function
|
|
73
|
+
export declare function queryGraphEdges(prolog: Pick<PrologPort, "query">, seedIds: readonly string[]): Promise<GraphEdge[]>;
|
|
74
|
+
export declare function executeIntentSearch(options: IntentSearchOptions, prolog: PrologPort, workspaceRoot: string,
|
|
75
|
+
/** Receives the candidate rows and bodies the ranking read, for reuse. */
|
|
76
|
+
onCorpus?: (entities: readonly Record<string, unknown>[], bodies: MarkdownBodyCache) => void): Promise<IntentSearchResult>;
|
|
73
77
|
export declare function validateIntentSearchInput(input: IntentSearchOptions): void;
|
|
74
78
|
export {};
|
|
75
79
|
//# sourceMappingURL=intent-search.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intent-search.d.ts","sourceRoot":"","sources":["../src/intent-search.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,kBAAkB,EAIxB,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"intent-search.d.ts","sourceRoot":"","sources":["../src/intent-search.ts"],"names":[],"mappings":"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"}
|