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_ruby.rb\"\n ],\n \"requested_canonical_paths\": [\n \"tests/fixtures/fixture_ruby.rb\"\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\": 40,\n \"total_import_count\": 5,\n \"total_comment_count\": 135,\n \"total_standalone_comment_count\": 52,\n \"total_doxygen_field_count\": 80,\n \"symbol_kind_counts\": {\n \"CLASS\": 5,\n \"CONSTANT\": 5,\n \"FUNCTION\": 25,\n \"MODULE\": 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_ruby.rb\"\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_ruby.rb\",\n \"relative_path\": \"tests/fixtures/fixture_ruby.rb\",\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\": 345,\n \"line_range\": [\n 1,\n 345\n ],\n \"request_index\": 0,\n \"input_path\": \"tests/fixtures/fixture_ruby.rb\",\n \"canonical_path\": \"tests/fixtures/fixture_ruby.rb\",\n \"absolute_path\": \"<ROOT>/tests/fixtures/fixture_ruby.rb\",\n \"file_name\": \"fixture_ruby.rb\",\n \"file_extension\": \".rb\",\n \"language_id\": \"ruby\",\n \"language_name\": \"Ruby\",\n \"status\": \"analyzed\",\n \"exists\": true,\n \"is_file\": true,\n \"import_count\": 5,\n \"symbol_count\": 40,\n \"comment_count\": 135,\n \"standalone_comment_count\": 52,\n \"doxygen_field_count\": 80,\n \"file_description_text\": \"@file fixture_ruby.rb\",\n \"imports\": [\n {\n \"start_line_number\": 10,\n \"end_line_number\": 10,\n \"line_range\": [\n 10,\n 10\n ],\n \"import_name\": \"'json'\",\n \"statement_text\": \"require 'json'\"\n },\n {\n \"start_line_number\": 11,\n \"end_line_number\": 11,\n \"line_range\": [\n 11,\n 11\n ],\n \"import_name\": \"'set'\",\n \"statement_text\": \"require 'set'\"\n },\n {\n \"start_line_number\": 12,\n \"end_line_number\": 12,\n \"line_range\": [\n 12,\n 12\n ],\n \"import_name\": \"'helper'\",\n \"statement_text\": \"require_relative 'helper'\"\n },\n {\n \"start_line_number\": 296,\n \"end_line_number\": 296,\n \"line_range\": [\n 296,\n 296\n ],\n \"import_name\": \"'yaml'\",\n \"statement_text\": \"require 'yaml'\"\n },\n {\n \"start_line_number\": 297,\n \"end_line_number\": 297,\n \"line_range\": [\n 297,\n 297\n ],\n \"import_name\": \"'logger'\",\n \"statement_text\": \"require 'logger'\"\n }\n ],\n \"symbols\": [\n {\n \"start_line_number\": 15,\n \"end_line_number\": 15,\n \"line_range\": [\n 15,\n 15\n ],\n \"declaration_order_index\": 0,\n \"symbol_name\": \"MAX_RETRIES\",\n \"qualified_name\": \"MAX_RETRIES\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"MAX_RETRIES = 42\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Maximum retry attempts for transient failures.\",\n \"doxygen\": {\n \"brief\": [\n \"Maximum retry attempts for transient failures.\"\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\": 1,\n \"symbol_name\": \"DEFAULT_ENCODING\",\n \"qualified_name\": \"DEFAULT_ENCODING\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"DEFAULT_ENCODING = 'utf-8'.freeze\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Frozen string constant for default encoding.\",\n \"doxygen\": {\n \"brief\": [\n \"Frozen string constant for default encoding.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 26,\n \"end_line_number\": 39,\n \"line_range\": [\n 26,\n 39\n ],\n \"declaration_order_index\": 2,\n \"symbol_name\": \"Loggable\",\n \"qualified_name\": \"Loggable\",\n \"symbol_kind\": \"MODULE\",\n \"type_label\": \"MODULE\",\n \"signature_text\": \"module Loggable\",\n \"child_symbol_names\": [\n \"log\",\n \"log_error\"\n ],\n \"child_qualified_names\": [\n \"Loggable.log\",\n \"Loggable.log_error\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Mixin providing logging capabilities to including classes.\",\n \"doxygen\": {\n \"brief\": [\n \"Mixin providing logging capabilities to including classes.\",\n \"Log a message to stdout with the class name prefix.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"message\",\n \"description\": \"[String] The message to log.\"\n }\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 27,\n \"end_line_number\": 27,\n \"line_range\": [\n 27,\n 27\n ],\n \"text\": \"@brief Log a message to stdout with the class name prefix.\",\n \"text_lines\": [\n \"@brief Log a message to stdout with the class name prefix.\"\n ]\n },\n {\n \"start_line_number\": 28,\n \"end_line_number\": 28,\n \"line_range\": [\n 28,\n 28\n ],\n \"text\": \"@param message [String] The message to log.\",\n \"text_lines\": [\n \"@param message [String] The message to log.\"\n ]\n },\n {\n \"start_line_number\": 33,\n \"end_line_number\": 33,\n \"line_range\": [\n 33,\n 33\n ],\n \"text\": \"@brief Log an error with backtrace information.\",\n \"text_lines\": [\n \"@brief Log an error with backtrace information.\"\n ]\n },\n {\n \"start_line_number\": 34,\n \"end_line_number\": 34,\n \"line_range\": [\n 34,\n 34\n ],\n \"text\": \"@param error [Exception] The exception to log.\",\n \"text_lines\": [\n \"@param error [Exception] The exception to log.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 29,\n \"end_line_number\": 31,\n \"line_range\": [\n 29,\n 31\n ],\n \"declaration_order_index\": 3,\n \"symbol_name\": \"log\",\n \"qualified_name\": \"Loggable.log\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def log(message)\",\n \"parent_symbol_name\": \"Loggable\",\n \"parent_qualified_name\": \"Loggable\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Log a message to stdout with the class name prefix.\",\n \"doxygen\": {\n \"brief\": [\n \"Log a message to stdout with the class name prefix.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"message\",\n \"description\": \"[String] The message to log.\"\n }\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 35,\n \"end_line_number\": 38,\n \"line_range\": [\n 35,\n 38\n ],\n \"declaration_order_index\": 4,\n \"symbol_name\": \"log_error\",\n \"qualified_name\": \"Loggable.log_error\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def log_error(error)\",\n \"parent_symbol_name\": \"Loggable\",\n \"parent_qualified_name\": \"Loggable\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Log an error with backtrace information.\",\n \"doxygen\": {\n \"brief\": [\n \"Log an error with backtrace information.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"error\",\n \"description\": \"[Exception] The exception to log.\"\n }\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 47,\n \"end_line_number\": 153,\n \"line_range\": [\n 47,\n 153\n ],\n \"declaration_order_index\": 5,\n \"symbol_name\": \"MyClass\",\n \"qualified_name\": \"MyClass\",\n \"symbol_kind\": \"CLASS\",\n \"type_label\": \"CLASS\",\n \"signature_text\": \"class MyClass\",\n \"child_symbol_names\": [\n \"initialize\",\n \"create\",\n \"bulk_create\",\n \"valid?\",\n \"matches?\",\n \"to_s\",\n \"method_missing\",\n \"respond_to_missing?\",\n \"internal_config\",\n \"validate!\"\n ],\n \"child_qualified_names\": [\n \"MyClass.initialize\",\n \"MyClass.create\",\n \"MyClass.bulk_create\",\n \"MyClass.valid?\",\n \"MyClass.matches?\",\n \"MyClass.to_s\",\n \"MyClass.method_missing\",\n \"MyClass.respond_to_missing?\",\n \"MyClass.internal_config\",\n \"MyClass.validate!\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"@brief Primary class demonstrating core Ruby patterns.\",\n \"attached_comment_lines\": [\n \"@brief Primary class demonstrating core Ruby patterns.\",\n \"@details Includes initializer, class methods, predicate methods,\",\n \"operator overloading, and dynamic method generation.\"\n ],\n \"body_comment_entries\": [\n {\n \"start_line_number\": 51,\n \"end_line_number\": 51,\n \"line_range\": [\n 51,\n 51\n ],\n \"text\": \"@brief Read/write accessor for the instance name.\",\n \"text_lines\": [\n \"@brief Read/write accessor for the instance name.\"\n ]\n },\n {\n \"start_line_number\": 54,\n \"end_line_number\": 54,\n \"line_range\": [\n 54,\n 54\n ],\n \"text\": \"@brief Read-only accessor for the creation timestamp.\",\n \"text_lines\": [\n \"@brief Read-only accessor for the creation timestamp.\"\n ]\n },\n {\n \"start_line_number\": 57,\n \"end_line_number\": 57,\n \"line_range\": [\n 57,\n 57\n ],\n \"text\": \"@brief Initialize a new MyClass instance.\",\n \"text_lines\": [\n \"@brief Initialize a new MyClass instance.\"\n ]\n },\n {\n \"start_line_number\": 58,\n \"end_line_number\": 58,\n \"line_range\": [\n 58,\n 58\n ],\n \"text\": \"@param name [String] The instance identifier.\",\n \"text_lines\": [\n \"@param name [String] The instance identifier.\"\n ]\n },\n {\n \"start_line_number\": 59,\n \"end_line_number\": 59,\n \"line_range\": [\n 59,\n 59\n ],\n \"text\": \"@param options [Hash] Optional configuration hash.\",\n \"text_lines\": [\n \"@param options [Hash] Optional configuration hash.\"\n ]\n },\n {\n \"start_line_number\": 64,\n \"end_line_number\": 64,\n \"line_range\": [\n 64,\n 64\n ],\n \"text\": \"Set defaults for missing options\",\n \"text_lines\": [\n \"Set defaults for missing options\"\n ]\n },\n {\n \"start_line_number\": 68,\n \"end_line_number\": 68,\n \"line_range\": [\n 68,\n 68\n ],\n \"text\": \"@brief Factory method creating an instance from a hash.\",\n \"text_lines\": [\n \"@brief Factory method creating an instance from a hash.\"\n ]\n },\n {\n \"start_line_number\": 69,\n \"end_line_number\": 69,\n \"line_range\": [\n 69,\n 69\n ],\n \"text\": \"@param attrs [Hash] Attribute hash with :name key required.\",\n \"text_lines\": [\n \"@param attrs [Hash] Attribute hash with :name key required.\"\n ]\n },\n {\n \"start_line_number\": 70,\n \"end_line_number\": 70,\n \"line_range\": [\n 70,\n 70\n ],\n \"text\": \"@return [MyClass] A new instance populated from attrs.\",\n \"text_lines\": [\n \"@return [MyClass] A new instance populated from attrs.\"\n ]\n },\n {\n \"start_line_number\": 75,\n \"end_line_number\": 75,\n \"line_range\": [\n 75,\n 75\n ],\n \"text\": \"@brief Build multiple instances from an array of names.\",\n \"text_lines\": [\n \"@brief Build multiple instances from an array of names.\"\n ]\n },\n {\n \"start_line_number\": 76,\n \"end_line_number\": 76,\n \"line_range\": [\n 76,\n 76\n ],\n \"text\": \"@param names [Array<String>] Names to create instances for.\",\n \"text_lines\": [\n \"@param names [Array<String>] Names to create instances for.\"\n ]\n },\n {\n \"start_line_number\": 77,\n \"end_line_number\": 77,\n \"line_range\": [\n 77,\n 77\n ],\n \"text\": \"@return [Array<MyClass>] Array of new instances.\",\n \"text_lines\": [\n \"@return [Array<MyClass>] Array of new instances.\"\n ]\n },\n {\n \"start_line_number\": 82,\n \"end_line_number\": 82,\n \"line_range\": [\n 82,\n 82\n ],\n \"text\": \"@brief Predicate checking if the instance is valid.\",\n \"text_lines\": [\n \"@brief Predicate checking if the instance is valid.\"\n ]\n },\n {\n \"start_line_number\": 83,\n \"end_line_number\": 83,\n \"line_range\": [\n 83,\n 83\n ],\n \"text\": \"@return [Boolean] True if name is non-empty.\",\n \"text_lines\": [\n \"@return [Boolean] True if name is non-empty.\"\n ]\n },\n {\n \"start_line_number\": 88,\n \"end_line_number\": 88,\n \"line_range\": [\n 88,\n 88\n ],\n \"text\": \"@brief Check if name matches a pattern.\",\n \"text_lines\": [\n \"@brief Check if name matches a pattern.\"\n ]\n },\n {\n \"start_line_number\": 89,\n \"end_line_number\": 89,\n \"line_range\": [\n 89,\n 89\n ],\n \"text\": \"@param pattern [Regexp] Regular expression to test against.\",\n \"text_lines\": [\n \"@param pattern [Regexp] Regular expression to test against.\"\n ]\n },\n {\n \"start_line_number\": 90,\n \"end_line_number\": 90,\n \"line_range\": [\n 90,\n 90\n ],\n \"text\": \"@return [Boolean] True if name matches the pattern.\",\n \"text_lines\": [\n \"@return [Boolean] True if name matches the pattern.\"\n ]\n },\n {\n \"start_line_number\": 96,\n \"end_line_number\": 96,\n \"line_range\": [\n 96,\n 96\n ],\n \"text\": \"@brief Spaceship operator for Comparable mixin.\",\n \"text_lines\": [\n \"@brief Spaceship operator for Comparable mixin.\"\n ]\n },\n {\n \"start_line_number\": 97,\n \"end_line_number\": 97,\n \"line_range\": [\n 97,\n 97\n ],\n \"text\": \"@param other [MyClass] Instance to compare with.\",\n \"text_lines\": [\n \"@param other [MyClass] Instance to compare with.\"\n ]\n },\n {\n \"start_line_number\": 98,\n \"end_line_number\": 98,\n \"line_range\": [\n 98,\n 98\n ],\n \"text\": \"@return [Integer] -1, 0, or 1 based on name comparison.\",\n \"text_lines\": [\n \"@return [Integer] -1, 0, or 1 based on name comparison.\"\n ]\n },\n {\n \"start_line_number\": 103,\n \"end_line_number\": 103,\n \"line_range\": [\n 103,\n 103\n ],\n \"text\": \"@brief Concatenate two instances into a new one.\",\n \"text_lines\": [\n \"@brief Concatenate two instances into a new one.\"\n ]\n },\n {\n \"start_line_number\": 104,\n \"end_line_number\": 104,\n \"line_range\": [\n 104,\n 104\n ],\n \"text\": \"@param other [MyClass] Instance to merge with.\",\n \"text_lines\": [\n \"@param other [MyClass] Instance to merge with.\"\n ]\n },\n {\n \"start_line_number\": 105,\n \"end_line_number\": 105,\n \"line_range\": [\n 105,\n 105\n ],\n \"text\": \"@return [MyClass] New instance with combined name.\",\n \"text_lines\": [\n \"@return [MyClass] New instance with combined name.\"\n ]\n },\n {\n \"start_line_number\": 110,\n \"end_line_number\": 110,\n \"line_range\": [\n 110,\n 110\n ],\n \"text\": \"@brief Convert to string representation.\",\n \"text_lines\": [\n \"@brief Convert to string representation.\"\n ]\n },\n {\n \"start_line_number\": 111,\n \"end_line_number\": 111,\n \"line_range\": [\n 111,\n 111\n ],\n \"text\": \"@return [String] Human-readable description.\",\n \"text_lines\": [\n \"@return [String] Human-readable description.\"\n ]\n },\n {\n \"start_line_number\": 116,\n \"end_line_number\": 116,\n \"line_range\": [\n 116,\n 116\n ],\n \"text\": \"@brief Handle undefined method calls dynamically.\",\n \"text_lines\": [\n \"@brief Handle undefined method calls dynamically.\"\n ]\n },\n {\n \"start_line_number\": 117,\n \"end_line_number\": 117,\n \"line_range\": [\n 117,\n 117\n ],\n \"text\": \"@param method [Symbol] The called method name.\",\n \"text_lines\": [\n \"@param method [Symbol] The called method name.\"\n ]\n },\n {\n \"start_line_number\": 118,\n \"end_line_number\": 118,\n \"line_range\": [\n 118,\n 118\n ],\n \"text\": \"@param args [Array] Arguments passed to the method.\",\n \"text_lines\": [\n \"@param args [Array] Arguments passed to the method.\"\n ]\n },\n {\n \"start_line_number\": 119,\n \"end_line_number\": 119,\n \"line_range\": [\n 119,\n 119\n ],\n \"text\": \"@return [String] Description of the missing method.\",\n \"text_lines\": [\n \"@return [String] Description of the missing method.\"\n ]\n },\n {\n \"start_line_number\": 120,\n \"end_line_number\": 120,\n \"line_range\": [\n 120,\n 120\n ],\n \"text\": \"@raise [NoMethodError] If method doesn't start with 'find_by_'.\",\n \"text_lines\": [\n \"@raise [NoMethodError] If method doesn't start with 'find_by_'.\"\n ]\n },\n {\n \"start_line_number\": 130,\n \"end_line_number\": 130,\n \"line_range\": [\n 130,\n 130\n ],\n \"text\": \"@brief Declare which dynamic methods respond_to? should recognize.\",\n \"text_lines\": [\n \"@brief Declare which dynamic methods respond_to? should recognize.\"\n ]\n },\n {\n \"start_line_number\": 131,\n \"end_line_number\": 131,\n \"line_range\": [\n 131,\n 131\n ],\n \"text\": \"@param method [Symbol] The method name to check.\",\n \"text_lines\": [\n \"@param method [Symbol] The method name to check.\"\n ]\n },\n {\n \"start_line_number\": 132,\n \"end_line_number\": 132,\n \"line_range\": [\n 132,\n 132\n ],\n \"text\": \"@param include_private [Boolean] Whether to include private methods.\",\n \"text_lines\": [\n \"@param include_private [Boolean] Whether to include private methods.\"\n ]\n },\n {\n \"start_line_number\": 133,\n \"end_line_number\": 133,\n \"line_range\": [\n 133,\n 133\n ],\n \"text\": \"@return [Boolean] True if the method is handled dynamically.\",\n \"text_lines\": [\n \"@return [Boolean] True if the method is handled dynamically.\"\n ]\n },\n {\n \"start_line_number\": 140,\n \"end_line_number\": 140,\n \"line_range\": [\n 140,\n 140\n ],\n \"text\": \"@brief Protected helper for internal computations.\",\n \"text_lines\": [\n \"@brief Protected helper for internal computations.\"\n ]\n },\n {\n \"start_line_number\": 141,\n \"end_line_number\": 141,\n \"line_range\": [\n 141,\n 141\n ],\n \"text\": \"@return [Hash] Current options hash.\",\n \"text_lines\": [\n \"@return [Hash] Current options hash.\"\n ]\n },\n {\n \"start_line_number\": 148,\n \"end_line_number\": 148,\n \"line_range\": [\n 148,\n 148\n ],\n \"text\": \"@brief Private validation running before save.\",\n \"text_lines\": [\n \"@brief Private validation running before save.\"\n ]\n },\n {\n \"start_line_number\": 149,\n \"end_line_number\": 149,\n \"line_range\": [\n 149,\n 149\n ],\n \"text\": \"@raise [RuntimeError] If validation fails.\",\n \"text_lines\": [\n \"@raise [RuntimeError] If validation fails.\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 92,\n \"text\": \"return false if @name.nil?\"\n },\n {\n \"line_number\": 151,\n \"text\": \"raise \\\"Invalid name\\\" unless valid?\"\n }\n ]\n },\n {\n \"start_line_number\": 60,\n \"end_line_number\": 66,\n \"line_range\": [\n 60,\n 66\n ],\n \"declaration_order_index\": 6,\n \"symbol_name\": \"initialize\",\n \"qualified_name\": \"MyClass.initialize\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def initialize(name, **options)\",\n \"parent_symbol_name\": \"MyClass\",\n \"parent_qualified_name\": \"MyClass\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Initialize a new MyClass instance.\",\n \"doxygen\": {\n \"brief\": [\n \"Initialize a new MyClass instance.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"name\",\n \"description\": \"[String] The instance identifier.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"options\",\n \"description\": \"[Hash] Optional configuration hash.\"\n }\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 64,\n \"end_line_number\": 64,\n \"line_range\": [\n 64,\n 64\n ],\n \"text\": \"Set defaults for missing options\",\n \"text_lines\": [\n \"Set defaults for missing options\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 71,\n \"end_line_number\": 73,\n \"line_range\": [\n 71,\n 73\n ],\n \"declaration_order_index\": 7,\n \"symbol_name\": \"create\",\n \"qualified_name\": \"MyClass.create\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def self.create(attrs)\",\n \"parent_symbol_name\": \"MyClass\",\n \"parent_qualified_name\": \"MyClass\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Factory method creating an instance from a hash.\",\n \"doxygen\": {\n \"brief\": [\n \"Factory method creating an instance from a hash.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"attrs\",\n \"description\": \"[Hash] Attribute hash with :name key required.\"\n }\n ],\n \"returns\": [\n \"[MyClass] A new instance populated from attrs.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 78,\n \"end_line_number\": 80,\n \"line_range\": [\n 78,\n 80\n ],\n \"declaration_order_index\": 8,\n \"symbol_name\": \"bulk_create\",\n \"qualified_name\": \"MyClass.bulk_create\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def self.bulk_create(names)\",\n \"parent_symbol_name\": \"MyClass\",\n \"parent_qualified_name\": \"MyClass\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Build multiple instances from an array of names.\",\n \"doxygen\": {\n \"brief\": [\n \"Build multiple instances from an array of names.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"names\",\n \"description\": \"[Array<String>] Names to create instances for.\"\n }\n ],\n \"returns\": [\n \"[Array<MyClass>] Array of new instances.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 84,\n \"end_line_number\": 86,\n \"line_range\": [\n 84,\n 86\n ],\n \"declaration_order_index\": 9,\n \"symbol_name\": \"valid?\",\n \"qualified_name\": \"MyClass.valid?\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def valid?\",\n \"parent_symbol_name\": \"MyClass\",\n \"parent_qualified_name\": \"MyClass\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Predicate checking if the instance is valid.\",\n \"doxygen\": {\n \"brief\": [\n \"Predicate checking if the instance is valid.\"\n ],\n \"returns\": [\n \"[Boolean] True if name is non-empty.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 91,\n \"end_line_number\": 94,\n \"line_range\": [\n 91,\n 94\n ],\n \"declaration_order_index\": 10,\n \"symbol_name\": \"matches?\",\n \"qualified_name\": \"MyClass.matches?\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def matches?(pattern)\",\n \"parent_symbol_name\": \"MyClass\",\n \"parent_qualified_name\": \"MyClass\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Check if name matches a pattern.\",\n \"doxygen\": {\n \"brief\": [\n \"Check if name matches a pattern.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"pattern\",\n \"description\": \"[Regexp] Regular expression to test against.\"\n }\n ],\n \"returns\": [\n \"[Boolean] True if name matches the pattern.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 92,\n \"text\": \"return false if @name.nil?\"\n }\n ]\n },\n {\n \"start_line_number\": 112,\n \"end_line_number\": 114,\n \"line_range\": [\n 112,\n 114\n ],\n \"declaration_order_index\": 11,\n \"symbol_name\": \"to_s\",\n \"qualified_name\": \"MyClass.to_s\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def to_s\",\n \"parent_symbol_name\": \"MyClass\",\n \"parent_qualified_name\": \"MyClass\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Convert to string representation.\",\n \"doxygen\": {\n \"brief\": [\n \"Convert to string representation.\"\n ],\n \"returns\": [\n \"[String] Human-readable description.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 121,\n \"end_line_number\": 128,\n \"line_range\": [\n 121,\n 128\n ],\n \"declaration_order_index\": 12,\n \"symbol_name\": \"method_missing\",\n \"qualified_name\": \"MyClass.method_missing\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def method_missing(method, *args, &block)\",\n \"parent_symbol_name\": \"MyClass\",\n \"parent_qualified_name\": \"MyClass\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"@param args [Array] Arguments passed to the method.\",\n \"attached_comment_lines\": [\n \"@param args [Array] Arguments passed to the method.\",\n \"@return [String] Description of the missing method.\",\n \"@raise [NoMethodError] If method doesn't start with 'find_by_'.\"\n ],\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 134,\n \"end_line_number\": 136,\n \"line_range\": [\n 134,\n 136\n ],\n \"declaration_order_index\": 13,\n \"symbol_name\": \"respond_to_missing?\",\n \"qualified_name\": \"MyClass.respond_to_missing?\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def respond_to_missing?(method, include_private = false)\",\n \"parent_symbol_name\": \"MyClass\",\n \"parent_qualified_name\": \"MyClass\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Declare which dynamic methods respond_to? should recognize.\",\n \"doxygen\": {\n \"brief\": [\n \"Declare which dynamic methods respond_to? should recognize.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"method\",\n \"description\": \"[Symbol] The method name to check.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"include_private\",\n \"description\": \"[Boolean] Whether to include private methods.\"\n }\n ],\n \"returns\": [\n \"[Boolean] True if the method is handled dynamically.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 142,\n \"end_line_number\": 144,\n \"line_range\": [\n 142,\n 144\n ],\n \"declaration_order_index\": 14,\n \"symbol_name\": \"internal_config\",\n \"qualified_name\": \"MyClass.internal_config\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def internal_config\",\n \"parent_symbol_name\": \"MyClass\",\n \"parent_qualified_name\": \"MyClass\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Protected helper for internal computations.\",\n \"doxygen\": {\n \"brief\": [\n \"Protected helper for internal computations.\"\n ],\n \"returns\": [\n \"[Hash] Current options hash.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 150,\n \"end_line_number\": 152,\n \"line_range\": [\n 150,\n 152\n ],\n \"declaration_order_index\": 15,\n \"symbol_name\": \"validate!\",\n \"qualified_name\": \"MyClass.validate!\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def validate!\",\n \"parent_symbol_name\": \"MyClass\",\n \"parent_qualified_name\": \"MyClass\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"@brief Private validation running before save.\",\n \"attached_comment_lines\": [\n \"@brief Private validation running before save.\",\n \"@raise [RuntimeError] If validation fails.\"\n ],\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 151,\n \"text\": \"raise \\\"Invalid name\\\" unless valid?\"\n }\n ]\n },\n {\n \"start_line_number\": 160,\n \"end_line_number\": 174,\n \"line_range\": [\n 160,\n 174\n ],\n \"declaration_order_index\": 16,\n \"symbol_name\": \"SpecialClass\",\n \"qualified_name\": \"SpecialClass\",\n \"symbol_kind\": \"CLASS\",\n \"type_label\": \"CLASS\",\n \"signature_text\": \"class SpecialClass < MyClass\",\n \"child_symbol_names\": [\n \"initialize\",\n \"to_s\"\n ],\n \"child_qualified_names\": [\n \"SpecialClass.initialize\",\n \"SpecialClass.to_s\"\n ],\n \"depth\": 0,\n \"inherits_text\": \"MyClass\",\n \"attached_comment_summary_text\": \"Specialized subclass with additional behavior.\",\n \"doxygen\": {\n \"brief\": [\n \"Specialized subclass with additional behavior.\",\n \"Initialize with a priority level.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"name\",\n \"description\": \"[String] Instance name.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"priority\",\n \"description\": \"[Integer] Processing priority (lower = first).\"\n }\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 161,\n \"end_line_number\": 161,\n \"line_range\": [\n 161,\n 161\n ],\n \"text\": \"@brief Initialize with a priority level.\",\n \"text_lines\": [\n \"@brief Initialize with a priority level.\"\n ]\n },\n {\n \"start_line_number\": 162,\n \"end_line_number\": 162,\n \"line_range\": [\n 162,\n 162\n ],\n \"text\": \"@param name [String] Instance name.\",\n \"text_lines\": [\n \"@param name [String] Instance name.\"\n ]\n },\n {\n \"start_line_number\": 163,\n \"end_line_number\": 163,\n \"line_range\": [\n 163,\n 163\n ],\n \"text\": \"@param priority [Integer] Processing priority (lower = first).\",\n \"text_lines\": [\n \"@param priority [Integer] Processing priority (lower = first).\"\n ]\n },\n {\n \"start_line_number\": 169,\n \"end_line_number\": 169,\n \"line_range\": [\n 169,\n 169\n ],\n \"text\": \"@brief Override to_s with priority information.\",\n \"text_lines\": [\n \"@brief Override to_s with priority information.\"\n ]\n },\n {\n \"start_line_number\": 170,\n \"end_line_number\": 170,\n \"line_range\": [\n 170,\n 170\n ],\n \"text\": \"@return [String] Description including priority.\",\n \"text_lines\": [\n \"@return [String] Description including priority.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 164,\n \"end_line_number\": 167,\n \"line_range\": [\n 164,\n 167\n ],\n \"declaration_order_index\": 17,\n \"symbol_name\": \"initialize\",\n \"qualified_name\": \"SpecialClass.initialize\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def initialize(name, priority: 0, **options)\",\n \"parent_symbol_name\": \"SpecialClass\",\n \"parent_qualified_name\": \"SpecialClass\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Initialize with a priority level.\",\n \"doxygen\": {\n \"brief\": [\n \"Initialize with a priority level.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"name\",\n \"description\": \"[String] Instance name.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"priority\",\n \"description\": \"[Integer] Processing priority (lower = first).\"\n }\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 171,\n \"end_line_number\": 173,\n \"line_range\": [\n 171,\n 173\n ],\n \"declaration_order_index\": 18,\n \"symbol_name\": \"to_s\",\n \"qualified_name\": \"SpecialClass.to_s\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def to_s\",\n \"parent_symbol_name\": \"SpecialClass\",\n \"parent_qualified_name\": \"SpecialClass\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Override to_s with priority information.\",\n \"doxygen\": {\n \"brief\": [\n \"Override to_s with priority information.\"\n ],\n \"returns\": [\n \"[String] Description including priority.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 180,\n \"end_line_number\": 207,\n \"line_range\": [\n 180,\n 207\n ],\n \"declaration_order_index\": 19,\n \"symbol_name\": \"MyModule\",\n \"qualified_name\": \"MyModule\",\n \"symbol_kind\": \"MODULE\",\n \"type_label\": \"MODULE\",\n \"signature_text\": \"module MyModule\",\n \"child_symbol_names\": [\n \"helper\",\n \"process_with_block\",\n \"format_list\"\n ],\n \"child_qualified_names\": [\n \"MyModule.helper\",\n \"MyModule.process_with_block\",\n \"MyModule.format_list\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Utility module providing helper methods.\",\n \"doxygen\": {\n \"brief\": [\n \"Utility module providing helper methods.\",\n \"Module-level helper returning a boolean.\"\n ],\n \"returns\": [\n \"[Boolean] Always returns true.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 181,\n \"end_line_number\": 181,\n \"line_range\": [\n 181,\n 181\n ],\n \"text\": \"@brief Module-level helper returning a boolean.\",\n \"text_lines\": [\n \"@brief Module-level helper returning a boolean.\"\n ]\n },\n {\n \"start_line_number\": 182,\n \"end_line_number\": 182,\n \"line_range\": [\n 182,\n 182\n ],\n \"text\": \"@return [Boolean] Always returns true.\",\n \"text_lines\": [\n \"@return [Boolean] Always returns true.\"\n ]\n },\n {\n \"start_line_number\": 187,\n \"end_line_number\": 187,\n \"line_range\": [\n 187,\n 187\n ],\n \"text\": \"@brief Process data with block yield pattern.\",\n \"text_lines\": [\n \"@brief Process data with block yield pattern.\"\n ]\n },\n {\n \"start_line_number\": 188,\n \"end_line_number\": 188,\n \"line_range\": [\n 188,\n 188\n ],\n \"text\": \"@param data [Object] Data to process.\",\n \"text_lines\": [\n \"@param data [Object] Data to process.\"\n ]\n },\n {\n \"start_line_number\": 189,\n \"end_line_number\": 189,\n \"line_range\": [\n 189,\n 189\n ],\n \"text\": \"@yield [Object] Yields data for caller-defined processing.\",\n \"text_lines\": [\n \"@yield [Object] Yields data for caller-defined processing.\"\n ]\n },\n {\n \"start_line_number\": 190,\n \"end_line_number\": 190,\n \"line_range\": [\n 190,\n 190\n ],\n \"text\": \"@return [Object] The block's return value or data itself.\",\n \"text_lines\": [\n \"@return [Object] The block's return value or data itself.\"\n ]\n },\n {\n \"start_line_number\": 199,\n \"end_line_number\": 199,\n \"line_range\": [\n 199,\n 199\n ],\n \"text\": \"── Module function ──────────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Module function ──────────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 201,\n \"end_line_number\": 201,\n \"line_range\": [\n 201,\n 201\n ],\n \"text\": \"@brief Utility function accessible without mixing in.\",\n \"text_lines\": [\n \"@brief Utility function accessible without mixing in.\"\n ]\n },\n {\n \"start_line_number\": 202,\n \"end_line_number\": 202,\n \"line_range\": [\n 202,\n 202\n ],\n \"text\": \"@param items [Array] Items to format.\",\n \"text_lines\": [\n \"@param items [Array] Items to format.\"\n ]\n },\n {\n \"start_line_number\": 203,\n \"end_line_number\": 203,\n \"line_range\": [\n 203,\n 203\n ],\n \"text\": \"@return [String] Comma-separated formatted string.\",\n \"text_lines\": [\n \"@return [String] Comma-separated formatted string.\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 193,\n \"text\": \"yield(data)\"\n }\n ]\n },\n {\n \"start_line_number\": 183,\n \"end_line_number\": 185,\n \"line_range\": [\n 183,\n 185\n ],\n \"declaration_order_index\": 20,\n \"symbol_name\": \"helper\",\n \"qualified_name\": \"MyModule.helper\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def helper\",\n \"parent_symbol_name\": \"MyModule\",\n \"parent_qualified_name\": \"MyModule\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Module-level helper returning a boolean.\",\n \"doxygen\": {\n \"brief\": [\n \"Module-level helper returning a boolean.\"\n ],\n \"returns\": [\n \"[Boolean] Always returns true.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 191,\n \"end_line_number\": 197,\n \"line_range\": [\n 191,\n 197\n ],\n \"declaration_order_index\": 21,\n \"symbol_name\": \"process_with_block\",\n \"qualified_name\": \"MyModule.process_with_block\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def process_with_block(data)\",\n \"parent_symbol_name\": \"MyModule\",\n \"parent_qualified_name\": \"MyModule\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Process data with block yield pattern.\",\n \"doxygen\": {\n \"brief\": [\n \"Process data with block yield pattern.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"text\": \"data [Object] Data to process.\\n@yield [Object] Yields data for caller-defined processing.\"\n }\n ],\n \"returns\": [\n \"[Object] The block's return value or data itself.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 193,\n \"text\": \"yield(data)\"\n }\n ]\n },\n {\n \"start_line_number\": 204,\n \"end_line_number\": 206,\n \"line_range\": [\n 204,\n 206\n ],\n \"declaration_order_index\": 22,\n \"symbol_name\": \"format_list\",\n \"qualified_name\": \"MyModule.format_list\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def self.format_list(items)\",\n \"parent_symbol_name\": \"MyModule\",\n \"parent_qualified_name\": \"MyModule\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Utility function accessible without mixing in.\",\n \"doxygen\": {\n \"brief\": [\n \"Utility function accessible without mixing in.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"items\",\n \"description\": \"[Array] Items to format.\"\n }\n ],\n \"returns\": [\n \"[String] Comma-separated formatted string.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 216,\n \"end_line_number\": 218,\n \"line_range\": [\n 216,\n 218\n ],\n \"declaration_order_index\": 23,\n \"symbol_name\": \"distance_from_origin\",\n \"qualified_name\": \"distance_from_origin\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def distance_from_origin\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Compute the Euclidean distance from origin.\",\n \"doxygen\": {\n \"brief\": [\n \"Compute the Euclidean distance from origin.\"\n ],\n \"returns\": [\n \"[Float] Distance from (0, 0).\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 225,\n \"end_line_number\": 238,\n \"line_range\": [\n 225,\n 238\n ],\n \"declaration_order_index\": 24,\n \"symbol_name\": \"DynamicModel\",\n \"qualified_name\": \"DynamicModel\",\n \"symbol_kind\": \"CLASS\",\n \"type_label\": \"CLASS\",\n \"signature_text\": \"class DynamicModel\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Demonstrates metaprogramming with define_method.\",\n \"doxygen\": {\n \"brief\": [\n \"Demonstrates metaprogramming with define_method.\",\n \"Dynamically defined getter for #{field}.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 226,\n \"end_line_number\": 226,\n \"line_range\": [\n 226,\n 226\n ],\n \"text\": \"Generate getter/setter pairs for each field\",\n \"text_lines\": [\n \"Generate getter/setter pairs for each field\"\n ]\n },\n {\n \"start_line_number\": 228,\n \"end_line_number\": 228,\n \"line_range\": [\n 228,\n 228\n ],\n \"text\": \"@brief Dynamically defined getter for #{field}.\",\n \"text_lines\": [\n \"@brief Dynamically defined getter for #{field}.\"\n ]\n },\n {\n \"start_line_number\": 233,\n \"end_line_number\": 233,\n \"line_range\": [\n 233,\n 233\n ],\n \"text\": \"@brief Dynamically defined setter for #{field}.\",\n \"text_lines\": [\n \"@brief Dynamically defined setter for #{field}.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 255,\n \"end_line_number\": 268,\n \"line_range\": [\n 255,\n 268\n ],\n \"declaration_order_index\": 25,\n \"symbol_name\": \"with_retry\",\n \"qualified_name\": \"with_retry\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def with_retry(attempts: MAX_RETRIES)\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"@yield The operation to attempt.\",\n \"attached_comment_lines\": [\n \"@yield The operation to attempt.\",\n \"@return [Object] The block's return value on success.\",\n \"@raise [RuntimeError] If all attempts fail.\"\n ],\n \"body_comment_entries\": [\n {\n \"start_line_number\": 261,\n \"end_line_number\": 261,\n \"line_range\": [\n 261,\n 261\n ],\n \"text\": \"Retry if attempts remain\",\n \"text_lines\": [\n \"Retry if attempts remain\"\n ]\n },\n {\n \"start_line_number\": 265,\n \"end_line_number\": 265,\n \"line_range\": [\n 265,\n 265\n ],\n \"text\": \"Cleanup runs regardless of outcome\",\n \"text_lines\": [\n \"Cleanup runs regardless of outcome\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 259,\n \"text\": \"yield\"\n },\n {\n \"line_number\": 263,\n \"text\": \"raise \\\"Failed after #{attempts} attempts: #{e.message}\\\"\"\n }\n ]\n },\n {\n \"start_line_number\": 274,\n \"end_line_number\": 282,\n \"line_range\": [\n 274,\n 282\n ],\n \"declaration_order_index\": 26,\n \"symbol_name\": \"StringExtensions\",\n \"qualified_name\": \"StringExtensions\",\n \"symbol_kind\": \"MODULE\",\n \"type_label\": \"MODULE\",\n \"signature_text\": \"module StringExtensions\",\n \"child_symbol_names\": [\n \"email?\"\n ],\n \"child_qualified_names\": [\n \"StringExtensions.email?\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Refinement adding utility methods to String.\",\n \"doxygen\": {\n \"brief\": [\n \"Refinement adding utility methods to String.\",\n \"Check if the string is a valid email address.\"\n ],\n \"returns\": [\n \"[Boolean] True if string matches email pattern.\"\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\": \"@brief Check if the string is a valid email address.\",\n \"text_lines\": [\n \"@brief Check if the string is a valid email address.\"\n ]\n },\n {\n \"start_line_number\": 277,\n \"end_line_number\": 277,\n \"line_range\": [\n 277,\n 277\n ],\n \"text\": \"@return [Boolean] True if string matches email pattern.\",\n \"text_lines\": [\n \"@return [Boolean] True if string matches email pattern.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 278,\n \"end_line_number\": 280,\n \"line_range\": [\n 278,\n 280\n ],\n \"declaration_order_index\": 27,\n \"symbol_name\": \"email?\",\n \"qualified_name\": \"StringExtensions.email?\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def email?\",\n \"parent_symbol_name\": \"StringExtensions\",\n \"parent_qualified_name\": \"StringExtensions\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Check if the string is a valid email address.\",\n \"doxygen\": {\n \"brief\": [\n \"Check if the string is a valid email address.\"\n ],\n \"returns\": [\n \"[Boolean] True if string matches email pattern.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 287,\n \"end_line_number\": 307,\n \"line_range\": [\n 287,\n 307\n ],\n \"declaration_order_index\": 28,\n \"symbol_name\": \"ServiceObject\",\n \"qualified_name\": \"ServiceObject\",\n \"symbol_kind\": \"CLASS\",\n \"type_label\": \"CLASS\",\n \"signature_text\": \"class ServiceObject; end # inline class comment\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"coverage extension block\",\n \"attached_comment_lines\": [\n \"coverage extension block\"\n ],\n \"body_comment_entries\": [\n {\n \"start_line_number\": 299,\n \"end_line_number\": 299,\n \"line_range\": [\n 299,\n 299\n ],\n \"text\": \"REQ-COVER-SRS-231 START\",\n \"text_lines\": [\n \"REQ-COVER-SRS-231 START\"\n ]\n },\n {\n \"start_line_number\": 300,\n \"end_line_number\": 300,\n \"line_range\": [\n 300,\n 300\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\": 301,\n \"end_line_number\": 301,\n \"line_range\": [\n 301,\n 301\n ],\n \"text\": \"@brief Coverage helper construct 1.\",\n \"text_lines\": [\n \"@brief Coverage helper construct 1.\"\n ]\n },\n {\n \"start_line_number\": 302,\n \"end_line_number\": 302,\n \"line_range\": [\n 302,\n 302\n ],\n \"text\": \"@details Provides deterministic fixture-level Doxygen coverage block 1.\",\n \"text_lines\": [\n \"@details Provides deterministic fixture-level Doxygen coverage block 1.\"\n ]\n },\n {\n \"start_line_number\": 303,\n \"end_line_number\": 303,\n \"line_range\": [\n 303,\n 303\n ],\n \"text\": \"@param value Input value for helper construct 1.\",\n \"text_lines\": [\n \"@param value Input value for helper construct 1.\"\n ]\n },\n {\n \"start_line_number\": 304,\n \"end_line_number\": 304,\n \"line_range\": [\n 304,\n 304\n ],\n \"text\": \"@return Output value for helper construct 1.\",\n \"text_lines\": [\n \"@return Output value for helper construct 1.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 288,\n \"end_line_number\": 307,\n \"line_range\": [\n 288,\n 307\n ],\n \"declaration_order_index\": 29,\n \"symbol_name\": \"ReportBuilder\",\n \"qualified_name\": \"ReportBuilder\",\n \"symbol_kind\": \"CLASS\",\n \"type_label\": \"CLASS\",\n \"signature_text\": \"class ReportBuilder; end\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [\n {\n \"start_line_number\": 299,\n \"end_line_number\": 299,\n \"line_range\": [\n 299,\n 299\n ],\n \"text\": \"REQ-COVER-SRS-231 START\",\n \"text_lines\": [\n \"REQ-COVER-SRS-231 START\"\n ]\n },\n {\n \"start_line_number\": 300,\n \"end_line_number\": 300,\n \"line_range\": [\n 300,\n 300\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\": 301,\n \"end_line_number\": 301,\n \"line_range\": [\n 301,\n 301\n ],\n \"text\": \"@brief Coverage helper construct 1.\",\n \"text_lines\": [\n \"@brief Coverage helper construct 1.\"\n ]\n },\n {\n \"start_line_number\": 302,\n \"end_line_number\": 302,\n \"line_range\": [\n 302,\n 302\n ],\n \"text\": \"@details Provides deterministic fixture-level Doxygen coverage block 1.\",\n \"text_lines\": [\n \"@details Provides deterministic fixture-level Doxygen coverage block 1.\"\n ]\n },\n {\n \"start_line_number\": 303,\n \"end_line_number\": 303,\n \"line_range\": [\n 303,\n 303\n ],\n \"text\": \"@param value Input value for helper construct 1.\",\n \"text_lines\": [\n \"@param value Input value for helper construct 1.\"\n ]\n },\n {\n \"start_line_number\": 304,\n \"end_line_number\": 304,\n \"line_range\": [\n 304,\n 304\n ],\n \"text\": \"@return Output value for helper construct 1.\",\n \"text_lines\": [\n \"@return Output value for helper construct 1.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 289,\n \"end_line_number\": 307,\n \"line_range\": [\n 289,\n 307\n ],\n \"declaration_order_index\": 30,\n \"symbol_name\": \"Metrics\",\n \"qualified_name\": \"Metrics\",\n \"symbol_kind\": \"MODULE\",\n \"type_label\": \"MODULE\",\n \"signature_text\": \"module Metrics; end\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [\n {\n \"start_line_number\": 299,\n \"end_line_number\": 299,\n \"line_range\": [\n 299,\n 299\n ],\n \"text\": \"REQ-COVER-SRS-231 START\",\n \"text_lines\": [\n \"REQ-COVER-SRS-231 START\"\n ]\n },\n {\n \"start_line_number\": 300,\n \"end_line_number\": 300,\n \"line_range\": [\n 300,\n 300\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\": 301,\n \"end_line_number\": 301,\n \"line_range\": [\n 301,\n 301\n ],\n \"text\": \"@brief Coverage helper construct 1.\",\n \"text_lines\": [\n \"@brief Coverage helper construct 1.\"\n ]\n },\n {\n \"start_line_number\": 302,\n \"end_line_number\": 302,\n \"line_range\": [\n 302,\n 302\n ],\n \"text\": \"@details Provides deterministic fixture-level Doxygen coverage block 1.\",\n \"text_lines\": [\n \"@details Provides deterministic fixture-level Doxygen coverage block 1.\"\n ]\n },\n {\n \"start_line_number\": 303,\n \"end_line_number\": 303,\n \"line_range\": [\n 303,\n 303\n ],\n \"text\": \"@param value Input value for helper construct 1.\",\n \"text_lines\": [\n \"@param value Input value for helper construct 1.\"\n ]\n },\n {\n \"start_line_number\": 304,\n \"end_line_number\": 304,\n \"line_range\": [\n 304,\n 304\n ],\n \"text\": \"@return Output value for helper construct 1.\",\n \"text_lines\": [\n \"@return Output value for helper construct 1.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 290,\n \"end_line_number\": 307,\n \"line_range\": [\n 290,\n 307\n ],\n \"declaration_order_index\": 31,\n \"symbol_name\": \"Extras\",\n \"qualified_name\": \"Extras\",\n \"symbol_kind\": \"MODULE\",\n \"type_label\": \"MODULE\",\n \"signature_text\": \"module Extras; end\",\n \"child_symbol_names\": [\n \"MAX_LIMIT\",\n \"API_VERSION\",\n \"CACHE_SIZE\",\n \"req_cover_ruby_1\"\n ],\n \"child_qualified_names\": [\n \"Extras.MAX_LIMIT\",\n \"Extras.API_VERSION\",\n \"Extras.CACHE_SIZE\",\n \"Extras.req_cover_ruby_1\"\n ],\n \"depth\": 0,\n \"body_comment_entries\": [\n {\n \"start_line_number\": 299,\n \"end_line_number\": 299,\n \"line_range\": [\n 299,\n 299\n ],\n \"text\": \"REQ-COVER-SRS-231 START\",\n \"text_lines\": [\n \"REQ-COVER-SRS-231 START\"\n ]\n },\n {\n \"start_line_number\": 300,\n \"end_line_number\": 300,\n \"line_range\": [\n 300,\n 300\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\": 301,\n \"end_line_number\": 301,\n \"line_range\": [\n 301,\n 301\n ],\n \"text\": \"@brief Coverage helper construct 1.\",\n \"text_lines\": [\n \"@brief Coverage helper construct 1.\"\n ]\n },\n {\n \"start_line_number\": 302,\n \"end_line_number\": 302,\n \"line_range\": [\n 302,\n 302\n ],\n \"text\": \"@details Provides deterministic fixture-level Doxygen coverage block 1.\",\n \"text_lines\": [\n \"@details Provides deterministic fixture-level Doxygen coverage block 1.\"\n ]\n },\n {\n \"start_line_number\": 303,\n \"end_line_number\": 303,\n \"line_range\": [\n 303,\n 303\n ],\n \"text\": \"@param value Input value for helper construct 1.\",\n \"text_lines\": [\n \"@param value Input value for helper construct 1.\"\n ]\n },\n {\n \"start_line_number\": 304,\n \"end_line_number\": 304,\n \"line_range\": [\n 304,\n 304\n ],\n \"text\": \"@return Output value for helper construct 1.\",\n \"text_lines\": [\n \"@return Output value for helper construct 1.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 291,\n \"end_line_number\": 291,\n \"line_range\": [\n 291,\n 291\n ],\n \"declaration_order_index\": 32,\n \"symbol_name\": \"MAX_LIMIT\",\n \"qualified_name\": \"Extras.MAX_LIMIT\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"MAX_LIMIT = 100\",\n \"parent_symbol_name\": \"Extras\",\n \"parent_qualified_name\": \"Extras\",\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\": 292,\n \"end_line_number\": 292,\n \"line_range\": [\n 292,\n 292\n ],\n \"declaration_order_index\": 33,\n \"symbol_name\": \"API_VERSION\",\n \"qualified_name\": \"Extras.API_VERSION\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"API_VERSION = \\\"v2\\\"\",\n \"parent_symbol_name\": \"Extras\",\n \"parent_qualified_name\": \"Extras\",\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\": 293,\n \"end_line_number\": 293,\n \"line_range\": [\n 293,\n 293\n ],\n \"declaration_order_index\": 34,\n \"symbol_name\": \"CACHE_SIZE\",\n \"qualified_name\": \"Extras.CACHE_SIZE\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"CACHE_SIZE = 1024\",\n \"parent_symbol_name\": \"Extras\",\n \"parent_qualified_name\": \"Extras\",\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\": 305,\n \"end_line_number\": 307,\n \"line_range\": [\n 305,\n 307\n ],\n \"declaration_order_index\": 35,\n \"symbol_name\": \"req_cover_ruby_1\",\n \"qualified_name\": \"Extras.req_cover_ruby_1\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def req_cover_ruby_1(value)\",\n \"parent_symbol_name\": \"Extras\",\n \"parent_qualified_name\": \"Extras\",\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\": 314,\n \"end_line_number\": 316,\n \"line_range\": [\n 314,\n 316\n ],\n \"declaration_order_index\": 36,\n \"symbol_name\": \"req_cover_ruby_2\",\n \"qualified_name\": \"req_cover_ruby_2\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def req_cover_ruby_2(value)\",\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\": 323,\n \"end_line_number\": 325,\n \"line_range\": [\n 323,\n 325\n ],\n \"declaration_order_index\": 37,\n \"symbol_name\": \"req_cover_ruby_3\",\n \"qualified_name\": \"req_cover_ruby_3\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def req_cover_ruby_3(value)\",\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\": 332,\n \"end_line_number\": 334,\n \"line_range\": [\n 332,\n 334\n ],\n \"declaration_order_index\": 38,\n \"symbol_name\": \"req_cover_ruby_4\",\n \"qualified_name\": \"req_cover_ruby_4\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def req_cover_ruby_4(value)\",\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\": 341,\n \"end_line_number\": 343,\n \"line_range\": [\n 341,\n 343\n ],\n \"declaration_order_index\": 39,\n \"symbol_name\": \"req_cover_ruby_5\",\n \"qualified_name\": \"req_cover_ruby_5\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"def req_cover_ruby_5(value)\",\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\": \"@brief Comprehensive Ruby test fixture for parser validation.\",\n \"text_lines\": [\n \"@brief Comprehensive Ruby test fixture for parser validation.\"\n ]\n },\n {\n \"start_line_number\": 3,\n \"end_line_number\": 3,\n \"line_range\": [\n 3,\n 3\n ],\n \"text\": \"@details Covers blocks, procs, lambdas, method_missing, open classes,\",\n \"text_lines\": [\n \"@details Covers blocks, procs, lambdas, method_missing, open classes,\"\n ]\n },\n {\n \"start_line_number\": 4,\n \"end_line_number\": 4,\n \"line_range\": [\n 4,\n 4\n ],\n \"text\": \"mixins, eigenclass, refinements, define_method, and rescue/ensure.\",\n \"text_lines\": [\n \"mixins, eigenclass, refinements, define_method, and rescue/ensure.\"\n ]\n },\n {\n \"start_line_number\": 5,\n \"end_line_number\": 5,\n \"line_range\": [\n 5,\n 5\n ],\n \"text\": \"Single line comment\",\n \"text_lines\": [\n \"Single line comment\"\n ]\n },\n {\n \"start_line_number\": 6,\n \"end_line_number\": 9,\n \"line_range\": [\n 6,\n 9\n ],\n \"text\": \"Multi-line comment\",\n \"text_lines\": [\n \"Multi-line\",\n \"comment\"\n ]\n },\n {\n \"start_line_number\": 22,\n \"end_line_number\": 22,\n \"line_range\": [\n 22,\n 22\n ],\n \"text\": \"── Concern module for shared behavior ─────────────────────────────────\",\n \"text_lines\": [\n \"── Concern module for shared behavior ─────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 41,\n \"end_line_number\": 41,\n \"line_range\": [\n 41,\n 41\n ],\n \"text\": \"── Main class with nested constructs ──────────────────────────────────\",\n \"text_lines\": [\n \"── Main class with nested constructs ──────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 43,\n \"end_line_number\": 43,\n \"line_range\": [\n 43,\n 43\n ],\n \"text\": \"@class MyClass\",\n \"text_lines\": [\n \"@class MyClass\"\n ]\n },\n {\n \"start_line_number\": 51,\n \"end_line_number\": 51,\n \"line_range\": [\n 51,\n 51\n ],\n \"text\": \"@brief Read/write accessor for the instance name.\",\n \"text_lines\": [\n \"@brief Read/write accessor for the instance name.\"\n ]\n },\n {\n \"start_line_number\": 54,\n \"end_line_number\": 54,\n \"line_range\": [\n 54,\n 54\n ],\n \"text\": \"@brief Read-only accessor for the creation timestamp.\",\n \"text_lines\": [\n \"@brief Read-only accessor for the creation timestamp.\"\n ]\n },\n {\n \"start_line_number\": 64,\n \"end_line_number\": 64,\n \"line_range\": [\n 64,\n 64\n ],\n \"text\": \"Set defaults for missing options\",\n \"text_lines\": [\n \"Set defaults for missing options\"\n ]\n },\n {\n \"start_line_number\": 96,\n \"end_line_number\": 96,\n \"line_range\": [\n 96,\n 96\n ],\n \"text\": \"@brief Spaceship operator for Comparable mixin.\",\n \"text_lines\": [\n \"@brief Spaceship operator for Comparable mixin.\"\n ]\n },\n {\n \"start_line_number\": 97,\n \"end_line_number\": 97,\n \"line_range\": [\n 97,\n 97\n ],\n \"text\": \"@param other [MyClass] Instance to compare with.\",\n \"text_lines\": [\n \"@param other [MyClass] Instance to compare with.\"\n ]\n },\n {\n \"start_line_number\": 98,\n \"end_line_number\": 98,\n \"line_range\": [\n 98,\n 98\n ],\n \"text\": \"@return [Integer] -1, 0, or 1 based on name comparison.\",\n \"text_lines\": [\n \"@return [Integer] -1, 0, or 1 based on name comparison.\"\n ]\n },\n {\n \"start_line_number\": 103,\n \"end_line_number\": 103,\n \"line_range\": [\n 103,\n 103\n ],\n \"text\": \"@brief Concatenate two instances into a new one.\",\n \"text_lines\": [\n \"@brief Concatenate two instances into a new one.\"\n ]\n },\n {\n \"start_line_number\": 104,\n \"end_line_number\": 104,\n \"line_range\": [\n 104,\n 104\n ],\n \"text\": \"@param other [MyClass] Instance to merge with.\",\n \"text_lines\": [\n \"@param other [MyClass] Instance to merge with.\"\n ]\n },\n {\n \"start_line_number\": 105,\n \"end_line_number\": 105,\n \"line_range\": [\n 105,\n 105\n ],\n \"text\": \"@return [MyClass] New instance with combined name.\",\n \"text_lines\": [\n \"@return [MyClass] New instance with combined name.\"\n ]\n },\n {\n \"start_line_number\": 116,\n \"end_line_number\": 116,\n \"line_range\": [\n 116,\n 116\n ],\n \"text\": \"@brief Handle undefined method calls dynamically.\",\n \"text_lines\": [\n \"@brief Handle undefined method calls dynamically.\"\n ]\n },\n {\n \"start_line_number\": 117,\n \"end_line_number\": 117,\n \"line_range\": [\n 117,\n 117\n ],\n \"text\": \"@param method [Symbol] The called method name.\",\n \"text_lines\": [\n \"@param method [Symbol] The called method name.\"\n ]\n },\n {\n \"start_line_number\": 130,\n \"end_line_number\": 130,\n \"line_range\": [\n 130,\n 130\n ],\n \"text\": \"@brief Declare which dynamic methods respond_to? should recognize.\",\n \"text_lines\": [\n \"@brief Declare which dynamic methods respond_to? should recognize.\"\n ]\n },\n {\n \"start_line_number\": 155,\n \"end_line_number\": 155,\n \"line_range\": [\n 155,\n 155\n ],\n \"text\": \"── Subclass demonstrating inheritance ─────────────────────────────────\",\n \"text_lines\": [\n \"── Subclass demonstrating inheritance ─────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 176,\n \"end_line_number\": 176,\n \"line_range\": [\n 176,\n 176\n ],\n \"text\": \"── Module with mixins ─────────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Module with mixins ─────────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 187,\n \"end_line_number\": 187,\n \"line_range\": [\n 187,\n 187\n ],\n \"text\": \"@brief Process data with block yield pattern.\",\n \"text_lines\": [\n \"@brief Process data with block yield pattern.\"\n ]\n },\n {\n \"start_line_number\": 199,\n \"end_line_number\": 199,\n \"line_range\": [\n 199,\n 199\n ],\n \"text\": \"── Module function ──────────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Module function ──────────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 209,\n \"end_line_number\": 209,\n \"line_range\": [\n 209,\n 209\n ],\n \"text\": \"── Struct-based class ─────────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Struct-based class ─────────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 211,\n \"end_line_number\": 211,\n \"line_range\": [\n 211,\n 211\n ],\n \"text\": \"@class Coordinate\",\n \"text_lines\": [\n \"@class Coordinate\"\n ]\n },\n {\n \"start_line_number\": 212,\n \"end_line_number\": 212,\n \"line_range\": [\n 212,\n 212\n ],\n \"text\": \"@brief Struct-based value object for 2D coordinates.\",\n \"text_lines\": [\n \"@brief Struct-based value object for 2D coordinates.\"\n ]\n },\n {\n \"start_line_number\": 221,\n \"end_line_number\": 221,\n \"line_range\": [\n 221,\n 221\n ],\n \"text\": \"── Dynamic method definition ─────────────────────────────────────────\",\n \"text_lines\": [\n \"── Dynamic method definition ─────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 226,\n \"end_line_number\": 226,\n \"line_range\": [\n 226,\n 226\n ],\n \"text\": \"Generate getter/setter pairs for each field\",\n \"text_lines\": [\n \"Generate getter/setter pairs for each field\"\n ]\n },\n {\n \"start_line_number\": 228,\n \"end_line_number\": 228,\n \"line_range\": [\n 228,\n 228\n ],\n \"text\": \"@brief Dynamically defined getter for #{field}.\",\n \"text_lines\": [\n \"@brief Dynamically defined getter for #{field}.\"\n ]\n },\n {\n \"start_line_number\": 233,\n \"end_line_number\": 233,\n \"line_range\": [\n 233,\n 233\n ],\n \"text\": \"@brief Dynamically defined setter for #{field}.\",\n \"text_lines\": [\n \"@brief Dynamically defined setter for #{field}.\"\n ]\n },\n {\n \"start_line_number\": 240,\n \"end_line_number\": 240,\n \"line_range\": [\n 240,\n 240\n ],\n \"text\": \"── Proc and Lambda ───────────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Proc and Lambda ───────────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 242,\n \"end_line_number\": 242,\n \"line_range\": [\n 242,\n 242\n ],\n \"text\": \"@brief Lambda for doubling a numeric value.\",\n \"text_lines\": [\n \"@brief Lambda for doubling a numeric value.\"\n ]\n },\n {\n \"start_line_number\": 245,\n \"end_line_number\": 245,\n \"line_range\": [\n 245,\n 245\n ],\n \"text\": \"@brief Proc for formatting a greeting string.\",\n \"text_lines\": [\n \"@brief Proc for formatting a greeting string.\"\n ]\n },\n {\n \"start_line_number\": 248,\n \"end_line_number\": 248,\n \"line_range\": [\n 248,\n 248\n ],\n \"text\": \"── Error handling ────────────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Error handling ────────────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 250,\n \"end_line_number\": 250,\n \"line_range\": [\n 250,\n 250\n ],\n \"text\": \"@brief Execute a block with retry logic and error recovery.\",\n \"text_lines\": [\n \"@brief Execute a block with retry logic and error recovery.\"\n ]\n },\n {\n \"start_line_number\": 251,\n \"end_line_number\": 251,\n \"line_range\": [\n 251,\n 251\n ],\n \"text\": \"@param attempts [Integer] Maximum number of attempts.\",\n \"text_lines\": [\n \"@param attempts [Integer] Maximum number of attempts.\"\n ]\n },\n {\n \"start_line_number\": 261,\n \"end_line_number\": 261,\n \"line_range\": [\n 261,\n 261\n ],\n \"text\": \"Retry if attempts remain\",\n \"text_lines\": [\n \"Retry if attempts remain\"\n ]\n },\n {\n \"start_line_number\": 265,\n \"end_line_number\": 265,\n \"line_range\": [\n 265,\n 265\n ],\n \"text\": \"Cleanup runs regardless of outcome\",\n \"text_lines\": [\n \"Cleanup runs regardless of outcome\"\n ]\n },\n {\n \"start_line_number\": 270,\n \"end_line_number\": 270,\n \"line_range\": [\n 270,\n 270\n ],\n \"text\": \"── Refinement ────────────────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Refinement ────────────────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 299,\n \"end_line_number\": 299,\n \"line_range\": [\n 299,\n 299\n ],\n \"text\": \"REQ-COVER-SRS-231 START\",\n \"text_lines\": [\n \"REQ-COVER-SRS-231 START\"\n ]\n },\n {\n \"start_line_number\": 300,\n \"end_line_number\": 300,\n \"line_range\": [\n 300,\n 300\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\": 301,\n \"end_line_number\": 301,\n \"line_range\": [\n 301,\n 301\n ],\n \"text\": \"@brief Coverage helper construct 1.\",\n \"text_lines\": [\n \"@brief Coverage helper construct 1.\"\n ]\n },\n {\n \"start_line_number\": 309,\n \"end_line_number\": 309,\n \"line_range\": [\n 309,\n 309\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\": 310,\n \"end_line_number\": 310,\n \"line_range\": [\n 310,\n 310\n ],\n \"text\": \"@brief Coverage helper construct 2.\",\n \"text_lines\": [\n \"@brief Coverage helper construct 2.\"\n ]\n },\n {\n \"start_line_number\": 318,\n \"end_line_number\": 318,\n \"line_range\": [\n 318,\n 318\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\": 319,\n \"end_line_number\": 319,\n \"line_range\": [\n 319,\n 319\n ],\n \"text\": \"@brief Coverage helper construct 3.\",\n \"text_lines\": [\n \"@brief Coverage helper construct 3.\"\n ]\n },\n {\n \"start_line_number\": 327,\n \"end_line_number\": 327,\n \"line_range\": [\n 327,\n 327\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\": 328,\n \"end_line_number\": 328,\n \"line_range\": [\n 328,\n 328\n ],\n \"text\": \"@brief Coverage helper construct 4.\",\n \"text_lines\": [\n \"@brief Coverage helper construct 4.\"\n ]\n },\n {\n \"start_line_number\": 336,\n \"end_line_number\": 336,\n \"line_range\": [\n 336,\n 336\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\": 337,\n \"end_line_number\": 337,\n \"line_range\": [\n 337,\n 337\n ],\n \"text\": \"@brief Coverage helper construct 5.\",\n \"text_lines\": [\n \"@brief Coverage helper construct 5.\"\n ]\n },\n {\n \"start_line_number\": 345,\n \"end_line_number\": 345,\n \"line_range\": [\n 345,\n 345\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_ruby.rb | Ruby | 345L | 40 symbols | 5 imports | 135 comments\n> Path: `tests/fixtures/fixture_ruby.rb`\n\n## Imports\n```\nrequire 'json'\nrequire 'set'\nrequire_relative 'helper'\nrequire 'yaml'\nrequire 'logger'\n```\n\n## Definitions\n\n- const `MAX_RETRIES = 42` (L15)\n- @brief Maximum retry attempts for transient failures.\n- const `DEFAULT_ENCODING = 'utf-8'.freeze` (L18)\n- @brief Frozen string constant for default encoding.\n### mod `module Loggable` (L26-39)\n- @brief Mixin providing logging capabilities to including classes.\n- @brief Log a message to stdout with the class name prefix.\n- @param message [String] The message to log.\n- fn `def log(message)` (L29-31)\n - @brief Log a message to stdout with the class name prefix.\n - @param message [String] The message to log.\n- fn `def log_error(error)` (L35-38)\n - @brief Log an error with backtrace information.\n - @param error [Exception] The exception to log.\n\n### class `class MyClass` (L47-153)\n- fn `def initialize(name, **options)` (L60-66)\n - @brief Initialize a new MyClass instance.\n - @param name [String] The instance identifier.\n - @param options [Hash] Optional configuration hash.\n- fn `def self.create(attrs)` (L71-73)\n - @brief Factory method creating an instance from a hash.\n - @param attrs [Hash] Attribute hash with :name key required.\n - @return [MyClass] A new instance populated from attrs.\n- fn `def self.bulk_create(names)` (L78-80)\n - @brief Build multiple instances from an array of names.\n - @param names [Array<String>] Names to create instances for.\n - @return [Array<MyClass>] Array of new instances.\n- fn `def valid?` (L84-86)\n - @brief Predicate checking if the instance is valid.\n - @return [Boolean] True if name is non-empty.\n- fn `def matches?(pattern)` (L91-94)\n - @brief Check if name matches a pattern.\n - @param pattern [Regexp] Regular expression to test against.\n - @return [Boolean] True if name matches the pattern.\n- fn `def to_s` (L112-114)\n - @brief Convert to string representation.\n - @return [String] Human-readable description.\n- fn `def method_missing(method, *args, &block)` (L121-128)\n- fn `def respond_to_missing?(method, include_private = false)` (L134-136)\n - @brief Declare which dynamic methods respond_to? should recognize.\n - @param method [Symbol] The method name to check.\n - @param include_private [Boolean] Whether to include private methods.\n - @return [Boolean] True if the method is handled dynamically.\n- fn `def internal_config` (L142-144)\n - @brief Protected helper for internal computations.\n - @return [Hash] Current options hash.\n- fn `def validate!` (L150-152)\n\n### class `class SpecialClass < MyClass` : MyClass (L160-174)\n- @brief Specialized subclass with additional behavior.\n- @brief Initialize with a priority level.\n- @param name [String] Instance name.\n- @param priority [Integer] Processing priority (lower = first).\n- fn `def initialize(name, priority: 0, **options)` (L164-167)\n - @brief Initialize with a priority level.\n - @param name [String] Instance name.\n - @param priority [Integer] Processing priority (lower = first).\n- fn `def to_s` (L171-173)\n - @brief Override to_s with priority information.\n - @return [String] Description including priority.\n\n### mod `module MyModule` (L180-207)\n- @brief Utility module providing helper methods.\n- @brief Module-level helper returning a boolean.\n- @return [Boolean] Always returns true.\n- fn `def helper` (L183-185)\n - @brief Module-level helper returning a boolean.\n - @return [Boolean] Always returns true.\n- fn `def process_with_block(data)` (L191-197)\n - @brief Process data with block yield pattern.\n - @param data [Object] Data to process.\n@yield [Object] Yields data for caller-defined processing.\n - @return [Object] The block's return value or data itself.\n- fn `def self.format_list(items)` (L204-206)\n - @brief Utility function accessible without mixing in.\n - @param items [Array] Items to format.\n - @return [String] Comma-separated formatted string.\n\n### fn `def distance_from_origin` (L216-218)\n- @brief Compute the Euclidean distance from origin.\n- @return [Float] Distance from (0, 0).\n\n### class `class DynamicModel` (L225-238)\n- @brief Demonstrates metaprogramming with define_method.\n- @brief Dynamically defined getter for #{field}.\n\n### fn `def with_retry(attempts: MAX_RETRIES)` (L255-268)\n\n### mod `module StringExtensions` (L274-282)\n- @brief Refinement adding utility methods to String.\n- @brief Check if the string is a valid email address.\n- @return [Boolean] True if string matches email pattern.\n- fn `def email?` (L278-280)\n - @brief Check if the string is a valid email address.\n - @return [Boolean] True if string matches email pattern.\n\n### class `class ServiceObject; end # inline class comment` (L287-307)\n\n### class `class ReportBuilder; end` (L288-307)\n\n### mod `module Metrics; end` (L289-307)\n\n### mod `module Extras; end` (L290-307)\n- const `MAX_LIMIT = 100` (L291)\n- const `API_VERSION = \"v2\"` (L292)\n- const `CACHE_SIZE = 1024` (L293)\n- fn `def req_cover_ruby_1(value)` (L305-307)\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\n### fn `def req_cover_ruby_2(value)` (L314-316)\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\n### fn `def req_cover_ruby_3(value)` (L323-325)\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\n### fn `def req_cover_ruby_4(value)` (L332-334)\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\n### fn `def req_cover_ruby_5(value)` (L341-343)\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|`MAX_RETRIES`|const||15||\n|`DEFAULT_ENCODING`|const||18||\n|`Loggable`|mod||26-39||\n|`Loggable.log`|fn||29-31|def log(message)|\n|`Loggable.log_error`|fn||35-38|def log_error(error)|\n|`MyClass`|class||47-153|class MyClass|\n|`MyClass.initialize`|fn||60-66|def initialize(name, **options)|\n|`MyClass.create`|fn||71-73|def self.create(attrs)|\n|`MyClass.bulk_create`|fn||78-80|def self.bulk_create(names)|\n|`MyClass.valid?`|fn||84-86|def valid?|\n|`MyClass.matches?`|fn||91-94|def matches?(pattern)|\n|`MyClass.to_s`|fn||112-114|def to_s|\n|`MyClass.method_missing`|fn||121-128|def method_missing(method, *args, &block)|\n|`MyClass.respond_to_missing?`|fn||134-136|def respond_to_missing?(method, include_private = false)|\n|`MyClass.internal_config`|fn||142-144|def internal_config|\n|`MyClass.validate!`|fn||150-152|def validate!|\n|`SpecialClass`|class||160-174|class SpecialClass < MyClass|\n|`SpecialClass.initialize`|fn||164-167|def initialize(name, priority: 0, **options)|\n|`SpecialClass.to_s`|fn||171-173|def to_s|\n|`MyModule`|mod||180-207||\n|`MyModule.helper`|fn||183-185|def helper|\n|`MyModule.process_with_block`|fn||191-197|def process_with_block(data)|\n|`MyModule.format_list`|fn||204-206|def self.format_list(items)|\n|`distance_from_origin`|fn||216-218|def distance_from_origin|\n|`DynamicModel`|class||225-238|class DynamicModel|\n|`with_retry`|fn||255-268|def with_retry(attempts: MAX_RETRIES)|\n|`StringExtensions`|mod||274-282||\n|`StringExtensions.email?`|fn||278-280|def email?|\n|`ServiceObject`|class||287-307|class ServiceObject; end # inline class comment|\n|`ReportBuilder`|class||288-307|class ReportBuilder; end|\n|`Metrics`|mod||289-307||\n|`Extras`|mod||290-307||\n|`Extras.MAX_LIMIT`|const||291||\n|`Extras.API_VERSION`|const||292||\n|`Extras.CACHE_SIZE`|const||293||\n|`Extras.req_cover_ruby_1`|fn||305-307|def req_cover_ruby_1(value)|\n|`req_cover_ruby_2`|fn||314-316|def req_cover_ruby_2(value)|\n|`req_cover_ruby_3`|fn||323-325|def req_cover_ruby_3(value)|\n|`req_cover_ruby_4`|fn||332-334|def req_cover_ruby_4(value)|\n|`req_cover_ruby_5`|fn||341-343|def req_cover_ruby_5(value)|\n\n",
4
4
  "stderr": ""
5
5
  }