@unbrained/pm-cli 2026.5.6 → 2026.5.11

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.
Files changed (268) hide show
  1. package/.agents/pm/extensions/.managed-extensions.json +2 -2
  2. package/.agents/pm/extensions/beads/runtime.js +4 -4
  3. package/.agents/pm/extensions/beads/runtime.ts +5 -5
  4. package/.agents/pm/extensions/todos/runtime.js +7 -7
  5. package/.agents/pm/extensions/todos/runtime.ts +10 -10
  6. package/.agents/skills/HARNESS_COMPATIBILITY.md +45 -0
  7. package/.agents/skills/README.md +21 -0
  8. package/.agents/skills/pm-developer/SKILL.md +73 -0
  9. package/.agents/skills/pm-developer/references/COMMAND_PLAYBOOK.md +48 -0
  10. package/.agents/skills/pm-developer/references/PROMPTS.md +17 -0
  11. package/.agents/skills/pm-extensions/SKILL.md +57 -0
  12. package/.agents/skills/pm-extensions/references/LIFECYCLE.md +40 -0
  13. package/.agents/skills/pm-extensions/references/TROUBLESHOOTING.md +25 -0
  14. package/.agents/skills/pm-sdk/SKILL.md +50 -0
  15. package/.agents/skills/pm-sdk/references/INTEGRATION_CHECKLIST.md +31 -0
  16. package/.agents/skills/pm-sdk/references/PROMPTS.md +13 -0
  17. package/.agents/skills/pm-user/SKILL.md +59 -0
  18. package/.agents/skills/pm-user/references/PROMPTS.md +17 -0
  19. package/.agents/skills/pm-user/references/WORKFLOWS.md +35 -0
  20. package/.claude-plugin/marketplace.json +38 -0
  21. package/.pi/README.md +35 -0
  22. package/.pi/agents/pm-triage-agent.md +19 -0
  23. package/.pi/agents/pm-verification-agent.md +21 -0
  24. package/.pi/chains/pm-native-delivery.chain.md +11 -0
  25. package/.pi/extensions/pm-cli/index.js +387 -0
  26. package/.pi/prompts/pm-workflow.md +5 -0
  27. package/.pi/skills/pm-native/SKILL.md +44 -0
  28. package/.pi/skills/pm-release/SKILL.md +35 -0
  29. package/AGENTS.md +1 -1
  30. package/CHANGELOG.md +13 -0
  31. package/PRD.md +16 -16
  32. package/README.md +30 -4
  33. package/dist/cli/argv-utils.d.ts +5 -0
  34. package/dist/cli/argv-utils.js +34 -0
  35. package/dist/cli/argv-utils.js.map +1 -0
  36. package/dist/cli/bootstrap-args.d.ts +15 -0
  37. package/dist/cli/bootstrap-args.js +211 -0
  38. package/dist/cli/bootstrap-args.js.map +1 -1
  39. package/dist/cli/commander-usage.js +109 -3
  40. package/dist/cli/commander-usage.js.map +1 -1
  41. package/dist/cli/commands/claim.js +6 -6
  42. package/dist/cli/commands/claim.js.map +1 -1
  43. package/dist/cli/commands/close.js +9 -9
  44. package/dist/cli/commands/close.js.map +1 -1
  45. package/dist/cli/commands/comments.d.ts +2 -0
  46. package/dist/cli/commands/comments.js +57 -8
  47. package/dist/cli/commands/comments.js.map +1 -1
  48. package/dist/cli/commands/completion.js +40 -7
  49. package/dist/cli/commands/completion.js.map +1 -1
  50. package/dist/cli/commands/config.js +6 -3
  51. package/dist/cli/commands/config.js.map +1 -1
  52. package/dist/cli/commands/contracts.d.ts +19 -0
  53. package/dist/cli/commands/contracts.js +36 -1
  54. package/dist/cli/commands/contracts.js.map +1 -1
  55. package/dist/cli/commands/create.d.ts +2 -2
  56. package/dist/cli/commands/create.js +116 -55
  57. package/dist/cli/commands/create.js.map +1 -1
  58. package/dist/cli/commands/docs.js +13 -6
  59. package/dist/cli/commands/docs.js.map +1 -1
  60. package/dist/cli/commands/extension.d.ts +3 -1
  61. package/dist/cli/commands/extension.js +174 -2
  62. package/dist/cli/commands/extension.js.map +1 -1
  63. package/dist/cli/commands/files.js +19 -12
  64. package/dist/cli/commands/files.js.map +1 -1
  65. package/dist/cli/commands/get.js +5 -5
  66. package/dist/cli/commands/get.js.map +1 -1
  67. package/dist/cli/commands/guide.d.ts +55 -0
  68. package/dist/cli/commands/guide.js +260 -0
  69. package/dist/cli/commands/guide.js.map +1 -0
  70. package/dist/cli/commands/health.js +1 -1
  71. package/dist/cli/commands/health.js.map +1 -1
  72. package/dist/cli/commands/history.js +30 -10
  73. package/dist/cli/commands/history.js.map +1 -1
  74. package/dist/cli/commands/index.d.ts +1 -0
  75. package/dist/cli/commands/index.js +1 -0
  76. package/dist/cli/commands/index.js.map +1 -1
  77. package/dist/cli/commands/init.d.ts +2 -0
  78. package/dist/cli/commands/init.js +21 -1
  79. package/dist/cli/commands/init.js.map +1 -1
  80. package/dist/cli/commands/learnings.js +3 -3
  81. package/dist/cli/commands/learnings.js.map +1 -1
  82. package/dist/cli/commands/metadata-normalizers.d.ts +4 -0
  83. package/dist/cli/commands/metadata-normalizers.js +37 -0
  84. package/dist/cli/commands/metadata-normalizers.js.map +1 -0
  85. package/dist/cli/commands/notes.js +3 -3
  86. package/dist/cli/commands/notes.js.map +1 -1
  87. package/dist/cli/commands/reindex.js +180 -156
  88. package/dist/cli/commands/reindex.js.map +1 -1
  89. package/dist/cli/commands/restore.d.ts +2 -2
  90. package/dist/cli/commands/restore.js +44 -24
  91. package/dist/cli/commands/restore.js.map +1 -1
  92. package/dist/cli/commands/search.d.ts +2 -0
  93. package/dist/cli/commands/search.js +45 -26
  94. package/dist/cli/commands/search.js.map +1 -1
  95. package/dist/cli/commands/test-all.d.ts +2 -0
  96. package/dist/cli/commands/test-all.js +2 -0
  97. package/dist/cli/commands/test-all.js.map +1 -1
  98. package/dist/cli/commands/test.d.ts +1 -0
  99. package/dist/cli/commands/test.js +13 -5
  100. package/dist/cli/commands/test.js.map +1 -1
  101. package/dist/cli/commands/update.js +188 -157
  102. package/dist/cli/commands/update.js.map +1 -1
  103. package/dist/cli/commands/validate.js +1 -1
  104. package/dist/cli/commands/validate.js.map +1 -1
  105. package/dist/cli/error-guidance.d.ts +9 -1
  106. package/dist/cli/error-guidance.js +147 -6
  107. package/dist/cli/error-guidance.js.map +1 -1
  108. package/dist/cli/guide-topics.d.ts +25 -0
  109. package/dist/cli/guide-topics.js +283 -0
  110. package/dist/cli/guide-topics.js.map +1 -0
  111. package/dist/cli/help-content.js +25 -1
  112. package/dist/cli/help-content.js.map +1 -1
  113. package/dist/cli/help-json-payload.js +11 -1
  114. package/dist/cli/help-json-payload.js.map +1 -1
  115. package/dist/cli/main.js +69 -6
  116. package/dist/cli/main.js.map +1 -1
  117. package/dist/cli/register-list-query.js +38 -1
  118. package/dist/cli/register-list-query.js.map +1 -1
  119. package/dist/cli/register-mutation.js +17 -4
  120. package/dist/cli/register-mutation.js.map +1 -1
  121. package/dist/cli/register-setup.js +15 -1
  122. package/dist/cli/register-setup.js.map +1 -1
  123. package/dist/cli/telemetry-flush.d.ts +2 -0
  124. package/dist/cli/telemetry-flush.js +4 -0
  125. package/dist/cli/telemetry-flush.js.map +1 -0
  126. package/dist/cli.js +1 -2
  127. package/dist/cli.js.map +1 -1
  128. package/dist/core/extensions/extension-types.d.ts +72 -0
  129. package/dist/core/extensions/extension-types.js +24 -0
  130. package/dist/core/extensions/extension-types.js.map +1 -1
  131. package/dist/core/extensions/loader.d.ts +1 -0
  132. package/dist/core/extensions/loader.js +766 -7
  133. package/dist/core/extensions/loader.js.map +1 -1
  134. package/dist/core/history/history.js +32 -11
  135. package/dist/core/history/history.js.map +1 -1
  136. package/dist/core/item/item-format.d.ts +2 -2
  137. package/dist/core/item/item-format.js +16 -16
  138. package/dist/core/item/item-format.js.map +1 -1
  139. package/dist/core/lock/lock.js +2 -0
  140. package/dist/core/lock/lock.js.map +1 -1
  141. package/dist/core/schema/runtime-field-filters.js +1 -1
  142. package/dist/core/schema/runtime-field-filters.js.map +1 -1
  143. package/dist/core/schema/runtime-field-values.js +2 -2
  144. package/dist/core/schema/runtime-field-values.js.map +1 -1
  145. package/dist/core/schema/runtime-schema.d.ts +1 -1
  146. package/dist/core/schema/runtime-schema.js +3 -3
  147. package/dist/core/schema/runtime-schema.js.map +1 -1
  148. package/dist/core/search/cache.js +7 -21
  149. package/dist/core/search/cache.js.map +1 -1
  150. package/dist/core/search/corpus.d.ts +13 -0
  151. package/dist/core/search/corpus.js +74 -0
  152. package/dist/core/search/corpus.js.map +1 -0
  153. package/dist/core/search/embedding-batches.js +90 -30
  154. package/dist/core/search/embedding-batches.js.map +1 -1
  155. package/dist/core/sentry/instrument.d.ts +18 -1
  156. package/dist/core/sentry/instrument.js +128 -12
  157. package/dist/core/sentry/instrument.js.map +1 -1
  158. package/dist/core/shared/constants.d.ts +1 -1
  159. package/dist/core/shared/constants.js +21 -1
  160. package/dist/core/shared/constants.js.map +1 -1
  161. package/dist/core/shared/errors.d.ts +8 -0
  162. package/dist/core/shared/errors.js.map +1 -1
  163. package/dist/core/shared/levenshtein.d.ts +1 -0
  164. package/dist/core/shared/levenshtein.js +37 -0
  165. package/dist/core/shared/levenshtein.js.map +1 -0
  166. package/dist/core/store/front-matter-cache.d.ts +1 -1
  167. package/dist/core/store/front-matter-cache.js +13 -13
  168. package/dist/core/store/front-matter-cache.js.map +1 -1
  169. package/dist/core/store/item-format-migration.js +5 -2
  170. package/dist/core/store/item-format-migration.js.map +1 -1
  171. package/dist/core/store/item-store.js +16 -15
  172. package/dist/core/store/item-store.js.map +1 -1
  173. package/dist/core/store/paths.js +35 -2
  174. package/dist/core/store/paths.js.map +1 -1
  175. package/dist/core/store/settings.js +216 -2
  176. package/dist/core/store/settings.js.map +1 -1
  177. package/dist/core/telemetry/runtime.d.ts +1 -0
  178. package/dist/core/telemetry/runtime.js +102 -3
  179. package/dist/core/telemetry/runtime.js.map +1 -1
  180. package/dist/core/test/item-test-run-tracking.js +2 -2
  181. package/dist/core/test/item-test-run-tracking.js.map +1 -1
  182. package/dist/mcp/server.d.ts +2 -0
  183. package/dist/mcp/server.js +407 -0
  184. package/dist/mcp/server.js.map +1 -0
  185. package/dist/pi/native.d.ts +5 -0
  186. package/dist/pi/native.js +236 -0
  187. package/dist/pi/native.js.map +1 -0
  188. package/dist/sdk/cli-contracts.d.ts +24 -2
  189. package/dist/sdk/cli-contracts.js +317 -2
  190. package/dist/sdk/cli-contracts.js.map +1 -1
  191. package/dist/sdk/index.d.ts +12 -1
  192. package/dist/sdk/index.js +8 -1
  193. package/dist/sdk/index.js.map +1 -1
  194. package/dist/types.d.ts +51 -2
  195. package/dist/types.js.map +1 -1
  196. package/docs/AGENT_GUIDE.md +15 -0
  197. package/docs/ARCHITECTURE.md +2 -2
  198. package/docs/CLAUDE_CODE_PLUGIN.md +225 -0
  199. package/docs/CODEX_PLUGIN.md +33 -0
  200. package/docs/COMMANDS.md +6 -2
  201. package/docs/CONFIGURATION.md +2 -8
  202. package/docs/EXTENSIONS.md +688 -0
  203. package/docs/MIGRATION_CLI_SIMPLIFICATION.md +64 -0
  204. package/docs/PI_PACKAGE.md +141 -0
  205. package/docs/QUICKSTART.md +1 -0
  206. package/docs/README.md +30 -1
  207. package/docs/RELEASING.md +4 -2
  208. package/docs/SDK.md +444 -2
  209. package/docs/examples/ci/github-actions-pm-extension-gate.yml +53 -0
  210. package/docs/examples/ci/gitlab-ci-pm-extension-gate.yml +41 -0
  211. package/docs/examples/ci/jenkins-pm-extension-gate.Jenkinsfile +45 -0
  212. package/docs/examples/policy-restricted-extension/README.md +74 -0
  213. package/docs/examples/policy-restricted-extension/index.js +21 -0
  214. package/docs/examples/policy-restricted-extension/manifest.json +21 -0
  215. package/docs/examples/policy-restricted-extension/package.json +8 -0
  216. package/docs/examples/sdk-app-embedding/README.md +39 -0
  217. package/docs/examples/sdk-app-embedding/package.json +9 -0
  218. package/docs/examples/sdk-app-embedding/run-embedded-pm.mjs +61 -0
  219. package/docs/examples/sdk-contract-consumer/README.md +57 -0
  220. package/docs/examples/sdk-contract-consumer/inspect-contracts.mjs +47 -0
  221. package/docs/examples/sdk-contract-consumer/package.json +10 -0
  222. package/docs/examples/starter-extension/README.md +57 -42
  223. package/docs/examples/starter-extension/manifest.json +15 -0
  224. package/marketplace.json +34 -0
  225. package/package.json +38 -4
  226. package/plugins/pm-cli-claude/.claude-plugin/plugin.json +23 -0
  227. package/plugins/pm-cli-claude/.mcp.json +12 -0
  228. package/plugins/pm-cli-claude/README.md +225 -0
  229. package/plugins/pm-cli-claude/agents/pm-coordinator.md +48 -0
  230. package/plugins/pm-cli-claude/agents/pm-delivery-chain.md +88 -0
  231. package/plugins/pm-cli-claude/agents/pm-triage-agent.md +83 -0
  232. package/plugins/pm-cli-claude/agents/pm-verification-agent.md +88 -0
  233. package/plugins/pm-cli-claude/commands/pm-audit.md +39 -0
  234. package/plugins/pm-cli-claude/commands/pm-calendar.md +41 -0
  235. package/plugins/pm-cli-claude/commands/pm-close-task.md +20 -0
  236. package/plugins/pm-cli-claude/commands/pm-developer.md +38 -0
  237. package/plugins/pm-cli-claude/commands/pm-init.md +44 -0
  238. package/plugins/pm-cli-claude/commands/pm-list.md +39 -0
  239. package/plugins/pm-cli-claude/commands/pm-new.md +36 -0
  240. package/plugins/pm-cli-claude/commands/pm-planner.md +51 -0
  241. package/plugins/pm-cli-claude/commands/pm-release.md +41 -0
  242. package/plugins/pm-cli-claude/commands/pm-search.md +21 -0
  243. package/plugins/pm-cli-claude/commands/pm-start-task.md +27 -0
  244. package/plugins/pm-cli-claude/commands/pm-status.md +15 -0
  245. package/plugins/pm-cli-claude/commands/pm-triage.md +35 -0
  246. package/plugins/pm-cli-claude/commands/pm-workflow.md +49 -0
  247. package/plugins/pm-cli-claude/hooks/hooks.json +17 -0
  248. package/plugins/pm-cli-claude/hooks/session-start.mjs +120 -0
  249. package/plugins/pm-cli-claude/scripts/pm-mcp-server.mjs +60 -0
  250. package/plugins/pm-cli-claude/skills/pm-audit/SKILL.md +88 -0
  251. package/plugins/pm-cli-claude/skills/pm-developer/SKILL.md +116 -0
  252. package/plugins/pm-cli-claude/skills/pm-planner/SKILL.md +118 -0
  253. package/plugins/pm-cli-claude/skills/pm-release/SKILL.md +83 -0
  254. package/plugins/pm-cli-claude/skills/pm-workflow/SKILL.md +148 -0
  255. package/plugins/pm-cli-codex/.codex-plugin/plugin.json +45 -0
  256. package/plugins/pm-cli-codex/.mcp.json +14 -0
  257. package/plugins/pm-cli-codex/README.md +30 -0
  258. package/plugins/pm-cli-codex/assets/pm-cli-small.svg +4 -0
  259. package/plugins/pm-cli-codex/commands/pm-audit.md +8 -0
  260. package/plugins/pm-cli-codex/commands/pm-close-task.md +9 -0
  261. package/plugins/pm-cli-codex/commands/pm-start-task.md +9 -0
  262. package/plugins/pm-cli-codex/scripts/pm-mcp-server.mjs +54 -0
  263. package/plugins/pm-cli-codex/skills/pm-auditor/SKILL.md +21 -0
  264. package/plugins/pm-cli-codex/skills/pm-auditor/agents/openai.yaml +6 -0
  265. package/plugins/pm-cli-codex/skills/pm-native/SKILL.md +57 -0
  266. package/plugins/pm-cli-codex/skills/pm-native/agents/openai.yaml +6 -0
  267. package/plugins/pm-cli-codex/skills/pm-release/SKILL.md +19 -0
  268. package/plugins/pm-cli-codex/skills/pm-release/agents/openai.yaml +6 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"corpus.js","sourceRoot":"/","sources":["core/search/corpus.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ItemDocument, ItemMetadata } from \"../../types/index.js\";\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]\";\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\nexport function buildReminderCorpus(item: ItemMetadata): string[] {\n return (item.reminders ?? []).map((reminder) => compactParts([reminder.at, reminder.text]));\n}\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\nexport function buildSearchCorpus(document: ItemDocument): Record<string, unknown> {\n const item = document.metadata;\n return {\n title: item.title,\n description: item.description,\n tags: item.tags,\n status: item.status,\n body: document.body,\n comments: (item.comments ?? []).map((entry) => entry.text),\n notes: (item.notes ?? []).map((entry) => entry.text),\n learnings: (item.learnings ?? []).map((entry) => entry.text),\n reminders: buildReminderCorpus(item),\n events: buildEventCorpus(item),\n dependencies: (item.dependencies ?? []).map((entry) => ({\n id: entry.id,\n kind: entry.kind,\n })),\n };\n}\n\nfunction resolveSemanticCorpusInputMaxCharacters(candidate: number | undefined): number {\n if (Number.isFinite(candidate) && Number(candidate) > 0) {\n return Math.floor(Number(candidate));\n }\n return DEFAULT_SEMANTIC_CORPUS_INPUT_MAX_CHARACTERS;\n}\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\nexport interface SemanticCorpusInputOptions {\n providerName?: string;\n maxCharacters?: number;\n}\n\nexport function buildSemanticCorpusInput(document: ItemDocument, options: SemanticCorpusInputOptions = {}): string {\n const serialized = JSON.stringify(buildSearchCorpus(document));\n const maxCharacters = resolveSemanticCorpusInputMaxCharacters(\n options.maxCharacters ?? resolveSemanticCorpusInputCharacterLimit(options.providerName),\n );\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"]}
