open-multi-agent-kit 0.90.6 → 0.90.8
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/CHANGELOG.md +37 -1
- package/README.md +11 -10
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +2 -2
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-session.d.ts +3 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +26 -3
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/command-safety.d.ts.map +1 -1
- package/dist/core/command-safety.js +7 -0
- package/dist/core/command-safety.js.map +1 -1
- package/dist/core/context-budget-headroom.d.ts.map +1 -1
- package/dist/core/context-budget-headroom.js +5 -1
- package/dist/core/context-budget-headroom.js.map +1 -1
- package/dist/core/context-budget-v2-cache-provider.d.ts +4 -2
- package/dist/core/context-budget-v2-cache-provider.d.ts.map +1 -1
- package/dist/core/context-budget-v2-cache-provider.js +9 -5
- package/dist/core/context-budget-v2-cache-provider.js.map +1 -1
- package/dist/core/context-budget-v2-selection.d.ts.map +1 -1
- package/dist/core/context-budget-v2-selection.js +9 -0
- package/dist/core/context-budget-v2-selection.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +4 -0
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/types.d.ts +2 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/loop-gates.d.ts.map +1 -1
- package/dist/core/loop-gates.js +25 -1
- package/dist/core/loop-gates.js.map +1 -1
- package/dist/core/pi-package-intake.d.ts +1 -0
- package/dist/core/pi-package-intake.d.ts.map +1 -1
- package/dist/core/pi-package-intake.js +7 -0
- package/dist/core/pi-package-intake.js.map +1 -1
- package/dist/core/reasoning-router-v4-normalize.d.ts +11 -0
- package/dist/core/reasoning-router-v4-normalize.d.ts.map +1 -0
- package/dist/core/reasoning-router-v4-normalize.js +224 -0
- package/dist/core/reasoning-router-v4-normalize.js.map +1 -0
- package/dist/core/reasoning-router-v4-weights.d.ts +13 -5
- package/dist/core/reasoning-router-v4-weights.d.ts.map +1 -1
- package/dist/core/reasoning-router-v4-weights.js +8 -4
- package/dist/core/reasoning-router-v4-weights.js.map +1 -1
- package/dist/core/reasoning-router-v4.d.ts +3 -3
- package/dist/core/reasoning-router-v4.d.ts.map +1 -1
- package/dist/core/reasoning-router-v4.js +394 -58
- package/dist/core/reasoning-router-v4.js.map +1 -1
- package/dist/core/router-feedback-collector.d.ts +1 -1
- package/dist/core/router-feedback-collector.d.ts.map +1 -1
- package/dist/core/router-feedback-collector.js +9 -1
- package/dist/core/router-feedback-collector.js.map +1 -1
- package/dist/core/settings-manager.d.ts +13 -3
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +15 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/guardrails/evidence-system.d.ts +8 -1
- package/dist/guardrails/evidence-system.d.ts.map +1 -1
- package/dist/guardrails/evidence-system.js +154 -16
- package/dist/guardrails/evidence-system.js.map +1 -1
- package/dist/modes/interactive/components/control-panel-layout.d.ts.map +1 -1
- package/dist/modes/interactive/components/control-panel-layout.js +1 -1
- package/dist/modes/interactive/components/control-panel-layout.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +1 -1
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +1 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +1 -0
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +2 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/types/evidence.d.ts +4 -0
- package/dist/types/evidence.d.ts.map +1 -1
- package/dist/types/evidence.js.map +1 -1
- package/docs/adaptorch-preview.md +84 -0
- package/docs/compaction.md +6 -0
- package/docs/loadout-domains/frontend-ui.md +5 -1
- package/docs/providers.md +6 -0
- package/docs/settings.md +17 -2
- package/examples/extensions/correctness-wall/README.md +6 -6
- package/examples/extensions/correctness-wall/index.ts +37 -11
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/preset.ts +2 -2
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +12 -12
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi-package-intake.d.ts","sourceRoot":"","sources":["../../src/core/pi-package-intake.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,iBAAiB,EAAoB,MAAM,0BAA0B,CAAC;AACnG,OAAO,EAGN,KAAK,6BAA6B,EAClC,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC3B,MAAM,mCAAmC,CAAC;AAE3C,YAAY,EACX,6BAA6B,EAC7B,aAAa,EACb,sBAAsB,EACtB,iBAAiB,GACjB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,6BAA6B,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAC;AAEjH;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,EAAE,SAAS,sBAAsB,EAG3E,CAAC;AAEF,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACxD,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,6BAA6B,EAAE,CAAC;IAC5D,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACnD;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,yBAAyB,EAAE,OAAO,CAAC;CAC5C;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,OAAO,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACnD,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;CACzC;AAuBD,wBAAgB,uBAAuB,CAAC,KAAK,GAAE,oBAAyB,GAAG,qBAAqB,CAO/F;AAED,wBAAgB,0BAA0B,CACzC,UAAU,EAAE,sBAAsB,EAClC,WAAW,CAAC,EAAE,6BAA6B,EAC3C,GAAG,CAAC,EAAE,IAAI,GACR,qBAAqB,CAkBvB;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,SAAS,qBAAqB,EAAE,GAAG,sBAAsB,
|
|
1
|
+
{"version":3,"file":"pi-package-intake.d.ts","sourceRoot":"","sources":["../../src/core/pi-package-intake.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,iBAAiB,EAAoB,MAAM,0BAA0B,CAAC;AACnG,OAAO,EAGN,KAAK,6BAA6B,EAClC,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC3B,MAAM,mCAAmC,CAAC;AAE3C,YAAY,EACX,6BAA6B,EAC7B,aAAa,EACb,sBAAsB,EACtB,iBAAiB,GACjB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,6BAA6B,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAC;AAEjH;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,EAAE,SAAS,sBAAsB,EAG3E,CAAC;AAEF,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACxD,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,6BAA6B,EAAE,CAAC;IAC5D,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACnD;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,yBAAyB,EAAE,OAAO,CAAC;CAC5C;AAED,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,OAAO,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACnD,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;CACzC;AAuBD,wBAAgB,uBAAuB,CAAC,KAAK,GAAE,oBAAyB,GAAG,qBAAqB,CAO/F;AAED,wBAAgB,0BAA0B,CACzC,UAAU,EAAE,sBAAsB,EAClC,WAAW,CAAC,EAAE,6BAA6B,EAC3C,GAAG,CAAC,EAAE,IAAI,GACR,qBAAqB,CAkBvB;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,SAAS,qBAAqB,EAAE,GAAG,sBAAsB,CAsD1G","sourcesContent":["import { type Adoption, type ProcurementReview, procureCandidate } from \"./package-procurement.ts\";\nimport {\n\tP0_PI_PACKAGE_PORT_CANDIDATES,\n\tP1_PI_PACKAGE_PORT_CANDIDATES,\n\ttype PiPackageCandidateReviewInput,\n\ttype PiPackageLane,\n\ttype PiPackagePortCandidate,\n} from \"./pi-package-intake-candidates.ts\";\n\nexport type {\n\tPiPackageCandidateReviewInput,\n\tPiPackageLane,\n\tPiPackagePortCandidate,\n\tPiPackagePortMode,\n} from \"./pi-package-intake-candidates.ts\";\nexport { P0_PI_PACKAGE_PORT_CANDIDATES, P1_PI_PACKAGE_PORT_CANDIDATES } from \"./pi-package-intake-candidates.ts\";\n\n/**\n * Combined default candidate set (P0 + P1). P1 was drawn from a full crawl of\n * pi.dev/packages (4653 unique packages) and is intentionally more conservative\n * (reference/measurement-gated/report-only only, never native) since no source-level\n * review has been run on any P1 candidate yet.\n */\nexport const ALL_PI_PACKAGE_PORT_CANDIDATES: readonly PiPackagePortCandidate[] = [\n\t...P0_PI_PACKAGE_PORT_CANDIDATES,\n\t...P1_PI_PACKAGE_PORT_CANDIDATES,\n];\n\nexport interface PiPackageIntakeInput {\n\treadonly candidates?: readonly PiPackagePortCandidate[];\n\treadonly reviews?: readonly PiPackageCandidateReviewInput[];\n\treadonly now?: Date;\n}\n\nexport interface PiPackageLaneSummary {\n\treadonly lane: PiPackageLane;\n\treadonly label: string;\n\treadonly total: number;\n\treadonly accepted: number;\n\treadonly deferred: number;\n\treadonly reject: number;\n\treadonly hardForkBlocked: number;\n}\n\nexport interface PiPackageIntakeSummary {\n\treadonly total: number;\n\treadonly acceptedNative: number;\n\treadonly acceptedReference: number;\n\treadonly acceptedMeasurement: number;\n\treadonly acceptedAdvisory: number;\n\treadonly deferred: number;\n\treadonly reject: number;\n\treadonly hardForkBlocked: number;\n\treadonly topLanes: readonly PiPackageLaneSummary[];\n}\n\nexport interface PiPackageIntakeResult {\n\treadonly definition: PiPackagePortCandidate;\n\treadonly review: ProcurementReview;\n\treadonly hardForkBlocked: boolean;\n\treadonly hardForkReasons: readonly string[];\n\treadonly directPermanentPiAdoption: boolean;\n}\n\nexport interface PiPackageIntakeReport {\n\treadonly results: readonly PiPackageIntakeResult[];\n\treadonly summary: PiPackageIntakeSummary;\n}\n\nconst HARD_FORK_FINDING_KINDS = new Set([\n\t\"legacy-home-path\",\n\t\"legacy-state-dir\",\n\t\"legacy-project-path\",\n\t\"legacy-package-path\",\n\t\"legacy-cli-invocation\",\n\t\"legacy-import\",\n]);\n\nconst DIRECT_PI_ADOPTION_BLOCKED = new Set<Adoption>([\"permanent-package\"]);\n\ninterface MutablePiPackageLaneSummary {\n\tlane: PiPackageLane;\n\tlabel: string;\n\ttotal: number;\n\taccepted: number;\n\tdeferred: number;\n\treject: number;\n\thardForkBlocked: number;\n}\n\nexport function evaluatePiPackageIntake(input: PiPackageIntakeInput = {}): PiPackageIntakeReport {\n\tconst candidates = input.candidates ?? ALL_PI_PACKAGE_PORT_CANDIDATES;\n\tconst reviewInputs = new Map((input.reviews ?? []).map((review) => [review.candidateId, review]));\n\tconst results = candidates.map((definition) =>\n\t\tevaluatePiPackageCandidate(definition, reviewInputs.get(definition.id), input.now),\n\t);\n\treturn { results, summary: summarizePiPackageIntake(results) };\n}\n\nexport function evaluatePiPackageCandidate(\n\tdefinition: PiPackagePortCandidate,\n\treviewInput?: PiPackageCandidateReviewInput,\n\tnow?: Date,\n): PiPackageIntakeResult {\n\tconst review = procureCandidate({\n\t\tcandidate: definition.candidate,\n\t\tdeclaredLicense: reviewInput?.declaredLicense ?? \"MIT\",\n\t\tpackageJsonScripts: reviewInput?.packageJsonScripts,\n\t\treviewedScriptAllowlist: reviewInput?.reviewedScriptAllowlist,\n\t\tsources: reviewInput?.sources,\n\t\ttransitiveLicenses: reviewInput?.transitiveLicenses,\n\t\tnow,\n\t});\n\tconst hardForkReasons = hardForkBlockReasons(review);\n\treturn {\n\t\tdefinition,\n\t\treview,\n\t\thardForkBlocked: hardForkReasons.length > 0,\n\t\thardForkReasons,\n\t\tdirectPermanentPiAdoption: isDirectPermanentPiAdoption(definition, review),\n\t};\n}\n\nexport function summarizePiPackageIntake(results: readonly PiPackageIntakeResult[]): PiPackageIntakeSummary {\n\tconst laneSummaries = new Map<PiPackageLane, MutablePiPackageLaneSummary>();\n\tlet acceptedNative = 0;\n\tlet acceptedReference = 0;\n\tlet acceptedMeasurement = 0;\n\tlet acceptedAdvisory = 0;\n\tlet deferred = 0;\n\tlet reject = 0;\n\tlet hardForkBlocked = 0;\n\n\tfor (const result of results) {\n\t\tconst lane = laneSummaries.get(result.definition.lane) ?? laneSummaryFor(result);\n\t\tlaneSummaries.set(result.definition.lane, lane);\n\t\tlane.total += 1;\n\n\t\tif (result.hardForkBlocked) {\n\t\t\thardForkBlocked += 1;\n\t\t\tlane.hardForkBlocked += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (result.review.adoption === \"native\") {\n\t\t\tacceptedNative += 1;\n\t\t\tlane.accepted += 1;\n\t\t} else if (result.review.adoption === \"reference-only\") {\n\t\t\tacceptedReference += 1;\n\t\t\tlane.accepted += 1;\n\t\t} else if (result.review.adoption === \"measurement-gated\") {\n\t\t\tacceptedMeasurement += 1;\n\t\t\tlane.accepted += 1;\n\t\t} else if (result.review.adoption === \"advisory-only\" || result.review.adoption === \"report-only\") {\n\t\t\t// Accepted read-only ports (advisor/quality lanes); connected, never mutating.\n\t\t\tacceptedAdvisory += 1;\n\t\t\tlane.accepted += 1;\n\t\t} else if (result.review.adoption === \"deferred\") {\n\t\t\tdeferred += 1;\n\t\t\tlane.deferred += 1;\n\t\t} else if (result.review.adoption === \"reject\") {\n\t\t\treject += 1;\n\t\t\tlane.reject += 1;\n\t\t}\n\t}\n\n\treturn {\n\t\ttotal: results.length,\n\t\tacceptedNative,\n\t\tacceptedReference,\n\t\tacceptedMeasurement,\n\t\tacceptedAdvisory,\n\t\tdeferred,\n\t\treject,\n\t\thardForkBlocked,\n\t\ttopLanes: [...laneSummaries.values()].sort(compareLaneSummaries).map((lane) => ({ ...lane })),\n\t};\n}\n\nfunction hardForkBlockReasons(review: ProcurementReview): string[] {\n\tconst reasons = review.compatibilityFindings\n\t\t.filter((finding) => finding.severity === \"block\" && HARD_FORK_FINDING_KINDS.has(finding.kind))\n\t\t.map((finding) => `${finding.kind}:${finding.path ?? \"source\"}:${finding.line}`);\n\tif (review.lifecycleVerdict === \"reject\") {\n\t\treasons.push(...review.declaredLifecycleScripts.map((script) => `lifecycle-script:${script}`));\n\t}\n\treturn [...new Set(reasons)];\n}\n\nfunction isDirectPermanentPiAdoption(definition: PiPackagePortCandidate, review: ProcurementReview): boolean {\n\treturn definition.candidate.intendedUse === \"permanent-adopt\" || DIRECT_PI_ADOPTION_BLOCKED.has(review.adoption);\n}\n\nfunction laneSummaryFor(result: PiPackageIntakeResult): MutablePiPackageLaneSummary {\n\treturn {\n\t\tlane: result.definition.lane,\n\t\tlabel: result.definition.laneLabel,\n\t\ttotal: 0,\n\t\taccepted: 0,\n\t\tdeferred: 0,\n\t\treject: 0,\n\t\thardForkBlocked: 0,\n\t};\n}\n\nfunction compareLaneSummaries(a: PiPackageLaneSummary, b: PiPackageLaneSummary): number {\n\tconst acceptedDelta = b.accepted - a.accepted;\n\tif (acceptedDelta !== 0) return acceptedDelta;\n\tconst totalDelta = b.total - a.total;\n\tif (totalDelta !== 0) return totalDelta;\n\treturn laneRank(a.lane) - laneRank(b.lane);\n}\n\nfunction laneRank(lane: PiPackageLane): number {\n\treturn ALL_PI_PACKAGE_PORT_CANDIDATES.findIndex((candidate) => candidate.lane === lane);\n}\n"]}
|
|
@@ -50,6 +50,7 @@ export function summarizePiPackageIntake(results) {
|
|
|
50
50
|
let acceptedNative = 0;
|
|
51
51
|
let acceptedReference = 0;
|
|
52
52
|
let acceptedMeasurement = 0;
|
|
53
|
+
let acceptedAdvisory = 0;
|
|
53
54
|
let deferred = 0;
|
|
54
55
|
let reject = 0;
|
|
55
56
|
let hardForkBlocked = 0;
|
|
@@ -74,6 +75,11 @@ export function summarizePiPackageIntake(results) {
|
|
|
74
75
|
acceptedMeasurement += 1;
|
|
75
76
|
lane.accepted += 1;
|
|
76
77
|
}
|
|
78
|
+
else if (result.review.adoption === "advisory-only" || result.review.adoption === "report-only") {
|
|
79
|
+
// Accepted read-only ports (advisor/quality lanes); connected, never mutating.
|
|
80
|
+
acceptedAdvisory += 1;
|
|
81
|
+
lane.accepted += 1;
|
|
82
|
+
}
|
|
77
83
|
else if (result.review.adoption === "deferred") {
|
|
78
84
|
deferred += 1;
|
|
79
85
|
lane.deferred += 1;
|
|
@@ -88,6 +94,7 @@ export function summarizePiPackageIntake(results) {
|
|
|
88
94
|
acceptedNative,
|
|
89
95
|
acceptedReference,
|
|
90
96
|
acceptedMeasurement,
|
|
97
|
+
acceptedAdvisory,
|
|
91
98
|
deferred,
|
|
92
99
|
reject,
|
|
93
100
|
hardForkBlocked,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi-package-intake.js","sourceRoot":"","sources":["../../src/core/pi-package-intake.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Adoption, type ProcurementReview, procureCandidate } from \"./package-procurement.ts\";\nimport {\n\tP0_PI_PACKAGE_PORT_CANDIDATES,\n\tP1_PI_PACKAGE_PORT_CANDIDATES,\n\ttype PiPackageCandidateReviewInput,\n\ttype PiPackageLane,\n\ttype PiPackagePortCandidate,\n} from \"./pi-package-intake-candidates.ts\";\n\nexport type {\n\tPiPackageCandidateReviewInput,\n\tPiPackageLane,\n\tPiPackagePortCandidate,\n\tPiPackagePortMode,\n} from \"./pi-package-intake-candidates.ts\";\nexport { P0_PI_PACKAGE_PORT_CANDIDATES, P1_PI_PACKAGE_PORT_CANDIDATES } from \"./pi-package-intake-candidates.ts\";\n\n/**\n * Combined default candidate set (P0 + P1). P1 was drawn from a full crawl of\n * pi.dev/packages (4653 unique packages) and is intentionally more conservative\n * (reference/measurement-gated/report-only only, never native) since no source-level\n * review has been run on any P1 candidate yet.\n */\nexport const ALL_PI_PACKAGE_PORT_CANDIDATES: readonly PiPackagePortCandidate[] = [\n\t...P0_PI_PACKAGE_PORT_CANDIDATES,\n\t...P1_PI_PACKAGE_PORT_CANDIDATES,\n];\n\nexport interface PiPackageIntakeInput {\n\treadonly candidates?: readonly PiPackagePortCandidate[];\n\treadonly reviews?: readonly PiPackageCandidateReviewInput[];\n\treadonly now?: Date;\n}\n\nexport interface PiPackageLaneSummary {\n\treadonly lane: PiPackageLane;\n\treadonly label: string;\n\treadonly total: number;\n\treadonly accepted: number;\n\treadonly deferred: number;\n\treadonly reject: number;\n\treadonly hardForkBlocked: number;\n}\n\nexport interface PiPackageIntakeSummary {\n\treadonly total: number;\n\treadonly acceptedNative: number;\n\treadonly acceptedReference: number;\n\treadonly acceptedMeasurement: number;\n\treadonly deferred: number;\n\treadonly reject: number;\n\treadonly hardForkBlocked: number;\n\treadonly topLanes: readonly PiPackageLaneSummary[];\n}\n\nexport interface PiPackageIntakeResult {\n\treadonly definition: PiPackagePortCandidate;\n\treadonly review: ProcurementReview;\n\treadonly hardForkBlocked: boolean;\n\treadonly hardForkReasons: readonly string[];\n\treadonly directPermanentPiAdoption: boolean;\n}\n\nexport interface PiPackageIntakeReport {\n\treadonly results: readonly PiPackageIntakeResult[];\n\treadonly summary: PiPackageIntakeSummary;\n}\n\nconst HARD_FORK_FINDING_KINDS = new Set([\n\t\"legacy-home-path\",\n\t\"legacy-state-dir\",\n\t\"legacy-project-path\",\n\t\"legacy-package-path\",\n\t\"legacy-cli-invocation\",\n\t\"legacy-import\",\n]);\n\nconst DIRECT_PI_ADOPTION_BLOCKED = new Set<Adoption>([\"permanent-package\"]);\n\ninterface MutablePiPackageLaneSummary {\n\tlane: PiPackageLane;\n\tlabel: string;\n\ttotal: number;\n\taccepted: number;\n\tdeferred: number;\n\treject: number;\n\thardForkBlocked: number;\n}\n\nexport function evaluatePiPackageIntake(input: PiPackageIntakeInput = {}): PiPackageIntakeReport {\n\tconst candidates = input.candidates ?? ALL_PI_PACKAGE_PORT_CANDIDATES;\n\tconst reviewInputs = new Map((input.reviews ?? []).map((review) => [review.candidateId, review]));\n\tconst results = candidates.map((definition) =>\n\t\tevaluatePiPackageCandidate(definition, reviewInputs.get(definition.id), input.now),\n\t);\n\treturn { results, summary: summarizePiPackageIntake(results) };\n}\n\nexport function evaluatePiPackageCandidate(\n\tdefinition: PiPackagePortCandidate,\n\treviewInput?: PiPackageCandidateReviewInput,\n\tnow?: Date,\n): PiPackageIntakeResult {\n\tconst review = procureCandidate({\n\t\tcandidate: definition.candidate,\n\t\tdeclaredLicense: reviewInput?.declaredLicense ?? \"MIT\",\n\t\tpackageJsonScripts: reviewInput?.packageJsonScripts,\n\t\treviewedScriptAllowlist: reviewInput?.reviewedScriptAllowlist,\n\t\tsources: reviewInput?.sources,\n\t\ttransitiveLicenses: reviewInput?.transitiveLicenses,\n\t\tnow,\n\t});\n\tconst hardForkReasons = hardForkBlockReasons(review);\n\treturn {\n\t\tdefinition,\n\t\treview,\n\t\thardForkBlocked: hardForkReasons.length > 0,\n\t\thardForkReasons,\n\t\tdirectPermanentPiAdoption: isDirectPermanentPiAdoption(definition, review),\n\t};\n}\n\nexport function summarizePiPackageIntake(results: readonly PiPackageIntakeResult[]): PiPackageIntakeSummary {\n\tconst laneSummaries = new Map<PiPackageLane, MutablePiPackageLaneSummary>();\n\tlet acceptedNative = 0;\n\tlet acceptedReference = 0;\n\tlet acceptedMeasurement = 0;\n\tlet deferred = 0;\n\tlet reject = 0;\n\tlet hardForkBlocked = 0;\n\n\tfor (const result of results) {\n\t\tconst lane = laneSummaries.get(result.definition.lane) ?? laneSummaryFor(result);\n\t\tlaneSummaries.set(result.definition.lane, lane);\n\t\tlane.total += 1;\n\n\t\tif (result.hardForkBlocked) {\n\t\t\thardForkBlocked += 1;\n\t\t\tlane.hardForkBlocked += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (result.review.adoption === \"native\") {\n\t\t\tacceptedNative += 1;\n\t\t\tlane.accepted += 1;\n\t\t} else if (result.review.adoption === \"reference-only\") {\n\t\t\tacceptedReference += 1;\n\t\t\tlane.accepted += 1;\n\t\t} else if (result.review.adoption === \"measurement-gated\") {\n\t\t\tacceptedMeasurement += 1;\n\t\t\tlane.accepted += 1;\n\t\t} else if (result.review.adoption === \"deferred\") {\n\t\t\tdeferred += 1;\n\t\t\tlane.deferred += 1;\n\t\t} else if (result.review.adoption === \"reject\") {\n\t\t\treject += 1;\n\t\t\tlane.reject += 1;\n\t\t}\n\t}\n\n\treturn {\n\t\ttotal: results.length,\n\t\tacceptedNative,\n\t\tacceptedReference,\n\t\tacceptedMeasurement,\n\t\tdeferred,\n\t\treject,\n\t\thardForkBlocked,\n\t\ttopLanes: [...laneSummaries.values()].sort(compareLaneSummaries).map((lane) => ({ ...lane })),\n\t};\n}\n\nfunction hardForkBlockReasons(review: ProcurementReview): string[] {\n\tconst reasons = review.compatibilityFindings\n\t\t.filter((finding) => finding.severity === \"block\" && HARD_FORK_FINDING_KINDS.has(finding.kind))\n\t\t.map((finding) => `${finding.kind}:${finding.path ?? \"source\"}:${finding.line}`);\n\tif (review.lifecycleVerdict === \"reject\") {\n\t\treasons.push(...review.declaredLifecycleScripts.map((script) => `lifecycle-script:${script}`));\n\t}\n\treturn [...new Set(reasons)];\n}\n\nfunction isDirectPermanentPiAdoption(definition: PiPackagePortCandidate, review: ProcurementReview): boolean {\n\treturn definition.candidate.intendedUse === \"permanent-adopt\" || DIRECT_PI_ADOPTION_BLOCKED.has(review.adoption);\n}\n\nfunction laneSummaryFor(result: PiPackageIntakeResult): MutablePiPackageLaneSummary {\n\treturn {\n\t\tlane: result.definition.lane,\n\t\tlabel: result.definition.laneLabel,\n\t\ttotal: 0,\n\t\taccepted: 0,\n\t\tdeferred: 0,\n\t\treject: 0,\n\t\thardForkBlocked: 0,\n\t};\n}\n\nfunction compareLaneSummaries(a: PiPackageLaneSummary, b: PiPackageLaneSummary): number {\n\tconst acceptedDelta = b.accepted - a.accepted;\n\tif (acceptedDelta !== 0) return acceptedDelta;\n\tconst totalDelta = b.total - a.total;\n\tif (totalDelta !== 0) return totalDelta;\n\treturn laneRank(a.lane) - laneRank(b.lane);\n}\n\nfunction laneRank(lane: PiPackageLane): number {\n\treturn ALL_PI_PACKAGE_PORT_CANDIDATES.findIndex((candidate) => candidate.lane === lane);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"pi-package-intake.js","sourceRoot":"","sources":["../../src/core/pi-package-intake.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Adoption, type ProcurementReview, procureCandidate } from \"./package-procurement.ts\";\nimport {\n\tP0_PI_PACKAGE_PORT_CANDIDATES,\n\tP1_PI_PACKAGE_PORT_CANDIDATES,\n\ttype PiPackageCandidateReviewInput,\n\ttype PiPackageLane,\n\ttype PiPackagePortCandidate,\n} from \"./pi-package-intake-candidates.ts\";\n\nexport type {\n\tPiPackageCandidateReviewInput,\n\tPiPackageLane,\n\tPiPackagePortCandidate,\n\tPiPackagePortMode,\n} from \"./pi-package-intake-candidates.ts\";\nexport { P0_PI_PACKAGE_PORT_CANDIDATES, P1_PI_PACKAGE_PORT_CANDIDATES } from \"./pi-package-intake-candidates.ts\";\n\n/**\n * Combined default candidate set (P0 + P1). P1 was drawn from a full crawl of\n * pi.dev/packages (4653 unique packages) and is intentionally more conservative\n * (reference/measurement-gated/report-only only, never native) since no source-level\n * review has been run on any P1 candidate yet.\n */\nexport const ALL_PI_PACKAGE_PORT_CANDIDATES: readonly PiPackagePortCandidate[] = [\n\t...P0_PI_PACKAGE_PORT_CANDIDATES,\n\t...P1_PI_PACKAGE_PORT_CANDIDATES,\n];\n\nexport interface PiPackageIntakeInput {\n\treadonly candidates?: readonly PiPackagePortCandidate[];\n\treadonly reviews?: readonly PiPackageCandidateReviewInput[];\n\treadonly now?: Date;\n}\n\nexport interface PiPackageLaneSummary {\n\treadonly lane: PiPackageLane;\n\treadonly label: string;\n\treadonly total: number;\n\treadonly accepted: number;\n\treadonly deferred: number;\n\treadonly reject: number;\n\treadonly hardForkBlocked: number;\n}\n\nexport interface PiPackageIntakeSummary {\n\treadonly total: number;\n\treadonly acceptedNative: number;\n\treadonly acceptedReference: number;\n\treadonly acceptedMeasurement: number;\n\treadonly acceptedAdvisory: number;\n\treadonly deferred: number;\n\treadonly reject: number;\n\treadonly hardForkBlocked: number;\n\treadonly topLanes: readonly PiPackageLaneSummary[];\n}\n\nexport interface PiPackageIntakeResult {\n\treadonly definition: PiPackagePortCandidate;\n\treadonly review: ProcurementReview;\n\treadonly hardForkBlocked: boolean;\n\treadonly hardForkReasons: readonly string[];\n\treadonly directPermanentPiAdoption: boolean;\n}\n\nexport interface PiPackageIntakeReport {\n\treadonly results: readonly PiPackageIntakeResult[];\n\treadonly summary: PiPackageIntakeSummary;\n}\n\nconst HARD_FORK_FINDING_KINDS = new Set([\n\t\"legacy-home-path\",\n\t\"legacy-state-dir\",\n\t\"legacy-project-path\",\n\t\"legacy-package-path\",\n\t\"legacy-cli-invocation\",\n\t\"legacy-import\",\n]);\n\nconst DIRECT_PI_ADOPTION_BLOCKED = new Set<Adoption>([\"permanent-package\"]);\n\ninterface MutablePiPackageLaneSummary {\n\tlane: PiPackageLane;\n\tlabel: string;\n\ttotal: number;\n\taccepted: number;\n\tdeferred: number;\n\treject: number;\n\thardForkBlocked: number;\n}\n\nexport function evaluatePiPackageIntake(input: PiPackageIntakeInput = {}): PiPackageIntakeReport {\n\tconst candidates = input.candidates ?? ALL_PI_PACKAGE_PORT_CANDIDATES;\n\tconst reviewInputs = new Map((input.reviews ?? []).map((review) => [review.candidateId, review]));\n\tconst results = candidates.map((definition) =>\n\t\tevaluatePiPackageCandidate(definition, reviewInputs.get(definition.id), input.now),\n\t);\n\treturn { results, summary: summarizePiPackageIntake(results) };\n}\n\nexport function evaluatePiPackageCandidate(\n\tdefinition: PiPackagePortCandidate,\n\treviewInput?: PiPackageCandidateReviewInput,\n\tnow?: Date,\n): PiPackageIntakeResult {\n\tconst review = procureCandidate({\n\t\tcandidate: definition.candidate,\n\t\tdeclaredLicense: reviewInput?.declaredLicense ?? \"MIT\",\n\t\tpackageJsonScripts: reviewInput?.packageJsonScripts,\n\t\treviewedScriptAllowlist: reviewInput?.reviewedScriptAllowlist,\n\t\tsources: reviewInput?.sources,\n\t\ttransitiveLicenses: reviewInput?.transitiveLicenses,\n\t\tnow,\n\t});\n\tconst hardForkReasons = hardForkBlockReasons(review);\n\treturn {\n\t\tdefinition,\n\t\treview,\n\t\thardForkBlocked: hardForkReasons.length > 0,\n\t\thardForkReasons,\n\t\tdirectPermanentPiAdoption: isDirectPermanentPiAdoption(definition, review),\n\t};\n}\n\nexport function summarizePiPackageIntake(results: readonly PiPackageIntakeResult[]): PiPackageIntakeSummary {\n\tconst laneSummaries = new Map<PiPackageLane, MutablePiPackageLaneSummary>();\n\tlet acceptedNative = 0;\n\tlet acceptedReference = 0;\n\tlet acceptedMeasurement = 0;\n\tlet acceptedAdvisory = 0;\n\tlet deferred = 0;\n\tlet reject = 0;\n\tlet hardForkBlocked = 0;\n\n\tfor (const result of results) {\n\t\tconst lane = laneSummaries.get(result.definition.lane) ?? laneSummaryFor(result);\n\t\tlaneSummaries.set(result.definition.lane, lane);\n\t\tlane.total += 1;\n\n\t\tif (result.hardForkBlocked) {\n\t\t\thardForkBlocked += 1;\n\t\t\tlane.hardForkBlocked += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (result.review.adoption === \"native\") {\n\t\t\tacceptedNative += 1;\n\t\t\tlane.accepted += 1;\n\t\t} else if (result.review.adoption === \"reference-only\") {\n\t\t\tacceptedReference += 1;\n\t\t\tlane.accepted += 1;\n\t\t} else if (result.review.adoption === \"measurement-gated\") {\n\t\t\tacceptedMeasurement += 1;\n\t\t\tlane.accepted += 1;\n\t\t} else if (result.review.adoption === \"advisory-only\" || result.review.adoption === \"report-only\") {\n\t\t\t// Accepted read-only ports (advisor/quality lanes); connected, never mutating.\n\t\t\tacceptedAdvisory += 1;\n\t\t\tlane.accepted += 1;\n\t\t} else if (result.review.adoption === \"deferred\") {\n\t\t\tdeferred += 1;\n\t\t\tlane.deferred += 1;\n\t\t} else if (result.review.adoption === \"reject\") {\n\t\t\treject += 1;\n\t\t\tlane.reject += 1;\n\t\t}\n\t}\n\n\treturn {\n\t\ttotal: results.length,\n\t\tacceptedNative,\n\t\tacceptedReference,\n\t\tacceptedMeasurement,\n\t\tacceptedAdvisory,\n\t\tdeferred,\n\t\treject,\n\t\thardForkBlocked,\n\t\ttopLanes: [...laneSummaries.values()].sort(compareLaneSummaries).map((lane) => ({ ...lane })),\n\t};\n}\n\nfunction hardForkBlockReasons(review: ProcurementReview): string[] {\n\tconst reasons = review.compatibilityFindings\n\t\t.filter((finding) => finding.severity === \"block\" && HARD_FORK_FINDING_KINDS.has(finding.kind))\n\t\t.map((finding) => `${finding.kind}:${finding.path ?? \"source\"}:${finding.line}`);\n\tif (review.lifecycleVerdict === \"reject\") {\n\t\treasons.push(...review.declaredLifecycleScripts.map((script) => `lifecycle-script:${script}`));\n\t}\n\treturn [...new Set(reasons)];\n}\n\nfunction isDirectPermanentPiAdoption(definition: PiPackagePortCandidate, review: ProcurementReview): boolean {\n\treturn definition.candidate.intendedUse === \"permanent-adopt\" || DIRECT_PI_ADOPTION_BLOCKED.has(review.adoption);\n}\n\nfunction laneSummaryFor(result: PiPackageIntakeResult): MutablePiPackageLaneSummary {\n\treturn {\n\t\tlane: result.definition.lane,\n\t\tlabel: result.definition.laneLabel,\n\t\ttotal: 0,\n\t\taccepted: 0,\n\t\tdeferred: 0,\n\t\treject: 0,\n\t\thardForkBlocked: 0,\n\t};\n}\n\nfunction compareLaneSummaries(a: PiPackageLaneSummary, b: PiPackageLaneSummary): number {\n\tconst acceptedDelta = b.accepted - a.accepted;\n\tif (acceptedDelta !== 0) return acceptedDelta;\n\tconst totalDelta = b.total - a.total;\n\tif (totalDelta !== 0) return totalDelta;\n\treturn laneRank(a.lane) - laneRank(b.lane);\n}\n\nfunction laneRank(lane: PiPackageLane): number {\n\treturn ALL_PI_PACKAGE_PORT_CANDIDATES.findIndex((candidate) => candidate.lane === lane);\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { TaskClassV4 } from "./reasoning-router-v4-weights.ts";
|
|
2
|
+
type EvidenceResultV4 = {
|
|
3
|
+
readonly clusterMatch: Readonly<Record<TaskClassV4, boolean>>;
|
|
4
|
+
readonly skeletonMatch: Readonly<Record<TaskClassV4, boolean>>;
|
|
5
|
+
readonly deferredClasses: readonly TaskClassV4[];
|
|
6
|
+
readonly featureIds: readonly string[];
|
|
7
|
+
};
|
|
8
|
+
export declare function normalizeIntentTokensV4(text: string): readonly string[];
|
|
9
|
+
export declare function extractGeneralizedIntentEvidenceV4(text: string): EvidenceResultV4;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=reasoning-router-v4-normalize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoning-router-v4-normalize.d.ts","sourceRoot":"","sources":["../../src/core/reasoning-router-v4-normalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAEpE,KAAK,gBAAgB,GAAG;IACvB,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAC9D,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/D,QAAQ,CAAC,eAAe,EAAE,SAAS,WAAW,EAAE,CAAC;IACjD,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC,CAAC;AA+GF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAUvE;AA2ED,wBAAgB,kCAAkC,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CA8CjF","sourcesContent":["import type { TaskClassV4 } from \"./reasoning-router-v4-weights.ts\";\n\ntype EvidenceResultV4 = {\n\treadonly clusterMatch: Readonly<Record<TaskClassV4, boolean>>;\n\treadonly skeletonMatch: Readonly<Record<TaskClassV4, boolean>>;\n\treadonly deferredClasses: readonly TaskClassV4[];\n\treadonly featureIds: readonly string[];\n};\nconst wordsV4 = (text: string): readonly string[] => text.split(\" \");\nconst koRowV4 = (canonical: string, surfaces: string): readonly [string, readonly string[]] => [\n\tcanonical,\n\twordsV4(surfaces),\n];\nconst IRREGULAR_ENGLISH_STEMS: Readonly<Record<string, string>> = {\n\taborted: \"abort\",\n\taborts: \"abort\",\n\tbroke: \"break\",\n\tbroken: \"break\",\n\tbreaks: \"break\",\n\tbuilt: \"build\",\n\tcauses: \"cause\",\n\tfired: \"fire\",\n\tfound: \"find\",\n\thung: \"hang\",\n\thangs: \"hang\",\n\tskipped: \"skip\",\n\tskips: \"skip\",\n\tstuck: \"stick\",\n\tthrown: \"throw\",\n\tvanished: \"vanish\",\n\tvanishes: \"vanish\",\n\twrote: \"write\",\n\twritten: \"write\",\n} as const;\nconst KOREAN_SUFFIXES = wordsV4(\n\t\"해주세요 해줘요 해줘 줘요 거예요 거야 는데 어요 아요 해요 하게 하고 하지 하면 해서 하는 하다 으로 에서 에게 까지 부터 처럼 보다 줘 요 은 는 이 가 을 를 도 만 에 로 와 과\",\n);\nconst KOREAN_CANONICAL = [\n\tkoRowV4(\"고치\", \"고쳐 고칠 고치 수정\"),\n\tkoRowV4(\"찾\", \"찾아 찾을 찾\"),\n\tkoRowV4(\"나누\", \"나눠 나눌 나누\"),\n\tkoRowV4(\"멈추\", \"멈췄 멈춰 멈추 먹통\"),\n\tkoRowV4(\"깨지\", \"깨졌 깨져 깨짐 깨지\"),\n\tkoRowV4(\"단순\", \"단순\"),\n\tkoRowV4(\"안맞\", \"안맞 맞아 맞지\"),\n\tkoRowV4(\"검토\", \"검토\"),\n\tkoRowV4(\"리뷰\", \"리뷰\"),\n\tkoRowV4(\"점검\", \"점검\"),\n\tkoRowV4(\"위험\", \"위험\"),\n\tkoRowV4(\"안전\", \"안전\"),\n\tkoRowV4(\"허점\", \"허점\"),\n\tkoRowV4(\"오해\", \"오해\"),\n\tkoRowV4(\"중복\", \"중복\"),\n\tkoRowV4(\"경계\", \"경계\"),\n\tkoRowV4(\"분리\", \"분리\"),\n\tkoRowV4(\"정리\", \"정리\"),\n\tkoRowV4(\"구조\", \"구조\"),\n\tkoRowV4(\"헬퍼\", \"헬퍼\"),\n\tkoRowV4(\"서비스\", \"서비스\"),\n\tkoRowV4(\"검증\", \"검증\"),\n\tkoRowV4(\"저장\", \"저장\"),\n\tkoRowV4(\"콜백\", \"콜백\"),\n\tkoRowV4(\"체인\", \"체인\"),\n\tkoRowV4(\"원인\", \"원인\"),\n\tkoRowV4(\"실패\", \"실패\"),\n\tkoRowV4(\"오류\", \"오류 에러\"),\n\tkoRowV4(\"추적\", \"추적\"),\n\tkoRowV4(\"재현\", \"재현\"),\n\tkoRowV4(\"버그\", \"버그\"),\n\tkoRowV4(\"리팩터링\", \"리팩터링 리팩토링\"),\n] as const;\nconst DEBUG_ACTIONS = wordsV4(\n\t\"debug investigate reproduce trace find isolate chase determine root cause why trigger regression 찾 원인 재현\",\n);\nconst DEBUG_SYMPTOMS = wordsV4(\n\t\"stall hang break fail red vanish abort stick wrong mismatch stale disappear fire crash 멈추 깨지 실패 오류 안맞\",\n);\nconst REVIEW_ACTIONS = wordsV4(\"review audit evaluate scan judge assess check tell call read look flag 검토 리뷰 점검\");\nconst REVIEW_OBJECTS = wordsV4(\n\t\"safe risky risk unsafe mislead claim implication assumption gap flaw hole security coupling edge policy 위험 안전 허점 오해\",\n);\nconst REFACTOR_ACTIONS = wordsV4(\n\t\"fold separate untwist untangle slice pull move extract reshape split deduplicate consolidate simplify clean restructure organize 나누 분리 정리 단순 리팩터링\",\n);\nconst REFACTOR_OBJECTS = wordsV4(\n\t\"duplicate repeated retry branch path validation persistence callback promise chain reducer boundary layer handler helper service structure adapter wrapper 중복 헬퍼 경계 구조 검증 저장 콜백 체인 서비스\",\n);\nfunction normalizeEnglishTokenV4(token: string): string {\n\tconst irregular = IRREGULAR_ENGLISH_STEMS[token];\n\tif (irregular !== undefined) return irregular;\n\tif (token.length > 4 && token.endsWith(\"ies\")) return `${token.slice(0, -3)}y`;\n\tif (token.length > 5 && token.endsWith(\"ing\")) return trimDoubledConsonantV4(token.slice(0, -3));\n\tif (token.length > 4 && token.endsWith(\"ed\")) return trimDoubledConsonantV4(token.slice(0, -2));\n\tif (token.length > 4 && token.endsWith(\"es\")) return token.endsWith(\"ses\") ? token.slice(0, -1) : token.slice(0, -2);\n\tif (token.length > 3 && token.endsWith(\"s\") && !token.endsWith(\"ss\")) return token.slice(0, -1);\n\treturn token;\n}\nfunction trimDoubledConsonantV4(stem: string): string {\n\tconst last = stem.at(-1);\n\tconst previous = stem.at(-2);\n\treturn last !== undefined && last === previous && !\"aeiou\".includes(last) ? stem.slice(0, -1) : stem;\n}\n\nfunction stripKoreanSuffixV4(token: string): string {\n\tfor (const suffix of KOREAN_SUFFIXES) {\n\t\tif (token.length > suffix.length + 1 && token.endsWith(suffix)) return token.slice(0, -suffix.length);\n\t}\n\treturn token;\n}\n\nfunction normalizeKoreanTokenV4(token: string): string {\n\tconst stripped = stripKoreanSuffixV4(token);\n\tfor (const [canonical, surfaces] of KOREAN_CANONICAL) {\n\t\tif (surfaces.some((surface) => stripped.includes(surface))) return canonical;\n\t}\n\treturn stripped;\n}\n\nexport function normalizeIntentTokensV4(text: string): readonly string[] {\n\tconst seen = new Set<string>();\n\tfor (const match of text\n\t\t.normalize(\"NFKC\")\n\t\t.toLowerCase()\n\t\t.matchAll(/[a-z]+|[가-힣]+/g)) {\n\t\tconst token = match[0];\n\t\tseen.add(/[a-z]/.test(token) ? normalizeEnglishTokenV4(token) : normalizeKoreanTokenV4(token));\n\t}\n\treturn [...seen];\n}\n\nfunction hasAnyV4(tokens: ReadonlySet<string>, anchors: readonly string[]): boolean {\n\treturn anchors.some((anchor) => tokens.has(anchor));\n}\n\nfunction hasSkipSymptomV4(tokens: ReadonlySet<string>): boolean {\n\treturn tokens.has(\"skip\") && !tokens.has(\"review\");\n}\n\nfunction createClassMapV4(): Record<TaskClassV4, boolean> {\n\treturn {\n\t\tdebug: false,\n\t\trefactor: false,\n\t\treview: false,\n\t\tplan: false,\n\t\t\"simple-edit\": false,\n\t\t\"code-gen\": false,\n\t\ttrivial: false,\n\t};\n}\n\nfunction classMentionsV4(tokens: ReadonlySet<string>): readonly TaskClassV4[] {\n\tconst classes: TaskClassV4[] = [];\n\tif (hasAnyV4(tokens, REVIEW_ACTIONS)) classes.push(\"review\");\n\tif (hasAnyV4(tokens, REFACTOR_ACTIONS) || tokens.has(\"refactor\")) classes.push(\"refactor\");\n\tif (\n\t\thasAnyV4(tokens, DEBUG_ACTIONS) ||\n\t\thasAnyV4(tokens, DEBUG_SYMPTOMS) ||\n\t\thasSkipSymptomV4(tokens) ||\n\t\ttokens.has(\"bug\")\n\t)\n\t\tclasses.push(\"debug\");\n\tif (tokens.has(\"plan\") || tokens.has(\"계획\")) classes.push(\"plan\");\n\treturn classes;\n}\n\nfunction skeletonClassV4(tokens: ReadonlySet<string>): TaskClassV4 | null {\n\tconst debug =\n\t\t(hasAnyV4(tokens, DEBUG_SYMPTOMS) || hasSkipSymptomV4(tokens)) &&\n\t\t(hasAnyV4(tokens, DEBUG_ACTIONS) || tokens.has(\"root\"));\n\tif (debug || (tokens.has(\"root\") && tokens.has(\"cause\"))) return \"debug\";\n\tif (hasAnyV4(tokens, REVIEW_ACTIONS) && hasAnyV4(tokens, REVIEW_OBJECTS)) return \"review\";\n\tif (\n\t\t(tokens.has(\"mislead\") || tokens.has(\"오해\")) &&\n\t\t(tokens.has(\"claim\") || tokens.has(\"policy\") || tokens.has(\"문구\"))\n\t)\n\t\treturn \"review\";\n\tif (hasAnyV4(tokens, REFACTOR_ACTIONS) && hasAnyV4(tokens, REFACTOR_OBJECTS)) return \"refactor\";\n\treturn null;\n}\n\nfunction splitDeferredCurrentV4(text: string): { readonly deferred: string; readonly current: string } | null {\n\tconst head = text.slice(0, 200);\n\tconst malgoIndex = head.indexOf(\"말고\");\n\tif (malgoIndex >= 0) {\n\t\tconst current = head.slice(malgoIndex + \"말고\".length).trim();\n\t\tif (current.length >= 3) return { deferred: head.slice(0, malgoIndex + \"말고\".length), current };\n\t}\n\tconst koreanLater = /나중에\\s*하고/i.exec(head);\n\tif (koreanLater !== null) {\n\t\tconst current = head.slice(koreanLater.index + koreanLater[0].length).trim();\n\t\tif (current.length >= 3) return { deferred: head.slice(0, koreanLater.index + koreanLater[0].length), current };\n\t}\n\tconst split =\n\t\t/^(.{1,100}\\b(?:can\\s+wait|can\\s+follow|later|history\\s+aside|after\\s+lunch|no\\s+\\w+\\s+yet|not\\s+asking\\s+for\\s+a\\s+\\w+|don't\\s+\\w+\\s+yet)\\b[^;,.!?—-]*)(?:[;,.!?—-]+|\\s+)\\s*(.{3,})/i.exec(\n\t\t\thead,\n\t\t);\n\treturn split === null ? null : { deferred: split[1] ?? \"\", current: split[2] ?? \"\" };\n}\n\nfunction normalizedSetV4(text: string): ReadonlySet<string> {\n\treturn new Set(normalizeIntentTokensV4(text));\n}\n\nexport function extractGeneralizedIntentEvidenceV4(text: string): EvidenceResultV4 {\n\tconst tokens = normalizedSetV4(text);\n\tconst clusterMatch = createClassMapV4();\n\tconst skeletonMatch = createClassMapV4();\n\tconst featureIds: string[] = [];\n\tconst debugCluster =\n\t\thasAnyV4(tokens, DEBUG_SYMPTOMS) ||\n\t\thasSkipSymptomV4(tokens) ||\n\t\t(hasAnyV4(tokens, DEBUG_ACTIONS) &&\n\t\t\t(tokens.has(\"cause\") || tokens.has(\"regression\") || tokens.has(\"trigger\") || tokens.has(\"why\")));\n\tconst reviewCluster = hasAnyV4(tokens, REVIEW_ACTIONS) && hasAnyV4(tokens, REVIEW_OBJECTS);\n\tconst reviewObjectCluster =\n\t\t(tokens.has(\"mislead\") && (tokens.has(\"claim\") || tokens.has(\"policy\"))) ||\n\t\t(tokens.has(\"오해\") && tokens.has(\"문구\"));\n\tconst refactorCluster = hasAnyV4(tokens, REFACTOR_ACTIONS) && hasAnyV4(tokens, REFACTOR_OBJECTS);\n\tif (debugCluster) clusterMatch.debug = true;\n\tif (reviewCluster || reviewObjectCluster || hasAnyV4(tokens, [\"검토\", \"리뷰\", \"점검\", \"허점\"]))\n\t\tclusterMatch.review = true;\n\tif (\n\t\trefactorCluster ||\n\t\t(hasAnyV4(tokens, [\"중복\", \"경계\", \"콜백\", \"체인\"]) && hasAnyV4(tokens, [\"정리\", \"나누\", \"분리\", \"단순\"]))\n\t)\n\t\tclusterMatch.refactor = true;\n\tconst deferred = splitDeferredCurrentV4(text);\n\tconst skeletonTarget =\n\t\tdeferred === null ? text : deferred.current.replace(/^(?:first|now|just|currently|먼저|지금은|지금)\\s+/i, \"\");\n\tconst skeletonClass = skeletonClassV4(normalizedSetV4(skeletonTarget));\n\tconst malgoDeferred = text.indexOf(\"말고\");\n\tconst deferredText =\n\t\tdeferred !== null ? deferred.deferred : malgoDeferred >= 0 ? text.slice(0, malgoDeferred + \"말고\".length) : null;\n\tconst deferredClasses = deferredText === null ? [] : classMentionsV4(normalizedSetV4(deferredText));\n\tconst inferredDeferredClasses: readonly TaskClassV4[] =\n\t\tdeferredClasses.length > 0\n\t\t\t? deferredClasses\n\t\t\t: tokens.has(\"말고\") && (tokens.has(\"버그\") || tokens.has(\"추적\") || tokens.has(\"고치\"))\n\t\t\t\t? [\"debug\"]\n\t\t\t\t: [];\n\tfor (const taskClass of [\"debug\", \"review\", \"refactor\"] as const) {\n\t\tif (clusterMatch[taskClass]) featureIds.push(`normalized:${taskClass}`);\n\t}\n\tif (skeletonClass !== null) {\n\t\tskeletonMatch[skeletonClass] = true;\n\t\tfeatureIds.push(`skeleton:${skeletonClass}`);\n\t}\n\tfor (const taskClass of inferredDeferredClasses) featureIds.push(`deferral:${taskClass}`);\n\treturn { clusterMatch, skeletonMatch, deferredClasses: inferredDeferredClasses, featureIds };\n}\n"]}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
const wordsV4 = (text) => text.split(" ");
|
|
2
|
+
const koRowV4 = (canonical, surfaces) => [
|
|
3
|
+
canonical,
|
|
4
|
+
wordsV4(surfaces),
|
|
5
|
+
];
|
|
6
|
+
const IRREGULAR_ENGLISH_STEMS = {
|
|
7
|
+
aborted: "abort",
|
|
8
|
+
aborts: "abort",
|
|
9
|
+
broke: "break",
|
|
10
|
+
broken: "break",
|
|
11
|
+
breaks: "break",
|
|
12
|
+
built: "build",
|
|
13
|
+
causes: "cause",
|
|
14
|
+
fired: "fire",
|
|
15
|
+
found: "find",
|
|
16
|
+
hung: "hang",
|
|
17
|
+
hangs: "hang",
|
|
18
|
+
skipped: "skip",
|
|
19
|
+
skips: "skip",
|
|
20
|
+
stuck: "stick",
|
|
21
|
+
thrown: "throw",
|
|
22
|
+
vanished: "vanish",
|
|
23
|
+
vanishes: "vanish",
|
|
24
|
+
wrote: "write",
|
|
25
|
+
written: "write",
|
|
26
|
+
};
|
|
27
|
+
const KOREAN_SUFFIXES = wordsV4("해주세요 해줘요 해줘 줘요 거예요 거야 는데 어요 아요 해요 하게 하고 하지 하면 해서 하는 하다 으로 에서 에게 까지 부터 처럼 보다 줘 요 은 는 이 가 을 를 도 만 에 로 와 과");
|
|
28
|
+
const KOREAN_CANONICAL = [
|
|
29
|
+
koRowV4("고치", "고쳐 고칠 고치 수정"),
|
|
30
|
+
koRowV4("찾", "찾아 찾을 찾"),
|
|
31
|
+
koRowV4("나누", "나눠 나눌 나누"),
|
|
32
|
+
koRowV4("멈추", "멈췄 멈춰 멈추 먹통"),
|
|
33
|
+
koRowV4("깨지", "깨졌 깨져 깨짐 깨지"),
|
|
34
|
+
koRowV4("단순", "단순"),
|
|
35
|
+
koRowV4("안맞", "안맞 맞아 맞지"),
|
|
36
|
+
koRowV4("검토", "검토"),
|
|
37
|
+
koRowV4("리뷰", "리뷰"),
|
|
38
|
+
koRowV4("점검", "점검"),
|
|
39
|
+
koRowV4("위험", "위험"),
|
|
40
|
+
koRowV4("안전", "안전"),
|
|
41
|
+
koRowV4("허점", "허점"),
|
|
42
|
+
koRowV4("오해", "오해"),
|
|
43
|
+
koRowV4("중복", "중복"),
|
|
44
|
+
koRowV4("경계", "경계"),
|
|
45
|
+
koRowV4("분리", "분리"),
|
|
46
|
+
koRowV4("정리", "정리"),
|
|
47
|
+
koRowV4("구조", "구조"),
|
|
48
|
+
koRowV4("헬퍼", "헬퍼"),
|
|
49
|
+
koRowV4("서비스", "서비스"),
|
|
50
|
+
koRowV4("검증", "검증"),
|
|
51
|
+
koRowV4("저장", "저장"),
|
|
52
|
+
koRowV4("콜백", "콜백"),
|
|
53
|
+
koRowV4("체인", "체인"),
|
|
54
|
+
koRowV4("원인", "원인"),
|
|
55
|
+
koRowV4("실패", "실패"),
|
|
56
|
+
koRowV4("오류", "오류 에러"),
|
|
57
|
+
koRowV4("추적", "추적"),
|
|
58
|
+
koRowV4("재현", "재현"),
|
|
59
|
+
koRowV4("버그", "버그"),
|
|
60
|
+
koRowV4("리팩터링", "리팩터링 리팩토링"),
|
|
61
|
+
];
|
|
62
|
+
const DEBUG_ACTIONS = wordsV4("debug investigate reproduce trace find isolate chase determine root cause why trigger regression 찾 원인 재현");
|
|
63
|
+
const DEBUG_SYMPTOMS = wordsV4("stall hang break fail red vanish abort stick wrong mismatch stale disappear fire crash 멈추 깨지 실패 오류 안맞");
|
|
64
|
+
const REVIEW_ACTIONS = wordsV4("review audit evaluate scan judge assess check tell call read look flag 검토 리뷰 점검");
|
|
65
|
+
const REVIEW_OBJECTS = wordsV4("safe risky risk unsafe mislead claim implication assumption gap flaw hole security coupling edge policy 위험 안전 허점 오해");
|
|
66
|
+
const REFACTOR_ACTIONS = wordsV4("fold separate untwist untangle slice pull move extract reshape split deduplicate consolidate simplify clean restructure organize 나누 분리 정리 단순 리팩터링");
|
|
67
|
+
const REFACTOR_OBJECTS = wordsV4("duplicate repeated retry branch path validation persistence callback promise chain reducer boundary layer handler helper service structure adapter wrapper 중복 헬퍼 경계 구조 검증 저장 콜백 체인 서비스");
|
|
68
|
+
function normalizeEnglishTokenV4(token) {
|
|
69
|
+
const irregular = IRREGULAR_ENGLISH_STEMS[token];
|
|
70
|
+
if (irregular !== undefined)
|
|
71
|
+
return irregular;
|
|
72
|
+
if (token.length > 4 && token.endsWith("ies"))
|
|
73
|
+
return `${token.slice(0, -3)}y`;
|
|
74
|
+
if (token.length > 5 && token.endsWith("ing"))
|
|
75
|
+
return trimDoubledConsonantV4(token.slice(0, -3));
|
|
76
|
+
if (token.length > 4 && token.endsWith("ed"))
|
|
77
|
+
return trimDoubledConsonantV4(token.slice(0, -2));
|
|
78
|
+
if (token.length > 4 && token.endsWith("es"))
|
|
79
|
+
return token.endsWith("ses") ? token.slice(0, -1) : token.slice(0, -2);
|
|
80
|
+
if (token.length > 3 && token.endsWith("s") && !token.endsWith("ss"))
|
|
81
|
+
return token.slice(0, -1);
|
|
82
|
+
return token;
|
|
83
|
+
}
|
|
84
|
+
function trimDoubledConsonantV4(stem) {
|
|
85
|
+
const last = stem.at(-1);
|
|
86
|
+
const previous = stem.at(-2);
|
|
87
|
+
return last !== undefined && last === previous && !"aeiou".includes(last) ? stem.slice(0, -1) : stem;
|
|
88
|
+
}
|
|
89
|
+
function stripKoreanSuffixV4(token) {
|
|
90
|
+
for (const suffix of KOREAN_SUFFIXES) {
|
|
91
|
+
if (token.length > suffix.length + 1 && token.endsWith(suffix))
|
|
92
|
+
return token.slice(0, -suffix.length);
|
|
93
|
+
}
|
|
94
|
+
return token;
|
|
95
|
+
}
|
|
96
|
+
function normalizeKoreanTokenV4(token) {
|
|
97
|
+
const stripped = stripKoreanSuffixV4(token);
|
|
98
|
+
for (const [canonical, surfaces] of KOREAN_CANONICAL) {
|
|
99
|
+
if (surfaces.some((surface) => stripped.includes(surface)))
|
|
100
|
+
return canonical;
|
|
101
|
+
}
|
|
102
|
+
return stripped;
|
|
103
|
+
}
|
|
104
|
+
export function normalizeIntentTokensV4(text) {
|
|
105
|
+
const seen = new Set();
|
|
106
|
+
for (const match of text
|
|
107
|
+
.normalize("NFKC")
|
|
108
|
+
.toLowerCase()
|
|
109
|
+
.matchAll(/[a-z]+|[가-힣]+/g)) {
|
|
110
|
+
const token = match[0];
|
|
111
|
+
seen.add(/[a-z]/.test(token) ? normalizeEnglishTokenV4(token) : normalizeKoreanTokenV4(token));
|
|
112
|
+
}
|
|
113
|
+
return [...seen];
|
|
114
|
+
}
|
|
115
|
+
function hasAnyV4(tokens, anchors) {
|
|
116
|
+
return anchors.some((anchor) => tokens.has(anchor));
|
|
117
|
+
}
|
|
118
|
+
function hasSkipSymptomV4(tokens) {
|
|
119
|
+
return tokens.has("skip") && !tokens.has("review");
|
|
120
|
+
}
|
|
121
|
+
function createClassMapV4() {
|
|
122
|
+
return {
|
|
123
|
+
debug: false,
|
|
124
|
+
refactor: false,
|
|
125
|
+
review: false,
|
|
126
|
+
plan: false,
|
|
127
|
+
"simple-edit": false,
|
|
128
|
+
"code-gen": false,
|
|
129
|
+
trivial: false,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
function classMentionsV4(tokens) {
|
|
133
|
+
const classes = [];
|
|
134
|
+
if (hasAnyV4(tokens, REVIEW_ACTIONS))
|
|
135
|
+
classes.push("review");
|
|
136
|
+
if (hasAnyV4(tokens, REFACTOR_ACTIONS) || tokens.has("refactor"))
|
|
137
|
+
classes.push("refactor");
|
|
138
|
+
if (hasAnyV4(tokens, DEBUG_ACTIONS) ||
|
|
139
|
+
hasAnyV4(tokens, DEBUG_SYMPTOMS) ||
|
|
140
|
+
hasSkipSymptomV4(tokens) ||
|
|
141
|
+
tokens.has("bug"))
|
|
142
|
+
classes.push("debug");
|
|
143
|
+
if (tokens.has("plan") || tokens.has("계획"))
|
|
144
|
+
classes.push("plan");
|
|
145
|
+
return classes;
|
|
146
|
+
}
|
|
147
|
+
function skeletonClassV4(tokens) {
|
|
148
|
+
const debug = (hasAnyV4(tokens, DEBUG_SYMPTOMS) || hasSkipSymptomV4(tokens)) &&
|
|
149
|
+
(hasAnyV4(tokens, DEBUG_ACTIONS) || tokens.has("root"));
|
|
150
|
+
if (debug || (tokens.has("root") && tokens.has("cause")))
|
|
151
|
+
return "debug";
|
|
152
|
+
if (hasAnyV4(tokens, REVIEW_ACTIONS) && hasAnyV4(tokens, REVIEW_OBJECTS))
|
|
153
|
+
return "review";
|
|
154
|
+
if ((tokens.has("mislead") || tokens.has("오해")) &&
|
|
155
|
+
(tokens.has("claim") || tokens.has("policy") || tokens.has("문구")))
|
|
156
|
+
return "review";
|
|
157
|
+
if (hasAnyV4(tokens, REFACTOR_ACTIONS) && hasAnyV4(tokens, REFACTOR_OBJECTS))
|
|
158
|
+
return "refactor";
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
function splitDeferredCurrentV4(text) {
|
|
162
|
+
const head = text.slice(0, 200);
|
|
163
|
+
const malgoIndex = head.indexOf("말고");
|
|
164
|
+
if (malgoIndex >= 0) {
|
|
165
|
+
const current = head.slice(malgoIndex + "말고".length).trim();
|
|
166
|
+
if (current.length >= 3)
|
|
167
|
+
return { deferred: head.slice(0, malgoIndex + "말고".length), current };
|
|
168
|
+
}
|
|
169
|
+
const koreanLater = /나중에\s*하고/i.exec(head);
|
|
170
|
+
if (koreanLater !== null) {
|
|
171
|
+
const current = head.slice(koreanLater.index + koreanLater[0].length).trim();
|
|
172
|
+
if (current.length >= 3)
|
|
173
|
+
return { deferred: head.slice(0, koreanLater.index + koreanLater[0].length), current };
|
|
174
|
+
}
|
|
175
|
+
const split = /^(.{1,100}\b(?:can\s+wait|can\s+follow|later|history\s+aside|after\s+lunch|no\s+\w+\s+yet|not\s+asking\s+for\s+a\s+\w+|don't\s+\w+\s+yet)\b[^;,.!?—-]*)(?:[;,.!?—-]+|\s+)\s*(.{3,})/i.exec(head);
|
|
176
|
+
return split === null ? null : { deferred: split[1] ?? "", current: split[2] ?? "" };
|
|
177
|
+
}
|
|
178
|
+
function normalizedSetV4(text) {
|
|
179
|
+
return new Set(normalizeIntentTokensV4(text));
|
|
180
|
+
}
|
|
181
|
+
export function extractGeneralizedIntentEvidenceV4(text) {
|
|
182
|
+
const tokens = normalizedSetV4(text);
|
|
183
|
+
const clusterMatch = createClassMapV4();
|
|
184
|
+
const skeletonMatch = createClassMapV4();
|
|
185
|
+
const featureIds = [];
|
|
186
|
+
const debugCluster = hasAnyV4(tokens, DEBUG_SYMPTOMS) ||
|
|
187
|
+
hasSkipSymptomV4(tokens) ||
|
|
188
|
+
(hasAnyV4(tokens, DEBUG_ACTIONS) &&
|
|
189
|
+
(tokens.has("cause") || tokens.has("regression") || tokens.has("trigger") || tokens.has("why")));
|
|
190
|
+
const reviewCluster = hasAnyV4(tokens, REVIEW_ACTIONS) && hasAnyV4(tokens, REVIEW_OBJECTS);
|
|
191
|
+
const reviewObjectCluster = (tokens.has("mislead") && (tokens.has("claim") || tokens.has("policy"))) ||
|
|
192
|
+
(tokens.has("오해") && tokens.has("문구"));
|
|
193
|
+
const refactorCluster = hasAnyV4(tokens, REFACTOR_ACTIONS) && hasAnyV4(tokens, REFACTOR_OBJECTS);
|
|
194
|
+
if (debugCluster)
|
|
195
|
+
clusterMatch.debug = true;
|
|
196
|
+
if (reviewCluster || reviewObjectCluster || hasAnyV4(tokens, ["검토", "리뷰", "점검", "허점"]))
|
|
197
|
+
clusterMatch.review = true;
|
|
198
|
+
if (refactorCluster ||
|
|
199
|
+
(hasAnyV4(tokens, ["중복", "경계", "콜백", "체인"]) && hasAnyV4(tokens, ["정리", "나누", "분리", "단순"])))
|
|
200
|
+
clusterMatch.refactor = true;
|
|
201
|
+
const deferred = splitDeferredCurrentV4(text);
|
|
202
|
+
const skeletonTarget = deferred === null ? text : deferred.current.replace(/^(?:first|now|just|currently|먼저|지금은|지금)\s+/i, "");
|
|
203
|
+
const skeletonClass = skeletonClassV4(normalizedSetV4(skeletonTarget));
|
|
204
|
+
const malgoDeferred = text.indexOf("말고");
|
|
205
|
+
const deferredText = deferred !== null ? deferred.deferred : malgoDeferred >= 0 ? text.slice(0, malgoDeferred + "말고".length) : null;
|
|
206
|
+
const deferredClasses = deferredText === null ? [] : classMentionsV4(normalizedSetV4(deferredText));
|
|
207
|
+
const inferredDeferredClasses = deferredClasses.length > 0
|
|
208
|
+
? deferredClasses
|
|
209
|
+
: tokens.has("말고") && (tokens.has("버그") || tokens.has("추적") || tokens.has("고치"))
|
|
210
|
+
? ["debug"]
|
|
211
|
+
: [];
|
|
212
|
+
for (const taskClass of ["debug", "review", "refactor"]) {
|
|
213
|
+
if (clusterMatch[taskClass])
|
|
214
|
+
featureIds.push(`normalized:${taskClass}`);
|
|
215
|
+
}
|
|
216
|
+
if (skeletonClass !== null) {
|
|
217
|
+
skeletonMatch[skeletonClass] = true;
|
|
218
|
+
featureIds.push(`skeleton:${skeletonClass}`);
|
|
219
|
+
}
|
|
220
|
+
for (const taskClass of inferredDeferredClasses)
|
|
221
|
+
featureIds.push(`deferral:${taskClass}`);
|
|
222
|
+
return { clusterMatch, skeletonMatch, deferredClasses: inferredDeferredClasses, featureIds };
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=reasoning-router-v4-normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoning-router-v4-normalize.js","sourceRoot":"","sources":["../../src/core/reasoning-router-v4-normalize.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TaskClassV4 } from \"./reasoning-router-v4-weights.ts\";\n\ntype EvidenceResultV4 = {\n\treadonly clusterMatch: Readonly<Record<TaskClassV4, boolean>>;\n\treadonly skeletonMatch: Readonly<Record<TaskClassV4, boolean>>;\n\treadonly deferredClasses: readonly TaskClassV4[];\n\treadonly featureIds: readonly string[];\n};\nconst wordsV4 = (text: string): readonly string[] => text.split(\" \");\nconst koRowV4 = (canonical: string, surfaces: string): readonly [string, readonly string[]] => [\n\tcanonical,\n\twordsV4(surfaces),\n];\nconst IRREGULAR_ENGLISH_STEMS: Readonly<Record<string, string>> = {\n\taborted: \"abort\",\n\taborts: \"abort\",\n\tbroke: \"break\",\n\tbroken: \"break\",\n\tbreaks: \"break\",\n\tbuilt: \"build\",\n\tcauses: \"cause\",\n\tfired: \"fire\",\n\tfound: \"find\",\n\thung: \"hang\",\n\thangs: \"hang\",\n\tskipped: \"skip\",\n\tskips: \"skip\",\n\tstuck: \"stick\",\n\tthrown: \"throw\",\n\tvanished: \"vanish\",\n\tvanishes: \"vanish\",\n\twrote: \"write\",\n\twritten: \"write\",\n} as const;\nconst KOREAN_SUFFIXES = wordsV4(\n\t\"해주세요 해줘요 해줘 줘요 거예요 거야 는데 어요 아요 해요 하게 하고 하지 하면 해서 하는 하다 으로 에서 에게 까지 부터 처럼 보다 줘 요 은 는 이 가 을 를 도 만 에 로 와 과\",\n);\nconst KOREAN_CANONICAL = [\n\tkoRowV4(\"고치\", \"고쳐 고칠 고치 수정\"),\n\tkoRowV4(\"찾\", \"찾아 찾을 찾\"),\n\tkoRowV4(\"나누\", \"나눠 나눌 나누\"),\n\tkoRowV4(\"멈추\", \"멈췄 멈춰 멈추 먹통\"),\n\tkoRowV4(\"깨지\", \"깨졌 깨져 깨짐 깨지\"),\n\tkoRowV4(\"단순\", \"단순\"),\n\tkoRowV4(\"안맞\", \"안맞 맞아 맞지\"),\n\tkoRowV4(\"검토\", \"검토\"),\n\tkoRowV4(\"리뷰\", \"리뷰\"),\n\tkoRowV4(\"점검\", \"점검\"),\n\tkoRowV4(\"위험\", \"위험\"),\n\tkoRowV4(\"안전\", \"안전\"),\n\tkoRowV4(\"허점\", \"허점\"),\n\tkoRowV4(\"오해\", \"오해\"),\n\tkoRowV4(\"중복\", \"중복\"),\n\tkoRowV4(\"경계\", \"경계\"),\n\tkoRowV4(\"분리\", \"분리\"),\n\tkoRowV4(\"정리\", \"정리\"),\n\tkoRowV4(\"구조\", \"구조\"),\n\tkoRowV4(\"헬퍼\", \"헬퍼\"),\n\tkoRowV4(\"서비스\", \"서비스\"),\n\tkoRowV4(\"검증\", \"검증\"),\n\tkoRowV4(\"저장\", \"저장\"),\n\tkoRowV4(\"콜백\", \"콜백\"),\n\tkoRowV4(\"체인\", \"체인\"),\n\tkoRowV4(\"원인\", \"원인\"),\n\tkoRowV4(\"실패\", \"실패\"),\n\tkoRowV4(\"오류\", \"오류 에러\"),\n\tkoRowV4(\"추적\", \"추적\"),\n\tkoRowV4(\"재현\", \"재현\"),\n\tkoRowV4(\"버그\", \"버그\"),\n\tkoRowV4(\"리팩터링\", \"리팩터링 리팩토링\"),\n] as const;\nconst DEBUG_ACTIONS = wordsV4(\n\t\"debug investigate reproduce trace find isolate chase determine root cause why trigger regression 찾 원인 재현\",\n);\nconst DEBUG_SYMPTOMS = wordsV4(\n\t\"stall hang break fail red vanish abort stick wrong mismatch stale disappear fire crash 멈추 깨지 실패 오류 안맞\",\n);\nconst REVIEW_ACTIONS = wordsV4(\"review audit evaluate scan judge assess check tell call read look flag 검토 리뷰 점검\");\nconst REVIEW_OBJECTS = wordsV4(\n\t\"safe risky risk unsafe mislead claim implication assumption gap flaw hole security coupling edge policy 위험 안전 허점 오해\",\n);\nconst REFACTOR_ACTIONS = wordsV4(\n\t\"fold separate untwist untangle slice pull move extract reshape split deduplicate consolidate simplify clean restructure organize 나누 분리 정리 단순 리팩터링\",\n);\nconst REFACTOR_OBJECTS = wordsV4(\n\t\"duplicate repeated retry branch path validation persistence callback promise chain reducer boundary layer handler helper service structure adapter wrapper 중복 헬퍼 경계 구조 검증 저장 콜백 체인 서비스\",\n);\nfunction normalizeEnglishTokenV4(token: string): string {\n\tconst irregular = IRREGULAR_ENGLISH_STEMS[token];\n\tif (irregular !== undefined) return irregular;\n\tif (token.length > 4 && token.endsWith(\"ies\")) return `${token.slice(0, -3)}y`;\n\tif (token.length > 5 && token.endsWith(\"ing\")) return trimDoubledConsonantV4(token.slice(0, -3));\n\tif (token.length > 4 && token.endsWith(\"ed\")) return trimDoubledConsonantV4(token.slice(0, -2));\n\tif (token.length > 4 && token.endsWith(\"es\")) return token.endsWith(\"ses\") ? token.slice(0, -1) : token.slice(0, -2);\n\tif (token.length > 3 && token.endsWith(\"s\") && !token.endsWith(\"ss\")) return token.slice(0, -1);\n\treturn token;\n}\nfunction trimDoubledConsonantV4(stem: string): string {\n\tconst last = stem.at(-1);\n\tconst previous = stem.at(-2);\n\treturn last !== undefined && last === previous && !\"aeiou\".includes(last) ? stem.slice(0, -1) : stem;\n}\n\nfunction stripKoreanSuffixV4(token: string): string {\n\tfor (const suffix of KOREAN_SUFFIXES) {\n\t\tif (token.length > suffix.length + 1 && token.endsWith(suffix)) return token.slice(0, -suffix.length);\n\t}\n\treturn token;\n}\n\nfunction normalizeKoreanTokenV4(token: string): string {\n\tconst stripped = stripKoreanSuffixV4(token);\n\tfor (const [canonical, surfaces] of KOREAN_CANONICAL) {\n\t\tif (surfaces.some((surface) => stripped.includes(surface))) return canonical;\n\t}\n\treturn stripped;\n}\n\nexport function normalizeIntentTokensV4(text: string): readonly string[] {\n\tconst seen = new Set<string>();\n\tfor (const match of text\n\t\t.normalize(\"NFKC\")\n\t\t.toLowerCase()\n\t\t.matchAll(/[a-z]+|[가-힣]+/g)) {\n\t\tconst token = match[0];\n\t\tseen.add(/[a-z]/.test(token) ? normalizeEnglishTokenV4(token) : normalizeKoreanTokenV4(token));\n\t}\n\treturn [...seen];\n}\n\nfunction hasAnyV4(tokens: ReadonlySet<string>, anchors: readonly string[]): boolean {\n\treturn anchors.some((anchor) => tokens.has(anchor));\n}\n\nfunction hasSkipSymptomV4(tokens: ReadonlySet<string>): boolean {\n\treturn tokens.has(\"skip\") && !tokens.has(\"review\");\n}\n\nfunction createClassMapV4(): Record<TaskClassV4, boolean> {\n\treturn {\n\t\tdebug: false,\n\t\trefactor: false,\n\t\treview: false,\n\t\tplan: false,\n\t\t\"simple-edit\": false,\n\t\t\"code-gen\": false,\n\t\ttrivial: false,\n\t};\n}\n\nfunction classMentionsV4(tokens: ReadonlySet<string>): readonly TaskClassV4[] {\n\tconst classes: TaskClassV4[] = [];\n\tif (hasAnyV4(tokens, REVIEW_ACTIONS)) classes.push(\"review\");\n\tif (hasAnyV4(tokens, REFACTOR_ACTIONS) || tokens.has(\"refactor\")) classes.push(\"refactor\");\n\tif (\n\t\thasAnyV4(tokens, DEBUG_ACTIONS) ||\n\t\thasAnyV4(tokens, DEBUG_SYMPTOMS) ||\n\t\thasSkipSymptomV4(tokens) ||\n\t\ttokens.has(\"bug\")\n\t)\n\t\tclasses.push(\"debug\");\n\tif (tokens.has(\"plan\") || tokens.has(\"계획\")) classes.push(\"plan\");\n\treturn classes;\n}\n\nfunction skeletonClassV4(tokens: ReadonlySet<string>): TaskClassV4 | null {\n\tconst debug =\n\t\t(hasAnyV4(tokens, DEBUG_SYMPTOMS) || hasSkipSymptomV4(tokens)) &&\n\t\t(hasAnyV4(tokens, DEBUG_ACTIONS) || tokens.has(\"root\"));\n\tif (debug || (tokens.has(\"root\") && tokens.has(\"cause\"))) return \"debug\";\n\tif (hasAnyV4(tokens, REVIEW_ACTIONS) && hasAnyV4(tokens, REVIEW_OBJECTS)) return \"review\";\n\tif (\n\t\t(tokens.has(\"mislead\") || tokens.has(\"오해\")) &&\n\t\t(tokens.has(\"claim\") || tokens.has(\"policy\") || tokens.has(\"문구\"))\n\t)\n\t\treturn \"review\";\n\tif (hasAnyV4(tokens, REFACTOR_ACTIONS) && hasAnyV4(tokens, REFACTOR_OBJECTS)) return \"refactor\";\n\treturn null;\n}\n\nfunction splitDeferredCurrentV4(text: string): { readonly deferred: string; readonly current: string } | null {\n\tconst head = text.slice(0, 200);\n\tconst malgoIndex = head.indexOf(\"말고\");\n\tif (malgoIndex >= 0) {\n\t\tconst current = head.slice(malgoIndex + \"말고\".length).trim();\n\t\tif (current.length >= 3) return { deferred: head.slice(0, malgoIndex + \"말고\".length), current };\n\t}\n\tconst koreanLater = /나중에\\s*하고/i.exec(head);\n\tif (koreanLater !== null) {\n\t\tconst current = head.slice(koreanLater.index + koreanLater[0].length).trim();\n\t\tif (current.length >= 3) return { deferred: head.slice(0, koreanLater.index + koreanLater[0].length), current };\n\t}\n\tconst split =\n\t\t/^(.{1,100}\\b(?:can\\s+wait|can\\s+follow|later|history\\s+aside|after\\s+lunch|no\\s+\\w+\\s+yet|not\\s+asking\\s+for\\s+a\\s+\\w+|don't\\s+\\w+\\s+yet)\\b[^;,.!?—-]*)(?:[;,.!?—-]+|\\s+)\\s*(.{3,})/i.exec(\n\t\t\thead,\n\t\t);\n\treturn split === null ? null : { deferred: split[1] ?? \"\", current: split[2] ?? \"\" };\n}\n\nfunction normalizedSetV4(text: string): ReadonlySet<string> {\n\treturn new Set(normalizeIntentTokensV4(text));\n}\n\nexport function extractGeneralizedIntentEvidenceV4(text: string): EvidenceResultV4 {\n\tconst tokens = normalizedSetV4(text);\n\tconst clusterMatch = createClassMapV4();\n\tconst skeletonMatch = createClassMapV4();\n\tconst featureIds: string[] = [];\n\tconst debugCluster =\n\t\thasAnyV4(tokens, DEBUG_SYMPTOMS) ||\n\t\thasSkipSymptomV4(tokens) ||\n\t\t(hasAnyV4(tokens, DEBUG_ACTIONS) &&\n\t\t\t(tokens.has(\"cause\") || tokens.has(\"regression\") || tokens.has(\"trigger\") || tokens.has(\"why\")));\n\tconst reviewCluster = hasAnyV4(tokens, REVIEW_ACTIONS) && hasAnyV4(tokens, REVIEW_OBJECTS);\n\tconst reviewObjectCluster =\n\t\t(tokens.has(\"mislead\") && (tokens.has(\"claim\") || tokens.has(\"policy\"))) ||\n\t\t(tokens.has(\"오해\") && tokens.has(\"문구\"));\n\tconst refactorCluster = hasAnyV4(tokens, REFACTOR_ACTIONS) && hasAnyV4(tokens, REFACTOR_OBJECTS);\n\tif (debugCluster) clusterMatch.debug = true;\n\tif (reviewCluster || reviewObjectCluster || hasAnyV4(tokens, [\"검토\", \"리뷰\", \"점검\", \"허점\"]))\n\t\tclusterMatch.review = true;\n\tif (\n\t\trefactorCluster ||\n\t\t(hasAnyV4(tokens, [\"중복\", \"경계\", \"콜백\", \"체인\"]) && hasAnyV4(tokens, [\"정리\", \"나누\", \"분리\", \"단순\"]))\n\t)\n\t\tclusterMatch.refactor = true;\n\tconst deferred = splitDeferredCurrentV4(text);\n\tconst skeletonTarget =\n\t\tdeferred === null ? text : deferred.current.replace(/^(?:first|now|just|currently|먼저|지금은|지금)\\s+/i, \"\");\n\tconst skeletonClass = skeletonClassV4(normalizedSetV4(skeletonTarget));\n\tconst malgoDeferred = text.indexOf(\"말고\");\n\tconst deferredText =\n\t\tdeferred !== null ? deferred.deferred : malgoDeferred >= 0 ? text.slice(0, malgoDeferred + \"말고\".length) : null;\n\tconst deferredClasses = deferredText === null ? [] : classMentionsV4(normalizedSetV4(deferredText));\n\tconst inferredDeferredClasses: readonly TaskClassV4[] =\n\t\tdeferredClasses.length > 0\n\t\t\t? deferredClasses\n\t\t\t: tokens.has(\"말고\") && (tokens.has(\"버그\") || tokens.has(\"추적\") || tokens.has(\"고치\"))\n\t\t\t\t? [\"debug\"]\n\t\t\t\t: [];\n\tfor (const taskClass of [\"debug\", \"review\", \"refactor\"] as const) {\n\t\tif (clusterMatch[taskClass]) featureIds.push(`normalized:${taskClass}`);\n\t}\n\tif (skeletonClass !== null) {\n\t\tskeletonMatch[skeletonClass] = true;\n\t\tfeatureIds.push(`skeleton:${skeletonClass}`);\n\t}\n\tfor (const taskClass of inferredDeferredClasses) featureIds.push(`deferral:${taskClass}`);\n\treturn { clusterMatch, skeletonMatch, deferredClasses: inferredDeferredClasses, featureIds };\n}\n"]}
|
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
* suppress a whole-prompt signal without crossing a clause boundary.
|
|
16
16
|
*
|
|
17
17
|
* `lowConfidenceThreshold` / `highConfidenceThreshold` bound the confidence
|
|
18
|
-
* bands (`ClassifierVerdictV4.confidenceBand`) computed from
|
|
19
|
-
*
|
|
20
|
-
* never change `taskClass`, only how
|
|
21
|
-
* treats an already-decided class.
|
|
18
|
+
* bands (`ClassifierVerdictV4.confidenceBand`) computed from score separation
|
|
19
|
+
* plus absolute evidence strength in reasoning-router-v4.ts. They are
|
|
20
|
+
* metadata-only: they never change `taskClass`, only how
|
|
21
|
+
* `resolveThinkingLevelV4WithUncertainty` treats an already-decided class.
|
|
22
22
|
*/
|
|
23
23
|
/** Closed set of v4 task classes. */
|
|
24
24
|
export type TaskClassV4 = "trivial" | "simple-edit" | "code-gen" | "debug" | "refactor" | "review" | "plan";
|
|
@@ -52,8 +52,16 @@ export interface RouterWeightsV4 {
|
|
|
52
52
|
readonly refactorCue: number;
|
|
53
53
|
/** Bump to "code-gen" when an implementation-object noun is present. */
|
|
54
54
|
readonly implementationObject: number;
|
|
55
|
+
/** Bump to "code-gen" when a first-person request names a code artifact (for example, "I need a script"). */
|
|
56
|
+
readonly codeGenArtifactRequest: number;
|
|
57
|
+
/** Bump to "review" when a leading review request names an evaluative object such as holes/regressions/issues. */
|
|
58
|
+
readonly evaluativeReviewObject: number;
|
|
55
59
|
/** Per-class whole-prompt keyword-family bump; trivial has no family, 0. */
|
|
56
60
|
readonly keywordFamily: Readonly<Record<TaskClassV4, number>>;
|
|
61
|
+
/** Bump to a class when normalized seed->cluster anchors match (medium generalized evidence). */
|
|
62
|
+
readonly normalizedIntentCluster: number;
|
|
63
|
+
/** Bump to a class when the bounded intent-skeleton extractor matches (medium generalized evidence). */
|
|
64
|
+
readonly intentSkeleton: number;
|
|
57
65
|
/** Bump to "code-gen" for a bare "add" keyword, gated by !localEdit. */
|
|
58
66
|
readonly addKeyword: number;
|
|
59
67
|
/** Bump to the class matching `history[0]`, if supplied (v4-new; 0 under DEFAULT_WEIGHTS_V4, inert until calibrated). */
|
|
@@ -64,7 +72,7 @@ export interface RouterWeightsV4 {
|
|
|
64
72
|
readonly judgeVote: number;
|
|
65
73
|
/** Bounded look-back window (characters) for negation-cue gating, never crossing a .,;!? boundary. */
|
|
66
74
|
readonly negationWindowChars: number;
|
|
67
|
-
/** confidence <= this value bands as "low" (confidence
|
|
75
|
+
/** confidence <= this value bands as "low" (confidence combines score separation and evidence strength). */
|
|
68
76
|
readonly lowConfidenceThreshold: number;
|
|
69
77
|
/** confidence >= this value bands as "high". */
|
|
70
78
|
readonly highConfidenceThreshold: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reasoning-router-v4-weights.d.ts","sourceRoot":"","sources":["../../src/core/reasoning-router-v4-weights.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,qCAAqC;AACrC,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,aAAa,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE5G,yEAAyE;AACzE,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;AAExG,yIAAyI;AACzI,eAAO,MAAM,eAAe,EAAE,SAAS,WAAW,EAQjD,CAAC;AAEF;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC/B,oEAAoE;IACpE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,+DAA+D;IAC/D,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,6HAA6H;IAC7H,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,yEAAyE;IACzE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,4EAA4E;IAC5E,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,sEAAsE;IACtE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,kEAAkE;IAClE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,4GAA4G;IAC5G,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,uFAAuF;IACvF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,wEAAwE;IACxE,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,4EAA4E;IAC5E,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9D,wEAAwE;IACxE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,yHAAyH;IACzH,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,+IAA+I;IAC/I,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,yIAAyI;IACzI,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,sGAAsG;IACtG,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,
|
|
1
|
+
{"version":3,"file":"reasoning-router-v4-weights.d.ts","sourceRoot":"","sources":["../../src/core/reasoning-router-v4-weights.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,qCAAqC;AACrC,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,aAAa,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE5G,yEAAyE;AACzE,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;AAExG,yIAAyI;AACzI,eAAO,MAAM,eAAe,EAAE,SAAS,WAAW,EAQjD,CAAC;AAEF;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC/B,oEAAoE;IACpE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,+DAA+D;IAC/D,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,6HAA6H;IAC7H,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,yEAAyE;IACzE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,4EAA4E;IAC5E,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,sEAAsE;IACtE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,kEAAkE;IAClE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,4GAA4G;IAC5G,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,uFAAuF;IACvF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,wEAAwE;IACxE,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,6GAA6G;IAC7G,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,kHAAkH;IAClH,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,4EAA4E;IAC5E,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9D,iGAAiG;IACjG,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,wGAAwG;IACxG,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,wEAAwE;IACxE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,yHAAyH;IACzH,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,+IAA+I;IAC/I,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,yIAAyI;IACzI,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,sGAAsG;IACtG,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,4GAA4G;IAC5G,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,gDAAgD;IAChD,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;CACzC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,EAAE,eA+BhC,CAAC","sourcesContent":["/**\n * Reasoning-router v4 — frozen types and calibratable weight schema.\n *\n * Pure, side-effect-free, erasable TypeScript. No runtime imports. This file\n * owns the closed task/lane unions, named scorer weights, and calibrated default\n * preset used by `/think auto`.\n *\n * `keywordFamily` is the class -> weight table for whole-prompt keyword-family\n * patterns (see reasoning-router-v4.ts). `trivial` carries weight 0 because it\n * is reached only via the zero-score fallback cascade.\n *\n * `secondClauseIntent` applies a bounded bonus when a second, distinct leading\n * verb is found after a short-range conjunction split. `negationWindowChars`\n * bounds negation gating so a nearby \"don't/skip/without/no need\" cue can\n * suppress a whole-prompt signal without crossing a clause boundary.\n *\n * `lowConfidenceThreshold` / `highConfidenceThreshold` bound the confidence\n * bands (`ClassifierVerdictV4.confidenceBand`) computed from score separation\n * plus absolute evidence strength in reasoning-router-v4.ts. They are\n * metadata-only: they never change `taskClass`, only how\n * `resolveThinkingLevelV4WithUncertainty` treats an already-decided class.\n */\n\n/** Closed set of v4 task classes. */\nexport type TaskClassV4 = \"trivial\" | \"simple-edit\" | \"code-gen\" | \"debug\" | \"refactor\" | \"review\" | \"plan\";\n\n/** Subagent lane types recognized by the v4 classifier and resolvers. */\nexport type ReasoningLaneTypeV4 = \"planner\" | \"security\" | \"explorer\" | \"coder\" | \"reviewer\" | \"tester\";\n\n/** Fixed iteration order over TaskClassV4 (matches the type-declaration order; also v4's argmax tie-break precedence, highest first). */\nexport const TASK_CLASSES_V4: readonly TaskClassV4[] = [\n\t\"debug\",\n\t\"refactor\",\n\t\"review\",\n\t\"plan\",\n\t\"simple-edit\",\n\t\"code-gen\",\n\t\"trivial\",\n];\n\n/**\n * Named weight schema for the v4 scorer (reasoning-router-v4.ts). Every field\n * is a plain, deterministic integer/ratio; there is no clock, randomness, or\n * I/O anywhere in this file or its consumer.\n */\nexport interface RouterWeightsV4 {\n\t/** Bump to \"code-gen\" when a code fence or diff hunk is present. */\n\treadonly codeFenceOrDiff: number;\n\t/** Bump to the primary leading-clause intent class, if any. */\n\treadonly leadingIntent: number;\n\t/** Bump to a distinct second-clause intent class in a detected compound prompt (v4-new; default half of `leadingIntent`). */\n\treadonly secondClauseIntent: number;\n\t/** Bump to \"simple-edit\" when the composite local-edit feature fires. */\n\treadonly localEdit: number;\n\t/** Bump to \"debug\" when the composite diagnostic-evidence feature fires. */\n\treadonly diagnosticEvidence: number;\n\t/** Bump to \"review\" when the composite review-scope feature fires. */\n\treadonly reviewScope: number;\n\t/** Bump to \"plan\" when the composite plan-brief feature fires. */\n\treadonly planBrief: number;\n\t/** Bump to \"plan\" for release-bound operational runbooks (commit/push/tag/publish/changelog/CI bundles). */\n\treadonly operationalRunbook: number;\n\t/** Bump to \"refactor\" when the refactor-cue pattern matches anywhere in the prompt. */\n\treadonly refactorCue: number;\n\t/** Bump to \"code-gen\" when an implementation-object noun is present. */\n\treadonly implementationObject: number;\n\t/** Bump to \"code-gen\" when a first-person request names a code artifact (for example, \"I need a script\"). */\n\treadonly codeGenArtifactRequest: number;\n\t/** Bump to \"review\" when a leading review request names an evaluative object such as holes/regressions/issues. */\n\treadonly evaluativeReviewObject: number;\n\t/** Per-class whole-prompt keyword-family bump; trivial has no family, 0. */\n\treadonly keywordFamily: Readonly<Record<TaskClassV4, number>>;\n\t/** Bump to a class when normalized seed->cluster anchors match (medium generalized evidence). */\n\treadonly normalizedIntentCluster: number;\n\t/** Bump to a class when the bounded intent-skeleton extractor matches (medium generalized evidence). */\n\treadonly intentSkeleton: number;\n\t/** Bump to \"code-gen\" for a bare \"add\" keyword, gated by !localEdit. */\n\treadonly addKeyword: number;\n\t/** Bump to the class matching `history[0]`, if supplied (v4-new; 0 under DEFAULT_WEIGHTS_V4, inert until calibrated). */\n\treadonly multiTurnPrior: number;\n\t/** Linear per-bucket bump applied to debug/review/plan under context pressure (v4-new; 0 under DEFAULT_WEIGHTS_V4, inert until calibrated). */\n\treadonly pressureBucket: number;\n\t/** Bump to the class matching an externally supplied judge vote, if any (v4-new; 0 under DEFAULT_WEIGHTS_V4, inert until calibrated). */\n\treadonly judgeVote: number;\n\t/** Bounded look-back window (characters) for negation-cue gating, never crossing a .,;!? boundary. */\n\treadonly negationWindowChars: number;\n\t/** confidence <= this value bands as \"low\" (confidence combines score separation and evidence strength). */\n\treadonly lowConfidenceThreshold: number;\n\t/** confidence >= this value bands as \"high\". */\n\treadonly highConfidenceThreshold: number;\n}\n\n/**\n * Calibrated default preset. The named weights below are the production v4\n * scorer configuration covered by\n * test/suite/regressions/013-reasoning-router-v4-accuracy.test.ts. Extension\n * fields (`multiTurnPrior`, `pressureBucket`, `judgeVote`) are wired but inert\n * until a future calibration changes them.\n */\nexport const DEFAULT_WEIGHTS_V4: RouterWeightsV4 = {\n\tcodeFenceOrDiff: 4,\n\tleadingIntent: 8,\n\tsecondClauseIntent: 4,\n\tlocalEdit: 7,\n\tdiagnosticEvidence: 7,\n\treviewScope: 3,\n\tplanBrief: 8,\n\toperationalRunbook: 8,\n\trefactorCue: 6,\n\timplementationObject: 3,\n\tcodeGenArtifactRequest: 5,\n\tevaluativeReviewObject: 3,\n\tkeywordFamily: {\n\t\ttrivial: 0,\n\t\t\"simple-edit\": 4,\n\t\t\"code-gen\": 4,\n\t\tdebug: 4,\n\t\trefactor: 4,\n\t\treview: 4,\n\t\tplan: 4,\n\t},\n\tnormalizedIntentCluster: 4,\n\tintentSkeleton: 5,\n\taddKeyword: 1,\n\tmultiTurnPrior: 0,\n\tpressureBucket: 0,\n\tjudgeVote: 0,\n\tnegationWindowChars: 24,\n\tlowConfidenceThreshold: 0.35,\n\thighConfidenceThreshold: 0.7,\n};\n"]}
|
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
* suppress a whole-prompt signal without crossing a clause boundary.
|
|
16
16
|
*
|
|
17
17
|
* `lowConfidenceThreshold` / `highConfidenceThreshold` bound the confidence
|
|
18
|
-
* bands (`ClassifierVerdictV4.confidenceBand`) computed from
|
|
19
|
-
*
|
|
20
|
-
* never change `taskClass`, only how
|
|
21
|
-
* treats an already-decided class.
|
|
18
|
+
* bands (`ClassifierVerdictV4.confidenceBand`) computed from score separation
|
|
19
|
+
* plus absolute evidence strength in reasoning-router-v4.ts. They are
|
|
20
|
+
* metadata-only: they never change `taskClass`, only how
|
|
21
|
+
* `resolveThinkingLevelV4WithUncertainty` treats an already-decided class.
|
|
22
22
|
*/
|
|
23
23
|
/** Fixed iteration order over TaskClassV4 (matches the type-declaration order; also v4's argmax tie-break precedence, highest first). */
|
|
24
24
|
export const TASK_CLASSES_V4 = [
|
|
@@ -48,6 +48,8 @@ export const DEFAULT_WEIGHTS_V4 = {
|
|
|
48
48
|
operationalRunbook: 8,
|
|
49
49
|
refactorCue: 6,
|
|
50
50
|
implementationObject: 3,
|
|
51
|
+
codeGenArtifactRequest: 5,
|
|
52
|
+
evaluativeReviewObject: 3,
|
|
51
53
|
keywordFamily: {
|
|
52
54
|
trivial: 0,
|
|
53
55
|
"simple-edit": 4,
|
|
@@ -57,6 +59,8 @@ export const DEFAULT_WEIGHTS_V4 = {
|
|
|
57
59
|
review: 4,
|
|
58
60
|
plan: 4,
|
|
59
61
|
},
|
|
62
|
+
normalizedIntentCluster: 4,
|
|
63
|
+
intentSkeleton: 5,
|
|
60
64
|
addKeyword: 1,
|
|
61
65
|
multiTurnPrior: 0,
|
|
62
66
|
pressureBucket: 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reasoning-router-v4-weights.js","sourceRoot":"","sources":["../../src/core/reasoning-router-v4-weights.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAQH,yIAAyI;AACzI,MAAM,CAAC,MAAM,eAAe,GAA2B;IACtD,OAAO;IACP,UAAU;IACV,QAAQ;IACR,MAAM;IACN,aAAa;IACb,UAAU;IACV,SAAS;CACT,CAAC;
|
|
1
|
+
{"version":3,"file":"reasoning-router-v4-weights.js","sourceRoot":"","sources":["../../src/core/reasoning-router-v4-weights.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAQH,yIAAyI;AACzI,MAAM,CAAC,MAAM,eAAe,GAA2B;IACtD,OAAO;IACP,UAAU;IACV,QAAQ;IACR,MAAM;IACN,aAAa;IACb,UAAU;IACV,SAAS;CACT,CAAC;AAsDF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAoB;IAClD,eAAe,EAAE,CAAC;IAClB,aAAa,EAAE,CAAC;IAChB,kBAAkB,EAAE,CAAC;IACrB,SAAS,EAAE,CAAC;IACZ,kBAAkB,EAAE,CAAC;IACrB,WAAW,EAAE,CAAC;IACd,SAAS,EAAE,CAAC;IACZ,kBAAkB,EAAE,CAAC;IACrB,WAAW,EAAE,CAAC;IACd,oBAAoB,EAAE,CAAC;IACvB,sBAAsB,EAAE,CAAC;IACzB,sBAAsB,EAAE,CAAC;IACzB,aAAa,EAAE;QACd,OAAO,EAAE,CAAC;QACV,aAAa,EAAE,CAAC;QAChB,UAAU,EAAE,CAAC;QACb,KAAK,EAAE,CAAC;QACR,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,CAAC;QACT,IAAI,EAAE,CAAC;KACP;IACD,uBAAuB,EAAE,CAAC;IAC1B,cAAc,EAAE,CAAC;IACjB,UAAU,EAAE,CAAC;IACb,cAAc,EAAE,CAAC;IACjB,cAAc,EAAE,CAAC;IACjB,SAAS,EAAE,CAAC;IACZ,mBAAmB,EAAE,EAAE;IACvB,sBAAsB,EAAE,IAAI;IAC5B,uBAAuB,EAAE,GAAG;CAC5B,CAAC","sourcesContent":["/**\n * Reasoning-router v4 — frozen types and calibratable weight schema.\n *\n * Pure, side-effect-free, erasable TypeScript. No runtime imports. This file\n * owns the closed task/lane unions, named scorer weights, and calibrated default\n * preset used by `/think auto`.\n *\n * `keywordFamily` is the class -> weight table for whole-prompt keyword-family\n * patterns (see reasoning-router-v4.ts). `trivial` carries weight 0 because it\n * is reached only via the zero-score fallback cascade.\n *\n * `secondClauseIntent` applies a bounded bonus when a second, distinct leading\n * verb is found after a short-range conjunction split. `negationWindowChars`\n * bounds negation gating so a nearby \"don't/skip/without/no need\" cue can\n * suppress a whole-prompt signal without crossing a clause boundary.\n *\n * `lowConfidenceThreshold` / `highConfidenceThreshold` bound the confidence\n * bands (`ClassifierVerdictV4.confidenceBand`) computed from score separation\n * plus absolute evidence strength in reasoning-router-v4.ts. They are\n * metadata-only: they never change `taskClass`, only how\n * `resolveThinkingLevelV4WithUncertainty` treats an already-decided class.\n */\n\n/** Closed set of v4 task classes. */\nexport type TaskClassV4 = \"trivial\" | \"simple-edit\" | \"code-gen\" | \"debug\" | \"refactor\" | \"review\" | \"plan\";\n\n/** Subagent lane types recognized by the v4 classifier and resolvers. */\nexport type ReasoningLaneTypeV4 = \"planner\" | \"security\" | \"explorer\" | \"coder\" | \"reviewer\" | \"tester\";\n\n/** Fixed iteration order over TaskClassV4 (matches the type-declaration order; also v4's argmax tie-break precedence, highest first). */\nexport const TASK_CLASSES_V4: readonly TaskClassV4[] = [\n\t\"debug\",\n\t\"refactor\",\n\t\"review\",\n\t\"plan\",\n\t\"simple-edit\",\n\t\"code-gen\",\n\t\"trivial\",\n];\n\n/**\n * Named weight schema for the v4 scorer (reasoning-router-v4.ts). Every field\n * is a plain, deterministic integer/ratio; there is no clock, randomness, or\n * I/O anywhere in this file or its consumer.\n */\nexport interface RouterWeightsV4 {\n\t/** Bump to \"code-gen\" when a code fence or diff hunk is present. */\n\treadonly codeFenceOrDiff: number;\n\t/** Bump to the primary leading-clause intent class, if any. */\n\treadonly leadingIntent: number;\n\t/** Bump to a distinct second-clause intent class in a detected compound prompt (v4-new; default half of `leadingIntent`). */\n\treadonly secondClauseIntent: number;\n\t/** Bump to \"simple-edit\" when the composite local-edit feature fires. */\n\treadonly localEdit: number;\n\t/** Bump to \"debug\" when the composite diagnostic-evidence feature fires. */\n\treadonly diagnosticEvidence: number;\n\t/** Bump to \"review\" when the composite review-scope feature fires. */\n\treadonly reviewScope: number;\n\t/** Bump to \"plan\" when the composite plan-brief feature fires. */\n\treadonly planBrief: number;\n\t/** Bump to \"plan\" for release-bound operational runbooks (commit/push/tag/publish/changelog/CI bundles). */\n\treadonly operationalRunbook: number;\n\t/** Bump to \"refactor\" when the refactor-cue pattern matches anywhere in the prompt. */\n\treadonly refactorCue: number;\n\t/** Bump to \"code-gen\" when an implementation-object noun is present. */\n\treadonly implementationObject: number;\n\t/** Bump to \"code-gen\" when a first-person request names a code artifact (for example, \"I need a script\"). */\n\treadonly codeGenArtifactRequest: number;\n\t/** Bump to \"review\" when a leading review request names an evaluative object such as holes/regressions/issues. */\n\treadonly evaluativeReviewObject: number;\n\t/** Per-class whole-prompt keyword-family bump; trivial has no family, 0. */\n\treadonly keywordFamily: Readonly<Record<TaskClassV4, number>>;\n\t/** Bump to a class when normalized seed->cluster anchors match (medium generalized evidence). */\n\treadonly normalizedIntentCluster: number;\n\t/** Bump to a class when the bounded intent-skeleton extractor matches (medium generalized evidence). */\n\treadonly intentSkeleton: number;\n\t/** Bump to \"code-gen\" for a bare \"add\" keyword, gated by !localEdit. */\n\treadonly addKeyword: number;\n\t/** Bump to the class matching `history[0]`, if supplied (v4-new; 0 under DEFAULT_WEIGHTS_V4, inert until calibrated). */\n\treadonly multiTurnPrior: number;\n\t/** Linear per-bucket bump applied to debug/review/plan under context pressure (v4-new; 0 under DEFAULT_WEIGHTS_V4, inert until calibrated). */\n\treadonly pressureBucket: number;\n\t/** Bump to the class matching an externally supplied judge vote, if any (v4-new; 0 under DEFAULT_WEIGHTS_V4, inert until calibrated). */\n\treadonly judgeVote: number;\n\t/** Bounded look-back window (characters) for negation-cue gating, never crossing a .,;!? boundary. */\n\treadonly negationWindowChars: number;\n\t/** confidence <= this value bands as \"low\" (confidence combines score separation and evidence strength). */\n\treadonly lowConfidenceThreshold: number;\n\t/** confidence >= this value bands as \"high\". */\n\treadonly highConfidenceThreshold: number;\n}\n\n/**\n * Calibrated default preset. The named weights below are the production v4\n * scorer configuration covered by\n * test/suite/regressions/013-reasoning-router-v4-accuracy.test.ts. Extension\n * fields (`multiTurnPrior`, `pressureBucket`, `judgeVote`) are wired but inert\n * until a future calibration changes them.\n */\nexport const DEFAULT_WEIGHTS_V4: RouterWeightsV4 = {\n\tcodeFenceOrDiff: 4,\n\tleadingIntent: 8,\n\tsecondClauseIntent: 4,\n\tlocalEdit: 7,\n\tdiagnosticEvidence: 7,\n\treviewScope: 3,\n\tplanBrief: 8,\n\toperationalRunbook: 8,\n\trefactorCue: 6,\n\timplementationObject: 3,\n\tcodeGenArtifactRequest: 5,\n\tevaluativeReviewObject: 3,\n\tkeywordFamily: {\n\t\ttrivial: 0,\n\t\t\"simple-edit\": 4,\n\t\t\"code-gen\": 4,\n\t\tdebug: 4,\n\t\trefactor: 4,\n\t\treview: 4,\n\t\tplan: 4,\n\t},\n\tnormalizedIntentCluster: 4,\n\tintentSkeleton: 5,\n\taddKeyword: 1,\n\tmultiTurnPrior: 0,\n\tpressureBucket: 0,\n\tjudgeVote: 0,\n\tnegationWindowChars: 24,\n\tlowConfidenceThreshold: 0.35,\n\thighConfidenceThreshold: 0.7,\n};\n"]}
|