@unbrained/pm-cli 2026.7.8 → 2026.7.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.md +1 -0
- package/dist/cli/commands/close.js +5 -2
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/completion.js +8 -2
- package/dist/cli/commands/completion.js.map +1 -1
- package/dist/cli/commands/contracts.d.ts +11 -0
- package/dist/cli/commands/contracts.js +112 -15
- package/dist/cli/commands/contracts.js.map +1 -1
- package/dist/cli/commands/create.js +4 -2
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/list.d.ts +4 -0
- package/dist/cli/commands/list.js +32 -3
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/update.d.ts +32 -1
- package/dist/cli/commands/update.js +19 -2
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/register-list-query.js +4 -2
- package/dist/cli/register-list-query.js.map +1 -1
- package/dist/cli/register-operations.js +4 -2
- package/dist/cli/register-operations.js.map +1 -1
- package/dist/cli/registration-helpers.js +4 -2
- package/dist/cli/registration-helpers.js.map +1 -1
- package/dist/cli-bundle/chunks/{chunk-D63PEJTB.js → chunk-26MFLA7K.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-HI27UADG.js → chunk-2FKIIQMJ.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-RLHQ3G4M.js → chunk-5RJ4LFD3.js} +30 -3
- package/dist/cli-bundle/chunks/chunk-5RJ4LFD3.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-IYRG5AEC.js → chunk-5ZMZF53A.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-UVFJSKTF.js → chunk-63PZJCKO.js} +7 -4
- package/dist/cli-bundle/chunks/chunk-63PZJCKO.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-TUDAYIO7.js → chunk-ASSVI7FP.js} +5 -3
- package/dist/cli-bundle/chunks/{chunk-TUDAYIO7.js.map → chunk-ASSVI7FP.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-KMXVZ2P7.js → chunk-BPYVKTZE.js} +112 -17
- package/dist/cli-bundle/chunks/chunk-BPYVKTZE.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-3FRNNVWY.js → chunk-CEX2DQXZ.js} +405 -75
- package/dist/cli-bundle/chunks/chunk-CEX2DQXZ.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-DUBC6TI3.js → chunk-CHSXGTWF.js} +18 -4
- package/dist/cli-bundle/chunks/{chunk-DUBC6TI3.js.map → chunk-CHSXGTWF.js.map} +2 -2
- package/dist/cli-bundle/chunks/{chunk-G4FKP4ID.js → chunk-DBV5A7FT.js} +6 -4
- package/dist/cli-bundle/chunks/chunk-DBV5A7FT.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-YQEKE4FO.js → chunk-DQLP22K2.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-ZMOPZFVT.js → chunk-GZ365M6E.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-XPSGJ4IV.js → chunk-K2OKKYSO.js} +4 -2
- package/dist/cli-bundle/chunks/{chunk-XPSGJ4IV.js.map → chunk-K2OKKYSO.js.map} +2 -2
- package/dist/cli-bundle/chunks/{chunk-TR2C6V5T.js → chunk-K4NMHZR3.js} +90 -19
- package/dist/cli-bundle/chunks/chunk-K4NMHZR3.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-MYHFZNBO.js → chunk-KAJNWMBE.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-TU5P744I.js → chunk-MBLHA6LR.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-UCRYCT5M.js → chunk-MCZK7LY6.js} +19 -5
- package/dist/cli-bundle/chunks/{chunk-UCRYCT5M.js.map → chunk-MCZK7LY6.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-TTCJCKUJ.js → chunk-N4S7BV43.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-ML27MHNM.js → chunk-NBJCIAVV.js} +88 -17
- package/dist/cli-bundle/chunks/chunk-NBJCIAVV.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-ASMRSIDX.js → chunk-NRYZ4QLH.js} +111 -16
- package/dist/cli-bundle/chunks/chunk-NRYZ4QLH.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-RDJXIAJB.js → chunk-NSPSJWGL.js} +6 -3
- package/dist/cli-bundle/chunks/chunk-NSPSJWGL.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-PJPZTE7P.js → chunk-ONADVBMD.js} +5 -3
- package/dist/cli-bundle/chunks/chunk-ONADVBMD.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-GE44TQMC.js → chunk-P5SUMCU5.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-2RADY7IB.js → chunk-PPY3GXFK.js} +405 -75
- package/dist/cli-bundle/chunks/chunk-PPY3GXFK.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-YR5R4FMQ.js → chunk-S7J3GEHL.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-XN5BEN2B.js → chunk-TI7QSUFK.js} +31 -4
- package/dist/cli-bundle/chunks/chunk-TI7QSUFK.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-EYPIUFWJ.js → chunk-VCGHRLJU.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-P2WE5KCU.js → chunk-WDNPNW22.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-SN5X5GTU.js → chunk-XXN2B2MJ.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-GQOKFX2G.js → chunk-Y2736PT5.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-FL625JJM.js → chunk-YHKXNGLA.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-YUCKM3MD.js → chunk-YPE5MFPJ.js} +2 -2
- package/dist/cli-bundle/chunks/{close-E3RLZSP2.js → close-5WY6QO5F.js} +2 -2
- package/dist/cli-bundle/chunks/{close-K6BFI3OX.js → close-TKTFRL7N.js} +2 -2
- package/dist/cli-bundle/chunks/{close-many-6NBL3PM4.js → close-many-HEPL66EG.js} +4 -4
- package/dist/cli-bundle/chunks/{close-many-X4YKS3RO.js → close-many-U2KLQ3NL.js} +4 -4
- package/dist/cli-bundle/chunks/{create-AMBMYP6F.js → create-KCQM6UYM.js} +2 -2
- package/dist/cli-bundle/chunks/{create-TRIBYORN.js → create-LD4SEUD6.js} +2 -2
- package/dist/cli-bundle/chunks/{plan-MK2QY3GA.js → plan-B42KBMX7.js} +3 -3
- package/dist/cli-bundle/chunks/{plan-CJPKFRBK.js → plan-LUR7C24X.js} +3 -3
- package/dist/cli-bundle/chunks/{profile-HTBFINKQ.js → profile-5F75MO5O.js} +3 -3
- package/dist/cli-bundle/chunks/{profile-AQNHXOYA.js → profile-JRDMDGT5.js} +3 -3
- package/dist/cli-bundle/chunks/{register-list-query-EEF33SUJ.js → register-list-query-GZYRZLQZ.js} +8 -8
- package/dist/cli-bundle/chunks/register-list-query-GZYRZLQZ.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-list-query-S4FBWIWN.js → register-list-query-W2W7RQJJ.js} +7 -7
- package/dist/cli-bundle/chunks/register-list-query-W2W7RQJJ.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-mutation-L5Q7AUDN.js → register-mutation-5UDT3WL3.js} +10 -10
- package/dist/cli-bundle/chunks/{register-mutation-QFLRBCI7.js → register-mutation-7DMOYDPC.js} +10 -10
- package/dist/cli-bundle/chunks/{register-operations-QDU43FCG.js → register-operations-NW43IUPE.js} +12 -11
- package/dist/cli-bundle/chunks/register-operations-NW43IUPE.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-operations-HDE4FVW4.js → register-operations-Y4E32W4D.js} +13 -12
- package/dist/cli-bundle/chunks/register-operations-Y4E32W4D.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-setup-EGMTAXDC.js → register-setup-3GVJ7XPE.js} +6 -6
- package/dist/cli-bundle/chunks/{register-setup-PNIO3L2P.js → register-setup-MPTTS52V.js} +6 -6
- package/dist/cli-bundle/chunks/{update-SDIRJGSY.js → update-76CRUMC7.js} +4 -4
- package/dist/cli-bundle/chunks/{update-MP4XLU56.js → update-ZMYVXM77.js} +4 -4
- package/dist/cli-bundle/chunks/{update-many-34AIU6W7.js → update-many-QYQRGNPU.js} +6 -6
- package/dist/cli-bundle/chunks/{update-many-JUPCNOKV.js → update-many-U4CEQWI4.js} +6 -6
- package/dist/cli-bundle/main.js +7 -7
- package/dist/cli-bundle/sdk-runtime.js +81 -17
- package/dist/cli-bundle/sdk.js +84 -20
- package/dist/cli-bundle/sdk.js.map +3 -3
- package/dist/sdk/cli-contracts/flag-contracts.js +5 -2
- package/dist/sdk/cli-contracts/flag-contracts.js.map +1 -1
- package/dist/sdk/cli-contracts/tool-option-contracts.js +10 -5
- package/dist/sdk/cli-contracts/tool-option-contracts.js.map +1 -1
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +12 -4
- package/dist/sdk/cli-contracts/tool-parameter-tables.js.map +1 -1
- package/dist/sdk/cli-contracts/tool-schema.d.ts +4 -0
- package/dist/sdk/cli-contracts/tool-schema.js +66 -11
- package/dist/sdk/cli-contracts/tool-schema.js.map +1 -1
- package/dist/sdk/index.d.ts +1 -1
- package/dist/sdk/index.js +3 -3
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/runtime.d.ts +340 -25
- package/dist/sdk/runtime.js +413 -25
- package/dist/sdk/runtime.js.map +1 -1
- package/docs/AGENT_GUIDE.md +3 -0
- package/docs/COMMANDS.md +10 -1
- package/docs/SDK.md +37 -0
- package/package.json +1 -1
- package/dist/cli-bundle/chunks/chunk-2RADY7IB.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-3FRNNVWY.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-ASMRSIDX.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-G4FKP4ID.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-KMXVZ2P7.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-ML27MHNM.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-PJPZTE7P.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-RDJXIAJB.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-RLHQ3G4M.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-TR2C6V5T.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-UVFJSKTF.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-XN5BEN2B.js.map +0 -1
- package/dist/cli-bundle/chunks/register-list-query-EEF33SUJ.js.map +0 -1
- package/dist/cli-bundle/chunks/register-list-query-S4FBWIWN.js.map +0 -7
- package/dist/cli-bundle/chunks/register-operations-HDE4FVW4.js.map +0 -1
- package/dist/cli-bundle/chunks/register-operations-QDU43FCG.js.map +0 -7
- /package/dist/cli-bundle/chunks/{chunk-D63PEJTB.js.map → chunk-26MFLA7K.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-HI27UADG.js.map → chunk-2FKIIQMJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-IYRG5AEC.js.map → chunk-5ZMZF53A.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-YQEKE4FO.js.map → chunk-DQLP22K2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ZMOPZFVT.js.map → chunk-GZ365M6E.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-MYHFZNBO.js.map → chunk-KAJNWMBE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-TU5P744I.js.map → chunk-MBLHA6LR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-TTCJCKUJ.js.map → chunk-N4S7BV43.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-GE44TQMC.js.map → chunk-P5SUMCU5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-YR5R4FMQ.js.map → chunk-S7J3GEHL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-EYPIUFWJ.js.map → chunk-VCGHRLJU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-P2WE5KCU.js.map → chunk-WDNPNW22.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-SN5X5GTU.js.map → chunk-XXN2B2MJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-GQOKFX2G.js.map → chunk-Y2736PT5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FL625JJM.js.map → chunk-YHKXNGLA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-YUCKM3MD.js.map → chunk-YPE5MFPJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-E3RLZSP2.js.map → close-5WY6QO5F.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-K6BFI3OX.js.map → close-TKTFRL7N.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-many-6NBL3PM4.js.map → close-many-HEPL66EG.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-many-X4YKS3RO.js.map → close-many-U2KLQ3NL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-AMBMYP6F.js.map → create-KCQM6UYM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-TRIBYORN.js.map → create-LD4SEUD6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{plan-MK2QY3GA.js.map → plan-B42KBMX7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{plan-CJPKFRBK.js.map → plan-LUR7C24X.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{profile-HTBFINKQ.js.map → profile-5F75MO5O.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{profile-AQNHXOYA.js.map → profile-JRDMDGT5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-mutation-L5Q7AUDN.js.map → register-mutation-5UDT3WL3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-mutation-QFLRBCI7.js.map → register-mutation-7DMOYDPC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-setup-EGMTAXDC.js.map → register-setup-3GVJ7XPE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{register-setup-PNIO3L2P.js.map → register-setup-MPTTS52V.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-SDIRJGSY.js.map → update-76CRUMC7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-MP4XLU56.js.map → update-ZMYVXM77.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-many-34AIU6W7.js.map → update-many-QYQRGNPU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-many-JUPCNOKV.js.map → update-many-U4CEQWI4.js.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../../cli/registration-helpers.ts", "../../../../../../../../core/search/cache.ts", "../../../../../../../../core/search/http-client.ts", "../../../../../../../../core/search/providers.ts", "../../../../../../../../core/search/corpus.ts", "../../../../../../../../core/search/embedding-batches.ts", "../../../../../../../../core/search/semantic-defaults.ts", "../../../../../../../../core/search/background-refresh.ts", "../../../../../../../../core/search/vector-stores.ts", "../../../../../../../../core/search/vectorization-metadata.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * @module cli/registration-helpers\n *\n * Provides CLI runtime support for Registration Helpers.\n */\nimport { Option, type Command } from \"commander\";\nimport { pathExists } from \"../core/fs/fs-utils.js\";\nimport { normalizeStatusInput } from \"../core/item/status.js\";\nimport { refreshSearchArtifactsForMutation } from \"../core/search/cache.js\";\nimport { shouldRunSearchRefreshInForeground } from \"../core/search/background-refresh.js\";\nimport { EXIT_CODE } from \"../core/shared/constants.js\";\nimport { PmCliError } from \"../core/shared/errors.js\";\nimport { printError, printResult, writeStdout } from \"../core/output/output.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../core/store/paths.js\";\nimport { readSettings } from \"../core/store/settings.js\";\nimport {\n setActiveCommandResult,\n} from \"../core/extensions/index.js\";\nimport type { GlobalOptions } from \"../core/shared/command-types.js\";\nimport type { ItemStatus } from \"../types/index.js\";\nimport {\n ACTIVITY_COMMANDER_STRING_OPTION_CONTRACTS,\n CONTEXT_COMMANDER_STRING_OPTION_CONTRACTS,\n CREATE_COMMANDER_REPEATABLE_OPTION_CONTRACTS,\n CREATE_COMMANDER_STRING_OPTION_CONTRACTS,\n LIST_COMMANDER_STRING_OPTION_CONTRACTS,\n NEXT_COMMANDER_STRING_OPTION_CONTRACTS,\n SEARCH_COMMANDER_STRING_OPTION_CONTRACTS,\n UPDATE_COMMANDER_REPEATABLE_OPTION_CONTRACTS,\n UPDATE_COMMANDER_STRING_OPTION_CONTRACTS,\n readFirstValueFromCommanderOptions,\n readFirstStringFromCommanderOptions,\n readStringArrayFromCommanderOptions,\n} from \"../sdk/cli-contracts.js\";\nimport type { CommanderOptionAliasContract } from \"../sdk/cli-contracts.js\";\nimport type {\n ContextOptions,\n CreateCommandOptions,\n AggregateOptions,\n ListOptions,\n NextOptions,\n} from \"./commands/index.js\";\nimport type { runList, runActivity } from \"./commands/index.js\";\n\nexport {\n printError,\n printResult,\n writeStdout,\n};\n\nconst RESOLVED_GLOBAL_OPTIONS = Symbol(\"pm.resolvedGlobalOptions\");\n\ntype CommandWithResolvedGlobals = Command & {\n [RESOLVED_GLOBAL_OPTIONS]?: GlobalOptions;\n};\n\ninterface CommandOptionsReader {\n optsWithGlobals?: () => Record<string, unknown>;\n opts?: () => Record<string, unknown>;\n}\n\nfunction commandOptionsReader(command: unknown): CommandOptionsReader {\n return typeof command === \"object\" && command !== null ? command as CommandOptionsReader : {};\n}\n\n// Resolves the alias contract for a normalize target, falling back to a\n// single-key contract if the target is somehow absent from the contract table.\nfunction resolveCommanderContract(\n contracts: CommanderOptionAliasContract[],\n target: string,\n): CommanderOptionAliasContract {\n const contract = contracts.find((entry) => entry.target === target);\n /* c8 ignore start -- every normalize target is present in its contract table (verified by contract drift tests); the fallback is a defensive guard against future drift */\n return contract ?? { target, keys: [target] };\n /* c8 ignore stop */\n}\n\n/**\n * Implements set resolved global options for the public runtime surface of this module.\n */\nexport function setResolvedGlobalOptions(command: Command, globalOptions: GlobalOptions): void {\n (command as CommandWithResolvedGlobals)[RESOLVED_GLOBAL_OPTIONS] = { ...globalOptions };\n}\n\n/**\n * Implements clear resolved global options for the public runtime surface of this module.\n */\nexport function clearResolvedGlobalOptions(command: Command): void {\n delete (command as CommandWithResolvedGlobals)[RESOLVED_GLOBAL_OPTIONS];\n}\n\n/**\n * Implements get global options for the public runtime surface of this module.\n */\nexport function getGlobalOptions(command: Command): GlobalOptions {\n const resolved = (command as CommandWithResolvedGlobals)[RESOLVED_GLOBAL_OPTIONS];\n if (resolved) {\n return { ...resolved };\n }\n const reader = commandOptionsReader(command);\n const opts = typeof reader.optsWithGlobals === \"function\"\n ? reader.optsWithGlobals()\n : typeof reader.opts === \"function\"\n ? reader.opts()\n : {};\n return {\n json: opts.json === true ? true : undefined,\n quiet: Boolean(opts.quiet),\n noChangedFields: opts.changedFields === false,\n idOnly: opts.idOnly === true,\n path: typeof opts.pmPath === \"string\"\n ? opts.pmPath\n : typeof opts.path === \"string\"\n ? opts.path\n : undefined,\n noExtensions: opts.extensions === false,\n noPager: Boolean(opts.noPager),\n profile: Boolean(opts.profile),\n };\n}\n\n/**\n * Implements get command path for the public runtime surface of this module.\n */\nexport function getCommandPath(command: Command): string {\n const parts: string[] = [];\n let current: Command | null = command;\n while (current?.parent) {\n parts.unshift(current.name());\n current = current.parent;\n }\n return parts.join(\" \");\n}\n\n/**\n * Implements apply default output format for the public runtime surface of this module.\n */\nexport async function applyDefaultOutputFormat(globalOptions: GlobalOptions): Promise<GlobalOptions> {\n if (globalOptions.json === true) {\n return globalOptions;\n }\n const pmRoot = resolvePmRoot(process.cwd(), globalOptions.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n return globalOptions;\n }\n const settings = await readSettings(pmRoot);\n return {\n ...globalOptions,\n defaultOutputFormat: settings.output.default_format,\n };\n}\n\n/**\n * Implements collect for the public runtime surface of this module.\n */\nexport function collect(value: string, previous: string[] | undefined): string[] {\n const next = previous ?? [];\n next.push(value);\n return next;\n}\n\nfunction pushOptionalValueFlag(args: string[], flag: string, value: unknown): void {\n if (typeof value !== \"string\") {\n return;\n }\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n return;\n }\n args.push(flag, trimmed);\n}\n\nfunction pushOptionalBooleanFlag(args: string[], flag: string, value: unknown): void {\n if (value === true) {\n args.push(flag);\n }\n}\n\nfunction pushRepeatableValueFlag(args: string[], flag: string, values: unknown): void {\n if (!Array.isArray(values)) {\n return;\n }\n for (const value of values) {\n if (typeof value !== \"string\") {\n continue;\n }\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n continue;\n }\n args.push(flag, trimmed);\n }\n}\n\nfunction optionTrue(options: Record<string, unknown>, key: string): true | undefined {\n return options[key] === true ? true : undefined;\n}\n\nfunction optionFalse(options: Record<string, unknown>, key: string): true | undefined {\n return options[key] === false ? true : undefined;\n}\n\n/**\n * Reads an option value when Commander supplied it as a string.\n */\nexport function readOptionString(options: Record<string, unknown>, key: string): string | undefined {\n return typeof options[key] === \"string\" ? options[key] : undefined;\n}\n\n/**\n * Adds a Commander option that remains parseable but hidden from human help.\n */\nexport function addHiddenOption(command: Command, flags: string, description: string): void {\n command.addOption(new Option(flags, description).hideHelp());\n}\n\nfunction anyOptionTrue(options: Record<string, unknown>, keys: readonly string[]): true | undefined {\n return keys.some((key) => options[key] === true) ? true : undefined;\n}\n\nfunction copyUnknownOptions(target: Record<string, unknown>, source: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(source)) {\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") {\n continue;\n }\n if (Object.hasOwn(target, key)) {\n continue;\n }\n target[key] = value;\n }\n}\n\n/**\n * Implements build background test command args for the public runtime surface of this module.\n */\nexport function buildBackgroundTestCommandArgs(id: string, options: Record<string, unknown>): string[] {\n const args: string[] = [\"test\", id, \"--run\", \"--json\", \"--progress\"];\n pushRepeatableValueFlag(args, \"--add\", options.add);\n pushRepeatableValueFlag(args, \"--add-json\", options.addJson);\n pushRepeatableValueFlag(args, \"--remove\", options.remove);\n pushOptionalValueFlag(args, \"--match\", options.match);\n pushOptionalValueFlag(args, \"--only-index\", options.onlyIndex);\n pushOptionalBooleanFlag(args, \"--only-last\", options.onlyLast);\n pushOptionalValueFlag(args, \"--timeout\", options.timeout);\n pushRepeatableValueFlag(args, \"--env-set\", options.envSet);\n pushRepeatableValueFlag(args, \"--env-clear\", options.envClear);\n pushOptionalBooleanFlag(args, \"--shared-host-safe\", options.sharedHostSafe);\n pushOptionalValueFlag(args, \"--pm-context\", options.pmContext);\n pushOptionalBooleanFlag(args, \"--override-linked-pm-context\", options.overrideLinkedPmContext);\n pushOptionalBooleanFlag(args, \"--fail-on-context-mismatch\", options.failOnContextMismatch);\n pushOptionalBooleanFlag(args, \"--fail-on-skipped\", options.failOnSkipped);\n pushOptionalBooleanFlag(args, \"--fail-on-empty-test-run\", options.failOnEmptyTestRun);\n pushOptionalBooleanFlag(args, \"--require-assertions-for-pm\", options.requireAssertionsForPm);\n pushOptionalBooleanFlag(args, \"--check-context\", options.checkContext);\n pushOptionalBooleanFlag(args, \"--auto-pm-context\", options.autoPmContext);\n pushOptionalValueFlag(args, \"--author\", options.author);\n pushOptionalValueFlag(args, \"--message\", options.message);\n pushOptionalBooleanFlag(args, \"--force\", options.force);\n return args;\n}\n\n/**\n * Implements build background test all command args for the public runtime surface of this module.\n */\nexport function buildBackgroundTestAllCommandArgs(options: Record<string, unknown>): string[] {\n const args: string[] = [\"test-all\", \"--json\", \"--progress\"];\n pushOptionalValueFlag(args, \"--status\", options.status);\n pushOptionalValueFlag(args, \"--limit\", options.limit);\n pushOptionalValueFlag(args, \"--offset\", options.offset);\n pushOptionalValueFlag(args, \"--timeout\", options.timeout);\n pushRepeatableValueFlag(args, \"--env-set\", options.envSet);\n pushRepeatableValueFlag(args, \"--env-clear\", options.envClear);\n pushOptionalBooleanFlag(args, \"--shared-host-safe\", options.sharedHostSafe);\n pushOptionalValueFlag(args, \"--pm-context\", options.pmContext);\n pushOptionalBooleanFlag(args, \"--override-linked-pm-context\", options.overrideLinkedPmContext);\n pushOptionalBooleanFlag(args, \"--fail-on-context-mismatch\", options.failOnContextMismatch);\n pushOptionalBooleanFlag(args, \"--fail-on-skipped\", options.failOnSkipped);\n pushOptionalBooleanFlag(args, \"--fail-on-empty-test-run\", options.failOnEmptyTestRun);\n pushOptionalBooleanFlag(args, \"--require-assertions-for-pm\", options.requireAssertionsForPm);\n pushOptionalBooleanFlag(args, \"--check-context\", options.checkContext);\n pushOptionalBooleanFlag(args, \"--auto-pm-context\", options.autoPmContext);\n return args;\n}\n\n/**\n * Implements format hook warnings for the public runtime surface of this module.\n */\nexport function formatHookWarnings(warnings: string[]): string {\n return warnings.join(\",\");\n}\n\n/**\n * Implements normalize create options for the public runtime surface of this module.\n */\nexport function normalizeCreateOptions(\n commandOptions: Record<string, unknown>,\n options: { requireType?: boolean } = {},\n): CreateCommandOptions {\n const readCreateString = (target: string): string | undefined =>\n readFirstStringFromCommanderOptions(\n commandOptions,\n resolveCommanderContract(CREATE_COMMANDER_STRING_OPTION_CONTRACTS, target),\n );\n const readCreateList = (target: string): string[] | undefined =>\n readStringArrayFromCommanderOptions(\n commandOptions,\n resolveCommanderContract(CREATE_COMMANDER_REPEATABLE_OPTION_CONTRACTS, target),\n );\n\n const type = readCreateString(\"type\");\n if (options.requireType !== false && type === undefined) {\n throw new PmCliError(\n \"Missing required option --type <value>. Why required: create resolves runtime schema fields/workflow from item type. Retry: add --type <built-in or configured custom type> (example: --type Task).\",\n EXIT_CODE.USAGE,\n );\n }\n\n const normalized: Record<string, unknown> = {\n title: readCreateString(\"title\"),\n description: readCreateString(\"description\"),\n type,\n template: readCreateString(\"template\"),\n createMode: readCreateString(\"createMode\"),\n schedulePreset: readCreateString(\"schedulePreset\"),\n status: readCreateString(\"status\"),\n priority: readCreateString(\"priority\"),\n tags: readCreateString(\"tags\"),\n addTags: readCreateList(\"addTags\"),\n body: readCreateString(\"body\"),\n deadline: readCreateString(\"deadline\"),\n estimatedMinutes: readCreateString(\"estimatedMinutes\"),\n acceptanceCriteria: readCreateString(\"acceptanceCriteria\"),\n definitionOfReady: readCreateString(\"definitionOfReady\"),\n order: readCreateString(\"order\"),\n rank: readCreateString(\"rank\"),\n goal: readCreateString(\"goal\"),\n objective: readCreateString(\"objective\"),\n value: readCreateString(\"value\"),\n impact: readCreateString(\"impact\"),\n outcome: readCreateString(\"outcome\"),\n whyNow: readCreateString(\"whyNow\"),\n author: readCreateString(\"author\"),\n message: readCreateString(\"message\"),\n assignee: readCreateString(\"assignee\"),\n parent: readCreateString(\"parent\"),\n allowMissingParent: optionTrue(commandOptions, \"allowMissingParent\") === true,\n reviewer: readCreateString(\"reviewer\"),\n risk: readCreateString(\"risk\"),\n confidence: readCreateString(\"confidence\"),\n sprint: readCreateString(\"sprint\"),\n release: readCreateString(\"release\"),\n blockedBy: readCreateString(\"blockedBy\"),\n blockedReason: readCreateString(\"blockedReason\"),\n unblockNote: readCreateString(\"unblockNote\"),\n reporter: readCreateString(\"reporter\"),\n severity: readCreateString(\"severity\"),\n environment: readCreateString(\"environment\"),\n reproSteps: readCreateString(\"reproSteps\"),\n resolution: readCreateString(\"resolution\"),\n expectedResult: readCreateString(\"expectedResult\"),\n actualResult: readCreateString(\"actualResult\"),\n affectedVersion: readCreateString(\"affectedVersion\"),\n fixedVersion: readCreateString(\"fixedVersion\"),\n component: readCreateString(\"component\"),\n regression: readCreateString(\"regression\"),\n customerImpact: readCreateString(\"customerImpact\"),\n dep: readCreateList(\"dep\"),\n comment: readCreateList(\"comment\"),\n note: readCreateList(\"note\"),\n learning: readCreateList(\"learning\"),\n file: readCreateList(\"file\"),\n test: readCreateList(\"test\"),\n doc: readCreateList(\"doc\"),\n reminder: readCreateList(\"reminder\"),\n event: readCreateList(\"event\"),\n typeOption: readCreateList(\"typeOption\"),\n field: readCreateList(\"field\"),\n unset: readCreateList(\"unset\"),\n clearDeps: optionTrue(commandOptions, \"clearDeps\"),\n clearComments: optionTrue(commandOptions, \"clearComments\"),\n clearNotes: optionTrue(commandOptions, \"clearNotes\"),\n clearLearnings: optionTrue(commandOptions, \"clearLearnings\"),\n clearFiles: optionTrue(commandOptions, \"clearFiles\"),\n clearTests: optionTrue(commandOptions, \"clearTests\"),\n clearDocs: optionTrue(commandOptions, \"clearDocs\"),\n clearReminders: optionTrue(commandOptions, \"clearReminders\"),\n clearEvents: optionTrue(commandOptions, \"clearEvents\"),\n clearTypeOptions: optionTrue(commandOptions, \"clearTypeOptions\"),\n }\n copyUnknownOptions(normalized, commandOptions);\n return normalized as CreateCommandOptions;\n}\n\n/**\n * Implements normalize update options for the public runtime surface of this module.\n */\nexport function normalizeUpdateOptions(commandOptions: Record<string, unknown>): Record<string, unknown> {\n const readUpdateString = (target: string): string | undefined =>\n readFirstStringFromCommanderOptions(\n commandOptions,\n resolveCommanderContract(UPDATE_COMMANDER_STRING_OPTION_CONTRACTS, target),\n );\n const readUpdateList = (target: string): string[] | undefined =>\n readStringArrayFromCommanderOptions(\n commandOptions,\n resolveCommanderContract(UPDATE_COMMANDER_REPEATABLE_OPTION_CONTRACTS, target),\n );\n\n const normalized: Record<string, unknown> = {\n title: readUpdateString(\"title\"),\n description: readUpdateString(\"description\"),\n body: readUpdateString(\"body\"),\n status: readUpdateString(\"status\"),\n closeReason: readUpdateString(\"closeReason\"),\n priority: readUpdateString(\"priority\"),\n type: readUpdateString(\"type\"),\n tags: readUpdateString(\"tags\"),\n addTags: readUpdateList(\"addTags\"),\n removeTags: readUpdateList(\"removeTags\"),\n deadline: readUpdateString(\"deadline\"),\n estimatedMinutes: readUpdateString(\"estimatedMinutes\"),\n acceptanceCriteria: readUpdateString(\"acceptanceCriteria\"),\n definitionOfReady: readUpdateString(\"definitionOfReady\"),\n order: readUpdateString(\"order\"),\n rank: readUpdateString(\"rank\"),\n goal: readUpdateString(\"goal\"),\n objective: readUpdateString(\"objective\"),\n value: readUpdateString(\"value\"),\n impact: readUpdateString(\"impact\"),\n outcome: readUpdateString(\"outcome\"),\n whyNow: readUpdateString(\"whyNow\"),\n author: readUpdateString(\"author\"),\n message: readUpdateString(\"message\"),\n force: Boolean(commandOptions.force),\n allowAuditUpdate: anyOptionTrue(commandOptions, [\"allowAuditUpdate\", \"allow_audit_update\"]),\n allowAuditDepUpdate: anyOptionTrue(commandOptions, [\"allowAuditDepUpdate\", \"allow_audit_dep_update\"]),\n assignee: readUpdateString(\"assignee\"),\n parent: readUpdateString(\"parent\"),\n reviewer: readUpdateString(\"reviewer\"),\n risk: readUpdateString(\"risk\"),\n confidence: readUpdateString(\"confidence\"),\n sprint: readUpdateString(\"sprint\"),\n release: readUpdateString(\"release\"),\n blockedBy: readUpdateString(\"blockedBy\"),\n blockedReason: readUpdateString(\"blockedReason\"),\n unblockNote: readUpdateString(\"unblockNote\"),\n reporter: readUpdateString(\"reporter\"),\n severity: readUpdateString(\"severity\"),\n environment: readUpdateString(\"environment\"),\n reproSteps: readUpdateString(\"reproSteps\"),\n resolution: readUpdateString(\"resolution\"),\n expectedResult: readUpdateString(\"expectedResult\"),\n actualResult: readUpdateString(\"actualResult\"),\n affectedVersion: readUpdateString(\"affectedVersion\"),\n fixedVersion: readUpdateString(\"fixedVersion\"),\n component: readUpdateString(\"component\"),\n regression: readUpdateString(\"regression\"),\n customerImpact: readUpdateString(\"customerImpact\"),\n dep: readUpdateList(\"dep\"),\n depRemove: readUpdateList(\"depRemove\"),\n replaceDeps: optionTrue(commandOptions, \"replaceDeps\"),\n replaceTests: optionTrue(commandOptions, \"replaceTests\"),\n comment: readUpdateList(\"comment\"),\n note: readUpdateList(\"note\"),\n learning: readUpdateList(\"learning\"),\n file: readUpdateList(\"file\"),\n test: readUpdateList(\"test\"),\n doc: readUpdateList(\"doc\"),\n reminder: readUpdateList(\"reminder\"),\n event: readUpdateList(\"event\"),\n typeOption: readUpdateList(\"typeOption\"),\n field: readUpdateList(\"field\"),\n unset: readUpdateList(\"unset\"),\n clearDeps: optionTrue(commandOptions, \"clearDeps\"),\n clearComments: optionTrue(commandOptions, \"clearComments\"),\n clearNotes: optionTrue(commandOptions, \"clearNotes\"),\n clearLearnings: optionTrue(commandOptions, \"clearLearnings\"),\n clearFiles: optionTrue(commandOptions, \"clearFiles\"),\n clearTests: optionTrue(commandOptions, \"clearTests\"),\n clearDocs: optionTrue(commandOptions, \"clearDocs\"),\n clearReminders: optionTrue(commandOptions, \"clearReminders\"),\n clearEvents: optionTrue(commandOptions, \"clearEvents\"),\n clearTypeOptions: optionTrue(commandOptions, \"clearTypeOptions\"),\n }\n copyUnknownOptions(normalized, commandOptions);\n return normalized;\n}\n\nconst UPDATE_MANY_CONTROL_OPTION_KEYS = new Set<string>([\n \"filterStatus\",\n \"filterType\",\n \"filterTag\",\n \"filterPriority\",\n \"filterDeadlineBefore\",\n \"filterDeadlineAfter\",\n \"filterUpdatedAfter\",\n \"filterUpdatedBefore\",\n \"filterCreatedAfter\",\n \"filterCreatedBefore\",\n \"filterAssignee\",\n \"filterAssigneeFilter\",\n \"filterAssignee_filter\",\n \"filterParent\",\n \"filterSprint\",\n \"filterRelease\",\n \"filterAcMissing\",\n \"filterEstimatesMissing\",\n \"filterEstimateMissing\",\n \"filterResolutionMissing\",\n \"filterMetadataMissing\",\n \"filterReviewerMissing\",\n \"filterRiskMissing\",\n \"filterConfidenceMissing\",\n \"filterSprintMissing\",\n \"filterReleaseMissing\",\n \"filterHasNotes\",\n \"filterNoNotes\",\n \"filterHasLearnings\",\n \"filterNoLearnings\",\n \"filterHasFiles\",\n \"filterNoFiles\",\n \"filterHasDocs\",\n \"filterNoDocs\",\n \"filterHasTests\",\n \"filterNoTests\",\n \"filterHasComments\",\n \"filterNoComments\",\n \"filterHasDeps\",\n \"filterNoDeps\",\n \"filterHasBody\",\n \"filterEmptyBody\",\n \"filterHasLinkedCommand\",\n \"filterNoLinkedCommand\",\n \"ids\",\n \"limit\",\n \"offset\",\n \"dryRun\",\n \"rollback\",\n \"checkpoint\",\n]);\n\n/**\n * Implements extract update many mutation option source for the public runtime surface of this module.\n */\nexport function extractUpdateManyMutationOptionSource(commandOptions: Record<string, unknown>): Record<string, unknown> {\n const mutationOptions: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(commandOptions)) {\n if (UPDATE_MANY_CONTROL_OPTION_KEYS.has(key)) {\n continue;\n }\n mutationOptions[key] = value;\n }\n return mutationOptions;\n}\n\nfunction readListOptionString(options: Record<string, unknown>, target: string): string | undefined {\n const contract = resolveCommanderContract(LIST_COMMANDER_STRING_OPTION_CONTRACTS, target);\n const stringValue = readFirstStringFromCommanderOptions(options, contract);\n if (stringValue !== undefined) {\n return stringValue;\n }\n for (const key of contract.keys) {\n const value = options[key];\n /* c8 ignore start -- unreachable: readFirstStringFromCommanderOptions already returns above for any string value under contract.keys, so a string here cannot occur */\n if (target === \"ids\" && typeof value === \"string\") {\n return value;\n }\n /* c8 ignore stop */\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value);\n }\n }\n return undefined;\n}\n\n// Shared governance-missing (GH-236) + content-field presence/absence (GH-242)\n// selection-filter fields. Presence flags are plain booleans; absence uses\n// commander negation (`--no-notes` stores notes=false) except --empty-body\n// which is its own dest. The docs/files `--filter-*-missing` aliases mirror\n// `--no-*` while keeping the raw alias keys accounted for before passthrough.\n// Spread into normalizeListOptions and normalizeSearchOptions at the same\n// position so key order is preserved.\nfunction readSelectionFilterOptionFields(options: Record<string, unknown>): Record<string, true | undefined> {\n const filterFilesMissing = optionTrue(options, \"filterFilesMissing\");\n const filterDocsMissing = optionTrue(options, \"filterDocsMissing\");\n return {\n filterReviewerMissing: optionTrue(options, \"filterReviewerMissing\"),\n filterRiskMissing: optionTrue(options, \"filterRiskMissing\"),\n filterConfidenceMissing: optionTrue(options, \"filterConfidenceMissing\"),\n filterSprintMissing: optionTrue(options, \"filterSprintMissing\"),\n filterReleaseMissing: optionTrue(options, \"filterReleaseMissing\"),\n hasNotes: optionTrue(options, \"hasNotes\"),\n hasLearnings: optionTrue(options, \"hasLearnings\"),\n hasFiles: optionTrue(options, \"hasFiles\"),\n hasDocs: optionTrue(options, \"hasDocs\"),\n hasTests: optionTrue(options, \"hasTests\"),\n hasComments: optionTrue(options, \"hasComments\"),\n hasDeps: optionTrue(options, \"hasDeps\"),\n hasBody: optionTrue(options, \"hasBody\"),\n hasLinkedCommand: optionTrue(options, \"hasLinkedCommand\"),\n noNotes: optionFalse(options, \"notes\"),\n noLearnings: optionFalse(options, \"learnings\"),\n noFiles: optionFalse(options, \"files\") ?? filterFilesMissing,\n filterFilesMissing,\n noDocs: optionFalse(options, \"docs\") ?? filterDocsMissing,\n filterDocsMissing,\n noTests: optionFalse(options, \"tests\"),\n noComments: optionFalse(options, \"comments\"),\n noDeps: optionFalse(options, \"deps\"),\n emptyBody: optionTrue(options, \"emptyBody\"),\n noLinkedCommand: optionFalse(options, \"linkedCommand\"),\n };\n}\n\n/**\n * Implements normalize list options for the public runtime surface of this module.\n */\nexport function normalizeListOptions(options: Record<string, unknown>): ListOptions {\n const normalized: Record<string, unknown> = {\n status: readListOptionString(options, \"status\"),\n type: readListOptionString(options, \"type\"),\n tag: readListOptionString(options, \"tag\"),\n priority: readListOptionString(options, \"priority\"),\n deadlineBefore: readListOptionString(options, \"deadlineBefore\"),\n deadlineAfter: readListOptionString(options, \"deadlineAfter\"),\n updatedAfter: readListOptionString(options, \"updatedAfter\"),\n updatedBefore: readListOptionString(options, \"updatedBefore\"),\n createdAfter: readListOptionString(options, \"createdAfter\"),\n createdBefore: readListOptionString(options, \"createdBefore\"),\n today: optionTrue(options, \"today\"),\n recent: optionTrue(options, \"recent\"),\n ids: readListOptionString(options, \"ids\"),\n assignee: readListOptionString(options, \"assignee\"),\n assigneeFilter: readListOptionString(options, \"assigneeFilter\"),\n parent: readListOptionString(options, \"parent\"),\n sprint: readListOptionString(options, \"sprint\"),\n release: readListOptionString(options, \"release\"),\n limit: readListOptionString(options, \"limit\"),\n offset: readListOptionString(options, \"offset\"),\n // Commander stores --no-truncate as truncate=false; --all is the positive alias.\n noTruncate: optionFalse(options, \"truncate\") ?? optionTrue(options, \"all\"),\n includeBody: optionTrue(options, \"includeBody\"),\n compact: optionTrue(options, \"compact\"),\n brief: optionTrue(options, \"brief\"),\n full: optionTrue(options, \"full\"),\n fields: readListOptionString(options, \"fields\"),\n sort: readListOptionString(options, \"sort\"),\n order: readListOptionString(options, \"order\"),\n tree: optionTrue(options, \"tree\"),\n treeDepth: readListOptionString(options, \"treeDepth\"),\n filterAcMissing: optionTrue(options, \"filterAcMissing\"),\n filterEstimatesMissing: anyOptionTrue(options, [\"filterEstimatesMissing\", \"filterEstimateMissing\"]),\n filterResolutionMissing: optionTrue(options, \"filterResolutionMissing\"),\n filterMetadataMissing: optionTrue(options, \"filterMetadataMissing\"),\n // Governance-missing (GH-236) + content presence/absence (GH-242) filters.\n ...readSelectionFilterOptionFields(options),\n }\n copyUnknownOptions(normalized, options);\n return normalized as ListOptions;\n}\n\n/**\n * Implements normalize aggregate options for the public runtime surface of this module.\n */\nexport function normalizeAggregateOptions(options: Record<string, unknown>): AggregateOptions {\n return {\n groupBy: typeof options.groupBy === \"string\" ? options.groupBy : undefined,\n count: options.count === true ? true : undefined,\n completion: options.completion === true ? true : undefined,\n sum: typeof options.sum === \"string\" ? options.sum : undefined,\n avg: typeof options.avg === \"string\" ? options.avg : undefined,\n includeUnparented: options.includeUnparented === true || options.include_unparented === true,\n status: typeof options.status === \"string\" ? options.status : undefined,\n type: readListOptionString(options, \"type\"),\n tag: readListOptionString(options, \"tag\"),\n priority: readListOptionString(options, \"priority\"),\n deadlineBefore: readListOptionString(options, \"deadlineBefore\"),\n deadlineAfter: readListOptionString(options, \"deadlineAfter\"),\n assignee: readListOptionString(options, \"assignee\"),\n assigneeFilter: readListOptionString(options, \"assigneeFilter\"),\n parent: readListOptionString(options, \"parent\"),\n sprint: readListOptionString(options, \"sprint\"),\n release: readListOptionString(options, \"release\"),\n };\n}\n\ntype ListCommandResult = Awaited<ReturnType<typeof runList>>;\n\n/**\n * Implements print list json stream for the public runtime surface of this module.\n */\nexport function printListJsonStream(commandName: string, result: ListCommandResult, globalOptions: GlobalOptions): void {\n setActiveCommandResult(result);\n if (globalOptions.quiet) {\n return;\n }\n const warnings = Array.isArray(result.warnings) ? result.warnings : [];\n const metaPayload: Record<string, unknown> = {\n type: \"meta\",\n command: commandName,\n count: result.count,\n now: result.now,\n filters: result.filters,\n };\n if (warnings.length > 0) {\n metaPayload.warnings = warnings;\n }\n if (!writeStdout(`${JSON.stringify(metaPayload)}\\n`)) {\n return;\n }\n for (const item of result.items) {\n if (!writeStdout(`${JSON.stringify({ type: \"item\", command: commandName, item })}\\n`)) {\n return;\n }\n }\n writeStdout(`${JSON.stringify({ type: \"end\", command: commandName, count: result.count })}\\n`);\n}\n\ntype ActivityCommandResult = Awaited<ReturnType<typeof runActivity>>;\n\n/**\n * Implements print activity json stream for the public runtime surface of this module.\n */\nexport function printActivityJsonStream(\n result: ActivityCommandResult,\n options: {\n id?: string;\n op?: string;\n author?: string;\n from?: string;\n to?: string;\n limit?: string;\n },\n globalOptions: GlobalOptions,\n): void {\n setActiveCommandResult(result);\n if (globalOptions.quiet) {\n return;\n }\n const metaPayload = {\n type: \"meta\",\n command: \"activity\",\n count: result.count,\n filters: {\n id: options.id ?? null,\n op: options.op ?? null,\n author: options.author ?? null,\n from: options.from ?? null,\n to: options.to ?? null,\n limit: options.limit ?? null,\n },\n };\n if (!writeStdout(`${JSON.stringify(metaPayload)}\\n`)) {\n return;\n }\n const entries = result.compact && result.compact_activity ? result.compact_activity : result.activity;\n for (const entry of entries) {\n if (!writeStdout(`${JSON.stringify({ type: \"entry\", command: \"activity\", entry })}\\n`)) {\n return;\n }\n }\n writeStdout(`${JSON.stringify({ type: \"end\", command: \"activity\", count: result.count })}\\n`);\n}\n\n/**\n * Implements normalize search options for the public runtime surface of this module.\n */\nexport function normalizeSearchOptions(options: Record<string, unknown>): Record<string, unknown> {\n const readSearchString = (target: string): string | undefined =>\n readFirstStringFromCommanderOptions(\n options,\n resolveCommanderContract(SEARCH_COMMANDER_STRING_OPTION_CONTRACTS, target),\n );\n const readSearchStringOrNumber = (target: string): string | number | undefined => {\n const candidate = readFirstValueFromCommanderOptions(\n options,\n resolveCommanderContract(SEARCH_COMMANDER_STRING_OPTION_CONTRACTS, target),\n );\n if (typeof candidate === \"string\") {\n return candidate;\n }\n if (typeof candidate === \"number\" && Number.isFinite(candidate)) {\n return candidate;\n }\n return undefined;\n };\n const fields = readSearchString(\"fields\");\n const compactRequested = options.compact === true;\n const fullRequested = options.full === true;\n const defaultCompact = !compactRequested && !fullRequested && fields === undefined;\n const mode = options.semantic === true ? \"semantic\"\n : options.hybrid === true ? \"hybrid\"\n : readSearchString(\"mode\");\n const normalized: Record<string, unknown> = {\n mode,\n matchMode: readSearchString(\"matchMode\"),\n minScore: readSearchStringOrNumber(\"minScore\"),\n count: optionTrue(options, \"count\"),\n semanticWeight: readSearchStringOrNumber(\"semanticWeight\"),\n includeLinked: optionTrue(options, \"includeLinked\"),\n titleExact: optionTrue(options, \"titleExact\"),\n phraseExact: optionTrue(options, \"phraseExact\"),\n highlight: optionTrue(options, \"highlight\"),\n status: readSearchString(\"status\"),\n type: readSearchString(\"type\"),\n tag: readSearchString(\"tag\"),\n priority: readSearchString(\"priority\"),\n deadlineBefore: readSearchString(\"deadlineBefore\"),\n deadlineAfter: readSearchString(\"deadlineAfter\"),\n updatedAfter: readSearchString(\"updatedAfter\"),\n updatedBefore: readSearchString(\"updatedBefore\"),\n createdAfter: readSearchString(\"createdAfter\"),\n createdBefore: readSearchString(\"createdBefore\"),\n assignee: readSearchString(\"assignee\"),\n sprint: readSearchString(\"sprint\"),\n release: readSearchString(\"release\"),\n parent: readSearchString(\"parent\"),\n limit: readSearchString(\"limit\"),\n fields,\n compact: compactRequested || defaultCompact ? true : undefined,\n full: optionTrue(options, \"full\"),\n // Governance-missing (GH-236) + content presence/absence (GH-242) filters,\n // mirroring normalizeListOptions via the shared field slice.\n ...readSelectionFilterOptionFields(options),\n }\n copyUnknownOptions(normalized, options);\n return normalized;\n}\n\n/**\n * Implements normalize search keywords input for the public runtime surface of this module.\n */\nexport function normalizeSearchKeywordsInput(keywords: string[]): string {\n const query = keywords\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0)\n .join(\" \");\n if (query.length === 0) {\n throw new PmCliError(\"Search query must not be empty\", EXIT_CODE.USAGE);\n }\n return query;\n}\n\n\n/**\n * Implements normalize activity options for the public runtime surface of this module.\n */\nexport function normalizeActivityOptions(options: Record<string, unknown>): {\n id?: string;\n op?: string;\n author?: string;\n from?: string;\n to?: string;\n limit?: string;\n compact?: boolean;\n} {\n const readActivityString = (target: string): string | undefined =>\n readFirstStringFromCommanderOptions(\n options,\n resolveCommanderContract(ACTIVITY_COMMANDER_STRING_OPTION_CONTRACTS, target),\n );\n return {\n id: readActivityString(\"id\"),\n op: readActivityString(\"op\"),\n author: readActivityString(\"author\"),\n from: readActivityString(\"from\"),\n to: readActivityString(\"to\"),\n limit: readActivityString(\"limit\"),\n compact: options.full === true ? false : options.compact === false ? false : true,\n };\n}\n\nconst ACTIVITY_STREAM_ENABLED_VALUES = new Set([\"\", \"rows\", \"ndjson\", \"jsonl\", \"true\", \"1\", \"yes\", \"on\"]);\nconst ACTIVITY_STREAM_DISABLED_VALUES = new Set([\"false\", \"off\", \"none\", \"0\"]);\n\n/**\n * Implements resolve activity stream mode for the public runtime surface of this module.\n */\nexport function resolveActivityStreamMode(raw: unknown): boolean {\n if (raw === true) {\n return true;\n }\n if (raw === false || raw === undefined || raw === null) {\n return false;\n }\n if (typeof raw === \"string\") {\n const normalized = raw.trim().toLowerCase();\n if (ACTIVITY_STREAM_ENABLED_VALUES.has(normalized)) {\n return true;\n }\n if (ACTIVITY_STREAM_DISABLED_VALUES.has(normalized)) {\n return false;\n }\n }\n throw new PmCliError(\"Activity --stream accepts rows|ndjson|jsonl (or no value)\", EXIT_CODE.USAGE);\n}\n\n/**\n * Implements normalize context options for the public runtime surface of this module.\n */\nexport function normalizeContextOptions(options: Record<string, unknown>): ContextOptions {\n const readContextString = (target: string): string | undefined =>\n readFirstStringFromCommanderOptions(\n options,\n resolveCommanderContract(CONTEXT_COMMANDER_STRING_OPTION_CONTRACTS, target),\n );\n const sectionRaw = options.section;\n const section: string[] | undefined = Array.isArray(sectionRaw)\n ? (sectionRaw as string[]).filter((v) => typeof v === \"string\" && v.trim().length > 0)\n : typeof sectionRaw === \"string\" && sectionRaw.trim().length > 0\n ? [sectionRaw]\n : undefined;\n const normalized: Record<string, unknown> = {\n date: readContextString(\"date\"),\n from: readContextString(\"from\"),\n to: readContextString(\"to\"),\n past: options.past === true ? true : undefined,\n type: readContextString(\"type\"),\n tag: readContextString(\"tag\"),\n priority: readContextString(\"priority\"),\n assignee: readContextString(\"assignee\"),\n assigneeFilter: readContextString(\"assigneeFilter\"),\n sprint: readContextString(\"sprint\"),\n release: readContextString(\"release\"),\n parent: readContextString(\"parent\"),\n limit: readContextString(\"limit\"),\n format: readContextString(\"format\"),\n depth: readContextString(\"depth\"),\n fields: readContextString(\"fields\"),\n section: section && section.length > 0 ? section : undefined,\n activityLimit: readContextString(\"activityLimit\"),\n staleThreshold: readContextString(\"staleThreshold\"),\n };\n for (const [key, value] of Object.entries(options)) {\n if (Object.hasOwn(normalized, key)) {\n continue;\n }\n normalized[key] = value;\n }\n return normalized as ContextOptions;\n}\n\n/**\n * Normalizes raw commander options for `pm next` into a typed {@link NextOptions}\n * payload, resolving snake_case flag aliases (e.g. `--assignee_filter`,\n * `--blocked_limit`, `--ready_only`) to their canonical camelCase keys and folding\n * the boolean `--ready-only` switch. Unknown keys are passed through untouched so\n * downstream filtering still sees them.\n */\nexport function normalizeNextOptions(options: Record<string, unknown>): NextOptions {\n const readNextString = (target: string): string | undefined =>\n readFirstStringFromCommanderOptions(\n options,\n resolveCommanderContract(NEXT_COMMANDER_STRING_OPTION_CONTRACTS, target),\n );\n const normalized: Record<string, unknown> = {\n type: readNextString(\"type\"),\n tag: readNextString(\"tag\"),\n priority: readNextString(\"priority\"),\n assignee: readNextString(\"assignee\"),\n assigneeFilter: readNextString(\"assigneeFilter\"),\n sprint: readNextString(\"sprint\"),\n release: readNextString(\"release\"),\n parent: readNextString(\"parent\"),\n limit: readNextString(\"limit\"),\n blockedLimit: readNextString(\"blockedLimit\"),\n readyOnly: options.readyOnly === true || options.ready_only === true ? true : undefined,\n format: readNextString(\"format\"),\n };\n for (const [key, value] of Object.entries(options)) {\n if (Object.hasOwn(normalized, key)) {\n continue;\n }\n normalized[key] = value;\n }\n return normalized as NextOptions;\n}\n\nfunction collectMutationItemIds(result: unknown): string[] {\n if (!result || typeof result !== \"object\") {\n return [];\n }\n const record = result as Record<string, unknown>;\n const ids = new Set<string>();\n const pushId = (value: unknown): void => {\n if (typeof value !== \"string\") {\n return;\n }\n const normalized = value.trim();\n if (normalized.length === 0) {\n return;\n }\n ids.add(normalized);\n };\n\n pushId(record.id);\n\n const item = record.item;\n if (item && typeof item === \"object\") {\n pushId((item as { id?: unknown }).id);\n }\n\n const explicitIds = record.ids;\n if (Array.isArray(explicitIds)) {\n for (const candidate of explicitIds) {\n pushId(candidate);\n }\n }\n\n const items = record.items;\n if (Array.isArray(items)) {\n for (const candidate of items) {\n if (!candidate || typeof candidate !== \"object\") {\n continue;\n }\n pushId((candidate as { id?: unknown }).id);\n }\n }\n\n return [...ids].sort((left, right) => left.localeCompare(right));\n}\n\n/**\n * Implements invalidate search caches for mutation for the public runtime surface of this module.\n */\nexport async function invalidateSearchCachesForMutation(globalOptions: GlobalOptions, result?: unknown): Promise<void> {\n const pmRoot = resolvePmRoot(process.cwd(), globalOptions.path);\n const refreshResult = await refreshSearchArtifactsForMutation(pmRoot, collectMutationItemIds(result), {\n background: !shouldRunSearchRefreshInForeground(),\n });\n if (globalOptions.profile && refreshResult.warnings.length > 0) {\n printError(`profile:search_refresh_warnings=${formatHookWarnings(refreshResult.warnings)}`);\n }\n}\n\nexport const _testOnly = {\n collectMutationItemIds,\n};\n", "/**\n * @module core/search/cache\n *\n * Powers search, embeddings, and semantic retrieval behavior for Cache.\n */\nimport path from \"node:path\";\nimport { getActiveExtensionRegistrations } from \"../extensions/index.js\";\nimport { pathExists, readFileIfExists, removeFileIfExists, writeFileAtomic } from \"../fs/fs-utils.js\";\nimport { resolveItemTypeRegistry } from \"../item/type-registry.js\";\nimport { toErrorMessage } from \"../shared/primitives.js\";\nimport { locateItem, readLocatedItem } from \"../store/item-store.js\";\nimport { getSettingsPath } from \"../store/paths.js\";\nimport { readSettings } from \"../store/settings.js\";\nimport { executeEmbeddingBatchesWithRetry } from \"./embedding-batches.js\";\nimport {\n buildSemanticCorpusInput,\n resolveSearchCorpusFields,\n resolveSemanticCorpusCharacterLimit,\n} from \"./corpus.js\";\nimport { resolveEmbeddingProviders } from \"./providers.js\";\nimport type { EmbeddingProviderConfig } from \"./providers.js\";\nimport { resolveSettingsWithSemanticRuntimeDefaults } from \"./semantic-defaults.js\";\nimport { scheduleBackgroundSemanticRefresh } from \"./background-refresh.js\";\nimport { executeVectorDelete, executeVectorReset, executeVectorUpsert, resolveVectorStores } from \"./vector-stores.js\";\nimport type { VectorStoreConfig } from \"./vector-stores.js\";\nimport {\n buildVectorizationEmbeddingIdentity,\n buildVectorizationEmbeddingMetadata,\n hasVectorizationEmbeddingIdentityChanged,\n hasVectorizationVectorDimensionChanged,\n inferConsistentVectorDimension,\n normalizeVectorizationEmbeddingMetadata,\n} from \"./vectorization-metadata.js\";\nimport type {\n VectorizationEmbeddingIdentity,\n VectorizationEmbeddingMetadata,\n} from \"./vectorization-metadata.js\";\nimport { nowIso } from \"../shared/time.js\";\nimport type { ItemDocument, ItemFrontMatter } from \"../../types/index.js\";\n\nexport const SEARCH_CACHE_ARTIFACT_PATHS = [\"index/manifest.json\", \"search/embeddings.jsonl\"] as const;\nexport const VECTORIZATION_STATUS_LEDGER_PATH = \"search/vectorization-status.json\";\n\n/**\n * Documents the search cache invalidation result payload exchanged by command, SDK, and package integrations.\n */\nexport interface SearchCacheInvalidationResult {\n invalidated: string[];\n warnings: string[];\n}\n\n/**\n * Documents the semantic mutation refresh result payload exchanged by command, SDK, and package integrations.\n */\nexport interface SemanticMutationRefreshResult {\n refreshed: string[];\n skipped: string[];\n warnings: string[];\n}\n\n/**\n * Documents the search mutation artifact refresh result payload exchanged by command, SDK, and package integrations.\n */\nexport interface SearchMutationArtifactRefreshResult extends SearchCacheInvalidationResult {\n refreshed: string[];\n skipped: string[];\n /** True when the semantic refresh was dispatched to a detached background worker. */\n scheduled?: boolean;\n}\n\n/**\n * Documents the refresh search artifacts for mutation options payload exchanged by command, SDK, and package integrations.\n */\nexport interface RefreshSearchArtifactsForMutationOptions {\n /**\n * When true and semantic search is active, the (slow) embedding refresh is\n * dispatched to a detached background worker instead of awaited inline so the\n * mutation returns immediately. The synchronous keyword-cache invalidation\n * still runs first. Callers pass this only outside test runners.\n */\n background?: boolean;\n}\n\n/**\n * Documents the semantic refresh options payload exchanged by command, SDK, and package integrations.\n */\nexport interface SemanticRefreshOptions {\n settings?: Awaited<ReturnType<typeof readSettings>>;\n apply_runtime_defaults?: boolean;\n}\n\n/**\n * Documents the vectorization status ledger read result payload exchanged by command, SDK, and package integrations.\n */\nexport interface VectorizationStatusLedgerReadResult {\n entries: Record<string, string>;\n embedding: VectorizationEmbeddingMetadata | null;\n warnings: string[];\n}\n\nfunction formatInvalidationWarning(relativePath: string, error: unknown): string {\n return `search_cache_invalidation_failed:${relativePath}:${String(error)}`;\n}\n\n\nfunction toUniqueSorted(values: Iterable<string>): string[] {\n return [...new Set([...values].map((value) => value.trim()).filter((value) => value.length > 0))]\n .sort((left, right) => left.localeCompare(right));\n}\n\nfunction isValidUpdatedAt(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0 && Number.isFinite(Date.parse(value));\n}\n\nfunction normalizeVectorizationLedgerEntries(entries: Record<string, string>): Record<string, string> {\n const normalized = new Map<string, string>();\n for (const [rawId, rawUpdatedAt] of Object.entries(entries)) {\n const id = rawId.trim();\n if (id.length === 0 || !isValidUpdatedAt(rawUpdatedAt)) {\n continue;\n }\n normalized.set(id, rawUpdatedAt);\n }\n return Object.fromEntries([...normalized.entries()].sort((left, right) => left[0].localeCompare(right[0])));\n}\n\n/**\n * Implements read vectorization status ledger for the public runtime surface of this module.\n */\nexport async function readVectorizationStatusLedger(pmRoot: string): Promise<VectorizationStatusLedgerReadResult> {\n const ledgerPath = path.join(pmRoot, VECTORIZATION_STATUS_LEDGER_PATH);\n const raw = await readFileIfExists(ledgerPath);\n if (raw === null || raw.trim().length === 0) {\n return {\n entries: {},\n embedding: null,\n warnings: [],\n };\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw) as unknown;\n } catch {\n return {\n entries: {},\n embedding: null,\n warnings: [\"search_vectorization_status_ledger_invalid\"],\n };\n }\n\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n (parsed as { version?: unknown }).version !== 1 ||\n !Array.isArray((parsed as { items?: unknown }).items)\n ) {\n return {\n entries: {},\n embedding: null,\n warnings: [\"search_vectorization_status_ledger_invalid\"],\n };\n }\n\n const mapped = new Map<string, string>();\n for (const entry of (parsed as { items: unknown[] }).items) {\n if (typeof entry !== \"object\" || entry === null) {\n return {\n entries: {},\n embedding: null,\n warnings: [\"search_vectorization_status_ledger_invalid\"],\n };\n }\n const id = (entry as { id?: unknown }).id;\n const updatedAt = (entry as { updated_at?: unknown }).updated_at;\n if (typeof id !== \"string\" || id.trim().length === 0 || !isValidUpdatedAt(updatedAt)) {\n return {\n entries: {},\n embedding: null,\n warnings: [\"search_vectorization_status_ledger_invalid\"],\n };\n }\n mapped.set(id.trim(), updatedAt);\n }\n\n let embedding: VectorizationEmbeddingMetadata | null = null;\n try {\n embedding = normalizeVectorizationEmbeddingMetadata((parsed as { embedding?: unknown }).embedding);\n } catch {\n return {\n entries: {},\n embedding: null,\n warnings: [\"search_vectorization_status_ledger_invalid\"],\n };\n }\n\n return {\n entries: Object.fromEntries([...mapped.entries()].sort((left, right) => left[0].localeCompare(right[0]))),\n embedding,\n warnings: [],\n };\n}\n\n/**\n * Implements write vectorization status ledger for the public runtime surface of this module.\n */\nexport async function writeVectorizationStatusLedger(\n pmRoot: string,\n entries: Record<string, string>,\n embedding?: VectorizationEmbeddingMetadata | null,\n): Promise<void> {\n const normalizedEntries = normalizeVectorizationLedgerEntries(entries);\n const ledgerPath = path.join(pmRoot, VECTORIZATION_STATUS_LEDGER_PATH);\n const serialized = `${JSON.stringify(\n {\n version: 1,\n generated_at: nowIso(),\n ...(embedding ? { embedding } : {}),\n items: Object.entries(normalizedEntries).map(([id, updated_at]) => ({\n id,\n updated_at,\n })),\n },\n null,\n 2,\n )}\\n`;\n await writeFileAtomic(ledgerPath, serialized);\n}\n\nfunction buildVectorPayload(item: ItemFrontMatter): Record<string, unknown> {\n return {\n id: item.id,\n type: item.type,\n status: item.status,\n priority: item.priority,\n updated_at: item.updated_at,\n };\n}\n\ninterface SemanticRefreshRuntimeContext {\n settings: Awaited<ReturnType<typeof readSettings>>;\n provider: EmbeddingProviderConfig;\n vectorStore: VectorStoreConfig;\n}\n\ninterface SemanticRefreshWorkload {\n documents: Array<{ id: string; document: ItemDocument }>;\n missingIds: string[];\n skippedIds: string[];\n warnings: string[];\n}\n\ninterface SemanticRefreshOperationResult {\n refreshed: string[];\n skipped: string[];\n warnings: string[];\n}\n\ninterface SemanticEmbeddingOperationResult {\n vectors: number[][];\n vector_dimension: number;\n warnings: string[];\n}\n\nfunction buildVectorizationIdentityForProvider(provider: EmbeddingProviderConfig): VectorizationEmbeddingIdentity {\n const identity = buildVectorizationEmbeddingIdentity(provider.name, provider.model);\n if (!identity) {\n throw new Error(\"Embedding provider must include a provider name and model\");\n }\n return identity;\n}\n\nfunction buildSkippedSemanticRefreshResult(itemIds: string[], warning: string): SemanticMutationRefreshResult {\n return {\n refreshed: [],\n skipped: itemIds,\n warnings: [warning],\n };\n}\n\nasync function resolveSemanticRefreshRuntimeContext(\n pmRoot: string,\n normalizedItemIds: string[],\n options: SemanticRefreshOptions,\n): Promise<SemanticRefreshRuntimeContext | SemanticMutationRefreshResult> {\n if (!options.settings && !(await pathExists(getSettingsPath(pmRoot)))) {\n return buildSkippedSemanticRefreshResult(normalizedItemIds, \"search_semantic_refresh_skipped:settings_not_initialized\");\n }\n\n let settings: Awaited<ReturnType<typeof readSettings>>;\n try {\n settings = options.settings ?? (await readSettings(pmRoot));\n } catch (error: unknown) {\n return buildSkippedSemanticRefreshResult(\n normalizedItemIds,\n `search_semantic_refresh_skipped:settings_read_failed:${toErrorMessage(error)}`,\n );\n }\n const effectiveSettings = options.apply_runtime_defaults\n ? resolveSettingsWithSemanticRuntimeDefaults(settings).settings\n : settings;\n\n const provider = resolveEmbeddingProviders(effectiveSettings).active;\n if (!provider) {\n return buildSkippedSemanticRefreshResult(normalizedItemIds, \"search_semantic_refresh_skipped:provider_unconfigured\");\n }\n const vectorStore = resolveVectorStores(effectiveSettings, pmRoot).active;\n if (!vectorStore) {\n return buildSkippedSemanticRefreshResult(normalizedItemIds, \"search_semantic_refresh_skipped:vector_store_unconfigured\");\n }\n\n return {\n settings: effectiveSettings,\n provider,\n vectorStore,\n };\n}\n\nasync function collectSemanticRefreshWorkload(\n pmRoot: string,\n idPrefix: string,\n preferredFormat: \"toon\" | \"json_markdown\",\n normalizedItemIds: string[],\n typeToFolder: Record<string, string>,\n schema: Awaited<ReturnType<typeof readSettings>>[\"schema\"],\n): Promise<SemanticRefreshWorkload> {\n const warnings: string[] = [];\n const skipped = new Set<string>();\n const missing = new Set<string>();\n const documents: Array<{ id: string; document: ItemDocument }> = [];\n\n for (const itemId of normalizedItemIds) {\n const located = await locateItem(pmRoot, itemId, idPrefix, preferredFormat, typeToFolder);\n if (!located) {\n missing.add(itemId);\n continue;\n }\n\n try {\n const loaded = await readLocatedItem(located, { schema });\n documents.push({\n id: loaded.document.metadata.id,\n document: loaded.document,\n });\n } catch (error: unknown) {\n skipped.add(located.id);\n warnings.push(`search_semantic_refresh_item_read_failed:${located.id}:${toErrorMessage(error)}`);\n }\n }\n\n documents.sort((left, right) => left.id.localeCompare(right.id));\n return {\n documents,\n missingIds: toUniqueSorted(missing),\n skippedIds: toUniqueSorted(skipped),\n warnings,\n };\n}\n\nasync function embedLocatedSemanticVectors(\n settings: Awaited<ReturnType<typeof readSettings>>,\n provider: EmbeddingProviderConfig,\n documents: Array<{ id: string; document: ItemDocument }>,\n): Promise<SemanticEmbeddingOperationResult> {\n const corpusCharacterLimit = resolveSemanticCorpusCharacterLimit(\n provider.name,\n settings.search.embedding_corpus_max_characters,\n ).maxCharacters;\n const corpusFields = resolveSearchCorpusFields(settings);\n const corpusInputs = documents.map((entry) =>\n buildSemanticCorpusInput(entry.document, {\n providerName: provider.name,\n maxCharacters: corpusCharacterLimit,\n fields: corpusFields,\n }),\n );\n const embeddingResult = await executeEmbeddingBatchesWithRetry(provider, settings, corpusInputs);\n return {\n vectors: embeddingResult.vectors,\n vector_dimension: inferConsistentVectorDimension(embeddingResult.vectors, \"Semantic refresh embedding\"),\n warnings: embeddingResult.warnings,\n };\n}\n\nasync function upsertLocatedSemanticVectors(\n vectorStore: VectorStoreConfig,\n documents: Array<{ id: string; document: ItemDocument }>,\n vectors: number[][],\n): Promise<SemanticRefreshOperationResult> {\n await executeVectorUpsert(\n vectorStore,\n documents.map((entry, index) => ({\n id: entry.id,\n vector: vectors[index],\n payload: buildVectorPayload(entry.document.metadata),\n })),\n );\n return {\n refreshed: documents.map((entry) => entry.id),\n skipped: [],\n warnings: [],\n };\n}\n\nasync function resetSemanticVectorStore(\n vectorStore: VectorStoreConfig,\n ledgerEntries: Record<string, string>,\n): Promise<SemanticRefreshOperationResult> {\n try {\n await executeVectorReset(vectorStore, Object.keys(ledgerEntries));\n return { refreshed: [], skipped: [], warnings: [] };\n } catch (error: unknown) {\n return {\n refreshed: [],\n skipped: [],\n warnings: [`search_semantic_refresh_reset_failed:${toErrorMessage(error)}`],\n };\n }\n}\n\nasync function pruneMissingSemanticVectors(\n vectorStore: VectorStoreConfig,\n missingIds: string[],\n): Promise<SemanticRefreshOperationResult> {\n if (missingIds.length === 0) {\n return { refreshed: [], skipped: [], warnings: [] };\n }\n try {\n await executeVectorDelete(vectorStore, missingIds);\n return {\n refreshed: [],\n skipped: [],\n warnings: [],\n };\n } catch (error: unknown) {\n return {\n refreshed: [],\n skipped: missingIds,\n warnings: [`search_semantic_refresh_delete_failed:${toErrorMessage(error)}`],\n };\n }\n}\n\n/**\n * Implements invalidate search cache artifacts for the public runtime surface of this module.\n */\nexport async function invalidateSearchCacheArtifacts(pmRoot: string): Promise<SearchCacheInvalidationResult> {\n const invalidated: string[] = [];\n const warnings: string[] = [];\n\n for (const relativePath of SEARCH_CACHE_ARTIFACT_PATHS) {\n const artifactPath = path.join(pmRoot, relativePath);\n try {\n if (!(await pathExists(artifactPath))) {\n continue;\n }\n await removeFileIfExists(artifactPath);\n invalidated.push(relativePath);\n } catch (error: unknown) {\n warnings.push(formatInvalidationWarning(relativePath, error));\n }\n }\n\n return {\n invalidated,\n warnings,\n };\n}\n\n/**\n * Implements refresh semantic embeddings for mutated items for the public runtime surface of this module.\n */\nexport async function refreshSemanticEmbeddingsForMutatedItems(\n pmRoot: string,\n itemIds: string[],\n options: SemanticRefreshOptions = {},\n): Promise<SemanticMutationRefreshResult> {\n const normalizedItemIds = toUniqueSorted(itemIds);\n if (normalizedItemIds.length === 0) {\n return {\n refreshed: [],\n skipped: [],\n warnings: [],\n };\n }\n\n const runtimeContext = await resolveSemanticRefreshRuntimeContext(pmRoot, normalizedItemIds, options);\n if (!(\"settings\" in runtimeContext)) {\n return runtimeContext;\n }\n const typeRegistry = resolveItemTypeRegistry(runtimeContext.settings, getActiveExtensionRegistrations());\n const workload = await collectSemanticRefreshWorkload(\n pmRoot,\n runtimeContext.settings.id_prefix,\n runtimeContext.settings.item_format,\n normalizedItemIds,\n typeRegistry.type_to_folder,\n runtimeContext.settings.schema,\n );\n const ledgerRead =\n workload.documents.length > 0 || workload.missingIds.length > 0\n ? await readVectorizationStatusLedger(pmRoot)\n : { entries: {}, embedding: null, warnings: [] };\n const embeddingIdentity = buildVectorizationIdentityForProvider(runtimeContext.provider);\n const nextLedgerBaseEntries = ledgerRead.entries;\n let refreshedResult: SemanticRefreshOperationResult = { refreshed: [], skipped: [], warnings: [] };\n let nextEmbeddingMetadata = ledgerRead.embedding;\n if (workload.documents.length > 0) {\n if (ledgerRead.embedding && hasVectorizationEmbeddingIdentityChanged(ledgerRead.embedding, embeddingIdentity)) {\n refreshedResult = {\n refreshed: [],\n skipped: workload.documents.map((entry) => entry.id),\n warnings: [\"search_semantic_refresh_requires_reindex:embedding_identity_changed\"],\n };\n } else {\n try {\n const embedded = await embedLocatedSemanticVectors(\n runtimeContext.settings,\n runtimeContext.provider,\n workload.documents,\n );\n if (hasVectorizationVectorDimensionChanged(ledgerRead.embedding, embedded.vector_dimension)) {\n refreshedResult = {\n refreshed: [],\n skipped: workload.documents.map((entry) => entry.id),\n warnings: [...embedded.warnings, \"search_semantic_refresh_requires_reindex:vector_dimension_changed\"],\n };\n } else {\n nextEmbeddingMetadata = buildVectorizationEmbeddingMetadata(embeddingIdentity, embedded.vector_dimension);\n const upserted = await upsertLocatedSemanticVectors(runtimeContext.vectorStore, workload.documents, embedded.vectors);\n refreshedResult = {\n refreshed: upserted.refreshed,\n skipped: upserted.skipped,\n warnings: [...embedded.warnings, ...upserted.warnings],\n };\n }\n } catch (error: unknown) {\n refreshedResult = {\n refreshed: [],\n skipped: workload.documents.map((entry) => entry.id),\n warnings: [`search_semantic_refresh_failed:${toErrorMessage(error)}`],\n };\n }\n }\n }\n const pruneResult = await pruneMissingSemanticVectors(runtimeContext.vectorStore, workload.missingIds);\n const refreshedIdSet = new Set(refreshedResult.refreshed);\n const refreshedEntries = Object.fromEntries(\n workload.documents\n .filter((entry) => refreshedIdSet.has(entry.id))\n .map((entry) => [entry.id, entry.document.metadata.updated_at]),\n );\n const ledgerWarnings: string[] = [];\n if (Object.keys(refreshedEntries).length > 0 || workload.missingIds.length > 0) {\n const nextEntries = {\n ...nextLedgerBaseEntries,\n ...normalizeVectorizationLedgerEntries(refreshedEntries),\n };\n for (const missingId of workload.missingIds) {\n delete nextEntries[missingId];\n }\n try {\n await writeVectorizationStatusLedger(pmRoot, nextEntries, nextEmbeddingMetadata);\n } catch (error: unknown) {\n ledgerWarnings.push(`search_vectorization_status_ledger_write_failed:${toErrorMessage(error)}`);\n }\n ledgerWarnings.push(...ledgerRead.warnings);\n }\n\n return {\n refreshed: toUniqueSorted([...refreshedResult.refreshed, ...pruneResult.refreshed]),\n skipped: toUniqueSorted([...workload.skippedIds, ...refreshedResult.skipped, ...pruneResult.skipped]),\n warnings: [...workload.warnings, ...refreshedResult.warnings, ...pruneResult.warnings, ...ledgerWarnings],\n };\n}\n\n/**\n * Returns true when a semantic embedding refresh would do real work for these\n * settings (an embedding provider AND a vector store both resolve). Used to\n * decide whether a mutation's refresh is worth dispatching to a background\n * worker — when semantic search is not configured the inline path is already a\n * fast no-op and no child is spawned.\n */\nexport function isSemanticRefreshActive(\n settings: Awaited<ReturnType<typeof readSettings>>,\n applyRuntimeDefaults: boolean,\n): boolean {\n const effectiveSettings = applyRuntimeDefaults\n ? resolveSettingsWithSemanticRuntimeDefaults(settings).settings\n : settings;\n return Boolean(resolveEmbeddingProviders(effectiveSettings).active && resolveVectorStores(effectiveSettings).active);\n}\n\n/**\n * Implements refresh search artifacts for mutation for the public runtime surface of this module.\n */\nexport async function refreshSearchArtifactsForMutation(\n pmRoot: string,\n itemIds: string[],\n options: RefreshSearchArtifactsForMutationOptions = {},\n): Promise<SearchMutationArtifactRefreshResult> {\n const invalidation = await invalidateSearchCacheArtifacts(pmRoot);\n const normalizedItemIds = toUniqueSorted(itemIds);\n if (normalizedItemIds.length === 0) {\n return {\n invalidated: invalidation.invalidated,\n refreshed: [],\n skipped: [],\n warnings: invalidation.warnings,\n };\n }\n\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n const semanticRefresh = await refreshSemanticEmbeddingsForMutatedItems(pmRoot, normalizedItemIds);\n return {\n invalidated: invalidation.invalidated,\n refreshed: semanticRefresh.refreshed,\n skipped: semanticRefresh.skipped,\n warnings: [...invalidation.warnings, ...semanticRefresh.warnings],\n };\n }\n\n let settings: Awaited<ReturnType<typeof readSettings>>;\n try {\n settings = await readSettings(pmRoot);\n } catch (error: unknown) {\n return {\n invalidated: invalidation.invalidated,\n refreshed: [],\n skipped: normalizedItemIds,\n warnings: [\n ...invalidation.warnings,\n `search_semantic_refresh_skipped:settings_read_failed:${toErrorMessage(error)}`,\n ],\n };\n }\n\n if (settings.search.mutation_refresh_policy === \"cache_only\") {\n return {\n invalidated: invalidation.invalidated,\n refreshed: [],\n skipped: normalizedItemIds,\n warnings: invalidation.warnings,\n };\n }\n\n const applyRuntimeDefaults = settings.search.mutation_refresh_policy === \"semantic_auto\";\n\n // Keyword cache is already invalidated synchronously above (so keyword search\n // stays immediately correct). When requested, dispatch the slow embedding\n // refresh to a detached worker so the mutation returns instantly; the\n // vector_index_stale health/search warning covers the catch-up window.\n if (options.background && isSemanticRefreshActive(settings, applyRuntimeDefaults)) {\n await scheduleBackgroundSemanticRefresh(pmRoot, normalizedItemIds);\n return {\n invalidated: invalidation.invalidated,\n refreshed: [],\n skipped: [],\n warnings: [...invalidation.warnings, \"search_semantic_refresh_scheduled_background\"],\n scheduled: true,\n };\n }\n\n const semanticRefresh = await refreshSemanticEmbeddingsForMutatedItems(pmRoot, normalizedItemIds, {\n settings,\n apply_runtime_defaults: applyRuntimeDefaults,\n });\n return {\n invalidated: invalidation.invalidated,\n refreshed: semanticRefresh.refreshed,\n skipped: semanticRefresh.skipped,\n warnings: [...invalidation.warnings, ...semanticRefresh.warnings],\n };\n}\n\nexport const _testOnly = {\n buildSkippedSemanticRefreshResult,\n buildVectorizationIdentityForProvider,\n normalizeVectorizationLedgerEntries,\n resetSemanticVectorStore,\n};\n", "/**\n * @module core/search/http-client\n *\n * Powers search, embeddings, and semantic retrieval behavior for Http Client.\n */\nimport { toErrorMessage } from \"../shared/primitives.js\";\n\nconst DEFAULT_SEARCH_HTTP_TIMEOUT_MS = 30_000;\n\n/**\n * Documents the search http response payload exchanged by command, SDK, and package integrations.\n */\nexport interface SearchHttpResponse {\n ok: boolean;\n status: number;\n statusText: string;\n json(): Promise<unknown>;\n text(): Promise<string>;\n}\n\n/**\n * Documents the search http request init payload exchanged by command, SDK, and package integrations.\n */\nexport interface SearchHttpRequestInit {\n method: \"DELETE\" | \"POST\" | \"PUT\";\n headers: Record<string, string>;\n body: string;\n signal: AbortSignal;\n}\n\n/**\n * Restricts search http fetcher values accepted by command, SDK, and storage contracts.\n */\nexport type SearchHttpFetcher<ResponseType extends SearchHttpResponse = SearchHttpResponse> = (\n url: string,\n init: SearchHttpRequestInit,\n) => Promise<ResponseType>;\n\n/**\n * Documents the execute search json request options payload exchanged by command, SDK, and package integrations.\n */\nexport interface ExecuteSearchJsonRequestOptions<ResponseType extends SearchHttpResponse = SearchHttpResponse> {\n endpoint: string;\n method: \"DELETE\" | \"POST\" | \"PUT\";\n headers: Record<string, string>;\n body: Record<string, unknown>;\n timeoutMs: number;\n fetcher: SearchHttpFetcher<ResponseType>;\n requestLabel: string;\n responseLabel: string;\n}\n\n/**\n * Implements normalize search http timeout ms for the public runtime surface of this module.\n */\nexport function normalizeSearchHttpTimeoutMs(\n timeoutMs: number | undefined,\n requestLabel: string,\n defaultTimeoutMs = DEFAULT_SEARCH_HTTP_TIMEOUT_MS,\n): number {\n const resolved = timeoutMs ?? defaultTimeoutMs;\n if (!Number.isFinite(resolved) || resolved <= 0) {\n throw new Error(`${requestLabel} timeout must be a positive finite number`);\n }\n return Math.floor(resolved);\n}\n\n/**\n * Implements resolve search http fetcher for the public runtime surface of this module.\n */\nexport function resolveSearchHttpFetcher<ResponseType extends SearchHttpResponse>(\n fetcher: SearchHttpFetcher<ResponseType> | undefined,\n requestLabel: string,\n): SearchHttpFetcher<ResponseType> {\n if (fetcher) {\n return fetcher;\n }\n if (typeof globalThis.fetch === \"function\") {\n return globalThis.fetch.bind(globalThis) as unknown as SearchHttpFetcher<ResponseType>;\n }\n throw new Error(`${requestLabel} execution requires a fetch implementation`);\n}\n\n/**\n * Implements read failed search http response body for the public runtime surface of this module.\n */\nexport async function readFailedSearchHttpResponseBody(response: SearchHttpResponse): Promise<string> {\n try {\n return (await response.text()).replaceAll(/\\s+/g, \" \").trim();\n } catch (error) {\n return `(failed to read response body: ${toErrorMessage(error)})`;\n }\n}\n\n/**\n * Implements execute search json request for the public runtime surface of this module.\n */\nexport async function executeSearchJsonRequest<ResponseType extends SearchHttpResponse>(\n options: ExecuteSearchJsonRequestOptions<ResponseType>,\n): Promise<unknown> {\n const controller = new AbortController();\n const timeoutHandle = setTimeout(() => {\n controller.abort();\n }, options.timeoutMs);\n\n try {\n let response: ResponseType;\n try {\n response = await options.fetcher(options.endpoint, {\n method: options.method,\n headers: options.headers,\n body: JSON.stringify(options.body),\n signal: controller.signal,\n });\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new Error(`${options.requestLabel} timed out after ${options.timeoutMs}ms`);\n }\n throw new Error(`${options.requestLabel} execution failed: ${toErrorMessage(error)}`);\n }\n\n if (!response.ok) {\n const responseBody = await readFailedSearchHttpResponseBody(response);\n const detail = responseBody.length > 0 ? `: ${responseBody}` : \"\";\n throw new Error(`${options.requestLabel} failed with status ${response.status} ${response.statusText}${detail}`);\n }\n\n try {\n return await response.json();\n } catch (error) {\n throw new Error(`${options.responseLabel} JSON parse failed: ${toErrorMessage(error)}`);\n }\n } finally {\n clearTimeout(timeoutHandle);\n }\n}\n", "/**\n * @module core/search/providers\n *\n * Powers search, embeddings, and semantic retrieval behavior for Providers.\n */\nimport type { PmSettings } from \"../../types/index.js\";\nimport {\n executeSearchJsonRequest,\n normalizeSearchHttpTimeoutMs,\n resolveSearchHttpFetcher,\n} from \"./http-client.js\";\nimport type { SearchHttpFetcher, SearchHttpResponse } from \"./http-client.js\";\nimport {\n isFiniteNumberArray,\n toNonEmptyString,\n trimTrailingSlashes,\n} from \"../shared/primitives.js\";\n\n/**\n * Restricts embedding provider name values accepted by command, SDK, and storage contracts.\n */\nexport type EmbeddingProviderName = \"openai\" | \"ollama\";\n\n/**\n * Documents the embedding provider config payload exchanged by command, SDK, and package integrations.\n */\nexport interface EmbeddingProviderConfig {\n name: EmbeddingProviderName;\n base_url: string;\n model: string;\n api_key?: string;\n}\n\n/**\n * Documents the embedding provider resolution payload exchanged by command, SDK, and package integrations.\n */\nexport interface EmbeddingProviderResolution {\n active: EmbeddingProviderConfig | null;\n available: EmbeddingProviderConfig[];\n}\n\n/**\n * GH-244: how an active search-provider / vector-store adapter came to be\n * resolved, so `pm health` can explain why a working runtime can coexist with\n * empty persisted `search.provider` / `vector_store.adapter` settings:\n * - \"configured\": the persisted setting names the active resolution.\n * - \"auto-detected\": runtime auto-detection selected it; the setting is empty.\n * - \"unconfigured\": nothing is active.\n */\nexport type ProviderConfigSource = \"configured\" | \"auto-detected\" | \"unconfigured\";\n\n/**\n * Classifies the resolution source for an active provider/adapter given the\n * persisted (possibly empty) configured value. Pure and adapter-agnostic so it\n * serves both the embedding provider and the vector-store adapter. \"configured\"\n * requires the persisted value to actually MATCH the active resolution\n * (case-insensitively): a configured-but-unhonored value (typo or unsupported\n * name that the runtime fell back from) is reported as \"auto-detected\", not\n * falsely \"configured\".\n */\nexport function resolveProviderConfigSource(\n activeName: string | null | undefined,\n configured: string | null | undefined,\n): ProviderConfigSource {\n const active = toNonEmptyString(activeName);\n if (!active) {\n return \"unconfigured\";\n }\n const configuredValue = toNonEmptyString(configured);\n return configuredValue && configuredValue.toLowerCase() === active.toLowerCase() ? \"configured\" : \"auto-detected\";\n}\n\n/**\n * Documents the embedding request target payload exchanged by command, SDK, and package integrations.\n */\nexport interface EmbeddingRequestTarget {\n provider: EmbeddingProviderName;\n endpoint: string;\n model: string;\n}\n\n/**\n * Documents the embedding request plan payload exchanged by command, SDK, and package integrations.\n */\nexport interface EmbeddingRequestPlan {\n target: EmbeddingRequestTarget;\n method: \"POST\";\n headers: Record<string, string>;\n body: Record<string, unknown>;\n}\n\n/**\n * Restricts embedding http response values accepted by command, SDK, and storage contracts.\n */\nexport type EmbeddingHttpResponse = SearchHttpResponse;\n\n/**\n * Restricts embedding request fetcher values accepted by command, SDK, and storage contracts.\n */\nexport type EmbeddingRequestFetcher = SearchHttpFetcher<EmbeddingHttpResponse>;\n\n/**\n * Documents the execute embedding request options payload exchanged by command, SDK, and package integrations.\n */\nexport interface ExecuteEmbeddingRequestOptions {\n timeout_ms?: number;\n fetcher?: EmbeddingRequestFetcher;\n}\n\ntype ProviderSettingsInput = {\n providers?: {\n openai?: {\n base_url?: string;\n api_key?: string;\n model?: string;\n };\n ollama?: {\n base_url?: string;\n model?: string;\n };\n };\n};\n\nfunction normalizeOpenAiEmbeddingsEndpoint(baseUrl: string): string {\n const normalizedBaseUrl = trimTrailingSlashes(baseUrl);\n const normalizedLower = normalizedBaseUrl.toLowerCase();\n if (normalizedLower.endsWith(\"/embeddings\")) {\n return normalizedBaseUrl;\n }\n if (normalizedLower.endsWith(\"/v1\")) {\n return `${normalizedBaseUrl}/embeddings`;\n }\n return `${normalizedBaseUrl}/v1/embeddings`;\n}\n\nfunction resolveSearchEmbeddingModelOverride(settings: ProviderSettingsInput): string | null {\n // `settings.search.embedding_model` is documented as overriding the\n // provider-specific model when set (see CONFIG_KEY_ALIASES for\n // `search_embedding_model` in src/core/config/nested-settings.ts). Each\n // provider resolver picks this up after its own model is read so the\n // override applies to whichever built-in is selected.\n const candidate = (settings as { search?: { embedding_model?: unknown } }).search?.embedding_model;\n return toNonEmptyString(candidate) || null;\n}\n\nfunction resolveOpenAiProvider(settings: ProviderSettingsInput): EmbeddingProviderConfig | null {\n const baseUrl = toNonEmptyString(settings.providers?.openai?.base_url);\n const model = toNonEmptyString(settings.providers?.openai?.model);\n if (!baseUrl || !model) {\n return null;\n }\n const override = resolveSearchEmbeddingModelOverride(settings);\n const apiKey = toNonEmptyString(settings.providers?.openai?.api_key);\n return {\n name: \"openai\",\n base_url: baseUrl,\n model: override ?? model,\n ...(apiKey ? { api_key: apiKey } : {}),\n };\n}\n\nfunction resolveOllamaProvider(settings: ProviderSettingsInput): EmbeddingProviderConfig | null {\n const baseUrl = toNonEmptyString(settings.providers?.ollama?.base_url);\n const model = toNonEmptyString(settings.providers?.ollama?.model);\n if (!baseUrl || !model) {\n return null;\n }\n const override = resolveSearchEmbeddingModelOverride(settings);\n return {\n name: \"ollama\",\n base_url: baseUrl,\n model: override ?? model,\n };\n}\n\nfunction normalizeEmbeddingInputs(input: string | string[]): string[] {\n const inputs = (Array.isArray(input) ? input : [input])\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0);\n if (inputs.length === 0) {\n throw new Error(\"Embedding input must include at least one non-empty string\");\n }\n return inputs;\n}\n\ninterface DedupedEmbeddingInputs {\n uniqueInputs: string[];\n originalToUniqueIndex: number[];\n}\n\nfunction dedupeEmbeddingInputs(inputs: string[]): DedupedEmbeddingInputs {\n const uniqueInputs: string[] = [];\n const originalToUniqueIndex: number[] = [];\n const uniqueIndexByInput = new Map<string, number>();\n for (const entry of inputs) {\n const existingUniqueIndex = uniqueIndexByInput.get(entry);\n if (existingUniqueIndex === undefined) {\n const nextUniqueIndex = uniqueInputs.length;\n uniqueInputs.push(entry);\n uniqueIndexByInput.set(entry, nextUniqueIndex);\n originalToUniqueIndex.push(nextUniqueIndex);\n continue;\n }\n originalToUniqueIndex.push(existingUniqueIndex);\n }\n return {\n uniqueInputs,\n originalToUniqueIndex,\n };\n}\n\ninterface OpenAiEmbeddingResponseEntry {\n embedding: unknown;\n index: unknown;\n position: number;\n}\n\nfunction buildOrderedOpenAiEntries(data: unknown[]): OpenAiEmbeddingResponseEntry[] {\n const openAiEntries = data.map((entry, position) => ({\n embedding: (entry as { embedding?: unknown }).embedding,\n index: (entry as { index?: unknown }).index,\n position,\n }));\n const hasExplicitIndex = openAiEntries.some((entry) => entry.index !== undefined);\n if (hasExplicitIndex) {\n for (const entry of openAiEntries) {\n if (!Number.isInteger(entry.index)) {\n throw new TypeError(`OpenAI embedding response entry at position ${entry.position} is missing a valid integer index`);\n }\n }\n return [...openAiEntries].sort((a, b) => {\n const byIndex = (a.index as number) - (b.index as number);\n if (byIndex !== 0) {\n return byIndex;\n }\n return a.position - b.position;\n });\n }\n return openAiEntries;\n}\n\n/**\n * Implements resolve embedding providers for the public runtime surface of this module.\n */\nexport function resolveEmbeddingProviders(settings: PmSettings | ProviderSettingsInput): EmbeddingProviderResolution {\n const openAi = resolveOpenAiProvider(settings);\n const ollama = resolveOllamaProvider(settings);\n const available = [openAi, ollama].filter((entry): entry is EmbeddingProviderConfig => entry !== null);\n // Honor `settings.search.provider` when set: if both built-in providers are\n // configured, the preferred name wins; otherwise fall back to the first\n // available entry (preserves the previous tie-break: openai > ollama).\n // Match case-insensitively so \"OpenAI\" / \"Ollama\" / \"OLLAMA\" all work.\n const preferredName = toNonEmptyString(\n (settings as { search?: { provider?: unknown } }).search?.provider,\n );\n const preferredKey = preferredName ? preferredName.toLowerCase() : null;\n const preferred = preferredKey\n ? available.find((entry) => entry.name === preferredKey)\n : undefined;\n return {\n active: preferred ?? available[0] ?? null,\n available,\n };\n}\n\n/**\n * Implements resolve embedding request target for the public runtime surface of this module.\n */\nexport function resolveEmbeddingRequestTarget(provider: EmbeddingProviderConfig): EmbeddingRequestTarget {\n const baseUrl = trimTrailingSlashes(provider.base_url);\n if (provider.name === \"openai\") {\n return {\n provider: \"openai\",\n endpoint: normalizeOpenAiEmbeddingsEndpoint(baseUrl),\n model: provider.model,\n };\n }\n return {\n provider: \"ollama\",\n endpoint: `${baseUrl}/api/embed`,\n model: provider.model,\n };\n}\n\n/**\n * Implements build embedding request plan for the public runtime surface of this module.\n */\nexport function buildEmbeddingRequestPlan(provider: EmbeddingProviderConfig, input: string | string[]): EmbeddingRequestPlan {\n const normalizedInputs = normalizeEmbeddingInputs(input);\n if (provider.name === \"openai\") {\n return {\n target: resolveEmbeddingRequestTarget(provider),\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(provider.api_key ? { authorization: `Bearer ${provider.api_key}` } : {}),\n },\n body: {\n model: provider.model,\n input: normalizedInputs.length === 1 ? normalizedInputs[0] : normalizedInputs,\n },\n };\n }\n return {\n target: resolveEmbeddingRequestTarget(provider),\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: {\n model: provider.model,\n input: normalizedInputs,\n },\n };\n}\n\n/**\n * Implements normalize embedding response for the public runtime surface of this module.\n */\nexport function normalizeEmbeddingResponse(provider: EmbeddingProviderConfig, response: unknown): number[][] {\n if (provider.name === \"openai\") {\n const data = (response as { data?: unknown }).data;\n if (!Array.isArray(data) || data.length === 0) {\n throw new Error(\"OpenAI embedding response must include a non-empty data array\");\n }\n const orderedEntries = buildOrderedOpenAiEntries(data);\n\n return orderedEntries.map((entry, index) => {\n const embedding = entry.embedding;\n if (!isFiniteNumberArray(embedding)) {\n throw new Error(`OpenAI embedding response entry at index ${index} is missing a numeric embedding vector`);\n }\n return [...embedding];\n });\n }\n\n const singleEmbedding = (response as { embedding?: unknown }).embedding;\n if (isFiniteNumberArray(singleEmbedding)) {\n return [[...singleEmbedding]];\n }\n\n const multipleEmbeddings = (response as { embeddings?: unknown }).embeddings;\n if (Array.isArray(multipleEmbeddings) && multipleEmbeddings.length > 0) {\n return multipleEmbeddings.map((entry, index) => {\n if (!isFiniteNumberArray(entry)) {\n throw new Error(`Ollama embedding response entry at index ${index} is missing a numeric embedding vector`);\n }\n return [...entry];\n });\n }\n\n throw new Error(\"Ollama embedding response must include embedding or embeddings vectors\");\n}\n\n/**\n * Implements execute embedding request for the public runtime surface of this module.\n */\nexport async function executeEmbeddingRequest(\n provider: EmbeddingProviderConfig,\n input: string | string[],\n options: ExecuteEmbeddingRequestOptions = {},\n): Promise<number[][]> {\n const timeoutMs = normalizeSearchHttpTimeoutMs(options.timeout_ms, \"Embedding request\");\n const fetcher = resolveSearchHttpFetcher(options.fetcher, \"Embedding request\");\n const normalizedInputs = normalizeEmbeddingInputs(input);\n const dedupedInputs = dedupeEmbeddingInputs(normalizedInputs);\n const requestPlan = buildEmbeddingRequestPlan(provider, dedupedInputs.uniqueInputs);\n const payload = await executeSearchJsonRequest({\n endpoint: requestPlan.target.endpoint,\n method: requestPlan.method,\n headers: requestPlan.headers,\n body: requestPlan.body,\n timeoutMs,\n fetcher,\n requestLabel: \"Embedding request\",\n responseLabel: \"Embedding response\",\n });\n const vectors = normalizeEmbeddingResponse(provider, payload);\n if (vectors.length !== dedupedInputs.uniqueInputs.length) {\n throw new Error(\n `Embedding response cardinality mismatch: expected ${dedupedInputs.uniqueInputs.length} vector(s), received ${vectors.length}`,\n );\n }\n return dedupedInputs.originalToUniqueIndex.map((uniqueIndex) => [...vectors[uniqueIndex]]);\n}\n", "/**\n * @module core/search/corpus\n *\n * Powers search, embeddings, and semantic retrieval behavior for Corpus.\n */\nimport type { ItemDocument, ItemMetadata, PmSettings } from \"../../types/index.js\";\nimport { coercePositiveInteger } from \"../shared/primitives.js\";\n\n/**\n * Canonical ordered list of corpus field names emitted by {@link buildSearchCorpus}.\n *\n * When `search.corpus_fields` is unset/empty the full set is included (backward\n * compatible). When configured, only the named fields are emitted — letting\n * teams opt structured signals in/out for token efficiency. Unknown names in the\n * configured list are ignored (they simply never match a builder).\n *\n * NOTE: `plan` is conditional — it is only emitted when the item has plan\n * content (see {@link buildPlanCorpus}); it is still part of the default set so\n * plan-bearing items keep their plan corpus.\n */\nexport const DEFAULT_SEARCH_CORPUS_FIELDS: readonly string[] = [\n \"title\",\n \"description\",\n \"tags\",\n \"status\",\n \"type\",\n \"priority\",\n \"assignee\",\n \"parent\",\n \"goal\",\n \"value\",\n \"why_now\",\n \"risk\",\n \"confidence\",\n \"estimated_minutes\",\n \"acceptance_criteria\",\n \"resolution\",\n \"expected_result\",\n \"actual_result\",\n \"body\",\n \"comments\",\n \"notes\",\n \"learnings\",\n \"reminders\",\n \"events\",\n \"dependencies\",\n \"plan\",\n] as const;\n\n/**\n * Resolve the effective corpus field list from settings.\n *\n * - unset / not an array / empty array → the full default set (backward compatible).\n * - non-empty array → exactly those names (string entries only; trimmed; empties dropped).\n */\nexport function resolveSearchCorpusFields(settings: Pick<PmSettings, \"search\"> | undefined): string[] {\n const configured = settings?.search?.corpus_fields;\n if (!Array.isArray(configured)) {\n return [...DEFAULT_SEARCH_CORPUS_FIELDS];\n }\n // The type guard is intentional: corpus_fields comes from user-editable\n // settings.json, so entries are not statically guaranteed to be strings.\n // De-duplicate and drop unknown names (they have no builder) so an invalid\n // config cannot produce duplicate or phantom corpus keys.\n const knownFields = new Set<string>(DEFAULT_SEARCH_CORPUS_FIELDS);\n const selected = Array.from(\n new Set(\n configured\n .filter((entry): entry is string => typeof entry === \"string\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0 && knownFields.has(entry)),\n ),\n );\n return selected.length > 0 ? selected : [...DEFAULT_SEARCH_CORPUS_FIELDS];\n}\n\nexport const DEFAULT_SEMANTIC_CORPUS_INPUT_MAX_CHARACTERS = 8_000;\nexport const OLLAMA_SEMANTIC_CORPUS_INPUT_MAX_CHARACTERS = 3_200;\nexport const SEMANTIC_CORPUS_TRUNCATION_SUFFIX = \"...[semantic corpus truncated]\";\nexport const SEARCH_EMBEDDING_CORPUS_MAX_CHARACTERS_INVALID_WARNING =\n \"search_embedding_corpus_max_characters_invalid:using_provider_default\";\n\nfunction compactParts(parts: Array<string | boolean | number | null | undefined>): string {\n return parts\n .map((part) => (part === undefined || part === null ? \"\" : String(part).trim()))\n .filter((part) => part.length > 0)\n .join(\" \");\n}\n\n/**\n * Implements build reminder corpus for the public runtime surface of this module.\n */\nexport function buildReminderCorpus(item: ItemMetadata): string[] {\n return (item.reminders ?? []).map((reminder) => compactParts([reminder.at, reminder.text]));\n}\n\n/**\n * Implements build event corpus for the public runtime surface of this module.\n */\nexport function buildEventCorpus(item: ItemMetadata): string[] {\n return (item.events ?? []).map((event) =>\n compactParts([\n event.start_at,\n event.end_at,\n event.title,\n event.description,\n event.location,\n event.all_day === true ? \"all day\" : undefined,\n event.timezone,\n event.recurrence?.freq,\n event.recurrence?.interval,\n event.recurrence?.count,\n event.recurrence?.until,\n event.recurrence?.by_weekday?.join(\" \"),\n event.recurrence?.by_month_day?.join(\" \"),\n event.recurrence?.exdates?.join(\" \"),\n ]),\n );\n}\n\n/**\n * Implements build plan flat corpus for the public runtime surface of this module.\n */\ntype PlanStepCorpusEntry = NonNullable<ItemMetadata[\"plan_steps\"]>[number];\n\nfunction appendPlanStepFlatCorpus(segments: Array<string | undefined>, step: PlanStepCorpusEntry): void {\n segments.push(step.title, step.body, step.status, step.owner, step.evidence, step.blocked_reason, step.superseded_by);\n for (const link of step.linked_items ?? []) {\n segments.push(`${link.kind} ${link.id}`, link.note);\n }\n for (const file of step.files ?? []) segments.push(file.path, file.note);\n for (const test of step.tests ?? []) segments.push(test.command, test.path, test.note);\n for (const doc of step.docs ?? []) segments.push(doc.path, doc.note);\n}\n\nfunction appendPlanMetadataFlatCorpus(segments: Array<string | undefined>, item: ItemMetadata): void {\n for (const decision of item.plan_decisions ?? []) {\n segments.push(decision.decision, decision.rationale, decision.evidence);\n }\n for (const discovery of item.plan_discoveries ?? []) {\n segments.push(discovery.text);\n }\n for (const check of item.plan_validation ?? []) {\n segments.push(check.text, check.command, check.expected);\n }\n}\n\n/**\n * Implements build plan flat corpus for the public runtime surface of this module.\n */\nexport function buildPlanFlatCorpus(item: ItemMetadata): string {\n const segments: Array<string | undefined> = [];\n segments.push(item.plan_mode, item.plan_scope, item.plan_harness, item.plan_resume_context);\n for (const step of item.plan_steps ?? []) {\n appendPlanStepFlatCorpus(segments, step);\n }\n appendPlanMetadataFlatCorpus(segments, item);\n return segments.filter((segment): segment is string => typeof segment === \"string\" && segment.length > 0).join(\" \");\n}\n\n/**\n * Implements build plan corpus for the public runtime surface of this module.\n */\nexport function buildPlanCorpus(item: ItemMetadata): Record<string, unknown> | undefined {\n const steps = (item.plan_steps ?? []).map((step) =>\n compactParts([\n step.order,\n step.id,\n step.title,\n step.body,\n step.status,\n step.owner,\n step.evidence,\n step.blocked_reason,\n step.superseded_by,\n (step.linked_items ?? []).map((link) => compactParts([link.kind, link.id, link.note])).join(\" \"),\n (step.files ?? []).map((file) => compactParts([file.path, file.note])).join(\" \"),\n (step.tests ?? []).map((test) => compactParts([test.command, test.path, test.note])).join(\" \"),\n (step.docs ?? []).map((doc) => compactParts([doc.path, doc.note])).join(\" \"),\n ]),\n );\n const decisions = (item.plan_decisions ?? []).map((entry) =>\n compactParts([entry.decision, entry.rationale, entry.evidence, entry.step_id]),\n );\n const discoveries = (item.plan_discoveries ?? []).map((entry) => compactParts([entry.text, entry.step_id]));\n const validation = (item.plan_validation ?? []).map((entry) =>\n compactParts([entry.text, entry.command, entry.expected]),\n );\n const hasPlanContent =\n item.plan_mode !== undefined ||\n item.plan_scope !== undefined ||\n item.plan_harness !== undefined ||\n item.plan_resume_context !== undefined ||\n steps.length > 0 ||\n decisions.length > 0 ||\n discoveries.length > 0 ||\n validation.length > 0;\n if (!hasPlanContent) {\n return undefined;\n }\n return {\n mode: item.plan_mode,\n scope: item.plan_scope,\n harness: item.plan_harness,\n resume_context: item.plan_resume_context,\n steps,\n decisions,\n discoveries,\n validation,\n };\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\n/**\n * Documents the search corpus options payload exchanged by command, SDK, and package integrations.\n */\nexport interface SearchCorpusOptions {\n /**\n * Field names to include. When omitted, the full default set is used.\n * See {@link DEFAULT_SEARCH_CORPUS_FIELDS} and {@link resolveSearchCorpusFields}.\n */\n fields?: string[];\n}\n\n/**\n * Builders for each corpus field. Each returns the value to emit, or `undefined`\n * to omit the field entirely (keeps the corpus compact / token-efficient — we do\n * not emit empty strings, empty arrays, or nulls for the optional structured\n * fields). Always-present fields (title/status/etc.) emit their raw value.\n */\nconst CORPUS_FIELD_BUILDERS: Record<string, (document: ItemDocument) => unknown> = {\n title: (document) => document.metadata.title,\n description: (document) => document.metadata.description,\n tags: (document) => document.metadata.tags,\n status: (document) => document.metadata.status,\n type: (document) => document.metadata.type,\n priority: (document) =>\n typeof document.metadata.priority === \"number\" ? document.metadata.priority : undefined,\n assignee: (document) => (isNonEmptyString(document.metadata.assignee) ? document.metadata.assignee : undefined),\n parent: (document) => (isNonEmptyString(document.metadata.parent) ? document.metadata.parent : undefined),\n goal: (document) => (isNonEmptyString(document.metadata.goal) ? document.metadata.goal : undefined),\n value: (document) => (isNonEmptyString(document.metadata.value) ? document.metadata.value : undefined),\n why_now: (document) => (isNonEmptyString(document.metadata.why_now) ? document.metadata.why_now : undefined),\n risk: (document) => (isNonEmptyString(document.metadata.risk) ? document.metadata.risk : undefined),\n confidence: (document) =>\n document.metadata.confidence !== undefined && document.metadata.confidence !== null\n ? document.metadata.confidence\n : undefined,\n estimated_minutes: (document) =>\n typeof document.metadata.estimated_minutes === \"number\" ? document.metadata.estimated_minutes : undefined,\n acceptance_criteria: (document) =>\n isNonEmptyString(document.metadata.acceptance_criteria) ? document.metadata.acceptance_criteria : undefined,\n resolution: (document) =>\n isNonEmptyString(document.metadata.resolution) ? document.metadata.resolution : undefined,\n expected_result: (document) =>\n isNonEmptyString(document.metadata.expected_result) ? document.metadata.expected_result : undefined,\n actual_result: (document) =>\n isNonEmptyString(document.metadata.actual_result) ? document.metadata.actual_result : undefined,\n body: (document) => document.body,\n comments: (document) => (document.metadata.comments ?? []).map((entry) => entry.text),\n notes: (document) => (document.metadata.notes ?? []).map((entry) => entry.text),\n learnings: (document) => (document.metadata.learnings ?? []).map((entry) => entry.text),\n reminders: (document) => buildReminderCorpus(document.metadata),\n events: (document) => buildEventCorpus(document.metadata),\n dependencies: (document) =>\n (document.metadata.dependencies ?? []).map((entry) => ({\n id: entry.id,\n kind: entry.kind,\n })),\n plan: (document) => buildPlanCorpus(document.metadata),\n};\n\n/**\n * Implements build search corpus for the public runtime surface of this module.\n */\nexport function buildSearchCorpus(document: ItemDocument, options: SearchCorpusOptions = {}): Record<string, unknown> {\n const fields = options.fields ?? DEFAULT_SEARCH_CORPUS_FIELDS;\n const corpus: Record<string, unknown> = {};\n for (const field of fields) {\n const builder = CORPUS_FIELD_BUILDERS[field];\n if (!builder) {\n continue;\n }\n const value = builder(document);\n if (value === undefined) {\n continue;\n }\n corpus[field] = value;\n }\n return corpus;\n}\n\n/**\n * Implements resolve semantic corpus input character limit for the public runtime surface of this module.\n */\nexport function resolveSemanticCorpusInputCharacterLimit(providerName: string | undefined): number {\n if (providerName?.trim().toLowerCase() === \"ollama\") {\n return OLLAMA_SEMANTIC_CORPUS_INPUT_MAX_CHARACTERS;\n }\n return DEFAULT_SEMANTIC_CORPUS_INPUT_MAX_CHARACTERS;\n}\n\n/**\n * Documents the semantic corpus character limit resolution payload exchanged by command, SDK, and package integrations.\n */\nexport interface SemanticCorpusCharacterLimitResolution {\n maxCharacters: number;\n warning: string | null;\n}\n\n/**\n * Implements resolve semantic corpus character limit for the public runtime surface of this module.\n */\nexport function resolveSemanticCorpusCharacterLimit(\n providerName: string | undefined,\n configuredMaxCharacters: unknown,\n): SemanticCorpusCharacterLimitResolution {\n const providerDefaultLimit = resolveSemanticCorpusInputCharacterLimit(providerName);\n const parsed = coercePositiveInteger(configuredMaxCharacters);\n if (parsed !== null) {\n return {\n maxCharacters: parsed,\n warning: null,\n };\n }\n return {\n maxCharacters: providerDefaultLimit,\n warning:\n configuredMaxCharacters === undefined || configuredMaxCharacters === null\n ? null\n : SEARCH_EMBEDDING_CORPUS_MAX_CHARACTERS_INVALID_WARNING,\n };\n}\n\n/**\n * Documents the semantic corpus input options payload exchanged by command, SDK, and package integrations.\n */\nexport interface SemanticCorpusInputOptions {\n providerName?: string;\n maxCharacters?: number;\n /**\n * Corpus field names to include. When omitted, the full default set is used\n * (see {@link DEFAULT_SEARCH_CORPUS_FIELDS}). Thread the resolved list from\n * {@link resolveSearchCorpusFields} so the embedded input honours\n * `search.corpus_fields`.\n */\n fields?: string[];\n}\n\n/**\n * Implements build semantic corpus input for the public runtime surface of this module.\n */\nexport function buildSemanticCorpusInput(document: ItemDocument, options: SemanticCorpusInputOptions = {}): string {\n const serialized = JSON.stringify(buildSearchCorpus(document, { fields: options.fields }));\n const maxCharacters = resolveSemanticCorpusCharacterLimit(options.providerName, options.maxCharacters)\n .maxCharacters;\n if (serialized.length <= maxCharacters) {\n return serialized;\n }\n if (maxCharacters <= SEMANTIC_CORPUS_TRUNCATION_SUFFIX.length) {\n return SEMANTIC_CORPUS_TRUNCATION_SUFFIX.slice(0, maxCharacters);\n }\n const keepLength = Math.max(0, maxCharacters - SEMANTIC_CORPUS_TRUNCATION_SUFFIX.length);\n return `${serialized.slice(0, keepLength)}${SEMANTIC_CORPUS_TRUNCATION_SUFFIX}`;\n}\n", "/**\n * @module core/search/embedding-batches\n *\n * Powers search, embeddings, and semantic retrieval behavior for Embedding Batches.\n */\nimport type { PmSettings } from \"../../types/index.js\";\nimport { executeEmbeddingRequest } from \"./providers.js\";\nimport type { EmbeddingProviderConfig } from \"./providers.js\";\nimport { toErrorMessage } from \"../shared/primitives.js\";\nimport {\n OLLAMA_SEMANTIC_CORPUS_INPUT_MAX_CHARACTERS,\n SEMANTIC_CORPUS_TRUNCATION_SUFFIX,\n resolveSemanticCorpusCharacterLimit,\n} from \"./corpus.js\";\n\n/**\n * Documents the embedding batch execution result payload exchanged by command, SDK, and package integrations.\n */\nexport interface EmbeddingBatchExecutionResult {\n vectors: number[][];\n warnings: string[];\n}\n\n/**\n * Documents the embedding batch progress event payload exchanged by command, SDK, and package integrations.\n */\nexport interface EmbeddingBatchProgressEvent {\n batch_index: number;\n batch_total: number;\n batch_size: number;\n completed_inputs: number;\n total_inputs: number;\n attempt?: number;\n phase: \"start\" | \"complete\";\n}\n\n/**\n * Documents the embedding batch execution options payload exchanged by command, SDK, and package integrations.\n */\nexport interface EmbeddingBatchExecutionOptions {\n onProgress?: (event: EmbeddingBatchProgressEvent) => void;\n}\n\ninterface EmbeddingBatchRuntime {\n batchSize: number;\n timeoutMs: number;\n maxRetries: number;\n maxBatchInputCharacters: number;\n maxInputCharacters: number;\n}\n\nfunction resolveBatchRuntime(\n settings: PmSettings,\n maxInputCharacters: number,\n): EmbeddingBatchRuntime {\n const batchSizeCandidate = settings.search.embedding_batch_size;\n const timeoutMsCandidate = settings.search.embedding_timeout_ms;\n const maxRetriesCandidate = settings.search.scanner_max_batch_retries;\n const batchSize = Number.isFinite(batchSizeCandidate) && batchSizeCandidate > 0 ? Math.floor(batchSizeCandidate) : 1;\n const timeoutMs =\n Number.isFinite(timeoutMsCandidate) && timeoutMsCandidate > 0 ? Math.floor(timeoutMsCandidate) : 30_000;\n const maxRetries = Number.isFinite(maxRetriesCandidate) && maxRetriesCandidate >= 0 ? Math.floor(maxRetriesCandidate) : 0;\n return {\n batchSize,\n timeoutMs,\n maxRetries,\n maxBatchInputCharacters: Number.POSITIVE_INFINITY,\n maxInputCharacters,\n };\n}\n\nfunction createBatches(inputs: string[], batchSize: number, maxBatchInputCharacters: number): string[][] {\n const batches: string[][] = [];\n let currentBatch: string[] = [];\n let currentCharacters = 0;\n for (const input of inputs) {\n const wouldExceedCount = currentBatch.length >= batchSize;\n const wouldExceedCharacters =\n currentBatch.length > 0 &&\n Number.isFinite(maxBatchInputCharacters) &&\n currentCharacters + input.length > maxBatchInputCharacters;\n if (wouldExceedCount || wouldExceedCharacters) {\n batches.push(currentBatch);\n currentBatch = [];\n currentCharacters = 0;\n }\n currentBatch.push(input);\n currentCharacters += input.length;\n }\n batches.push(currentBatch);\n return batches;\n}\n\nfunction resolveProviderBatchRuntime(provider: EmbeddingProviderConfig, runtime: EmbeddingBatchRuntime): EmbeddingBatchRuntime {\n if (provider.name !== \"ollama\") {\n return runtime;\n }\n return {\n ...runtime,\n maxBatchInputCharacters: OLLAMA_SEMANTIC_CORPUS_INPUT_MAX_CHARACTERS,\n };\n}\n\nfunction truncateInputForRuntime(input: string, maxInputCharacters: number): string {\n if (!Number.isFinite(maxInputCharacters) || maxInputCharacters <= 0 || input.length <= maxInputCharacters) {\n return input;\n }\n const keepLength = Math.max(0, maxInputCharacters - SEMANTIC_CORPUS_TRUNCATION_SUFFIX.length);\n return `${input.slice(0, keepLength)}${SEMANTIC_CORPUS_TRUNCATION_SUFFIX}`.slice(0, maxInputCharacters);\n}\n\nfunction isEmbeddingTimeoutError(error: unknown): boolean {\n const message = toErrorMessage(error).toLowerCase();\n return message.includes(\"timed out\") || message.includes(\"timeout\");\n}\n\nfunction buildEmbeddingFailureMessage(\n provider: EmbeddingProviderConfig,\n batchLabel: string,\n batchSize: number,\n timeoutMs: number,\n attempts: number,\n error: unknown,\n): string {\n const base = `Embedding batch ${batchLabel} failed after ${attempts} attempt(s): ${toErrorMessage(error)}`;\n const details = `provider=${provider.name} model=${provider.model} batch_size=${batchSize} timeout_ms=${timeoutMs}`;\n if (!isEmbeddingTimeoutError(error)) {\n return `${base} (${details})`;\n }\n return `${base} (${details}; guidance=check provider availability or lower search.embedding_batch_size, raise search.embedding_timeout_ms, or run keyword search while semantic indexing catches up)`;\n}\n\nasync function executeBatchWithAdaptiveSplit(\n provider: EmbeddingProviderConfig,\n batch: string[],\n batchLabel: string,\n timeoutMs: number,\n maxRetries: number,\n warnings: string[],\n): Promise<number[][]> {\n let lastError: unknown = null;\n for (let attempt = 0; attempt <= maxRetries; attempt += 1) {\n try {\n const batchVectors = await executeEmbeddingRequest(provider, batch, { timeout_ms: timeoutMs });\n if (attempt > 0) {\n warnings.push(\n `search_embedding_batch_retry_succeeded:batch=${batchLabel}:attempt=${attempt + 1}:size=${batch.length}`,\n );\n }\n return batchVectors;\n } catch (error: unknown) {\n lastError = error;\n if (isEmbeddingTimeoutError(error) && batch.length > 1) {\n const midpoint = Math.ceil(batch.length / 2);\n const left = batch.slice(0, midpoint);\n const right = batch.slice(midpoint);\n warnings.push(\n `search_embedding_batch_split_after_timeout:batch=${batchLabel}:size=${batch.length}:parts=${left.length}|${right.length}`,\n );\n return [\n ...(await executeBatchWithAdaptiveSplit(provider, left, `${batchLabel}.1`, timeoutMs, maxRetries, warnings)),\n ...(await executeBatchWithAdaptiveSplit(provider, right, `${batchLabel}.2`, timeoutMs, maxRetries, warnings)),\n ];\n }\n if (attempt < maxRetries) {\n const delayMs = Math.min(1000 * 2 ** attempt, 8000);\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n }\n throw new Error(buildEmbeddingFailureMessage(provider, batchLabel, batch.length, timeoutMs, maxRetries + 1, lastError));\n}\n\n/**\n * Implements execute embedding batches with retry for the public runtime surface of this module.\n */\nexport async function executeEmbeddingBatchesWithRetry(\n provider: EmbeddingProviderConfig,\n settings: PmSettings,\n inputs: string[],\n options: EmbeddingBatchExecutionOptions = {},\n): Promise<EmbeddingBatchExecutionResult> {\n if (inputs.length === 0) {\n return {\n vectors: [],\n warnings: [],\n };\n }\n const warnings: string[] = [];\n const corpusLimitResolution = resolveSemanticCorpusCharacterLimit(\n provider.name,\n settings.search.embedding_corpus_max_characters,\n );\n if (corpusLimitResolution.warning) {\n warnings.push(corpusLimitResolution.warning);\n }\n const runtime = resolveProviderBatchRuntime(\n provider,\n resolveBatchRuntime(settings, corpusLimitResolution.maxCharacters),\n );\n let truncatedInputCount = 0;\n const normalizedInputs = inputs.map((input) => {\n const normalized = truncateInputForRuntime(input, runtime.maxInputCharacters);\n if (normalized.length < input.length) {\n truncatedInputCount += 1;\n }\n return normalized;\n });\n if (truncatedInputCount > 0) {\n warnings.push(`search_embedding_input_truncated:count=${truncatedInputCount}:max_characters=${runtime.maxInputCharacters}`);\n }\n const batches = createBatches(normalizedInputs, runtime.batchSize, runtime.maxBatchInputCharacters);\n const vectors: number[][] = [];\n let completedInputs = 0;\n for (let batchIndex = 0; batchIndex < batches.length; batchIndex += 1) {\n const batch = batches[batchIndex];\n options.onProgress?.({\n batch_index: batchIndex + 1,\n batch_total: batches.length,\n batch_size: batch.length,\n completed_inputs: completedInputs,\n total_inputs: normalizedInputs.length,\n phase: \"start\",\n });\n vectors.push(\n ...(await executeBatchWithAdaptiveSplit(\n provider,\n batch,\n String(batchIndex + 1),\n runtime.timeoutMs,\n runtime.maxRetries,\n warnings,\n )),\n );\n completedInputs += batch.length;\n options.onProgress?.({\n batch_index: batchIndex + 1,\n batch_total: batches.length,\n batch_size: batch.length,\n completed_inputs: completedInputs,\n total_inputs: normalizedInputs.length,\n phase: \"complete\",\n });\n }\n return {\n vectors,\n warnings,\n };\n}\n", "/**\n * @module core/search/semantic-defaults\n *\n * Powers search, embeddings, and semantic retrieval behavior for Semantic Defaults.\n */\nimport { spawnSync } from \"node:child_process\";\nimport type { PmSettings } from \"../../types/index.js\";\nimport { toNonEmptyString } from \"../shared/primitives.js\";\n\nconst DISABLE_AUTO_DEFAULTS_ENV = \"PM_DISABLE_OLLAMA_AUTO_DEFAULTS\";\nconst OLLAMA_MODEL_ENV = \"PM_OLLAMA_MODEL\";\nconst DEFAULT_OLLAMA_BASE_URL = \"http://localhost:11434\";\nconst RECOMMENDED_OLLAMA_EMBEDDING_MODEL = \"qwen3-embedding:0.6b\";\nconst DEFAULT_LANCEDB_PATH = \".agents/pm/search/lancedb/\";\nconst OLLAMA_VERSION_TIMEOUT_MS = 1_500;\nconst OLLAMA_LIST_TIMEOUT_MS = 2_500;\nconst QWEN_EMBEDDING_MODEL_PATTERN = /qwen.*(?:embed|embedding)|(?:embed|embedding).*qwen/i;\nconst EMBEDDING_MODEL_PATTERN = /embed|embedding/i;\n\n/**\n * Documents the semantic runtime defaults resolution payload exchanged by command, SDK, and package integrations.\n */\nexport interface SemanticRuntimeDefaultsResolution {\n settings: PmSettings;\n auto_ollama_defaults_applied: boolean;\n auto_ollama_defaults_skipped_reason?: \"no_installed_embedding_model\";\n auto_ollama_defaults_remediation?: string;\n}\n\nconst toOptionalNonEmptyString = toNonEmptyString;\n\nfunction isAutoDefaultsDisabled(): boolean {\n const raw = toOptionalNonEmptyString(process.env[DISABLE_AUTO_DEFAULTS_ENV]);\n if (!raw) {\n return false;\n }\n const normalized = raw.toLowerCase();\n return normalized === \"1\" || normalized === \"true\" || normalized === \"yes\";\n}\n\nfunction hasConfiguredValue(values: readonly unknown[]): boolean {\n return values.some((entry) => toOptionalNonEmptyString(entry) !== null);\n}\n\nfunction hasCompetingProvider(provider: unknown): boolean {\n const normalized = toOptionalNonEmptyString(provider);\n return Boolean(normalized && normalized.toLowerCase() !== \"ollama\");\n}\n\nfunction hasCompetingVectorAdapter(adapter: unknown): boolean {\n const normalized = toOptionalNonEmptyString(adapter);\n return Boolean(normalized && normalized.toLowerCase() !== \"lancedb\");\n}\n\n/**\n * True only when the user has opted into a provider/store that COMPETES with the\n * Ollama + LanceDB auto-default stack: an explicit non-Ollama search provider, a\n * non-LanceDB vector adapter, or any OpenAI/Qdrant credentials. A partial Ollama\n * setup (e.g. only `ollama.base_url`) is NOT competing — its missing leaves are\n * filled per-field below so a single config write can never silently disable\n * semantic search and then hard-error `pm reindex`.\n */\nfunction hasCompetingSemanticConfiguration(settings: PmSettings): boolean {\n if (hasCompetingProvider(settings.search?.provider)) {\n return true;\n }\n if (hasCompetingVectorAdapter(settings.vector_store?.adapter)) {\n return true;\n }\n if (hasConfiguredValue([\n settings.providers?.openai?.base_url,\n settings.providers?.openai?.model,\n settings.providers?.openai?.api_key,\n ])) {\n return true;\n }\n return hasConfiguredValue([\n settings.vector_store?.qdrant?.url,\n settings.vector_store?.qdrant?.api_key,\n ]);\n}\n\nfunction isOllamaInstalled(): boolean {\n const result = spawnSync(\"ollama\", [\"--version\"], {\n encoding: \"utf8\",\n timeout: OLLAMA_VERSION_TIMEOUT_MS,\n });\n if (result.error) {\n return false;\n }\n return result.status === 0;\n}\n\nfunction parseOllamaModelList(output: string): string | null {\n const lines = output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n if (lines.length === 0) {\n return null;\n }\n const models = lines\n .map((line) => line.split(/\\s+/)[0]?.trim())\n .filter((entry): entry is string => Boolean(entry && entry.length > 0))\n .filter((entry) => entry.toUpperCase() !== \"NAME\");\n if (models.length === 0) {\n return null;\n }\n const preferredQwenEmbeddingModel = models.find((entry) => QWEN_EMBEDDING_MODEL_PATTERN.test(entry));\n if (preferredQwenEmbeddingModel) {\n return preferredQwenEmbeddingModel;\n }\n const embeddingModel = models.find((entry) => EMBEDDING_MODEL_PATTERN.test(entry));\n return embeddingModel ?? null;\n}\n\nfunction resolveAutoOllamaModel(settings: PmSettings): string | null {\n const settingsModel = toOptionalNonEmptyString(settings.providers?.ollama?.model);\n if (settingsModel) {\n return settingsModel;\n }\n const envModel = toOptionalNonEmptyString(process.env[OLLAMA_MODEL_ENV]);\n if (envModel) {\n return envModel;\n }\n const listed = spawnSync(\"ollama\", [\"list\"], {\n encoding: \"utf8\",\n timeout: OLLAMA_LIST_TIMEOUT_MS,\n });\n if (!listed.error && listed.status === 0) {\n const listedModel = parseOllamaModelList(typeof listed.stdout === \"string\" ? listed.stdout : \"\");\n if (listedModel) {\n return listedModel;\n }\n }\n return null;\n}\n\ninterface SemanticDefaultNeeds {\n baseUrl: boolean;\n model: boolean;\n lancedbPath: boolean;\n embeddingModel: boolean;\n}\n\nfunction resolveSemanticDefaultNeeds(settings: PmSettings): SemanticDefaultNeeds {\n return {\n baseUrl: toOptionalNonEmptyString(settings.providers?.ollama?.base_url) === null,\n model: toOptionalNonEmptyString(settings.providers?.ollama?.model) === null,\n lancedbPath: toOptionalNonEmptyString(settings.vector_store?.lancedb?.path) === null,\n embeddingModel: toOptionalNonEmptyString(settings.search?.embedding_model) === null,\n };\n}\n\nfunction needsAnySemanticDefault(needs: SemanticDefaultNeeds): boolean {\n return needs.baseUrl || needs.model || needs.lancedbPath || needs.embeddingModel;\n}\n\nfunction applyOllamaProviderDefaults(settings: PmSettings, needs: SemanticDefaultNeeds, resolvedModel: string): void {\n if (!needs.baseUrl && !needs.model) {\n return;\n }\n const providers = (settings.providers ??= {} as PmSettings[\"providers\"]);\n const ollama = (providers.ollama ??= {} as PmSettings[\"providers\"][\"ollama\"]);\n if (needs.baseUrl) {\n ollama.base_url = DEFAULT_OLLAMA_BASE_URL;\n }\n if (needs.model) {\n ollama.model = resolvedModel;\n }\n}\n\nfunction applyVectorStoreDefaults(settings: PmSettings, needs: SemanticDefaultNeeds): void {\n if (!needs.lancedbPath) {\n return;\n }\n const vectorStore = (settings.vector_store ??= {} as PmSettings[\"vector_store\"]);\n const lancedb = (vectorStore.lancedb ??= {} as PmSettings[\"vector_store\"][\"lancedb\"]);\n lancedb.path = DEFAULT_LANCEDB_PATH;\n}\n\nfunction applySearchEmbeddingDefaults(settings: PmSettings, needs: SemanticDefaultNeeds, resolvedModel: string): void {\n if (!needs.embeddingModel) {\n return;\n }\n const search = (settings.search ??= {} as PmSettings[\"search\"]);\n search.embedding_model = resolvedModel;\n}\n\n/**\n * Implements resolve settings with semantic runtime defaults for the public runtime surface of this module.\n */\nexport function resolveSettingsWithSemanticRuntimeDefaults(settings: PmSettings): SemanticRuntimeDefaultsResolution {\n const unchanged: SemanticRuntimeDefaultsResolution = {\n settings,\n auto_ollama_defaults_applied: false,\n };\n if (isAutoDefaultsDisabled()) {\n return unchanged;\n }\n if (hasCompetingSemanticConfiguration(settings)) {\n return unchanged;\n }\n\n const needs = resolveSemanticDefaultNeeds(settings);\n if (!needsAnySemanticDefault(needs)) {\n // A fully-configured Ollama/LanceDB stack — nothing to fill, and no need to\n // probe for Ollama at all.\n return unchanged;\n }\n\n // Auto-discovering the embedding model (via `ollama list`) is the only step that\n // requires Ollama to be installed. When a model is already configured we mirror it\n // into the remaining leaves without forcing an Ollama probe; when it is missing we\n // require Ollama to actually be present rather than writing an unusable default.\n if (needs.model && !isOllamaInstalled()) {\n return unchanged;\n }\n\n const nextSettings = structuredClone(settings);\n const resolvedModel = resolveAutoOllamaModel(nextSettings);\n if (!resolvedModel) {\n return {\n ...unchanged,\n auto_ollama_defaults_skipped_reason: \"no_installed_embedding_model\",\n auto_ollama_defaults_remediation:\n `Run ollama pull ${RECOMMENDED_OLLAMA_EMBEDDING_MODEL} or configure providers.ollama.model explicitly (and search.embedding_model if you need an override).`,\n };\n }\n // `readSettings` always normalizes these nested objects, but this function is\n // exported and runs on the search hot path with caller-supplied settings, so a\n // partial object (e.g. providers/vector_store set but no `search` block) must\n // fill the missing leaf rather than throwing on an undefined parent.\n applyOllamaProviderDefaults(nextSettings, needs, resolvedModel);\n applyVectorStoreDefaults(nextSettings, needs);\n applySearchEmbeddingDefaults(nextSettings, needs, resolvedModel);\n return {\n settings: nextSettings,\n auto_ollama_defaults_applied: true,\n };\n}\n", "/**\n * @module core/search/background-refresh\n *\n * Powers search, embeddings, and semantic retrieval behavior for Background Refresh.\n */\nimport { spawn } from \"node:child_process\";\nimport { mkdirSync, rmSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\n\nimport { pathExists, readFileIfExists, writeFileAtomic } from \"../fs/fs-utils.js\";\nimport { acquireLock } from \"../lock/lock.js\";\nimport { resolvePmPackageRootFromModule } from \"../packages/root.js\";\nimport { readSettings } from \"../store/settings.js\";\nimport { toErrorMessage } from \"../shared/primitives.js\";\nimport { resolveSettingsWithSemanticRuntimeDefaults } from \"./semantic-defaults.js\";\n\n/**\n * Shared lock id for any process that rewrites the local vector store. Reindex\n * and the background mutation-refresh worker both acquire this so they never\n * write concurrently and corrupt the store. Exported so `pm reindex` reuses the\n * same id rather than duplicating the literal.\n */\nexport const REINDEX_LOCK_ID = \"reindex\";\n\nconst PENDING_QUEUE_REL_PATH = \"search/pending-refresh.json\";\nconst PENDING_QUEUE_GATE_REL_PATH = \"search/pending-refresh.gate.lock\";\nconst PENDING_QUEUE_GATE_STALE_MS = 30_000;\n\nconst SEARCH_REFRESH_INLINE_ENV = \"PM_SEARCH_REFRESH_INLINE\";\nconst SEARCH_REFRESH_CHILD_ENV = \"PM_SEARCH_REFRESH_CHILD\";\n\nfunction parseBooleanTrueLike(value: string | undefined): boolean {\n if (typeof value !== \"string\") {\n return false;\n }\n const normalized = value.trim().toLowerCase();\n return normalized === \"1\" || normalized === \"true\" || normalized === \"yes\" || normalized === \"on\";\n}\n\n/**\n * Mutation search refresh runs inline (blocking) under test runners, inside the\n * background worker child itself, or when explicitly requested. Otherwise the\n * semantic refresh is dispatched to a detached child so mutations return without\n * waiting on embeddings. Mirrors the telemetry-flush inline gate so the full test\n * suite stays deterministic.\n */\nexport function shouldRunSearchRefreshInForeground(): boolean {\n if (parseBooleanTrueLike(process.env[SEARCH_REFRESH_INLINE_ENV])) {\n return true;\n }\n if (parseBooleanTrueLike(process.env[SEARCH_REFRESH_CHILD_ENV])) {\n return true;\n }\n const nodeEnv = (process.env.NODE_ENV ?? \"\").trim().toLowerCase();\n return (\n typeof process.env.VITEST === \"string\" ||\n typeof process.env.VITEST_WORKER_ID === \"string\" ||\n nodeEnv === \"test\"\n );\n}\n\nfunction pendingQueuePath(pmRoot: string): string {\n return path.join(pmRoot, PENDING_QUEUE_REL_PATH);\n}\n\nfunction pendingQueueGatePath(pmRoot: string): string {\n return path.join(pmRoot, PENDING_QUEUE_GATE_REL_PATH);\n}\n\nfunction acquireQueueGate(pmRoot: string): boolean {\n const gatePath = pendingQueueGatePath(pmRoot);\n try {\n if (Date.now() - statSync(gatePath).mtimeMs < PENDING_QUEUE_GATE_STALE_MS) {\n return false;\n }\n rmSync(gatePath, { recursive: true, force: true });\n } catch {\n // Missing gate is the common case; fall through to create it.\n }\n try {\n mkdirSync(path.dirname(gatePath), { recursive: true });\n mkdirSync(gatePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction releaseQueueGate(pmRoot: string): void {\n try {\n rmSync(pendingQueueGatePath(pmRoot), { recursive: true, force: true });\n } catch {\n // Best effort; a stale gate self-heals after PENDING_QUEUE_GATE_STALE_MS.\n }\n}\n\nasync function withQueueGate<T>(pmRoot: string, fn: () => Promise<T>, fallback: T): Promise<T> {\n // Briefly serialize read-modify-write access to the pending queue across the\n // mutation process and the worker child. Acquisition is best effort; if a\n // healthy gate is held we skip rather than risk a torn queue.\n for (let attempt = 0; attempt < 50; attempt += 1) {\n if (acquireQueueGate(pmRoot)) {\n try {\n return await fn();\n } finally {\n releaseQueueGate(pmRoot);\n }\n }\n await delay(20);\n }\n return fallback;\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nasync function readPendingQueueIds(pmRoot: string): Promise<string[]> {\n const raw = await readFileIfExists(pendingQueuePath(pmRoot));\n if (!raw || raw.trim().length === 0) {\n return [];\n }\n try {\n const parsed = JSON.parse(raw) as { ids?: unknown };\n if (!Array.isArray(parsed.ids)) {\n return [];\n }\n return parsed.ids.filter((id): id is string => typeof id === \"string\" && id.length > 0);\n } catch {\n return [];\n }\n}\n\nasync function writePendingQueueIds(pmRoot: string, ids: string[]): Promise<void> {\n await writeFileAtomic(pendingQueuePath(pmRoot), `${JSON.stringify({ ids })}\\n`);\n}\n\n/** Merge mutated item ids into the persistent pending-refresh queue. */\nexport async function enqueuePendingRefreshIds(pmRoot: string, itemIds: string[]): Promise<void> {\n const incoming = itemIds.filter((id) => typeof id === \"string\" && id.trim().length > 0);\n if (incoming.length === 0) {\n return;\n }\n const mergeIncoming = async (): Promise<void> => {\n const existing = await readPendingQueueIds(pmRoot);\n const merged = [...new Set([...existing, ...incoming])].sort((left, right) => left.localeCompare(right));\n await writePendingQueueIds(pmRoot, merged);\n };\n const gated = await withQueueGate(\n pmRoot,\n async () => {\n await mergeIncoming();\n return true;\n },\n false,\n );\n if (!gated) {\n // The gate stayed contended past the retry budget. Never silently drop a\n // mutation's refresh work: fall back to a best-effort unguarded merge.\n // writeFileAtomic keeps the file valid; the only risk is losing a concurrent\n // writer's delta, which its own next dispatch and the vector_index_stale\n // warning both recover.\n await mergeIncoming();\n }\n}\n\n/** Atomically read and clear the pending-refresh queue, returning drained ids. */\nexport async function drainPendingRefreshIds(pmRoot: string): Promise<string[]> {\n return withQueueGate(\n pmRoot,\n async () => {\n const ids = await readPendingQueueIds(pmRoot);\n if (ids.length > 0) {\n await writePendingQueueIds(pmRoot, []);\n }\n return ids;\n },\n [],\n );\n}\n\nfunction searchRefreshRunnerPath(): string {\n return path.join(\n resolvePmPackageRootFromModule(import.meta.url, [\"../../..\"]),\n \"dist\",\n \"cli\",\n \"search-refresh.js\",\n );\n}\n\n/**\n * Spawn the detached refresh worker child for this pm root. Best effort: a\n * failed dispatch must never keep the CLI alive or fail a mutation; the next\n * mutation re-dispatches and `vector_index_stale` warns about the catch-up\n * window in the meantime.\n */\nfunction dispatchRefreshChild(pmRoot: string): void {\n try {\n const child = spawn(process.execPath, [searchRefreshRunnerPath()], {\n detached: true,\n stdio: \"ignore\",\n env: {\n ...process.env,\n PM_PATH: pmRoot,\n [SEARCH_REFRESH_CHILD_ENV]: \"1\",\n },\n });\n // A detached child can emit an async 'error' event (e.g. spawn EAGAIN/ENOENT,\n // resource limits). Swallow it so it never becomes an unhandled error that\n // crashes the parent CLI; dispatch is best effort.\n child.on(\"error\", () => {});\n child.unref();\n } catch {\n // Best effort — see doc comment above.\n }\n}\n\n/**\n * Enqueue mutated ids and dispatch a detached worker child to refresh semantic\n * embeddings without blocking the mutation. The reindex lock the worker acquires\n * serializes concurrent refreshes, so the spawn itself stays unconditional and\n * cheap; a worker that loses the lock exits and its ids are drained by the holder.\n */\nexport async function scheduleBackgroundSemanticRefresh(pmRoot: string, itemIds: string[]): Promise<void> {\n await enqueuePendingRefreshIds(pmRoot, itemIds);\n dispatchRefreshChild(pmRoot);\n}\n\n/**\n * Documents the semantic refresh worker result payload exchanged by command, SDK, and package integrations.\n */\nexport interface SemanticRefreshWorkerResult {\n processed: string[];\n rounds: number;\n warnings: string[];\n}\n\ntype SemanticRefreshFn = (\n pmRoot: string,\n itemIds: string[],\n) => Promise<{ refreshed: string[]; skipped: string[]; warnings: string[] }>;\n\n/**\n * Drain the pending queue and refresh semantic vectors under the reindex lock so\n * the local vector store is never rewritten concurrently. If the lock is held by\n * another worker we exit immediately — that holder drains our enqueued ids. After\n * releasing we re-check the queue once and re-dispatch if a sibling enqueued ids\n * during our final window, guaranteeing eventual processing.\n */\nexport async function runSemanticRefreshWorker(\n pmRoot: string,\n refresh: SemanticRefreshFn,\n): Promise<SemanticRefreshWorkerResult> {\n const warnings: string[] = [];\n const processed: string[] = [];\n if (!(await pathExists(pmRoot))) {\n return { processed, rounds: 0, warnings };\n }\n\n let settings: Awaited<ReturnType<typeof readSettings>>;\n try {\n settings = resolveSettingsWithSemanticRuntimeDefaults(await readSettings(pmRoot)).settings;\n } catch (error: unknown) {\n return { processed, rounds: 0, warnings: [`search_background_refresh_settings_read_failed:${toErrorMessage(error)}`] };\n }\n\n let release: (() => Promise<void>) | null = null;\n try {\n release = await acquireLock(\n pmRoot,\n REINDEX_LOCK_ID,\n settings.locks.ttl_seconds,\n process.env.PM_AUTHOR ?? \"pm-search-refresh\",\n false,\n settings.governance.force_required_for_stale_lock,\n settings.locks.wait_ms,\n );\n } catch {\n // acquireLock owns the bounded wait budget; queued ids remain for the next dispatch.\n }\n if (!release) {\n return { processed, rounds: 0, warnings };\n }\n\n let rounds = 0;\n let failed = false;\n try {\n for (;;) {\n const ids = await drainPendingRefreshIds(pmRoot);\n if (ids.length === 0) {\n break;\n }\n rounds += 1;\n try {\n const result = await refresh(pmRoot, ids);\n processed.push(...result.refreshed);\n warnings.push(...result.warnings);\n } catch (error: unknown) {\n warnings.push(`search_background_refresh_failed:${toErrorMessage(error)}`);\n // Re-enqueue so the work is retried by a later dispatch rather than lost.\n await enqueuePendingRefreshIds(pmRoot, ids);\n failed = true;\n break;\n }\n }\n } finally {\n await release?.();\n }\n\n // Close the race where a sibling enqueued ids between our last empty drain and\n // releasing the lock: re-dispatch so those ids are eventually processed. Skip\n // this after a refresh failure — the failed ids were re-enqueued and an\n // immediate respawn would just fail again, spinning indefinitely. They wait\n // for the next mutation's dispatch instead.\n const remaining = failed ? [] : await readPendingQueueIds(pmRoot);\n if (remaining.length > 0) {\n dispatchRefreshChild(pmRoot);\n }\n\n return { processed: [...new Set(processed)].sort((a, b) => a.localeCompare(b)), rounds, warnings };\n}\n", "/**\n * @module core/search/vector-stores\n *\n * Powers search, embeddings, and semantic retrieval behavior for Vector Stores.\n */\nimport type { PmSettings } from \"../../types/index.js\";\nimport { mkdir, readFile, stat, unlink } from \"node:fs/promises\";\nimport { basename, dirname, isAbsolute, join, resolve } from \"node:path\";\nimport {\n executeSearchJsonRequest,\n normalizeSearchHttpTimeoutMs,\n resolveSearchHttpFetcher,\n} from \"./http-client.js\";\nimport type { SearchHttpFetcher, SearchHttpResponse } from \"./http-client.js\";\nimport {\n isFiniteNumberArray,\n toErrorMessage,\n toNonEmptyString,\n trimTrailingSlashes,\n} from \"../shared/primitives.js\";\nimport { writeFileAtomic } from \"../fs/fs-utils.js\";\n\n/**\n * Restricts vector store name values accepted by command, SDK, and storage contracts.\n */\nexport type VectorStoreName = \"qdrant\" | \"lancedb\";\n\n/**\n * Documents the qdrant vector store config payload exchanged by command, SDK, and package integrations.\n */\nexport interface QdrantVectorStoreConfig {\n name: \"qdrant\";\n url: string;\n collection_name?: string;\n api_key?: string;\n}\n\n/**\n * Documents the lance db vector store config payload exchanged by command, SDK, and package integrations.\n */\nexport interface LanceDbVectorStoreConfig {\n name: \"lancedb\";\n path: string;\n collection_name?: string;\n}\n\n/**\n * Restricts vector store config values accepted by command, SDK, and storage contracts.\n */\nexport type VectorStoreConfig = QdrantVectorStoreConfig | LanceDbVectorStoreConfig;\n\n/**\n * Documents the vector store resolution payload exchanged by command, SDK, and package integrations.\n */\nexport interface VectorStoreResolution {\n active: VectorStoreConfig | null;\n available: VectorStoreConfig[];\n}\n\n/**\n * Documents the vector store request target payload exchanged by command, SDK, and package integrations.\n */\nexport interface VectorStoreRequestTarget {\n store: VectorStoreName;\n query_target: string;\n upsert_target: string;\n}\n\n/**\n * Documents the vector query plan payload exchanged by command, SDK, and package integrations.\n */\nexport interface VectorQueryPlan {\n target: VectorStoreRequestTarget;\n method: \"POST\" | \"LOCAL\";\n headers: Record<string, string>;\n body: Record<string, unknown>;\n}\n\n/**\n * Documents the vector record payload exchanged by command, SDK, and package integrations.\n */\nexport interface VectorRecord {\n id: string;\n vector: number[];\n payload?: Record<string, unknown>;\n}\n\n/**\n * Documents the vector upsert plan payload exchanged by command, SDK, and package integrations.\n */\nexport interface VectorUpsertPlan {\n target: VectorStoreRequestTarget;\n method: \"POST\" | \"LOCAL\";\n headers: Record<string, string>;\n body: Record<string, unknown>;\n}\n\n/**\n * Documents the vector delete plan payload exchanged by command, SDK, and package integrations.\n */\nexport interface VectorDeletePlan {\n target: VectorStoreRequestTarget;\n method: \"POST\" | \"LOCAL\";\n headers: Record<string, string>;\n body: Record<string, unknown>;\n}\n\n/**\n * Documents the vector query hit payload exchanged by command, SDK, and package integrations.\n */\nexport interface VectorQueryHit {\n id: string;\n score: number;\n payload?: Record<string, unknown>;\n}\n\n/**\n * Documents the vector upsert result payload exchanged by command, SDK, and package integrations.\n */\nexport interface VectorUpsertResult {\n status: string;\n}\n\n/**\n * Restricts vector http response values accepted by command, SDK, and storage contracts.\n */\nexport type VectorHttpResponse = SearchHttpResponse;\n\n/**\n * Restricts vector request fetcher values accepted by command, SDK, and storage contracts.\n */\nexport type VectorRequestFetcher = SearchHttpFetcher<VectorHttpResponse>;\n\n/**\n * Documents the execute vector request options payload exchanged by command, SDK, and package integrations.\n */\nexport interface ExecuteVectorRequestOptions {\n timeout_ms?: number;\n fetcher?: VectorRequestFetcher;\n warnings?: string[];\n}\n\ntype VectorSettingsInput = {\n vector_store?: {\n collection_name?: string;\n qdrant?: {\n url?: string;\n api_key?: string;\n };\n lancedb?: {\n path?: string;\n };\n };\n};\n\ntype RemoteVectorMethod = \"DELETE\" | \"POST\" | \"PUT\";\n\nconst DEFAULT_COLLECTION = \"pm_items\";\nconst COLLECTION_SANITIZE_PATTERN = /[^a-zA-Z0-9_-]/g;\nconst MAX_COLLECTION_NAME_LENGTH = 128;\nconst LANCE_DB_LOCAL_SNAPSHOT_DIR = \".pm-cli-local-vectors\";\nconst LANCE_DB_LOCAL_SNAPSHOT_VERSION = 1;\ninterface LanceDbLocalTableCacheEntry {\n records: Map<string, VectorRecord>;\n mtimeMs: number | null;\n size: number | null;\n}\n\nconst lanceDbLocalTables = new Map<string, LanceDbLocalTableCacheEntry>();\n\nfunction resolveStoreCollectionName(store: VectorStoreConfig): string {\n const candidate = toNonEmptyString(store.collection_name) ?? DEFAULT_COLLECTION;\n return candidate.replaceAll(COLLECTION_SANITIZE_PATTERN, \"_\").slice(0, MAX_COLLECTION_NAME_LENGTH);\n}\n\nfunction normalizeVector(value: unknown): number[] {\n if (!isFiniteNumberArray(value) || value.length === 0) {\n throw new Error(\"Vector values must be a non-empty numeric array\");\n }\n return [...value];\n}\n\nfunction normalizeLimit(value: number): number {\n if (!Number.isFinite(value) || value <= 0) {\n throw new Error(\"Vector query limit must be a positive number\");\n }\n return Math.floor(value);\n}\n\nfunction normalizeQdrantQueryResponse(payload: unknown): VectorQueryHit[] {\n const result = (payload as { result?: unknown }).result;\n if (!Array.isArray(result)) {\n throw new TypeError(\"Qdrant query response must include a result array\");\n }\n const hits = result.map((entry, index) => {\n const idValue = (entry as { id?: unknown }).id;\n const idCandidate = typeof idValue === \"number\" ? String(idValue) : idValue;\n const id = toNonEmptyString(idCandidate);\n if (!id) {\n throw new Error(`Qdrant query response entry at index ${index} is missing a non-empty id`);\n }\n\n const score = (entry as { score?: unknown }).score;\n if (typeof score !== \"number\" || !Number.isFinite(score)) {\n throw new TypeError(`Qdrant query response entry at index ${index} is missing a finite numeric score`);\n }\n\n const payloadValue = (entry as { payload?: unknown }).payload;\n if (\n payloadValue !== undefined &&\n (typeof payloadValue !== \"object\" || payloadValue === null || Array.isArray(payloadValue))\n ) {\n throw new Error(`Qdrant query response entry at index ${index} must provide payload as an object when set`);\n }\n\n return {\n id,\n score,\n ...(payloadValue ? { payload: payloadValue as Record<string, unknown> } : {}),\n };\n });\n hits.sort((left, right) => {\n if (left.score !== right.score) {\n return right.score - left.score;\n }\n return left.id.localeCompare(right.id);\n });\n return hits;\n}\n\nfunction normalizeQdrantUpsertResponse(payload: unknown): VectorUpsertResult {\n const nestedStatus = toNonEmptyString((payload as { result?: { status?: unknown } }).result?.status);\n if (nestedStatus) {\n return { status: nestedStatus };\n }\n const topLevelStatus = toNonEmptyString((payload as { status?: unknown }).status);\n if (topLevelStatus) {\n return { status: topLevelStatus };\n }\n throw new Error(\"Qdrant upsert response must include status metadata\");\n}\n\nasync function executeRemoteVectorPlan(\n endpoint: string,\n plan: {\n method: RemoteVectorMethod;\n headers: Record<string, string>;\n body: Record<string, unknown>;\n },\n timeoutMs: number,\n fetcher: VectorRequestFetcher,\n requestKind: \"query\" | \"upsert\" | \"delete\",\n): Promise<unknown> {\n return await executeSearchJsonRequest({\n endpoint,\n method: plan.method,\n headers: plan.headers,\n body: plan.body,\n timeoutMs,\n fetcher,\n requestLabel: `Vector ${requestKind} request`,\n responseLabel: `Vector ${requestKind} response`,\n });\n}\n\nfunction resolveQdrantStore(settings: VectorSettingsInput): QdrantVectorStoreConfig | null {\n const url = toNonEmptyString(settings.vector_store?.qdrant?.url);\n if (!url) {\n return null;\n }\n const collectionName = toNonEmptyString(settings.vector_store?.collection_name);\n const apiKey = toNonEmptyString(settings.vector_store?.qdrant?.api_key);\n return {\n name: \"qdrant\",\n url,\n ...(collectionName && collectionName !== DEFAULT_COLLECTION ? { collection_name: collectionName } : {}),\n ...(apiKey ? { api_key: apiKey } : {}),\n };\n}\n\n/**\n * Derive the workspace root a workspace-relative store path is anchored to.\n * A conventional pm root (`<workspace>/.agents/pm`) maps to `<workspace>`;\n * an explicit bare root (`--path <dir>`) anchors to the root itself.\n */\nfunction resolveWorkspaceRootFromPmRoot(pmRoot: string): string {\n const resolved = resolve(pmRoot);\n const parent = dirname(resolved);\n if (basename(resolved) === \"pm\" && basename(parent) === \".agents\") {\n return dirname(parent);\n }\n return resolved;\n}\n\n/**\n * Anchor a relative lancedb path (settings store workspace-relative paths such\n * as the `.agents/pm/search/lancedb/` default) to the pm workspace root instead\n * of the process cwd. Without this, any pm invocation from a workspace\n * subdirectory (including detached background refresh children inheriting the\n * parent cwd) silently creates a second vector store under that subdirectory.\n */\nfunction anchorLanceDbStorePath(storePath: string, pmRoot: string | undefined): string {\n if (!pmRoot || isAbsolute(storePath)) {\n return storePath;\n }\n return resolve(resolveWorkspaceRootFromPmRoot(pmRoot), storePath);\n}\n\nfunction resolveLanceDbStore(settings: VectorSettingsInput, pmRoot?: string): LanceDbVectorStoreConfig | null {\n const lancedbPath = toNonEmptyString(settings.vector_store?.lancedb?.path);\n if (!lancedbPath) {\n return null;\n }\n const collectionName = toNonEmptyString(settings.vector_store?.collection_name);\n return {\n name: \"lancedb\",\n path: anchorLanceDbStorePath(lancedbPath, pmRoot),\n ...(collectionName && collectionName !== DEFAULT_COLLECTION ? { collection_name: collectionName } : {}),\n };\n}\n\nfunction normalizeVectorRecords(records: VectorRecord[]): VectorRecord[] {\n if (!Array.isArray(records) || records.length === 0) {\n throw new Error(\"Vector upsert records must include at least one entry\");\n }\n return records.map((record, index) => {\n const id = toNonEmptyString(record.id);\n if (!id) {\n throw new Error(`Vector upsert record at index ${index} is missing a non-empty id`);\n }\n const vector = normalizeVector(record.vector);\n const payload = record.payload;\n if (payload !== undefined && (typeof payload !== \"object\" || payload === null || Array.isArray(payload))) {\n throw new Error(`Vector upsert record at index ${index} must provide payload as an object when set`);\n }\n return {\n id,\n vector,\n ...(payload ? { payload } : {}),\n };\n });\n}\n\nfunction normalizeVectorDeleteIds(ids: string[]): string[] {\n if (!Array.isArray(ids) || ids.length === 0) {\n throw new Error(\"Vector delete ids must include at least one entry\");\n }\n const normalizedIds = ids\n .map((id, index) => {\n const normalized = toNonEmptyString(id);\n if (!normalized) {\n throw new Error(`Vector delete id at index ${index} is missing a non-empty value`);\n }\n return normalized;\n })\n .sort((left, right) => left.localeCompare(right));\n const uniqueIds: string[] = [];\n for (const id of normalizedIds) {\n if (uniqueIds.at(-1) !== id) {\n uniqueIds.push(id);\n }\n }\n return uniqueIds;\n}\n\nfunction resolveQdrantDeleteTarget(upsertTarget: string): string {\n return upsertTarget.replace(/\\/points\\?wait=true$/, \"/points/delete?wait=true\");\n}\n\nfunction resolveQdrantCollectionTarget(upsertTarget: string): string {\n return upsertTarget.replace(/\\/points\\?wait=true$/, \"\");\n}\n\nfunction buildQdrantJsonHeaders(store: QdrantVectorStoreConfig): Record<string, string> {\n return {\n \"content-type\": \"application/json\",\n ...(store.api_key ? { \"api-key\": store.api_key } : {}),\n };\n}\n\nfunction getLanceDbLocalTableKey(storePath: string, table: string): string {\n return getLanceDbSnapshotPath(storePath, table);\n}\n\nfunction getLanceDbSnapshotPath(storePath: string, table: string): string {\n return join(resolve(storePath), LANCE_DB_LOCAL_SNAPSHOT_DIR, `${table}.json`);\n}\n\nfunction isNodeErrorWithCode(error: unknown, code: string): boolean {\n return typeof error === \"object\" && error !== null && (error as { code?: unknown }).code === code;\n}\n\nfunction normalizeSnapshotRecord(entry: unknown, index: number, snapshotPath: string): VectorRecord {\n const id = toNonEmptyString((entry as { id?: unknown }).id);\n if (!id) {\n throw new Error(`LanceDB local snapshot '${snapshotPath}' record at index ${index} is missing a non-empty id`);\n }\n const vector = normalizeVector((entry as { vector?: unknown }).vector);\n const payload = (entry as { payload?: unknown }).payload;\n if (payload !== undefined && (typeof payload !== \"object\" || payload === null || Array.isArray(payload))) {\n throw new Error(\n `LanceDB local snapshot '${snapshotPath}' record '${id}' must provide payload as an object when set`,\n );\n }\n return {\n id,\n vector,\n ...(payload ? { payload: payload as Record<string, unknown> } : {}),\n };\n}\n\nfunction parseLanceDbSnapshot(snapshotPath: string, expectedTable: string, raw: string): Map<string, VectorRecord> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw) as unknown;\n } catch (error) {\n throw new Error(`LanceDB local snapshot at '${snapshotPath}' is not valid JSON: ${toErrorMessage(error)}`);\n }\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new Error(`LanceDB local snapshot at '${snapshotPath}' must be a JSON object`);\n }\n\n const version = (parsed as { version?: unknown }).version;\n if (version !== LANCE_DB_LOCAL_SNAPSHOT_VERSION) {\n throw new Error(\n `LanceDB local snapshot at '${snapshotPath}' must include version=${LANCE_DB_LOCAL_SNAPSHOT_VERSION}`,\n );\n }\n\n const table = toNonEmptyString((parsed as { table?: unknown }).table);\n if (!table) {\n throw new Error(`LanceDB local snapshot at '${snapshotPath}' must include a non-empty table value`);\n }\n if (table !== expectedTable) {\n throw new Error(\n `LanceDB local snapshot at '${snapshotPath}' table mismatch: expected '${expectedTable}', received '${table}'`,\n );\n }\n\n const recordsValue = (parsed as { records?: unknown }).records;\n if (!Array.isArray(recordsValue)) {\n throw new TypeError(`LanceDB local snapshot at '${snapshotPath}' must include a records array`);\n }\n\n const tableRecords = new Map<string, VectorRecord>();\n for (let index = 0; index < recordsValue.length; index += 1) {\n const record = normalizeSnapshotRecord(recordsValue[index], index, snapshotPath);\n tableRecords.set(record.id, record);\n }\n return tableRecords;\n}\n\nasync function readLanceDbSnapshotStats(snapshotPath: string): Promise<{ mtimeMs: number; size: number } | null> {\n try {\n const stats = await stat(snapshotPath);\n return { mtimeMs: stats.mtimeMs, size: stats.size };\n } catch (error) {\n if (!isNodeErrorWithCode(error, \"ENOENT\")) {\n throw error;\n }\n return null;\n }\n}\n\nfunction resolveMissingLanceDbSnapshotCache(\n key: string,\n cached: LanceDbLocalTableCacheEntry | undefined,\n): Map<string, VectorRecord> | null {\n if (!cached) {\n return null;\n }\n if (cached.mtimeMs === null && cached.size === null && cached.records.size === 0) {\n return cached.records;\n }\n const loaded = new Map<string, VectorRecord>();\n lanceDbLocalTables.set(key, { records: loaded, mtimeMs: null, size: null });\n return loaded;\n}\n\nfunction cachedLanceDbSnapshotMatches(\n cached: LanceDbLocalTableCacheEntry | undefined,\n snapshotStats: { mtimeMs: number; size: number } | null,\n): cached is LanceDbLocalTableCacheEntry {\n return (\n cached !== undefined &&\n snapshotStats !== null &&\n cached.mtimeMs === snapshotStats.mtimeMs &&\n cached.size === snapshotStats.size\n );\n}\n\nasync function loadLanceDbLocalTable(storePath: string, table: string): Promise<Map<string, VectorRecord>> {\n const key = getLanceDbLocalTableKey(storePath, table);\n const snapshotPath = getLanceDbSnapshotPath(storePath, table);\n const snapshotStats = await readLanceDbSnapshotStats(snapshotPath);\n\n const cached = lanceDbLocalTables.get(key);\n if (!snapshotStats) {\n const resolved = resolveMissingLanceDbSnapshotCache(key, cached);\n if (resolved) {\n return resolved;\n }\n }\n if (cachedLanceDbSnapshotMatches(cached, snapshotStats)) {\n return cached.records;\n }\n\n let loaded = new Map<string, VectorRecord>();\n try {\n const raw = await readFile(snapshotPath, \"utf8\");\n loaded = parseLanceDbSnapshot(snapshotPath, table, raw);\n } catch (error) {\n if (!isNodeErrorWithCode(error, \"ENOENT\")) {\n throw error;\n }\n }\n lanceDbLocalTables.set(key, {\n records: loaded,\n mtimeMs: snapshotStats?.mtimeMs ?? null,\n size: snapshotStats?.size ?? null,\n });\n return loaded;\n}\n\nfunction buildSnapshotRecords(table: Map<string, VectorRecord>): VectorRecord[] {\n const records = [...table.values()];\n records.sort((left, right) => left.id.localeCompare(right.id));\n return records.map((record) => ({\n id: record.id,\n vector: [...record.vector],\n ...(record.payload ? { payload: record.payload } : {}),\n }));\n}\n\nasync function removeSnapshotFile(snapshotPath: string): Promise<void> {\n try {\n await unlink(snapshotPath);\n } catch (error) {\n if (!isNodeErrorWithCode(error, \"ENOENT\")) {\n throw new Error(`LanceDB local snapshot delete failed at '${snapshotPath}': ${toErrorMessage(error)}`);\n }\n }\n}\n\nasync function persistLanceDbLocalTable(storePath: string, tableName: string, table: Map<string, VectorRecord>): Promise<void> {\n const snapshotPath = getLanceDbSnapshotPath(storePath, tableName);\n if (table.size === 0) {\n await removeSnapshotFile(snapshotPath);\n return;\n }\n\n const snapshotDir = dirname(snapshotPath);\n try {\n await mkdir(snapshotDir, { recursive: true });\n } catch (error) {\n throw new Error(\n `LanceDB local snapshot directory create failed at '${snapshotDir}': ${toErrorMessage(error)}`,\n );\n }\n\n // Serialize compactly: the snapshot is an internal, gitignored cache re-read via\n // JSON.parse (whitespace-agnostic). Pretty-printing put every embedding float on its\n // own indented line, roughly doubling file size and parse/serialize cost — a real\n // per-mutation latency tax on large indexes. Compact JSON keeps it instant.\n const serialized = `${JSON.stringify({\n version: LANCE_DB_LOCAL_SNAPSHOT_VERSION,\n table: tableName,\n records: buildSnapshotRecords(table),\n })}\\n`;\n try {\n await writeFileAtomic(snapshotPath, serialized);\n } catch (error) {\n throw new Error(`LanceDB local snapshot write failed at '${snapshotPath}': ${toErrorMessage(error)}`);\n }\n}\n\nasync function resetLanceDbLocalTable(storePath: string, tableName: string): Promise<void> {\n const key = getLanceDbLocalTableKey(storePath, tableName);\n const snapshotPath = getLanceDbSnapshotPath(storePath, tableName);\n await removeSnapshotFile(snapshotPath);\n lanceDbLocalTables.delete(key);\n}\n\nfunction l2Norm(vector: number[]): number {\n let sumSq = 0;\n for (let index = 0; index < vector.length; index += 1) {\n sumSq += vector[index] * vector[index];\n }\n return Math.sqrt(sumSq);\n}\n\nfunction cosineSimilarity(left: number[], right: number[]): number {\n let dotProd = 0;\n for (let index = 0; index < left.length; index += 1) {\n dotProd += left[index] * right[index];\n }\n const leftNorm = l2Norm(left);\n const rightNorm = l2Norm(right);\n if (leftNorm === 0 || rightNorm === 0) {\n return 0;\n }\n return dotProd / (leftNorm * rightNorm);\n}\n\n/**\n * Implements resolve vector stores for the public runtime surface of this module.\n */\nexport function resolveVectorStores(settings: PmSettings | VectorSettingsInput, pmRoot?: string): VectorStoreResolution {\n const qdrant = resolveQdrantStore(settings);\n const lancedb = resolveLanceDbStore(settings, pmRoot);\n const available = [qdrant, lancedb].filter((entry): entry is VectorStoreConfig => entry !== null);\n // Honor `settings.vector_store.adapter` when set: if both built-in stores\n // are configured, the preferred adapter wins; otherwise fall back to the\n // first available entry (preserves the previous tie-break: qdrant > lancedb).\n // Match case-insensitively so \"Qdrant\" / \"LanceDB\" / \"lancedb\" all work.\n const preferredName = toNonEmptyString(\n (settings as { vector_store?: { adapter?: unknown } }).vector_store?.adapter,\n );\n const preferredKey = preferredName ? preferredName.toLowerCase() : null;\n const preferred = preferredKey\n ? available.find((entry) => entry.name === preferredKey)\n : undefined;\n return {\n active: preferred ?? available[0] ?? null,\n available,\n };\n}\n\n/**\n * Implements resolve vector store request target for the public runtime surface of this module.\n */\nexport function resolveVectorStoreRequestTarget(store: VectorStoreConfig): VectorStoreRequestTarget {\n const collectionName = resolveStoreCollectionName(store);\n if (store.name === \"qdrant\") {\n const baseUrl = trimTrailingSlashes(store.url);\n const encodedCollection = encodeURIComponent(collectionName);\n return {\n store: \"qdrant\",\n query_target: `${baseUrl}/collections/${encodedCollection}/points/search`,\n upsert_target: `${baseUrl}/collections/${encodedCollection}/points?wait=true`,\n };\n }\n const encodedPath = encodeURIComponent(store.path);\n const encodedCollection = encodeURIComponent(collectionName);\n return {\n store: \"lancedb\",\n query_target: `lancedb://${encodedPath}#${encodedCollection}`,\n upsert_target: `lancedb://${encodedPath}#${encodedCollection}`,\n };\n}\n\n/**\n * Implements build vector query plan for the public runtime surface of this module.\n */\nexport function buildVectorQueryPlan(store: VectorStoreConfig, vector: number[], limit: number): VectorQueryPlan {\n const target = resolveVectorStoreRequestTarget(store);\n const normalizedVector = normalizeVector(vector);\n const normalizedLimit = normalizeLimit(limit);\n if (store.name === \"qdrant\") {\n return {\n target,\n method: \"POST\",\n headers: buildQdrantJsonHeaders(store),\n body: {\n vector: normalizedVector,\n limit: normalizedLimit,\n with_payload: true,\n },\n };\n }\n return {\n target,\n method: \"LOCAL\",\n headers: {},\n body: {\n table: resolveStoreCollectionName(store),\n vector: normalizedVector,\n limit: normalizedLimit,\n },\n };\n}\n\n/**\n * Implements build vector upsert plan for the public runtime surface of this module.\n */\nexport function buildVectorUpsertPlan(store: VectorStoreConfig, records: VectorRecord[]): VectorUpsertPlan {\n const target = resolveVectorStoreRequestTarget(store);\n const normalizedRecords = normalizeVectorRecords(records);\n if (store.name === \"qdrant\") {\n return {\n target,\n method: \"POST\",\n headers: buildQdrantJsonHeaders(store),\n body: {\n points: normalizedRecords,\n },\n };\n }\n return {\n target,\n method: \"LOCAL\",\n headers: {},\n body: {\n table: resolveStoreCollectionName(store),\n records: normalizedRecords,\n },\n };\n}\n\n/**\n * Implements build vector delete plan for the public runtime surface of this module.\n */\nexport function buildVectorDeletePlan(store: VectorStoreConfig, ids: string[]): VectorDeletePlan {\n const target = resolveVectorStoreRequestTarget(store);\n const normalizedIds = normalizeVectorDeleteIds(ids);\n if (store.name === \"qdrant\") {\n return {\n target,\n method: \"POST\",\n headers: buildQdrantJsonHeaders(store),\n body: {\n points: normalizedIds,\n },\n };\n }\n return {\n target,\n method: \"LOCAL\",\n headers: {},\n body: {\n table: resolveStoreCollectionName(store),\n ids: normalizedIds,\n },\n };\n}\n\n/**\n * Implements execute vector query for the public runtime surface of this module.\n */\nexport async function executeVectorQuery(\n store: VectorStoreConfig,\n vector: number[],\n limit: number,\n options: ExecuteVectorRequestOptions = {},\n): Promise<VectorQueryHit[]> {\n const plan = buildVectorQueryPlan(store, vector, limit);\n if (plan.method === \"LOCAL\") {\n const lanceDbStore = store as LanceDbVectorStoreConfig;\n const queryBody = plan.body as {\n table: string;\n vector: number[];\n limit: number;\n };\n const table = await loadLanceDbLocalTable(lanceDbStore.path, queryBody.table);\n if (table.size === 0) {\n return [];\n }\n const queryVector = normalizeVector(queryBody.vector);\n const queryLimit = normalizeLimit(queryBody.limit);\n const hits: VectorQueryHit[] = [];\n let dimensionMismatchCount = 0;\n for (const record of table.values()) {\n if (record.vector.length !== queryVector.length) {\n dimensionMismatchCount++;\n continue;\n }\n hits.push({\n id: record.id,\n score: cosineSimilarity(queryVector, record.vector),\n ...(record.payload ? { payload: record.payload } : {}),\n });\n }\n if (dimensionMismatchCount > 0 && options.warnings) {\n options.warnings.push(\n `vector_dimension_mismatch:${dimensionMismatchCount} records skipped (expected ${queryVector.length} dimensions)`,\n );\n }\n hits.sort((left, right) => {\n if (left.score !== right.score) {\n return right.score - left.score;\n }\n return left.id.localeCompare(right.id);\n });\n return hits.slice(0, queryLimit);\n }\n const timeoutMs = normalizeSearchHttpTimeoutMs(options.timeout_ms, \"Vector request\");\n const fetcher = resolveSearchHttpFetcher(options.fetcher, \"Vector request\");\n const payload = await executeRemoteVectorPlan(\n plan.target.query_target,\n {\n method: \"POST\",\n headers: plan.headers,\n body: plan.body,\n },\n timeoutMs,\n fetcher,\n \"query\",\n );\n return normalizeQdrantQueryResponse(payload);\n}\n\n/**\n * Implements execute vector upsert for the public runtime surface of this module.\n */\nexport async function executeVectorUpsert(\n store: VectorStoreConfig,\n records: VectorRecord[],\n options: ExecuteVectorRequestOptions = {},\n): Promise<VectorUpsertResult> {\n const plan = buildVectorUpsertPlan(store, records);\n if (plan.method === \"LOCAL\") {\n const lanceDbStore = store as LanceDbVectorStoreConfig;\n const upsertBody = plan.body as {\n table: string;\n records: VectorRecord[];\n };\n const key = getLanceDbLocalTableKey(lanceDbStore.path, upsertBody.table);\n const table = await loadLanceDbLocalTable(lanceDbStore.path, upsertBody.table);\n for (const record of upsertBody.records) {\n table.set(record.id, record);\n }\n await persistLanceDbLocalTable(lanceDbStore.path, upsertBody.table, table);\n const snapshotPath = getLanceDbSnapshotPath(lanceDbStore.path, upsertBody.table);\n const snapshotStats = await stat(snapshotPath);\n lanceDbLocalTables.set(key, {\n records: table,\n mtimeMs: snapshotStats.mtimeMs,\n size: snapshotStats.size,\n });\n return { status: \"ok\" };\n }\n const timeoutMs = normalizeSearchHttpTimeoutMs(options.timeout_ms, \"Vector request\");\n const fetcher = resolveSearchHttpFetcher(options.fetcher, \"Vector request\");\n const payload = await executeRemoteVectorPlan(\n plan.target.upsert_target,\n {\n method: \"POST\",\n headers: plan.headers,\n body: plan.body,\n },\n timeoutMs,\n fetcher,\n \"upsert\",\n );\n return normalizeQdrantUpsertResponse(payload);\n}\n\n/**\n * Implements execute vector delete for the public runtime surface of this module.\n */\nexport async function executeVectorDelete(\n store: VectorStoreConfig,\n ids: string[],\n options: ExecuteVectorRequestOptions = {},\n): Promise<VectorUpsertResult> {\n const plan = buildVectorDeletePlan(store, ids);\n if (plan.method === \"LOCAL\") {\n const lanceDbStore = store as LanceDbVectorStoreConfig;\n const deleteBody = plan.body as {\n table: string;\n ids: string[];\n };\n const key = getLanceDbLocalTableKey(lanceDbStore.path, deleteBody.table);\n const table = await loadLanceDbLocalTable(lanceDbStore.path, deleteBody.table);\n if (table.size === 0) {\n return { status: \"ok\" };\n }\n for (const id of deleteBody.ids) {\n table.delete(id);\n }\n await persistLanceDbLocalTable(lanceDbStore.path, deleteBody.table, table);\n if (table.size === 0) {\n lanceDbLocalTables.delete(key);\n } else {\n const snapshotPath = getLanceDbSnapshotPath(lanceDbStore.path, deleteBody.table);\n const snapshotStats = await stat(snapshotPath);\n lanceDbLocalTables.set(key, {\n records: table,\n mtimeMs: snapshotStats.mtimeMs,\n size: snapshotStats.size,\n });\n }\n return { status: \"ok\" };\n }\n const timeoutMs = normalizeSearchHttpTimeoutMs(options.timeout_ms, \"Vector request\");\n const fetcher = resolveSearchHttpFetcher(options.fetcher, \"Vector request\");\n const payload = await executeRemoteVectorPlan(\n resolveQdrantDeleteTarget(plan.target.upsert_target),\n {\n method: \"POST\",\n headers: plan.headers,\n body: plan.body,\n },\n timeoutMs,\n fetcher,\n \"delete\",\n );\n return normalizeQdrantUpsertResponse(payload);\n}\n\n/**\n * Implements execute vector reset for the public runtime surface of this module.\n */\nexport async function executeVectorReset(\n store: VectorStoreConfig,\n knownIds: string[] = [],\n options: ExecuteVectorRequestOptions = {},\n vectorDimension?: number,\n): Promise<VectorUpsertResult> {\n if (store.name === \"lancedb\") {\n await resetLanceDbLocalTable(store.path, resolveStoreCollectionName(store));\n return { status: \"ok\" };\n }\n if (vectorDimension !== undefined) {\n if (!Number.isInteger(vectorDimension) || vectorDimension <= 0) {\n throw new Error(\"Vector reset dimension must be a positive integer when provided\");\n }\n const target = resolveVectorStoreRequestTarget(store);\n const collectionTarget = resolveQdrantCollectionTarget(target.upsert_target);\n const timeoutMs = normalizeSearchHttpTimeoutMs(options.timeout_ms, \"Vector request\");\n const fetcher = resolveSearchHttpFetcher(options.fetcher, \"Vector request\");\n const headers = buildQdrantJsonHeaders(store);\n try {\n await executeRemoteVectorPlan(\n collectionTarget,\n {\n method: \"DELETE\",\n headers,\n body: {},\n },\n timeoutMs,\n fetcher,\n \"delete\",\n );\n } catch (error: unknown) {\n if (!toErrorMessage(error).includes(\"failed with status 404\")) {\n throw error;\n }\n }\n const payload = await executeRemoteVectorPlan(\n collectionTarget,\n {\n method: \"PUT\",\n headers,\n body: {\n vectors: {\n size: vectorDimension,\n distance: \"Cosine\",\n },\n },\n },\n timeoutMs,\n fetcher,\n \"upsert\",\n );\n return normalizeQdrantUpsertResponse(payload);\n }\n const idsToDelete = knownIds.map((id) => id.trim()).filter((id) => id.length > 0);\n if (idsToDelete.length === 0) {\n return { status: \"ok\" };\n }\n return await executeVectorDelete(store, idsToDelete, options);\n}\n", "/**\n * @module core/search/vectorization-metadata\n *\n * Powers search, embeddings, and semantic retrieval behavior for Vectorization Metadata.\n */\nimport { toNonEmptyString } from \"../shared/primitives.js\";\n\n/**\n * Documents the vectorization embedding identity payload exchanged by command, SDK, and package integrations.\n */\nexport interface VectorizationEmbeddingIdentity {\n provider: string;\n model: string;\n}\n\n/**\n * Documents the vectorization embedding metadata payload exchanged by command, SDK, and package integrations.\n */\nexport interface VectorizationEmbeddingMetadata extends VectorizationEmbeddingIdentity {\n vector_dimension: number;\n}\n\n/**\n * Implements build vectorization embedding identity for the public runtime surface of this module.\n */\nexport function buildVectorizationEmbeddingIdentity(\n provider: unknown,\n model: unknown,\n): VectorizationEmbeddingIdentity | null {\n const normalizedProvider = toNonEmptyString(provider);\n const normalizedModel = toNonEmptyString(model);\n if (!normalizedProvider || !normalizedModel) {\n return null;\n }\n return {\n provider: normalizedProvider,\n model: normalizedModel,\n };\n}\n\n/**\n * Implements normalize vectorization embedding metadata for the public runtime surface of this module.\n */\nexport function normalizeVectorizationEmbeddingMetadata(value: unknown): VectorizationEmbeddingMetadata | null {\n if (value === undefined || value === null) {\n return null;\n }\n if (typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(\"Vectorization embedding metadata must be an object when set\");\n }\n const identity = buildVectorizationEmbeddingIdentity(\n (value as { provider?: unknown }).provider,\n (value as { model?: unknown }).model,\n );\n const vectorDimension = (value as { vector_dimension?: unknown }).vector_dimension;\n if (!identity || typeof vectorDimension !== \"number\" || !Number.isInteger(vectorDimension) || vectorDimension <= 0) {\n throw new Error(\"Vectorization embedding metadata must include provider, model, and positive vector_dimension\");\n }\n return {\n ...identity,\n vector_dimension: vectorDimension,\n };\n}\n\n/**\n * Implements build vectorization embedding metadata for the public runtime surface of this module.\n */\nexport function buildVectorizationEmbeddingMetadata(\n identity: VectorizationEmbeddingIdentity,\n vectorDimension: number,\n): VectorizationEmbeddingMetadata {\n if (!Number.isInteger(vectorDimension) || vectorDimension <= 0) {\n throw new Error(\"Vectorization embedding metadata requires a positive vector dimension\");\n }\n return {\n provider: identity.provider,\n model: identity.model,\n vector_dimension: vectorDimension,\n };\n}\n\n/**\n * Implements check whether vectorization embedding identity changed for the public runtime surface of this module.\n */\nexport function hasVectorizationEmbeddingIdentityChanged(\n metadata: VectorizationEmbeddingMetadata | null | undefined,\n identity: VectorizationEmbeddingIdentity,\n): boolean {\n return !metadata || metadata.provider !== identity.provider || metadata.model !== identity.model;\n}\n\n/**\n * Implements check whether vectorization vector dimension changed for the public runtime surface of this module.\n */\nexport function hasVectorizationVectorDimensionChanged(\n metadata: VectorizationEmbeddingMetadata | null | undefined,\n vectorDimension: number,\n): boolean {\n return Boolean(metadata && metadata.vector_dimension !== vectorDimension);\n}\n\n/**\n * Implements infer consistent vector dimension for the public runtime surface of this module.\n */\nexport function inferConsistentVectorDimension(vectors: readonly number[][], context: string): number {\n if (vectors.length === 0) {\n throw new Error(`${context} returned no vectors`);\n }\n const firstVector = vectors[0] as number[];\n const dimension = firstVector.length;\n if (!Number.isInteger(dimension) || dimension <= 0) {\n throw new Error(`${context} returned an empty vector`);\n }\n for (let index = 1; index < vectors.length; index += 1) {\n if (vectors[index]?.length !== dimension) {\n throw new Error(`${context} returned mixed vector dimensions`);\n }\n }\n return dimension;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["path", "resolve", "resolve", "encodedCollection", "path", "path", "semanticRefresh"]
|
|
7
|
+
}
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
normalizeStringList,
|
|
8
8
|
parseExtensionManifest,
|
|
9
9
|
validateExtensionDirectory
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-GZ365M6E.js";
|
|
11
11
|
import {
|
|
12
12
|
describeExtensionActivation,
|
|
13
13
|
renderExtensionSurfaceMarkdown
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
} from "./chunk-YSRXFGNV.js";
|
|
23
23
|
import {
|
|
24
24
|
PM_CORE_COMMAND_NAMES
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-NBJCIAVV.js";
|
|
26
26
|
import {
|
|
27
27
|
parseItemTypesFile,
|
|
28
28
|
serializeItemTypesFile,
|
|
@@ -6721,6 +6721,6 @@ export {
|
|
|
6721
6721
|
summarizeInitResult,
|
|
6722
6722
|
runInit
|
|
6723
6723
|
};
|
|
6724
|
-
//# sourceMappingURL=chunk-
|
|
6724
|
+
//# sourceMappingURL=chunk-P5SUMCU5.js.map
|
|
6725
6725
|
|
|
6726
6726
|
//# debugId=dd6181c4-91c1-58ac-92c2-ce5ae31a5816
|