@@ -1,18 +1,89 @@
1
1
  import { executeEmbeddingRequest } from "./providers.js";
2
+ import { toErrorMessage } from "../shared/primitives.js";
3
+ import { DEFAULT_SEMANTIC_CORPUS_INPUT_MAX_CHARACTERS, OLLAMA_SEMANTIC_CORPUS_INPUT_MAX_CHARACTERS, SEMANTIC_CORPUS_TRUNCATION_SUFFIX, } from "./corpus.js";
2
4
  function resolveBatchRuntime(settings) {
3
5
  const batchSizeCandidate = settings.search.embedding_batch_size;
4
6
  const maxRetriesCandidate = settings.search.scanner_max_batch_retries;
5
7
  const batchSize = Number.isFinite(batchSizeCandidate) && batchSizeCandidate > 0 ? Math.floor(batchSizeCandidate) : 1;
6
8
  const maxRetries = Number.isFinite(maxRetriesCandidate) && maxRetriesCandidate >= 0 ? Math.floor(maxRetriesCandidate) : 0;
7
- return { batchSize, maxRetries };
9
+ return {
10
+ batchSize,
11
+ maxRetries,
12
+ maxBatchInputCharacters: Number.POSITIVE_INFINITY,
13
+ maxInputCharacters: DEFAULT_SEMANTIC_CORPUS_INPUT_MAX_CHARACTERS,
14
+ };
8
15
  }
