@remnic/core 1.1.10 → 1.1.12
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/README.md +3 -3
- package/dist/access-cli.js +67 -59
- package/dist/access-cli.js.map +1 -1
- package/dist/access-http.d.ts +7 -4
- package/dist/access-http.js +30 -26
- package/dist/access-mcp.d.ts +9 -4
- package/dist/access-mcp.js +29 -25
- package/dist/access-schema.d.ts +188 -8
- package/dist/access-schema.js +12 -3
- package/dist/{access-service-BTTNyo1i.d.ts → access-service-DDjzFALq.d.ts} +54 -5
- package/dist/access-service.d.ts +7 -4
- package/dist/access-service.js +26 -23
- package/dist/action-confidence.d.ts +83 -0
- package/dist/action-confidence.js +22 -0
- package/dist/active-memory-bridge.d.ts +1 -1
- package/dist/active-recall.d.ts +1 -1
- package/dist/behavior-learner.d.ts +1 -1
- package/dist/behavior-signals.d.ts +1 -1
- package/dist/bootstrap.d.ts +4 -2
- package/dist/briefing.d.ts +1 -1
- package/dist/briefing.js +5 -5
- package/dist/buffer-surprise-report.d.ts +1 -1
- package/dist/buffer.d.ts +1 -1
- package/dist/calibration.d.ts +1 -1
- package/dist/calibration.js +4 -4
- package/dist/{capsule-export-LLEVB2RG.js → capsule-export-7QNCBZOQ.js} +3 -3
- package/dist/{capsule-import-UW45R2MZ.js → capsule-import-EPBHD2EN.js} +3 -3
- package/dist/causal-behavior.d.ts +1 -1
- package/dist/causal-consolidation.d.ts +1 -1
- package/dist/causal-consolidation.js +11 -11
- package/dist/{chunk-VQXK37XA.js → chunk-23ZZK64Y.js} +1 -1
- package/dist/chunk-23ZZK64Y.js.map +1 -0
- package/dist/{chunk-HJYHRE4S.js → chunk-242S3I2A.js} +2 -2
- package/dist/{chunk-MCC6KDQF.js → chunk-3B6KIRBH.js} +131 -13
- package/dist/chunk-3B6KIRBH.js.map +1 -0
- package/dist/chunk-4RA3C3EV.js +60 -0
- package/dist/chunk-4RA3C3EV.js.map +1 -0
- package/dist/{chunk-EYNQTST2.js → chunk-4YM32CRU.js} +4 -4
- package/dist/{chunk-6AUUAZEX.js → chunk-5NXIJZFX.js} +38 -8
- package/dist/chunk-5NXIJZFX.js.map +1 -0
- package/dist/chunk-6NKAQ74D.js +2237 -0
- package/dist/chunk-6NKAQ74D.js.map +1 -0
- package/dist/{chunk-PHNGXFQ6.js → chunk-7V22HTMD.js} +3 -3
- package/dist/{chunk-363MWCD3.js → chunk-7ZM3BFKK.js} +84 -62
- package/dist/chunk-7ZM3BFKK.js.map +1 -0
- package/dist/chunk-AC5LO7IU.js +308 -0
- package/dist/chunk-AC5LO7IU.js.map +1 -0
- package/dist/chunk-AH2JUU6X.js +336 -0
- package/dist/chunk-AH2JUU6X.js.map +1 -0
- package/dist/{chunk-VX2IUQFE.js → chunk-AQJNPMOA.js} +41 -11
- package/dist/chunk-AQJNPMOA.js.map +1 -0
- package/dist/{chunk-P73JTV34.js → chunk-BBE34QBJ.js} +4 -4
- package/dist/{chunk-5GCNE7CN.js → chunk-BZSQEPRW.js} +454 -140
- package/dist/chunk-BZSQEPRW.js.map +1 -0
- package/dist/chunk-C5BCH4ZS.js +317 -0
- package/dist/chunk-C5BCH4ZS.js.map +1 -0
- package/dist/{chunk-C5HUWVH2.js → chunk-CPKTBRS2.js} +6 -6
- package/dist/{chunk-IBX3VFOM.js → chunk-D4GAOFF6.js} +118 -2
- package/dist/chunk-D4GAOFF6.js.map +1 -0
- package/dist/chunk-DB5A3NHS.js +906 -0
- package/dist/chunk-DB5A3NHS.js.map +1 -0
- package/dist/{chunk-I6BQZSML.js → chunk-DZZPC36E.js} +10 -10
- package/dist/{chunk-O4XJUPSF.js → chunk-E2UCDP5S.js} +39 -2
- package/dist/chunk-E2UCDP5S.js.map +1 -0
- package/dist/{chunk-SRBJUAMP.js → chunk-FMEBPEAO.js} +11 -67
- package/dist/chunk-FMEBPEAO.js.map +1 -0
- package/dist/{chunk-4DXC6HQQ.js → chunk-FQDPCE3I.js} +5 -5
- package/dist/{chunk-NN3LPQ5D.js → chunk-HELQZFZO.js} +155 -16
- package/dist/chunk-HELQZFZO.js.map +1 -0
- package/dist/{chunk-57QNCUEZ.js → chunk-HL5LRPNA.js} +2 -2
- package/dist/{chunk-VTU2B4VF.js → chunk-HQZVVSVB.js} +2 -1
- package/dist/chunk-HQZVVSVB.js.map +1 -0
- package/dist/{chunk-6Z6UH6TK.js → chunk-HY3L4WKC.js} +69 -3
- package/dist/chunk-HY3L4WKC.js.map +1 -0
- package/dist/{chunk-QIGOEM65.js → chunk-IB3BFHGN.js} +5 -5
- package/dist/{chunk-RXTFCYQF.js → chunk-JESOB2HO.js} +6 -6
- package/dist/{chunk-2YMTO4ZJ.js → chunk-JKDVIE52.js} +9 -2
- package/dist/chunk-JKDVIE52.js.map +1 -0
- package/dist/{chunk-WGK4VHGP.js → chunk-MNU6ZBWT.js} +302 -140
- package/dist/chunk-MNU6ZBWT.js.map +1 -0
- package/dist/chunk-OAZ5MFUB.js +4124 -0
- package/dist/chunk-OAZ5MFUB.js.map +1 -0
- package/dist/{chunk-ZTSE2ZJ6.js → chunk-OIGNEXKZ.js} +50 -3
- package/dist/chunk-OIGNEXKZ.js.map +1 -0
- package/dist/chunk-OZKZ2TRP.js +3729 -0
- package/dist/chunk-OZKZ2TRP.js.map +1 -0
- package/dist/{chunk-GGD5W7TB.js → chunk-PD6O7AXF.js} +7 -2
- package/dist/chunk-PD6O7AXF.js.map +1 -0
- package/dist/{chunk-S3IP6R6K.js → chunk-PH4C2U43.js} +23 -3
- package/dist/chunk-PH4C2U43.js.map +1 -0
- package/dist/chunk-PYPOFEMK.js +294 -0
- package/dist/chunk-PYPOFEMK.js.map +1 -0
- package/dist/{chunk-EQINRHYR.js → chunk-QDZ2RLEC.js} +243 -7
- package/dist/chunk-QDZ2RLEC.js.map +1 -0
- package/dist/{chunk-KWBPHZUU.js → chunk-RK6F44Y6.js} +3 -2
- package/dist/chunk-RK6F44Y6.js.map +1 -0
- package/dist/{chunk-36CTNQY7.js → chunk-RVPLBATS.js} +42 -10
- package/dist/chunk-RVPLBATS.js.map +1 -0
- package/dist/chunk-SOAU2OE2.js +125 -0
- package/dist/chunk-SOAU2OE2.js.map +1 -0
- package/dist/{chunk-A4ACKWIW.js → chunk-U5JMRGKX.js} +55 -4
- package/dist/chunk-U5JMRGKX.js.map +1 -0
- package/dist/{chunk-LIO5X3CM.js → chunk-UVMUAWVT.js} +2 -2
- package/dist/chunk-VWT3F4IV.js +2161 -0
- package/dist/chunk-VWT3F4IV.js.map +1 -0
- package/dist/{chunk-PB5KW5PL.js → chunk-WEJG4TB5.js} +6 -6
- package/dist/{chunk-KBYWQWSB.js → chunk-X7HPGUVG.js} +2 -2
- package/dist/{chunk-Y5KDIOKF.js → chunk-XAMBKFQS.js} +383 -9
- package/dist/chunk-XAMBKFQS.js.map +1 -0
- package/dist/{chunk-ZL4S7ARC.js → chunk-Y3VMVTYX.js} +3 -3
- package/dist/{chunk-Z5S5HNGY.js → chunk-ZG7PTKBK.js} +21 -5
- package/dist/chunk-ZG7PTKBK.js.map +1 -0
- package/dist/{chunk-6XA7UN4Z.js → chunk-ZNQN6ZTA.js} +2 -2
- package/dist/{chunk-WTFWLUSX.js → chunk-ZVTKDVVM.js} +2 -2
- package/dist/{cli-BrEwQTnW.d.ts → cli-BR8KpIU0.d.ts} +2 -2
- package/dist/cli.d.ts +7 -4
- package/dist/cli.js +44 -40
- package/dist/codex-cli-fallback.d.ts +1 -0
- package/dist/codex-cli-fallback.js +1 -1
- package/dist/compression-optimizer.d.ts +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.js +1 -1
- package/dist/consolidation-provenance-check.d.ts +1 -1
- package/dist/consolidation-undo.d.ts +1 -1
- package/dist/{contradiction-scan-3Z6YW7YA.js → contradiction-scan-QTXAMBUA.js} +3 -2
- package/dist/contradiction-scan-QTXAMBUA.js.map +1 -0
- package/dist/day-summary.d.ts +1 -1
- package/dist/delinearize.d.ts +1 -1
- package/dist/direct-answer-wiring.d.ts +1 -1
- package/dist/direct-answer-wiring.js +1 -1
- package/dist/direct-answer.d.ts +1 -1
- package/dist/embedding-fallback.d.ts +1 -1
- package/dist/{engine-FOC3IJLA.js → engine-35M5BKQ7.js} +7 -7
- package/dist/entity-retrieval.d.ts +1 -1
- package/dist/entity-retrieval.js +5 -5
- package/dist/entity-schema.d.ts +1 -1
- package/dist/event-order-recall.d.ts +17 -0
- package/dist/event-order-recall.js +11 -0
- package/dist/event-order-recall.js.map +1 -0
- package/dist/evidence-pack.d.ts +3 -1
- package/dist/evidence-pack.js +5 -3
- package/dist/explicit-capture.d.ts +4 -2
- package/dist/explicit-cue-recall.d.ts +19 -1
- package/dist/explicit-cue-recall.js +10 -4
- package/dist/extraction-judge-telemetry.d.ts +1 -1
- package/dist/extraction-judge-training.d.ts +1 -1
- package/dist/extraction-judge.d.ts +1 -1
- package/dist/extraction.d.ts +1 -1
- package/dist/extraction.js +8 -7
- package/dist/fallback-llm.d.ts +2 -1
- package/dist/fallback-llm.js +4 -4
- package/dist/focused-list-recall.d.ts +17 -0
- package/dist/focused-list-recall.js +11 -0
- package/dist/focused-list-recall.js.map +1 -0
- package/dist/identity-continuity.d.ts +1 -1
- package/dist/importance.d.ts +1 -1
- package/dist/{index-1qIcnbG1.d.ts → index-DJ9QWMw-.d.ts} +3 -2
- package/dist/index.d.ts +49 -12
- package/dist/index.js +289 -115
- package/dist/index.js.map +1 -1
- package/dist/intent.d.ts +1 -1
- package/dist/intent.js +1 -1
- package/dist/lifecycle.d.ts +1 -1
- package/dist/live-connectors-runner.d.ts +1 -1
- package/dist/local-llm.d.ts +8 -4
- package/dist/local-llm.js +1 -1
- package/dist/mcp-memory-inspector-app.d.ts +106 -0
- package/dist/mcp-memory-inspector-app.js +20 -0
- package/dist/mcp-memory-inspector-app.js.map +1 -0
- package/dist/memory-action-policy.d.ts +1 -1
- package/dist/memory-cache.d.ts +1 -1
- package/dist/{memory-governance-F3QOJGEY.js → memory-governance-IMPQZXFC.js} +7 -7
- package/dist/memory-governance-IMPQZXFC.js.map +1 -0
- package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
- package/dist/memory-projection-store.d.ts +1 -1
- package/dist/memory-provenance.d.ts +57 -0
- package/dist/memory-provenance.js +13 -0
- package/dist/memory-provenance.js.map +1 -0
- package/dist/memory-worth-outcomes.d.ts +1 -1
- package/dist/models-json.d.ts +1 -1
- package/dist/native-knowledge.d.ts +1 -1
- package/dist/objective-state-writers.d.ts +1 -1
- package/dist/objective-state-writers.js +2 -2
- package/dist/operator-toolkit.d.ts +1 -1
- package/dist/operator-toolkit.js +11 -11
- package/dist/{orchestrator-6IvQ-Phj.d.ts → orchestrator-DDMPqU6R.d.ts} +10 -1
- package/dist/orchestrator.d.ts +4 -2
- package/dist/orchestrator.js +53 -46
- package/dist/patterns-cli.d.ts +1 -1
- package/dist/policy-runtime.d.ts +1 -1
- package/dist/qmd-recall-cache.d.ts +1 -1
- package/dist/qmd.d.ts +1 -1
- package/dist/recall-disclosure-escalation.d.ts +1 -1
- package/dist/recall-explain-renderer.d.ts +3 -1
- package/dist/recall-explain-renderer.js +5 -3
- package/dist/recall-state.d.ts +1 -1
- package/dist/recall-tag-filter.d.ts +3 -1
- package/dist/recall-xray-cli.d.ts +3 -1
- package/dist/recall-xray-cli.js +6 -4
- package/dist/recall-xray-renderer.d.ts +3 -1
- package/dist/recall-xray-renderer.js +5 -3
- package/dist/recall-xray.d.ts +8 -1
- package/dist/recall-xray.js +4 -2
- package/dist/resolve-auth-token.d.ts +1 -1
- package/dist/resolve-provider-secret.js +1 -1
- package/dist/response-guidance-recall.d.ts +18 -0
- package/dist/response-guidance-recall.js +11 -0
- package/dist/response-guidance-recall.js.map +1 -0
- package/dist/resume-bundles.js +3 -3
- package/dist/retrieval-agents.d.ts +1 -1
- package/dist/retrieval-tiers.d.ts +1 -1
- package/dist/sdk-compat.d.ts +3 -2
- package/dist/sdk-compat.js.map +1 -1
- package/dist/semantic-consolidation.d.ts +1 -1
- package/dist/semantic-consolidation.js +6 -6
- package/dist/semantic-rule-promotion.js +5 -5
- package/dist/semantic-rule-verifier.d.ts +1 -1
- package/dist/semantic-rule-verifier.js +6 -6
- package/dist/session-observer-bands.d.ts +1 -1
- package/dist/session-observer-state.d.ts +1 -1
- package/dist/signal.d.ts +1 -1
- package/dist/storage.d.ts +3 -1
- package/dist/storage.js +4 -4
- package/dist/summarizer.d.ts +1 -1
- package/dist/summarizer.js +6 -6
- package/dist/summary-snapshot.d.ts +1 -1
- package/dist/targeted-fact-recall.d.ts +17 -0
- package/dist/targeted-fact-recall.js +11 -0
- package/dist/targeted-fact-recall.js.map +1 -0
- package/dist/telemetry-transcript.d.ts +7 -0
- package/dist/telemetry-transcript.js +16 -0
- package/dist/telemetry-transcript.js.map +1 -0
- package/dist/temporal-supersession.d.ts +1 -1
- package/dist/temporal-supersession.js +2 -1
- package/dist/temporal-validity.d.ts +1 -1
- package/dist/threading.d.ts +1 -1
- package/dist/tier-migration.d.ts +1 -1
- package/dist/tier-routing.d.ts +1 -1
- package/dist/tokens.js +1 -1
- package/dist/topics.d.ts +1 -1
- package/dist/transcript.d.ts +1 -1
- package/dist/trust-zones.d.ts +3 -2
- package/dist/trust-zones.js +1 -1
- package/dist/types.d.ts +60 -2
- package/dist/types.js +1 -1
- package/dist/user-model.d.ts +37 -0
- package/dist/user-model.js +28 -0
- package/dist/user-model.js.map +1 -0
- package/dist/utility-runtime.d.ts +1 -1
- package/dist/verified-recall.js +6 -6
- package/package.json +1 -1
- package/dist/chunk-2YMTO4ZJ.js.map +0 -1
- package/dist/chunk-363MWCD3.js.map +0 -1
- package/dist/chunk-36CTNQY7.js.map +0 -1
- package/dist/chunk-5GCNE7CN.js.map +0 -1
- package/dist/chunk-6AUUAZEX.js.map +0 -1
- package/dist/chunk-6Z6UH6TK.js.map +0 -1
- package/dist/chunk-74WWN7ZW.js +0 -82
- package/dist/chunk-74WWN7ZW.js.map +0 -1
- package/dist/chunk-A4ACKWIW.js.map +0 -1
- package/dist/chunk-EQINRHYR.js.map +0 -1
- package/dist/chunk-ERUDW6DU.js +0 -965
- package/dist/chunk-ERUDW6DU.js.map +0 -1
- package/dist/chunk-GGD5W7TB.js.map +0 -1
- package/dist/chunk-IBX3VFOM.js.map +0 -1
- package/dist/chunk-KWBPHZUU.js.map +0 -1
- package/dist/chunk-MCC6KDQF.js.map +0 -1
- package/dist/chunk-NN3LPQ5D.js.map +0 -1
- package/dist/chunk-O4XJUPSF.js.map +0 -1
- package/dist/chunk-S3IP6R6K.js.map +0 -1
- package/dist/chunk-SRBJUAMP.js.map +0 -1
- package/dist/chunk-VQXK37XA.js.map +0 -1
- package/dist/chunk-VTU2B4VF.js.map +0 -1
- package/dist/chunk-VX2IUQFE.js.map +0 -1
- package/dist/chunk-WGK4VHGP.js.map +0 -1
- package/dist/chunk-Y5KDIOKF.js.map +0 -1
- package/dist/chunk-Z5S5HNGY.js.map +0 -1
- package/dist/chunk-ZTSE2ZJ6.js.map +0 -1
- package/dist/contradiction-scan-3Z6YW7YA.js.map +0 -1
- /package/dist/{capsule-export-LLEVB2RG.js.map → action-confidence.js.map} +0 -0
- /package/dist/{capsule-import-UW45R2MZ.js.map → capsule-export-7QNCBZOQ.js.map} +0 -0
- /package/dist/{engine-FOC3IJLA.js.map → capsule-import-EPBHD2EN.js.map} +0 -0
- /package/dist/{chunk-HJYHRE4S.js.map → chunk-242S3I2A.js.map} +0 -0
- /package/dist/{chunk-EYNQTST2.js.map → chunk-4YM32CRU.js.map} +0 -0
- /package/dist/{chunk-PHNGXFQ6.js.map → chunk-7V22HTMD.js.map} +0 -0
- /package/dist/{chunk-P73JTV34.js.map → chunk-BBE34QBJ.js.map} +0 -0
- /package/dist/{chunk-C5HUWVH2.js.map → chunk-CPKTBRS2.js.map} +0 -0
- /package/dist/{chunk-I6BQZSML.js.map → chunk-DZZPC36E.js.map} +0 -0
- /package/dist/{chunk-4DXC6HQQ.js.map → chunk-FQDPCE3I.js.map} +0 -0
- /package/dist/{chunk-57QNCUEZ.js.map → chunk-HL5LRPNA.js.map} +0 -0
- /package/dist/{chunk-QIGOEM65.js.map → chunk-IB3BFHGN.js.map} +0 -0
- /package/dist/{chunk-RXTFCYQF.js.map → chunk-JESOB2HO.js.map} +0 -0
- /package/dist/{chunk-LIO5X3CM.js.map → chunk-UVMUAWVT.js.map} +0 -0
- /package/dist/{chunk-PB5KW5PL.js.map → chunk-WEJG4TB5.js.map} +0 -0
- /package/dist/{chunk-KBYWQWSB.js.map → chunk-X7HPGUVG.js.map} +0 -0
- /package/dist/{chunk-ZL4S7ARC.js.map → chunk-Y3VMVTYX.js.map} +0 -0
- /package/dist/{chunk-6XA7UN4Z.js.map → chunk-ZNQN6ZTA.js.map} +0 -0
- /package/dist/{chunk-WTFWLUSX.js.map → chunk-ZVTKDVVM.js.map} +0 -0
- /package/dist/{memory-governance-F3QOJGEY.js.map → engine-35M5BKQ7.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/explicit-cue-recall.ts"],"sourcesContent":["import { buildEvidencePack } from \"./evidence-pack.js\";\n\nexport interface ExplicitCueRecallEngine {\n expandContext(\n sessionId: string,\n fromTurn: number,\n toTurn: number,\n maxTokens: number,\n ): Promise<Array<{ turn_index: number; role: string; content: string }>>;\n searchContextFull(\n query: string,\n limit: number,\n sessionId?: string,\n ): Promise<\n Array<{\n turn_index: number;\n role: string;\n content: string;\n session_id: string;\n score?: number;\n }>\n >;\n}\n\nexport interface ExplicitCueRecallOptions {\n engine: ExplicitCueRecallEngine | null | undefined;\n sessionId?: string;\n query: string;\n maxChars: number;\n maxItemChars?: number;\n maxReferences?: number;\n includeBenchmarkAnchorCues?: boolean;\n includeStructuredPlanCues?: boolean;\n}\n\nexport type ExplicitTurnReference = {\n number: number;\n includeDirectTurn: boolean;\n};\n\nconst DEFAULT_MAX_CHARS = 2_400;\nconst DEFAULT_MAX_ITEM_CHARS = 1_200;\nconst DEFAULT_MAX_REFERENCES = 24;\nconst REFERENCE_SCAN_TOKEN_FACTOR = 3;\nconst TURN_REFERENCE_WINDOW_RADIUS = 0;\nconst LEXICAL_CUE_WINDOW_RADIUS = 1;\nconst LEXICAL_CUE_SEARCH_LIMIT = 3;\nconst LEXICAL_CUE_MAX_TOKENS = 400;\nconst CONTENT_LABEL_SEARCH_LIMIT = 64;\nconst CONTENT_LABEL_MAX_TOKENS = 2_000;\nconst CONTENT_LABEL_MAX_PAIRED_WINDOWS_PER_REFERENCE = 1;\nconst LATEST_STATE_CUES = new Set([\n \"as of\",\n \"currently\",\n \"latest\",\n \"most recent\",\n \"newest\",\n \"now\",\n \"updated\",\n \"changed\",\n \"change\",\n]);\nconst STRUCTURED_PLAN_FIELD_CUES = new Set([\n \"accommodation\",\n \"attraction\",\n \"breakfast\",\n \"current city\",\n \"dinner\",\n \"flight\",\n \"flights\",\n \"hotel\",\n \"lunch\",\n \"restaurant\",\n \"restaurants\",\n \"transportation\",\n \"traveler\",\n \"travelers\",\n]);\nconst STRUCTURED_PLAN_DEPENDENCY_CUES = new Set([\n \"comparison\",\n \"constraint\",\n \"constraints\",\n \"dependency\",\n \"dependencies\",\n \"join\",\n \"same\",\n \"shared\",\n]);\nconst BENCHMARK_ABILITY_CUES = new Map([\n [\"information extraction\", \"ability=information_extraction\"],\n [\"knowledge update\", \"ability=knowledge_update\"],\n [\"multi session reasoning\", \"ability=multi_session_reasoning\"],\n [\"multi-session reasoning\", \"ability=multi_session_reasoning\"],\n [\"instruction following\", \"ability=instruction_following\"],\n]);\nconst BENCHMARK_ANCHOR_VALUE_STOPWORDS = new Set([\n \"a\",\n \"about\",\n \"an\",\n \"for\",\n \"from\",\n \"in\",\n \"on\",\n \"the\",\n \"to\",\n \"use\",\n \"using\",\n \"with\",\n]);\nconst RELATIVE_TEMPORAL_CUES = [\n \"as of\",\n \"most recent\",\n \"last time\",\n \"last week\",\n \"last month\",\n \"last year\",\n \"last session\",\n \"last conversation\",\n \"next time\",\n \"next week\",\n \"next month\",\n \"next year\",\n \"next session\",\n \"next conversation\",\n \"previous time\",\n \"previous week\",\n \"previous month\",\n \"previous year\",\n \"previous session\",\n \"previous conversation\",\n \"prior time\",\n \"prior week\",\n \"prior month\",\n \"prior year\",\n \"prior session\",\n \"prior conversation\",\n \"today\",\n \"yesterday\",\n \"tomorrow\",\n \"tonight\",\n \"earlier\",\n \"later\",\n \"recently\",\n \"previously\",\n \"currently\",\n \"now\",\n \"latest\",\n \"newest\",\n \"oldest\",\n \"earliest\",\n \"before\",\n \"after\",\n \"since\",\n \"updated\",\n \"changed\",\n \"change\",\n];\nconst SPEAKER_NAME_STOPWORDS = new Set([\n \"A\",\n \"According\",\n \"An\",\n \"And\",\n \"Are\",\n \"As\",\n \"At\",\n \"Before\",\n \"Can\",\n \"Compare\",\n \"Could\",\n \"Did\",\n \"Do\",\n \"Does\",\n \"For\",\n \"From\",\n \"Had\",\n \"Has\",\n \"Have\",\n \"How\",\n \"In\",\n \"Is\",\n \"It\",\n \"Join\",\n \"Of\",\n \"On\",\n \"Or\",\n \"Please\",\n \"Review\",\n \"Step\",\n \"Tell\",\n \"The\",\n \"To\",\n \"Turn\",\n \"Use\",\n \"Was\",\n \"Were\",\n \"What\",\n \"When\",\n \"Where\",\n \"Which\",\n \"Who\",\n \"Why\",\n \"Will\",\n \"Would\",\n]);\nconst QUESTION_SLOT_STOPWORDS = new Set([\n \"answer\",\n \"choice\",\n \"did\",\n \"does\",\n \"do\",\n \"is\",\n \"should\",\n \"single\",\n \"the\",\n \"user\",\n \"was\",\n \"were\",\n]);\n\nexport async function buildExplicitCueRecallSection(\n options: ExplicitCueRecallOptions,\n): Promise<string> {\n const engine = options.engine;\n const query = options.query.trim();\n const maxChars = normalizePositiveInteger(options.maxChars, DEFAULT_MAX_CHARS);\n if (!engine || query.length === 0 || maxChars <= 0) {\n return \"\";\n }\n\n const maxReferences = normalizePositiveInteger(\n options.maxReferences,\n DEFAULT_MAX_REFERENCES,\n );\n if (maxReferences <= 0) {\n return \"\";\n }\n\n const evidenceItems: Array<{\n id: string;\n sessionId: string;\n turnIndex: number;\n role: string;\n content: string;\n score?: number;\n }> = [];\n const seenTurns = new Set<string>();\n\n await collectTurnReferenceEvidence({\n engine,\n sessionId: options.sessionId,\n query,\n maxReferences,\n evidenceItems,\n seenTurns,\n });\n\n await collectLexicalCueEvidence({\n engine,\n sessionId: options.sessionId,\n query,\n maxReferences,\n includeBenchmarkAnchorCues: options.includeBenchmarkAnchorCues,\n includeStructuredPlanCues: options.includeStructuredPlanCues,\n evidenceItems,\n seenTurns,\n });\n\n return buildEvidencePack(evidenceItems, {\n title: \"Explicit Cue Evidence\",\n maxChars,\n maxItemChars: normalizePositiveInteger(\n options.maxItemChars,\n DEFAULT_MAX_ITEM_CHARS,\n ),\n });\n}\n\nasync function collectTurnReferenceEvidence(options: {\n engine: ExplicitCueRecallEngine;\n sessionId?: string;\n query: string;\n maxReferences: number;\n evidenceItems: Array<{\n id: string;\n sessionId: string;\n turnIndex: number;\n role: string;\n content: string;\n }>;\n seenTurns: Set<string>;\n}): Promise<void> {\n if (!options.sessionId) {\n return;\n }\n\n const references = collectExplicitTurnReferences(options.query).slice(\n 0,\n options.maxReferences,\n );\n if (references.length === 0) {\n return;\n }\n\n await collectContentLabelReferenceEvidence({\n engine: options.engine,\n sessionId: options.sessionId,\n query: options.query,\n references,\n evidenceItems: options.evidenceItems,\n seenTurns: options.seenTurns,\n });\n\n const windows = new Map<string, { fromTurn: number; toTurn: number }>();\n for (const reference of references) {\n for (const center of candidateTurnIndexesForReference(reference)) {\n if (center < 0) {\n continue;\n }\n\n const fromTurn = Math.max(0, center - TURN_REFERENCE_WINDOW_RADIUS);\n const toTurn = center + TURN_REFERENCE_WINDOW_RADIUS;\n windows.set(`${fromTurn}:${toTurn}`, { fromTurn, toTurn });\n }\n }\n\n for (const window of [...windows.values()].sort(\n (left, right) => left.fromTurn - right.fromTurn || left.toTurn - right.toTurn,\n )) {\n const expanded = await options.engine.expandContext(\n options.sessionId,\n window.fromTurn,\n window.toTurn,\n 2_000,\n );\n appendExpandedEvidence(\n options.evidenceItems,\n options.seenTurns,\n options.sessionId,\n expanded,\n );\n }\n}\n\nasync function collectContentLabelReferenceEvidence(options: {\n engine: ExplicitCueRecallEngine;\n sessionId?: string;\n query: string;\n references: ExplicitTurnReference[];\n evidenceItems: Array<{\n id: string;\n sessionId: string;\n turnIndex: number;\n role: string;\n content: string;\n }>;\n seenTurns: Set<string>;\n}): Promise<Set<number>> {\n const resolved = new Set<number>();\n\n for (const reference of options.references) {\n if (reference.includeDirectTurn) {\n continue;\n }\n\n const hits = await searchReferenceContentLabels(\n options.engine,\n reference.number,\n options.sessionId,\n );\n if (hits.length === 0) {\n continue;\n }\n\n resolved.add(reference.number);\n let appendedWindows = 0;\n for (const hit of hits) {\n if (appendedWindows >= CONTENT_LABEL_MAX_PAIRED_WINDOWS_PER_REFERENCE) {\n break;\n }\n\n const { fromTurn, toTurn } = contentLabelEvidenceWindow(hit, {\n includeSuccessor: hasSuccessorTrajectoryIntent(options.query),\n });\n const expanded = await options.engine.expandContext(\n hit.session_id,\n fromTurn,\n toTurn,\n CONTENT_LABEL_MAX_TOKENS,\n );\n if (!expandedHasPairedTrajectoryLabels(expanded, reference.number)) {\n continue;\n }\n if (expanded.length === 0) {\n appendEvidenceItem(options.evidenceItems, options.seenTurns, {\n id: `${hit.session_id}:${hit.turn_index}`,\n sessionId: hit.session_id,\n turnIndex: hit.turn_index,\n role: hit.role,\n content: hit.content,\n });\n continue;\n }\n appendExpandedEvidence(\n options.evidenceItems,\n options.seenTurns,\n hit.session_id,\n expanded,\n );\n appendedWindows += 1;\n }\n }\n\n return resolved;\n}\n\nasync function searchReferenceContentLabels(\n engine: ExplicitCueRecallEngine,\n referenceNumber: number,\n sessionId?: string,\n): Promise<\n Array<{\n turn_index: number;\n role: string;\n content: string;\n session_id: string;\n labelKind: \"action\" | \"observation\";\n }>\n> {\n const hits = new Map<\n string,\n {\n turn_index: number;\n role: string;\n content: string;\n session_id: string;\n labelKind: \"action\" | \"observation\";\n }\n >();\n\n for (const labelKind of [\"action\", \"observation\"] as const) {\n const label = labelKind === \"action\" ? \"Action\" : \"Observation\";\n for (const query of [`[${label} ${referenceNumber}]`, `${label} ${referenceNumber}`]) {\n const results = await engine.searchContextFull(\n query,\n CONTENT_LABEL_SEARCH_LIMIT,\n sessionId,\n );\n for (const result of results) {\n if (\n !isReferenceLabelRole(result.role, labelKind) ||\n !contentHasReferenceLabel(result.content, labelKind, referenceNumber)\n ) {\n continue;\n }\n hits.set(`${result.session_id}:${result.turn_index}:${labelKind}`, {\n turn_index: result.turn_index,\n role: result.role,\n content: result.content,\n session_id: result.session_id,\n labelKind,\n });\n }\n }\n }\n\n const numericCandidates = candidateTurnIndexesForReference({\n number: referenceNumber,\n includeDirectTurn: false,\n });\n return [...hits.values()].sort((left, right) => {\n const sessionOrder = left.session_id.localeCompare(right.session_id);\n if (sessionOrder !== 0) {\n return sessionOrder;\n }\n const leftDistance = nearestTurnDistance(left.turn_index, numericCandidates);\n const rightDistance = nearestTurnDistance(right.turn_index, numericCandidates);\n if (leftDistance !== rightDistance) {\n return leftDistance - rightDistance;\n }\n return left.turn_index - right.turn_index || left.labelKind.localeCompare(right.labelKind);\n });\n}\n\nfunction nearestTurnDistance(turnIndex: number, candidates: readonly number[]): number {\n let nearest = Number.POSITIVE_INFINITY;\n for (const candidate of candidates) {\n nearest = Math.min(nearest, Math.abs(turnIndex - candidate));\n }\n return nearest;\n}\n\nfunction contentLabelEvidenceWindow(hit: {\n turn_index: number;\n labelKind: \"action\" | \"observation\";\n}, options: { includeSuccessor?: boolean } = {}): { fromTurn: number; toTurn: number } {\n const successorTurns = options.includeSuccessor === true ? 2 : 0;\n if (hit.labelKind === \"action\") {\n return {\n fromTurn: Math.max(0, hit.turn_index - 1),\n toTurn: hit.turn_index + 1 + successorTurns,\n };\n }\n\n return {\n fromTurn: Math.max(0, hit.turn_index - 1),\n toTurn: hit.turn_index + successorTurns,\n };\n}\n\nfunction hasSuccessorTrajectoryIntent(query: string): boolean {\n const raw = query.toLowerCase();\n const normalized = raw.replace(/[^a-z0-9]+/g, \" \").trim();\n if ([\n /\\bafter\\s+(?:step|action|observation|turn)\\s+\\d+\\b/,\n /\\b(?:next|following|subsequent|successor)\\s+(?:step|action|observation|turn)\\b/,\n /\\b(?:step|action|observation|turn)\\s+\\d+\\s+(?:then|and then)\\b/,\n /\\bwhat\\s+(?:happened|came|occurred)\\s+next\\b/,\n ].some((pattern) => pattern.test(normalized))) {\n return true;\n }\n\n if (!hasLoopExitIntent(normalized)) {\n return false;\n }\n\n if (!hasBoundedTrajectoryReference(raw)) {\n return true;\n }\n\n return !asksForActionInsideBoundedRange(normalized) &&\n hasNamedTrajectoryActionCue(normalized);\n}\n\nfunction hasBoundedTrajectoryReference(query: string): boolean {\n return hasBoundedTrajectoryRange(query) || hasSingleTrajectoryReference(query);\n}\n\nfunction hasLoopExitIntent(normalizedQuery: string): boolean {\n const exitVerbs = \"(?:breaks?|breaking|broke|ends?|ending|ended|stops?|stopping|stopped)\";\n const loopNouns = \"(?:loop|cycle|pattern|sequence)\";\n return [\n new RegExp(\n `\\\\b${exitVerbs}\\\\s+(?:out\\\\s+of\\\\s+)?(?:this|that|the|a|an)?\\\\s*${loopNouns}\\\\b`,\n ),\n new RegExp(\n `\\\\b${loopNouns}\\\\s+(?:${exitVerbs}|is\\\\s+${exitVerbs}|was\\\\s+${exitVerbs})\\\\b`,\n ),\n ].some((pattern) => pattern.test(normalizedQuery));\n}\n\nfunction hasBoundedTrajectoryRange(query: string): boolean {\n return [\n /\\b(?:between|from|in|during|within)\\s+(?:steps?|actions?|observations?|turns?)\\s+#?\\d+\\s*(?:-|\\u2013|\\u2014|\\bto\\b|\\bthrough\\b|\\bthru\\b|\\band\\b)\\s*#?\\d+\\b/,\n /\\b(?:steps?|actions?|observations?|turns?)\\s+#?\\d+\\s*(?:-|\\u2013|\\u2014|\\bto\\b|\\bthrough\\b|\\bthru\\b)\\s*#?\\d+\\b/,\n ].some((pattern) => pattern.test(query));\n}\n\nfunction hasSingleTrajectoryReference(query: string): boolean {\n return /\\b(?:in|during|within|at|on)?\\s*(?:steps?|actions?|observations?|turns?)\\s+#?\\d+\\b/.test(\n query,\n );\n}\n\nfunction asksForActionInsideBoundedRange(normalizedQuery: string): boolean {\n return /\\b(?:which|what)\\s+(?:single\\s+)?(?:action|move|step|maneuver)\\s+(?:broke|breaks|breaking|ended|ends|stopped|stops|mattered|accomplished|advanced)\\b/.test(\n normalizedQuery,\n );\n}\n\nfunction hasNamedTrajectoryActionCue(normalizedQuery: string): boolean {\n const actions = \"(?:up|down|left|right|wait|stay|push|pull|open|close|use|enter|exit)\";\n return new RegExp(\n `\\\\b(?:${actions}\\\\s+(?:action|move|step|maneuver)|(?:action|move|step|maneuver)\\\\s+${actions})\\\\b`,\n ).test(normalizedQuery);\n}\n\nfunction contentHasReferenceLabel(\n content: string,\n labelKind: \"action\" | \"observation\",\n referenceNumber: number,\n): boolean {\n const label = labelKind === \"action\" ? \"Action\" : \"Observation\";\n const escapedNumber = String(referenceNumber).replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(\n `^\\\\s*\\\\[\\\\s*${label}\\\\s+${escapedNumber}\\\\s*\\\\]\\\\s*(?::\\\\s*)?`,\n \"i\",\n ).test(content);\n}\n\nfunction isReferenceLabelRole(\n role: string,\n labelKind: \"action\" | \"observation\",\n): boolean {\n if (labelKind === \"action\") {\n return role === \"user\";\n }\n return role === \"assistant\";\n}\n\nfunction expandedHasPairedTrajectoryLabels(\n expanded: Array<{ role: string; content: string }>,\n referenceNumber: number,\n): boolean {\n let hasAction = false;\n let hasObservation = false;\n for (const message of expanded) {\n if (\n isReferenceLabelRole(message.role, \"action\") &&\n contentHasReferenceLabel(message.content, \"action\", referenceNumber)\n ) {\n hasAction = true;\n }\n if (\n isReferenceLabelRole(message.role, \"observation\") &&\n contentHasReferenceLabel(message.content, \"observation\", referenceNumber)\n ) {\n hasObservation = true;\n }\n }\n return hasAction && hasObservation;\n}\n\nasync function collectLexicalCueEvidence(options: {\n engine: ExplicitCueRecallEngine;\n sessionId?: string;\n query: string;\n maxReferences: number;\n includeBenchmarkAnchorCues?: boolean;\n includeStructuredPlanCues?: boolean;\n evidenceItems: Array<{\n id: string;\n sessionId: string;\n turnIndex: number;\n role: string;\n content: string;\n score?: number;\n }>;\n seenTurns: Set<string>;\n}): Promise<void> {\n const cues = collectLexicalCues(options.query, {\n includeBenchmarkAnchorCues: options.includeBenchmarkAnchorCues,\n includeStructuredPlanCues: options.includeStructuredPlanCues,\n }).slice(0, options.maxReferences);\n const preferLatest = hasLatestStateIntent(options.query);\n for (const cue of cues) {\n const results = sortLexicalCueResults(\n await options.engine.searchContextFull(\n cue,\n LEXICAL_CUE_SEARCH_LIMIT,\n options.sessionId,\n ),\n preferLatest,\n );\n for (const result of results) {\n const windowRadius = preferLatest ? 0 : LEXICAL_CUE_WINDOW_RADIUS;\n const fromTurn = Math.max(0, result.turn_index - windowRadius);\n const toTurn = result.turn_index + windowRadius;\n const expanded = await options.engine.expandContext(\n result.session_id,\n fromTurn,\n toTurn,\n LEXICAL_CUE_MAX_TOKENS,\n );\n if (expanded.length === 0) {\n appendEvidenceItem(options.evidenceItems, options.seenTurns, {\n id: `${result.session_id}:${result.turn_index}`,\n sessionId: result.session_id,\n turnIndex: result.turn_index,\n role: result.role,\n content: result.content,\n ...(typeof result.score === \"number\" ? { score: result.score } : {}),\n });\n continue;\n }\n appendExpandedEvidence(\n options.evidenceItems,\n options.seenTurns,\n result.session_id,\n expanded,\n );\n }\n }\n}\n\nfunction appendExpandedEvidence(\n evidenceItems: Array<{\n id: string;\n sessionId: string;\n turnIndex: number;\n role: string;\n content: string;\n }>,\n seenTurns: Set<string>,\n sessionId: string,\n expanded: Array<{ turn_index: number; role: string; content: string }>,\n): void {\n for (const message of expanded) {\n appendEvidenceItem(evidenceItems, seenTurns, {\n id: `${sessionId}:${message.turn_index}`,\n sessionId,\n turnIndex: message.turn_index,\n role: message.role,\n content: message.content,\n });\n }\n}\n\nfunction appendEvidenceItem<T extends { id: string }>(\n evidenceItems: T[],\n seenTurns: Set<string>,\n item: T,\n): void {\n if (seenTurns.has(item.id)) {\n return;\n }\n seenTurns.add(item.id);\n evidenceItems.push(item);\n}\n\nexport function collectExplicitTurnReferences(\n query: string,\n): ExplicitTurnReference[] {\n const references = new Map<string, ExplicitTurnReference>();\n const addReference = (value: number, label: string) => {\n const existing = references.get(String(value));\n references.set(String(value), {\n number: value,\n includeDirectTurn:\n (existing?.includeDirectTurn ?? false) || label === \"turn\",\n });\n };\n\n const tokens = tokenizeReferenceQuery(query);\n for (let index = 0; index < tokens.length; index += 1) {\n const label = normalizeReferenceLabel(tokens[index]);\n if (!label) {\n continue;\n }\n\n const parsed = parseReferenceNumbers(tokens, index + 1);\n for (const number of parsed.numbers) {\n addReference(number, label);\n }\n index = Math.max(index, parsed.nextIndex - 1);\n }\n\n return [...references.values()].sort((left, right) => left.number - right.number);\n}\n\nexport function collectLexicalCues(\n query: string,\n options: {\n includeBenchmarkAnchorCues?: boolean;\n includeStructuredPlanCues?: boolean;\n } = {},\n): string[] {\n const cues = new Set<string>();\n\n for (const match of query.matchAll(/\\b[A-Za-z][A-Za-z0-9]{0,12}\\d+:\\d+\\b/g)) {\n cues.add(match[0]);\n }\n for (const match of query.matchAll(/\\b\\d{4}-\\d{2}-\\d{2}(?:T\\d{2}:\\d{2}(?::\\d{2})?Z?)?\\b/g)) {\n cues.add(match[0]);\n }\n for (const cue of collectTemporalLexicalCues(query)) {\n cues.add(cue);\n }\n for (const cue of collectQuestionSlotCues(query)) {\n cues.add(cue);\n }\n if (options.includeBenchmarkAnchorCues) {\n for (const cue of collectBenchmarkAnchorCues(query)) {\n cues.add(cue);\n }\n }\n if (options.includeStructuredPlanCues) {\n for (const cue of collectStructuredPlanCues(query)) {\n cues.add(cue);\n }\n }\n for (const match of query.matchAll(/\\b(?:session|source|chat|plan|task|event|file|tool)[_-][A-Za-z0-9][A-Za-z0-9_.:-]{0,80}\\b/gi)) {\n cues.add(match[0]);\n }\n for (const match of query.matchAll(/\\b[A-Z][a-z]{1,30}(?:\\s+[A-Z][a-z]{1,30}){0,2}\\b/g)) {\n const value = normalizeSpeakerNameCue(match[0]);\n if (value) {\n cues.add(value);\n }\n }\n for (const match of query.matchAll(/\\[([A-Za-z0-9][A-Za-z0-9_.:/ -]{1,80})\\]/g)) {\n const value = match[1]?.trim();\n if (value) {\n cues.add(value);\n }\n }\n\n return [...cues].sort((left, right) => left.localeCompare(right));\n}\n\nexport function collectQuestionSlotCues(query: string): string[] {\n const cues = new Set<string>();\n for (const match of query.matchAll(\n /\\b(?:what|which)\\s+([a-z][a-z0-9_-]{2,30})\\s+(?:does|do|did|is|are|was|were|should|would|could|can|will)\\b/gi,\n )) {\n const value = match[1]?.toLowerCase();\n if (value && !QUESTION_SLOT_STOPWORDS.has(value)) {\n cues.add(value);\n }\n }\n return [...cues].sort((left, right) => left.localeCompare(right));\n}\n\nexport function collectBenchmarkAnchorCues(query: string): string[] {\n const cues = new Set<string>();\n const normalizedQuery = query.toLowerCase().replace(/\\s+/g, \" \");\n for (const [phrase, cue] of BENCHMARK_ABILITY_CUES) {\n if (containsBoundedPhrase(normalizedQuery, phrase)) {\n cues.add(cue);\n }\n }\n\n const tokens = tokenizeAnchorQuery(query);\n for (let index = 0; index < tokens.length; index += 1) {\n let prefix = normalizeBenchmarkAnchorPrefix(tokens[index]);\n if (!prefix) {\n continue;\n }\n\n let valueIndex = index + 1;\n if (\n prefix === \"source\" &&\n tokens[valueIndex]?.toLowerCase() === \"chat\"\n ) {\n prefix = \"source_chat\";\n valueIndex += 1;\n }\n const maybeIdLabel = tokens[valueIndex]?.toLowerCase();\n if (maybeIdLabel === \"id\" || maybeIdLabel === \"ids\") {\n valueIndex += 1;\n }\n\n let consumedValue = false;\n for (\n let currentValueIndex = valueIndex;\n currentValueIndex < tokens.length;\n currentValueIndex += 1\n ) {\n const rawValue = tokens[currentValueIndex];\n const normalizedValue = rawValue?.toLowerCase();\n if (!rawValue || normalizeBenchmarkAnchorPrefix(rawValue)) {\n break;\n }\n if (normalizedValue === \"and\" || normalizedValue === \"or\") {\n continue;\n }\n if (BENCHMARK_ANCHOR_VALUE_STOPWORDS.has(normalizedValue)) {\n break;\n }\n if (!isBenchmarkAnchorValue(rawValue)) {\n break;\n }\n addBenchmarkAnchorCues(cues, prefix, rawValue);\n consumedValue = true;\n index = currentValueIndex;\n }\n if (!consumedValue) {\n continue;\n }\n }\n\n return [...cues].sort((left, right) => left.localeCompare(right));\n}\n\nfunction addBenchmarkAnchorCues(\n cues: Set<string>,\n prefix: string,\n rawValue: string,\n): void {\n cues.add(`${prefix}_id=${rawValue}`);\n cues.add(`${prefix}-${rawValue}`);\n if (prefix === \"source_chat\") {\n cues.add(`chat_id=${rawValue}`);\n }\n}\n\nfunction isBenchmarkAnchorValue(token: string): boolean {\n for (const char of token) {\n if (isAsciiDigitChar(char)) {\n return true;\n }\n }\n return false;\n}\n\nfunction isAsciiDigitChar(char: string): boolean {\n const code = char.charCodeAt(0);\n return code >= 48 && code <= 57;\n}\n\nfunction normalizeBenchmarkAnchorPrefix(token: string | undefined): string | undefined {\n switch (token?.toLowerCase()) {\n case \"ability\":\n case \"chat\":\n case \"plan\":\n case \"rubric\":\n case \"source\":\n return token.toLowerCase();\n default:\n return undefined;\n }\n}\n\nfunction tokenizeAnchorQuery(query: string): string[] {\n const tokens: string[] = [];\n let current = \"\";\n const push = () => {\n const token = trimTrailingAnchorTokenPunctuation(current);\n if (token.length > 0) {\n tokens.push(token);\n }\n current = \"\";\n };\n\n for (const char of query) {\n if (\n isAsciiLetterOrDigit(char) ||\n char === \"_\" ||\n char === \"-\" ||\n char === \".\" ||\n char === \":\"\n ) {\n current += char;\n continue;\n }\n push();\n }\n push();\n return tokens;\n}\n\nfunction trimTrailingAnchorTokenPunctuation(token: string): string {\n let end = token.length;\n while (end > 0) {\n const char = token[end - 1];\n if (\n char !== \".\" &&\n char !== \":\" &&\n char !== \";\" &&\n char !== \"!\" &&\n char !== \"?\"\n ) {\n break;\n }\n end -= 1;\n }\n return token.slice(0, end);\n}\n\nexport function collectStructuredPlanCues(query: string): string[] {\n const cues = new Set<string>();\n const normalizedQuery = query.toLowerCase().replace(/\\s+/g, \" \");\n for (const cue of STRUCTURED_PLAN_FIELD_CUES) {\n if (containsBoundedPhrase(normalizedQuery, cue)) {\n cues.add(cue);\n }\n }\n if (cues.size === 0) {\n return [];\n }\n for (const cue of STRUCTURED_PLAN_DEPENDENCY_CUES) {\n if (containsBoundedPhrase(normalizedQuery, cue)) {\n cues.add(cue);\n }\n }\n return [...cues].sort((left, right) => left.localeCompare(right));\n}\n\nfunction containsBoundedPhrase(normalizedHaystack: string, phrase: string): boolean {\n let searchFrom = 0;\n while (searchFrom < normalizedHaystack.length) {\n const index = normalizedHaystack.indexOf(phrase, searchFrom);\n if (index < 0) {\n return false;\n }\n const afterIndex = index + phrase.length;\n if (\n isTemporalCueBoundary(normalizedHaystack[index - 1]) &&\n isTemporalCueBoundary(normalizedHaystack[afterIndex])\n ) {\n return true;\n }\n searchFrom = afterIndex;\n }\n return false;\n}\n\nexport function collectTemporalLexicalCues(query: string): string[] {\n const cues = new Set<string>();\n const normalizedQuery = query.toLowerCase().replace(/\\s+/g, \" \");\n for (const cue of RELATIVE_TEMPORAL_CUES) {\n if (containsBoundedPhrase(normalizedQuery, cue)) {\n cues.add(cue);\n }\n }\n return [...cues].sort((left, right) => left.localeCompare(right));\n}\n\nfunction hasLatestStateIntent(query: string): boolean {\n return collectTemporalLexicalCues(query).some((cue) =>\n LATEST_STATE_CUES.has(cue),\n );\n}\n\nfunction sortLexicalCueResults<\n T extends { session_id: string; turn_index: number; score?: number },\n>(results: T[], preferLatest: boolean): T[] {\n return [...results].sort((left, right) => {\n if (preferLatest) {\n const sessionOrder = left.session_id.localeCompare(right.session_id);\n if (sessionOrder !== 0) {\n return sessionOrder;\n }\n const turnOrder = right.turn_index - left.turn_index;\n if (turnOrder !== 0) {\n return turnOrder;\n }\n return (right.score ?? 0) - (left.score ?? 0);\n }\n const scoreDelta = (right.score ?? 0) - (left.score ?? 0);\n if (scoreDelta !== 0) {\n return scoreDelta;\n }\n const sessionOrder = left.session_id.localeCompare(right.session_id);\n if (sessionOrder !== 0) {\n return sessionOrder;\n }\n return left.turn_index - right.turn_index;\n });\n}\n\nfunction normalizeSpeakerNameCue(value: string): string | undefined {\n const words = value.trim().split(/\\s+/).filter(Boolean);\n while (words.length > 0 && SPEAKER_NAME_STOPWORDS.has(words[0]!)) {\n words.shift();\n }\n while (words.length > 0 && SPEAKER_NAME_STOPWORDS.has(words[words.length - 1]!)) {\n words.pop();\n }\n return words.length > 0 ? words.join(\" \") : undefined;\n}\n\nfunction isTemporalCueBoundary(char: string | undefined): boolean {\n if (!char) {\n return true;\n }\n return !isAsciiLetterOrDigit(char);\n}\n\nfunction tokenizeReferenceQuery(query: string): string[] {\n const tokens: string[] = [];\n let current = \"\";\n\n const flushCurrent = () => {\n if (current) {\n tokens.push(current);\n current = \"\";\n }\n };\n\n for (const char of query) {\n if (isAsciiLetterOrDigit(char)) {\n current += char;\n continue;\n }\n\n flushCurrent();\n if (char === \"#\" || char === \",\") {\n tokens.push(char);\n } else if (isReferenceDash(char)) {\n tokens.push(\"-\");\n }\n }\n flushCurrent();\n\n return tokens;\n}\n\nfunction parseReferenceNumbers(\n tokens: readonly string[],\n startIndex: number,\n): { numbers: number[]; nextIndex: number } {\n const numbers: number[] = [];\n let lastNumber: number | undefined;\n let pendingRangeStart: number | undefined;\n let index = startIndex;\n const scanEnd = Math.min(\n tokens.length,\n startIndex + DEFAULT_MAX_REFERENCES * REFERENCE_SCAN_TOKEN_FACTOR,\n );\n\n for (; index < scanEnd; index += 1) {\n const token = tokens[index]!;\n const normalized = token.toLowerCase();\n const value = parseNonNegativeIntegerToken(token);\n if (value !== undefined) {\n if (pendingRangeStart !== undefined) {\n numbers.push(...expandReferenceRange(pendingRangeStart, value));\n pendingRangeStart = undefined;\n } else {\n numbers.push(value);\n }\n lastNumber = value;\n continue;\n }\n\n if (normalized === \"#\" || normalized === \"number\" || normalized === \",\") {\n continue;\n }\n\n if (\n normalized === \"-\" ||\n normalized === \"to\" ||\n normalized === \"through\" ||\n normalized === \"thru\"\n ) {\n if (lastNumber !== undefined) {\n if (numbers[numbers.length - 1] === lastNumber) {\n numbers.pop();\n }\n pendingRangeStart = lastNumber;\n }\n continue;\n }\n\n if (normalized === \"and\" && numbers.length > 0) {\n continue;\n }\n\n if (normalizeReferenceLabel(token)) {\n break;\n }\n\n break;\n }\n\n if (pendingRangeStart !== undefined) {\n numbers.push(pendingRangeStart);\n }\n\n return {\n numbers: [...new Set(numbers)],\n nextIndex: index,\n };\n}\n\nfunction expandReferenceRange(start: number, end: number): number[] {\n const low = Math.min(start, end);\n const high = Math.max(start, end);\n if (high - low + 1 > DEFAULT_MAX_REFERENCES) {\n return [start, end];\n }\n\n const values: number[] = [];\n for (let value = low; value <= high; value += 1) {\n values.push(value);\n }\n return values;\n}\n\nfunction normalizeReferenceLabel(token: string | undefined): string | undefined {\n const normalized = token?.toLowerCase();\n switch (normalized) {\n case \"step\":\n case \"steps\":\n return \"step\";\n case \"turn\":\n case \"turns\":\n return \"turn\";\n case \"action\":\n case \"actions\":\n return \"action\";\n case \"observation\":\n case \"observations\":\n return \"observation\";\n default:\n return undefined;\n }\n}\n\nfunction candidateTurnIndexesForReference(\n reference: ExplicitTurnReference,\n): number[] {\n const candidates = new Set<number>();\n if (reference.includeDirectTurn) {\n for (let offset = -1; offset <= 1; offset += 1) {\n candidates.add(reference.number + offset);\n }\n }\n\n const pairedBase = reference.number * 2;\n // Action/observation traces are stored as paired turns:\n // turn 2N => [Action N]\n // turn 2N + 1 => [Observation N]\n // Include the preceding observation so transition questions can compare the\n // state before and after the action, but avoid pulling in Action N+1. Future\n // actions caused explicit step questions to drift to the next step.\n for (let offset = -1; offset <= 1; offset += 1) {\n candidates.add(pairedBase + offset);\n }\n\n return [...candidates].sort((left, right) => left - right);\n}\n\nfunction parseNonNegativeIntegerToken(token: string): number | undefined {\n if (token.length === 0) {\n return undefined;\n }\n\n let value = 0;\n for (const char of token) {\n const code = char.charCodeAt(0);\n if (code < 48 || code > 57) {\n return undefined;\n }\n value = value * 10 + (code - 48);\n }\n return value;\n}\n\nfunction normalizePositiveInteger(value: number | undefined, fallback: number): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return fallback;\n }\n return Math.max(0, Math.floor(value));\n}\n\nfunction isAsciiLetterOrDigit(char: string): boolean {\n const code = char.charCodeAt(0);\n return (code >= 48 && code <= 57)\n || (code >= 65 && code <= 90)\n || (code >= 97 && code <= 122);\n}\n\nfunction isReferenceDash(char: string): boolean {\n return char === \"-\"\n || char === \"\\u2010\"\n || char === \"\\u2011\"\n || char === \"\\u2012\"\n || char === \"\\u2013\"\n || char === \"\\u2014\"\n || char === \"\\u2015\";\n}\n"],"mappings":"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","names":["sessionOrder"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/intent.ts"],"sourcesContent":["import type { MemoryIntent, RecallPlanMode } from \"./types.js\";\n\nconst GOAL_PATTERNS: Array<{ re: RegExp; goal: string }> = [\n { re: /\\b(debug(?:s|ged|ging)?|fix(?:es|ed|ing)?|error(?:s)?|incident(?:s)?|outage(?:s)?|failure(?:s)?)\\b/i, goal: \"stabilize\" },\n { re: /\\b(deploy(?:s|ed|ing)?|release(?:s|d|ing)?|ship(?:s|ped|ping)?|publish(?:es|ed|ing)?)\\b/i, goal: \"release\" },\n { re: /\\b(plan(?:s|ned|ning)?|roadmap(?:s)?|strateg(?:y|ies)|design(?:s|ed|ing)?)\\b/i, goal: \"plan\" },\n { re: /\\b(review(?:s|ed|ing)?|audit(?:s|ed|ing)?|security|hardening)\\b/i, goal: \"review\" },\n { re: /\\b(sales|deal|customer|client|prospect)\\b/i, goal: \"close_deal\" },\n];\n\nconst ACTION_PATTERNS: Array<{ re: RegExp; action: string }> = [\n { re: /\\b(review(?:s|ed|ing)?|audit(?:s|ed|ing)?|inspect(?:s|ed|ing)?|check(?:s|ed|ing)?)\\b/i, action: \"review\" },\n { re: /\\b(plan(?:s|ned|ning)?|design(?:s|ed|ing)?|brainstorm(?:s|ed|ing)?|spec(?:s)?)\\b/i, action: \"plan\" },\n { re: /\\b(implement(?:s|ed|ing)?|build(?:s|ing)?|built|code(?:s|d|ing)?|patch(?:es|ed|ing)?|fix(?:es|ed|ing)?)\\b/i, action: \"execute\" },\n { re: /\\b(summariz(?:e|es|ed|ing)|recap(?:s|ped|ping)?|what happened|timeline)\\b/i, action: \"summarize\" },\n { re: /\\b(decid(?:e|es|ed|ing)|decision(?:s)?|cho(?:ose|oses|osing)|chose|chosen)\\b/i, action: \"decide\" },\n];\n\nconst ENTITY_PATTERNS: Array<{ re: RegExp; entityType: string }> = [\n { re: /\\b(pr|pull request|branch|repo|github|ci|workflow)\\b/i, entityType: \"repo\" },\n { re: /\\b(discord|slack|channel|gateway|agent)\\b/i, entityType: \"ops\" },\n { re: /\\b(customer|client|deal|lead|account)\\b/i, entityType: \"client\" },\n { re: /\\b(model|llm|qmd|embedding|retrieval|memory)\\b/i, entityType: \"ai\" },\n { re: /\\b(doc|readme|docs|changelog)\\b/i, entityType: \"docs\" },\n];\n\n/** User/agent is starting a hands-on task (issue #519 procedure recall gate). */\nconst TASK_INITIATION_RE =\n /\\b(ship(?:ping|ped)?|deploy(?:ing|ed)?|release|publish|open(?:ing)?\\s+(?:a\\s+)?(?:pr|pull\\s+request)|merge(?:ing)?\\s+(?:the\\s+)?(?:pr|pull\\s+request)|run\\s+(?:the\\s+)?tests?|start(?:ing)?\\s+(?:work|on|the)|kick\\s+off|implement(?:ing|ed)?|let's\\s+(?:ship|deploy|release|publish|open|run|merge|implement|fix|patch|build|start|do|get|put|wire|hook|land|roll)\\b|going\\s+to\\s+(?:ship|deploy|release|open|run|merge)|need\\s+to\\s+(?:ship|deploy|run|open|merge|test)|fix(?:ing|ed)?\\s+(?:(?:the|a)\\s+)?(?:\\w+\\s+){0,4}(?:bug|build)\\b|patch(?:ing|ed)?|build(?:ing)?\\s+(?:and\\s+)?(?:ship|deploy))\\b/i;\n\nfunction normalizeTextInput(input: unknown): string {\n return typeof input === \"string\" ? input : \"\";\n}\n\nexport function inferIntentFromText(text: string): MemoryIntent {\n const safeText = normalizeTextInput(text);\n const goal = GOAL_PATTERNS.find((p) => p.re.test(safeText))?.goal ?? \"unknown\";\n const actionType = ACTION_PATTERNS.find((p) => p.re.test(safeText))?.action ?? \"unknown\";\n const entityTypes = Array.from(\n new Set(ENTITY_PATTERNS.filter((p) => p.re.test(safeText)).map((p) => p.entityType)),\n );\n const taskInitiation = TASK_INITIATION_RE.test(safeText);\n\n return {\n goal,\n actionType,\n entityTypes,\n taskInitiation,\n };\n}\n\nexport function isTaskInitiationIntent(intent: MemoryIntent): boolean {\n return intent.taskInitiation === true;\n}\n\nexport function intentCompatibilityScore(queryIntent: MemoryIntent, memoryIntent: MemoryIntent): number {\n const queryHasSignal =\n queryIntent.goal !== \"unknown\" ||\n queryIntent.actionType !== \"unknown\" ||\n queryIntent.entityTypes.length > 0;\n const memoryHasSignal =\n memoryIntent.goal !== \"unknown\" ||\n memoryIntent.actionType !== \"unknown\" ||\n memoryIntent.entityTypes.length > 0;\n if (!queryHasSignal || !memoryHasSignal) return 0;\n\n let score = 0;\n if (\n queryIntent.goal !== \"unknown\" &&\n memoryIntent.goal !== \"unknown\" &&\n queryIntent.goal === memoryIntent.goal\n ) {\n score += 0.5;\n }\n if (\n queryIntent.actionType !== \"unknown\" &&\n memoryIntent.actionType !== \"unknown\" &&\n queryIntent.actionType === memoryIntent.actionType\n ) {\n score += 0.3;\n }\n\n const overlap = queryIntent.entityTypes.filter((et) => memoryIntent.entityTypes.includes(et)).length;\n if (overlap > 0) {\n const denom = Math.max(queryIntent.entityTypes.length, memoryIntent.entityTypes.length, 1);\n score += 0.2 * (overlap / denom);\n }\n\n return Math.max(0, Math.min(1, score));\n}\n\nexport function planRecallMode(prompt: string): RecallPlanMode {\n const p = normalizeTextInput(prompt).trim();\n let ackCandidate = p;\n while (ackCandidate.length > 0) {\n const ch = ackCandidate.charCodeAt(ackCandidate.length - 1);\n const isDigit = ch >= 48 && ch <= 57;\n const isUpper = ch >= 65 && ch <= 90;\n const isLower = ch >= 97 && ch <= 122;\n // Strip any trailing non-alphanumeric noise (punctuation/emojis/symbols).\n if (isDigit || isUpper || isLower) break;\n ackCandidate = ackCandidate.slice(0, -1);\n }\n ackCandidate = ackCandidate.trim();\n if (p.length === 0) return \"no_recall\";\n\n if (/\\b(timeline|sequence|history|what happened|chain of events|root cause)\\b/i.test(p)) {\n return \"graph_mode\";\n }\n\n // Reserve no_recall for low-information acknowledgements; avoid broad regressions.\n if (\n p.length <= 18 &&\n /^(ok|okay|kk|thanks|thx|got it|sounds good|yep|yes|nope|no|done|cool|works)$/i.test(ackCandidate)\n ) {\n return \"no_recall\";\n }\n\n // Full recall for prompts that are explicitly memory-seeking or analytical questions.\n if (\n /\\b(previous|earlier|remember|last time|did we|what did we decide|context|summarize|summary|recap|key points|decision)\\b/i.test(p) ||\n /\\?$/.test(p) ||\n /^(what|why|how|when|where|who|which)\\b/i.test(p.toLowerCase())\n ) {\n return \"full\";\n }\n\n // Minimal for short, non-question operational directives to keep latency/tokens down.\n if (\n p.length <= 100 &&\n /^(check|reload|restart|run|verify|show|status|sync|update|open|close|set|enable|disable|fix|patch)\\b/i.test(p)\n ) {\n return \"minimal\";\n }\n\n return \"full\";\n}\n\nexport function hasBroadGraphIntent(prompt: string): boolean {\n const p = normalizeTextInput(prompt).trim().toLowerCase();\n if (!p) return false;\n return /\\b(what changed|how did we get here|why did this happen|what led to|cause chain|dependency chain|regression chain|failure chain)\\b/i.test(\n p,\n );\n}\n"],"mappings":";AAEA,IAAM,gBAAqD;AAAA,EACzD,EAAE,IAAI,uGAAuG,MAAM,YAAY;AAAA,EAC/H,EAAE,IAAI,4FAA4F,MAAM,UAAU;AAAA,EAClH,EAAE,IAAI,iFAAiF,MAAM,OAAO;AAAA,EACpG,EAAE,IAAI,oEAAoE,MAAM,SAAS;AAAA,EACzF,EAAE,IAAI,8CAA8C,MAAM,aAAa;AACzE;AAEA,IAAM,kBAAyD;AAAA,EAC7D,EAAE,IAAI,yFAAyF,QAAQ,SAAS;AAAA,EAChH,EAAE,IAAI,qFAAqF,QAAQ,OAAO;AAAA,EAC1G,EAAE,IAAI,8GAA8G,QAAQ,UAAU;AAAA,EACtI,EAAE,IAAI,8EAA8E,QAAQ,YAAY;AAAA,EACxG,EAAE,IAAI,iFAAiF,QAAQ,SAAS;AAC1G;AAEA,IAAM,kBAA6D;AAAA,EACjE,EAAE,IAAI,yDAAyD,YAAY,OAAO;AAAA,EAClF,EAAE,IAAI,8CAA8C,YAAY,MAAM;AAAA,EACtE,EAAE,IAAI,4CAA4C,YAAY,SAAS;AAAA,EACvE,EAAE,IAAI,mDAAmD,YAAY,KAAK;AAAA,EAC1E,EAAE,IAAI,oCAAoC,YAAY,OAAO;AAC/D;AAGA,IAAM,qBACJ;AAEF,SAAS,mBAAmB,OAAwB;AAClD,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEO,SAAS,oBAAoB,MAA4B;AAC9D,QAAM,WAAW,mBAAmB,IAAI;AACxC,QAAM,OAAO,cAAc,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,QAAQ,CAAC,GAAG,QAAQ;AACrE,QAAM,aAAa,gBAAgB,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,QAAQ,CAAC,GAAG,UAAU;AAC/E,QAAM,cAAc,MAAM;AAAA,IACxB,IAAI,IAAI,gBAAgB,OAAO,CAAC,MAAM,EAAE,GAAG,KAAK,QAAQ,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC;AAAA,EACrF;AACA,QAAM,iBAAiB,mBAAmB,KAAK,QAAQ;AAEvD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,uBAAuB,QAA+B;AACpE,SAAO,OAAO,mBAAmB;AACnC;AAEO,SAAS,yBAAyB,aAA2B,cAAoC;AACtG,QAAM,iBACJ,YAAY,SAAS,aACrB,YAAY,eAAe,aAC3B,YAAY,YAAY,SAAS;AACnC,QAAM,kBACJ,aAAa,SAAS,aACtB,aAAa,eAAe,aAC5B,aAAa,YAAY,SAAS;AACpC,MAAI,CAAC,kBAAkB,CAAC,gBAAiB,QAAO;AAEhD,MAAI,QAAQ;AACZ,MACE,YAAY,SAAS,aACrB,aAAa,SAAS,aACtB,YAAY,SAAS,aAAa,MAClC;AACA,aAAS;AAAA,EACX;AACA,MACE,YAAY,eAAe,aAC3B,aAAa,eAAe,aAC5B,YAAY,eAAe,aAAa,YACxC;AACA,aAAS;AAAA,EACX;AAEA,QAAM,UAAU,YAAY,YAAY,OAAO,CAAC,OAAO,aAAa,YAAY,SAAS,EAAE,CAAC,EAAE;AAC9F,MAAI,UAAU,GAAG;AACf,UAAM,QAAQ,KAAK,IAAI,YAAY,YAAY,QAAQ,aAAa,YAAY,QAAQ,CAAC;AACzF,aAAS,OAAO,UAAU;AAAA,EAC5B;AAEA,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AACvC;AAEO,SAAS,eAAe,QAAgC;AAC7D,QAAM,IAAI,mBAAmB,MAAM,EAAE,KAAK;AAC1C,MAAI,eAAe;AACnB,SAAO,aAAa,SAAS,GAAG;AAC9B,UAAM,KAAK,aAAa,WAAW,aAAa,SAAS,CAAC;AAC1D,UAAM,UAAU,MAAM,MAAM,MAAM;AAClC,UAAM,UAAU,MAAM,MAAM,MAAM;AAClC,UAAM,UAAU,MAAM,MAAM,MAAM;AAElC,QAAI,WAAW,WAAW,QAAS;AACnC,mBAAe,aAAa,MAAM,GAAG,EAAE;AAAA,EACzC;AACA,iBAAe,aAAa,KAAK;AACjC,MAAI,EAAE,WAAW,EAAG,QAAO;AAE3B,MAAI,4EAA4E,KAAK,CAAC,GAAG;AACvF,WAAO;AAAA,EACT;AAGA,MACE,EAAE,UAAU,MACZ,gFAAgF,KAAK,YAAY,GACjG;AACA,WAAO;AAAA,EACT;AAGA,MACE,2HAA2H,KAAK,CAAC,KACjI,MAAM,KAAK,CAAC,KACZ,0CAA0C,KAAK,EAAE,YAAY,CAAC,GAC9D;AACA,WAAO;AAAA,EACT;AAGA,MACE,EAAE,UAAU,OACZ,wGAAwG,KAAK,CAAC,GAC9G;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,oBAAoB,QAAyB;AAC3D,QAAM,IAAI,mBAAmB,MAAM,EAAE,KAAK,EAAE,YAAY;AACxD,MAAI,CAAC,EAAG,QAAO;AACf,SAAO,sIAAsI;AAAA,IAC3I;AAAA,EACF;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/message-parts/index.ts"],"sourcesContent":["export type LcmMessagePartKind =\n | \"text\"\n | \"tool_call\"\n | \"tool_result\"\n | \"patch\"\n | \"file_read\"\n | \"file_write\"\n | \"step_start\"\n | \"step_finish\"\n | \"snapshot\"\n | \"retry\";\n\nexport const LCM_MESSAGE_PART_KINDS: readonly LcmMessagePartKind[] = [\n \"text\",\n \"tool_call\",\n \"tool_result\",\n \"patch\",\n \"file_read\",\n \"file_write\",\n \"step_start\",\n \"step_finish\",\n \"snapshot\",\n \"retry\",\n] as const;\n\nexport type MessagePartSourceFormat =\n | \"openai\"\n | \"anthropic\"\n | \"openclaw\"\n | \"lossless-claw\"\n | \"remnic\";\n\nexport interface LcmMessagePartInput {\n ordinal?: number | null;\n kind: LcmMessagePartKind;\n payload: Record<string, unknown>;\n toolName?: string | null;\n tool_name?: string | null;\n filePath?: string | null;\n file_path?: string | null;\n createdAt?: string | null;\n created_at?: string | null;\n}\n\nexport interface LcmMessagePartRow extends LcmMessagePartInput {\n id: number;\n messageId: number;\n ordinal: number;\n payloadJson: string;\n createdAt: string;\n}\n\nexport interface ParseMessagePartsOptions {\n sourceFormat?: MessagePartSourceFormat;\n renderedContent?: string;\n allowRenderedFallback?: boolean;\n}\n\nconst SECRET_KEY_RE = /(api[_-]?key|authorization|bearer|credential|password|secret|token)/i;\nconst MAX_PAYLOAD_STRING = 8_000;\nconst MAX_FILE_SCAN_CHARS = 20_000;\n\nexport function isLcmMessagePartKind(value: unknown): value is LcmMessagePartKind {\n return (\n typeof value === \"string\" &&\n (LCM_MESSAGE_PART_KINDS as readonly string[]).includes(value)\n );\n}\n\nexport function parseMessageParts(\n input: unknown,\n options: ParseMessagePartsOptions = {},\n): LcmMessagePartInput[] {\n const explicit = normalizeExplicitParts(input);\n if (explicit.length > 0) return explicit;\n\n const format = options.sourceFormat ?? inferSourceFormat(input);\n switch (format) {\n case \"openai\":\n return withRenderedFallback(parseOpenAiMessageParts(input, options), options);\n case \"anthropic\":\n return withRenderedFallback(parseAnthropicMessageParts(input, options), options);\n case \"openclaw\":\n return withRenderedFallback(parseOpenClawMessageParts(input, options), options);\n case \"lossless-claw\":\n case \"remnic\":\n return withRenderedFallback(normalizeExplicitParts(input), options);\n default:\n return renderedFallbackParts(options);\n }\n}\n\nexport function normalizeExplicitParts(input: unknown): LcmMessagePartInput[] {\n const rawParts = pickArray(input, \"parts\") ?? pickArray(input, \"message_parts\");\n if (!rawParts) return [];\n\n const parts: LcmMessagePartInput[] = [];\n rawParts.forEach((raw, index) => {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return;\n const obj = raw as Record<string, unknown>;\n const kind = normalizeKind(obj.kind ?? obj.type);\n if (!kind) return;\n\n const payload =\n obj.payload && typeof obj.payload === \"object\" && !Array.isArray(obj.payload)\n ? (obj.payload as Record<string, unknown>)\n : { value: sanitizePayload(obj) };\n const toolName = asNonEmptyString(obj.toolName ?? obj.tool_name ?? obj.name);\n const filePath = asNonEmptyString(obj.filePath ?? obj.file_path ?? obj.path);\n const ordinal =\n typeof obj.ordinal === \"number\" && Number.isInteger(obj.ordinal)\n ? Math.max(0, obj.ordinal)\n : index;\n\n parts.push({\n ordinal,\n kind,\n payload: sanitizePayload(payload) as Record<string, unknown>,\n toolName,\n filePath,\n createdAt: asNonEmptyString(obj.createdAt ?? obj.created_at),\n });\n });\n return parts;\n}\n\nexport function parseOpenAiMessageParts(\n input: unknown,\n _options: ParseMessagePartsOptions = {},\n): LcmMessagePartInput[] {\n const items = gatherOpenAiItems(input);\n const parts: LcmMessagePartInput[] = [];\n for (const item of items) {\n const type = asNonEmptyString(item.type) ?? asNonEmptyString(item.kind);\n if (!type) continue;\n if (isOpenAiContentBlock(item)) {\n const text = asNonEmptyString(item.text ?? item.content);\n if (text) parts.push(makePart(\"text\", { type, text }, { filePath: firstFilePath(text) }));\n continue;\n }\n if (type === \"message\") {\n for (const block of gatherContentBlocks(item.content)) {\n const text = asNonEmptyString(block.text ?? block.content);\n if (text) parts.push(makePart(\"text\", { type, text }, { filePath: firstFilePath(text) }));\n }\n continue;\n }\n if (type === \"function_call\") {\n const toolName = asNonEmptyString(item.name ?? item.tool_name);\n const callId = asNonEmptyString(item.call_id ?? item.callId);\n const itemId = asNonEmptyString(item.id);\n const payload = {\n id: callId ?? itemId,\n ...(callId ? { call_id: callId } : {}),\n ...(itemId && itemId !== callId ? { response_item_id: itemId } : {}),\n name: toolName,\n arguments: parseMaybeJson(item.arguments),\n };\n parts.push(classifyToolPart(toolName, payload));\n continue;\n }\n if (type === \"function_call_output\") {\n const output = asNonEmptyString(item.output) ?? JSON.stringify(sanitizePayload(item.output ?? item));\n const callId = asNonEmptyString(item.call_id ?? item.callId);\n const itemId = asNonEmptyString(item.id);\n parts.push(makePart(\"tool_result\", {\n id: callId ?? itemId,\n ...(callId ? { call_id: callId } : {}),\n ...(itemId && itemId !== callId ? { response_item_id: itemId } : {}),\n output,\n }, {\n filePath: firstFilePath(output),\n }));\n continue;\n }\n if (type === \"reasoning\") {\n parts.push(makePart(\"step_start\", { type, summary: sanitizePayload(item.summary ?? item) }));\n continue;\n }\n if (type === \"retry\") {\n parts.push(makePart(\"retry\", { type, item: sanitizePayload(item) }));\n }\n }\n return withOrdinals(parts);\n}\n\nexport function parseAnthropicMessageParts(\n input: unknown,\n _options: ParseMessagePartsOptions = {},\n): LcmMessagePartInput[] {\n const blocks = gatherContentBlocks(\n Array.isArray(input) ? input : input && typeof input === \"object\" ? (input as Record<string, unknown>).content : input,\n );\n const parts: LcmMessagePartInput[] = [];\n for (const block of blocks) {\n const type = asNonEmptyString(block.type);\n if (type === \"text\") {\n const text = asNonEmptyString(block.text);\n if (text) parts.push(makePart(\"text\", { type, text }, { filePath: firstFilePath(text) }));\n continue;\n }\n if (type === \"tool_use\") {\n const toolName = asNonEmptyString(block.name);\n parts.push(classifyToolPart(toolName, {\n id: block.id,\n name: toolName,\n input: sanitizePayload(block.input),\n }));\n continue;\n }\n if (type === \"tool_result\") {\n const content = block.content;\n const rendered = renderUnknownContent(content);\n parts.push(makePart(\"tool_result\", {\n id: block.tool_use_id,\n content: sanitizePayload(content),\n ...(typeof block.is_error === \"boolean\" ? { is_error: block.is_error } : {}),\n ...(typeof block.isError === \"boolean\" ? { isError: block.isError } : {}),\n }, {\n filePath: firstFilePath(rendered),\n }));\n continue;\n }\n if (type === \"thinking\") {\n parts.push(makePart(\"step_start\", {\n type,\n thinking: truncateString(asNonEmptyString(block.thinking) ?? \"\"),\n signature: asNonEmptyString(block.signature),\n }));\n continue;\n }\n if (type === \"redacted_thinking\") {\n parts.push(makePart(\"step_finish\", { type }));\n }\n }\n return withOrdinals(parts);\n}\n\nexport function parseOpenClawMessageParts(\n input: unknown,\n options: ParseMessagePartsOptions = {},\n): LcmMessagePartInput[] {\n const explicit = normalizeExplicitParts(input);\n if (explicit.length > 0) return explicit;\n if (!input || typeof input !== \"object\") return [];\n const obj = input as Record<string, unknown>;\n\n const content = obj.content;\n if (Array.isArray(content)) {\n const hasOpenAiBlocks = content.some(isOpenAiContentBlock);\n if (hasOpenAiBlocks) return parseOpenAiMessageParts(content, options);\n const hasAnthropicBlocks = content.some(\n (block) =>\n block &&\n typeof block === \"object\" &&\n typeof (block as Record<string, unknown>).type === \"string\",\n );\n if (hasAnthropicBlocks) return parseAnthropicMessageParts({ content }, options);\n }\n\n const toolName = asNonEmptyString(obj.toolName ?? obj.tool_name ?? obj.name);\n if (toolName) {\n return withOrdinals([\n classifyToolPart(toolName, {\n name: toolName,\n input: sanitizePayload(obj.input ?? obj.arguments ?? obj.params),\n output: sanitizePayload(obj.output ?? obj.result),\n }),\n ]);\n }\n\n const rendered = options.allowRenderedFallback === false\n ? null\n : options.renderedContent ?? asNonEmptyString(obj.content);\n return rendered ? withOrdinals(partsFromRenderedText(rendered)) : [];\n}\n\nexport function partsFromRenderedText(text: string): LcmMessagePartInput[] {\n if (text.includes(\"*** Begin Patch\")) {\n const paths = extractFilePaths(text);\n const patchPaths = extractPatchPaths(text);\n return withOrdinals((patchPaths.length > 0 ? patchPaths : paths).map((filePath) =>\n makePart(\"patch\", { text: truncateString(text) }, { filePath })\n ));\n }\n const paths = extractFilePaths(text);\n if (paths.length === 0) return [];\n return withOrdinals(paths.map((filePath) =>\n makePart(\"file_read\", { text: truncateString(text) }, { filePath })\n ));\n}\n\nfunction inferSourceFormat(input: unknown): MessagePartSourceFormat | undefined {\n if (input && typeof input === \"object\") {\n const obj = input as Record<string, unknown>;\n const explicit = asNonEmptyString(obj.sourceFormat ?? obj.source_format);\n if (explicit === \"openai\" || explicit === \"anthropic\" || explicit === \"openclaw\" || explicit === \"lossless-claw\" || explicit === \"remnic\") {\n return explicit;\n }\n if (Array.isArray(obj.output)) return \"openai\";\n if (isOpenAiResponseItem(obj)) return \"openai\";\n if (Array.isArray(obj.content) && obj.content.some(isOpenAiContentBlock)) return \"openai\";\n if (Array.isArray(obj.content)) return \"anthropic\";\n }\n if (Array.isArray(input)) {\n return input.some((item) =>\n isRecord(item) && (isOpenAiResponseItem(item) || isOpenAiContentBlock(item))\n )\n ? \"openai\"\n : \"anthropic\";\n }\n return undefined;\n}\n\nfunction isOpenAiResponseItem(obj: Record<string, unknown>): boolean {\n const type = asNonEmptyString(obj.type ?? obj.kind);\n return (\n type === \"message\" ||\n type === \"function_call\" ||\n type === \"function_call_output\" ||\n type === \"reasoning\" ||\n type === \"retry\"\n );\n}\n\nfunction isOpenAiContentBlock(value: unknown): boolean {\n if (!isRecord(value)) return false;\n const type = asNonEmptyString(value.type);\n return (\n type === \"input_text\" ||\n type === \"output_text\" ||\n type === \"input_image\" ||\n type === \"input_file\" ||\n type === \"refusal\"\n );\n}\n\nfunction gatherOpenAiItems(input: unknown): Record<string, unknown>[] {\n if (Array.isArray(input)) return input.filter(isRecord);\n if (!isRecord(input)) return [];\n if (Array.isArray(input.output)) return input.output.filter(isRecord);\n if (Array.isArray(input.items)) return input.items.filter(isRecord);\n return [input];\n}\n\nfunction gatherContentBlocks(input: unknown): Record<string, unknown>[] {\n if (Array.isArray(input)) return input.filter(isRecord);\n if (typeof input === \"string\") return [{ type: \"text\", text: input }];\n if (isRecord(input)) return [input];\n return [];\n}\n\nfunction classifyToolPart(\n toolName: string | null | undefined,\n payload: Record<string, unknown>,\n): LcmMessagePartInput {\n const normalized = (toolName ?? \"\").toLowerCase();\n const rendered = renderUnknownContent(payload);\n const filePath =\n firstFilePathFromObject(payload) ?? firstFilePath(rendered) ?? null;\n\n if (normalized.includes(\"apply_patch\") || rendered.includes(\"*** Begin Patch\")) {\n return makePart(\"patch\", payload, { toolName, filePath: filePath ?? extractPatchPaths(rendered)[0] ?? null });\n }\n if (/(write|edit|multiedit|create|save)/i.test(normalized)) {\n return makePart(\"file_write\", payload, { toolName, filePath });\n }\n if (/(read|grep|glob|search|list|ls)/i.test(normalized)) {\n return makePart(\"file_read\", payload, { toolName, filePath });\n }\n return makePart(\"tool_call\", payload, { toolName, filePath });\n}\n\nfunction makePart(\n kind: LcmMessagePartKind,\n payload: Record<string, unknown>,\n options: { toolName?: string | null; filePath?: string | null } = {},\n): LcmMessagePartInput {\n return {\n kind,\n payload: sanitizePayload(payload) as Record<string, unknown>,\n toolName: options.toolName ?? null,\n filePath: options.filePath ?? null,\n };\n}\n\nfunction withOrdinals(parts: LcmMessagePartInput[]): LcmMessagePartInput[] {\n return parts.map((part, ordinal) => ({ ...part, ordinal: part.ordinal ?? ordinal }));\n}\n\nfunction withRenderedFallback(\n parts: LcmMessagePartInput[],\n options: ParseMessagePartsOptions,\n): LcmMessagePartInput[] {\n return parts.length > 0 ? parts : renderedFallbackParts(options);\n}\n\nfunction renderedFallbackParts(options: ParseMessagePartsOptions): LcmMessagePartInput[] {\n if (options.allowRenderedFallback === false) {\n return [];\n }\n const rendered = asNonEmptyString(options.renderedContent);\n return rendered ? partsFromRenderedText(rendered) : [];\n}\n\nfunction normalizeKind(value: unknown): LcmMessagePartKind | null {\n if (isLcmMessagePartKind(value)) return value;\n if (value === \"tool_use\" || value === \"function_call\") return \"tool_call\";\n if (value === \"function_call_output\") return \"tool_result\";\n if (value === \"thinking\" || value === \"reasoning\") return \"step_start\";\n return null;\n}\n\nfunction pickArray(input: unknown, key: string): unknown[] | null {\n if (!input || typeof input !== \"object\" || Array.isArray(input)) return null;\n const value = (input as Record<string, unknown>)[key];\n return Array.isArray(value) ? value : null;\n}\n\nfunction asNonEmptyString(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction parseMaybeJson(value: unknown): unknown {\n if (typeof value !== \"string\") return sanitizePayload(value);\n try {\n return sanitizePayload(JSON.parse(value));\n } catch {\n return truncateString(value);\n }\n}\n\nfunction sanitizePayload(value: unknown, depth = 0): unknown {\n if (value === null || value === undefined) return value;\n if (typeof value === \"string\") return truncateString(value);\n if (typeof value === \"number\" || typeof value === \"boolean\") return value;\n if (Array.isArray(value)) {\n if (depth >= 4) return \"[truncated]\";\n return value.slice(0, 100).map((item) => sanitizePayload(item, depth + 1));\n }\n if (typeof value === \"object\") {\n if (depth >= 4) return \"[truncated]\";\n const out: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(value as Record<string, unknown>)) {\n out[key] = SECRET_KEY_RE.test(key) ? \"[redacted]\" : sanitizePayload(child, depth + 1);\n }\n return out;\n }\n return String(value);\n}\n\nfunction truncateString(value: string): string {\n return value.length > MAX_PAYLOAD_STRING\n ? `${value.slice(0, MAX_PAYLOAD_STRING)}...[truncated]`\n : value;\n}\n\nfunction renderUnknownContent(value: unknown): string {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value ?? \"\");\n } catch {\n return String(value ?? \"\");\n }\n}\n\nfunction firstFilePathFromObject(value: unknown): string | null {\n if (!isRecord(value)) return null;\n const keys = [\"file_path\", \"filePath\", \"path\", \"filename\", \"cwd\"];\n for (const key of keys) {\n const candidate = asNonEmptyString(value[key]);\n if (candidate) return candidate;\n }\n for (const child of Object.values(value)) {\n if (typeof child === \"string\") {\n const fromText = extractPatchPaths(child)[0] ?? firstFilePath(child);\n if (fromText) return fromText;\n }\n if (isRecord(child)) {\n const nested = firstFilePathFromObject(child);\n if (nested) return nested;\n }\n }\n return null;\n}\n\nfunction firstFilePath(text: string): string | null {\n return extractFilePaths(text)[0] ?? null;\n}\n\nfunction extractFilePaths(text: string): string[] {\n const out = new Set<string>();\n let token = \"\";\n const scanLength = Math.min(text.length, MAX_FILE_SCAN_CHARS);\n for (let index = 0; index <= scanLength; index += 1) {\n const char = index < scanLength ? text[index]! : \" \";\n if (isFilePathTokenSeparator(char)) {\n addFilePathCandidate(out, token);\n token = \"\";\n continue;\n }\n token += char;\n if (token.length > 512) {\n addFilePathCandidate(out, token);\n token = \"\";\n }\n }\n return [...out].slice(0, 20);\n}\n\nfunction isFilePathTokenSeparator(char: string): boolean {\n return (\n char === \" \" ||\n char === \"\\n\" ||\n char === \"\\r\" ||\n char === \"\\t\" ||\n char === \"\\\"\" ||\n char === \"'\" ||\n char === \"`\" ||\n char === \"(\" ||\n char === \")\" ||\n char === \"[\" ||\n char === \"]\" ||\n char === \"{\" ||\n char === \"}\" ||\n char === \"<\" ||\n char === \">\" ||\n char === \",\"\n );\n}\n\nfunction addFilePathCandidate(out: Set<string>, raw: string): void {\n const candidate = trimFilePathPunctuation(raw);\n if (candidate.length === 0 || candidate.includes(\"://\")) return;\n if (isLikelyFilePath(candidate)) out.add(candidate);\n}\n\nfunction trimFilePathPunctuation(raw: string): string {\n let start = 0;\n let end = raw.length;\n while (start < end && isLeadingFilePathPunctuation(raw[start]!)) start += 1;\n while (end > start && isTrailingFilePathPunctuation(raw[end - 1]!)) end -= 1;\n return raw.slice(start, end);\n}\n\nfunction isLeadingFilePathPunctuation(char: string): boolean {\n return (\n char === \":\" ||\n char === \";\" ||\n char === \"!\" ||\n char === \"?\" ||\n char === \"|\" ||\n char === \"*\" ||\n char === \"=\"\n );\n}\n\nfunction isTrailingFilePathPunctuation(char: string): boolean {\n return (\n char === \".\" ||\n char === \":\" ||\n char === \";\" ||\n char === \"!\" ||\n char === \"?\" ||\n char === \"|\" ||\n char === \"*\" ||\n char === \"=\"\n );\n}\n\nfunction isLikelyFilePath(value: string): boolean {\n if (value.startsWith(\"/\") || value.startsWith(\"./\") || value.startsWith(\"../\") || value.startsWith(\"~/\")) {\n return hasValidFileExtension(value);\n }\n if (value.includes(\"/\")) return hasValidFileExtension(value);\n return hasValidFileExtension(value);\n}\n\nfunction hasValidFileExtension(value: string): boolean {\n const lastSlash = value.lastIndexOf(\"/\");\n const basename = value.slice(lastSlash + 1);\n const dot = basename.lastIndexOf(\".\");\n if (dot <= 0 || dot === basename.length - 1) return false;\n const ext = basename.slice(dot + 1);\n if (ext.length < 1 || ext.length > 12) return false;\n for (const char of ext) {\n if (!isFileExtensionChar(char)) return false;\n }\n return true;\n}\n\nfunction isFileExtensionChar(char: string): boolean {\n const code = char.charCodeAt(0);\n return (\n (code >= 48 && code <= 57) ||\n (code >= 65 && code <= 90) ||\n (code >= 97 && code <= 122) ||\n char === \"_\" ||\n char === \"+\" ||\n char === \"-\"\n );\n}\n\nfunction extractPatchPaths(text: string): string[] {\n const out = new Set<string>();\n for (const line of text.split(/\\r?\\n/)) {\n const match = line.match(/^\\*\\*\\* (?:Add|Update|Delete) File: (.+)$/);\n if (match?.[1]) out.add(match[1].trim());\n const move = line.match(/^\\*\\*\\* Move to: (.+)$/);\n if (move?.[1]) out.add(move[1].trim());\n }\n return [...out].slice(0, 20);\n}\n"],"mappings":";AAYO,IAAM,yBAAwD;AAAA,EACnE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAmCA,IAAM,gBAAgB;AACtB,IAAM,qBAAqB;AAC3B,IAAM,sBAAsB;AAErB,SAAS,qBAAqB,OAA6C;AAChF,SACE,OAAO,UAAU,YAChB,uBAA6C,SAAS,KAAK;AAEhE;AAEO,SAAS,kBACd,OACA,UAAoC,CAAC,GACd;AACvB,QAAM,WAAW,uBAAuB,KAAK;AAC7C,MAAI,SAAS,SAAS,EAAG,QAAO;AAEhC,QAAM,SAAS,QAAQ,gBAAgB,kBAAkB,KAAK;AAC9D,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,qBAAqB,wBAAwB,OAAO,OAAO,GAAG,OAAO;AAAA,IAC9E,KAAK;AACH,aAAO,qBAAqB,2BAA2B,OAAO,OAAO,GAAG,OAAO;AAAA,IACjF,KAAK;AACH,aAAO,qBAAqB,0BAA0B,OAAO,OAAO,GAAG,OAAO;AAAA,IAChF,KAAK;AAAA,IACL,KAAK;AACH,aAAO,qBAAqB,uBAAuB,KAAK,GAAG,OAAO;AAAA,IACpE;AACE,aAAO,sBAAsB,OAAO;AAAA,EACxC;AACF;AAEO,SAAS,uBAAuB,OAAuC;AAC5E,QAAM,WAAW,UAAU,OAAO,OAAO,KAAK,UAAU,OAAO,eAAe;AAC9E,MAAI,CAAC,SAAU,QAAO,CAAC;AAEvB,QAAM,QAA+B,CAAC;AACtC,WAAS,QAAQ,CAAC,KAAK,UAAU;AAC/B,QAAI,CAAC,OAAO,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,EAAG;AAC3D,UAAM,MAAM;AACZ,UAAM,OAAO,cAAc,IAAI,QAAQ,IAAI,IAAI;AAC/C,QAAI,CAAC,KAAM;AAEX,UAAM,UACJ,IAAI,WAAW,OAAO,IAAI,YAAY,YAAY,CAAC,MAAM,QAAQ,IAAI,OAAO,IACvE,IAAI,UACL,EAAE,OAAO,gBAAgB,GAAG,EAAE;AACpC,UAAM,WAAW,iBAAiB,IAAI,YAAY,IAAI,aAAa,IAAI,IAAI;AAC3E,UAAM,WAAW,iBAAiB,IAAI,YAAY,IAAI,aAAa,IAAI,IAAI;AAC3E,UAAM,UACJ,OAAO,IAAI,YAAY,YAAY,OAAO,UAAU,IAAI,OAAO,IAC3D,KAAK,IAAI,GAAG,IAAI,OAAO,IACvB;AAEN,UAAM,KAAK;AAAA,MACT;AAAA,MACA;AAAA,MACA,SAAS,gBAAgB,OAAO;AAAA,MAChC;AAAA,MACA;AAAA,MACA,WAAW,iBAAiB,IAAI,aAAa,IAAI,UAAU;AAAA,IAC7D,CAAC;AAAA,EACH,CAAC;AACD,SAAO;AACT;AAEO,SAAS,wBACd,OACA,WAAqC,CAAC,GACf;AACvB,QAAM,QAAQ,kBAAkB,KAAK;AACrC,QAAM,QAA+B,CAAC;AACtC,aAAW,QAAQ,OAAO;AACxB,UAAM,OAAO,iBAAiB,KAAK,IAAI,KAAK,iBAAiB,KAAK,IAAI;AACtE,QAAI,CAAC,KAAM;AACX,QAAI,qBAAqB,IAAI,GAAG;AAC9B,YAAM,OAAO,iBAAiB,KAAK,QAAQ,KAAK,OAAO;AACvD,UAAI,KAAM,OAAM,KAAK,SAAS,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,UAAU,cAAc,IAAI,EAAE,CAAC,CAAC;AACxF;AAAA,IACF;AACA,QAAI,SAAS,WAAW;AACtB,iBAAW,SAAS,oBAAoB,KAAK,OAAO,GAAG;AACrD,cAAM,OAAO,iBAAiB,MAAM,QAAQ,MAAM,OAAO;AACzD,YAAI,KAAM,OAAM,KAAK,SAAS,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,UAAU,cAAc,IAAI,EAAE,CAAC,CAAC;AAAA,MAC1F;AACA;AAAA,IACF;AACA,QAAI,SAAS,iBAAiB;AAC5B,YAAM,WAAW,iBAAiB,KAAK,QAAQ,KAAK,SAAS;AAC7D,YAAM,SAAS,iBAAiB,KAAK,WAAW,KAAK,MAAM;AAC3D,YAAM,SAAS,iBAAiB,KAAK,EAAE;AACvC,YAAM,UAAU;AAAA,QACd,IAAI,UAAU;AAAA,QACd,GAAI,SAAS,EAAE,SAAS,OAAO,IAAI,CAAC;AAAA,QACpC,GAAI,UAAU,WAAW,SAAS,EAAE,kBAAkB,OAAO,IAAI,CAAC;AAAA,QAClE,MAAM;AAAA,QACN,WAAW,eAAe,KAAK,SAAS;AAAA,MAC1C;AACA,YAAM,KAAK,iBAAiB,UAAU,OAAO,CAAC;AAC9C;AAAA,IACF;AACA,QAAI,SAAS,wBAAwB;AACnC,YAAM,SAAS,iBAAiB,KAAK,MAAM,KAAK,KAAK,UAAU,gBAAgB,KAAK,UAAU,IAAI,CAAC;AACnG,YAAM,SAAS,iBAAiB,KAAK,WAAW,KAAK,MAAM;AAC3D,YAAM,SAAS,iBAAiB,KAAK,EAAE;AACvC,YAAM,KAAK,SAAS,eAAe;AAAA,QACjC,IAAI,UAAU;AAAA,QACd,GAAI,SAAS,EAAE,SAAS,OAAO,IAAI,CAAC;AAAA,QACpC,GAAI,UAAU,WAAW,SAAS,EAAE,kBAAkB,OAAO,IAAI,CAAC;AAAA,QAClE;AAAA,MACF,GAAG;AAAA,QACD,UAAU,cAAc,MAAM;AAAA,MAChC,CAAC,CAAC;AACF;AAAA,IACF;AACA,QAAI,SAAS,aAAa;AACxB,YAAM,KAAK,SAAS,cAAc,EAAE,MAAM,SAAS,gBAAgB,KAAK,WAAW,IAAI,EAAE,CAAC,CAAC;AAC3F;AAAA,IACF;AACA,QAAI,SAAS,SAAS;AACpB,YAAM,KAAK,SAAS,SAAS,EAAE,MAAM,MAAM,gBAAgB,IAAI,EAAE,CAAC,CAAC;AAAA,IACrE;AAAA,EACF;AACA,SAAO,aAAa,KAAK;AAC3B;AAEO,SAAS,2BACd,OACA,WAAqC,CAAC,GACf;AACvB,QAAM,SAAS;AAAA,IACb,MAAM,QAAQ,KAAK,IAAI,QAAQ,SAAS,OAAO,UAAU,WAAY,MAAkC,UAAU;AAAA,EACnH;AACA,QAAM,QAA+B,CAAC;AACtC,aAAW,SAAS,QAAQ;AAC1B,UAAM,OAAO,iBAAiB,MAAM,IAAI;AACxC,QAAI,SAAS,QAAQ;AACnB,YAAM,OAAO,iBAAiB,MAAM,IAAI;AACxC,UAAI,KAAM,OAAM,KAAK,SAAS,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,UAAU,cAAc,IAAI,EAAE,CAAC,CAAC;AACxF;AAAA,IACF;AACA,QAAI,SAAS,YAAY;AACvB,YAAM,WAAW,iBAAiB,MAAM,IAAI;AAC5C,YAAM,KAAK,iBAAiB,UAAU;AAAA,QACpC,IAAI,MAAM;AAAA,QACV,MAAM;AAAA,QACN,OAAO,gBAAgB,MAAM,KAAK;AAAA,MACpC,CAAC,CAAC;AACF;AAAA,IACF;AACA,QAAI,SAAS,eAAe;AAC1B,YAAM,UAAU,MAAM;AACtB,YAAM,WAAW,qBAAqB,OAAO;AAC7C,YAAM,KAAK,SAAS,eAAe;AAAA,QACjC,IAAI,MAAM;AAAA,QACV,SAAS,gBAAgB,OAAO;AAAA,QAChC,GAAI,OAAO,MAAM,aAAa,YAAY,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,QAC1E,GAAI,OAAO,MAAM,YAAY,YAAY,EAAE,SAAS,MAAM,QAAQ,IAAI,CAAC;AAAA,MACzE,GAAG;AAAA,QACD,UAAU,cAAc,QAAQ;AAAA,MAClC,CAAC,CAAC;AACF;AAAA,IACF;AACA,QAAI,SAAS,YAAY;AACvB,YAAM,KAAK,SAAS,cAAc;AAAA,QAChC;AAAA,QACA,UAAU,eAAe,iBAAiB,MAAM,QAAQ,KAAK,EAAE;AAAA,QAC/D,WAAW,iBAAiB,MAAM,SAAS;AAAA,MAC7C,CAAC,CAAC;AACF;AAAA,IACF;AACA,QAAI,SAAS,qBAAqB;AAChC,YAAM,KAAK,SAAS,eAAe,EAAE,KAAK,CAAC,CAAC;AAAA,IAC9C;AAAA,EACF;AACA,SAAO,aAAa,KAAK;AAC3B;AAEO,SAAS,0BACd,OACA,UAAoC,CAAC,GACd;AACvB,QAAM,WAAW,uBAAuB,KAAK;AAC7C,MAAI,SAAS,SAAS,EAAG,QAAO;AAChC,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO,CAAC;AACjD,QAAM,MAAM;AAEZ,QAAM,UAAU,IAAI;AACpB,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,UAAM,kBAAkB,QAAQ,KAAK,oBAAoB;AACzD,QAAI,gBAAiB,QAAO,wBAAwB,SAAS,OAAO;AACpE,UAAM,qBAAqB,QAAQ;AAAA,MACjC,CAAC,UACC,SACA,OAAO,UAAU,YACjB,OAAQ,MAAkC,SAAS;AAAA,IACvD;AACA,QAAI,mBAAoB,QAAO,2BAA2B,EAAE,QAAQ,GAAG,OAAO;AAAA,EAChF;AAEA,QAAM,WAAW,iBAAiB,IAAI,YAAY,IAAI,aAAa,IAAI,IAAI;AAC3E,MAAI,UAAU;AACZ,WAAO,aAAa;AAAA,MAClB,iBAAiB,UAAU;AAAA,QACzB,MAAM;AAAA,QACN,OAAO,gBAAgB,IAAI,SAAS,IAAI,aAAa,IAAI,MAAM;AAAA,QAC/D,QAAQ,gBAAgB,IAAI,UAAU,IAAI,MAAM;AAAA,MAClD,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,QAAQ,0BAA0B,QAC/C,OACA,QAAQ,mBAAmB,iBAAiB,IAAI,OAAO;AAC3D,SAAO,WAAW,aAAa,sBAAsB,QAAQ,CAAC,IAAI,CAAC;AACrE;AAEO,SAAS,sBAAsB,MAAqC;AACzE,MAAI,KAAK,SAAS,iBAAiB,GAAG;AACpC,UAAMA,SAAQ,iBAAiB,IAAI;AACnC,UAAM,aAAa,kBAAkB,IAAI;AACzC,WAAO,cAAc,WAAW,SAAS,IAAI,aAAaA,QAAO;AAAA,MAAI,CAAC,aACpE,SAAS,SAAS,EAAE,MAAM,eAAe,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC;AAAA,IAChE,CAAC;AAAA,EACH;AACA,QAAM,QAAQ,iBAAiB,IAAI;AACnC,MAAI,MAAM,WAAW,EAAG,QAAO,CAAC;AAChC,SAAO,aAAa,MAAM;AAAA,IAAI,CAAC,aAC7B,SAAS,aAAa,EAAE,MAAM,eAAe,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC;AAAA,EACpE,CAAC;AACH;AAEA,SAAS,kBAAkB,OAAqD;AAC9E,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,UAAM,MAAM;AACZ,UAAM,WAAW,iBAAiB,IAAI,gBAAgB,IAAI,aAAa;AACvE,QAAI,aAAa,YAAY,aAAa,eAAe,aAAa,cAAc,aAAa,mBAAmB,aAAa,UAAU;AACzI,aAAO;AAAA,IACT;AACA,QAAI,MAAM,QAAQ,IAAI,MAAM,EAAG,QAAO;AACtC,QAAI,qBAAqB,GAAG,EAAG,QAAO;AACtC,QAAI,MAAM,QAAQ,IAAI,OAAO,KAAK,IAAI,QAAQ,KAAK,oBAAoB,EAAG,QAAO;AACjF,QAAI,MAAM,QAAQ,IAAI,OAAO,EAAG,QAAO;AAAA,EACzC;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM;AAAA,MAAK,CAAC,SACjB,SAAS,IAAI,MAAM,qBAAqB,IAAI,KAAK,qBAAqB,IAAI;AAAA,IAC5E,IACI,WACA;AAAA,EACN;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,KAAuC;AACnE,QAAM,OAAO,iBAAiB,IAAI,QAAQ,IAAI,IAAI;AAClD,SACE,SAAS,aACT,SAAS,mBACT,SAAS,0BACT,SAAS,eACT,SAAS;AAEb;AAEA,SAAS,qBAAqB,OAAyB;AACrD,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAC7B,QAAM,OAAO,iBAAiB,MAAM,IAAI;AACxC,SACE,SAAS,gBACT,SAAS,iBACT,SAAS,iBACT,SAAS,gBACT,SAAS;AAEb;AAEA,SAAS,kBAAkB,OAA2C;AACpE,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,OAAO,QAAQ;AACtD,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO,CAAC;AAC9B,MAAI,MAAM,QAAQ,MAAM,MAAM,EAAG,QAAO,MAAM,OAAO,OAAO,QAAQ;AACpE,MAAI,MAAM,QAAQ,MAAM,KAAK,EAAG,QAAO,MAAM,MAAM,OAAO,QAAQ;AAClE,SAAO,CAAC,KAAK;AACf;AAEA,SAAS,oBAAoB,OAA2C;AACtE,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,OAAO,QAAQ;AACtD,MAAI,OAAO,UAAU,SAAU,QAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,MAAM,CAAC;AACpE,MAAI,SAAS,KAAK,EAAG,QAAO,CAAC,KAAK;AAClC,SAAO,CAAC;AACV;AAEA,SAAS,iBACP,UACA,SACqB;AACrB,QAAM,cAAc,YAAY,IAAI,YAAY;AAChD,QAAM,WAAW,qBAAqB,OAAO;AAC7C,QAAM,WACJ,wBAAwB,OAAO,KAAK,cAAc,QAAQ,KAAK;AAEjE,MAAI,WAAW,SAAS,aAAa,KAAK,SAAS,SAAS,iBAAiB,GAAG;AAC9E,WAAO,SAAS,SAAS,SAAS,EAAE,UAAU,UAAU,YAAY,kBAAkB,QAAQ,EAAE,CAAC,KAAK,KAAK,CAAC;AAAA,EAC9G;AACA,MAAI,sCAAsC,KAAK,UAAU,GAAG;AAC1D,WAAO,SAAS,cAAc,SAAS,EAAE,UAAU,SAAS,CAAC;AAAA,EAC/D;AACA,MAAI,mCAAmC,KAAK,UAAU,GAAG;AACvD,WAAO,SAAS,aAAa,SAAS,EAAE,UAAU,SAAS,CAAC;AAAA,EAC9D;AACA,SAAO,SAAS,aAAa,SAAS,EAAE,UAAU,SAAS,CAAC;AAC9D;AAEA,SAAS,SACP,MACA,SACA,UAAkE,CAAC,GAC9C;AACrB,SAAO;AAAA,IACL;AAAA,IACA,SAAS,gBAAgB,OAAO;AAAA,IAChC,UAAU,QAAQ,YAAY;AAAA,IAC9B,UAAU,QAAQ,YAAY;AAAA,EAChC;AACF;AAEA,SAAS,aAAa,OAAqD;AACzE,SAAO,MAAM,IAAI,CAAC,MAAM,aAAa,EAAE,GAAG,MAAM,SAAS,KAAK,WAAW,QAAQ,EAAE;AACrF;AAEA,SAAS,qBACP,OACA,SACuB;AACvB,SAAO,MAAM,SAAS,IAAI,QAAQ,sBAAsB,OAAO;AACjE;AAEA,SAAS,sBAAsB,SAA0D;AACvF,MAAI,QAAQ,0BAA0B,OAAO;AAC3C,WAAO,CAAC;AAAA,EACV;AACA,QAAM,WAAW,iBAAiB,QAAQ,eAAe;AACzD,SAAO,WAAW,sBAAsB,QAAQ,IAAI,CAAC;AACvD;AAEA,SAAS,cAAc,OAA2C;AAChE,MAAI,qBAAqB,KAAK,EAAG,QAAO;AACxC,MAAI,UAAU,cAAc,UAAU,gBAAiB,QAAO;AAC9D,MAAI,UAAU,uBAAwB,QAAO;AAC7C,MAAI,UAAU,cAAc,UAAU,YAAa,QAAO;AAC1D,SAAO;AACT;AAEA,SAAS,UAAU,OAAgB,KAA+B;AAChE,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,EAAG,QAAO;AACxE,QAAM,QAAS,MAAkC,GAAG;AACpD,SAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ;AACxC;AAEA,SAAS,iBAAiB,OAA+B;AACvD,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,UAAU,MAAM,KAAK;AAC3B,SAAO,QAAQ,SAAS,IAAI,UAAU;AACxC;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AACrE;AAEA,SAAS,eAAe,OAAyB;AAC/C,MAAI,OAAO,UAAU,SAAU,QAAO,gBAAgB,KAAK;AAC3D,MAAI;AACF,WAAO,gBAAgB,KAAK,MAAM,KAAK,CAAC;AAAA,EAC1C,QAAQ;AACN,WAAO,eAAe,KAAK;AAAA,EAC7B;AACF;AAEA,SAAS,gBAAgB,OAAgB,QAAQ,GAAY;AAC3D,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,MAAI,OAAO,UAAU,SAAU,QAAO,eAAe,KAAK;AAC1D,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAW,QAAO;AACpE,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,QAAI,SAAS,EAAG,QAAO;AACvB,WAAO,MAAM,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,SAAS,gBAAgB,MAAM,QAAQ,CAAC,CAAC;AAAA,EAC3E;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,SAAS,EAAG,QAAO;AACvB,UAAM,MAA+B,CAAC;AACtC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAgC,GAAG;AAC3E,UAAI,GAAG,IAAI,cAAc,KAAK,GAAG,IAAI,eAAe,gBAAgB,OAAO,QAAQ,CAAC;AAAA,IACtF;AACA,WAAO;AAAA,EACT;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,eAAe,OAAuB;AAC7C,SAAO,MAAM,SAAS,qBAClB,GAAG,MAAM,MAAM,GAAG,kBAAkB,CAAC,mBACrC;AACN;AAEA,SAAS,qBAAqB,OAAwB;AACpD,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI;AACF,WAAO,KAAK,UAAU,SAAS,EAAE;AAAA,EACnC,QAAQ;AACN,WAAO,OAAO,SAAS,EAAE;AAAA,EAC3B;AACF;AAEA,SAAS,wBAAwB,OAA+B;AAC9D,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAC7B,QAAM,OAAO,CAAC,aAAa,YAAY,QAAQ,YAAY,KAAK;AAChE,aAAW,OAAO,MAAM;AACtB,UAAM,YAAY,iBAAiB,MAAM,GAAG,CAAC;AAC7C,QAAI,UAAW,QAAO;AAAA,EACxB;AACA,aAAW,SAAS,OAAO,OAAO,KAAK,GAAG;AACxC,QAAI,OAAO,UAAU,UAAU;AAC7B,YAAM,WAAW,kBAAkB,KAAK,EAAE,CAAC,KAAK,cAAc,KAAK;AACnE,UAAI,SAAU,QAAO;AAAA,IACvB;AACA,QAAI,SAAS,KAAK,GAAG;AACnB,YAAM,SAAS,wBAAwB,KAAK;AAC5C,UAAI,OAAQ,QAAO;AAAA,IACrB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,cAAc,MAA6B;AAClD,SAAO,iBAAiB,IAAI,EAAE,CAAC,KAAK;AACtC;AAEA,SAAS,iBAAiB,MAAwB;AAChD,QAAM,MAAM,oBAAI,IAAY;AAC5B,MAAI,QAAQ;AACZ,QAAM,aAAa,KAAK,IAAI,KAAK,QAAQ,mBAAmB;AAC5D,WAAS,QAAQ,GAAG,SAAS,YAAY,SAAS,GAAG;AACnD,UAAM,OAAO,QAAQ,aAAa,KAAK,KAAK,IAAK;AACjD,QAAI,yBAAyB,IAAI,GAAG;AAClC,2BAAqB,KAAK,KAAK;AAC/B,cAAQ;AACR;AAAA,IACF;AACA,aAAS;AACT,QAAI,MAAM,SAAS,KAAK;AACtB,2BAAqB,KAAK,KAAK;AAC/B,cAAQ;AAAA,IACV;AAAA,EACF;AACA,SAAO,CAAC,GAAG,GAAG,EAAE,MAAM,GAAG,EAAE;AAC7B;AAEA,SAAS,yBAAyB,MAAuB;AACvD,SACE,SAAS,OACT,SAAS,QACT,SAAS,QACT,SAAS,OACT,SAAS,OACT,SAAS,OACT,SAAS,OACT,SAAS,OACT,SAAS,OACT,SAAS,OACT,SAAS,OACT,SAAS,OACT,SAAS,OACT,SAAS,OACT,SAAS,OACT,SAAS;AAEb;AAEA,SAAS,qBAAqB,KAAkB,KAAmB;AACjE,QAAM,YAAY,wBAAwB,GAAG;AAC7C,MAAI,UAAU,WAAW,KAAK,UAAU,SAAS,KAAK,EAAG;AACzD,MAAI,iBAAiB,SAAS,EAAG,KAAI,IAAI,SAAS;AACpD;AAEA,SAAS,wBAAwB,KAAqB;AACpD,MAAI,QAAQ;AACZ,MAAI,MAAM,IAAI;AACd,SAAO,QAAQ,OAAO,6BAA6B,IAAI,KAAK,CAAE,EAAG,UAAS;AAC1E,SAAO,MAAM,SAAS,8BAA8B,IAAI,MAAM,CAAC,CAAE,EAAG,QAAO;AAC3E,SAAO,IAAI,MAAM,OAAO,GAAG;AAC7B;AAEA,SAAS,6BAA6B,MAAuB;AAC3D,SACE,SAAS,OACT,SAAS,OACT,SAAS,OACT,SAAS,OACT,SAAS,OACT,SAAS,OACT,SAAS;AAEb;AAEA,SAAS,8BAA8B,MAAuB;AAC5D,SACE,SAAS,OACT,SAAS,OACT,SAAS,OACT,SAAS,OACT,SAAS,OACT,SAAS,OACT,SAAS,OACT,SAAS;AAEb;AAEA,SAAS,iBAAiB,OAAwB;AAChD,MAAI,MAAM,WAAW,GAAG,KAAK,MAAM,WAAW,IAAI,KAAK,MAAM,WAAW,KAAK,KAAK,MAAM,WAAW,IAAI,GAAG;AACxG,WAAO,sBAAsB,KAAK;AAAA,EACpC;AACA,MAAI,MAAM,SAAS,GAAG,EAAG,QAAO,sBAAsB,KAAK;AAC3D,SAAO,sBAAsB,KAAK;AACpC;AAEA,SAAS,sBAAsB,OAAwB;AACrD,QAAM,YAAY,MAAM,YAAY,GAAG;AACvC,QAAM,WAAW,MAAM,MAAM,YAAY,CAAC;AAC1C,QAAM,MAAM,SAAS,YAAY,GAAG;AACpC,MAAI,OAAO,KAAK,QAAQ,SAAS,SAAS,EAAG,QAAO;AACpD,QAAM,MAAM,SAAS,MAAM,MAAM,CAAC;AAClC,MAAI,IAAI,SAAS,KAAK,IAAI,SAAS,GAAI,QAAO;AAC9C,aAAW,QAAQ,KAAK;AACtB,QAAI,CAAC,oBAAoB,IAAI,EAAG,QAAO;AAAA,EACzC;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAuB;AAClD,QAAM,OAAO,KAAK,WAAW,CAAC;AAC9B,SACG,QAAQ,MAAM,QAAQ,MACtB,QAAQ,MAAM,QAAQ,MACtB,QAAQ,MAAM,QAAQ,OACvB,SAAS,OACT,SAAS,OACT,SAAS;AAEb;AAEA,SAAS,kBAAkB,MAAwB;AACjD,QAAM,MAAM,oBAAI,IAAY;AAC5B,aAAW,QAAQ,KAAK,MAAM,OAAO,GAAG;AACtC,UAAM,QAAQ,KAAK,MAAM,2CAA2C;AACpE,QAAI,QAAQ,CAAC,EAAG,KAAI,IAAI,MAAM,CAAC,EAAE,KAAK,CAAC;AACvC,UAAM,OAAO,KAAK,MAAM,wBAAwB;AAChD,QAAI,OAAO,CAAC,EAAG,KAAI,IAAI,KAAK,CAAC,EAAE,KAAK,CAAC;AAAA,EACvC;AACA,SAAO,CAAC,GAAG,GAAG,EAAE,MAAM,GAAG,EAAE;AAC7B;","names":["paths"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/codex-cli-fallback.ts"],"sourcesContent":["import type { CodexCliReasoningEffort } from \"./types.js\";\n\nexport interface CodexCliFallbackMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface CodexCliFallbackConfig {\n apiKey?: string | Record<string, unknown>;\n executable?: unknown;\n codexCliExecutable?: unknown;\n reasoningEffort?: unknown;\n codexCliReasoningEffort?: unknown;\n retryOptions?: {\n timeoutMs?: unknown;\n };\n}\n\nexport interface CodexCliFallbackOptions {\n timeoutMs?: number;\n}\n\nexport interface CodexCliFallbackResult {\n content: string;\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n };\n}\n\nexport interface CodexCliFallbackRequest {\n config: CodexCliFallbackConfig;\n modelId: string;\n messages: CodexCliFallbackMessage[];\n options: CodexCliFallbackOptions;\n}\n\nexport type CodexCliFallbackRunner = (\n request: CodexCliFallbackRequest,\n) => Promise<CodexCliFallbackResult>;\n\nconst VALID_CODEX_CLI_REASONING_EFFORTS = new Set<CodexCliReasoningEffort>([\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n]);\n\nlet processRunner: CodexCliFallbackRunner | undefined;\n\n/**\n * Registers the process-local Codex CLI transport. Core deliberately does not\n * import child_process so host adapters such as OpenClaw do not ship shell\n * execution in their plugin bundle; benchmark/standalone runtimes opt in.\n */\nexport function setCodexCliFallbackRunnerForProcess(\n runner: CodexCliFallbackRunner | undefined,\n): () => void {\n const previous = processRunner;\n processRunner = runner;\n return () => {\n processRunner = previous;\n };\n}\n\nexport async function callCodexCliFallback(\n config: CodexCliFallbackConfig,\n modelId: string,\n messages: CodexCliFallbackMessage[],\n options: CodexCliFallbackOptions = {},\n): Promise<CodexCliFallbackResult> {\n if (!processRunner) {\n throw new Error(\n 'codex-cli fallback transport is not registered; install a runner with setCodexCliFallbackRunnerForProcess() before using api: \"codex-cli\"',\n );\n }\n\n return await processRunner({\n config: normalizeCodexCliFallbackConfig(config),\n modelId: normalizeCodexCliModel(modelId),\n messages,\n options: normalizeCodexCliFallbackOptions(options),\n });\n}\n\nfunction normalizeCodexCliFallbackConfig(\n config: CodexCliFallbackConfig,\n): CodexCliFallbackConfig {\n return {\n ...config,\n ...(config.executable !== undefined\n ? { executable: normalizeOptionalString(config.executable, \"codex-cli executable\") }\n : {}),\n ...(config.codexCliExecutable !== undefined\n ? { codexCliExecutable: normalizeOptionalString(config.codexCliExecutable, \"codex-cli executable\") }\n : {}),\n ...(config.reasoningEffort !== undefined\n ? { reasoningEffort: normalizeCodexCliReasoningEffort(config.reasoningEffort) }\n : {}),\n ...(config.codexCliReasoningEffort !== undefined\n ? { codexCliReasoningEffort: normalizeCodexCliReasoningEffort(config.codexCliReasoningEffort) }\n : {}),\n ...(config.retryOptions?.timeoutMs !== undefined\n ? { retryOptions: { timeoutMs: normalizeCodexCliTimeoutMs(config.retryOptions.timeoutMs) } }\n : {}),\n };\n}\n\nfunction normalizeCodexCliFallbackOptions(\n options: CodexCliFallbackOptions,\n): CodexCliFallbackOptions {\n return {\n ...(options.timeoutMs !== undefined\n ? { timeoutMs: normalizeCodexCliTimeoutMs(options.timeoutMs) }\n : {}),\n };\n}\n\nfunction normalizeOptionalString(value: unknown, label: string): string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`${label} must be a non-empty string`);\n }\n return value.trim();\n}\n\nfunction normalizeCodexCliModel(value: string): string {\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n throw new Error(\"codex-cli model must be a non-empty string\");\n }\n return trimmed;\n}\n\nfunction normalizeCodexCliReasoningEffort(value: unknown): CodexCliReasoningEffort {\n if (typeof value !== \"string\") {\n throw new Error(\"codex-cli reasoningEffort must be one of low, medium, high, xhigh\");\n }\n const normalized = value.trim().toLowerCase();\n if (VALID_CODEX_CLI_REASONING_EFFORTS.has(normalized as CodexCliReasoningEffort)) {\n return normalized as CodexCliReasoningEffort;\n }\n throw new Error(\"codex-cli reasoningEffort must be one of low, medium, high, xhigh\");\n}\n\nfunction normalizeCodexCliTimeoutMs(value: unknown): number {\n const parsed = typeof value === \"number\"\n ? value\n : typeof value === \"string\" && value.trim().length > 0\n ? Number(value)\n : NaN;\n if (!Number.isFinite(parsed) || !Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(\"codex-cli timeoutMs must be a positive integer\");\n }\n return parsed;\n}\n\nexport const __codexCliFallbackTestHooks = {\n setRunCodexCliForTest: setCodexCliFallbackRunnerForProcess,\n};\n"],"mappings":";AA0CA,IAAM,oCAAoC,oBAAI,IAA6B;AAAA,EACzE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAI;AAOG,SAAS,oCACd,QACY;AACZ,QAAM,WAAW;AACjB,kBAAgB;AAChB,SAAO,MAAM;AACX,oBAAgB;AAAA,EAClB;AACF;AAEA,eAAsB,qBACpB,QACA,SACA,UACA,UAAmC,CAAC,GACH;AACjC,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,cAAc;AAAA,IACzB,QAAQ,gCAAgC,MAAM;AAAA,IAC9C,SAAS,uBAAuB,OAAO;AAAA,IACvC;AAAA,IACA,SAAS,iCAAiC,OAAO;AAAA,EACnD,CAAC;AACH;AAEA,SAAS,gCACP,QACwB;AACxB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAI,OAAO,eAAe,SACtB,EAAE,YAAY,wBAAwB,OAAO,YAAY,sBAAsB,EAAE,IACjF,CAAC;AAAA,IACL,GAAI,OAAO,uBAAuB,SAC9B,EAAE,oBAAoB,wBAAwB,OAAO,oBAAoB,sBAAsB,EAAE,IACjG,CAAC;AAAA,IACL,GAAI,OAAO,oBAAoB,SAC3B,EAAE,iBAAiB,iCAAiC,OAAO,eAAe,EAAE,IAC5E,CAAC;AAAA,IACL,GAAI,OAAO,4BAA4B,SACnC,EAAE,yBAAyB,iCAAiC,OAAO,uBAAuB,EAAE,IAC5F,CAAC;AAAA,IACL,GAAI,OAAO,cAAc,cAAc,SACnC,EAAE,cAAc,EAAE,WAAW,2BAA2B,OAAO,aAAa,SAAS,EAAE,EAAE,IACzF,CAAC;AAAA,EACP;AACF;AAEA,SAAS,iCACP,SACyB;AACzB,SAAO;AAAA,IACL,GAAI,QAAQ,cAAc,SACtB,EAAE,WAAW,2BAA2B,QAAQ,SAAS,EAAE,IAC3D,CAAC;AAAA,EACP;AACF;AAEA,SAAS,wBAAwB,OAAgB,OAAuB;AACtE,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,WAAW,GAAG;AAC1D,UAAM,IAAI,MAAM,GAAG,KAAK,6BAA6B;AAAA,EACvD;AACA,SAAO,MAAM,KAAK;AACpB;AAEA,SAAS,uBAAuB,OAAuB;AACrD,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,SAAO;AACT;AAEA,SAAS,iCAAiC,OAAyC;AACjF,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI,MAAM,mEAAmE;AAAA,EACrF;AACA,QAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAC5C,MAAI,kCAAkC,IAAI,UAAqC,GAAG;AAChF,WAAO;AAAA,EACT;AACA,QAAM,IAAI,MAAM,mEAAmE;AACrF;AAEA,SAAS,2BAA2B,OAAwB;AAC1D,QAAM,SAAS,OAAO,UAAU,WAC5B,QACA,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,IACjD,OAAO,KAAK,IACZ;AACN,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,CAAC,OAAO,UAAU,MAAM,KAAK,UAAU,GAAG;AACxE,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AACA,SAAO;AACT;AAEO,IAAM,8BAA8B;AAAA,EACzC,uBAAuB;AACzB;","names":[]}
|