pi-usereq 0.7.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (773) hide show
  1. package/.gitignore +2 -0
  2. package/CHANGELOG.md +24 -0
  3. package/README.md +1 -1
  4. package/docs/pi.dev/coding-agent-docs/custom-provider.md +42 -1
  5. package/docs/pi.dev/coding-agent-docs/extensions.md +302 -28
  6. package/docs/pi.dev/coding-agent-docs/keybindings.md +23 -1
  7. package/docs/pi.dev/coding-agent-docs/models.md +3 -0
  8. package/docs/pi.dev/coding-agent-docs/packages.md +2 -2
  9. package/docs/pi.dev/coding-agent-docs/prompt-templates.md +21 -0
  10. package/docs/pi.dev/coding-agent-docs/providers.md +1 -0
  11. package/docs/pi.dev/coding-agent-docs/rpc.md +36 -6
  12. package/docs/pi.dev/coding-agent-docs/sdk.md +30 -5
  13. package/docs/pi.dev/coding-agent-docs/session.md +1 -1
  14. package/docs/pi.dev/coding-agent-docs/settings.md +2 -1
  15. package/docs/pi.dev/coding-agent-docs/skills.md +12 -12
  16. package/docs/pi.dev/coding-agent-docs/tree.md +2 -0
  17. package/docs/pi.dev/coding-agent-docs/tui.md +31 -0
  18. package/docs/pi.dev/mom-docs/new.md +4 -4
  19. package/package.json +1 -1
  20. package/pi-usereq/docs/REFERENCES.md +5214 -24470
  21. package/pi-usereq/docs/REQUIREMENTS.md +307 -170
  22. package/pi-usereq/docs/WORKFLOW.md +334 -316
  23. package/pi.dev-src/pi-mono/agent/src/agent-loop.ts +683 -0
  24. package/pi.dev-src/pi-mono/agent/src/agent.ts +543 -0
  25. package/pi.dev-src/pi-mono/agent/src/index.ts +8 -0
  26. package/pi.dev-src/pi-mono/agent/src/proxy.ts +367 -0
  27. package/pi.dev-src/pi-mono/agent/src/types.ts +364 -0
  28. package/pi.dev-src/pi-mono/agent/test/agent-loop.test.ts +1181 -0
  29. package/pi.dev-src/pi-mono/agent/test/agent.test.ts +463 -0
  30. package/pi.dev-src/pi-mono/agent/test/e2e.test.ts +404 -0
  31. package/pi.dev-src/pi-mono/agent/test/utils/calculate.ts +32 -0
  32. package/pi.dev-src/pi-mono/agent/test/utils/get-current-time.ts +46 -0
  33. package/pi.dev-src/pi-mono/agent/vitest.config.ts +9 -0
  34. package/pi.dev-src/pi-mono/ai/bedrock-provider.d.ts +1 -0
  35. package/pi.dev-src/pi-mono/ai/bedrock-provider.js +1 -0
  36. package/pi.dev-src/pi-mono/ai/scripts/generate-models.ts +1635 -0
  37. package/pi.dev-src/pi-mono/ai/scripts/generate-test-image.ts +34 -0
  38. package/pi.dev-src/pi-mono/ai/src/api-registry.ts +98 -0
  39. package/pi.dev-src/pi-mono/ai/src/bedrock-provider.ts +6 -0
  40. package/pi.dev-src/pi-mono/ai/src/cli.ts +133 -0
  41. package/pi.dev-src/pi-mono/ai/src/env-api-keys.ts +134 -0
  42. package/pi.dev-src/pi-mono/ai/src/index.ts +35 -0
  43. package/pi.dev-src/pi-mono/ai/src/models.generated.ts +14928 -0
  44. package/pi.dev-src/pi-mono/ai/src/models.ts +82 -0
  45. package/pi.dev-src/pi-mono/ai/src/oauth.ts +1 -0
  46. package/pi.dev-src/pi-mono/ai/src/providers/amazon-bedrock.ts +929 -0
  47. package/pi.dev-src/pi-mono/ai/src/providers/anthropic.ts +1125 -0
  48. package/pi.dev-src/pi-mono/ai/src/providers/azure-openai-responses.ts +253 -0
  49. package/pi.dev-src/pi-mono/ai/src/providers/faux.ts +499 -0
  50. package/pi.dev-src/pi-mono/ai/src/providers/github-copilot-headers.ts +37 -0
  51. package/pi.dev-src/pi-mono/ai/src/providers/google-gemini-cli.ts +996 -0
  52. package/pi.dev-src/pi-mono/ai/src/providers/google-shared.ts +354 -0
  53. package/pi.dev-src/pi-mono/ai/src/providers/google-vertex.ts +543 -0
  54. package/pi.dev-src/pi-mono/ai/src/providers/google.ts +500 -0
  55. package/pi.dev-src/pi-mono/ai/src/providers/mistral.ts +629 -0
  56. package/pi.dev-src/pi-mono/ai/src/providers/openai-codex-responses.ts +984 -0
  57. package/pi.dev-src/pi-mono/ai/src/providers/openai-completions.ts +1063 -0
  58. package/pi.dev-src/pi-mono/ai/src/providers/openai-responses-shared.ts +539 -0
  59. package/pi.dev-src/pi-mono/ai/src/providers/openai-responses.ts +264 -0
  60. package/pi.dev-src/pi-mono/ai/src/providers/register-builtins.ts +433 -0
  61. package/pi.dev-src/pi-mono/ai/src/providers/simple-options.ts +47 -0
  62. package/pi.dev-src/pi-mono/ai/src/providers/transform-messages.ts +220 -0
  63. package/pi.dev-src/pi-mono/ai/src/stream.ts +59 -0
  64. package/pi.dev-src/pi-mono/ai/src/types.ts +417 -0
  65. package/pi.dev-src/pi-mono/ai/src/utils/event-stream.ts +87 -0
  66. package/pi.dev-src/pi-mono/ai/src/utils/hash.ts +13 -0
  67. package/pi.dev-src/pi-mono/ai/src/utils/headers.ts +7 -0
  68. package/pi.dev-src/pi-mono/ai/src/utils/json-parse.ts +124 -0
  69. package/pi.dev-src/pi-mono/ai/src/utils/overflow.ts +138 -0
  70. package/pi.dev-src/pi-mono/ai/src/utils/sanitize-unicode.ts +25 -0
  71. package/pi.dev-src/pi-mono/ai/src/utils/typebox-helpers.ts +24 -0
  72. package/pi.dev-src/pi-mono/ai/src/utils/validation.ts +324 -0
  73. package/pi.dev-src/pi-mono/ai/test/abort.test.ts +260 -0
  74. package/pi.dev-src/pi-mono/ai/test/anthropic-oauth.test.ts +99 -0
  75. package/pi.dev-src/pi-mono/ai/test/anthropic-opus-4-7-smoke.test.ts +72 -0
  76. package/pi.dev-src/pi-mono/ai/test/anthropic-sse-parsing.test.ts +113 -0
  77. package/pi.dev-src/pi-mono/ai/test/anthropic-thinking-disable.test.ts +152 -0
  78. package/pi.dev-src/pi-mono/ai/test/anthropic-tool-name-normalization.test.ts +205 -0
  79. package/pi.dev-src/pi-mono/ai/test/azure-utils.ts +28 -0
  80. package/pi.dev-src/pi-mono/ai/test/bedrock-endpoint-resolution.test.ts +131 -0
  81. package/pi.dev-src/pi-mono/ai/test/bedrock-models.test.ts +66 -0
  82. package/pi.dev-src/pi-mono/ai/test/bedrock-thinking-payload.test.ts +107 -0
  83. package/pi.dev-src/pi-mono/ai/test/bedrock-utils.ts +18 -0
  84. package/pi.dev-src/pi-mono/ai/test/cache-retention.test.ts +335 -0
  85. package/pi.dev-src/pi-mono/ai/test/context-overflow.test.ts +714 -0
  86. package/pi.dev-src/pi-mono/ai/test/cross-provider-handoff.test.ts +458 -0
  87. package/pi.dev-src/pi-mono/ai/test/data/red-circle.png +0 -0
  88. package/pi.dev-src/pi-mono/ai/test/empty.test.ts +742 -0
  89. package/pi.dev-src/pi-mono/ai/test/faux-provider.test.ts +597 -0
  90. package/pi.dev-src/pi-mono/ai/test/fireworks-models.test.ts +49 -0
  91. package/pi.dev-src/pi-mono/ai/test/github-copilot-anthropic.test.ts +108 -0
  92. package/pi.dev-src/pi-mono/ai/test/github-copilot-oauth.test.ts +196 -0
  93. package/pi.dev-src/pi-mono/ai/test/google-gemini-cli-claude-thinking-header.test.ts +103 -0
  94. package/pi.dev-src/pi-mono/ai/test/google-gemini-cli-empty-stream.test.ts +108 -0
  95. package/pi.dev-src/pi-mono/ai/test/google-gemini-cli-retry-delay.test.ts +53 -0
  96. package/pi.dev-src/pi-mono/ai/test/google-shared-convert-tools.test.ts +187 -0
  97. package/pi.dev-src/pi-mono/ai/test/google-shared-gemini3-unsigned-tool-call.test.ts +172 -0
  98. package/pi.dev-src/pi-mono/ai/test/google-shared-image-tool-result-routing.test.ts +124 -0
  99. package/pi.dev-src/pi-mono/ai/test/google-thinking-disable.test.ts +183 -0
  100. package/pi.dev-src/pi-mono/ai/test/google-thinking-signature.test.ts +38 -0
  101. package/pi.dev-src/pi-mono/ai/test/google-tool-call-missing-args.test.ts +105 -0
  102. package/pi.dev-src/pi-mono/ai/test/google-vertex-api-key-resolution.test.ts +144 -0
  103. package/pi.dev-src/pi-mono/ai/test/image-tool-result.test.ts +481 -0
  104. package/pi.dev-src/pi-mono/ai/test/interleaved-thinking.test.ts +145 -0
  105. package/pi.dev-src/pi-mono/ai/test/lazy-module-load.test.ts +102 -0
  106. package/pi.dev-src/pi-mono/ai/test/mistral-reasoning-mode.test.ts +66 -0
  107. package/pi.dev-src/pi-mono/ai/test/mistral-tool-schema.test.ts +61 -0
  108. package/pi.dev-src/pi-mono/ai/test/oauth.ts +89 -0
  109. package/pi.dev-src/pi-mono/ai/test/openai-codex-cache-affinity-e2e.test.ts +36 -0
  110. package/pi.dev-src/pi-mono/ai/test/openai-codex-stream.test.ts +686 -0
  111. package/pi.dev-src/pi-mono/ai/test/openai-completions-cache-control-format.test.ts +189 -0
  112. package/pi.dev-src/pi-mono/ai/test/openai-completions-prompt-cache.test.ts +198 -0
  113. package/pi.dev-src/pi-mono/ai/test/openai-completions-thinking-as-text.test.ts +214 -0
  114. package/pi.dev-src/pi-mono/ai/test/openai-completions-tool-choice.test.ts +560 -0
  115. package/pi.dev-src/pi-mono/ai/test/openai-completions-tool-result-images.test.ts +101 -0
  116. package/pi.dev-src/pi-mono/ai/test/openai-responses-cache-affinity-e2e.test.ts +32 -0
  117. package/pi.dev-src/pi-mono/ai/test/openai-responses-copilot-provider.test.ts +128 -0
  118. package/pi.dev-src/pi-mono/ai/test/openai-responses-foreign-toolcall-id.test.ts +66 -0
  119. package/pi.dev-src/pi-mono/ai/test/openai-responses-partial-json-cleanup.test.ts +101 -0
  120. package/pi.dev-src/pi-mono/ai/test/openai-responses-reasoning-replay-e2e.test.ts +292 -0
  121. package/pi.dev-src/pi-mono/ai/test/openai-responses-tool-result-images.test.ts +200 -0
  122. package/pi.dev-src/pi-mono/ai/test/openrouter-cache-write-repro.test.ts +78 -0
  123. package/pi.dev-src/pi-mono/ai/test/overflow.test.ts +64 -0
  124. package/pi.dev-src/pi-mono/ai/test/responseid.test.ts +145 -0
  125. package/pi.dev-src/pi-mono/ai/test/stream.test.ts +1405 -0
  126. package/pi.dev-src/pi-mono/ai/test/supports-xhigh.test.ts +34 -0
  127. package/pi.dev-src/pi-mono/ai/test/tokens.test.ts +304 -0
  128. package/pi.dev-src/pi-mono/ai/test/tool-call-id-normalization.test.ts +291 -0
  129. package/pi.dev-src/pi-mono/ai/test/tool-call-without-result.test.ts +313 -0
  130. package/pi.dev-src/pi-mono/ai/test/total-tokens.test.ts +695 -0
  131. package/pi.dev-src/pi-mono/ai/test/transform-messages-copilot-openai-to-anthropic.test.ts +191 -0
  132. package/pi.dev-src/pi-mono/ai/test/unicode-surrogate.test.ts +754 -0
  133. package/pi.dev-src/pi-mono/ai/test/validation.test.ts +116 -0
  134. package/pi.dev-src/pi-mono/ai/test/xhigh.test.ts +71 -0
  135. package/pi.dev-src/pi-mono/ai/test/zen.test.ts +25 -0
  136. package/pi.dev-src/pi-mono/ai/vitest.config.ts +9 -0
  137. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/antigravity-image-gen.ts +418 -0
  138. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/auto-commit-on-exit.ts +49 -0
  139. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/bash-spawn-hook.ts +30 -0
  140. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/bookmark.ts +50 -0
  141. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/built-in-tool-renderer.ts +249 -0
  142. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/claude-rules.ts +86 -0
  143. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/commands.ts +72 -0
  144. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/confirm-destructive.ts +59 -0
  145. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-compaction.ts +127 -0
  146. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-footer.ts +64 -0
  147. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-header.ts +73 -0
  148. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-provider-anthropic/index.ts +604 -0
  149. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  150. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-provider-gitlab-duo/index.ts +349 -0
  151. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  152. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-provider-qwen-cli/index.ts +345 -0
  153. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/dirty-repo-guard.ts +56 -0
  154. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/doom/build.sh +152 -0
  155. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  156. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/doom-component.ts +132 -0
  157. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  158. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  159. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/index.ts +74 -0
  160. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  161. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/dynamic-resources/SKILL.md +8 -0
  162. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/dynamic-resources/dynamic.json +79 -0
  163. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/dynamic-resources/dynamic.md +5 -0
  164. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/dynamic-resources/index.ts +15 -0
  165. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/dynamic-tools.ts +74 -0
  166. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/event-bus.ts +43 -0
  167. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/file-trigger.ts +41 -0
  168. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/git-checkpoint.ts +53 -0
  169. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/github-issue-autocomplete.ts +185 -0
  170. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/handoff.ts +153 -0
  171. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/hello.ts +26 -0
  172. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/hidden-thinking-label.ts +53 -0
  173. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/inline-bash.ts +94 -0
  174. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/input-transform.ts +43 -0
  175. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/interactive-shell.ts +196 -0
  176. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/mac-system-theme.ts +47 -0
  177. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/message-renderer.ts +59 -0
  178. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/minimal-mode.ts +426 -0
  179. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/modal-editor.ts +85 -0
  180. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/model-status.ts +31 -0
  181. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/notify.ts +55 -0
  182. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/overlay-qa-tests.ts +1348 -0
  183. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/overlay-test.ts +150 -0
  184. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/permission-gate.ts +34 -0
  185. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/pirate.ts +47 -0
  186. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/plan-mode/index.ts +340 -0
  187. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/plan-mode/utils.ts +168 -0
  188. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/preset.ts +430 -0
  189. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/prompt-customizer.ts +97 -0
  190. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/protected-paths.ts +30 -0
  191. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/provider-payload.ts +18 -0
  192. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/qna.ts +122 -0
  193. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/question.ts +264 -0
  194. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/questionnaire.ts +427 -0
  195. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/rainbow-editor.ts +88 -0
  196. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/reload-runtime.ts +37 -0
  197. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/rpc-demo.ts +118 -0
  198. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/sandbox/index.ts +321 -0
  199. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/sandbox/package-lock.json +92 -0
  200. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/send-user-message.ts +97 -0
  201. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/session-name.ts +27 -0
  202. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/shutdown-command.ts +63 -0
  203. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/snake.ts +343 -0
  204. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/space-invaders.ts +560 -0
  205. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/ssh.ts +220 -0
  206. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/status-line.ts +32 -0
  207. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/structured-output.ts +65 -0
  208. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/agents/planner.md +37 -0
  209. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/agents/reviewer.md +35 -0
  210. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/agents/scout.md +50 -0
  211. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/agents/worker.md +24 -0
  212. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/agents.ts +126 -0
  213. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/index.ts +987 -0
  214. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  215. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/prompts/implement.md +10 -0
  216. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  217. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/summarize.ts +206 -0
  218. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/system-prompt-header.ts +17 -0
  219. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/tic-tac-toe.ts +1008 -0
  220. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/timed-confirm.ts +70 -0
  221. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/titlebar-spinner.ts +58 -0
  222. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/todo.ts +297 -0
  223. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/tool-override.ts +144 -0
  224. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/tools.ts +141 -0
  225. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/trigger-compact.ts +50 -0
  226. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/truncated-tool.ts +195 -0
  227. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/widget-placement.ts +9 -0
  228. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/with-deps/index.ts +32 -0
  229. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/with-deps/package-lock.json +31 -0
  230. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/working-indicator.ts +123 -0
  231. package/pi.dev-src/pi-mono/coding-agent/examples/extensions/working-message-test.ts +25 -0
  232. package/pi.dev-src/pi-mono/coding-agent/examples/rpc-extension-ui.ts +632 -0
  233. package/pi.dev-src/pi-mono/coding-agent/examples/sdk/01-minimal.ts +22 -0
  234. package/pi.dev-src/pi-mono/coding-agent/examples/sdk/02-custom-model.ts +49 -0
  235. package/pi.dev-src/pi-mono/coding-agent/examples/sdk/03-custom-prompt.ts +62 -0
  236. package/pi.dev-src/pi-mono/coding-agent/examples/sdk/04-skills.ts +55 -0
  237. package/pi.dev-src/pi-mono/coding-agent/examples/sdk/05-tools.ts +44 -0
  238. package/pi.dev-src/pi-mono/coding-agent/examples/sdk/06-extensions.ts +90 -0
  239. package/pi.dev-src/pi-mono/coding-agent/examples/sdk/07-context-files.ts +42 -0
  240. package/pi.dev-src/pi-mono/coding-agent/examples/sdk/08-prompt-templates.ts +51 -0
  241. package/pi.dev-src/pi-mono/coding-agent/examples/sdk/09-api-keys-and-oauth.ts +48 -0
  242. package/pi.dev-src/pi-mono/coding-agent/examples/sdk/10-settings.ts +53 -0
  243. package/pi.dev-src/pi-mono/coding-agent/examples/sdk/11-sessions.ts +48 -0
  244. package/pi.dev-src/pi-mono/coding-agent/examples/sdk/12-full-control.ts +73 -0
  245. package/pi.dev-src/pi-mono/coding-agent/examples/sdk/13-session-runtime.ts +67 -0
  246. package/pi.dev-src/pi-mono/coding-agent/scripts/migrate-sessions.sh +93 -0
  247. package/pi.dev-src/pi-mono/coding-agent/src/bun/cli.ts +6 -0
  248. package/pi.dev-src/pi-mono/coding-agent/src/bun/register-bedrock.ts +4 -0
  249. package/pi.dev-src/pi-mono/coding-agent/src/cli/args.ts +335 -0
  250. package/pi.dev-src/pi-mono/coding-agent/src/cli/config-selector.ts +52 -0
  251. package/pi.dev-src/pi-mono/coding-agent/src/cli/file-processor.ts +100 -0
  252. package/pi.dev-src/pi-mono/coding-agent/src/cli/initial-message.ts +43 -0
  253. package/pi.dev-src/pi-mono/coding-agent/src/cli/list-models.ts +110 -0
  254. package/pi.dev-src/pi-mono/coding-agent/src/cli/session-picker.ts +52 -0
  255. package/pi.dev-src/pi-mono/coding-agent/src/cli.ts +17 -0
  256. package/pi.dev-src/pi-mono/coding-agent/src/config.ts +261 -0
  257. package/pi.dev-src/pi-mono/coding-agent/src/core/agent-session-runtime.ts +394 -0
  258. package/pi.dev-src/pi-mono/coding-agent/src/core/agent-session-services.ts +196 -0
  259. package/pi.dev-src/pi-mono/coding-agent/src/core/agent-session.ts +3096 -0
  260. package/pi.dev-src/pi-mono/coding-agent/src/core/auth-storage.ts +493 -0
  261. package/pi.dev-src/pi-mono/coding-agent/src/core/bash-executor.ts +154 -0
  262. package/pi.dev-src/pi-mono/coding-agent/src/core/compaction/branch-summarization.ts +355 -0
  263. package/pi.dev-src/pi-mono/coding-agent/src/core/compaction/compaction.ts +839 -0
  264. package/pi.dev-src/pi-mono/coding-agent/src/core/compaction/index.ts +7 -0
  265. package/pi.dev-src/pi-mono/coding-agent/src/core/compaction/utils.ts +170 -0
  266. package/pi.dev-src/pi-mono/coding-agent/src/core/defaults.ts +3 -0
  267. package/pi.dev-src/pi-mono/coding-agent/src/core/diagnostics.ts +15 -0
  268. package/pi.dev-src/pi-mono/coding-agent/src/core/event-bus.ts +33 -0
  269. package/pi.dev-src/pi-mono/coding-agent/src/core/exec.ts +107 -0
  270. package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/ansi-to-html.ts +258 -0
  271. package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/index.ts +314 -0
  272. package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/template.css +1017 -0
  273. package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/template.html +55 -0
  274. package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/template.js +1770 -0
  275. package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/tool-renderer.ts +158 -0
  276. package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/vendor/highlight.min.js +1213 -0
  277. package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/vendor/marked.min.js +6 -0
  278. package/pi.dev-src/pi-mono/coding-agent/src/core/extensions/index.ts +171 -0
  279. package/pi.dev-src/pi-mono/coding-agent/src/core/extensions/loader.ts +606 -0
  280. package/pi.dev-src/pi-mono/coding-agent/src/core/extensions/runner.ts +1019 -0
  281. package/pi.dev-src/pi-mono/coding-agent/src/core/extensions/types.ts +1542 -0
  282. package/pi.dev-src/pi-mono/coding-agent/src/core/extensions/wrapper.ts +30 -0
  283. package/pi.dev-src/pi-mono/coding-agent/src/core/footer-data-provider.ts +354 -0
  284. package/pi.dev-src/pi-mono/coding-agent/src/core/index.ts +77 -0
  285. package/pi.dev-src/pi-mono/coding-agent/src/core/keybindings.ts +370 -0
  286. package/pi.dev-src/pi-mono/coding-agent/src/core/messages.ts +195 -0
  287. package/pi.dev-src/pi-mono/coding-agent/src/core/model-registry.ts +858 -0
  288. package/pi.dev-src/pi-mono/coding-agent/src/core/model-resolver.ts +629 -0
  289. package/pi.dev-src/pi-mono/coding-agent/src/core/output-guard.ts +74 -0
  290. package/pi.dev-src/pi-mono/coding-agent/src/core/package-manager.ts +2408 -0
  291. package/pi.dev-src/pi-mono/coding-agent/src/core/prompt-templates.ts +296 -0
  292. package/pi.dev-src/pi-mono/coding-agent/src/core/resolve-config-value.ts +142 -0
  293. package/pi.dev-src/pi-mono/coding-agent/src/core/resource-loader.ts +917 -0
  294. package/pi.dev-src/pi-mono/coding-agent/src/core/sdk.ts +380 -0
  295. package/pi.dev-src/pi-mono/coding-agent/src/core/session-cwd.ts +59 -0
  296. package/pi.dev-src/pi-mono/coding-agent/src/core/session-manager.ts +1425 -0
  297. package/pi.dev-src/pi-mono/coding-agent/src/core/settings-manager.ts +999 -0
  298. package/pi.dev-src/pi-mono/coding-agent/src/core/skills.ts +508 -0
  299. package/pi.dev-src/pi-mono/coding-agent/src/core/slash-commands.ts +39 -0
  300. package/pi.dev-src/pi-mono/coding-agent/src/core/source-info.ts +40 -0
  301. package/pi.dev-src/pi-mono/coding-agent/src/core/system-prompt.ts +172 -0
  302. package/pi.dev-src/pi-mono/coding-agent/src/core/telemetry.ts +13 -0
  303. package/pi.dev-src/pi-mono/coding-agent/src/core/timings.ts +31 -0
  304. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/bash.ts +448 -0
  305. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/edit-diff.ts +445 -0
  306. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/edit.ts +487 -0
  307. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/file-mutation-queue.ts +39 -0
  308. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/find.ts +370 -0
  309. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/grep.ts +384 -0
  310. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/index.ts +196 -0
  311. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/ls.ts +229 -0
  312. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/path-utils.ts +94 -0
  313. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/read.ts +273 -0
  314. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/render-utils.ts +64 -0
  315. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/tool-definition-wrapper.ts +45 -0
  316. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/truncate.ts +265 -0
  317. package/pi.dev-src/pi-mono/coding-agent/src/core/tools/write.ts +281 -0
  318. package/pi.dev-src/pi-mono/coding-agent/src/index.ts +352 -0
  319. package/pi.dev-src/pi-mono/coding-agent/src/main.ts +731 -0
  320. package/pi.dev-src/pi-mono/coding-agent/src/migrations.ts +314 -0
  321. package/pi.dev-src/pi-mono/coding-agent/src/modes/index.ts +9 -0
  322. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/assets/clankolas.png +0 -0
  323. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/armin.ts +382 -0
  324. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/assistant-message.ts +147 -0
  325. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/bash-execution.ts +218 -0
  326. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/bordered-loader.ts +68 -0
  327. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/branch-summary-message.ts +58 -0
  328. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/compaction-summary-message.ts +59 -0
  329. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/config-selector.ts +592 -0
  330. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/countdown-timer.ts +38 -0
  331. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/custom-editor.ts +80 -0
  332. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/custom-message.ts +99 -0
  333. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/daxnuts.ts +164 -0
  334. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/diff.ts +147 -0
  335. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/dynamic-border.ts +25 -0
  336. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/earendil-announcement.ts +53 -0
  337. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/extension-editor.ts +147 -0
  338. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/extension-input.ts +87 -0
  339. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/extension-selector.ts +107 -0
  340. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/footer.ts +220 -0
  341. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/index.ts +32 -0
  342. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/keybinding-hints.ts +24 -0
  343. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/login-dialog.ts +178 -0
  344. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/model-selector.ts +338 -0
  345. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/oauth-selector.ts +121 -0
  346. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/scoped-models-selector.ts +355 -0
  347. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/session-selector-search.ts +194 -0
  348. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/session-selector.ts +1026 -0
  349. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/settings-selector.ts +456 -0
  350. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/show-images-selector.ts +50 -0
  351. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/skill-invocation-message.ts +55 -0
  352. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/theme-selector.ts +67 -0
  353. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/thinking-selector.ts +74 -0
  354. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/tool-execution.ts +352 -0
  355. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/tree-selector.ts +1246 -0
  356. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/user-message-selector.ts +155 -0
  357. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/user-message.ts +35 -0
  358. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/visual-truncate.ts +50 -0
  359. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/interactive-mode.ts +5155 -0
  360. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/theme/dark.json +85 -0
  361. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/theme/light.json +84 -0
  362. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/theme/theme-schema.json +335 -0
  363. package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/theme/theme.ts +1141 -0
  364. package/pi.dev-src/pi-mono/coding-agent/src/modes/print-mode.ts +158 -0
  365. package/pi.dev-src/pi-mono/coding-agent/src/modes/rpc/jsonl.ts +58 -0
  366. package/pi.dev-src/pi-mono/coding-agent/src/modes/rpc/rpc-client.ts +515 -0
  367. package/pi.dev-src/pi-mono/coding-agent/src/modes/rpc/rpc-mode.ts +745 -0
  368. package/pi.dev-src/pi-mono/coding-agent/src/modes/rpc/rpc-types.ts +264 -0
  369. package/pi.dev-src/pi-mono/coding-agent/src/package-manager-cli.ts +270 -0
  370. package/pi.dev-src/pi-mono/coding-agent/src/utils/changelog.ts +99 -0
  371. package/pi.dev-src/pi-mono/coding-agent/src/utils/child-process.ts +86 -0
  372. package/pi.dev-src/pi-mono/coding-agent/src/utils/clipboard-image.ts +300 -0
  373. package/pi.dev-src/pi-mono/coding-agent/src/utils/clipboard-native.ts +22 -0
  374. package/pi.dev-src/pi-mono/coding-agent/src/utils/clipboard.ts +81 -0
  375. package/pi.dev-src/pi-mono/coding-agent/src/utils/exif-orientation.ts +183 -0
  376. package/pi.dev-src/pi-mono/coding-agent/src/utils/frontmatter.ts +39 -0
  377. package/pi.dev-src/pi-mono/coding-agent/src/utils/fs-watch.ts +30 -0
  378. package/pi.dev-src/pi-mono/coding-agent/src/utils/git.ts +192 -0
  379. package/pi.dev-src/pi-mono/coding-agent/src/utils/image-convert.ts +41 -0
  380. package/pi.dev-src/pi-mono/coding-agent/src/utils/image-resize.ts +176 -0
  381. package/pi.dev-src/pi-mono/coding-agent/src/utils/mime.ts +30 -0
  382. package/pi.dev-src/pi-mono/coding-agent/src/utils/paths.ts +20 -0
  383. package/pi.dev-src/pi-mono/coding-agent/src/utils/photon.ts +139 -0
  384. package/pi.dev-src/pi-mono/coding-agent/src/utils/shell.ts +210 -0
  385. package/pi.dev-src/pi-mono/coding-agent/src/utils/sleep.ts +18 -0
  386. package/pi.dev-src/pi-mono/coding-agent/src/utils/tools-manager.ts +287 -0
  387. package/pi.dev-src/pi-mono/coding-agent/test/agent-session-auto-compaction-queue.test.ts +437 -0
  388. package/pi.dev-src/pi-mono/coding-agent/test/agent-session-branching.test.ts +156 -0
  389. package/pi.dev-src/pi-mono/coding-agent/test/agent-session-compaction.test.ts +208 -0
  390. package/pi.dev-src/pi-mono/coding-agent/test/agent-session-concurrent.test.ts +618 -0
  391. package/pi.dev-src/pi-mono/coding-agent/test/agent-session-dynamic-provider.test.ts +117 -0
  392. package/pi.dev-src/pi-mono/coding-agent/test/agent-session-dynamic-tools.test.ts +182 -0
  393. package/pi.dev-src/pi-mono/coding-agent/test/agent-session-retry.test.ts +318 -0
  394. package/pi.dev-src/pi-mono/coding-agent/test/agent-session-runtime-events.test.ts +208 -0
  395. package/pi.dev-src/pi-mono/coding-agent/test/agent-session-stats.test.ts +143 -0
  396. package/pi.dev-src/pi-mono/coding-agent/test/agent-session-tree-navigation.test.ts +323 -0
  397. package/pi.dev-src/pi-mono/coding-agent/test/args.test.ts +328 -0
  398. package/pi.dev-src/pi-mono/coding-agent/test/assistant-message.test.ts +57 -0
  399. package/pi.dev-src/pi-mono/coding-agent/test/auth-storage.test.ts +462 -0
  400. package/pi.dev-src/pi-mono/coding-agent/test/bash-close-hang-windows.test.ts +126 -0
  401. package/pi.dev-src/pi-mono/coding-agent/test/bash-execution-width.test.ts +80 -0
  402. package/pi.dev-src/pi-mono/coding-agent/test/block-images.test.ts +120 -0
  403. package/pi.dev-src/pi-mono/coding-agent/test/clipboard-image-bmp-conversion.test.ts +88 -0
  404. package/pi.dev-src/pi-mono/coding-agent/test/clipboard-image.test.ts +136 -0
  405. package/pi.dev-src/pi-mono/coding-agent/test/compaction-extensions-example.test.ts +66 -0
  406. package/pi.dev-src/pi-mono/coding-agent/test/compaction-extensions.test.ts +415 -0
  407. package/pi.dev-src/pi-mono/coding-agent/test/compaction-serialization.test.ts +79 -0
  408. package/pi.dev-src/pi-mono/coding-agent/test/compaction-summary-reasoning.test.ts +118 -0
  409. package/pi.dev-src/pi-mono/coding-agent/test/compaction-thinking-model.test.ts +223 -0
  410. package/pi.dev-src/pi-mono/coding-agent/test/compaction.test.ts +550 -0
  411. package/pi.dev-src/pi-mono/coding-agent/test/config.test.ts +30 -0
  412. package/pi.dev-src/pi-mono/coding-agent/test/edit-tool-legacy-input.test.ts +116 -0
  413. package/pi.dev-src/pi-mono/coding-agent/test/edit-tool-no-full-redraw.test.ts +235 -0
  414. package/pi.dev-src/pi-mono/coding-agent/test/export-html-whitespace.test.ts +12 -0
  415. package/pi.dev-src/pi-mono/coding-agent/test/export-html-xss.test.ts +28 -0
  416. package/pi.dev-src/pi-mono/coding-agent/test/extensions-discovery.test.ts +463 -0
  417. package/pi.dev-src/pi-mono/coding-agent/test/extensions-input-event.test.ts +112 -0
  418. package/pi.dev-src/pi-mono/coding-agent/test/extensions-runner.test.ts +805 -0
  419. package/pi.dev-src/pi-mono/coding-agent/test/file-mutation-queue.test.ts +163 -0
  420. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/assistant-message-with-thinking-code.json +33 -0
  421. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/before-compaction.jsonl +1003 -0
  422. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/empty-agent/.gitkeep +0 -0
  423. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/empty-cwd/.gitkeep +0 -0
  424. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/large-session.jsonl +1019 -0
  425. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/consecutive-hyphens/SKILL.md +8 -0
  426. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/disable-model-invocation/SKILL.md +9 -0
  427. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/invalid-name-chars/SKILL.md +8 -0
  428. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/invalid-yaml/SKILL.md +8 -0
  429. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/long-name/SKILL.md +8 -0
  430. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/missing-description/SKILL.md +7 -0
  431. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/multiline-description/SKILL.md +11 -0
  432. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/name-mismatch/SKILL.md +8 -0
  433. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/nested/child-skill/SKILL.md +8 -0
  434. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/no-frontmatter/SKILL.md +3 -0
  435. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/root-skill-preferred/SKILL.md +3 -0
  436. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/root-skill-preferred/nested-child/SKILL.md +3 -0
  437. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/unknown-field/SKILL.md +10 -0
  438. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/valid-skill/SKILL.md +8 -0
  439. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills-collision/first/calendar/SKILL.md +8 -0
  440. package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills-collision/second/calendar/SKILL.md +8 -0
  441. package/pi.dev-src/pi-mono/coding-agent/test/footer-data-provider.test.ts +265 -0
  442. package/pi.dev-src/pi-mono/coding-agent/test/footer-width.test.ts +115 -0
  443. package/pi.dev-src/pi-mono/coding-agent/test/frontmatter.test.ts +60 -0
  444. package/pi.dev-src/pi-mono/coding-agent/test/git-ssh-url.test.ts +78 -0
  445. package/pi.dev-src/pi-mono/coding-agent/test/git-update.test.ts +411 -0
  446. package/pi.dev-src/pi-mono/coding-agent/test/image-processing.test.ts +145 -0
  447. package/pi.dev-src/pi-mono/coding-agent/test/image-resize-callers.test.ts +53 -0
  448. package/pi.dev-src/pi-mono/coding-agent/test/initial-message.test.ts +48 -0
  449. package/pi.dev-src/pi-mono/coding-agent/test/interactive-mode-anthropic-warning.test.ts +73 -0
  450. package/pi.dev-src/pi-mono/coding-agent/test/interactive-mode-clone-command.test.ts +77 -0
  451. package/pi.dev-src/pi-mono/coding-agent/test/interactive-mode-compaction.test.ts +57 -0
  452. package/pi.dev-src/pi-mono/coding-agent/test/interactive-mode-import-command.test.ts +144 -0
  453. package/pi.dev-src/pi-mono/coding-agent/test/interactive-mode-status.test.ts +635 -0
  454. package/pi.dev-src/pi-mono/coding-agent/test/interactive-mode-suspend.test.ts +149 -0
  455. package/pi.dev-src/pi-mono/coding-agent/test/keybindings-migration.test.ts +88 -0
  456. package/pi.dev-src/pi-mono/coding-agent/test/model-registry.test.ts +1209 -0
  457. package/pi.dev-src/pi-mono/coding-agent/test/model-resolver.test.ts +436 -0
  458. package/pi.dev-src/pi-mono/coding-agent/test/package-command-paths.test.ts +144 -0
  459. package/pi.dev-src/pi-mono/coding-agent/test/package-manager-ssh.test.ts +97 -0
  460. package/pi.dev-src/pi-mono/coding-agent/test/package-manager.test.ts +1795 -0
  461. package/pi.dev-src/pi-mono/coding-agent/test/path-utils.test.ts +162 -0
  462. package/pi.dev-src/pi-mono/coding-agent/test/plan-mode-utils.test.ts +261 -0
  463. package/pi.dev-src/pi-mono/coding-agent/test/print-mode.test.ts +140 -0
  464. package/pi.dev-src/pi-mono/coding-agent/test/prompt-templates.test.ts +515 -0
  465. package/pi.dev-src/pi-mono/coding-agent/test/resource-loader.test.ts +576 -0
  466. package/pi.dev-src/pi-mono/coding-agent/test/rpc-client-clone.test.ts +29 -0
  467. package/pi.dev-src/pi-mono/coding-agent/test/rpc-example.ts +86 -0
  468. package/pi.dev-src/pi-mono/coding-agent/test/rpc-jsonl.test.ts +65 -0
  469. package/pi.dev-src/pi-mono/coding-agent/test/rpc-prompt-response-semantics.test.ts +285 -0
  470. package/pi.dev-src/pi-mono/coding-agent/test/rpc.test.ts +321 -0
  471. package/pi.dev-src/pi-mono/coding-agent/test/sdk-codex-cache-probe-tool-loop.ts +364 -0
  472. package/pi.dev-src/pi-mono/coding-agent/test/sdk-openrouter-attribution.test.ts +181 -0
  473. package/pi.dev-src/pi-mono/coding-agent/test/sdk-session-manager.test.ts +95 -0
  474. package/pi.dev-src/pi-mono/coding-agent/test/sdk-skills.test.ts +109 -0
  475. package/pi.dev-src/pi-mono/coding-agent/test/session-cwd.test.ts +91 -0
  476. package/pi.dev-src/pi-mono/coding-agent/test/session-info-modified-timestamp.test.ts +83 -0
  477. package/pi.dev-src/pi-mono/coding-agent/test/session-manager/build-context.test.ts +268 -0
  478. package/pi.dev-src/pi-mono/coding-agent/test/session-manager/custom-session-id.test.ts +109 -0
  479. package/pi.dev-src/pi-mono/coding-agent/test/session-manager/file-operations.test.ts +208 -0
  480. package/pi.dev-src/pi-mono/coding-agent/test/session-manager/labels.test.ts +198 -0
  481. package/pi.dev-src/pi-mono/coding-agent/test/session-manager/migration.test.ts +78 -0
  482. package/pi.dev-src/pi-mono/coding-agent/test/session-manager/save-entry.test.ts +55 -0
  483. package/pi.dev-src/pi-mono/coding-agent/test/session-manager/tree-traversal.test.ts +533 -0
  484. package/pi.dev-src/pi-mono/coding-agent/test/session-selector-path-delete.test.ts +315 -0
  485. package/pi.dev-src/pi-mono/coding-agent/test/session-selector-rename.test.ts +111 -0
  486. package/pi.dev-src/pi-mono/coding-agent/test/session-selector-search.test.ts +195 -0
  487. package/pi.dev-src/pi-mono/coding-agent/test/settings-manager-bug.test.ts +147 -0
  488. package/pi.dev-src/pi-mono/coding-agent/test/settings-manager.test.ts +319 -0
  489. package/pi.dev-src/pi-mono/coding-agent/test/skills.test.ts +432 -0
  490. package/pi.dev-src/pi-mono/coding-agent/test/stdout-cleanliness.test.ts +103 -0
  491. package/pi.dev-src/pi-mono/coding-agent/test/streaming-render-debug.ts +97 -0
  492. package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-bash-persistence.test.ts +242 -0
  493. package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-compaction.test.ts +343 -0
  494. package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-model-extension.test.ts +325 -0
  495. package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-prompt.test.ts +323 -0
  496. package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-queue.test.ts +422 -0
  497. package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-retry-events.test.ts +358 -0
  498. package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-runtime.test.ts +553 -0
  499. package/pi.dev-src/pi-mono/coding-agent/test/suite/harness.ts +208 -0
  500. package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/2023-queued-slash-command-followup.test.ts +80 -0
  501. package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/2753-reload-stale-resource-settings.test.ts +100 -0
  502. package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/2781-skill-collision-precedence.test.ts +120 -0
  503. package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/2791-fswatch-error-crash.test.ts +106 -0
  504. package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/2835-tools-allowlist-filters-extension-tools.test.ts +94 -0
  505. package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/2860-replaced-session-context.test.ts +274 -0
  506. package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/3217-scoped-model-order.test.ts +104 -0
  507. package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/3302-find-path-glob.test.ts +72 -0
  508. package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/3303-find-nested-gitignore.test.ts +83 -0
  509. package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/3317-network-connection-lost-retry.test.ts +33 -0
  510. package/pi.dev-src/pi-mono/coding-agent/test/system-prompt.test.ts +102 -0
  511. package/pi.dev-src/pi-mono/coding-agent/test/test-harness.test.ts +321 -0
  512. package/pi.dev-src/pi-mono/coding-agent/test/test-harness.ts +446 -0
  513. package/pi.dev-src/pi-mono/coding-agent/test/test-theme-colors.ts +246 -0
  514. package/pi.dev-src/pi-mono/coding-agent/test/theme-export.test.ts +104 -0
  515. package/pi.dev-src/pi-mono/coding-agent/test/tool-execution-component.test.ts +331 -0
  516. package/pi.dev-src/pi-mono/coding-agent/test/tools.test.ts +889 -0
  517. package/pi.dev-src/pi-mono/coding-agent/test/tree-selector.test.ts +655 -0
  518. package/pi.dev-src/pi-mono/coding-agent/test/trigger-compact-extension.test.ts +57 -0
  519. package/pi.dev-src/pi-mono/coding-agent/test/truncate-to-width.test.ts +81 -0
  520. package/pi.dev-src/pi-mono/coding-agent/test/user-message.test.ts +25 -0
  521. package/pi.dev-src/pi-mono/coding-agent/test/utilities.ts +316 -0
  522. package/pi.dev-src/pi-mono/coding-agent/tsconfig.examples.json +16 -0
  523. package/pi.dev-src/pi-mono/coding-agent/vitest.config.ts +26 -0
  524. package/pi.dev-src/pi-mono/mom/dev.sh +30 -0
  525. package/pi.dev-src/pi-mono/mom/docker.sh +95 -0
  526. package/pi.dev-src/pi-mono/mom/scripts/migrate-timestamps.ts +121 -0
  527. package/pi.dev-src/pi-mono/mom/src/agent.ts +882 -0
  528. package/pi.dev-src/pi-mono/mom/src/context.ts +180 -0
  529. package/pi.dev-src/pi-mono/mom/src/download.ts +117 -0
  530. package/pi.dev-src/pi-mono/mom/src/events.ts +442 -0
  531. package/pi.dev-src/pi-mono/mom/src/fs-watch.ts +30 -0
  532. package/pi.dev-src/pi-mono/mom/src/log.ts +271 -0
  533. package/pi.dev-src/pi-mono/mom/src/main.ts +367 -0
  534. package/pi.dev-src/pi-mono/mom/src/sandbox.ts +221 -0
  535. package/pi.dev-src/pi-mono/mom/src/slack.ts +623 -0
  536. package/pi.dev-src/pi-mono/mom/src/store.ts +234 -0
  537. package/pi.dev-src/pi-mono/mom/src/tools/attach.ts +47 -0
  538. package/pi.dev-src/pi-mono/mom/src/tools/bash.ts +97 -0
  539. package/pi.dev-src/pi-mono/mom/src/tools/edit.ts +165 -0
  540. package/pi.dev-src/pi-mono/mom/src/tools/index.ts +19 -0
  541. package/pi.dev-src/pi-mono/mom/src/tools/read.ts +159 -0
  542. package/pi.dev-src/pi-mono/mom/src/tools/truncate.ts +236 -0
  543. package/pi.dev-src/pi-mono/mom/src/tools/write.ts +45 -0
  544. package/pi.dev-src/pi-mono/mom/test/events.test.ts +50 -0
  545. package/pi.dev-src/pi-mono/pods/scripts/model_run.sh +83 -0
  546. package/pi.dev-src/pi-mono/pods/scripts/pod_setup.sh +336 -0
  547. package/pi.dev-src/pi-mono/pods/src/cli.ts +360 -0
  548. package/pi.dev-src/pi-mono/pods/src/commands/models.ts +753 -0
  549. package/pi.dev-src/pi-mono/pods/src/commands/pods.ts +205 -0
  550. package/pi.dev-src/pi-mono/pods/src/commands/prompt.ts +84 -0
  551. package/pi.dev-src/pi-mono/pods/src/config.ts +80 -0
  552. package/pi.dev-src/pi-mono/pods/src/index.ts +2 -0
  553. package/pi.dev-src/pi-mono/pods/src/model-configs.ts +111 -0
  554. package/pi.dev-src/pi-mono/pods/src/models.json +295 -0
  555. package/pi.dev-src/pi-mono/pods/src/ssh.ts +151 -0
  556. package/pi.dev-src/pi-mono/pods/src/types.ts +27 -0
  557. package/pi.dev-src/pi-mono/tui/src/autocomplete.ts +783 -0
  558. package/pi.dev-src/pi-mono/tui/src/components/box.ts +137 -0
  559. package/pi.dev-src/pi-mono/tui/src/components/cancellable-loader.ts +40 -0
  560. package/pi.dev-src/pi-mono/tui/src/components/editor.ts +2280 -0
  561. package/pi.dev-src/pi-mono/tui/src/components/image.ts +104 -0
  562. package/pi.dev-src/pi-mono/tui/src/components/input.ts +503 -0
  563. package/pi.dev-src/pi-mono/tui/src/components/loader.ts +86 -0
  564. package/pi.dev-src/pi-mono/tui/src/components/markdown.ts +852 -0
  565. package/pi.dev-src/pi-mono/tui/src/components/select-list.ts +229 -0
  566. package/pi.dev-src/pi-mono/tui/src/components/settings-list.ts +250 -0
  567. package/pi.dev-src/pi-mono/tui/src/components/spacer.ts +28 -0
  568. package/pi.dev-src/pi-mono/tui/src/components/text.ts +106 -0
  569. package/pi.dev-src/pi-mono/tui/src/components/truncated-text.ts +65 -0
  570. package/pi.dev-src/pi-mono/tui/src/editor-component.ts +74 -0
  571. package/pi.dev-src/pi-mono/tui/src/fuzzy.ts +133 -0
  572. package/pi.dev-src/pi-mono/tui/src/index.ts +106 -0
  573. package/pi.dev-src/pi-mono/tui/src/keybindings.ts +244 -0
  574. package/pi.dev-src/pi-mono/tui/src/keys.ts +1400 -0
  575. package/pi.dev-src/pi-mono/tui/src/kill-ring.ts +46 -0
  576. package/pi.dev-src/pi-mono/tui/src/stdin-buffer.ts +386 -0
  577. package/pi.dev-src/pi-mono/tui/src/terminal-image.ts +414 -0
  578. package/pi.dev-src/pi-mono/tui/src/terminal.ts +373 -0
  579. package/pi.dev-src/pi-mono/tui/src/tui.ts +1243 -0
  580. package/pi.dev-src/pi-mono/tui/src/undo-stack.ts +28 -0
  581. package/pi.dev-src/pi-mono/tui/src/utils.ts +1085 -0
  582. package/pi.dev-src/pi-mono/tui/test/autocomplete.test.ts +542 -0
  583. package/pi.dev-src/pi-mono/tui/test/bug-regression-isimageline-startswith-bug.test.ts +237 -0
  584. package/pi.dev-src/pi-mono/tui/test/chat-simple.ts +129 -0
  585. package/pi.dev-src/pi-mono/tui/test/editor.test.ts +3812 -0
  586. package/pi.dev-src/pi-mono/tui/test/fuzzy.test.ts +98 -0
  587. package/pi.dev-src/pi-mono/tui/test/image-test.ts +56 -0
  588. package/pi.dev-src/pi-mono/tui/test/input.test.ts +580 -0
  589. package/pi.dev-src/pi-mono/tui/test/key-tester.ts +105 -0
  590. package/pi.dev-src/pi-mono/tui/test/keybindings.test.ts +38 -0
  591. package/pi.dev-src/pi-mono/tui/test/keys.test.ts +614 -0
  592. package/pi.dev-src/pi-mono/tui/test/markdown.test.ts +1236 -0
  593. package/pi.dev-src/pi-mono/tui/test/overlay-non-capturing.test.ts +609 -0
  594. package/pi.dev-src/pi-mono/tui/test/overlay-options.test.ts +538 -0
  595. package/pi.dev-src/pi-mono/tui/test/overlay-short-content.test.ts +56 -0
  596. package/pi.dev-src/pi-mono/tui/test/regression-regional-indicator-width.test.ts +52 -0
  597. package/pi.dev-src/pi-mono/tui/test/select-list.test.ts +116 -0
  598. package/pi.dev-src/pi-mono/tui/test/stdin-buffer.test.ts +422 -0
  599. package/pi.dev-src/pi-mono/tui/test/terminal-image.test.ts +279 -0
  600. package/pi.dev-src/pi-mono/tui/test/test-themes.ts +38 -0
  601. package/pi.dev-src/pi-mono/tui/test/truncate-to-width.test.ts +62 -0
  602. package/pi.dev-src/pi-mono/tui/test/truncated-text.test.ts +129 -0
  603. package/pi.dev-src/pi-mono/tui/test/tui-cell-size-input.test.ts +81 -0
  604. package/pi.dev-src/pi-mono/tui/test/tui-overlay-style-leak.test.ts +72 -0
  605. package/pi.dev-src/pi-mono/tui/test/tui-render.test.ts +509 -0
  606. package/pi.dev-src/pi-mono/tui/test/viewport-overwrite-repro.ts +106 -0
  607. package/pi.dev-src/pi-mono/tui/test/virtual-terminal.ts +218 -0
  608. package/pi.dev-src/pi-mono/tui/test/wrap-ansi.test.ts +207 -0
  609. package/pi.dev-src/pi-mono/tui/vitest.config.ts +7 -0
  610. package/pi.dev-src/pi-mono/web-ui/example/index.html +13 -0
  611. package/pi.dev-src/pi-mono/web-ui/example/src/app.css +1 -0
  612. package/pi.dev-src/pi-mono/web-ui/example/src/custom-messages.ts +99 -0
  613. package/pi.dev-src/pi-mono/web-ui/example/src/main.ts +421 -0
  614. package/pi.dev-src/pi-mono/web-ui/example/tsconfig.json +23 -0
  615. package/pi.dev-src/pi-mono/web-ui/example/vite.config.ts +6 -0
  616. package/pi.dev-src/pi-mono/web-ui/scripts/count-prompt-tokens.ts +88 -0
  617. package/pi.dev-src/pi-mono/web-ui/src/ChatPanel.ts +209 -0
  618. package/pi.dev-src/pi-mono/web-ui/src/app.css +68 -0
  619. package/pi.dev-src/pi-mono/web-ui/src/components/AgentInterface.ts +403 -0
  620. package/pi.dev-src/pi-mono/web-ui/src/components/AttachmentTile.ts +107 -0
  621. package/pi.dev-src/pi-mono/web-ui/src/components/ConsoleBlock.ts +72 -0
  622. package/pi.dev-src/pi-mono/web-ui/src/components/CustomProviderCard.ts +100 -0
  623. package/pi.dev-src/pi-mono/web-ui/src/components/ExpandableSection.ts +46 -0
  624. package/pi.dev-src/pi-mono/web-ui/src/components/Input.ts +113 -0
  625. package/pi.dev-src/pi-mono/web-ui/src/components/MessageEditor.ts +405 -0
  626. package/pi.dev-src/pi-mono/web-ui/src/components/MessageList.ts +98 -0
  627. package/pi.dev-src/pi-mono/web-ui/src/components/Messages.ts +383 -0
  628. package/pi.dev-src/pi-mono/web-ui/src/components/ProviderKeyInput.ts +153 -0
  629. package/pi.dev-src/pi-mono/web-ui/src/components/SandboxedIframe.ts +626 -0
  630. package/pi.dev-src/pi-mono/web-ui/src/components/StreamingMessageContainer.ts +103 -0
  631. package/pi.dev-src/pi-mono/web-ui/src/components/ThinkingBlock.ts +43 -0
  632. package/pi.dev-src/pi-mono/web-ui/src/components/message-renderer-registry.ts +28 -0
  633. package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/ArtifactsRuntimeProvider.ts +220 -0
  634. package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/AttachmentsRuntimeProvider.ts +66 -0
  635. package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/ConsoleRuntimeProvider.ts +186 -0
  636. package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/FileDownloadRuntimeProvider.ts +110 -0
  637. package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/RuntimeMessageBridge.ts +82 -0
  638. package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/RuntimeMessageRouter.ts +216 -0
  639. package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/SandboxRuntimeProvider.ts +52 -0
  640. package/pi.dev-src/pi-mono/web-ui/src/dialogs/ApiKeyPromptDialog.ts +75 -0
  641. package/pi.dev-src/pi-mono/web-ui/src/dialogs/AttachmentOverlay.ts +636 -0
  642. package/pi.dev-src/pi-mono/web-ui/src/dialogs/CustomProviderDialog.ts +274 -0
  643. package/pi.dev-src/pi-mono/web-ui/src/dialogs/ModelSelector.ts +370 -0
  644. package/pi.dev-src/pi-mono/web-ui/src/dialogs/PersistentStorageDialog.ts +144 -0
  645. package/pi.dev-src/pi-mono/web-ui/src/dialogs/ProvidersModelsTab.ts +212 -0
  646. package/pi.dev-src/pi-mono/web-ui/src/dialogs/SessionListDialog.ts +150 -0
  647. package/pi.dev-src/pi-mono/web-ui/src/dialogs/SettingsDialog.ts +218 -0
  648. package/pi.dev-src/pi-mono/web-ui/src/index.ts +120 -0
  649. package/pi.dev-src/pi-mono/web-ui/src/prompts/prompts.ts +282 -0
  650. package/pi.dev-src/pi-mono/web-ui/src/storage/app-storage.ts +60 -0
  651. package/pi.dev-src/pi-mono/web-ui/src/storage/backends/indexeddb-storage-backend.ts +193 -0
  652. package/pi.dev-src/pi-mono/web-ui/src/storage/store.ts +33 -0
  653. package/pi.dev-src/pi-mono/web-ui/src/storage/stores/custom-providers-store.ts +62 -0
  654. package/pi.dev-src/pi-mono/web-ui/src/storage/stores/provider-keys-store.ts +33 -0
  655. package/pi.dev-src/pi-mono/web-ui/src/storage/stores/sessions-store.ts +136 -0
  656. package/pi.dev-src/pi-mono/web-ui/src/storage/stores/settings-store.ts +34 -0
  657. package/pi.dev-src/pi-mono/web-ui/src/storage/types.ts +206 -0
  658. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/ArtifactElement.ts +14 -0
  659. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/ArtifactPill.ts +26 -0
  660. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/Console.ts +93 -0
  661. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/DocxArtifact.ts +213 -0
  662. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/ExcelArtifact.ts +231 -0
  663. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/GenericArtifact.ts +117 -0
  664. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/HtmlArtifact.ts +195 -0
  665. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/ImageArtifact.ts +116 -0
  666. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/MarkdownArtifact.ts +82 -0
  667. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/PdfArtifact.ts +201 -0
  668. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/SvgArtifact.ts +119 -0
  669. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/TextArtifact.ts +148 -0
  670. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/artifacts-tool-renderer.ts +310 -0
  671. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/artifacts.ts +713 -0
  672. package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/index.ts +7 -0
  673. package/pi.dev-src/pi-mono/web-ui/src/tools/extract-document.ts +275 -0
  674. package/pi.dev-src/pi-mono/web-ui/src/tools/index.ts +46 -0
  675. package/pi.dev-src/pi-mono/web-ui/src/tools/javascript-repl.ts +293 -0
  676. package/pi.dev-src/pi-mono/web-ui/src/tools/renderer-registry.ts +130 -0
  677. package/pi.dev-src/pi-mono/web-ui/src/tools/renderers/BashRenderer.ts +52 -0
  678. package/pi.dev-src/pi-mono/web-ui/src/tools/renderers/CalculateRenderer.ts +58 -0
  679. package/pi.dev-src/pi-mono/web-ui/src/tools/renderers/DefaultRenderer.ts +103 -0
  680. package/pi.dev-src/pi-mono/web-ui/src/tools/renderers/GetCurrentTimeRenderer.ts +92 -0
  681. package/pi.dev-src/pi-mono/web-ui/src/tools/types.ts +15 -0
  682. package/pi.dev-src/pi-mono/web-ui/src/utils/attachment-utils.ts +472 -0
  683. package/pi.dev-src/pi-mono/web-ui/src/utils/auth-token.ts +22 -0
  684. package/pi.dev-src/pi-mono/web-ui/src/utils/format.ts +42 -0
  685. package/pi.dev-src/pi-mono/web-ui/src/utils/i18n.ts +653 -0
  686. package/pi.dev-src/pi-mono/web-ui/src/utils/model-discovery.ts +277 -0
  687. package/pi.dev-src/pi-mono/web-ui/src/utils/proxy-utils.ts +139 -0
  688. package/pi.dev-src/pi-mono/web-ui/src/utils/test-sessions.ts +2357 -0
  689. package/pi.dev-src/pi-mono/web-ui/tsconfig.json +7 -0
  690. package/scripts/lib/extension-debug-harness.ts +3 -10
  691. package/scripts/lib/recording-extension-api.ts +71 -2
  692. package/scripts/pi-usereq-debug.sh +1 -1
  693. package/scripts/tool-args-to-params.ts +4 -15
  694. package/src/cli.ts +24 -68
  695. package/src/core/agent-tool-json.ts +53 -239
  696. package/src/core/compress-payload.ts +4 -74
  697. package/src/core/compress.ts +26 -15
  698. package/src/core/config.ts +468 -42
  699. package/src/core/debug-runtime.ts +542 -0
  700. package/src/core/extension-status.ts +314 -59
  701. package/src/core/find-constructs.ts +3 -3
  702. package/src/core/find-payload.ts +26 -132
  703. package/src/core/path-context.ts +346 -81
  704. package/src/core/pi-notify.ts +115 -5
  705. package/src/core/pi-usereq-tools.ts +57 -19
  706. package/src/core/prompt-command-catalog.ts +46 -0
  707. package/src/core/prompt-command-runtime.ts +1816 -0
  708. package/src/core/prompt-command-state.ts +211 -0
  709. package/src/core/prompts.ts +173 -41
  710. package/src/core/reference-payload.ts +5 -63
  711. package/src/core/resources.ts +61 -5
  712. package/src/core/runtime-project-paths.ts +21 -1
  713. package/src/core/settings-menu.ts +12 -6
  714. package/src/core/source-analyzer.ts +27 -7
  715. package/src/core/token-counter.ts +6 -76
  716. package/src/core/tool-runner.ts +38 -317
  717. package/src/index.ts +2047 -947
  718. package/src/resources/instructions/git_commit.md +16 -0
  719. package/src/resources/instructions/git_read-only.md +2 -0
  720. package/src/resources/prompts/analyze.md +12 -13
  721. package/src/resources/prompts/change.md +21 -59
  722. package/src/resources/prompts/check.md +14 -16
  723. package/src/resources/prompts/cover.md +21 -59
  724. package/src/resources/prompts/create.md +5 -4
  725. package/src/resources/prompts/fix.md +20 -58
  726. package/src/resources/prompts/flowchart.md +14 -49
  727. package/src/resources/prompts/implement.md +14 -50
  728. package/src/resources/prompts/new.md +20 -58
  729. package/src/resources/prompts/readme.md +14 -50
  730. package/src/resources/prompts/recreate.md +14 -45
  731. package/src/resources/prompts/refactor.md +20 -58
  732. package/src/resources/prompts/references.md +7 -43
  733. package/src/resources/prompts/renumber.md +8 -39
  734. package/src/resources/prompts/workflow.md +14 -50
  735. package/src/resources/prompts/write.md +5 -4
  736. package/tests/attended-results-scenarios.ts +30 -136
  737. package/tests/cli-command-option-parity.test.ts +148 -192
  738. package/tests/debug-extension-harness.test.ts +77 -70
  739. package/tests/extension-registration.test.ts +3205 -658
  740. package/tests/fixtures_attended_results/project/compress-line-numbers.json +1 -1
  741. package/tests/fixtures_attended_results/project/compress.json +1 -1
  742. package/tests/fixtures_attended_results/project/find-line-numbers.json +1 -1
  743. package/tests/fixtures_attended_results/project/find.json +1 -1
  744. package/tests/fixtures_attended_results/project/references.json +2 -2
  745. package/tests/fixtures_attended_results/standalone/files-compress/fixture_go.go.json +1 -1
  746. package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_go.go.json +1 -1
  747. package/tests/fixtures_attended_results/standalone/files-find/fixture_go.go.json +1 -1
  748. package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_go.go.json +1 -1
  749. package/tests/fixtures_attended_results/standalone/files-references/fixture_c.c.json +1 -1
  750. package/tests/fixtures_attended_results/standalone/files-references/fixture_cpp.cpp.json +1 -1
  751. package/tests/fixtures_attended_results/standalone/files-references/fixture_csharp.cs.json +1 -1
  752. package/tests/fixtures_attended_results/standalone/files-references/fixture_elixir.ex.json +1 -1
  753. package/tests/fixtures_attended_results/standalone/files-references/fixture_go.go.json +1 -1
  754. package/tests/fixtures_attended_results/standalone/files-references/fixture_haskell.hs.json +1 -1
  755. package/tests/fixtures_attended_results/standalone/files-references/fixture_java.java.json +1 -1
  756. package/tests/fixtures_attended_results/standalone/files-references/fixture_javascript.js.json +1 -1
  757. package/tests/fixtures_attended_results/standalone/files-references/fixture_kotlin.kt.json +1 -1
  758. package/tests/fixtures_attended_results/standalone/files-references/fixture_lua.lua.json +1 -1
  759. package/tests/fixtures_attended_results/standalone/files-references/fixture_perl.pl.json +1 -1
  760. package/tests/fixtures_attended_results/standalone/files-references/fixture_php.php.json +1 -1
  761. package/tests/fixtures_attended_results/standalone/files-references/fixture_python.py.json +1 -1
  762. package/tests/fixtures_attended_results/standalone/files-references/fixture_ruby.rb.json +1 -1
  763. package/tests/fixtures_attended_results/standalone/files-references/fixture_rust.rs.json +1 -1
  764. package/tests/fixtures_attended_results/standalone/files-references/fixture_scala.scala.json +1 -1
  765. package/tests/fixtures_attended_results/standalone/files-references/fixture_shell.sh.json +1 -1
  766. package/tests/fixtures_attended_results/standalone/files-references/fixture_swift.swift.json +1 -1
  767. package/tests/fixtures_attended_results/standalone/files-references/fixture_typescript.ts.json +1 -1
  768. package/tests/fixtures_attended_results/standalone/files-references/fixture_zig.zig.json +1 -1
  769. package/tests/helpers.ts +24 -15
  770. package/tests/oracle-project.test.ts +29 -30
  771. package/tests/oracle-standalone.test.ts +27 -1
  772. package/tests/prompt-rendering.test.ts +40 -9
  773. package/tests/python_oracle_stubs/tiktoken.py +76 -0
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "code": 0,
3
- "stdout": "{\n \"request\": {\n \"tool_name\": \"files-references\",\n \"scope\": \"explicit-files\",\n \"base_dir_path\": \"<ROOT>\",\n \"source_directory_count\": 0,\n \"source_directory_paths\": [],\n \"requested_file_count\": 1,\n \"requested_input_paths\": [\n \"tests/fixtures/fixture_scala.scala\"\n ],\n \"requested_canonical_paths\": [\n \"tests/fixtures/fixture_scala.scala\"\n ]\n },\n \"summary\": {\n \"processable_file_count\": 1,\n \"analyzed_file_count\": 1,\n \"error_file_count\": 0,\n \"skipped_file_count\": 0,\n \"total_symbol_count\": 62,\n \"total_import_count\": 5,\n \"total_comment_count\": 64,\n \"total_standalone_comment_count\": 16,\n \"total_doxygen_field_count\": 167,\n \"symbol_kind_counts\": {\n \"CLASS\": 6,\n \"CONSTANT\": 5,\n \"FUNCTION\": 30,\n \"MODULE\": 6,\n \"TRAIT\": 5,\n \"TYPE_ALIAS\": 5,\n \"VARIABLE\": 5\n }\n },\n \"repository\": {\n \"root_directory_path\": \"<ROOT>\",\n \"source_directory_paths\": [],\n \"file_count\": 1,\n \"file_canonical_paths\": [\n \"tests/fixtures/fixture_scala.scala\"\n ],\n \"directory_tree\": {\n \"node_name\": \".\",\n \"relative_path\": \".\",\n \"node_kind\": \"directory\",\n \"child_count\": 1,\n \"children\": [\n {\n \"node_name\": \"tests\",\n \"relative_path\": \"tests\",\n \"node_kind\": \"directory\",\n \"child_count\": 1,\n \"children\": [\n {\n \"node_name\": \"fixtures\",\n \"relative_path\": \"tests/fixtures\",\n \"node_kind\": \"directory\",\n \"child_count\": 1,\n \"children\": [\n {\n \"node_name\": \"fixture_scala.scala\",\n \"relative_path\": \"tests/fixtures/fixture_scala.scala\",\n \"node_kind\": \"file\",\n \"child_count\": 0,\n \"children\": []\n }\n ]\n }\n ]\n }\n ]\n }\n },\n \"files\": [\n {\n \"start_line_number\": 1,\n \"end_line_number\": 398,\n \"line_range\": [\n 1,\n 398\n ],\n \"request_index\": 0,\n \"input_path\": \"tests/fixtures/fixture_scala.scala\",\n \"canonical_path\": \"tests/fixtures/fixture_scala.scala\",\n \"absolute_path\": \"<ROOT>/tests/fixtures/fixture_scala.scala\",\n \"file_name\": \"fixture_scala.scala\",\n \"file_extension\": \".scala\",\n \"language_id\": \"scala\",\n \"language_name\": \"Scala\",\n \"status\": \"analyzed\",\n \"exists\": true,\n \"is_file\": true,\n \"import_count\": 5,\n \"symbol_count\": 62,\n \"comment_count\": 64,\n \"standalone_comment_count\": 16,\n \"doxygen_field_count\": 167,\n \"file_doxygen\": {\n \"brief\": [\n \"Comprehensive Scala test fixture for parser validation.\"\n ],\n \"details\": [\n \"Covers implicits/givens, pattern matching, higher-kinded types,\\nself-types, variance, opaque types, extension methods, enums,\\nfor comprehensions, and cake pattern.\"\n ]\n },\n \"imports\": [\n {\n \"start_line_number\": 11,\n \"end_line_number\": 11,\n \"line_range\": [\n 11,\n 11\n ],\n \"import_name\": \"scala.collection.mutable\",\n \"statement_text\": \"import scala.collection.mutable\"\n },\n {\n \"start_line_number\": 12,\n \"end_line_number\": 12,\n \"line_range\": [\n 12,\n 12\n ],\n \"import_name\": \"scala.concurrent.{Future, ExecutionContext}\",\n \"statement_text\": \"import scala.concurrent.{Future, ExecutionContext}\"\n },\n {\n \"start_line_number\": 13,\n \"end_line_number\": 13,\n \"line_range\": [\n 13,\n 13\n ],\n \"import_name\": \"scala.util.{Try, Success, Failure}\",\n \"statement_text\": \"import scala.util.{Try, Success, Failure}\"\n },\n {\n \"start_line_number\": 335,\n \"end_line_number\": 335,\n \"line_range\": [\n 335,\n 335\n ],\n \"import_name\": \"scala.util.Random\",\n \"statement_text\": \"import scala.util.Random\"\n },\n {\n \"start_line_number\": 336,\n \"end_line_number\": 336,\n \"line_range\": [\n 336,\n 336\n ],\n \"import_name\": \"scala.concurrent.duration._\",\n \"statement_text\": \"import scala.concurrent.duration._\"\n }\n ],\n \"symbols\": [\n {\n \"start_line_number\": 23,\n \"end_line_number\": 35,\n \"line_range\": [\n 23,\n 35\n ],\n \"declaration_order_index\": 0,\n \"symbol_name\": \"Person\",\n \"qualified_name\": \"Person\",\n \"symbol_kind\": \"CLASS\",\n \"type_label\": \"CLASS\",\n \"signature_text\": \"case class Person(name: String, age: Int)\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Immutable data class for person entities.\",\n \"doxygen\": {\n \"brief\": [\n \"Immutable data class for person entities.\",\n \"Check if the person is an adult.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"name\",\n \"description\": \"Display name.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"age\",\n \"description\": \"Age in years; must be non-negative.\"\n }\n ],\n \"returns\": [\n \"True if age >= 18.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 24,\n \"end_line_number\": 27,\n \"line_range\": [\n 24,\n 27\n ],\n \"text\": \"@brief Check if the person is an adult. @return True if age >= 18.\",\n \"text_lines\": [\n \"@brief Check if the person is an adult. @return True if age >= 18.\"\n ]\n },\n {\n \"start_line_number\": 30,\n \"end_line_number\": 33,\n \"line_range\": [\n 30,\n 33\n ],\n \"text\": \"@brief Create a greeting string. @return Formatted greeting including name and age.\",\n \"text_lines\": [\n \"@brief Create a greeting string. @return Formatted greeting including name and age.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 28,\n \"end_line_number\": 43,\n \"line_range\": [\n 28,\n 43\n ],\n \"declaration_order_index\": 1,\n \"symbol_name\": \"isAdult\",\n \"qualified_name\": \"isAdult\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def isAdult: Boolean = age >= 18\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Check if the person is an adult.\",\n \"doxygen\": {\n \"brief\": [\n \"Check if the person is an adult.\",\n \"Create a greeting string.\"\n ],\n \"returns\": [\n \"True if age >= 18.\",\n \"Formatted greeting including name and age.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 30,\n \"end_line_number\": 33,\n \"line_range\": [\n 30,\n 33\n ],\n \"text\": \"@brief Create a greeting string. @return Formatted greeting including name and age.\",\n \"text_lines\": [\n \"@brief Create a greeting string. @return Formatted greeting including name and age.\"\n ]\n },\n {\n \"start_line_number\": 37,\n \"end_line_number\": 37,\n \"line_range\": [\n 37,\n 37\n ],\n \"text\": \"── Sealed trait hierarchy ─────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Sealed trait hierarchy ─────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 39,\n \"end_line_number\": 42,\n \"line_range\": [\n 39,\n 42\n ],\n \"text\": \"@class Shape @brief Sealed trait for algebraic data type shapes.\",\n \"text_lines\": [\n \"@class Shape @brief Sealed trait for algebraic data type shapes.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 34,\n \"end_line_number\": 43,\n \"line_range\": [\n 34,\n 43\n ],\n \"declaration_order_index\": 2,\n \"symbol_name\": \"greet\",\n \"qualified_name\": \"greet\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def greet: String = s\\\"Hi, I'm $name, age $age\\\"\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Create a greeting string.\",\n \"doxygen\": {\n \"brief\": [\n \"Create a greeting string.\"\n ],\n \"returns\": [\n \"Formatted greeting including name and age.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 37,\n \"end_line_number\": 37,\n \"line_range\": [\n 37,\n 37\n ],\n \"text\": \"── Sealed trait hierarchy ─────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Sealed trait hierarchy ─────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 39,\n \"end_line_number\": 42,\n \"line_range\": [\n 39,\n 42\n ],\n \"text\": \"@class Shape @brief Sealed trait for algebraic data type shapes.\",\n \"text_lines\": [\n \"@class Shape @brief Sealed trait for algebraic data type shapes.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 48,\n \"end_line_number\": 56,\n \"line_range\": [\n 48,\n 56\n ],\n \"declaration_order_index\": 3,\n \"symbol_name\": \"area\",\n \"qualified_name\": \"area\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def area: Double\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Compute the area of this shape.\",\n \"doxygen\": {\n \"brief\": [\n \"Compute the area of this shape.\",\n \"Circle shape with radius.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"radius\",\n \"description\": \"The circle's radius.\"\n }\n ],\n \"returns\": [\n \"Area as a Double.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 51,\n \"end_line_number\": 55,\n \"line_range\": [\n 51,\n 55\n ],\n \"text\": \"@class Circle @brief Circle shape with radius. @param radius The circle's radius.\",\n \"text_lines\": [\n \"@class Circle @brief Circle shape with radius. @param radius The circle's radius.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 56,\n \"end_line_number\": 58,\n \"line_range\": [\n 56,\n 58\n ],\n \"declaration_order_index\": 4,\n \"symbol_name\": \"Circle\",\n \"qualified_name\": \"Circle\",\n \"symbol_kind\": \"CLASS\",\n \"type_label\": \"CLASS\",\n \"signature_text\": \"case class Circle(radius: Double) extends Shape\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Circle shape with radius.\",\n \"doxygen\": {\n \"brief\": [\n \"Circle shape with radius.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"radius\",\n \"description\": \"The circle's radius.\"\n }\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 57,\n \"end_line_number\": 66,\n \"line_range\": [\n 57,\n 66\n ],\n \"declaration_order_index\": 5,\n \"symbol_name\": \"area\",\n \"qualified_name\": \"area\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"override def area: Double = math.Pi * radius * radius\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Rectangle shape with width and height.\",\n \"doxygen\": {\n \"brief\": [\n \"Rectangle shape with width and height.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"width\",\n \"description\": \"The rectangle's width.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"height\",\n \"description\": \"The rectangle's height.\"\n }\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 60,\n \"end_line_number\": 65,\n \"line_range\": [\n 60,\n 65\n ],\n \"text\": \"@class Rectangle @brief Rectangle shape with width and height. @param width The rectangle's width. @param height The rectangle's height.\",\n \"text_lines\": [\n \"@class Rectangle @brief Rectangle shape with width and height. @param width The rectangle's width. @param height The rectangle's height.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 66,\n \"end_line_number\": 68,\n \"line_range\": [\n 66,\n 68\n ],\n \"declaration_order_index\": 6,\n \"symbol_name\": \"Rectangle\",\n \"qualified_name\": \"Rectangle\",\n \"symbol_kind\": \"CLASS\",\n \"type_label\": \"CLASS\",\n \"signature_text\": \"case class Rectangle(width: Double, height: Double) extends Shape\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Rectangle shape with width and height.\",\n \"doxygen\": {\n \"brief\": [\n \"Rectangle shape with width and height.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"width\",\n \"description\": \"The rectangle's width.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"height\",\n \"description\": \"The rectangle's height.\"\n }\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 67,\n \"end_line_number\": 76,\n \"line_range\": [\n 67,\n 76\n ],\n \"declaration_order_index\": 7,\n \"symbol_name\": \"area\",\n \"qualified_name\": \"area\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"override def area: Double = width * height\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [\n {\n \"start_line_number\": 70,\n \"end_line_number\": 70,\n \"line_range\": [\n 70,\n 70\n ],\n \"text\": \"── Abstract class ─────────────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Abstract class ─────────────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 72,\n \"end_line_number\": 75,\n \"line_range\": [\n 72,\n 75\n ],\n \"text\": \"@class Animal @brief Abstract base class for animals with sound production.\",\n \"text_lines\": [\n \"@class Animal @brief Abstract base class for animals with sound production.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 76,\n \"end_line_number\": 88,\n \"line_range\": [\n 76,\n 88\n ],\n \"declaration_order_index\": 8,\n \"symbol_name\": \"Animal\",\n \"qualified_name\": \"Animal\",\n \"symbol_kind\": \"CLASS\",\n \"type_label\": \"CLASS\",\n \"signature_text\": \"abstract class Animal\",\n \"child_symbol_names\": [\n \"sound\",\n \"describe\"\n ],\n \"child_qualified_names\": [\n \"Animal.sound\",\n \"Animal.describe\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Abstract base class for animals with sound production.\",\n \"doxygen\": {\n \"brief\": [\n \"Abstract base class for animals with sound production.\",\n \"The sound this animal makes.\"\n ],\n \"returns\": [\n \"Sound description string.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 77,\n \"end_line_number\": 80,\n \"line_range\": [\n 77,\n 80\n ],\n \"text\": \"@brief The sound this animal makes. @return Sound description string.\",\n \"text_lines\": [\n \"@brief The sound this animal makes. @return Sound description string.\"\n ]\n },\n {\n \"start_line_number\": 83,\n \"end_line_number\": 86,\n \"line_range\": [\n 83,\n 86\n ],\n \"text\": \"@brief Describe the animal including its sound. @return Formatted description string.\",\n \"text_lines\": [\n \"@brief Describe the animal including its sound. @return Formatted description string.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 81,\n \"end_line_number\": 87,\n \"line_range\": [\n 81,\n 87\n ],\n \"declaration_order_index\": 9,\n \"symbol_name\": \"sound\",\n \"qualified_name\": \"Animal.sound\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def sound: String\",\n \"parent_symbol_name\": \"Animal\",\n \"parent_qualified_name\": \"Animal\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"The sound this animal makes.\",\n \"doxygen\": {\n \"brief\": [\n \"The sound this animal makes.\",\n \"Describe the animal including its sound.\"\n ],\n \"returns\": [\n \"Sound description string.\",\n \"Formatted description string.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 83,\n \"end_line_number\": 86,\n \"line_range\": [\n 83,\n 86\n ],\n \"text\": \"@brief Describe the animal including its sound. @return Formatted description string.\",\n \"text_lines\": [\n \"@brief Describe the animal including its sound. @return Formatted description string.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 87,\n \"end_line_number\": 87,\n \"line_range\": [\n 87,\n 87\n ],\n \"declaration_order_index\": 10,\n \"symbol_name\": \"describe\",\n \"qualified_name\": \"Animal.describe\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def describe: String = s\\\"I am a ${getClass.getSimpleName} and I say $sound\\\"\",\n \"parent_symbol_name\": \"Animal\",\n \"parent_qualified_name\": \"Animal\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Describe the animal including its sound.\",\n \"doxygen\": {\n \"brief\": [\n \"Describe the animal including its sound.\"\n ],\n \"returns\": [\n \"Formatted description string.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 96,\n \"end_line_number\": 102,\n \"line_range\": [\n 96,\n 102\n ],\n \"declaration_order_index\": 11,\n \"symbol_name\": \"Drawable\",\n \"qualified_name\": \"Drawable\",\n \"symbol_kind\": \"TRAIT\",\n \"type_label\": \"TRAIT\",\n \"signature_text\": \"trait Drawable\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Trait for rendering objects to string representation.\",\n \"doxygen\": {\n \"brief\": [\n \"Trait for rendering objects to string representation.\",\n \"Draw the object as a string.\"\n ],\n \"returns\": [\n \"Rendered string representation.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 97,\n \"end_line_number\": 100,\n \"line_range\": [\n 97,\n 100\n ],\n \"text\": \"@brief Draw the object as a string. @return Rendered string representation.\",\n \"text_lines\": [\n \"@brief Draw the object as a string. @return Rendered string representation.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 101,\n \"end_line_number\": 109,\n \"line_range\": [\n 101,\n 109\n ],\n \"declaration_order_index\": 12,\n \"symbol_name\": \"draw\",\n \"qualified_name\": \"draw\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def draw(): Unit\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Draw the object as a string.\",\n \"doxygen\": {\n \"brief\": [\n \"Draw the object as a string.\",\n \"Self-type trait requiring Drawable to be mixed in.\"\n ],\n \"details\": [\n \"Demonstrates the cake pattern for dependency injection.\"\n ],\n \"returns\": [\n \"Rendered string representation.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 104,\n \"end_line_number\": 108,\n \"line_range\": [\n 104,\n 108\n ],\n \"text\": \"@trait Logging @brief Self-type trait requiring Drawable to be mixed in. @details Demonstrates the cake pattern for dependency injection.\",\n \"text_lines\": [\n \"@trait Logging @brief Self-type trait requiring Drawable to be mixed in. @details Demonstrates the cake pattern for dependency injection.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 109,\n \"end_line_number\": 117,\n \"line_range\": [\n 109,\n 117\n ],\n \"declaration_order_index\": 13,\n \"symbol_name\": \"Logging\",\n \"qualified_name\": \"Logging\",\n \"symbol_kind\": \"TRAIT\",\n \"type_label\": \"TRAIT\",\n \"signature_text\": \"trait Logging { self: Drawable =>\",\n \"child_symbol_names\": [\n \"logAndDraw\"\n ],\n \"child_qualified_names\": [\n \"Logging.logAndDraw\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Self-type trait requiring Drawable to be mixed in.\",\n \"doxygen\": {\n \"brief\": [\n \"Self-type trait requiring Drawable to be mixed in.\",\n \"Log the drawing operation and then draw.\"\n ],\n \"details\": [\n \"Demonstrates the cake pattern for dependency injection.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 110,\n \"end_line_number\": 112,\n \"line_range\": [\n 110,\n 112\n ],\n \"text\": \"@brief Log the drawing operation and then draw.\",\n \"text_lines\": [\n \"@brief Log the drawing operation and then draw.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 113,\n \"end_line_number\": 116,\n \"line_range\": [\n 113,\n 116\n ],\n \"declaration_order_index\": 14,\n \"symbol_name\": \"logAndDraw\",\n \"qualified_name\": \"Logging.logAndDraw\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def logAndDraw(): Unit =\",\n \"parent_symbol_name\": \"Logging\",\n \"parent_qualified_name\": \"Logging\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Log the drawing operation and then draw.\",\n \"doxygen\": {\n \"brief\": [\n \"Log the drawing operation and then draw.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 123,\n \"end_line_number\": 129,\n \"line_range\": [\n 123,\n 129\n ],\n \"declaration_order_index\": 15,\n \"symbol_name\": \"Serializable\",\n \"qualified_name\": \"Serializable\",\n \"symbol_kind\": \"TRAIT\",\n \"type_label\": \"TRAIT\",\n \"signature_text\": \"trait Serializable\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Trait for objects convertible to byte arrays.\",\n \"doxygen\": {\n \"brief\": [\n \"Trait for objects convertible to byte arrays.\",\n \"Serialize this object to bytes.\"\n ],\n \"returns\": [\n \"Byte array representation.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 124,\n \"end_line_number\": 127,\n \"line_range\": [\n 124,\n 127\n ],\n \"text\": \"@brief Serialize this object to bytes. @return Byte array representation.\",\n \"text_lines\": [\n \"@brief Serialize this object to bytes. @return Byte array representation.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 128,\n \"end_line_number\": 137,\n \"line_range\": [\n 128,\n 137\n ],\n \"declaration_order_index\": 16,\n \"symbol_name\": \"serialize\",\n \"qualified_name\": \"serialize\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def serialize: Array[Byte]\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Serialize this object to bytes.\",\n \"doxygen\": {\n \"brief\": [\n \"Serialize this object to bytes.\"\n ],\n \"returns\": [\n \"Byte array representation.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 131,\n \"end_line_number\": 131,\n \"line_range\": [\n 131,\n 131\n ],\n \"text\": \"── Object (singleton) ─────────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Object (singleton) ─────────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 133,\n \"end_line_number\": 136,\n \"line_range\": [\n 133,\n 136\n ],\n \"text\": \"@object Main @brief Application entry point and utility function container.\",\n \"text_lines\": [\n \"@object Main @brief Application entry point and utility function container.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 137,\n \"end_line_number\": 192,\n \"line_range\": [\n 137,\n 192\n ],\n \"declaration_order_index\": 17,\n \"symbol_name\": \"Main\",\n \"qualified_name\": \"Main\",\n \"symbol_kind\": \"MODULE\",\n \"type_label\": \"MODULE\",\n \"signature_text\": \"object Main\",\n \"child_symbol_names\": [\n \"main\",\n \"people\",\n \"adults\",\n \"toString\",\n \"pi\",\n \"counter\",\n \"StringList\",\n \"Transformer\",\n \"describeShape\",\n \"classify\"\n ],\n \"child_qualified_names\": [\n \"Main.main\",\n \"Main.people\",\n \"Main.adults\",\n \"Main.toString\",\n \"Main.pi\",\n \"Main.counter\",\n \"Main.StringList\",\n \"Main.Transformer\",\n \"Main.describeShape\",\n \"Main.classify\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Application entry point and utility function container.\",\n \"doxygen\": {\n \"brief\": [\n \"Application entry point and utility function container.\",\n \"Application entry point.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"args\",\n \"description\": \"Command-line arguments.\"\n }\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 138,\n \"end_line_number\": 141,\n \"line_range\": [\n 138,\n 141\n ],\n \"text\": \"@brief Application entry point. @param args Command-line arguments.\",\n \"text_lines\": [\n \"@brief Application entry point. @param args Command-line arguments.\"\n ]\n },\n {\n \"start_line_number\": 144,\n \"end_line_number\": 144,\n \"line_range\": [\n 144,\n 144\n ],\n \"text\": \"Filter adults using pattern matching\",\n \"text_lines\": [\n \"Filter adults using pattern matching\"\n ]\n },\n {\n \"start_line_number\": 149,\n \"end_line_number\": 152,\n \"line_range\": [\n 149,\n 152\n ],\n \"text\": \"@brief Override toString for Main object display. @return String representation.\",\n \"text_lines\": [\n \"@brief Override toString for Main object display. @return String representation.\"\n ]\n },\n {\n \"start_line_number\": 155,\n \"end_line_number\": 155,\n \"line_range\": [\n 155,\n 155\n ],\n \"text\": \"@brief Mathematical constant pi.\",\n \"text_lines\": [\n \"@brief Mathematical constant pi.\"\n ]\n },\n {\n \"start_line_number\": 158,\n \"end_line_number\": 158,\n \"line_range\": [\n 158,\n 158\n ],\n \"text\": \"@brief Mutable counter for tracking operations.\",\n \"text_lines\": [\n \"@brief Mutable counter for tracking operations.\"\n ]\n },\n {\n \"start_line_number\": 161,\n \"end_line_number\": 163,\n \"line_range\": [\n 161,\n 163\n ],\n \"text\": \"@brief Type alias for lists of strings.\",\n \"text_lines\": [\n \"@brief Type alias for lists of strings.\"\n ]\n },\n {\n \"start_line_number\": 166,\n \"end_line_number\": 168,\n \"line_range\": [\n 166,\n 168\n ],\n \"text\": \"@brief Type alias for function transformers.\",\n \"text_lines\": [\n \"@brief Type alias for function transformers.\"\n ]\n },\n {\n \"start_line_number\": 171,\n \"end_line_number\": 175,\n \"line_range\": [\n 171,\n 175\n ],\n \"text\": \"@brief Describe a shape using exhaustive pattern matching. @param shape The shape to describe. @return Human-readable description with area.\",\n \"text_lines\": [\n \"@brief Describe a shape using exhaustive pattern matching. @param shape The shape to describe. @return Human-readable description with area.\"\n ]\n },\n {\n \"start_line_number\": 181,\n \"end_line_number\": 185,\n \"line_range\": [\n 181,\n 185\n ],\n \"text\": \"@brief Process a value with multiple match guards. @param x Integer input to classify. @return Classification string.\",\n \"text_lines\": [\n \"@brief Process a value with multiple match guards. @param x Integer input to classify. @return Classification string.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 142,\n \"end_line_number\": 147,\n \"line_range\": [\n 142,\n 147\n ],\n \"declaration_order_index\": 18,\n \"symbol_name\": \"main\",\n \"qualified_name\": \"Main.main\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def main(args: Array[String]): Unit =\",\n \"parent_symbol_name\": \"Main\",\n \"parent_qualified_name\": \"Main\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Application entry point.\",\n \"doxygen\": {\n \"brief\": [\n \"Application entry point.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"args\",\n \"description\": \"Command-line arguments.\"\n }\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 144,\n \"end_line_number\": 144,\n \"line_range\": [\n 144,\n 144\n ],\n \"text\": \"Filter adults using pattern matching\",\n \"text_lines\": [\n \"Filter adults using pattern matching\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 143,\n \"end_line_number\": 143,\n \"line_range\": [\n 143,\n 143\n ],\n \"declaration_order_index\": 19,\n \"symbol_name\": \"people\",\n \"qualified_name\": \"Main.people\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"val people = List(Person(\\\"Alice\\\", 30), Person(\\\"Bob\\\", 17))\",\n \"parent_symbol_name\": \"Main\",\n \"parent_qualified_name\": \"Main\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 145,\n \"end_line_number\": 145,\n \"line_range\": [\n 145,\n 145\n ],\n \"declaration_order_index\": 20,\n \"symbol_name\": \"adults\",\n \"qualified_name\": \"Main.adults\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"val adults = people.filter(_.isAdult)\",\n \"parent_symbol_name\": \"Main\",\n \"parent_qualified_name\": \"Main\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Filter adults using pattern matching\",\n \"attached_comment_lines\": [\n \"Filter adults using pattern matching\"\n ],\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 153,\n \"end_line_number\": 179,\n \"line_range\": [\n 153,\n 179\n ],\n \"declaration_order_index\": 21,\n \"symbol_name\": \"toString\",\n \"qualified_name\": \"Main.toString\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"override def toString: String = \\\"Main\\\"\",\n \"parent_symbol_name\": \"Main\",\n \"parent_qualified_name\": \"Main\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Override toString for Main object display.\",\n \"doxygen\": {\n \"brief\": [\n \"Override toString for Main object display.\",\n \"Mathematical constant pi.\"\n ],\n \"returns\": [\n \"String representation.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 155,\n \"end_line_number\": 155,\n \"line_range\": [\n 155,\n 155\n ],\n \"text\": \"@brief Mathematical constant pi.\",\n \"text_lines\": [\n \"@brief Mathematical constant pi.\"\n ]\n },\n {\n \"start_line_number\": 158,\n \"end_line_number\": 158,\n \"line_range\": [\n 158,\n 158\n ],\n \"text\": \"@brief Mutable counter for tracking operations.\",\n \"text_lines\": [\n \"@brief Mutable counter for tracking operations.\"\n ]\n },\n {\n \"start_line_number\": 161,\n \"end_line_number\": 163,\n \"line_range\": [\n 161,\n 163\n ],\n \"text\": \"@brief Type alias for lists of strings.\",\n \"text_lines\": [\n \"@brief Type alias for lists of strings.\"\n ]\n },\n {\n \"start_line_number\": 166,\n \"end_line_number\": 168,\n \"line_range\": [\n 166,\n 168\n ],\n \"text\": \"@brief Type alias for function transformers.\",\n \"text_lines\": [\n \"@brief Type alias for function transformers.\"\n ]\n },\n {\n \"start_line_number\": 171,\n \"end_line_number\": 175,\n \"line_range\": [\n 171,\n 175\n ],\n \"text\": \"@brief Describe a shape using exhaustive pattern matching. @param shape The shape to describe. @return Human-readable description with area.\",\n \"text_lines\": [\n \"@brief Describe a shape using exhaustive pattern matching. @param shape The shape to describe. @return Human-readable description with area.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 156,\n \"end_line_number\": 156,\n \"line_range\": [\n 156,\n 156\n ],\n \"declaration_order_index\": 22,\n \"symbol_name\": \"pi\",\n \"qualified_name\": \"Main.pi\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"val pi = 3.14159265\",\n \"parent_symbol_name\": \"Main\",\n \"parent_qualified_name\": \"Main\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Mathematical constant pi. */\",\n \"doxygen\": {\n \"brief\": [\n \"Mathematical constant pi. */\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 159,\n \"end_line_number\": 159,\n \"line_range\": [\n 159,\n 159\n ],\n \"declaration_order_index\": 23,\n \"symbol_name\": \"counter\",\n \"qualified_name\": \"Main.counter\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"var counter = 0\",\n \"parent_symbol_name\": \"Main\",\n \"parent_qualified_name\": \"Main\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Mutable counter for tracking operations. */\",\n \"doxygen\": {\n \"brief\": [\n \"Mutable counter for tracking operations. */\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 164,\n \"end_line_number\": 164,\n \"line_range\": [\n 164,\n 164\n ],\n \"declaration_order_index\": 24,\n \"symbol_name\": \"StringList\",\n \"qualified_name\": \"Main.StringList\",\n \"symbol_kind\": \"TYPE_ALIAS\",\n \"type_label\": \"TYPE_ALIAS\",\n \"signature_text\": \"type StringList = List[String]\",\n \"parent_symbol_name\": \"Main\",\n \"parent_qualified_name\": \"Main\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Type alias for lists of strings.\",\n \"doxygen\": {\n \"brief\": [\n \"Type alias for lists of strings.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 169,\n \"end_line_number\": 169,\n \"line_range\": [\n 169,\n 169\n ],\n \"declaration_order_index\": 25,\n \"symbol_name\": \"Transformer\",\n \"qualified_name\": \"Main.Transformer\",\n \"symbol_kind\": \"TYPE_ALIAS\",\n \"type_label\": \"TYPE_ALIAS\",\n \"signature_text\": \"type Transformer[A] = A => A\",\n \"parent_symbol_name\": \"Main\",\n \"parent_qualified_name\": \"Main\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Type alias for function transformers.\",\n \"doxygen\": {\n \"brief\": [\n \"Type alias for function transformers.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 176,\n \"end_line_number\": 179,\n \"line_range\": [\n 176,\n 179\n ],\n \"declaration_order_index\": 26,\n \"symbol_name\": \"describeShape\",\n \"qualified_name\": \"Main.describeShape\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def describeShape(shape: Shape): String = shape match\",\n \"parent_symbol_name\": \"Main\",\n \"parent_qualified_name\": \"Main\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Describe a shape using exhaustive pattern matching.\",\n \"doxygen\": {\n \"brief\": [\n \"Describe a shape using exhaustive pattern matching.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"shape\",\n \"description\": \"The shape to describe.\"\n }\n ],\n \"returns\": [\n \"Human-readable description with area.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 186,\n \"end_line_number\": 191,\n \"line_range\": [\n 186,\n 191\n ],\n \"declaration_order_index\": 27,\n \"symbol_name\": \"classify\",\n \"qualified_name\": \"Main.classify\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def classify(x: Int): String = x match\",\n \"parent_symbol_name\": \"Main\",\n \"parent_qualified_name\": \"Main\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Process a value with multiple match guards.\",\n \"doxygen\": {\n \"brief\": [\n \"Process a value with multiple match guards.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"x\",\n \"description\": \"Integer input to classify.\"\n }\n ],\n \"returns\": [\n \"Classification string.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 201,\n \"end_line_number\": 208,\n \"line_range\": [\n 201,\n 208\n ],\n \"declaration_order_index\": 28,\n \"symbol_name\": \"Config\",\n \"qualified_name\": \"Config\",\n \"symbol_kind\": \"CLASS\",\n \"type_label\": \"CLASS\",\n \"signature_text\": \"class Config private (val entries: Map[String, String])\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Configuration holder with companion factory.\",\n \"doxygen\": {\n \"brief\": [\n \"Configuration holder with companion factory.\",\n \"Retrieve a value by key.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"entries\",\n \"description\": \"Key-value pairs.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"key\",\n \"description\": \"The configuration key.\"\n }\n ],\n \"returns\": [\n \"Optional value.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 202,\n \"end_line_number\": 206,\n \"line_range\": [\n 202,\n 206\n ],\n \"text\": \"@brief Retrieve a value by key. @param key The configuration key. @return Optional value.\",\n \"text_lines\": [\n \"@brief Retrieve a value by key. @param key The configuration key. @return Optional value.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 207,\n \"end_line_number\": 214,\n \"line_range\": [\n 207,\n 214\n ],\n \"declaration_order_index\": 29,\n \"symbol_name\": \"get\",\n \"qualified_name\": \"get\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def get(key: String): Option[String] = entries.get(key)\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Retrieve a value by key.\",\n \"doxygen\": {\n \"brief\": [\n \"Retrieve a value by key.\",\n \"Companion object with factory methods for Config.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"key\",\n \"description\": \"The configuration key.\"\n }\n ],\n \"returns\": [\n \"Optional value.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 210,\n \"end_line_number\": 213,\n \"line_range\": [\n 210,\n 213\n ],\n \"text\": \"@object Config @brief Companion object with factory methods for Config.\",\n \"text_lines\": [\n \"@object Config @brief Companion object with factory methods for Config.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 214,\n \"end_line_number\": 227,\n \"line_range\": [\n 214,\n 227\n ],\n \"declaration_order_index\": 30,\n \"symbol_name\": \"Config\",\n \"qualified_name\": \"Config\",\n \"symbol_kind\": \"MODULE\",\n \"type_label\": \"MODULE\",\n \"signature_text\": \"object Config\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Companion object with factory methods for Config.\",\n \"doxygen\": {\n \"brief\": [\n \"Companion object with factory methods for Config.\",\n \"Create a Config from key-value pairs.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"entries\",\n \"description\": \"Variable number of key-value tuples.\"\n }\n ],\n \"returns\": [\n \"A new Config instance.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 215,\n \"end_line_number\": 219,\n \"line_range\": [\n 215,\n 219\n ],\n \"text\": \"@brief Create a Config from key-value pairs. @param entries Variable number of key-value tuples. @return A new Config instance.\",\n \"text_lines\": [\n \"@brief Create a Config from key-value pairs. @param entries Variable number of key-value tuples. @return A new Config instance.\"\n ]\n },\n {\n \"start_line_number\": 222,\n \"end_line_number\": 225,\n \"line_range\": [\n 222,\n 225\n ],\n \"text\": \"@brief Create an empty Config. @return Config with no entries.\",\n \"text_lines\": [\n \"@brief Create an empty Config. @return Config with no entries.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 220,\n \"end_line_number\": 236,\n \"line_range\": [\n 220,\n 236\n ],\n \"declaration_order_index\": 31,\n \"symbol_name\": \"apply\",\n \"qualified_name\": \"apply\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def apply(entries: (String, String)*): Config = new Config(entries.toMap)\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Create a Config from key-value pairs.\",\n \"doxygen\": {\n \"brief\": [\n \"Create a Config from key-value pairs.\",\n \"Create an empty Config.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"entries\",\n \"description\": \"Variable number of key-value tuples.\"\n }\n ],\n \"returns\": [\n \"A new Config instance.\",\n \"Config with no entries.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 222,\n \"end_line_number\": 225,\n \"line_range\": [\n 222,\n 225\n ],\n \"text\": \"@brief Create an empty Config. @return Config with no entries.\",\n \"text_lines\": [\n \"@brief Create an empty Config. @return Config with no entries.\"\n ]\n },\n {\n \"start_line_number\": 229,\n \"end_line_number\": 229,\n \"line_range\": [\n 229,\n 229\n ],\n \"text\": \"── Generic class with variance ────────────────────────────────────────\",\n \"text_lines\": [\n \"── Generic class with variance ────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 231,\n \"end_line_number\": 235,\n \"line_range\": [\n 231,\n 235\n ],\n \"text\": \"@class Container @brief Covariant generic container. @tparam +A Element type (covariant).\",\n \"text_lines\": [\n \"@class Container @brief Covariant generic container. @tparam +A Element type (covariant).\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 226,\n \"end_line_number\": 236,\n \"line_range\": [\n 226,\n 236\n ],\n \"declaration_order_index\": 32,\n \"symbol_name\": \"empty\",\n \"qualified_name\": \"empty\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def empty: Config = new Config(Map.empty)\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Create an empty Config.\",\n \"doxygen\": {\n \"brief\": [\n \"Create an empty Config.\"\n ],\n \"returns\": [\n \"Config with no entries.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 229,\n \"end_line_number\": 229,\n \"line_range\": [\n 229,\n 229\n ],\n \"text\": \"── Generic class with variance ────────────────────────────────────────\",\n \"text_lines\": [\n \"── Generic class with variance ────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 231,\n \"end_line_number\": 235,\n \"line_range\": [\n 231,\n 235\n ],\n \"text\": \"@class Container @brief Covariant generic container. @tparam +A Element type (covariant).\",\n \"text_lines\": [\n \"@class Container @brief Covariant generic container. @tparam +A Element type (covariant).\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 236,\n \"end_line_number\": 252,\n \"line_range\": [\n 236,\n 252\n ],\n \"declaration_order_index\": 33,\n \"symbol_name\": \"Container\",\n \"qualified_name\": \"Container\",\n \"symbol_kind\": \"CLASS\",\n \"type_label\": \"CLASS\",\n \"signature_text\": \"class Container[+A](val value: A)\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Covariant generic container.\\n@tparam +A Element type (covariant).\",\n \"doxygen\": {\n \"brief\": [\n \"Covariant generic container.\\n@tparam +A Element type (covariant).\",\n \"Map the contained value. @tparam B Target type.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"f\",\n \"description\": \"Transform function.\"\n }\n ],\n \"returns\": [\n \"New Container with transformed value.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 237,\n \"end_line_number\": 242,\n \"line_range\": [\n 237,\n 242\n ],\n \"text\": \"@brief Map the contained value. @tparam B Target type. @param f Transform function. @return New Container with transformed value.\",\n \"text_lines\": [\n \"@brief Map the contained value. @tparam B Target type. @param f Transform function. @return New Container with transformed value.\"\n ]\n },\n {\n \"start_line_number\": 245,\n \"end_line_number\": 250,\n \"line_range\": [\n 245,\n 250\n ],\n \"text\": \"@brief Flat-map the contained value. @tparam B Target type. @param f Transform function returning a Container. @return Flattened Container.\",\n \"text_lines\": [\n \"@brief Flat-map the contained value. @tparam B Target type. @param f Transform function returning a Container. @return Flattened Container.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 243,\n \"end_line_number\": 261,\n \"line_range\": [\n 243,\n 261\n ],\n \"declaration_order_index\": 34,\n \"symbol_name\": \"map\",\n \"qualified_name\": \"map\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def map[B](f: A => B): Container[B] = new Container(f(value))\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Map the contained value.\\n@tparam B Target type.\",\n \"doxygen\": {\n \"brief\": [\n \"Map the contained value.\\n@tparam B Target type.\",\n \"Flat-map the contained value. @tparam B Target type.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"f\",\n \"description\": \"Transform function.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"f\",\n \"description\": \"Transform function returning a Container.\"\n }\n ],\n \"returns\": [\n \"New Container with transformed value.\",\n \"Flattened Container.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 245,\n \"end_line_number\": 250,\n \"line_range\": [\n 245,\n 250\n ],\n \"text\": \"@brief Flat-map the contained value. @tparam B Target type. @param f Transform function returning a Container. @return Flattened Container.\",\n \"text_lines\": [\n \"@brief Flat-map the contained value. @tparam B Target type. @param f Transform function returning a Container. @return Flattened Container.\"\n ]\n },\n {\n \"start_line_number\": 254,\n \"end_line_number\": 254,\n \"line_range\": [\n 254,\n 254\n ],\n \"text\": \"── Implicit conversions and classes ───────────────────────────────────\",\n \"text_lines\": [\n \"── Implicit conversions and classes ───────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 256,\n \"end_line_number\": 260,\n \"line_range\": [\n 256,\n 260\n ],\n \"text\": \"@class RichInt @brief Implicit class extending Int with utility methods. @param n The wrapped integer value.\",\n \"text_lines\": [\n \"@class RichInt @brief Implicit class extending Int with utility methods. @param n The wrapped integer value.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 251,\n \"end_line_number\": 261,\n \"line_range\": [\n 251,\n 261\n ],\n \"declaration_order_index\": 35,\n \"symbol_name\": \"flatMap\",\n \"qualified_name\": \"flatMap\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def flatMap[B](f: A => Container[B]): Container[B] = f(value)\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Flat-map the contained value.\\n@tparam B Target type.\",\n \"doxygen\": {\n \"brief\": [\n \"Flat-map the contained value.\\n@tparam B Target type.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"f\",\n \"description\": \"Transform function returning a Container.\"\n }\n ],\n \"returns\": [\n \"Flattened Container.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 254,\n \"end_line_number\": 254,\n \"line_range\": [\n 254,\n 254\n ],\n \"text\": \"── Implicit conversions and classes ───────────────────────────────────\",\n \"text_lines\": [\n \"── Implicit conversions and classes ───────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 256,\n \"end_line_number\": 260,\n \"line_range\": [\n 256,\n 260\n ],\n \"text\": \"@class RichInt @brief Implicit class extending Int with utility methods. @param n The wrapped integer value.\",\n \"text_lines\": [\n \"@class RichInt @brief Implicit class extending Int with utility methods. @param n The wrapped integer value.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 266,\n \"end_line_number\": 282,\n \"line_range\": [\n 266,\n 282\n ],\n \"declaration_order_index\": 36,\n \"symbol_name\": \"isEven\",\n \"qualified_name\": \"isEven\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def isEven: Boolean = n % 2 == 0\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Check if the number is even.\",\n \"doxygen\": {\n \"brief\": [\n \"Check if the number is even.\",\n \"Repeat a string n times.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"s\",\n \"description\": \"The string to repeat.\"\n }\n ],\n \"returns\": [\n \"True if n is divisible by 2.\",\n \"Concatenated result.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 268,\n \"end_line_number\": 272,\n \"line_range\": [\n 268,\n 272\n ],\n \"text\": \"@brief Repeat a string n times. @param s The string to repeat. @return Concatenated result.\",\n \"text_lines\": [\n \"@brief Repeat a string n times. @param s The string to repeat. @return Concatenated result.\"\n ]\n },\n {\n \"start_line_number\": 276,\n \"end_line_number\": 276,\n \"line_range\": [\n 276,\n 276\n ],\n \"text\": \"── For comprehension example ──────────────────────────────────────────\",\n \"text_lines\": [\n \"── For comprehension example ──────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 278,\n \"end_line_number\": 281,\n \"line_range\": [\n 278,\n 281\n ],\n \"text\": \"@object ForCompExample @brief Demonstrates for-comprehension with multiple generators.\",\n \"text_lines\": [\n \"@object ForCompExample @brief Demonstrates for-comprehension with multiple generators.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 273,\n \"end_line_number\": 282,\n \"line_range\": [\n 273,\n 282\n ],\n \"declaration_order_index\": 37,\n \"symbol_name\": \"times\",\n \"qualified_name\": \"times\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def times(s: String): String = s * n\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Repeat a string n times.\",\n \"doxygen\": {\n \"brief\": [\n \"Repeat a string n times.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"s\",\n \"description\": \"The string to repeat.\"\n }\n ],\n \"returns\": [\n \"Concatenated result.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 276,\n \"end_line_number\": 276,\n \"line_range\": [\n 276,\n 276\n ],\n \"text\": \"── For comprehension example ──────────────────────────────────────────\",\n \"text_lines\": [\n \"── For comprehension example ──────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 278,\n \"end_line_number\": 281,\n \"line_range\": [\n 278,\n 281\n ],\n \"text\": \"@object ForCompExample @brief Demonstrates for-comprehension with multiple generators.\",\n \"text_lines\": [\n \"@object ForCompExample @brief Demonstrates for-comprehension with multiple generators.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 282,\n \"end_line_number\": 296,\n \"line_range\": [\n 282,\n 296\n ],\n \"declaration_order_index\": 38,\n \"symbol_name\": \"ForCompExample\",\n \"qualified_name\": \"ForCompExample\",\n \"symbol_kind\": \"MODULE\",\n \"type_label\": \"MODULE\",\n \"signature_text\": \"object ForCompExample\",\n \"child_symbol_names\": [\n \"findPairs\"\n ],\n \"child_qualified_names\": [\n \"ForCompExample.findPairs\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Demonstrates for-comprehension with multiple generators.\",\n \"doxygen\": {\n \"brief\": [\n \"Demonstrates for-comprehension with multiple generators.\",\n \"Compute all pairs of integers whose sum equals target.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"range\",\n \"description\": \"Upper bound of the search space.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"target\",\n \"description\": \"Desired sum.\"\n }\n ],\n \"returns\": [\n \"List of pairs summing to target.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 283,\n \"end_line_number\": 288,\n \"line_range\": [\n 283,\n 288\n ],\n \"text\": \"@brief Compute all pairs of integers whose sum equals target. @param range Upper bound of the search space. @param target Desired sum. @return List of pairs summing to target.\",\n \"text_lines\": [\n \"@brief Compute all pairs of integers whose sum equals target. @param range Upper bound of the search space. @param target Desired sum. @return List of pairs summing to target.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 289,\n \"end_line_number\": 295,\n \"line_range\": [\n 289,\n 295\n ],\n \"declaration_order_index\": 39,\n \"symbol_name\": \"findPairs\",\n \"qualified_name\": \"ForCompExample.findPairs\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def findPairs(range: Int, target: Int): List[(Int, Int)] =\",\n \"parent_symbol_name\": \"ForCompExample\",\n \"parent_qualified_name\": \"ForCompExample\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Compute all pairs of integers whose sum equals target.\",\n \"doxygen\": {\n \"brief\": [\n \"Compute all pairs of integers whose sum equals target.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"range\",\n \"description\": \"Upper bound of the search space.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"target\",\n \"description\": \"Desired sum.\"\n }\n ],\n \"returns\": [\n \"List of pairs summing to target.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 304,\n \"end_line_number\": 332,\n \"line_range\": [\n 304,\n 332\n ],\n \"declaration_order_index\": 40,\n \"symbol_name\": \"FuncUtils\",\n \"qualified_name\": \"FuncUtils\",\n \"symbol_kind\": \"MODULE\",\n \"type_label\": \"MODULE\",\n \"signature_text\": \"object FuncUtils\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Utility functions demonstrating functional patterns.\",\n \"doxygen\": {\n \"brief\": [\n \"Utility functions demonstrating functional patterns.\",\n \"Curried addition function.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"a\",\n \"description\": \"First operand.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"b\",\n \"description\": \"Second operand.\"\n }\n ],\n \"returns\": [\n \"Sum of a and b.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 305,\n \"end_line_number\": 310,\n \"line_range\": [\n 305,\n 310\n ],\n \"text\": \"@brief Curried addition function. @param a First operand. @param b Second operand. @return Sum of a and b.\",\n \"text_lines\": [\n \"@brief Curried addition function. @param a First operand. @param b Second operand. @return Sum of a and b.\"\n ]\n },\n {\n \"start_line_number\": 313,\n \"end_line_number\": 319,\n \"line_range\": [\n 313,\n 319\n ],\n \"text\": \"@brief Apply a function twice to an initial value. @tparam A Value type. @param f Function to apply. @param x Initial value. @return Result of f(f(x)).\",\n \"text_lines\": [\n \"@brief Apply a function twice to an initial value. @tparam A Value type. @param f Function to apply. @param x Initial value. @return Result of f(f(x)).\"\n ]\n },\n {\n \"start_line_number\": 322,\n \"end_line_number\": 330,\n \"line_range\": [\n 322,\n 330\n ],\n \"text\": \"@brief Compose two functions left to right. @tparam A Input type. @tparam B Intermediate type. @tparam C Output type. @param f First function. @param g Second function. @return Composed function.\",\n \"text_lines\": [\n \"@brief Compose two functions left to right. @tparam A Input type. @tparam B Intermediate type. @tparam C Output type. @param f First function. @param g Second function. @return Composed function.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 311,\n \"end_line_number\": 351,\n \"line_range\": [\n 311,\n 351\n ],\n \"declaration_order_index\": 41,\n \"symbol_name\": \"add\",\n \"qualified_name\": \"add\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def add(a: Int)(b: Int): Int = a + b\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Curried addition function.\",\n \"doxygen\": {\n \"brief\": [\n \"Curried addition function.\",\n \"Apply a function twice to an initial value. @tparam A Value type.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"a\",\n \"description\": \"First operand.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"b\",\n \"description\": \"Second operand.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"f\",\n \"description\": \"Function to apply.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"x\",\n \"description\": \"Initial value.\"\n }\n ],\n \"returns\": [\n \"Sum of a and b.\",\n \"Result of f(f(x)).\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 313,\n \"end_line_number\": 319,\n \"line_range\": [\n 313,\n 319\n ],\n \"text\": \"@brief Apply a function twice to an initial value. @tparam A Value type. @param f Function to apply. @param x Initial value. @return Result of f(f(x)).\",\n \"text_lines\": [\n \"@brief Apply a function twice to an initial value. @tparam A Value type. @param f Function to apply. @param x Initial value. @return Result of f(f(x)).\"\n ]\n },\n {\n \"start_line_number\": 322,\n \"end_line_number\": 330,\n \"line_range\": [\n 322,\n 330\n ],\n \"text\": \"@brief Compose two functions left to right. @tparam A Input type. @tparam B Intermediate type. @tparam C Output type. @param f First function. @param g Second function. @return Composed function.\",\n \"text_lines\": [\n \"@brief Compose two functions left to right. @tparam A Input type. @tparam B Intermediate type. @tparam C Output type. @param f First function. @param g Second function. @return Composed function.\"\n ]\n },\n {\n \"start_line_number\": 334,\n \"end_line_number\": 334,\n \"line_range\": [\n 334,\n 334\n ],\n \"text\": \"coverage extension block\",\n \"text_lines\": [\n \"coverage extension block\"\n ]\n },\n {\n \"start_line_number\": 350,\n \"end_line_number\": 350,\n \"line_range\": [\n 350,\n 350\n ],\n \"text\": \"REQ-COVER-SRS-231 START\",\n \"text_lines\": [\n \"REQ-COVER-SRS-231 START\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 320,\n \"end_line_number\": 351,\n \"line_range\": [\n 320,\n 351\n ],\n \"declaration_order_index\": 42,\n \"symbol_name\": \"twice\",\n \"qualified_name\": \"twice\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def twice[A](f: A => A)(x: A): A = f(f(x))\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Apply a function twice to an initial value.\\n@tparam A Value type.\",\n \"doxygen\": {\n \"brief\": [\n \"Apply a function twice to an initial value.\\n@tparam A Value type.\",\n \"Compose two functions left to right. @tparam A Input type. @tparam B Intermediate type. @tparam C Output type.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"f\",\n \"description\": \"Function to apply.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"x\",\n \"description\": \"Initial value.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"f\",\n \"description\": \"First function.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"g\",\n \"description\": \"Second function.\"\n }\n ],\n \"returns\": [\n \"Result of f(f(x)).\",\n \"Composed function.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 322,\n \"end_line_number\": 330,\n \"line_range\": [\n 322,\n 330\n ],\n \"text\": \"@brief Compose two functions left to right. @tparam A Input type. @tparam B Intermediate type. @tparam C Output type. @param f First function. @param g Second function. @return Composed function.\",\n \"text_lines\": [\n \"@brief Compose two functions left to right. @tparam A Input type. @tparam B Intermediate type. @tparam C Output type. @param f First function. @param g Second function. @return Composed function.\"\n ]\n },\n {\n \"start_line_number\": 334,\n \"end_line_number\": 334,\n \"line_range\": [\n 334,\n 334\n ],\n \"text\": \"coverage extension block\",\n \"text_lines\": [\n \"coverage extension block\"\n ]\n },\n {\n \"start_line_number\": 350,\n \"end_line_number\": 350,\n \"line_range\": [\n 350,\n 350\n ],\n \"text\": \"REQ-COVER-SRS-231 START\",\n \"text_lines\": [\n \"REQ-COVER-SRS-231 START\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 331,\n \"end_line_number\": 351,\n \"line_range\": [\n 331,\n 351\n ],\n \"declaration_order_index\": 43,\n \"symbol_name\": \"compose\",\n \"qualified_name\": \"compose\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def compose[A, B, C](f: A => B, g: B => C): A => C = a => g(f(a))\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Compose two functions left to right.\\n@tparam A Input type.\\n@tparam B Intermediate type.\\n@tparam C Output type.\",\n \"doxygen\": {\n \"brief\": [\n \"Compose two functions left to right.\\n@tparam A Input type.\\n@tparam B Intermediate type.\\n@tparam C Output type.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"f\",\n \"description\": \"First function.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"g\",\n \"description\": \"Second function.\"\n }\n ],\n \"returns\": [\n \"Composed function.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 334,\n \"end_line_number\": 334,\n \"line_range\": [\n 334,\n 334\n ],\n \"text\": \"coverage extension block\",\n \"text_lines\": [\n \"coverage extension block\"\n ]\n },\n {\n \"start_line_number\": 350,\n \"end_line_number\": 350,\n \"line_range\": [\n 350,\n 350\n ],\n \"text\": \"REQ-COVER-SRS-231 START\",\n \"text_lines\": [\n \"REQ-COVER-SRS-231 START\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 337,\n \"end_line_number\": 397,\n \"line_range\": [\n 337,\n 397\n ],\n \"declaration_order_index\": 44,\n \"symbol_name\": \"Runner\",\n \"qualified_name\": \"Runner\",\n \"symbol_kind\": \"TRAIT\",\n \"type_label\": \"TRAIT\",\n \"signature_text\": \"trait Runner\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [\n {\n \"start_line_number\": 350,\n \"end_line_number\": 350,\n \"line_range\": [\n 350,\n 350\n ],\n \"text\": \"REQ-COVER-SRS-231 START\",\n \"text_lines\": [\n \"REQ-COVER-SRS-231 START\"\n ]\n },\n {\n \"start_line_number\": 352,\n \"end_line_number\": 358,\n \"line_range\": [\n 352,\n 358\n ],\n \"text\": \"@REQ-COVER-SRS-231 block 1 @brief Coverage helper construct 1. @details Provides deterministic fixture-level Doxygen coverage block 1. @param value Input value for helper construct 1. @return Output value for helper construct 1.\",\n \"text_lines\": [\n \"@REQ-COVER-SRS-231 block 1 @brief Coverage helper construct 1. @details Provides deterministic fixture-level Doxygen coverage block 1. @param value Input value for helper construct 1. @return Output value for helper construct 1.\"\n ]\n },\n {\n \"start_line_number\": 361,\n \"end_line_number\": 367,\n \"line_range\": [\n 361,\n 367\n ],\n \"text\": \"@REQ-COVER-SRS-231 block 2 @brief Coverage helper construct 2. @details Provides deterministic fixture-level Doxygen coverage block 2. @param value Input value for helper construct 2. @return Output value for helper construct 2.\",\n \"text_lines\": [\n \"@REQ-COVER-SRS-231 block 2 @brief Coverage helper construct 2. @details Provides deterministic fixture-level Doxygen coverage block 2. @param value Input value for helper construct 2. @return Output value for helper construct 2.\"\n ]\n },\n {\n \"start_line_number\": 370,\n \"end_line_number\": 376,\n \"line_range\": [\n 370,\n 376\n ],\n \"text\": \"@REQ-COVER-SRS-231 block 3 @brief Coverage helper construct 3. @details Provides deterministic fixture-level Doxygen coverage block 3. @param value Input value for helper construct 3. @return Output value for helper construct 3.\",\n \"text_lines\": [\n \"@REQ-COVER-SRS-231 block 3 @brief Coverage helper construct 3. @details Provides deterministic fixture-level Doxygen coverage block 3. @param value Input value for helper construct 3. @return Output value for helper construct 3.\"\n ]\n },\n {\n \"start_line_number\": 379,\n \"end_line_number\": 385,\n \"line_range\": [\n 379,\n 385\n ],\n \"text\": \"@REQ-COVER-SRS-231 block 4 @brief Coverage helper construct 4. @details Provides deterministic fixture-level Doxygen coverage block 4. @param value Input value for helper construct 4. @return Output value for helper construct 4.\",\n \"text_lines\": [\n \"@REQ-COVER-SRS-231 block 4 @brief Coverage helper construct 4. @details Provides deterministic fixture-level Doxygen coverage block 4. @param value Input value for helper construct 4. @return Output value for helper construct 4.\"\n ]\n },\n {\n \"start_line_number\": 388,\n \"end_line_number\": 394,\n \"line_range\": [\n 388,\n 394\n ],\n \"text\": \"@REQ-COVER-SRS-231 block 5 @brief Coverage helper construct 5. @details Provides deterministic fixture-level Doxygen coverage block 5. @param value Input value for helper construct 5. @return Output value for helper construct 5.\",\n \"text_lines\": [\n \"@REQ-COVER-SRS-231 block 5 @brief Coverage helper construct 5. @details Provides deterministic fixture-level Doxygen coverage block 5. @param value Input value for helper construct 5. @return Output value for helper construct 5.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 338,\n \"end_line_number\": 397,\n \"line_range\": [\n 338,\n 397\n ],\n \"declaration_order_index\": 45,\n \"symbol_name\": \"Parser\",\n \"qualified_name\": \"Parser\",\n \"symbol_kind\": \"TRAIT\",\n \"type_label\": \"TRAIT\",\n \"signature_text\": \"trait Parser\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [\n {\n \"start_line_number\": 350,\n \"end_line_number\": 350,\n \"line_range\": [\n 350,\n 350\n ],\n \"text\": \"REQ-COVER-SRS-231 START\",\n \"text_lines\": [\n \"REQ-COVER-SRS-231 START\"\n ]\n },\n {\n \"start_line_number\": 352,\n \"end_line_number\": 358,\n \"line_range\": [\n 352,\n 358\n ],\n \"text\": \"@REQ-COVER-SRS-231 block 1 @brief Coverage helper construct 1. @details Provides deterministic fixture-level Doxygen coverage block 1. @param value Input value for helper construct 1. @return Output value for helper construct 1.\",\n \"text_lines\": [\n \"@REQ-COVER-SRS-231 block 1 @brief Coverage helper construct 1. @details Provides deterministic fixture-level Doxygen coverage block 1. @param value Input value for helper construct 1. @return Output value for helper construct 1.\"\n ]\n },\n {\n \"start_line_number\": 361,\n \"end_line_number\": 367,\n \"line_range\": [\n 361,\n 367\n ],\n \"text\": \"@REQ-COVER-SRS-231 block 2 @brief Coverage helper construct 2. @details Provides deterministic fixture-level Doxygen coverage block 2. @param value Input value for helper construct 2. @return Output value for helper construct 2.\",\n \"text_lines\": [\n \"@REQ-COVER-SRS-231 block 2 @brief Coverage helper construct 2. @details Provides deterministic fixture-level Doxygen coverage block 2. @param value Input value for helper construct 2. @return Output value for helper construct 2.\"\n ]\n },\n {\n \"start_line_number\": 370,\n \"end_line_number\": 376,\n \"line_range\": [\n 370,\n 376\n ],\n \"text\": \"@REQ-COVER-SRS-231 block 3 @brief Coverage helper construct 3. @details Provides deterministic fixture-level Doxygen coverage block 3. @param value Input value for helper construct 3. @return Output value for helper construct 3.\",\n \"text_lines\": [\n \"@REQ-COVER-SRS-231 block 3 @brief Coverage helper construct 3. @details Provides deterministic fixture-level Doxygen coverage block 3. @param value Input value for helper construct 3. @return Output value for helper construct 3.\"\n ]\n },\n {\n \"start_line_number\": 379,\n \"end_line_number\": 385,\n \"line_range\": [\n 379,\n 385\n ],\n \"text\": \"@REQ-COVER-SRS-231 block 4 @brief Coverage helper construct 4. @details Provides deterministic fixture-level Doxygen coverage block 4. @param value Input value for helper construct 4. @return Output value for helper construct 4.\",\n \"text_lines\": [\n \"@REQ-COVER-SRS-231 block 4 @brief Coverage helper construct 4. @details Provides deterministic fixture-level Doxygen coverage block 4. @param value Input value for helper construct 4. @return Output value for helper construct 4.\"\n ]\n },\n {\n \"start_line_number\": 388,\n \"end_line_number\": 394,\n \"line_range\": [\n 388,\n 394\n ],\n \"text\": \"@REQ-COVER-SRS-231 block 5 @brief Coverage helper construct 5. @details Provides deterministic fixture-level Doxygen coverage block 5. @param value Input value for helper construct 5. @return Output value for helper construct 5.\",\n \"text_lines\": [\n \"@REQ-COVER-SRS-231 block 5 @brief Coverage helper construct 5. @details Provides deterministic fixture-level Doxygen coverage block 5. @param value Input value for helper construct 5. @return Output value for helper construct 5.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 339,\n \"end_line_number\": 397,\n \"line_range\": [\n 339,\n 397\n ],\n \"declaration_order_index\": 46,\n \"symbol_name\": \"Metrics\",\n \"qualified_name\": \"Metrics\",\n \"symbol_kind\": \"MODULE\",\n \"type_label\": \"MODULE\",\n \"signature_text\": \"object Metrics\",\n \"child_symbol_names\": [\n \"MaxUsers\",\n \"RetryLimit\",\n \"UserKey\",\n \"ErrorCode\",\n \"Mapper\",\n \"attempts\",\n \"cursor\",\n \"stage\",\n \"status\"\n ],\n \"child_qualified_names\": [\n \"Metrics.MaxUsers\",\n \"Metrics.RetryLimit\",\n \"Metrics.UserKey\",\n \"Metrics.ErrorCode\",\n \"Metrics.Mapper\",\n \"Metrics.attempts\",\n \"Metrics.cursor\",\n \"Metrics.stage\",\n \"Metrics.status\"\n ],\n \"depth\": 0,\n \"body_comment_entries\": [\n {\n \"start_line_number\": 350,\n \"end_line_number\": 350,\n \"line_range\": [\n 350,\n 350\n ],\n \"text\": \"REQ-COVER-SRS-231 START\",\n \"text_lines\": [\n \"REQ-COVER-SRS-231 START\"\n ]\n },\n {\n \"start_line_number\": 352,\n \"end_line_number\": 358,\n \"line_range\": [\n 352,\n 358\n ],\n \"text\": \"@REQ-COVER-SRS-231 block 1 @brief Coverage helper construct 1. @details Provides deterministic fixture-level Doxygen coverage block 1. @param value Input value for helper construct 1. @return Output value for helper construct 1.\",\n \"text_lines\": [\n \"@REQ-COVER-SRS-231 block 1 @brief Coverage helper construct 1. @details Provides deterministic fixture-level Doxygen coverage block 1. @param value Input value for helper construct 1. @return Output value for helper construct 1.\"\n ]\n },\n {\n \"start_line_number\": 361,\n \"end_line_number\": 367,\n \"line_range\": [\n 361,\n 367\n ],\n \"text\": \"@REQ-COVER-SRS-231 block 2 @brief Coverage helper construct 2. @details Provides deterministic fixture-level Doxygen coverage block 2. @param value Input value for helper construct 2. @return Output value for helper construct 2.\",\n \"text_lines\": [\n \"@REQ-COVER-SRS-231 block 2 @brief Coverage helper construct 2. @details Provides deterministic fixture-level Doxygen coverage block 2. @param value Input value for helper construct 2. @return Output value for helper construct 2.\"\n ]\n },\n {\n \"start_line_number\": 370,\n \"end_line_number\": 376,\n \"line_range\": [\n 370,\n 376\n ],\n \"text\": \"@REQ-COVER-SRS-231 block 3 @brief Coverage helper construct 3. @details Provides deterministic fixture-level Doxygen coverage block 3. @param value Input value for helper construct 3. @return Output value for helper construct 3.\",\n \"text_lines\": [\n \"@REQ-COVER-SRS-231 block 3 @brief Coverage helper construct 3. @details Provides deterministic fixture-level Doxygen coverage block 3. @param value Input value for helper construct 3. @return Output value for helper construct 3.\"\n ]\n },\n {\n \"start_line_number\": 379,\n \"end_line_number\": 385,\n \"line_range\": [\n 379,\n 385\n ],\n \"text\": \"@REQ-COVER-SRS-231 block 4 @brief Coverage helper construct 4. @details Provides deterministic fixture-level Doxygen coverage block 4. @param value Input value for helper construct 4. @return Output value for helper construct 4.\",\n \"text_lines\": [\n \"@REQ-COVER-SRS-231 block 4 @brief Coverage helper construct 4. @details Provides deterministic fixture-level Doxygen coverage block 4. @param value Input value for helper construct 4. @return Output value for helper construct 4.\"\n ]\n },\n {\n \"start_line_number\": 388,\n \"end_line_number\": 394,\n \"line_range\": [\n 388,\n 394\n ],\n \"text\": \"@REQ-COVER-SRS-231 block 5 @brief Coverage helper construct 5. @details Provides deterministic fixture-level Doxygen coverage block 5. @param value Input value for helper construct 5. @return Output value for helper construct 5.\",\n \"text_lines\": [\n \"@REQ-COVER-SRS-231 block 5 @brief Coverage helper construct 5. @details Provides deterministic fixture-level Doxygen coverage block 5. @param value Input value for helper construct 5. @return Output value for helper construct 5.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 340,\n \"end_line_number\": 340,\n \"line_range\": [\n 340,\n 340\n ],\n \"declaration_order_index\": 47,\n \"symbol_name\": \"MaxUsers\",\n \"qualified_name\": \"Metrics.MaxUsers\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"val MaxUsers = 100\",\n \"parent_symbol_name\": \"Metrics\",\n \"parent_qualified_name\": \"Metrics\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 341,\n \"end_line_number\": 341,\n \"line_range\": [\n 341,\n 341\n ],\n \"declaration_order_index\": 48,\n \"symbol_name\": \"RetryLimit\",\n \"qualified_name\": \"Metrics.RetryLimit\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"val RetryLimit = 3\",\n \"parent_symbol_name\": \"Metrics\",\n \"parent_qualified_name\": \"Metrics\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 342,\n \"end_line_number\": 342,\n \"line_range\": [\n 342,\n 342\n ],\n \"declaration_order_index\": 49,\n \"symbol_name\": \"UserKey\",\n \"qualified_name\": \"Metrics.UserKey\",\n \"symbol_kind\": \"TYPE_ALIAS\",\n \"type_label\": \"TYPE_ALIAS\",\n \"signature_text\": \"type UserKey = String\",\n \"parent_symbol_name\": \"Metrics\",\n \"parent_qualified_name\": \"Metrics\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 343,\n \"end_line_number\": 343,\n \"line_range\": [\n 343,\n 343\n ],\n \"declaration_order_index\": 50,\n \"symbol_name\": \"ErrorCode\",\n \"qualified_name\": \"Metrics.ErrorCode\",\n \"symbol_kind\": \"TYPE_ALIAS\",\n \"type_label\": \"TYPE_ALIAS\",\n \"signature_text\": \"type ErrorCode = Int\",\n \"parent_symbol_name\": \"Metrics\",\n \"parent_qualified_name\": \"Metrics\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 344,\n \"end_line_number\": 344,\n \"line_range\": [\n 344,\n 344\n ],\n \"declaration_order_index\": 51,\n \"symbol_name\": \"Mapper\",\n \"qualified_name\": \"Metrics.Mapper\",\n \"symbol_kind\": \"TYPE_ALIAS\",\n \"type_label\": \"TYPE_ALIAS\",\n \"signature_text\": \"type Mapper = String => String\",\n \"parent_symbol_name\": \"Metrics\",\n \"parent_qualified_name\": \"Metrics\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 345,\n \"end_line_number\": 345,\n \"line_range\": [\n 345,\n 345\n ],\n \"declaration_order_index\": 52,\n \"symbol_name\": \"attempts\",\n \"qualified_name\": \"Metrics.attempts\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"var attempts = 0\",\n \"parent_symbol_name\": \"Metrics\",\n \"parent_qualified_name\": \"Metrics\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 346,\n \"end_line_number\": 346,\n \"line_range\": [\n 346,\n 346\n ],\n \"declaration_order_index\": 53,\n \"symbol_name\": \"cursor\",\n \"qualified_name\": \"Metrics.cursor\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"var cursor = 1\",\n \"parent_symbol_name\": \"Metrics\",\n \"parent_qualified_name\": \"Metrics\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 347,\n \"end_line_number\": 347,\n \"line_range\": [\n 347,\n 347\n ],\n \"declaration_order_index\": 54,\n \"symbol_name\": \"stage\",\n \"qualified_name\": \"Metrics.stage\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"var stage = \\\"init\\\"\",\n \"parent_symbol_name\": \"Metrics\",\n \"parent_qualified_name\": \"Metrics\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 348,\n \"end_line_number\": 348,\n \"line_range\": [\n 348,\n 348\n ],\n \"declaration_order_index\": 55,\n \"symbol_name\": \"status\",\n \"qualified_name\": \"Metrics.status\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"var status = \\\"ready\\\"\",\n \"parent_symbol_name\": \"Metrics\",\n \"parent_qualified_name\": \"Metrics\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 351,\n \"end_line_number\": 397,\n \"line_range\": [\n 351,\n 397\n ],\n \"declaration_order_index\": 56,\n \"symbol_name\": \"ReqCoverScala\",\n \"qualified_name\": \"ReqCoverScala\",\n \"symbol_kind\": \"MODULE\",\n \"type_label\": \"MODULE\",\n \"signature_text\": \"object ReqCoverScala\",\n \"child_symbol_names\": [\n \"reqCoverScala1\",\n \"reqCoverScala2\",\n \"reqCoverScala3\",\n \"reqCoverScala4\",\n \"reqCoverScala5\"\n ],\n \"child_qualified_names\": [\n \"ReqCoverScala.reqCoverScala1\",\n \"ReqCoverScala.reqCoverScala2\",\n \"ReqCoverScala.reqCoverScala3\",\n \"ReqCoverScala.reqCoverScala4\",\n \"ReqCoverScala.reqCoverScala5\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Coverage helper construct 1.\",\n \"doxygen\": {\n \"brief\": [\n \"Coverage helper construct 1.\"\n ],\n \"details\": [\n \"Provides deterministic fixture-level Doxygen coverage block 1.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"value\",\n \"description\": \"Input value for helper construct 1.\"\n }\n ],\n \"returns\": [\n \"Output value for helper construct 1.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 352,\n \"end_line_number\": 358,\n \"line_range\": [\n 352,\n 358\n ],\n \"text\": \"@REQ-COVER-SRS-231 block 1 @brief Coverage helper construct 1. @details Provides deterministic fixture-level Doxygen coverage block 1. @param value Input value for helper construct 1. @return Output value for helper construct 1.\",\n \"text_lines\": [\n \"@REQ-COVER-SRS-231 block 1 @brief Coverage helper construct 1. @details Provides deterministic fixture-level Doxygen coverage block 1. @param value Input value for helper construct 1. @return Output value for helper construct 1.\"\n ]\n },\n {\n \"start_line_number\": 361,\n \"end_line_number\": 367,\n \"line_range\": [\n 361,\n 367\n ],\n \"text\": \"@REQ-COVER-SRS-231 block 2 @brief Coverage helper construct 2. @details Provides deterministic fixture-level Doxygen coverage block 2. @param value Input value for helper construct 2. @return Output value for helper construct 2.\",\n \"text_lines\": [\n \"@REQ-COVER-SRS-231 block 2 @brief Coverage helper construct 2. @details Provides deterministic fixture-level Doxygen coverage block 2. @param value Input value for helper construct 2. @return Output value for helper construct 2.\"\n ]\n },\n {\n \"start_line_number\": 370,\n \"end_line_number\": 376,\n \"line_range\": [\n 370,\n 376\n ],\n \"text\": \"@REQ-COVER-SRS-231 block 3 @brief Coverage helper construct 3. @details Provides deterministic fixture-level Doxygen coverage block 3. @param value Input value for helper construct 3. @return Output value for helper construct 3.\",\n \"text_lines\": [\n \"@REQ-COVER-SRS-231 block 3 @brief Coverage helper construct 3. @details Provides deterministic fixture-level Doxygen coverage block 3. @param value Input value for helper construct 3. @return Output value for helper construct 3.\"\n ]\n },\n {\n \"start_line_number\": 379,\n \"end_line_number\": 385,\n \"line_range\": [\n 379,\n 385\n ],\n \"text\": \"@REQ-COVER-SRS-231 block 4 @brief Coverage helper construct 4. @details Provides deterministic fixture-level Doxygen coverage block 4. @param value Input value for helper construct 4. @return Output value for helper construct 4.\",\n \"text_lines\": [\n \"@REQ-COVER-SRS-231 block 4 @brief Coverage helper construct 4. @details Provides deterministic fixture-level Doxygen coverage block 4. @param value Input value for helper construct 4. @return Output value for helper construct 4.\"\n ]\n },\n {\n \"start_line_number\": 388,\n \"end_line_number\": 394,\n \"line_range\": [\n 388,\n 394\n ],\n \"text\": \"@REQ-COVER-SRS-231 block 5 @brief Coverage helper construct 5. @details Provides deterministic fixture-level Doxygen coverage block 5. @param value Input value for helper construct 5. @return Output value for helper construct 5.\",\n \"text_lines\": [\n \"@REQ-COVER-SRS-231 block 5 @brief Coverage helper construct 5. @details Provides deterministic fixture-level Doxygen coverage block 5. @param value Input value for helper construct 5. @return Output value for helper construct 5.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 359,\n \"end_line_number\": 359,\n \"line_range\": [\n 359,\n 359\n ],\n \"declaration_order_index\": 57,\n \"symbol_name\": \"reqCoverScala1\",\n \"qualified_name\": \"ReqCoverScala.reqCoverScala1\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def reqCoverScala1(value: Int): Int = value + 1\",\n \"parent_symbol_name\": \"ReqCoverScala\",\n \"parent_qualified_name\": \"ReqCoverScala\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Coverage helper construct 1.\",\n \"doxygen\": {\n \"brief\": [\n \"Coverage helper construct 1.\"\n ],\n \"details\": [\n \"Provides deterministic fixture-level Doxygen coverage block 1.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"value\",\n \"description\": \"Input value for helper construct 1.\"\n }\n ],\n \"returns\": [\n \"Output value for helper construct 1.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 368,\n \"end_line_number\": 368,\n \"line_range\": [\n 368,\n 368\n ],\n \"declaration_order_index\": 58,\n \"symbol_name\": \"reqCoverScala2\",\n \"qualified_name\": \"ReqCoverScala.reqCoverScala2\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def reqCoverScala2(value: Int): Int = value + 2\",\n \"parent_symbol_name\": \"ReqCoverScala\",\n \"parent_qualified_name\": \"ReqCoverScala\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Coverage helper construct 2.\",\n \"doxygen\": {\n \"brief\": [\n \"Coverage helper construct 2.\"\n ],\n \"details\": [\n \"Provides deterministic fixture-level Doxygen coverage block 2.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"value\",\n \"description\": \"Input value for helper construct 2.\"\n }\n ],\n \"returns\": [\n \"Output value for helper construct 2.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 377,\n \"end_line_number\": 377,\n \"line_range\": [\n 377,\n 377\n ],\n \"declaration_order_index\": 59,\n \"symbol_name\": \"reqCoverScala3\",\n \"qualified_name\": \"ReqCoverScala.reqCoverScala3\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def reqCoverScala3(value: Int): Int = value + 3\",\n \"parent_symbol_name\": \"ReqCoverScala\",\n \"parent_qualified_name\": \"ReqCoverScala\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Coverage helper construct 3.\",\n \"doxygen\": {\n \"brief\": [\n \"Coverage helper construct 3.\"\n ],\n \"details\": [\n \"Provides deterministic fixture-level Doxygen coverage block 3.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"value\",\n \"description\": \"Input value for helper construct 3.\"\n }\n ],\n \"returns\": [\n \"Output value for helper construct 3.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 386,\n \"end_line_number\": 386,\n \"line_range\": [\n 386,\n 386\n ],\n \"declaration_order_index\": 60,\n \"symbol_name\": \"reqCoverScala4\",\n \"qualified_name\": \"ReqCoverScala.reqCoverScala4\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def reqCoverScala4(value: Int): Int = value + 4\",\n \"parent_symbol_name\": \"ReqCoverScala\",\n \"parent_qualified_name\": \"ReqCoverScala\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Coverage helper construct 4.\",\n \"doxygen\": {\n \"brief\": [\n \"Coverage helper construct 4.\"\n ],\n \"details\": [\n \"Provides deterministic fixture-level Doxygen coverage block 4.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"value\",\n \"description\": \"Input value for helper construct 4.\"\n }\n ],\n \"returns\": [\n \"Output value for helper construct 4.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 395,\n \"end_line_number\": 395,\n \"line_range\": [\n 395,\n 395\n ],\n \"declaration_order_index\": 61,\n \"symbol_name\": \"reqCoverScala5\",\n \"qualified_name\": \"ReqCoverScala.reqCoverScala5\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def reqCoverScala5(value: Int): Int = value + 5\",\n \"parent_symbol_name\": \"ReqCoverScala\",\n \"parent_qualified_name\": \"ReqCoverScala\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Coverage helper construct 5.\",\n \"doxygen\": {\n \"brief\": [\n \"Coverage helper construct 5.\"\n ],\n \"details\": [\n \"Provides deterministic fixture-level Doxygen coverage block 5.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"value\",\n \"description\": \"Input value for helper construct 5.\"\n }\n ],\n \"returns\": [\n \"Output value for helper construct 5.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n }\n ],\n \"standalone_comments\": [\n {\n \"start_line_number\": 8,\n \"end_line_number\": 8,\n \"line_range\": [\n 8,\n 8\n ],\n \"text\": \"Single line comment\",\n \"text_lines\": [\n \"Single line comment\"\n ]\n },\n {\n \"start_line_number\": 9,\n \"end_line_number\": 10,\n \"line_range\": [\n 9,\n 10\n ],\n \"text\": \"Multi-line comment\",\n \"text_lines\": [\n \"Multi-line\",\n \"comment\"\n ]\n },\n {\n \"start_line_number\": 15,\n \"end_line_number\": 15,\n \"line_range\": [\n 15,\n 15\n ],\n \"text\": \"── Case class with copy and pattern matching ──────────────────────────\",\n \"text_lines\": [\n \"── Case class with copy and pattern matching ──────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 37,\n \"end_line_number\": 37,\n \"line_range\": [\n 37,\n 37\n ],\n \"text\": \"── Sealed trait hierarchy ─────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Sealed trait hierarchy ─────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 39,\n \"end_line_number\": 42,\n \"line_range\": [\n 39,\n 42\n ],\n \"text\": \"@class Shape @brief Sealed trait for algebraic data type shapes.\",\n \"text_lines\": [\n \"@class Shape\",\n \"@brief Sealed trait for algebraic data type shapes.\"\n ]\n },\n {\n \"start_line_number\": 70,\n \"end_line_number\": 70,\n \"line_range\": [\n 70,\n 70\n ],\n \"text\": \"── Abstract class ─────────────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Abstract class ─────────────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 90,\n \"end_line_number\": 90,\n \"line_range\": [\n 90,\n 90\n ],\n \"text\": \"── Trait with self-type ───────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Trait with self-type ───────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 131,\n \"end_line_number\": 131,\n \"line_range\": [\n 131,\n 131\n ],\n \"text\": \"── Object (singleton) ─────────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Object (singleton) ─────────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 194,\n \"end_line_number\": 194,\n \"line_range\": [\n 194,\n 194\n ],\n \"text\": \"── Companion object with apply ────────────────────────────────────────\",\n \"text_lines\": [\n \"── Companion object with apply ────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 229,\n \"end_line_number\": 229,\n \"line_range\": [\n 229,\n 229\n ],\n \"text\": \"── Generic class with variance ────────────────────────────────────────\",\n \"text_lines\": [\n \"── Generic class with variance ────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 254,\n \"end_line_number\": 254,\n \"line_range\": [\n 254,\n 254\n ],\n \"text\": \"── Implicit conversions and classes ───────────────────────────────────\",\n \"text_lines\": [\n \"── Implicit conversions and classes ───────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 256,\n \"end_line_number\": 260,\n \"line_range\": [\n 256,\n 260\n ],\n \"text\": \"@class RichInt @brief Implicit class extending Int with utility methods. @param n The wrapped integer value.\",\n \"text_lines\": [\n \"@class RichInt\",\n \"@brief Implicit class extending Int with utility methods.\",\n \"@param n The wrapped integer value.\"\n ]\n },\n {\n \"start_line_number\": 276,\n \"end_line_number\": 276,\n \"line_range\": [\n 276,\n 276\n ],\n \"text\": \"── For comprehension example ──────────────────────────────────────────\",\n \"text_lines\": [\n \"── For comprehension example ──────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 298,\n \"end_line_number\": 298,\n \"line_range\": [\n 298,\n 298\n ],\n \"text\": \"── Higher-order and curried functions ──────────────────────────────────\",\n \"text_lines\": [\n \"── Higher-order and curried functions ──────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 334,\n \"end_line_number\": 334,\n \"line_range\": [\n 334,\n 334\n ],\n \"text\": \"coverage extension block\",\n \"text_lines\": [\n \"coverage extension block\"\n ]\n },\n {\n \"start_line_number\": 398,\n \"end_line_number\": 398,\n \"line_range\": [\n 398,\n 398\n ],\n \"text\": \"REQ-COVER-SRS-231 END\",\n \"text_lines\": [\n \"REQ-COVER-SRS-231 END\"\n ]\n }\n ]\n }\n ]\n}\n",
3
+ "stdout": "# fixture_scala.scala | Scala | 398L | 62 symbols | 5 imports | 64 comments\n> Path: `tests/fixtures/fixture_scala.scala`\n- @brief Comprehensive Scala test fixture for parser validation.\n- @details Covers implicits/givens, pattern matching, higher-kinded types,\nself-types, variance, opaque types, extension methods, enums,\nfor comprehensions, and cake pattern.\n\n## Imports\n```\nimport scala.collection.mutable\nimport scala.concurrent.{Future, ExecutionContext}\nimport scala.util.{Try, Success, Failure}\nimport scala.util.Random\nimport scala.concurrent.duration._\n```\n\n## Definitions\n\n### class `case class Person(name: String, age: Int)` (L23-35)\n- @brief Immutable data class for person entities.\n- @brief Check if the person is an adult.\n- @param name Display name.\n- @param age Age in years; must be non-negative.\n- @return True if age >= 18.\n\n### fn `def isAdult: Boolean = age >= 18` (L28-43)\n- @brief Check if the person is an adult.\n- @brief Create a greeting string.\n- @return True if age >= 18.\n- @return Formatted greeting including name and age.\n\n### fn `def greet: String = s\"Hi, I'm $name, age $age\"` (L34-43)\n- @brief Create a greeting string.\n- @return Formatted greeting including name and age.\n\n### fn `def area: Double` (L48-56)\n- @brief Compute the area of this shape.\n- @brief Circle shape with radius.\n- @param radius The circle's radius.\n- @return Area as a Double.\n\n### class `case class Circle(radius: Double) extends Shape` (L56-58)\n- @brief Circle shape with radius.\n- @param radius The circle's radius.\n\n### fn `override def area: Double = math.Pi * radius * radius` (L57-66)\n- @brief Rectangle shape with width and height.\n- @param width The rectangle's width.\n- @param height The rectangle's height.\n\n### class `case class Rectangle(width: Double, height: Double) extends Shape` (L66-68)\n- @brief Rectangle shape with width and height.\n- @param width The rectangle's width.\n- @param height The rectangle's height.\n\n### fn `override def area: Double = width * height` (L67-76)\n\n### class `abstract class Animal` (L76-88)\n- @brief Abstract base class for animals with sound production.\n- @brief The sound this animal makes.\n- @return Sound description string.\n- fn `def sound: String` (L81-87)\n - @brief The sound this animal makes.\n - @brief Describe the animal including its sound.\n - @return Sound description string.\n - @return Formatted description string.\n- fn `def describe: String = s\"I am a ${getClass.getSimpleName} and I say $sound\"` (L87)\n - @brief Describe the animal including its sound.\n - @return Formatted description string.\n\n### trait `trait Drawable` (L96-102)\n- @brief Trait for rendering objects to string representation.\n- @brief Draw the object as a string.\n- @return Rendered string representation.\n\n### fn `def draw(): Unit` (L101-109)\n- @brief Draw the object as a string.\n- @brief Self-type trait requiring Drawable to be mixed in.\n- @details Demonstrates the cake pattern for dependency injection.\n- @return Rendered string representation.\n\n### trait `trait Logging { self: Drawable =>` (L109-117)\n- @brief Self-type trait requiring Drawable to be mixed in.\n- @brief Log the drawing operation and then draw.\n- @details Demonstrates the cake pattern for dependency injection.\n- fn `def logAndDraw(): Unit =` (L113-116)\n - @brief Log the drawing operation and then draw.\n\n### trait `trait Serializable` (L123-129)\n- @brief Trait for objects convertible to byte arrays.\n- @brief Serialize this object to bytes.\n- @return Byte array representation.\n\n### fn `def serialize: Array[Byte]` (L128-137)\n- @brief Serialize this object to bytes.\n- @return Byte array representation.\n\n### mod `object Main` (L137-192)\n- @brief Application entry point and utility function container.\n- @brief Application entry point.\n- @param args Command-line arguments.\n- fn `def main(args: Array[String]): Unit =` (L142-147)\n - @brief Application entry point.\n - @param args Command-line arguments.\n- const `val people = List(Person(\"Alice\", 30), Person(\"Bob\", 17))` (L143)\n- const `val adults = people.filter(_.isAdult)` (L145)\n- fn `override def toString: String = \"Main\"` (L153-179)\n - @brief Override toString for Main object display.\n - @brief Mathematical constant pi.\n - @return String representation.\n- const `val pi = 3.14159265` (L156)\n - @brief Mathematical constant pi. */\n- var `var counter = 0` (L159)\n - @brief Mutable counter for tracking operations. */\n- type `type StringList = List[String]` (L164)\n - @brief Type alias for lists of strings.\n- type `type Transformer[A] = A => A` (L169)\n - @brief Type alias for function transformers.\n- fn `def describeShape(shape: Shape): String = shape match` (L176-179)\n - @brief Describe a shape using exhaustive pattern matching.\n - @param shape The shape to describe.\n - @return Human-readable description with area.\n- fn `def classify(x: Int): String = x match` (L186-191)\n - @brief Process a value with multiple match guards.\n - @param x Integer input to classify.\n - @return Classification string.\n\n### class `class Config private (val entries: Map[String, String])` (L201-208)\n- @brief Configuration holder with companion factory.\n- @brief Retrieve a value by key.\n- @param entries Key-value pairs.\n- @param key The configuration key.\n- @return Optional value.\n\n### fn `def get(key: String): Option[String] = entries.get(key)` (L207-214)\n- @brief Retrieve a value by key.\n- @brief Companion object with factory methods for Config.\n- @param key The configuration key.\n- @return Optional value.\n\n### mod `object Config` (L214-227)\n- @brief Companion object with factory methods for Config.\n- @brief Create a Config from key-value pairs.\n- @param entries Variable number of key-value tuples.\n- @return A new Config instance.\n\n### fn `def apply(entries: (String, String)*): Config = new Config(entries.toMap)` (L220-236)\n- @brief Create a Config from key-value pairs.\n- @brief Create an empty Config.\n- @param entries Variable number of key-value tuples.\n- @return A new Config instance.\n- @return Config with no entries.\n\n### fn `def empty: Config = new Config(Map.empty)` (L226-236)\n- @brief Create an empty Config.\n- @return Config with no entries.\n\n### class `class Container[+A](val value: A)` (L236-252)\n- @brief Covariant generic container.\n@tparam +A Element type (covariant).\n- @brief Map the contained value. @tparam B Target type.\n- @param f Transform function.\n- @return New Container with transformed value.\n\n### fn `def map[B](f: A => B): Container[B] = new Container(f(value))` (L243-261)\n- @brief Map the contained value.\n@tparam B Target type.\n- @brief Flat-map the contained value. @tparam B Target type.\n- @param f Transform function.\n- @param f Transform function returning a Container.\n- @return New Container with transformed value.\n- @return Flattened Container.\n\n### fn `def flatMap[B](f: A => Container[B]): Container[B] = f(value)` (L251-261)\n- @brief Flat-map the contained value.\n@tparam B Target type.\n- @param f Transform function returning a Container.\n- @return Flattened Container.\n\n### fn `def isEven: Boolean = n % 2 == 0` (L266-282)\n- @brief Check if the number is even.\n- @brief Repeat a string n times.\n- @param s The string to repeat.\n- @return True if n is divisible by 2.\n- @return Concatenated result.\n\n### fn `def times(s: String): String = s * n` (L273-282)\n- @brief Repeat a string n times.\n- @param s The string to repeat.\n- @return Concatenated result.\n\n### mod `object ForCompExample` (L282-296)\n- @brief Demonstrates for-comprehension with multiple generators.\n- @brief Compute all pairs of integers whose sum equals target.\n- @param range Upper bound of the search space.\n- @param target Desired sum.\n- @return List of pairs summing to target.\n- fn `def findPairs(range: Int, target: Int): List[(Int, Int)] =` (L289-295)\n - @brief Compute all pairs of integers whose sum equals target.\n - @param range Upper bound of the search space.\n - @param target Desired sum.\n - @return List of pairs summing to target.\n\n### mod `object FuncUtils` (L304-332)\n- @brief Utility functions demonstrating functional patterns.\n- @brief Curried addition function.\n- @param a First operand.\n- @param b Second operand.\n- @return Sum of a and b.\n\n### fn `def add(a: Int)(b: Int): Int = a + b` (L311-351)\n- @brief Curried addition function.\n- @brief Apply a function twice to an initial value. @tparam A Value type.\n- @param a First operand.\n- @param b Second operand.\n- @param f Function to apply.\n- @param x Initial value.\n- @return Sum of a and b.\n- @return Result of f(f(x)).\n\n### fn `def twice[A](f: A => A)(x: A): A = f(f(x))` (L320-351)\n- @brief Apply a function twice to an initial value.\n@tparam A Value type.\n- @brief Compose two functions left to right. @tparam A Input type. @tparam B Intermediate type. @tparam C Output type.\n- @param f Function to apply.\n- @param x Initial value.\n- @param f First function.\n- @param g Second function.\n- @return Result of f(f(x)).\n- @return Composed function.\n\n### fn `def compose[A, B, C](f: A => B, g: B => C): A => C = a => g(f(a))` (L331-351)\n- @brief Compose two functions left to right.\n@tparam A Input type.\n@tparam B Intermediate type.\n@tparam C Output type.\n- @param f First function.\n- @param g Second function.\n- @return Composed function.\n\n### trait `trait Runner` (L337-397)\n\n### trait `trait Parser` (L338-397)\n\n### mod `object Metrics` (L339-397)\n- const `val MaxUsers = 100` (L340)\n- const `val RetryLimit = 3` (L341)\n- type `type UserKey = String` (L342)\n- type `type ErrorCode = Int` (L343)\n- type `type Mapper = String => String` (L344)\n- var `var attempts = 0` (L345)\n- var `var cursor = 1` (L346)\n- var `var stage = \"init\"` (L347)\n- var `var status = \"ready\"` (L348)\n\n### mod `object ReqCoverScala` (L351-397)\n- @brief Coverage helper construct 1.\n- @details Provides deterministic fixture-level Doxygen coverage block 1.\n- @param value Input value for helper construct 1.\n- @return Output value for helper construct 1.\n- fn `def reqCoverScala1(value: Int): Int = value + 1` (L359)\n - @brief Coverage helper construct 1.\n - @details Provides deterministic fixture-level Doxygen coverage block 1.\n - @param value Input value for helper construct 1.\n - @return Output value for helper construct 1.\n- fn `def reqCoverScala2(value: Int): Int = value + 2` (L368)\n - @brief Coverage helper construct 2.\n - @details Provides deterministic fixture-level Doxygen coverage block 2.\n - @param value Input value for helper construct 2.\n - @return Output value for helper construct 2.\n- fn `def reqCoverScala3(value: Int): Int = value + 3` (L377)\n - @brief Coverage helper construct 3.\n - @details Provides deterministic fixture-level Doxygen coverage block 3.\n - @param value Input value for helper construct 3.\n - @return Output value for helper construct 3.\n- fn `def reqCoverScala4(value: Int): Int = value + 4` (L386)\n - @brief Coverage helper construct 4.\n - @details Provides deterministic fixture-level Doxygen coverage block 4.\n - @param value Input value for helper construct 4.\n - @return Output value for helper construct 4.\n- fn `def reqCoverScala5(value: Int): Int = value + 5` (L395)\n - @brief Coverage helper construct 5.\n - @details Provides deterministic fixture-level Doxygen coverage block 5.\n - @param value Input value for helper construct 5.\n - @return Output value for helper construct 5.\n\n## Symbol Index\n|Symbol|Kind|Vis|Lines|Sig|\n|---|---|---|---|---|\n|`Person`|class||23-35|case class Person(name: String, age: Int)|\n|`isAdult`|fn||28-43|def isAdult: Boolean = age >= 18|\n|`greet`|fn||34-43|def greet: String = s\"Hi, I'm $name, age $age\"|\n|`area`|fn||48-56|def area: Double|\n|`Circle`|class||56-58|case class Circle(radius: Double) extends Shape|\n|`area`|fn||57-66|override def area: Double = math.Pi * radius * radius|\n|`Rectangle`|class||66-68|case class Rectangle(width: Double, height: Double) exten...|\n|`area`|fn||67-76|override def area: Double = width * height|\n|`Animal`|class||76-88|abstract class Animal|\n|`Animal.sound`|fn||81-87|def sound: String|\n|`Animal.describe`|fn||87|def describe: String = s\"I am a ${getClass.getSimpleName}...|\n|`Drawable`|trait||96-102|trait Drawable|\n|`draw`|fn||101-109|def draw(): Unit|\n|`Logging`|trait||109-117|trait Logging { self: Drawable =>|\n|`Logging.logAndDraw`|fn||113-116|def logAndDraw(): Unit =|\n|`Serializable`|trait||123-129|trait Serializable|\n|`serialize`|fn||128-137|def serialize: Array[Byte]|\n|`Main`|mod||137-192||\n|`Main.main`|fn||142-147|def main(args: Array[String]): Unit =|\n|`Main.people`|const||143||\n|`Main.adults`|const||145||\n|`Main.toString`|fn||153-179|override def toString: String = \"Main\"|\n|`Main.pi`|const||156||\n|`Main.counter`|var||159||\n|`Main.StringList`|type||164||\n|`Main.Transformer`|type||169||\n|`Main.describeShape`|fn||176-179|def describeShape(shape: Shape): String = shape match|\n|`Main.classify`|fn||186-191|def classify(x: Int): String = x match|\n|`Config`|class||201-208|class Config private (val entries: Map[String, String])|\n|`get`|fn||207-214|def get(key: String): Option[String] = entries.get(key)|\n|`Config`|mod||214-227||\n|`apply`|fn||220-236|def apply(entries: (String, String)*): Config = new Confi...|\n|`empty`|fn||226-236|def empty: Config = new Config(Map.empty)|\n|`Container`|class||236-252|class Container[+A](val value: A)|\n|`map`|fn||243-261|def map[B](f: A => B): Container[B] = new Container(f(val...|\n|`flatMap`|fn||251-261|def flatMap[B](f: A => Container[B]): Container[B] = f(va...|\n|`isEven`|fn||266-282|def isEven: Boolean = n % 2 == 0|\n|`times`|fn||273-282|def times(s: String): String = s * n|\n|`ForCompExample`|mod||282-296||\n|`ForCompExample.findPairs`|fn||289-295|def findPairs(range: Int, target: Int): List[(Int, Int)] =|\n|`FuncUtils`|mod||304-332||\n|`add`|fn||311-351|def add(a: Int)(b: Int): Int = a + b|\n|`twice`|fn||320-351|def twice[A](f: A => A)(x: A): A = f(f(x))|\n|`compose`|fn||331-351|def compose[A, B, C](f: A => B, g: B => C): A => C = a =>...|\n|`Runner`|trait||337-397|trait Runner|\n|`Parser`|trait||338-397|trait Parser|\n|`Metrics`|mod||339-397||\n|`Metrics.MaxUsers`|const||340||\n|`Metrics.RetryLimit`|const||341||\n|`Metrics.UserKey`|type||342||\n|`Metrics.ErrorCode`|type||343||\n|`Metrics.Mapper`|type||344||\n|`Metrics.attempts`|var||345||\n|`Metrics.cursor`|var||346||\n|`Metrics.stage`|var||347||\n|`Metrics.status`|var||348||\n|`ReqCoverScala`|mod||351-397||\n|`ReqCoverScala.reqCoverScala1`|fn||359|def reqCoverScala1(value: Int): Int = value + 1|\n|`ReqCoverScala.reqCoverScala2`|fn||368|def reqCoverScala2(value: Int): Int = value + 2|\n|`ReqCoverScala.reqCoverScala3`|fn||377|def reqCoverScala3(value: Int): Int = value + 3|\n|`ReqCoverScala.reqCoverScala4`|fn||386|def reqCoverScala4(value: Int): Int = value + 4|\n|`ReqCoverScala.reqCoverScala5`|fn||395|def reqCoverScala5(value: Int): Int = value + 5|\n\n",
4
4
  "stderr": ""
5
5
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "code": 0,
3
- "stdout": "{\n \"request\": {\n \"tool_name\": \"files-references\",\n \"scope\": \"explicit-files\",\n \"base_dir_path\": \"<ROOT>\",\n \"source_directory_count\": 0,\n \"source_directory_paths\": [],\n \"requested_file_count\": 1,\n \"requested_input_paths\": [\n \"tests/fixtures/fixture_shell.sh\"\n ],\n \"requested_canonical_paths\": [\n \"tests/fixtures/fixture_shell.sh\"\n ]\n },\n \"summary\": {\n \"processable_file_count\": 1,\n \"analyzed_file_count\": 1,\n \"error_file_count\": 0,\n \"skipped_file_count\": 0,\n \"total_symbol_count\": 25,\n \"total_import_count\": 5,\n \"total_comment_count\": 90,\n \"total_standalone_comment_count\": 38,\n \"total_doxygen_field_count\": 51,\n \"symbol_kind_counts\": {\n \"FUNCTION\": 14,\n \"VARIABLE\": 11\n }\n },\n \"repository\": {\n \"root_directory_path\": \"<ROOT>\",\n \"source_directory_paths\": [],\n \"file_count\": 1,\n \"file_canonical_paths\": [\n \"tests/fixtures/fixture_shell.sh\"\n ],\n \"directory_tree\": {\n \"node_name\": \".\",\n \"relative_path\": \".\",\n \"node_kind\": \"directory\",\n \"child_count\": 1,\n \"children\": [\n {\n \"node_name\": \"tests\",\n \"relative_path\": \"tests\",\n \"node_kind\": \"directory\",\n \"child_count\": 1,\n \"children\": [\n {\n \"node_name\": \"fixtures\",\n \"relative_path\": \"tests/fixtures\",\n \"node_kind\": \"directory\",\n \"child_count\": 1,\n \"children\": [\n {\n \"node_name\": \"fixture_shell.sh\",\n \"relative_path\": \"tests/fixtures/fixture_shell.sh\",\n \"node_kind\": \"file\",\n \"child_count\": 0,\n \"children\": []\n }\n ]\n }\n ]\n }\n ]\n }\n },\n \"files\": [\n {\n \"start_line_number\": 1,\n \"end_line_number\": 276,\n \"line_range\": [\n 1,\n 276\n ],\n \"request_index\": 0,\n \"input_path\": \"tests/fixtures/fixture_shell.sh\",\n \"canonical_path\": \"tests/fixtures/fixture_shell.sh\",\n \"absolute_path\": \"<ROOT>/tests/fixtures/fixture_shell.sh\",\n \"file_name\": \"fixture_shell.sh\",\n \"file_extension\": \".sh\",\n \"language_id\": \"shell\",\n \"language_name\": \"Shell\",\n \"status\": \"analyzed\",\n \"exists\": true,\n \"is_file\": true,\n \"import_count\": 5,\n \"symbol_count\": 25,\n \"comment_count\": 90,\n \"standalone_comment_count\": 38,\n \"doxygen_field_count\": 51,\n \"file_description_text\": \"bin/bash\",\n \"imports\": [\n {\n \"start_line_number\": 218,\n \"end_line_number\": 218,\n \"line_range\": [\n 218,\n 218\n ],\n \"import_name\": \"./config.sh\",\n \"statement_text\": \"source ./config.sh\"\n },\n {\n \"start_line_number\": 222,\n \"end_line_number\": 222,\n \"line_range\": [\n 222,\n 222\n ],\n \"import_name\": \"./env.sh\",\n \"statement_text\": \"source ./env.sh\"\n },\n {\n \"start_line_number\": 224,\n \"end_line_number\": 224,\n \"line_range\": [\n 224,\n 224\n ],\n \"import_name\": \"./shared.sh\",\n \"statement_text\": \"source ./shared.sh\"\n },\n {\n \"start_line_number\": 226,\n \"end_line_number\": 226,\n \"line_range\": [\n 226,\n 226\n ],\n \"import_name\": \"./runtime.sh\",\n \"statement_text\": \"source ./runtime.sh\"\n },\n {\n \"start_line_number\": 228,\n \"end_line_number\": 228,\n \"line_range\": [\n 228,\n 228\n ],\n \"import_name\": \"./network.sh\",\n \"statement_text\": \"source ./network.sh\"\n }\n ],\n \"symbols\": [\n {\n \"start_line_number\": 12,\n \"end_line_number\": 12,\n \"line_range\": [\n 12,\n 12\n ],\n \"declaration_order_index\": 0,\n \"symbol_name\": \"MY_VAR\",\n \"qualified_name\": \"MY_VAR\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"MY_VAR=\\\"hello\\\"\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Greeting message template.\",\n \"doxygen\": {\n \"brief\": [\n \"Greeting message template.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 15,\n \"end_line_number\": 15,\n \"line_range\": [\n 15,\n 15\n ],\n \"declaration_order_index\": 1,\n \"symbol_name\": \"PATH_EXT\",\n \"qualified_name\": \"PATH_EXT\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"export PATH_EXT=\\\"/usr/local/bin\\\"\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Extended PATH including local binary directory.\",\n \"doxygen\": {\n \"brief\": [\n \"Extended PATH including local binary directory.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 18,\n \"end_line_number\": 18,\n \"line_range\": [\n 18,\n 18\n ],\n \"declaration_order_index\": 2,\n \"symbol_name\": \"MAX_COUNT\",\n \"qualified_name\": \"MAX_COUNT\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"readonly MAX_COUNT=10\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Immutable maximum iteration counter.\",\n \"doxygen\": {\n \"brief\": [\n \"Immutable maximum iteration counter.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 21,\n \"end_line_number\": 21,\n \"line_range\": [\n 21,\n 21\n ],\n \"declaration_order_index\": 3,\n \"symbol_name\": \"BUILD_VERSION\",\n \"qualified_name\": \"BUILD_VERSION\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"declare -r BUILD_VERSION=\\\"1.0.0\\\"\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Build version set via declare.\",\n \"doxygen\": {\n \"brief\": [\n \"Build version set via declare.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 24,\n \"end_line_number\": 24,\n \"line_range\": [\n 24,\n 24\n ],\n \"declaration_order_index\": 4,\n \"symbol_name\": \"DEBUG_MODE\",\n \"qualified_name\": \"DEBUG_MODE\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"DEBUG_MODE=0\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Debug mode flag (0=off, 1=on).\",\n \"doxygen\": {\n \"brief\": [\n \"Debug mode flag (0=off, 1=on).\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 29,\n \"end_line_number\": 29,\n \"line_range\": [\n 29,\n 29\n ],\n \"declaration_order_index\": 5,\n \"symbol_name\": \"LANGUAGES\",\n \"qualified_name\": \"LANGUAGES\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"declare -a LANGUAGES=(\\\"python\\\" \\\"rust\\\" \\\"go\\\" \\\"java\\\" \\\"typescript\\\")\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Indexed array of supported languages.\",\n \"doxygen\": {\n \"brief\": [\n \"Indexed array of supported languages.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 32,\n \"end_line_number\": 32,\n \"line_range\": [\n 32,\n 32\n ],\n \"declaration_order_index\": 6,\n \"symbol_name\": \"EXT_MAP\",\n \"qualified_name\": \"EXT_MAP\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"declare -A EXT_MAP=(\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Associative array mapping extensions to languages.\",\n \"doxygen\": {\n \"brief\": [\n \"Associative array mapping extensions to languages.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 44,\n \"end_line_number\": 44,\n \"line_range\": [\n 44,\n 44\n ],\n \"declaration_order_index\": 7,\n \"symbol_name\": \"greet\",\n \"qualified_name\": \"greet\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"function greet()\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Greet a user by name on stdout.\",\n \"doxygen\": {\n \"brief\": [\n \"Greet a user by name on stdout.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"$1\",\n \"description\": \"The user's name.\"\n }\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 56,\n \"end_line_number\": 56,\n \"line_range\": [\n 56,\n 56\n ],\n \"declaration_order_index\": 8,\n \"symbol_name\": \"cleanup\",\n \"qualified_name\": \"cleanup\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"cleanup()\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Remove temporary files and directories.\",\n \"doxygen\": {\n \"brief\": [\n \"Remove temporary files and directories.\"\n ],\n \"details\": [\n \"Called by trap on EXIT for cleanup.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 68,\n \"end_line_number\": 68,\n \"line_range\": [\n 68,\n 68\n ],\n \"declaration_order_index\": 9,\n \"symbol_name\": \"parse_args\",\n \"qualified_name\": \"parse_args\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"parse_args()\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Parse command-line options using getopts.\",\n \"doxygen\": {\n \"brief\": [\n \"Parse command-line options using getopts.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"$@\",\n \"description\": \"Command-line arguments.\"\n }\n ],\n \"returns\": [\n \"Sets global variables based on parsed options.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 74,\n \"end_line_number\": 74,\n \"line_range\": [\n 74,\n 74\n ],\n \"declaration_order_index\": 10,\n \"symbol_name\": \"VERBOSE\",\n \"qualified_name\": \"VERBOSE\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"VERBOSE=1\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Enable verbose output\",\n \"attached_comment_lines\": [\n \"Enable verbose output\"\n ],\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 78,\n \"end_line_number\": 78,\n \"line_range\": [\n 78,\n 78\n ],\n \"declaration_order_index\": 11,\n \"symbol_name\": \"DEBUG_MODE\",\n \"qualified_name\": \"DEBUG_MODE\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"DEBUG_MODE=1\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Enable debug mode\",\n \"attached_comment_lines\": [\n \"Enable debug mode\"\n ],\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 82,\n \"end_line_number\": 82,\n \"line_range\": [\n 82,\n 82\n ],\n \"declaration_order_index\": 12,\n \"symbol_name\": \"INPUT_FILE\",\n \"qualified_name\": \"INPUT_FILE\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"INPUT_FILE=\\\"$OPTARG\\\"\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Set input file path\",\n \"attached_comment_lines\": [\n \"Set input file path\"\n ],\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 86,\n \"end_line_number\": 86,\n \"line_range\": [\n 86,\n 86\n ],\n \"declaration_order_index\": 13,\n \"symbol_name\": \"OUTPUT_FILE\",\n \"qualified_name\": \"OUTPUT_FILE\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"OUTPUT_FILE=\\\"$OPTARG\\\"\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Set output file path\",\n \"attached_comment_lines\": [\n \"Set output file path\"\n ],\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 105,\n \"end_line_number\": 105,\n \"line_range\": [\n 105,\n 105\n ],\n \"declaration_order_index\": 14,\n \"symbol_name\": \"process_file\",\n \"qualified_name\": \"process_file\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"process_file()\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Process a file with error handling and logging.\",\n \"doxygen\": {\n \"brief\": [\n \"Process a file with error handling and logging.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"$1\",\n \"description\": \"Path to the input file.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"$2\",\n \"description\": \"Optional output path (defaults to stdout).\"\n }\n ],\n \"returns\": [\n \"0 on success, 1 on failure.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 139,\n \"end_line_number\": 139,\n \"line_range\": [\n 139,\n 139\n ],\n \"declaration_order_index\": 15,\n \"symbol_name\": \"retry_command\",\n \"qualified_name\": \"retry_command\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"retry_command()\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Execute a command with retry logic.\",\n \"doxygen\": {\n \"brief\": [\n \"Execute a command with retry logic.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"$1\",\n \"description\": \"Maximum number of retry attempts.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"$@\",\n \"description\": \"The command and arguments to execute.\"\n }\n ],\n \"returns\": [\n \"Exit code of the final attempt.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 162,\n \"end_line_number\": 162,\n \"line_range\": [\n 162,\n 162\n ],\n \"declaration_order_index\": 16,\n \"symbol_name\": \"log_message\",\n \"qualified_name\": \"log_message\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"log_message()\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Log a message with timestamp prefix.\",\n \"doxygen\": {\n \"brief\": [\n \"Log a message with timestamp prefix.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"$1\",\n \"description\": \"Log level (INFO, WARN, ERROR).\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"$@\",\n \"description\": \"Message text.\"\n }\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 172,\n \"end_line_number\": 172,\n \"line_range\": [\n 172,\n 172\n ],\n \"declaration_order_index\": 17,\n \"symbol_name\": \"make_temp\",\n \"qualified_name\": \"make_temp\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"make_temp()\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Generate a temporary file and return its path.\",\n \"doxygen\": {\n \"brief\": [\n \"Generate a temporary file and return its path.\"\n ],\n \"returns\": [\n \"Path to the created temporary file.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 189,\n \"end_line_number\": 189,\n \"line_range\": [\n 189,\n 189\n ],\n \"declaration_order_index\": 18,\n \"symbol_name\": \"generate_config\",\n \"qualified_name\": \"generate_config\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"generate_config()\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Generate a configuration file using heredoc.\",\n \"doxygen\": {\n \"brief\": [\n \"Generate a configuration file using heredoc.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 203,\n \"end_line_number\": 203,\n \"line_range\": [\n 203,\n 203\n ],\n \"declaration_order_index\": 19,\n \"symbol_name\": \"factorial\",\n \"qualified_name\": \"factorial\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"factorial()\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Compute factorial iteratively.\",\n \"doxygen\": {\n \"brief\": [\n \"Compute factorial iteratively.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"$1\",\n \"description\": \"Non-negative integer.\"\n }\n ],\n \"returns\": [\n \"Factorial result.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 236,\n \"end_line_number\": 236,\n \"line_range\": [\n 236,\n 236\n ],\n \"declaration_order_index\": 20,\n \"symbol_name\": \"req_cover_shell_1\",\n \"qualified_name\": \"req_cover_shell_1\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"req_cover_shell_1()\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Coverage helper construct 1.\",\n \"doxygen\": {\n \"brief\": [\n \"Coverage helper construct 1.\"\n ],\n \"details\": [\n \"Provides deterministic fixture-level Doxygen coverage block 1.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"value\",\n \"description\": \"Input value for helper construct 1.\"\n }\n ],\n \"returns\": [\n \"Output value for helper construct 1.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 245,\n \"end_line_number\": 245,\n \"line_range\": [\n 245,\n 245\n ],\n \"declaration_order_index\": 21,\n \"symbol_name\": \"req_cover_shell_2\",\n \"qualified_name\": \"req_cover_shell_2\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"req_cover_shell_2()\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Coverage helper construct 2.\",\n \"doxygen\": {\n \"brief\": [\n \"Coverage helper construct 2.\"\n ],\n \"details\": [\n \"Provides deterministic fixture-level Doxygen coverage block 2.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"value\",\n \"description\": \"Input value for helper construct 2.\"\n }\n ],\n \"returns\": [\n \"Output value for helper construct 2.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 254,\n \"end_line_number\": 254,\n \"line_range\": [\n 254,\n 254\n ],\n \"declaration_order_index\": 22,\n \"symbol_name\": \"req_cover_shell_3\",\n \"qualified_name\": \"req_cover_shell_3\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"req_cover_shell_3()\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Coverage helper construct 3.\",\n \"doxygen\": {\n \"brief\": [\n \"Coverage helper construct 3.\"\n ],\n \"details\": [\n \"Provides deterministic fixture-level Doxygen coverage block 3.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"value\",\n \"description\": \"Input value for helper construct 3.\"\n }\n ],\n \"returns\": [\n \"Output value for helper construct 3.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 263,\n \"end_line_number\": 263,\n \"line_range\": [\n 263,\n 263\n ],\n \"declaration_order_index\": 23,\n \"symbol_name\": \"req_cover_shell_4\",\n \"qualified_name\": \"req_cover_shell_4\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"req_cover_shell_4()\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Coverage helper construct 4.\",\n \"doxygen\": {\n \"brief\": [\n \"Coverage helper construct 4.\"\n ],\n \"details\": [\n \"Provides deterministic fixture-level Doxygen coverage block 4.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"value\",\n \"description\": \"Input value for helper construct 4.\"\n }\n ],\n \"returns\": [\n \"Output value for helper construct 4.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 272,\n \"end_line_number\": 272,\n \"line_range\": [\n 272,\n 272\n ],\n \"declaration_order_index\": 24,\n \"symbol_name\": \"req_cover_shell_5\",\n \"qualified_name\": \"req_cover_shell_5\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"req_cover_shell_5()\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Coverage helper construct 5.\",\n \"doxygen\": {\n \"brief\": [\n \"Coverage helper construct 5.\"\n ],\n \"details\": [\n \"Provides deterministic fixture-level Doxygen coverage block 5.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"value\",\n \"description\": \"Input value for helper construct 5.\"\n }\n ],\n \"returns\": [\n \"Output value for helper construct 5.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n }\n ],\n \"standalone_comments\": [\n {\n \"start_line_number\": 2,\n \"end_line_number\": 2,\n \"line_range\": [\n 2,\n 2\n ],\n \"text\": \"@file fixture_shell.sh\",\n \"text_lines\": [\n \"@file fixture_shell.sh\"\n ]\n },\n {\n \"start_line_number\": 3,\n \"end_line_number\": 3,\n \"line_range\": [\n 3,\n 3\n ],\n \"text\": \"@brief Comprehensive Shell/Bash test fixture for parser validation.\",\n \"text_lines\": [\n \"@brief Comprehensive Shell/Bash test fixture for parser validation.\"\n ]\n },\n {\n \"start_line_number\": 4,\n \"end_line_number\": 4,\n \"line_range\": [\n 4,\n 4\n ],\n \"text\": \"@details Covers arrays, associative arrays, parameter expansion,\",\n \"text_lines\": [\n \"@details Covers arrays, associative arrays, parameter expansion,\"\n ]\n },\n {\n \"start_line_number\": 5,\n \"end_line_number\": 5,\n \"line_range\": [\n 5,\n 5\n ],\n \"text\": \"here documents, process substitution, traps, getopts,\",\n \"text_lines\": [\n \"here documents, process substitution, traps, getopts,\"\n ]\n },\n {\n \"start_line_number\": 6,\n \"end_line_number\": 6,\n \"line_range\": [\n 6,\n 6\n ],\n \"text\": \"case statements, arithmetic, and here strings.\",\n \"text_lines\": [\n \"case statements, arithmetic, and here strings.\"\n ]\n },\n {\n \"start_line_number\": 7,\n \"end_line_number\": 7,\n \"line_range\": [\n 7,\n 7\n ],\n \"text\": \"Single line comment\",\n \"text_lines\": [\n \"Single line comment\"\n ]\n },\n {\n \"start_line_number\": 40,\n \"end_line_number\": 40,\n \"line_range\": [\n 40,\n 40\n ],\n \"text\": \"── Functions ─────────────────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Functions ─────────────────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 46,\n \"end_line_number\": 46,\n \"line_range\": [\n 46,\n 46\n ],\n \"text\": \"Validate non-empty name\",\n \"text_lines\": [\n \"Validate non-empty name\"\n ]\n },\n {\n \"start_line_number\": 59,\n \"end_line_number\": 59,\n \"line_range\": [\n 59,\n 59\n ],\n \"text\": \"Remove temp directory and all contents\",\n \"text_lines\": [\n \"Remove temp directory and all contents\"\n ]\n },\n {\n \"start_line_number\": 101,\n \"end_line_number\": 101,\n \"line_range\": [\n 101,\n 101\n ],\n \"text\": \"@brief Process a file with error handling and logging.\",\n \"text_lines\": [\n \"@brief Process a file with error handling and logging.\"\n ]\n },\n {\n \"start_line_number\": 109,\n \"end_line_number\": 109,\n \"line_range\": [\n 109,\n 109\n ],\n \"text\": \"Verify input file exists and is readable\",\n \"text_lines\": [\n \"Verify input file exists and is readable\"\n ]\n },\n {\n \"start_line_number\": 120,\n \"end_line_number\": 120,\n \"line_range\": [\n 120,\n 120\n ],\n \"text\": \"Count lines using wc\",\n \"text_lines\": [\n \"Count lines using wc\"\n ]\n },\n {\n \"start_line_number\": 125,\n \"end_line_number\": 125,\n \"line_range\": [\n 125,\n 125\n ],\n \"text\": \"Transform and write output\",\n \"text_lines\": [\n \"Transform and write output\"\n ]\n },\n {\n \"start_line_number\": 127,\n \"end_line_number\": 127,\n \"line_range\": [\n 127,\n 127\n ],\n \"text\": \"Skip empty lines and comments\",\n \"text_lines\": [\n \"Skip empty lines and comments\"\n ]\n },\n {\n \"start_line_number\": 135,\n \"end_line_number\": 135,\n \"line_range\": [\n 135,\n 135\n ],\n \"text\": \"@brief Execute a command with retry logic.\",\n \"text_lines\": [\n \"@brief Execute a command with retry logic.\"\n ]\n },\n {\n \"start_line_number\": 145,\n \"end_line_number\": 145,\n \"line_range\": [\n 145,\n 145\n ],\n \"text\": \"Attempt the command\",\n \"text_lines\": [\n \"Attempt the command\"\n ]\n },\n {\n \"start_line_number\": 151,\n \"end_line_number\": 151,\n \"line_range\": [\n 151,\n 151\n ],\n \"text\": \"Exponential backoff\",\n \"text_lines\": [\n \"Exponential backoff\"\n ]\n },\n {\n \"start_line_number\": 178,\n \"end_line_number\": 178,\n \"line_range\": [\n 178,\n 178\n ],\n \"text\": \"── Traps ─────────────────────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Traps ─────────────────────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 180,\n \"end_line_number\": 180,\n \"line_range\": [\n 180,\n 180\n ],\n \"text\": \"@brief Register cleanup function on script exit.\",\n \"text_lines\": [\n \"@brief Register cleanup function on script exit.\"\n ]\n },\n {\n \"start_line_number\": 183,\n \"end_line_number\": 183,\n \"line_range\": [\n 183,\n 183\n ],\n \"text\": \"@brief Handle interrupt signal gracefully.\",\n \"text_lines\": [\n \"@brief Handle interrupt signal gracefully.\"\n ]\n },\n {\n \"start_line_number\": 191,\n \"end_line_number\": 191,\n \"line_range\": [\n 191,\n 191\n ],\n \"text\": \"Auto-generated configuration\",\n \"text_lines\": [\n \"Auto-generated configuration\"\n ]\n },\n {\n \"start_line_number\": 198,\n \"end_line_number\": 198,\n \"line_range\": [\n 198,\n 198\n ],\n \"text\": \"── Arithmetic and parameter expansion ────────────────────────────────\",\n \"text_lines\": [\n \"── Arithmetic and parameter expansion ────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 208,\n \"end_line_number\": 208,\n \"line_range\": [\n 208,\n 208\n ],\n \"text\": \"Multiply accumulator\",\n \"text_lines\": [\n \"Multiply accumulator\"\n ]\n },\n {\n \"start_line_number\": 214,\n \"end_line_number\": 214,\n \"line_range\": [\n 214,\n 214\n ],\n \"text\": \"── Source external configuration ─────────────────────────────────────\",\n \"text_lines\": [\n \"── Source external configuration ─────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 216,\n \"end_line_number\": 216,\n \"line_range\": [\n 216,\n 216\n ],\n \"text\": \"@brief Load external configuration script if present.\",\n \"text_lines\": [\n \"@brief Load external configuration script if present.\"\n ]\n },\n {\n \"start_line_number\": 221,\n \"end_line_number\": 221,\n \"line_range\": [\n 221,\n 221\n ],\n \"text\": \"coverage extension block\",\n \"text_lines\": [\n \"coverage extension block\"\n ]\n },\n {\n \"start_line_number\": 230,\n \"end_line_number\": 230,\n \"line_range\": [\n 230,\n 230\n ],\n \"text\": \"REQ-COVER-SRS-231 START\",\n \"text_lines\": [\n \"REQ-COVER-SRS-231 START\"\n ]\n },\n {\n \"start_line_number\": 231,\n \"end_line_number\": 231,\n \"line_range\": [\n 231,\n 231\n ],\n \"text\": \"@REQ-COVER-SRS-231 block 1\",\n \"text_lines\": [\n \"@REQ-COVER-SRS-231 block 1\"\n ]\n },\n {\n \"start_line_number\": 232,\n \"end_line_number\": 232,\n \"line_range\": [\n 232,\n 232\n ],\n \"text\": \"@brief Coverage helper construct 1.\",\n \"text_lines\": [\n \"@brief Coverage helper construct 1.\"\n ]\n },\n {\n \"start_line_number\": 240,\n \"end_line_number\": 240,\n \"line_range\": [\n 240,\n 240\n ],\n \"text\": \"@REQ-COVER-SRS-231 block 2\",\n \"text_lines\": [\n \"@REQ-COVER-SRS-231 block 2\"\n ]\n },\n {\n \"start_line_number\": 241,\n \"end_line_number\": 241,\n \"line_range\": [\n 241,\n 241\n ],\n \"text\": \"@brief Coverage helper construct 2.\",\n \"text_lines\": [\n \"@brief Coverage helper construct 2.\"\n ]\n },\n {\n \"start_line_number\": 249,\n \"end_line_number\": 249,\n \"line_range\": [\n 249,\n 249\n ],\n \"text\": \"@REQ-COVER-SRS-231 block 3\",\n \"text_lines\": [\n \"@REQ-COVER-SRS-231 block 3\"\n ]\n },\n {\n \"start_line_number\": 250,\n \"end_line_number\": 250,\n \"line_range\": [\n 250,\n 250\n ],\n \"text\": \"@brief Coverage helper construct 3.\",\n \"text_lines\": [\n \"@brief Coverage helper construct 3.\"\n ]\n },\n {\n \"start_line_number\": 258,\n \"end_line_number\": 258,\n \"line_range\": [\n 258,\n 258\n ],\n \"text\": \"@REQ-COVER-SRS-231 block 4\",\n \"text_lines\": [\n \"@REQ-COVER-SRS-231 block 4\"\n ]\n },\n {\n \"start_line_number\": 259,\n \"end_line_number\": 259,\n \"line_range\": [\n 259,\n 259\n ],\n \"text\": \"@brief Coverage helper construct 4.\",\n \"text_lines\": [\n \"@brief Coverage helper construct 4.\"\n ]\n },\n {\n \"start_line_number\": 267,\n \"end_line_number\": 267,\n \"line_range\": [\n 267,\n 267\n ],\n \"text\": \"@REQ-COVER-SRS-231 block 5\",\n \"text_lines\": [\n \"@REQ-COVER-SRS-231 block 5\"\n ]\n },\n {\n \"start_line_number\": 268,\n \"end_line_number\": 268,\n \"line_range\": [\n 268,\n 268\n ],\n \"text\": \"@brief Coverage helper construct 5.\",\n \"text_lines\": [\n \"@brief Coverage helper construct 5.\"\n ]\n },\n {\n \"start_line_number\": 276,\n \"end_line_number\": 276,\n \"line_range\": [\n 276,\n 276\n ],\n \"text\": \"REQ-COVER-SRS-231 END\",\n \"text_lines\": [\n \"REQ-COVER-SRS-231 END\"\n ]\n }\n ]\n }\n ]\n}\n",
3
+ "stdout": "# fixture_shell.sh | Shell | 276L | 25 symbols | 5 imports | 90 comments\n> Path: `tests/fixtures/fixture_shell.sh`\n\n## Imports\n```\nsource ./config.sh\nsource ./env.sh\nsource ./shared.sh\nsource ./runtime.sh\nsource ./network.sh\n```\n\n## Definitions\n\n- var `MY_VAR=\"hello\"` (L12)\n- @brief Greeting message template.\n- var `export PATH_EXT=\"/usr/local/bin\"` (L15)\n- @brief Extended PATH including local binary directory.\n- var `readonly MAX_COUNT=10` (L18)\n- @brief Immutable maximum iteration counter.\n- var `declare -r BUILD_VERSION=\"1.0.0\"` (L21)\n- @brief Build version set via declare.\n- var `DEBUG_MODE=0` (L24)\n- @brief Debug mode flag (0=off, 1=on).\n- var `declare -a LANGUAGES=(\"python\" \"rust\" \"go\" \"java\" \"typescript\")` (L29)\n- @brief Indexed array of supported languages.\n- var `declare -A EXT_MAP=(` (L32)\n- @brief Associative array mapping extensions to languages.\n- fn `function greet() {` (L44)\n- @brief Greet a user by name on stdout.\n- @param $1 The user's name.\n- fn `cleanup() {` (L56)\n- @brief Remove temporary files and directories.\n- @details Called by trap on EXIT for cleanup.\n- fn `parse_args() {` (L68)\n- @brief Parse command-line options using getopts.\n- @param $@ Command-line arguments.\n- @return Sets global variables based on parsed options.\n- var `VERBOSE=1` (L74)\n- var `DEBUG_MODE=1` (L78)\n- var `INPUT_FILE=\"$OPTARG\"` (L82)\n- var `OUTPUT_FILE=\"$OPTARG\"` (L86)\n- fn `process_file() {` (L105)\n- @brief Process a file with error handling and logging.\n- @param $1 Path to the input file.\n- @param $2 Optional output path (defaults to stdout).\n- @return 0 on success, 1 on failure.\n- fn `retry_command() {` (L139)\n- @brief Execute a command with retry logic.\n- @param $1 Maximum number of retry attempts.\n- @param $@ The command and arguments to execute.\n- @return Exit code of the final attempt.\n- fn `log_message() {` (L162)\n- @brief Log a message with timestamp prefix.\n- @param $1 Log level (INFO, WARN, ERROR).\n- @param $@ Message text.\n- fn `make_temp() {` (L172)\n- @brief Generate a temporary file and return its path.\n- @return Path to the created temporary file.\n- fn `generate_config() {` (L189)\n- @brief Generate a configuration file using heredoc.\n- fn `factorial() {` (L203)\n- @brief Compute factorial iteratively.\n- @param $1 Non-negative integer.\n- @return Factorial result.\n- fn `req_cover_shell_1() {` (L236)\n- @brief Coverage helper construct 1.\n- @details Provides deterministic fixture-level Doxygen coverage block 1.\n- @param value Input value for helper construct 1.\n- @return Output value for helper construct 1.\n- fn `req_cover_shell_2() {` (L245)\n- @brief Coverage helper construct 2.\n- @details Provides deterministic fixture-level Doxygen coverage block 2.\n- @param value Input value for helper construct 2.\n- @return Output value for helper construct 2.\n- fn `req_cover_shell_3() {` (L254)\n- @brief Coverage helper construct 3.\n- @details Provides deterministic fixture-level Doxygen coverage block 3.\n- @param value Input value for helper construct 3.\n- @return Output value for helper construct 3.\n- fn `req_cover_shell_4() {` (L263)\n- @brief Coverage helper construct 4.\n- @details Provides deterministic fixture-level Doxygen coverage block 4.\n- @param value Input value for helper construct 4.\n- @return Output value for helper construct 4.\n- fn `req_cover_shell_5() {` (L272)\n- @brief Coverage helper construct 5.\n- @details Provides deterministic fixture-level Doxygen coverage block 5.\n- @param value Input value for helper construct 5.\n- @return Output value for helper construct 5.\n## Symbol Index\n|Symbol|Kind|Vis|Lines|Sig|\n|---|---|---|---|---|\n|`MY_VAR`|var||12||\n|`PATH_EXT`|var||15||\n|`MAX_COUNT`|var||18||\n|`BUILD_VERSION`|var||21||\n|`DEBUG_MODE`|var||24||\n|`LANGUAGES`|var||29||\n|`EXT_MAP`|var||32||\n|`greet`|fn||44|function greet()|\n|`cleanup`|fn||56|cleanup()|\n|`parse_args`|fn||68|parse_args()|\n|`VERBOSE`|var||74||\n|`DEBUG_MODE`|var||78||\n|`INPUT_FILE`|var||82||\n|`OUTPUT_FILE`|var||86||\n|`process_file`|fn||105|process_file()|\n|`retry_command`|fn||139|retry_command()|\n|`log_message`|fn||162|log_message()|\n|`make_temp`|fn||172|make_temp()|\n|`generate_config`|fn||189|generate_config()|\n|`factorial`|fn||203|factorial()|\n|`req_cover_shell_1`|fn||236|req_cover_shell_1()|\n|`req_cover_shell_2`|fn||245|req_cover_shell_2()|\n|`req_cover_shell_3`|fn||254|req_cover_shell_3()|\n|`req_cover_shell_4`|fn||263|req_cover_shell_4()|\n|`req_cover_shell_5`|fn||272|req_cover_shell_5()|\n\n",
4
4
  "stderr": ""
5
5
  }