9
- function createBatches(inputs, batchSize) {
16
+ function createBatches(inputs, batchSize, maxBatchInputCharacters) {
10
17
  const batches = [];
11
- for (let index = 0; index < inputs.length; index += batchSize) {
12
- batches.push(inputs.slice(index, index + batchSize));
18
+ let currentBatch = [];
19
+ let currentCharacters = 0;
20
+ for (const input of inputs) {
21
+ const wouldExceedCount = currentBatch.length >= batchSize;
22
+ const wouldExceedCharacters = currentBatch.length > 0 &&
23
+ Number.isFinite(maxBatchInputCharacters) &&
24
+ currentCharacters + input.length > maxBatchInputCharacters;
25
+ if (wouldExceedCount || wouldExceedCharacters) {
26
+ batches.push(currentBatch);
27
+ currentBatch = [];
28
+ currentCharacters = 0;
29
+ }
30
+ currentBatch.push(input);
31
+ currentCharacters += input.length;
13
32
  }
33
+ batches.push(currentBatch);
14
34
  return batches;
15
35
  }
36
+ function resolveProviderBatchRuntime(provider, runtime) {
37
+ if (provider.name !== "ollama") {
38
+ return runtime;
39
+ }
40
+ return {
41
+ ...runtime,
42
+ maxBatchInputCharacters: OLLAMA_SEMANTIC_CORPUS_INPUT_MAX_CHARACTERS,
43
+ maxInputCharacters: OLLAMA_SEMANTIC_CORPUS_INPUT_MAX_CHARACTERS,
44
+ };
45
+ }
46
+ function truncateInputForRuntime(input, maxInputCharacters) {
47
+ if (!Number.isFinite(maxInputCharacters) || maxInputCharacters <= 0 || input.length <= maxInputCharacters) {
48
+ return input;
49
+ }
50
+ const keepLength = Math.max(0, maxInputCharacters - SEMANTIC_CORPUS_TRUNCATION_SUFFIX.length);
51
+ return `${input.slice(0, keepLength)}${SEMANTIC_CORPUS_TRUNCATION_SUFFIX}`.slice(0, maxInputCharacters);
52
+ }
53
+ function isEmbeddingTimeoutError(error) {
54
+ const message = toErrorMessage(error).toLowerCase();
55
+ return message.includes("timed out") || message.includes("timeout");
56
+ }
57
+ async function executeBatchWithAdaptiveSplit(provider, batch, batchLabel, maxRetries, warnings) {
58
+ let lastError = null;
59
+ for (let attempt = 0; attempt <= maxRetries; attempt += 1) {
60
+ try {
61
+ const batchVectors = await executeEmbeddingRequest(provider, batch);
62
+ if (attempt > 0) {
63
+ warnings.push(`search_embedding_batch_retry_succeeded:batch=${batchLabel}:attempt=${attempt + 1}:size=${batch.length}`);
64
+ }
65
+ return batchVectors;
66
+ }
67
+ catch (error) {
68
+ lastError = error;
69
+ if (isEmbeddingTimeoutError(error) && batch.length > 1) {
70
+ const midpoint = Math.ceil(batch.length / 2);
71
+ const left = batch.slice(0, midpoint);
72
+ const right = batch.slice(midpoint);
73
+ warnings.push(`search_embedding_batch_split_after_timeout:batch=${batchLabel}:size=${batch.length}:parts=${left.length}|${right.length}`);
74
+ return [
75
+ ...(await executeBatchWithAdaptiveSplit(provider, left, `${batchLabel}.1`, maxRetries, warnings)),
76
+ ...(await executeBatchWithAdaptiveSplit(provider, right, `${batchLabel}.2`, maxRetries, warnings)),
77
+ ];
78
+ }
79
+ if (attempt < maxRetries) {
80
+ const delayMs = Math.min(1000 * 2 ** attempt, 8000);
81
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
82
+ }
83
+ }
84
+ }
85
+ throw new Error(`Embedding batch ${batchLabel} failed after ${maxRetries + 1} attempt(s): ${toErrorMessage(lastError)}`);
86
+ }
16
87
  export async function executeEmbeddingBatchesWithRetry(provider, settings, inputs) {
17
88
  if (inputs.length === 0) {
18
89
  return {
@@ -20,35 +91,24 @@ export async function executeEmbeddingBatchesWithRetry(provider, settings, input
20
91
  warnings: [],
21
92
  };
22
93
  }
23
- const runtime = resolveBatchRuntime(settings);
24
- const batches = createBatches(inputs, runtime.batchSize);
25
- const vectors = [];
94
+ const runtime = resolveProviderBatchRuntime(provider, resolveBatchRuntime(settings));
26
95
  const warnings = [];
96
+ let truncatedInputCount = 0;
97
+ const normalizedInputs = inputs.map((input) => {
98
+ const normalized = truncateInputForRuntime(input, runtime.maxInputCharacters);
99
+ if (normalized.length < input.length) {
100
+ truncatedInputCount += 1;
101
+ }
102
+ return normalized;
103
+ });
104
+ if (truncatedInputCount > 0) {
105
+ warnings.push(`search_embedding_input_truncated:count=${truncatedInputCount}:max_characters=${runtime.maxInputCharacters}`);
106
+ }
107
+ const batches = createBatches(normalizedInputs, runtime.batchSize, runtime.maxBatchInputCharacters);
108
+ const vectors = [];
27
109
  for (let batchIndex = 0; batchIndex < batches.length; batchIndex += 1) {
28
110
  const batch = batches[batchIndex];
29
- let success = false;
30
- let lastError = null;
31
- for (let attempt = 0; attempt <= runtime.maxRetries; attempt += 1) {
32
- try {
33
- const batchVectors = await executeEmbeddingRequest(provider, batch);
34
- vectors.push(...batchVectors);
35
- if (attempt > 0) {
36
- warnings.push(`search_embedding_batch_retry_succeeded:batch=${batchIndex + 1}:attempt=${attempt + 1}:size=${batch.length}`);
37
- }
38
- success = true;
39
- break;
40
- }
41
- catch (error) {
42
- lastError = error;
43
- if (attempt < runtime.maxRetries) {
44
- const delayMs = Math.min(1000 * 2 ** attempt, 8000);
45
- await new Promise((resolve) => setTimeout(resolve, delayMs));
46
- }
47
- }
48
- }
49
- if (!success) {
50
- throw new Error(`Embedding batch ${batchIndex + 1} failed after ${runtime.maxRetries + 1} attempt(s): ${String(lastError)}`);
51
- }
111
+ vectors.push(...(await executeBatchWithAdaptiveSplit(provider, batch, String(batchIndex + 1), runtime.maxRetries, warnings)));
52
112
  }
53
113
  return {
54
114
  vectors,
@@ -1 +1 @@
1
- {"version":3,"file":"embedding-batches.js","sourceRoot":"/","sources":["core/search/embedding-batches.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PmSettings } from \"../../types/index.js\";\nimport { executeEmbeddingRequest } from \"./providers.js\";\nimport type { EmbeddingProviderConfig } from \"./providers.js\";\n\nexport interface EmbeddingBatchExecutionResult {\n vectors: number[][];\n warnings: string[];\n}\n\ninterface EmbeddingBatchRuntime {\n batchSize: number;\n maxRetries: number;\n}\n\nfunction resolveBatchRuntime(settings: PmSettings): EmbeddingBatchRuntime {\n const batchSizeCandidate = settings.search.embedding_batch_size;\n const maxRetriesCandidate = settings.search.scanner_max_batch_retries;\n const batchSize = Number.isFinite(batchSizeCandidate) && batchSizeCandidate > 0 ? Math.floor(batchSizeCandidate) : 1;\n const maxRetries = Number.isFinite(maxRetriesCandidate) && maxRetriesCandidate >= 0 ? Math.floor(maxRetriesCandidate) : 0;\n return { batchSize, maxRetries };\n}\n\nfunction createBatches(inputs: string[], batchSize: number): string[][] {\n const batches: string[][] = [];\n for (let index = 0; index < inputs.length; index += batchSize) {\n batches.push(inputs.slice(index, index + batchSize));\n }\n return batches;\n}\n\nexport async function executeEmbeddingBatchesWithRetry(\n provider: EmbeddingProviderConfig,\n settings: PmSettings,\n inputs: string[],\n): Promise<EmbeddingBatchExecutionResult> {\n if (inputs.length === 0) {\n return {\n vectors: [],\n warnings: [],\n };\n }\n const runtime = resolveBatchRuntime(settings);\n const batches = createBatches(inputs, runtime.batchSize);\n const vectors: number[][] = [];\n const warnings: string[] = [];\n for (let batchIndex = 0; batchIndex < batches.length; batchIndex += 1) {\n const batch = batches[batchIndex];\n let success = false;\n let lastError: unknown = null;\n for (let attempt = 0; attempt <= runtime.maxRetries; attempt += 1) {\n try {\n const batchVectors = await executeEmbeddingRequest(provider, batch);\n vectors.push(...batchVectors);\n if (attempt > 0) {\n warnings.push(\n `search_embedding_batch_retry_succeeded:batch=${batchIndex + 1}:attempt=${attempt + 1}:size=${batch.length}`,\n );\n }\n success = true;\n break;\n } catch (error: unknown) {\n lastError = error;\n if (attempt < runtime.maxRetries) {\n const delayMs = Math.min(1000 * 2 ** attempt, 8000);\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n }\n if (!success) {\n throw new Error(\n `Embedding batch ${batchIndex + 1} failed after ${runtime.maxRetries + 1} attempt(s): ${String(lastError)}`,\n );\n }\n }\n return {\n vectors,\n warnings,\n };\n}\n"]}
1
+ {"version":3,"file":"embedding-batches.js","sourceRoot":"/","sources":["core/search/embedding-batches.ts"],"names":[],"mappings":"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","sourcesContent":["import 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 DEFAULT_SEMANTIC_CORPUS_INPUT_MAX_CHARACTERS,\n OLLAMA_SEMANTIC_CORPUS_INPUT_MAX_CHARACTERS,\n SEMANTIC_CORPUS_TRUNCATION_SUFFIX,\n} from \"./corpus.js\";\n\nexport interface EmbeddingBatchExecutionResult {\n vectors: number[][];\n warnings: string[];\n}\n\ninterface EmbeddingBatchRuntime {\n batchSize: number;\n maxRetries: number;\n maxBatchInputCharacters: number;\n maxInputCharacters: number;\n}\n\nfunction resolveBatchRuntime(settings: PmSettings): EmbeddingBatchRuntime {\n const batchSizeCandidate = settings.search.embedding_batch_size;\n const maxRetriesCandidate = settings.search.scanner_max_batch_retries;\n const batchSize = Number.isFinite(batchSizeCandidate) && batchSizeCandidate > 0 ? Math.floor(batchSizeCandidate) : 1;\n const maxRetries = Number.isFinite(maxRetriesCandidate) && maxRetriesCandidate >= 0 ? Math.floor(maxRetriesCandidate) : 0;\n return {\n batchSize,\n maxRetries,\n maxBatchInputCharacters: Number.POSITIVE_INFINITY,\n maxInputCharacters: DEFAULT_SEMANTIC_CORPUS_INPUT_MAX_CHARACTERS,\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 maxInputCharacters: 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\nasync function executeBatchWithAdaptiveSplit(\n provider: EmbeddingProviderConfig,\n batch: string[],\n batchLabel: string,\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);\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`, maxRetries, warnings)),\n ...(await executeBatchWithAdaptiveSplit(provider, right, `${batchLabel}.2`, 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(`Embedding batch ${batchLabel} failed after ${maxRetries + 1} attempt(s): ${toErrorMessage(lastError)}`);\n}\n\nexport async function executeEmbeddingBatchesWithRetry(\n provider: EmbeddingProviderConfig,\n settings: PmSettings,\n inputs: string[],\n): Promise<EmbeddingBatchExecutionResult> {\n if (inputs.length === 0) {\n return {\n vectors: [],\n warnings: [],\n };\n }\n const runtime = resolveProviderBatchRuntime(provider, resolveBatchRuntime(settings));\n const warnings: string[] = [];\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 for (let batchIndex = 0; batchIndex < batches.length; batchIndex += 1) {\n const batch = batches[batchIndex];\n vectors.push(...(await executeBatchWithAdaptiveSplit(provider, batch, String(batchIndex + 1), runtime.maxRetries, warnings)));\n }\n return {\n vectors,\n warnings,\n };\n}\n"]}
@@ -1,5 +1,15 @@
1
- declare function scrubString(value: string): string;
1
+ declare function scrubString(value: string, keyHint?: string): string;
2
+ declare function scrubEventData(obj: Record<string, unknown>): Record<string, unknown>;
2
3
  type SentryLike = typeof import("@sentry/node");
4
+ declare function isKnownNoisyConsoleEvent(event: {
5
+ logger?: string;
6
+ message?: string;
7
+ exception?: {
8
+ values?: Array<{
9
+ value?: string;
10
+ }>;
11
+ };
12
+ }): boolean;
3
13
  declare function isExpectedCliErrorEvent(event: {
4
14
  exception?: {
5
15
  values?: Array<{
@@ -15,11 +25,18 @@ declare function isPmCliErrorBreadcrumb(breadcrumb: {
15
25
  category?: string;
16
26
  message?: string;
17
27
  }): boolean;
28
+ declare function isKnownNoisyConsoleBreadcrumb(breadcrumb: {
29
+ category?: string;
30
+ message?: string;
31
+ }): boolean;
18
32
  export declare function ensureSentryInit(): Promise<SentryLike | undefined>;
19
33
  export declare function getSentry(): SentryLike | undefined;
20
34
  export declare const _testOnly: {
21
35
  isExpectedCliErrorEvent: typeof isExpectedCliErrorEvent;
36
+ isKnownNoisyConsoleEvent: typeof isKnownNoisyConsoleEvent;
22
37
  isPmCliErrorBreadcrumb: typeof isPmCliErrorBreadcrumb;
38
+ isKnownNoisyConsoleBreadcrumb: typeof isKnownNoisyConsoleBreadcrumb;
23
39
  scrubString: typeof scrubString;
40
+ scrubEventData: typeof scrubEventData;
24
41
  };
25
42
  export {};
@@ -14,16 +14,47 @@ function isSentryDisabled() {
14
14
  const SENSITIVE_KEY_PATTERN = /(?:token|secret|password|passwd|api[_-]?key|apikey|authorization|cookie|credentials|bearer|dsn)/i;
15
15
  const INLINE_SENSITIVE_ASSIGNMENT_RE = new RegExp(`\\b(${SENSITIVE_KEY_PATTERN.source})\\s*[:=]\\s*([^\\s,;]+)`, "giu");
16
16
  const ABSOLUTE_PATH_TOKEN_RE = /(^|[\s"'`(=])\/(?:[^\s"'`),;]+)/g;
17
+ const FILE_URL_PATH_RE = /file:\/\/\/?[^\s"'`),;]+/giu;
18
+ const WINDOWS_PATH_TOKEN_RE = /\b[A-Za-z]:\\[^\s"'`),;]+/g;
17
19
  const PRIVATE_IP_RE = /\b(?:10\.(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.(?:25[0-5]|2[0-4]\d|[01]?\d?\d)|172\.(?:1[6-9]|2\d|3[01])\.(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.(?:25[0-5]|2[0-4]\d|[01]?\d?\d)|192\.168\.(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.(?:25[0-5]|2[0-4]\d|[01]?\d?\d))\b/g;
18
- function scrubString(value) {
20
+ const PATH_FIELD_KEY_PATTERN = /(?:^|[_-])(path|filename|file|module|cwd|dir|directory|location|source|script)s?$/i;
21
+ const KNOWN_NOISY_CONSOLE_MESSAGE_PATTERNS = [
22
+ "[starter-extension] activating",
23
+ "[starter-extension] all 8 capabilities registered.",
24
+ "[starter-extension] commands:",
25
+ "[starter] preflight check for workspace",
26
+ "[starter] output_format service override active",
27
+ "[pm-ext-ts-starter] activating",
28
+ "[pm-ext-ts-starter] all capabilities registered.",
29
+ "run `pm init` first to initialise a pm workspace",
30
+ ];
31
+ function looksLikeFilesystemPath(value) {
32
+ const normalized = value.trim();
33
+ if (normalized.length === 0) {
34
+ return false;
35
+ }
36
+ if (normalized.startsWith("/") || normalized.startsWith("file://")) {
37
+ return true;
38
+ }
39
+ if (/^[A-Za-z]:\\/.test(normalized) || normalized.startsWith("\\\\")) {
40
+ return true;
41
+ }
42
+ return normalized.includes("/home/");
43
+ }
44
+ function scrubString(value, keyHint) {
45
+ if (keyHint && PATH_FIELD_KEY_PATTERN.test(keyHint) && looksLikeFilesystemPath(value)) {
46
+ return "[scrubbed_path]";
47
+ }
19
48
  const scrubbed = value
20
49
  .replaceAll(INLINE_SENSITIVE_ASSIGNMENT_RE, (_m, key) => `${key}=[scrubbed]`)
21
50
  .replaceAll(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/giu, "[scrubbed_email]")
22
51
  .replaceAll(/bearer\s+[a-z0-9._=-]+/giu, "bearer [scrubbed]")
23
52
  .replaceAll(/sntr[ysu]_[A-Za-z0-9_-]+/g, "[scrubbed_sentry_token]")
24
53
  .replaceAll(PRIVATE_IP_RE, "[scrubbed_ip]")
54
+ .replaceAll(FILE_URL_PATH_RE, "[scrubbed_path]")
55
+ .replaceAll(WINDOWS_PATH_TOKEN_RE, "[scrubbed_path]")
25
56
  .replaceAll(ABSOLUTE_PATH_TOKEN_RE, (_match, prefix) => `${prefix}[scrubbed_path]`);
26
- if (scrubbed.trim().startsWith("/") && scrubbed.trim().length > 1) {
57
+ if (looksLikeFilesystemPath(scrubbed)) {
27
58
  return "[scrubbed_path]";
28
59
  }
29
60
  return scrubbed;
@@ -35,7 +66,21 @@ function scrubEventData(obj) {
35
66
  result[key] = "[scrubbed]";
36
67
  }
37
68
  else if (typeof value === "string") {
38
- result[key] = scrubString(value);
69
+ result[key] = scrubString(value, key);
70
+ }
71
+ else if (Array.isArray(value)) {
72
+ result[key] = value.map((entry) => {
73
+ if (typeof entry === "string") {
74
+ return scrubString(entry, key);
75
+ }
76
+ if (entry && typeof entry === "object") {
77
+ return scrubEventData(entry);
78
+ }
79
+ return entry;
80
+ });
81
+ }
82
+ else if (value && typeof value === "object") {
83
+ result[key] = scrubEventData(value);
39
84
  }
40
85
  else {
41
86
  result[key] = value;
@@ -43,12 +88,54 @@ function scrubEventData(obj) {
43
88
  }
44
89
  return result;
45
90
  }
91
+ function scrubStackFrame(frame) {
92
+ for (const key of ["filename", "absPath", "abs_path", "module"]) {
93
+ const rawValue = frame[key];
94
+ if (typeof rawValue === "string") {
95
+ frame[key] = scrubString(rawValue, key);
96
+ }
97
+ }
98
+ const contextLine = frame.context_line;
99
+ if (typeof contextLine === "string") {
100
+ frame.context_line = scrubString(contextLine, "context_line");
101
+ }
102
+ for (const key of ["pre_context", "post_context"]) {
103
+ const context = frame[key];
104
+ if (!Array.isArray(context)) {
105
+ continue;
106
+ }
107
+ frame[key] = context.map((entry) => (typeof entry === "string" ? scrubString(entry, key) : entry));
108
+ }
109
+ if (frame.vars && typeof frame.vars === "object") {
110
+ frame.vars = scrubEventData(frame.vars);
111
+ }
112
+ if (frame.data && typeof frame.data === "object") {
113
+ frame.data = scrubEventData(frame.data);
114
+ }
115
+ }
46
116
  let _sentry;
47
117
  let _initDone = false;
48
118
  const PM_CLI_SENTRY_DSN = "https://bf7ad2ec76c0051c2ee94e48e8bd6868@o4510603477712896.ingest.de.sentry.io/4511316775338064";
49
119
  function hasPmCliErrorPrefix(value) {
50
120
  return /^\s*PmCliError:/.test(value);
51
121
  }
122
+ function isKnownNoisyConsoleMessage(value) {
123
+ const normalized = value.trim().toLowerCase();
124
+ if (normalized.length === 0) {
125
+ return false;
126
+ }
127
+ return KNOWN_NOISY_CONSOLE_MESSAGE_PATTERNS.some((pattern) => normalized.includes(pattern));
128
+ }
129
+ function isKnownNoisyConsoleEvent(event) {
130
+ if (event.logger !== "console") {
131
+ return false;
132
+ }
133
+ if (typeof event.message === "string" && isKnownNoisyConsoleMessage(event.message)) {
134
+ return true;
135
+ }
136
+ return (Array.isArray(event.exception?.values) &&
137
+ event.exception.values.some((entry) => typeof entry.value === "string" && isKnownNoisyConsoleMessage(entry.value)));
138
+ }
52
139
  function isExpectedCliErrorEvent(event) {
53
140
  if (event.exception?.values?.some((ex) => ex.type === "PmCliError"))
54
141
  return true;
@@ -63,6 +150,9 @@ function isPmCliErrorBreadcrumb(breadcrumb) {
63
150
  typeof breadcrumb.message === "string" &&
64
151
  hasPmCliErrorPrefix(breadcrumb.message));
65
152
  }
153
+ function isKnownNoisyConsoleBreadcrumb(breadcrumb) {
154
+ return breadcrumb.category === "console" && typeof breadcrumb.message === "string" && isKnownNoisyConsoleMessage(breadcrumb.message);
155
+ }
66
156
  function resolveCliVersion() {
67
157
  try {
68
158
  const thisFile = fileURLToPath(import.meta.url);
@@ -128,19 +218,23 @@ export async function ensureSentryInit() {
128
218
  },
129
219
  },
130
220
  beforeSend(event) {
131
- if (isExpectedCliErrorEvent(event)) {
221
+ if (isExpectedCliErrorEvent(event) || isKnownNoisyConsoleEvent(event)) {
132
222
  return null;
133
223
  }
224
+ if (event.message) {
225
+ event.message = scrubString(event.message, "message");
226
+ }
227
+ if (event.transaction) {
228
+ event.transaction = scrubString(event.transaction, "transaction");
229
+ }
134
230
  if (event.exception?.values) {
135
231
  for (const exception of event.exception.values) {
136
232
  if (exception.value) {
137
- exception.value = scrubString(exception.value);
233
+ exception.value = scrubString(exception.value, "value");
138
234
  }
139
235
  if (exception.stacktrace?.frames) {
140
236
  for (const frame of exception.stacktrace.frames) {
141
- if (frame.vars) {
142
- frame.vars = scrubEventData(frame.vars);
143
- }
237
+ scrubStackFrame(frame);
144
238
  }
145
239
  }
146
240
  }
@@ -165,25 +259,44 @@ export async function ensureSentryInit() {
165
259
  }
166
260
  }
167
261
  }
262
+ if (event.request && typeof event.request === "object") {
263
+ event.request = scrubEventData(event.request);
264
+ }
265
+ if (event.user && typeof event.user === "object") {
266
+ event.user = scrubEventData(event.user);
267
+ }
268
+ if (event.tags && typeof event.tags === "object") {
269
+ event.tags = scrubEventData(event.tags);
270
+ }
168
271
  return event;
169
272
  },
170
273
  beforeSendTransaction(event) {
171
274
  if (event.breadcrumbs) {
172
- event.breadcrumbs = event.breadcrumbs.filter((bc) => !isPmCliErrorBreadcrumb(bc));
275
+ event.breadcrumbs = event.breadcrumbs.filter((bc) => !isPmCliErrorBreadcrumb(bc) && !isKnownNoisyConsoleBreadcrumb(bc));
173
276
  for (const breadcrumb of event.breadcrumbs) {
174
277
  if (breadcrumb.message) {
175
- breadcrumb.message = scrubString(breadcrumb.message);
278
+ breadcrumb.message = scrubString(breadcrumb.message, "message");
279
+ }
280
+ if (breadcrumb.data && typeof breadcrumb.data === "object") {
281
+ breadcrumb.data = scrubEventData(breadcrumb.data);
282
+ }
283
+ }
284
+ }
285
+ if (event.contexts) {
286
+ for (const [ctxKey, ctx] of Object.entries(event.contexts)) {
287
+ if (ctx && typeof ctx === "object") {
288
+ event.contexts[ctxKey] = scrubEventData(ctx);
176
289
  }
177
290
  }
178
291
  }
179
292
  return event;
180
293
  },
181
294
  beforeBreadcrumb(breadcrumb) {
182
- if (isPmCliErrorBreadcrumb(breadcrumb)) {
295
+ if (isPmCliErrorBreadcrumb(breadcrumb) || isKnownNoisyConsoleBreadcrumb(breadcrumb)) {
183
296
  return null;
184
297
  }
185
298
  if (breadcrumb.message) {
186
- breadcrumb.message = scrubString(breadcrumb.message);
299
+ breadcrumb.message = scrubString(breadcrumb.message, "message");
187
300
  }
188
301
  if (breadcrumb.data && typeof breadcrumb.data === "object") {
189
302
  breadcrumb.data = scrubEventData(breadcrumb.data);
@@ -198,7 +311,10 @@ export function getSentry() {
198
311
  }
199
312
  export const _testOnly = {
200
313
  isExpectedCliErrorEvent,
314
+ isKnownNoisyConsoleEvent,
201
315
  isPmCliErrorBreadcrumb,
316
+ isKnownNoisyConsoleBreadcrumb,
202
317
  scrubString,
318
+ scrubEventData,
203
319
  };
204
320
  //# sourceMappingURL=instrument.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"instrument.js","sourceRoot":"/","sources":["core/sentry/instrument.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAE3D,SAAS,gBAAgB;IACvB,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IACjG,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IACpG,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB;QAAE,OAAO,IAAI,CAAC;IACpE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,qBAAqB,GACzB,kGAAkG,CAAC;AAErG,MAAM,8BAA8B,GAAG,IAAI,MAAM,CAC/C,OAAO,qBAAqB,CAAC,MAAM,0BAA0B,EAC7D,KAAK,CACN,CAAC;AACF,MAAM,sBAAsB,GAAG,kCAAkC,CAAC;AAClE,MAAM,aAAa,GACjB,uRAAuR,CAAC;AAE1R,SAAS,WAAW,CAAC,KAAa;IAChC,MAAM,QAAQ,GAAG,KAAK;SACnB,UAAU,CAAC,8BAA8B,EAAE,CAAC,EAAE,EAAE,GAAW,EAAE,EAAE,CAAC,GAAG,GAAG,aAAa,CAAC;SACpF,UAAU,CAAC,0CAA0C,EAAE,kBAAkB,CAAC;SAC1E,UAAU,CAAC,2BAA2B,EAAE,mBAAmB,CAAC;SAC5D,UAAU,CAAC,2BAA2B,EAAE,yBAAyB,CAAC;SAClE,UAAU,CAAC,aAAa,EAAE,eAAe,CAAC;SAC1C,UAAU,CAAC,sBAAsB,EAAE,CAAC,MAAc,EAAE,MAAc,EAAE,EAAE,CAAC,GAAG,MAAM,iBAAiB,CAAC,CAAC;IACtG,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,cAAc,CAAC,GAA4B;IAClD,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;QAC7B,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAID,IAAI,OAA+B,CAAC;AACpC,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,MAAM,iBAAiB,GACrB,iGAAiG,CAAC;AAEpG,SAAS,mBAAmB,CAAC,KAAa;IACxC,OAAO,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,uBAAuB,CAAC,KAKhC;IACC,IAAI,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAEjF,IAAI,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,KAAK,QAAQ,IAAI,mBAAmB,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QACtG,OAAO,IAAI,CAAC;IAEd,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC;QACvG,OAAO,IAAI,CAAC;IAEd,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,sBAAsB,CAAC,UAAmD;IACjF,OAAO,CACL,UAAU,CAAC,QAAQ,KAAK,SAAS;QACjC,OAAO,UAAU,CAAC,OAAO,KAAK,QAAQ;QACtC,mBAAmB,CAAC,UAAU,CAAC,OAAO,CAAC,CACxC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB;IACxB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG;YACjB,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,0BAA0B,CAAC;YAClD,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,uBAAuB,CAAC;SAChD,CAAC;QACF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAyB,CAAC;gBACtF,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;oBAAE,OAAO,MAAM,CAAC,OAAO,CAAC;YAChE,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,+CAA+C;IACjD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC;IACxD,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IACrD,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACzG,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAChC,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,SAAS;QAAE,OAAO,OAAO,CAAC;IAC9B,SAAS,GAAG,IAAI,CAAC;IAEjB,IAAI,gBAAgB,EAAE;QAAE,OAAO,SAAS,CAAC;IAEzC,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;IAClD,OAAO,GAAG,YAAY,CAAC;IAEvB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,iBAAiB,CAAC;IAChE,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;IAEpC,YAAY,CAAC,IAAI,CAAC;QAChB,GAAG;QACH,OAAO,EAAE,UAAU,OAAO,EAAE;QAC5B,WAAW,EAAE,kBAAkB,EAAE;QAEjC,gBAAgB,EAAE,GAAG;QACrB,UAAU,EAAE,IAAI;QAChB,gBAAgB,EAAE,IAAI;QACtB,cAAc,EAAE,CAAC;QACjB,eAAe,EAAE,IAAI;QACrB,cAAc,EAAE,KAAK;QACrB,UAAU,EAAE,SAAS;QAErB,YAAY,EAAE;YACZ,YAAY,CAAC,yBAAyB,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YACpD,YAAY,CAAC,yBAAyB,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;SACtE;QAED,YAAY,EAAE;YACZ,IAAI,EAAE;gBACJ,UAAU,EAAE,QAAQ;gBACpB,aAAa,EAAE,OAAO;gBACtB,cAAc,EAAE,OAAO,CAAC,OAAO;gBAC/B,kBAAkB,EAAE,OAAO,CAAC,QAAQ;gBACpC,cAAc,EAAE,OAAO,CAAC,IAAI;aAC7B;SACF;QAED,UAAU,CAAC,KAAK;YACd,IAAI,uBAAuB,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnC,OAAO,IAAI,CAAC;YACd,CAAC;YAED,IAAI,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;gBAC5B,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;oBAC/C,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;wBACpB,SAAS,CAAC,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;oBACjD,CAAC;oBACD,IAAI,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;wBACjC,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;4BAChD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gCACf,KAAK,CAAC,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,IAA+B,CAAC,CAAC;4BACrE,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;gBACtB,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;oBAC3C,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;wBACvB,UAAU,CAAC,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;oBACvD,CAAC;oBACD,IAAI,UAAU,CAAC,IAAI,IAAI,OAAO,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC3D,UAAU,CAAC,IAAI,GAAG,cAAc,CAAC,UAAU,CAAC,IAA+B,CAAC,CAAC;oBAC/E,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACnD,KAAK,CAAC,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,KAAgC,CAAC,CAAC;YACvE,CAAC;YAED,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnB,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC3D,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;wBACnC,KAAK,CAAC,QAAS,CAAC,MAAM,CAAC,GAAG,cAAc,CAAC,GAA8B,CAAC,CAAC;oBAC3E,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;QAED,qBAAqB,CAAC,KAAK;YACzB,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;gBACtB,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC;gBAClF,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;oBAC3C,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;wBACvB,UAAU,CAAC,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;oBACvD,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,gBAAgB,CAAC,UAAU;YACzB,IAAI,sBAAsB,CAAC,UAAU,CAAC,EAAE,CAAC;gBACvC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACvB,UAAU,CAAC,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACvD,CAAC;YACD,IAAI,UAAU,CAAC,IAAI,IAAI,OAAO,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC3D,UAAU,CAAC,IAAI,GAAG,cAAc,CAAC,UAAU,CAAC,IAA+B,CAAC,CAAC;YAC/E,CAAC;YACD,OAAO,UAAU,CAAC;QACpB,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,uBAAuB;IACvB,sBAAsB;IACtB,WAAW;CACZ,CAAC","sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst OPT_OUT_VALUES = new Set([\"1\", \"true\", \"yes\", \"on\"]);\n\nfunction isSentryDisabled(): boolean {\n if (OPT_OUT_VALUES.has((process.env.PM_SENTRY_DISABLED ?? \"\").trim().toLowerCase())) return true;\n if (OPT_OUT_VALUES.has((process.env.PM_TELEMETRY_DISABLED ?? \"\").trim().toLowerCase())) return true;\n if (process.env.VITEST || process.env.VITEST_WORKER_ID) return true;\n return false;\n}\n\nconst SENSITIVE_KEY_PATTERN =\n /(?:token|secret|password|passwd|api[_-]?key|apikey|authorization|cookie|credentials|bearer|dsn)/i;\n\nconst INLINE_SENSITIVE_ASSIGNMENT_RE = new RegExp(\n `\\\\b(${SENSITIVE_KEY_PATTERN.source})\\\\s*[:=]\\\\s*([^\\\\s,;]+)`,\n \"giu\",\n);\nconst ABSOLUTE_PATH_TOKEN_RE = /(^|[\\s\"'`(=])\\/(?:[^\\s\"'`),;]+)/g;\nconst PRIVATE_IP_RE =\n /\\b(?:10\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)|172\\.(?:1[6-9]|2\\d|3[01])\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)|192\\.168\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))\\b/g;\n\nfunction scrubString(value: string): string {\n const scrubbed = value\n .replaceAll(INLINE_SENSITIVE_ASSIGNMENT_RE, (_m, key: string) => `${key}=[scrubbed]`)\n .replaceAll(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}/giu, \"[scrubbed_email]\")\n .replaceAll(/bearer\\s+[a-z0-9._=-]+/giu, \"bearer [scrubbed]\")\n .replaceAll(/sntr[ysu]_[A-Za-z0-9_-]+/g, \"[scrubbed_sentry_token]\")\n .replaceAll(PRIVATE_IP_RE, \"[scrubbed_ip]\")\n .replaceAll(ABSOLUTE_PATH_TOKEN_RE, (_match: string, prefix: string) => `${prefix}[scrubbed_path]`);\n if (scrubbed.trim().startsWith(\"/\") && scrubbed.trim().length > 1) {\n return \"[scrubbed_path]\";\n }\n return scrubbed;\n}\n\nfunction scrubEventData(obj: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (SENSITIVE_KEY_PATTERN.test(key)) {\n result[key] = \"[scrubbed]\";\n } else if (typeof value === \"string\") {\n result[key] = scrubString(value);\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\ntype SentryLike = typeof import(\"@sentry/node\");\n\nlet _sentry: SentryLike | undefined;\nlet _initDone = false;\n\nconst PM_CLI_SENTRY_DSN =\n \"https://bf7ad2ec76c0051c2ee94e48e8bd6868@o4510603477712896.ingest.de.sentry.io/4511316775338064\";\n\nfunction hasPmCliErrorPrefix(value: string): boolean {\n return /^\\s*PmCliError:/.test(value);\n}\n\nfunction isExpectedCliErrorEvent(event: {\n exception?: { values?: Array<{ type?: string; value?: string }> };\n message?: string;\n extra?: Record<string, unknown>;\n logger?: string;\n}): boolean {\n if (event.exception?.values?.some((ex) => ex.type === \"PmCliError\")) return true;\n\n if (event.exception?.values?.some((ex) => typeof ex.value === \"string\" && hasPmCliErrorPrefix(ex.value)))\n return true;\n\n if (event.logger === \"console\" && typeof event.message === \"string\" && hasPmCliErrorPrefix(event.message))\n return true;\n\n return false;\n}\n\nfunction isPmCliErrorBreadcrumb(breadcrumb: { category?: string; message?: string }): boolean {\n return (\n breadcrumb.category === \"console\" &&\n typeof breadcrumb.message === \"string\" &&\n hasPmCliErrorPrefix(breadcrumb.message)\n );\n}\n\nfunction resolveCliVersion(): string {\n try {\n const thisFile = fileURLToPath(import.meta.url);\n const candidates = [\n path.resolve(thisFile, \"../../../../package.json\"),\n path.resolve(thisFile, \"../../../package.json\"),\n ];\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n const parsed = JSON.parse(fs.readFileSync(candidate, \"utf8\")) as { version?: string };\n if (typeof parsed.version === \"string\") return parsed.version;\n }\n }\n } catch {\n // Version resolution must never block startup.\n }\n return \"0.0.0\";\n}\n\nfunction resolveEnvironment(): string {\n const explicit = process.env.SENTRY_ENVIRONMENT?.trim();\n if (explicit && explicit.length > 0) return explicit;\n if (process.env.VITEST || process.env.VITEST_WORKER_ID || process.env.NODE_ENV === \"test\") return \"test\";\n if (process.env.CI) return \"ci\";\n return \"production\";\n}\n\nexport async function ensureSentryInit(): Promise<SentryLike | undefined> {\n if (_initDone) return _sentry;\n _initDone = true;\n\n if (isSentryDisabled()) return undefined;\n\n const SentryModule = await import(\"@sentry/node\");\n _sentry = SentryModule;\n\n const dsn = process.env.SENTRY_DSN?.trim() || PM_CLI_SENTRY_DSN;\n const release = resolveCliVersion();\n\n SentryModule.init({\n dsn,\n release: `pm-cli@${release}`,\n environment: resolveEnvironment(),\n\n tracesSampleRate: 0.2,\n enableLogs: true,\n attachStacktrace: true,\n normalizeDepth: 6,\n shutdownTimeout: 3000,\n sendDefaultPii: false,\n serverName: undefined,\n\n integrations: [\n SentryModule.extraErrorDataIntegration({ depth: 4 }),\n SentryModule.captureConsoleIntegration({ levels: [\"warn\", \"error\"] }),\n ],\n\n initialScope: {\n tags: {\n \"cli.name\": \"pm-cli\",\n \"cli.version\": release,\n \"runtime.node\": process.version,\n \"runtime.platform\": process.platform,\n \"runtime.arch\": process.arch,\n },\n },\n\n beforeSend(event) {\n if (isExpectedCliErrorEvent(event)) {\n return null;\n }\n\n if (event.exception?.values) {\n for (const exception of event.exception.values) {\n if (exception.value) {\n exception.value = scrubString(exception.value);\n }\n if (exception.stacktrace?.frames) {\n for (const frame of exception.stacktrace.frames) {\n if (frame.vars) {\n frame.vars = scrubEventData(frame.vars as Record<string, unknown>);\n }\n }\n }\n }\n }\n\n if (event.breadcrumbs) {\n for (const breadcrumb of event.breadcrumbs) {\n if (breadcrumb.message) {\n breadcrumb.message = scrubString(breadcrumb.message);\n }\n if (breadcrumb.data && typeof breadcrumb.data === \"object\") {\n breadcrumb.data = scrubEventData(breadcrumb.data as Record<string, unknown>);\n }\n }\n }\n\n if (event.extra && typeof event.extra === \"object\") {\n event.extra = scrubEventData(event.extra as Record<string, unknown>);\n }\n\n if (event.contexts) {\n for (const [ctxKey, ctx] of Object.entries(event.contexts)) {\n if (ctx && typeof ctx === \"object\") {\n event.contexts![ctxKey] = scrubEventData(ctx as Record<string, unknown>);\n }\n }\n }\n\n return event;\n },\n\n beforeSendTransaction(event) {\n if (event.breadcrumbs) {\n event.breadcrumbs = event.breadcrumbs.filter((bc) => !isPmCliErrorBreadcrumb(bc));\n for (const breadcrumb of event.breadcrumbs) {\n if (breadcrumb.message) {\n breadcrumb.message = scrubString(breadcrumb.message);\n }\n }\n }\n return event;\n },\n\n beforeBreadcrumb(breadcrumb) {\n if (isPmCliErrorBreadcrumb(breadcrumb)) {\n return null;\n }\n if (breadcrumb.message) {\n breadcrumb.message = scrubString(breadcrumb.message);\n }\n if (breadcrumb.data && typeof breadcrumb.data === \"object\") {\n breadcrumb.data = scrubEventData(breadcrumb.data as Record<string, unknown>);\n }\n return breadcrumb;\n },\n });\n\n return SentryModule;\n}\n\nexport function getSentry(): SentryLike | undefined {\n return _sentry;\n}\n\nexport const _testOnly = {\n isExpectedCliErrorEvent,\n isPmCliErrorBreadcrumb,\n scrubString,\n};\n"]}
1
+ {"version":3,"file":"instrument.js","sourceRoot":"/","sources":["core/sentry/instrument.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst OPT_OUT_VALUES = new Set([\"1\", \"true\", \"yes\", \"on\"]);\n\nfunction isSentryDisabled(): boolean {\n if (OPT_OUT_VALUES.has((process.env.PM_SENTRY_DISABLED ?? \"\").trim().toLowerCase())) return true;\n if (OPT_OUT_VALUES.has((process.env.PM_TELEMETRY_DISABLED ?? \"\").trim().toLowerCase())) return true;\n if (process.env.VITEST || process.env.VITEST_WORKER_ID) return true;\n return false;\n}\n\nconst SENSITIVE_KEY_PATTERN =\n /(?:token|secret|password|passwd|api[_-]?key|apikey|authorization|cookie|credentials|bearer|dsn)/i;\n\nconst INLINE_SENSITIVE_ASSIGNMENT_RE = new RegExp(\n `\\\\b(${SENSITIVE_KEY_PATTERN.source})\\\\s*[:=]\\\\s*([^\\\\s,;]+)`,\n \"giu\",\n);\nconst ABSOLUTE_PATH_TOKEN_RE = /(^|[\\s\"'`(=])\\/(?:[^\\s\"'`),;]+)/g;\nconst FILE_URL_PATH_RE = /file:\\/\\/\\/?[^\\s\"'`),;]+/giu;\nconst WINDOWS_PATH_TOKEN_RE = /\\b[A-Za-z]:\\\\[^\\s\"'`),;]+/g;\nconst PRIVATE_IP_RE =\n /\\b(?:10\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)|172\\.(?:1[6-9]|2\\d|3[01])\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)|192\\.168\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))\\b/g;\nconst PATH_FIELD_KEY_PATTERN = /(?:^|[_-])(path|filename|file|module|cwd|dir|directory|location|source|script)s?$/i;\nconst KNOWN_NOISY_CONSOLE_MESSAGE_PATTERNS = [\n \"[starter-extension] activating\",\n \"[starter-extension] all 8 capabilities registered.\",\n \"[starter-extension] commands:\",\n \"[starter] preflight check for workspace\",\n \"[starter] output_format service override active\",\n \"[pm-ext-ts-starter] activating\",\n \"[pm-ext-ts-starter] all capabilities registered.\",\n \"run `pm init` first to initialise a pm workspace\",\n] as const;\n\nfunction looksLikeFilesystemPath(value: string): boolean {\n const normalized = value.trim();\n if (normalized.length === 0) {\n return false;\n }\n if (normalized.startsWith(\"/\") || normalized.startsWith(\"file://\")) {\n return true;\n }\n if (/^[A-Za-z]:\\\\/.test(normalized) || normalized.startsWith(\"\\\\\\\\\")) {\n return true;\n }\n return normalized.includes(\"/home/\");\n}\n\nfunction scrubString(value: string, keyHint?: string): string {\n if (keyHint && PATH_FIELD_KEY_PATTERN.test(keyHint) && looksLikeFilesystemPath(value)) {\n return \"[scrubbed_path]\";\n }\n const scrubbed = value\n .replaceAll(INLINE_SENSITIVE_ASSIGNMENT_RE, (_m, key: string) => `${key}=[scrubbed]`)\n .replaceAll(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}/giu, \"[scrubbed_email]\")\n .replaceAll(/bearer\\s+[a-z0-9._=-]+/giu, \"bearer [scrubbed]\")\n .replaceAll(/sntr[ysu]_[A-Za-z0-9_-]+/g, \"[scrubbed_sentry_token]\")\n .replaceAll(PRIVATE_IP_RE, \"[scrubbed_ip]\")\n .replaceAll(FILE_URL_PATH_RE, \"[scrubbed_path]\")\n .replaceAll(WINDOWS_PATH_TOKEN_RE, \"[scrubbed_path]\")\n .replaceAll(ABSOLUTE_PATH_TOKEN_RE, (_match: string, prefix: string) => `${prefix}[scrubbed_path]`);\n if (looksLikeFilesystemPath(scrubbed)) {\n return \"[scrubbed_path]\";\n }\n return scrubbed;\n}\n\nfunction scrubEventData(obj: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (SENSITIVE_KEY_PATTERN.test(key)) {\n result[key] = \"[scrubbed]\";\n } else if (typeof value === \"string\") {\n result[key] = scrubString(value, key);\n } else if (Array.isArray(value)) {\n result[key] = value.map((entry) => {\n if (typeof entry === \"string\") {\n return scrubString(entry, key);\n }\n if (entry && typeof entry === \"object\") {\n return scrubEventData(entry as Record<string, unknown>);\n }\n return entry;\n });\n } else if (value && typeof value === \"object\") {\n result[key] = scrubEventData(value as Record<string, unknown>);\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction scrubStackFrame(frame: Record<string, unknown>): void {\n for (const key of [\"filename\", \"absPath\", \"abs_path\", \"module\"]) {\n const rawValue = frame[key];\n if (typeof rawValue === \"string\") {\n frame[key] = scrubString(rawValue, key);\n }\n }\n const contextLine = frame.context_line;\n if (typeof contextLine === \"string\") {\n frame.context_line = scrubString(contextLine, \"context_line\");\n }\n for (const key of [\"pre_context\", \"post_context\"]) {\n const context = frame[key];\n if (!Array.isArray(context)) {\n continue;\n }\n frame[key] = context.map((entry) => (typeof entry === \"string\" ? scrubString(entry, key) : entry));\n }\n if (frame.vars && typeof frame.vars === \"object\") {\n frame.vars = scrubEventData(frame.vars as Record<string, unknown>);\n }\n if (frame.data && typeof frame.data === \"object\") {\n frame.data = scrubEventData(frame.data as Record<string, unknown>);\n }\n}\n\ntype SentryLike = typeof import(\"@sentry/node\");\n\nlet _sentry: SentryLike | undefined;\nlet _initDone = false;\n\nconst PM_CLI_SENTRY_DSN =\n \"https://bf7ad2ec76c0051c2ee94e48e8bd6868@o4510603477712896.ingest.de.sentry.io/4511316775338064\";\n\nfunction hasPmCliErrorPrefix(value: string): boolean {\n return /^\\s*PmCliError:/.test(value);\n}\n\nfunction isKnownNoisyConsoleMessage(value: string): boolean {\n const normalized = value.trim().toLowerCase();\n if (normalized.length === 0) {\n return false;\n }\n return KNOWN_NOISY_CONSOLE_MESSAGE_PATTERNS.some((pattern) => normalized.includes(pattern));\n}\n\nfunction isKnownNoisyConsoleEvent(event: {\n logger?: string;\n message?: string;\n exception?: { values?: Array<{ value?: string }> };\n}): boolean {\n if (event.logger !== \"console\") {\n return false;\n }\n if (typeof event.message === \"string\" && isKnownNoisyConsoleMessage(event.message)) {\n return true;\n }\n return (\n Array.isArray(event.exception?.values) &&\n event.exception.values.some((entry) => typeof entry.value === \"string\" && isKnownNoisyConsoleMessage(entry.value))\n );\n}\n\nfunction isExpectedCliErrorEvent(event: {\n exception?: { values?: Array<{ type?: string; value?: string }> };\n message?: string;\n extra?: Record<string, unknown>;\n logger?: string;\n}): boolean {\n if (event.exception?.values?.some((ex) => ex.type === \"PmCliError\")) return true;\n\n if (event.exception?.values?.some((ex) => typeof ex.value === \"string\" && hasPmCliErrorPrefix(ex.value)))\n return true;\n\n if (event.logger === \"console\" && typeof event.message === \"string\" && hasPmCliErrorPrefix(event.message))\n return true;\n\n return false;\n}\n\nfunction isPmCliErrorBreadcrumb(breadcrumb: { category?: string; message?: string }): boolean {\n return (\n breadcrumb.category === \"console\" &&\n typeof breadcrumb.message === \"string\" &&\n hasPmCliErrorPrefix(breadcrumb.message)\n );\n}\n\nfunction isKnownNoisyConsoleBreadcrumb(breadcrumb: { category?: string; message?: string }): boolean {\n return breadcrumb.category === \"console\" && typeof breadcrumb.message === \"string\" && isKnownNoisyConsoleMessage(breadcrumb.message);\n}\n\nfunction resolveCliVersion(): string {\n try {\n const thisFile = fileURLToPath(import.meta.url);\n const candidates = [\n path.resolve(thisFile, \"../../../../package.json\"),\n path.resolve(thisFile, \"../../../package.json\"),\n ];\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n const parsed = JSON.parse(fs.readFileSync(candidate, \"utf8\")) as { version?: string };\n if (typeof parsed.version === \"string\") return parsed.version;\n }\n }\n } catch {\n // Version resolution must never block startup.\n }\n return \"0.0.0\";\n}\n\nfunction resolveEnvironment(): string {\n const explicit = process.env.SENTRY_ENVIRONMENT?.trim();\n if (explicit && explicit.length > 0) return explicit;\n if (process.env.VITEST || process.env.VITEST_WORKER_ID || process.env.NODE_ENV === \"test\") return \"test\";\n if (process.env.CI) return \"ci\";\n return \"production\";\n}\n\nexport async function ensureSentryInit(): Promise<SentryLike | undefined> {\n if (_initDone) return _sentry;\n _initDone = true;\n\n if (isSentryDisabled()) return undefined;\n\n const SentryModule = await import(\"@sentry/node\");\n _sentry = SentryModule;\n\n const dsn = process.env.SENTRY_DSN?.trim() || PM_CLI_SENTRY_DSN;\n const release = resolveCliVersion();\n\n SentryModule.init({\n dsn,\n release: `pm-cli@${release}`,\n environment: resolveEnvironment(),\n\n tracesSampleRate: 0.2,\n enableLogs: true,\n attachStacktrace: true,\n normalizeDepth: 6,\n shutdownTimeout: 3000,\n sendDefaultPii: false,\n serverName: undefined,\n\n integrations: [\n SentryModule.extraErrorDataIntegration({ depth: 4 }),\n SentryModule.captureConsoleIntegration({ levels: [\"warn\", \"error\"] }),\n ],\n\n initialScope: {\n tags: {\n \"cli.name\": \"pm-cli\",\n \"cli.version\": release,\n \"runtime.node\": process.version,\n \"runtime.platform\": process.platform,\n \"runtime.arch\": process.arch,\n },\n },\n\n beforeSend(event) {\n if (isExpectedCliErrorEvent(event) || isKnownNoisyConsoleEvent(event)) {\n return null;\n }\n if (event.message) {\n event.message = scrubString(event.message, \"message\");\n }\n if (event.transaction) {\n event.transaction = scrubString(event.transaction, \"transaction\");\n }\n\n if (event.exception?.values) {\n for (const exception of event.exception.values) {\n if (exception.value) {\n exception.value = scrubString(exception.value, \"value\");\n }\n if (exception.stacktrace?.frames) {\n for (const frame of exception.stacktrace.frames) {\n scrubStackFrame(frame as unknown as Record<string, unknown>);\n }\n }\n }\n }\n\n if (event.breadcrumbs) {\n for (const breadcrumb of event.breadcrumbs) {\n if (breadcrumb.message) {\n breadcrumb.message = scrubString(breadcrumb.message);\n }\n if (breadcrumb.data && typeof breadcrumb.data === \"object\") {\n breadcrumb.data = scrubEventData(breadcrumb.data as Record<string, unknown>);\n }\n }\n }\n\n if (event.extra && typeof event.extra === \"object\") {\n event.extra = scrubEventData(event.extra as Record<string, unknown>);\n }\n\n if (event.contexts) {\n for (const [ctxKey, ctx] of Object.entries(event.contexts)) {\n if (ctx && typeof ctx === \"object\") {\n event.contexts![ctxKey] = scrubEventData(ctx as Record<string, unknown>);\n }\n }\n }\n if (event.request && typeof event.request === \"object\") {\n event.request = scrubEventData(event.request as Record<string, unknown>) as typeof event.request;\n }\n if (event.user && typeof event.user === \"object\") {\n event.user = scrubEventData(event.user as Record<string, unknown>) as typeof event.user;\n }\n if (event.tags && typeof event.tags === \"object\") {\n event.tags = scrubEventData(event.tags as Record<string, unknown>) as typeof event.tags;\n }\n\n return event;\n },\n\n beforeSendTransaction(event) {\n if (event.breadcrumbs) {\n event.breadcrumbs = event.breadcrumbs.filter(\n (bc) => !isPmCliErrorBreadcrumb(bc) && !isKnownNoisyConsoleBreadcrumb(bc),\n );\n for (const breadcrumb of event.breadcrumbs) {\n if (breadcrumb.message) {\n breadcrumb.message = scrubString(breadcrumb.message, \"message\");\n }\n if (breadcrumb.data && typeof breadcrumb.data === \"object\") {\n breadcrumb.data = scrubEventData(breadcrumb.data as Record<string, unknown>);\n }\n }\n }\n if (event.contexts) {\n for (const [ctxKey, ctx] of Object.entries(event.contexts)) {\n if (ctx && typeof ctx === \"object\") {\n event.contexts![ctxKey] = scrubEventData(ctx as Record<string, unknown>);\n }\n }\n }\n return event;\n },\n\n beforeBreadcrumb(breadcrumb) {\n if (isPmCliErrorBreadcrumb(breadcrumb) || isKnownNoisyConsoleBreadcrumb(breadcrumb)) {\n return null;\n }\n if (breadcrumb.message) {\n breadcrumb.message = scrubString(breadcrumb.message, \"message\");\n }\n if (breadcrumb.data && typeof breadcrumb.data === \"object\") {\n breadcrumb.data = scrubEventData(breadcrumb.data as Record<string, unknown>);\n }\n return breadcrumb;\n },\n });\n\n return SentryModule;\n}\n\nexport function getSentry(): SentryLike | undefined {\n return _sentry;\n}\n\nexport const _testOnly = {\n isExpectedCliErrorEvent,\n isKnownNoisyConsoleEvent,\n isPmCliErrorBreadcrumb,\n isKnownNoisyConsoleBreadcrumb,\n scrubString,\n scrubEventData,\n};\n"]}
@@ -16,7 +16,7 @@ export declare const DEFAULT_VALIDATE_CLOSURE_LIKE_METADATA_FIELD_PATTERNS: {
16
16
  };
17
17
  export declare const SETTINGS_DEFAULTS: PmSettings;
18
18
  export declare const EMPTY_CANONICAL_DOCUMENT: {
19
- front_matter: {};
19
+ metadata: {};
20
20
  body: string;
21
21
  };
22
22
  export declare const EXIT_CODE: {
@@ -232,6 +232,26 @@ export const SETTINGS_DEFAULTS = {
232
232
  extensions: {
233
233
  enabled: [],
234
234
  disabled: [],
235
+ policy: {
236
+ mode: "off",
237
+ trust_mode: "off",
238
+ require_provenance: false,
239
+ trusted_extensions: [],
240
+ default_sandbox_profile: "none",
241
+ allowed_extensions: [],
242
+ blocked_extensions: [],
243
+ allowed_capabilities: [],
244
+ blocked_capabilities: [],
245
+ allowed_surfaces: [],
246
+ blocked_surfaces: [],
247
+ allowed_commands: [],
248
+ blocked_commands: [],
249
+ allowed_actions: [],
250
+ blocked_actions: [],
251
+ allowed_services: [],
252
+ blocked_services: [],
253
+ extension_overrides: [],
254
+ },
235
255
  },
236
256
  search: {
237
257
  score_threshold: 0,
@@ -280,7 +300,7 @@ export const SETTINGS_DEFAULTS = {
280
300
  },
281
301
  };
282
302
  export const EMPTY_CANONICAL_DOCUMENT = {
283
- front_matter: {},
303
+ metadata: {},
284
304
  body: "",
285
305
  };
286
306
  export const EXIT_CODE = {