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_swift.swift\"\n ],\n \"requested_canonical_paths\": [\n \"tests/fixtures/fixture_swift.swift\"\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\": 66,\n \"total_import_count\": 7,\n \"total_comment_count\": 156,\n \"total_standalone_comment_count\": 59,\n \"total_doxygen_field_count\": 92,\n \"symbol_kind_counts\": {\n \"CLASS\": 5,\n \"CONSTANT\": 7,\n \"ENUM\": 5,\n \"EXTENSION\": 5,\n \"FUNCTION\": 18,\n \"PROTOCOL\": 5,\n \"STRUCT\": 5,\n \"VARIABLE\": 16\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_swift.swift\"\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_swift.swift\",\n \"relative_path\": \"tests/fixtures/fixture_swift.swift\",\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\": 397,\n \"line_range\": [\n 1,\n 397\n ],\n \"request_index\": 0,\n \"input_path\": \"tests/fixtures/fixture_swift.swift\",\n \"canonical_path\": \"tests/fixtures/fixture_swift.swift\",\n \"absolute_path\": \"<ROOT>/tests/fixtures/fixture_swift.swift\",\n \"file_name\": \"fixture_swift.swift\",\n \"file_extension\": \".swift\",\n \"language_id\": \"swift\",\n \"language_name\": \"Swift\",\n \"status\": \"analyzed\",\n \"exists\": true,\n \"is_file\": true,\n \"import_count\": 7,\n \"symbol_count\": 66,\n \"comment_count\": 156,\n \"standalone_comment_count\": 59,\n \"doxygen_field_count\": 92,\n \"file_description_text\": \"@file fixture_swift.swift\",\n \"imports\": [\n {\n \"start_line_number\": 8,\n \"end_line_number\": 8,\n \"line_range\": [\n 8,\n 8\n ],\n \"import_name\": \"Foundation\",\n \"statement_text\": \"import Foundation\"\n },\n {\n \"start_line_number\": 9,\n \"end_line_number\": 9,\n \"line_range\": [\n 9,\n 9\n ],\n \"import_name\": \"Combine\",\n \"statement_text\": \"import Combine\"\n },\n {\n \"start_line_number\": 342,\n \"end_line_number\": 342,\n \"line_range\": [\n 342,\n 342\n ],\n \"import_name\": \"SwiftUI\",\n \"statement_text\": \"import SwiftUI\"\n },\n {\n \"start_line_number\": 343,\n \"end_line_number\": 343,\n \"line_range\": [\n 343,\n 343\n ],\n \"import_name\": \"Combine\",\n \"statement_text\": \"import Combine\"\n },\n {\n \"start_line_number\": 344,\n \"end_line_number\": 344,\n \"line_range\": [\n 344,\n 344\n ],\n \"import_name\": \"Foundation\",\n \"statement_text\": \"import Foundation\"\n },\n {\n \"start_line_number\": 345,\n \"end_line_number\": 345,\n \"line_range\": [\n 345,\n 345\n ],\n \"import_name\": \"Dispatch\",\n \"statement_text\": \"import Dispatch\"\n },\n {\n \"start_line_number\": 346,\n \"end_line_number\": 346,\n \"line_range\": [\n 346,\n 346\n ],\n \"import_name\": \"UIKit\",\n \"statement_text\": \"import UIKit\"\n }\n ],\n \"symbols\": [\n {\n \"start_line_number\": 16,\n \"end_line_number\": 58,\n \"line_range\": [\n 16,\n 58\n ],\n \"declaration_order_index\": 0,\n \"symbol_name\": \"Animal\",\n \"qualified_name\": \"Animal\",\n \"symbol_kind\": \"CLASS\",\n \"type_label\": \"CLASS\",\n \"signature_text\": \"class Animal\",\n \"child_symbol_names\": [\n \"species\",\n \"legs\",\n \"description\",\n \"speak\",\n \"draw\",\n \"describe\"\n ],\n \"child_qualified_names\": [\n \"Animal.species\",\n \"Animal.legs\",\n \"Animal.description\",\n \"Animal.speak\",\n \"Animal.draw\",\n \"Animal.describe\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Base class with stored, computed, and observed properties.\",\n \"doxygen\": {\n \"brief\": [\n \"Base class with stored, computed, and observed properties.\",\n \"Species name identifier.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 17,\n \"end_line_number\": 17,\n \"line_range\": [\n 17,\n 17\n ],\n \"text\": \"@brief Species name identifier.\",\n \"text_lines\": [\n \"@brief Species name identifier.\"\n ]\n },\n {\n \"start_line_number\": 20,\n \"end_line_number\": 20,\n \"line_range\": [\n 20,\n 20\n ],\n \"text\": \"@brief Number of legs; triggers a didSet observer on change.\",\n \"text_lines\": [\n \"@brief Number of legs; triggers a didSet observer on change.\"\n ]\n },\n {\n \"start_line_number\": 23,\n \"end_line_number\": 23,\n \"line_range\": [\n 23,\n 23\n ],\n \"text\": \"Log upcoming change from current to new value\",\n \"text_lines\": [\n \"Log upcoming change from current to new value\"\n ]\n },\n {\n \"start_line_number\": 27,\n \"end_line_number\": 27,\n \"line_range\": [\n 27,\n 27\n ],\n \"text\": \"Enforce minimum of zero legs\",\n \"text_lines\": [\n \"Enforce minimum of zero legs\"\n ]\n },\n {\n \"start_line_number\": 32,\n \"end_line_number\": 32,\n \"line_range\": [\n 32,\n 32\n ],\n \"text\": \"@brief Computed property returning a descriptive string.\",\n \"text_lines\": [\n \"@brief Computed property returning a descriptive string.\"\n ]\n },\n {\n \"start_line_number\": 37,\n \"end_line_number\": 37,\n \"line_range\": [\n 37,\n 37\n ],\n \"text\": \"@brief Initialize an Animal with species name.\",\n \"text_lines\": [\n \"@brief Initialize an Animal with species name.\"\n ]\n },\n {\n \"start_line_number\": 38,\n \"end_line_number\": 38,\n \"line_range\": [\n 38,\n 38\n ],\n \"text\": \"@param species The species identifier string.\",\n \"text_lines\": [\n \"@param species The species identifier string.\"\n ]\n },\n {\n \"start_line_number\": 43,\n \"end_line_number\": 43,\n \"line_range\": [\n 43,\n 43\n ],\n \"text\": \"@brief Produce a sound; subclasses should override.\",\n \"text_lines\": [\n \"@brief Produce a sound; subclasses should override.\"\n ]\n },\n {\n \"start_line_number\": 48,\n \"end_line_number\": 48,\n \"line_range\": [\n 48,\n 48\n ],\n \"text\": \"@brief Class method creating a generic instance.\",\n \"text_lines\": [\n \"@brief Class method creating a generic instance.\"\n ]\n },\n {\n \"start_line_number\": 49,\n \"end_line_number\": 49,\n \"line_range\": [\n 49,\n 49\n ],\n \"text\": \"@return An Animal with species \\\"Unknown\\\".\",\n \"text_lines\": [\n \"@return An Animal with species \\\"Unknown\\\".\"\n ]\n },\n {\n \"start_line_number\": 54,\n \"end_line_number\": 54,\n \"line_range\": [\n 54,\n 54\n ],\n \"text\": \"@brief Deinitializer for cleanup on deallocation.\",\n \"text_lines\": [\n \"@brief Deinitializer for cleanup on deallocation.\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 34,\n \"text\": \"return \\\"\\\\(species) with \\\\(legs) legs\\\"\"\n },\n {\n \"line_number\": 51,\n \"text\": \"return Animal(species: \\\"Unknown\\\")\"\n }\n ]\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\": \"species\",\n \"qualified_name\": \"Animal.species\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"var species: String\",\n \"parent_symbol_name\": \"Animal\",\n \"parent_qualified_name\": \"Animal\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Species name identifier.\",\n \"doxygen\": {\n \"brief\": [\n \"Species name identifier.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 21,\n \"end_line_number\": 21,\n \"line_range\": [\n 21,\n 21\n ],\n \"declaration_order_index\": 2,\n \"symbol_name\": \"legs\",\n \"qualified_name\": \"Animal.legs\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"var legs: Int = 4\",\n \"parent_symbol_name\": \"Animal\",\n \"parent_qualified_name\": \"Animal\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Number of legs; triggers a didSet observer on change.\",\n \"doxygen\": {\n \"brief\": [\n \"Number of legs; triggers a didSet observer on change.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 33,\n \"end_line_number\": 33,\n \"line_range\": [\n 33,\n 33\n ],\n \"declaration_order_index\": 3,\n \"symbol_name\": \"description\",\n \"qualified_name\": \"Animal.description\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"var description: String\",\n \"parent_symbol_name\": \"Animal\",\n \"parent_qualified_name\": \"Animal\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Computed property returning a descriptive string.\",\n \"doxygen\": {\n \"brief\": [\n \"Computed property returning a descriptive string.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 44,\n \"end_line_number\": 46,\n \"line_range\": [\n 44,\n 46\n ],\n \"declaration_order_index\": 4,\n \"symbol_name\": \"speak\",\n \"qualified_name\": \"Animal.speak\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"func speak()\",\n \"parent_symbol_name\": \"Animal\",\n \"parent_qualified_name\": \"Animal\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Produce a sound; subclasses should override.\",\n \"doxygen\": {\n \"brief\": [\n \"Produce a sound; subclasses should override.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 50,\n \"end_line_number\": 52,\n \"line_range\": [\n 50,\n 52\n ],\n \"declaration_order_index\": 5,\n \"symbol_name\": \"func\",\n \"qualified_name\": \"func\",\n \"symbol_kind\": \"CLASS\",\n \"type_label\": \"CLASS\",\n \"signature_text\": \"class func createDefault() -> Animal\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Class method creating a generic instance.\",\n \"doxygen\": {\n \"brief\": [\n \"Class method creating a generic instance.\"\n ],\n \"returns\": [\n \"An Animal with species \\\"Unknown\\\".\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 51,\n \"text\": \"return Animal(species: \\\"Unknown\\\")\"\n }\n ]\n },\n {\n \"start_line_number\": 63,\n \"end_line_number\": 78,\n \"line_range\": [\n 63,\n 78\n ],\n \"declaration_order_index\": 6,\n \"symbol_name\": \"Dog\",\n \"qualified_name\": \"Dog\",\n \"symbol_kind\": \"CLASS\",\n \"type_label\": \"CLASS\",\n \"signature_text\": \"class Dog: Animal\",\n \"child_symbol_names\": [\n \"name\",\n \"speak\"\n ],\n \"child_qualified_names\": [\n \"Dog.name\",\n \"Dog.speak\"\n ],\n \"depth\": 0,\n \"inherits_text\": \"Animal\",\n \"attached_comment_summary_text\": \"Concrete animal with dog-specific behavior.\",\n \"doxygen\": {\n \"brief\": [\n \"Concrete animal with dog-specific behavior.\",\n \"Dog's name.\"\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\": \"@brief Dog's name.\",\n \"text_lines\": [\n \"@brief Dog's name.\"\n ]\n },\n {\n \"start_line_number\": 67,\n \"end_line_number\": 67,\n \"line_range\": [\n 67,\n 67\n ],\n \"text\": \"@brief Initialize a named dog.\",\n \"text_lines\": [\n \"@brief Initialize a named dog.\"\n ]\n },\n {\n \"start_line_number\": 68,\n \"end_line_number\": 68,\n \"line_range\": [\n 68,\n 68\n ],\n \"text\": \"@param name The dog's name.\",\n \"text_lines\": [\n \"@param name The dog's name.\"\n ]\n },\n {\n \"start_line_number\": 74,\n \"end_line_number\": 74,\n \"line_range\": [\n 74,\n 74\n ],\n \"text\": \"@brief Override speak to produce dog-specific sound.\",\n \"text_lines\": [\n \"@brief Override speak to produce dog-specific sound.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 65,\n \"end_line_number\": 65,\n \"line_range\": [\n 65,\n 65\n ],\n \"declaration_order_index\": 7,\n \"symbol_name\": \"name\",\n \"qualified_name\": \"Dog.name\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"let name: String\",\n \"parent_symbol_name\": \"Dog\",\n \"parent_qualified_name\": \"Dog\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Dog's name.\",\n \"doxygen\": {\n \"brief\": [\n \"Dog's name.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 75,\n \"end_line_number\": 77,\n \"line_range\": [\n 75,\n 77\n ],\n \"declaration_order_index\": 8,\n \"symbol_name\": \"speak\",\n \"qualified_name\": \"Dog.speak\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"override func speak()\",\n \"parent_symbol_name\": \"Dog\",\n \"parent_qualified_name\": \"Dog\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Override speak to produce dog-specific sound.\",\n \"doxygen\": {\n \"brief\": [\n \"Override speak to produce dog-specific sound.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 85,\n \"end_line_number\": 102,\n \"line_range\": [\n 85,\n 102\n ],\n \"declaration_order_index\": 9,\n \"symbol_name\": \"Point\",\n \"qualified_name\": \"Point\",\n \"symbol_kind\": \"STRUCT\",\n \"type_label\": \"STRUCT\",\n \"signature_text\": \"struct Point: Equatable\",\n \"child_symbol_names\": [\n \"x\",\n \"y\",\n \"magnitude\"\n ],\n \"child_qualified_names\": [\n \"Point.x\",\n \"Point.y\",\n \"Point.magnitude\"\n ],\n \"depth\": 0,\n \"inherits_text\": \"Equatable\",\n \"attached_comment_summary_text\": \"Value type representing a coordinate pair.\",\n \"doxygen\": {\n \"brief\": [\n \"Value type representing a coordinate pair.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 89,\n \"end_line_number\": 89,\n \"line_range\": [\n 89,\n 89\n ],\n \"text\": \"@brief Add two points component-wise.\",\n \"text_lines\": [\n \"@brief Add two points component-wise.\"\n ]\n },\n {\n \"start_line_number\": 90,\n \"end_line_number\": 90,\n \"line_range\": [\n 90,\n 90\n ],\n \"text\": \"@param lhs Left-hand operand.\",\n \"text_lines\": [\n \"@param lhs Left-hand operand.\"\n ]\n },\n {\n \"start_line_number\": 91,\n \"end_line_number\": 91,\n \"line_range\": [\n 91,\n 91\n ],\n \"text\": \"@param rhs Right-hand operand.\",\n \"text_lines\": [\n \"@param rhs Right-hand operand.\"\n ]\n },\n {\n \"start_line_number\": 92,\n \"end_line_number\": 92,\n \"line_range\": [\n 92,\n 92\n ],\n \"text\": \"@return New Point with summed coordinates.\",\n \"text_lines\": [\n \"@return New Point with summed coordinates.\"\n ]\n },\n {\n \"start_line_number\": 97,\n \"end_line_number\": 97,\n \"line_range\": [\n 97,\n 97\n ],\n \"text\": \"@brief Compute Euclidean distance from origin.\",\n \"text_lines\": [\n \"@brief Compute Euclidean distance from origin.\"\n ]\n },\n {\n \"start_line_number\": 98,\n \"end_line_number\": 98,\n \"line_range\": [\n 98,\n 98\n ],\n \"text\": \"@return Distance as a Double.\",\n \"text_lines\": [\n \"@return Distance as a Double.\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 94,\n \"text\": \"return Point(x: lhs.x + rhs.x, y: lhs.y + rhs.y)\"\n },\n {\n \"line_number\": 100,\n \"text\": \"return (x * x + y * y).squareRoot()\"\n }\n ]\n },\n {\n \"start_line_number\": 86,\n \"end_line_number\": 86,\n \"line_range\": [\n 86,\n 86\n ],\n \"declaration_order_index\": 10,\n \"symbol_name\": \"x\",\n \"qualified_name\": \"Point.x\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"var x: Double = 0.0\",\n \"parent_symbol_name\": \"Point\",\n \"parent_qualified_name\": \"Point\",\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\": 87,\n \"end_line_number\": 87,\n \"line_range\": [\n 87,\n 87\n ],\n \"declaration_order_index\": 11,\n \"symbol_name\": \"y\",\n \"qualified_name\": \"Point.y\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"var y: Double = 0.0\",\n \"parent_symbol_name\": \"Point\",\n \"parent_qualified_name\": \"Point\",\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\": 99,\n \"end_line_number\": 99,\n \"line_range\": [\n 99,\n 99\n ],\n \"declaration_order_index\": 12,\n \"symbol_name\": \"magnitude\",\n \"qualified_name\": \"Point.magnitude\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"var magnitude: Double\",\n \"parent_symbol_name\": \"Point\",\n \"parent_qualified_name\": \"Point\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Compute Euclidean distance from origin.\",\n \"doxygen\": {\n \"brief\": [\n \"Compute Euclidean distance from origin.\"\n ],\n \"returns\": [\n \"Distance as a Double.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 107,\n \"end_line_number\": 133,\n \"line_range\": [\n 107,\n 133\n ],\n \"declaration_order_index\": 13,\n \"symbol_name\": \"Matrix\",\n \"qualified_name\": \"Matrix\",\n \"symbol_kind\": \"STRUCT\",\n \"type_label\": \"STRUCT\",\n \"signature_text\": \"struct Matrix\",\n \"child_symbol_names\": [\n \"data\",\n \"rows\",\n \"cols\"\n ],\n \"child_qualified_names\": [\n \"Matrix.data\",\n \"Matrix.rows\",\n \"Matrix.cols\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"2D matrix supporting element access via subscript.\",\n \"doxygen\": {\n \"brief\": [\n \"2D matrix supporting element access via subscript.\",\n \"Flat storage for matrix values.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 108,\n \"end_line_number\": 108,\n \"line_range\": [\n 108,\n 108\n ],\n \"text\": \"@brief Flat storage for matrix values.\",\n \"text_lines\": [\n \"@brief Flat storage for matrix values.\"\n ]\n },\n {\n \"start_line_number\": 111,\n \"end_line_number\": 111,\n \"line_range\": [\n 111,\n 111\n ],\n \"text\": \"@brief Number of rows.\",\n \"text_lines\": [\n \"@brief Number of rows.\"\n ]\n },\n {\n \"start_line_number\": 113,\n \"end_line_number\": 113,\n \"line_range\": [\n 113,\n 113\n ],\n \"text\": \"@brief Number of columns.\",\n \"text_lines\": [\n \"@brief Number of columns.\"\n ]\n },\n {\n \"start_line_number\": 116,\n \"end_line_number\": 116,\n \"line_range\": [\n 116,\n 116\n ],\n \"text\": \"@brief Initialize a zero-filled matrix.\",\n \"text_lines\": [\n \"@brief Initialize a zero-filled matrix.\"\n ]\n },\n {\n \"start_line_number\": 117,\n \"end_line_number\": 117,\n \"line_range\": [\n 117,\n 117\n ],\n \"text\": \"@param rows Number of rows.\",\n \"text_lines\": [\n \"@param rows Number of rows.\"\n ]\n },\n {\n \"start_line_number\": 118,\n \"end_line_number\": 118,\n \"line_range\": [\n 118,\n 118\n ],\n \"text\": \"@param cols Number of columns.\",\n \"text_lines\": [\n \"@param cols Number of columns.\"\n ]\n },\n {\n \"start_line_number\": 125,\n \"end_line_number\": 125,\n \"line_range\": [\n 125,\n 125\n ],\n \"text\": \"@brief Access matrix elements using row/column subscript.\",\n \"text_lines\": [\n \"@brief Access matrix elements using row/column subscript.\"\n ]\n },\n {\n \"start_line_number\": 126,\n \"end_line_number\": 126,\n \"line_range\": [\n 126,\n 126\n ],\n \"text\": \"@param row Row index (zero-based).\",\n \"text_lines\": [\n \"@param row Row index (zero-based).\"\n ]\n },\n {\n \"start_line_number\": 127,\n \"end_line_number\": 127,\n \"line_range\": [\n 127,\n 127\n ],\n \"text\": \"@param col Column index (zero-based).\",\n \"text_lines\": [\n \"@param col Column index (zero-based).\"\n ]\n },\n {\n \"start_line_number\": 128,\n \"end_line_number\": 128,\n \"line_range\": [\n 128,\n 128\n ],\n \"text\": \"@return The value at (row, col).\",\n \"text_lines\": [\n \"@return The value at (row, col).\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 109,\n \"end_line_number\": 109,\n \"line_range\": [\n 109,\n 109\n ],\n \"declaration_order_index\": 14,\n \"symbol_name\": \"data\",\n \"qualified_name\": \"Matrix.data\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"private var data: [[Double]]\",\n \"visibility\": \"priv\",\n \"parent_symbol_name\": \"Matrix\",\n \"parent_qualified_name\": \"Matrix\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Flat storage for matrix values.\",\n \"doxygen\": {\n \"brief\": [\n \"Flat storage for matrix values.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 112,\n \"end_line_number\": 112,\n \"line_range\": [\n 112,\n 112\n ],\n \"declaration_order_index\": 15,\n \"symbol_name\": \"rows\",\n \"qualified_name\": \"Matrix.rows\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"let rows: Int\",\n \"parent_symbol_name\": \"Matrix\",\n \"parent_qualified_name\": \"Matrix\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Number of rows.\",\n \"doxygen\": {\n \"brief\": [\n \"Number of rows.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 114,\n \"end_line_number\": 114,\n \"line_range\": [\n 114,\n 114\n ],\n \"declaration_order_index\": 16,\n \"symbol_name\": \"cols\",\n \"qualified_name\": \"Matrix.cols\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"let cols: Int\",\n \"parent_symbol_name\": \"Matrix\",\n \"parent_qualified_name\": \"Matrix\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Number of columns.\",\n \"doxygen\": {\n \"brief\": [\n \"Number of columns.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 140,\n \"end_line_number\": 156,\n \"line_range\": [\n 140,\n 156\n ],\n \"declaration_order_index\": 17,\n \"symbol_name\": \"Direction\",\n \"qualified_name\": \"Direction\",\n \"symbol_kind\": \"ENUM\",\n \"type_label\": \"ENUM\",\n \"signature_text\": \"enum Direction: String, CaseIterable\",\n \"child_symbol_names\": [\n \"opposite\"\n ],\n \"child_qualified_names\": [\n \"Direction.opposite\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Cardinal directions supporting CaseIterable iteration.\",\n \"doxygen\": {\n \"brief\": [\n \"Cardinal directions supporting CaseIterable iteration.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 146,\n \"end_line_number\": 146,\n \"line_range\": [\n 146,\n 146\n ],\n \"text\": \"@brief Compute the opposite direction.\",\n \"text_lines\": [\n \"@brief Compute the opposite direction.\"\n ]\n },\n {\n \"start_line_number\": 147,\n \"end_line_number\": 147,\n \"line_range\": [\n 147,\n 147\n ],\n \"text\": \"@return The direction 180 degrees from self.\",\n \"text_lines\": [\n \"@return The direction 180 degrees from self.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 148,\n \"end_line_number\": 148,\n \"line_range\": [\n 148,\n 148\n ],\n \"declaration_order_index\": 18,\n \"symbol_name\": \"opposite\",\n \"qualified_name\": \"Direction.opposite\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"var opposite: Direction\",\n \"parent_symbol_name\": \"Direction\",\n \"parent_qualified_name\": \"Direction\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Compute the opposite direction.\",\n \"doxygen\": {\n \"brief\": [\n \"Compute the opposite direction.\"\n ],\n \"returns\": [\n \"The direction 180 degrees from self.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 162,\n \"end_line_number\": 179,\n \"line_range\": [\n 162,\n 179\n ],\n \"declaration_order_index\": 19,\n \"symbol_name\": \"AppResult\",\n \"qualified_name\": \"AppResult\",\n \"symbol_kind\": \"ENUM\",\n \"type_label\": \"ENUM\",\n \"signature_text\": \"enum AppResult<T>\",\n \"child_symbol_names\": [\n \"map\"\n ],\n \"child_qualified_names\": [\n \"AppResult.map\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Successful result carrying a value.\",\n \"doxygen\": {\n \"brief\": [\n \"Successful result carrying a value.\",\n \"Failure carrying an error description.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 163,\n \"end_line_number\": 163,\n \"line_range\": [\n 163,\n 163\n ],\n \"text\": \"@brief Successful result carrying a value.\",\n \"text_lines\": [\n \"@brief Successful result carrying a value.\"\n ]\n },\n {\n \"start_line_number\": 165,\n \"end_line_number\": 165,\n \"line_range\": [\n 165,\n 165\n ],\n \"text\": \"@brief Failure carrying an error description.\",\n \"text_lines\": [\n \"@brief Failure carrying an error description.\"\n ]\n },\n {\n \"start_line_number\": 168,\n \"end_line_number\": 168,\n \"line_range\": [\n 168,\n 168\n ],\n \"text\": \"@brief Map the success value using a transform closure.\",\n \"text_lines\": [\n \"@brief Map the success value using a transform closure.\"\n ]\n },\n {\n \"start_line_number\": 169,\n \"end_line_number\": 169,\n \"line_range\": [\n 169,\n 169\n ],\n \"text\": \"@param transform Closure converting T to U.\",\n \"text_lines\": [\n \"@param transform Closure converting T to U.\"\n ]\n },\n {\n \"start_line_number\": 170,\n \"end_line_number\": 170,\n \"line_range\": [\n 170,\n 170\n ],\n \"text\": \"@return A new AppResult with the transformed value.\",\n \"text_lines\": [\n \"@return A new AppResult with the transformed value.\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 174,\n \"text\": \"return .success(transform(value))\"\n },\n {\n \"line_number\": 176,\n \"text\": \"return .failure(error)\"\n }\n ]\n },\n {\n \"start_line_number\": 171,\n \"end_line_number\": 178,\n \"line_range\": [\n 171,\n 178\n ],\n \"declaration_order_index\": 20,\n \"symbol_name\": \"map\",\n \"qualified_name\": \"AppResult.map\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"func map<U>(_ transform: (T) -> U) -> AppResult<U>\",\n \"parent_symbol_name\": \"AppResult\",\n \"parent_qualified_name\": \"AppResult\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Map the success value using a transform closure.\",\n \"doxygen\": {\n \"brief\": [\n \"Map the success value using a transform closure.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"transform\",\n \"description\": \"Closure converting T to U.\"\n }\n ],\n \"returns\": [\n \"A new AppResult with the transformed value.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 174,\n \"text\": \"return .success(transform(value))\"\n },\n {\n \"line_number\": 176,\n \"text\": \"return .failure(error)\"\n }\n ]\n },\n {\n \"start_line_number\": 186,\n \"end_line_number\": 193,\n \"line_range\": [\n 186,\n 193\n ],\n \"declaration_order_index\": 21,\n \"symbol_name\": \"Drawable\",\n \"qualified_name\": \"Drawable\",\n \"symbol_kind\": \"PROTOCOL\",\n \"type_label\": \"PROTOCOL\",\n \"signature_text\": \"protocol Drawable\",\n \"child_symbol_names\": [\n \"draw\",\n \"renderPriority\",\n \"renderPriority\",\n \"debugDraw\"\n ],\n \"child_qualified_names\": [\n \"Drawable.draw\",\n \"Drawable.renderPriority\",\n \"Drawable.renderPriority\",\n \"Drawable.debugDraw\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Defines the render contract with a default extension implementation.\",\n \"doxygen\": {\n \"brief\": [\n \"Defines the render contract with a default extension implementation.\",\n \"Render the object to a string representation.\"\n ],\n \"returns\": [\n \"Rendered string output.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 187,\n \"end_line_number\": 187,\n \"line_range\": [\n 187,\n 187\n ],\n \"text\": \"@brief Render the object to a string representation.\",\n \"text_lines\": [\n \"@brief Render the object to a string representation.\"\n ]\n },\n {\n \"start_line_number\": 188,\n \"end_line_number\": 188,\n \"line_range\": [\n 188,\n 188\n ],\n \"text\": \"@return Rendered string output.\",\n \"text_lines\": [\n \"@return Rendered string output.\"\n ]\n },\n {\n \"start_line_number\": 191,\n \"end_line_number\": 191,\n \"line_range\": [\n 191,\n 191\n ],\n \"text\": \"@brief Optional priority for render ordering.\",\n \"text_lines\": [\n \"@brief Optional priority for render ordering.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 189,\n \"end_line_number\": 192,\n \"line_range\": [\n 189,\n 192\n ],\n \"declaration_order_index\": 22,\n \"symbol_name\": \"draw\",\n \"qualified_name\": \"Drawable.draw\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"func draw() -> String\",\n \"parent_symbol_name\": \"Drawable\",\n \"parent_qualified_name\": \"Drawable\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Render the object to a string representation.\",\n \"doxygen\": {\n \"brief\": [\n \"Render the object to a string representation.\",\n \"Optional priority for render ordering.\"\n ],\n \"returns\": [\n \"Rendered string output.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 191,\n \"end_line_number\": 191,\n \"line_range\": [\n 191,\n 191\n ],\n \"text\": \"@brief Optional priority for render ordering.\",\n \"text_lines\": [\n \"@brief Optional priority for render ordering.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 192,\n \"end_line_number\": 192,\n \"line_range\": [\n 192,\n 192\n ],\n \"declaration_order_index\": 23,\n \"symbol_name\": \"renderPriority\",\n \"qualified_name\": \"Drawable.renderPriority\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"var renderPriority: Int { get }\",\n \"parent_symbol_name\": \"Drawable\",\n \"parent_qualified_name\": \"Drawable\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Optional priority for render ordering.\",\n \"doxygen\": {\n \"brief\": [\n \"Optional priority for render ordering.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 198,\n \"end_line_number\": 208,\n \"line_range\": [\n 198,\n 208\n ],\n \"declaration_order_index\": 24,\n \"symbol_name\": \"Container\",\n \"qualified_name\": \"Container\",\n \"symbol_kind\": \"PROTOCOL\",\n \"type_label\": \"PROTOCOL\",\n \"signature_text\": \"protocol Container\",\n \"child_symbol_names\": [\n \"count\"\n ],\n \"child_qualified_names\": [\n \"Container.count\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Defines a type-erased container interface.\",\n \"doxygen\": {\n \"brief\": [\n \"Defines a type-erased container interface.\",\n \"The type of element stored in the container.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 199,\n \"end_line_number\": 199,\n \"line_range\": [\n 199,\n 199\n ],\n \"text\": \"@brief The type of element stored in the container.\",\n \"text_lines\": [\n \"@brief The type of element stored in the container.\"\n ]\n },\n {\n \"start_line_number\": 202,\n \"end_line_number\": 202,\n \"line_range\": [\n 202,\n 202\n ],\n \"text\": \"@brief Add an item to the container.\",\n \"text_lines\": [\n \"@brief Add an item to the container.\"\n ]\n },\n {\n \"start_line_number\": 203,\n \"end_line_number\": 203,\n \"line_range\": [\n 203,\n 203\n ],\n \"text\": \"@param item The element to add.\",\n \"text_lines\": [\n \"@param item The element to add.\"\n ]\n },\n {\n \"start_line_number\": 206,\n \"end_line_number\": 206,\n \"line_range\": [\n 206,\n 206\n ],\n \"text\": \"@brief Number of elements in the container.\",\n \"text_lines\": [\n \"@brief Number of elements in the container.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 207,\n \"end_line_number\": 207,\n \"line_range\": [\n 207,\n 207\n ],\n \"declaration_order_index\": 25,\n \"symbol_name\": \"count\",\n \"qualified_name\": \"Container.count\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"var count: Int { get }\",\n \"parent_symbol_name\": \"Container\",\n \"parent_qualified_name\": \"Container\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Number of elements in the container.\",\n \"doxygen\": {\n \"brief\": [\n \"Number of elements in the container.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 212,\n \"end_line_number\": 221,\n \"line_range\": [\n 212,\n 221\n ],\n \"declaration_order_index\": 26,\n \"symbol_name\": \"Drawable\",\n \"qualified_name\": \"Drawable\",\n \"symbol_kind\": \"EXTENSION\",\n \"type_label\": \"EXTENSION\",\n \"signature_text\": \"extension Drawable\",\n \"child_symbol_names\": [\n \"draw\",\n \"renderPriority\",\n \"renderPriority\",\n \"debugDraw\"\n ],\n \"child_qualified_names\": [\n \"Drawable.draw\",\n \"Drawable.renderPriority\",\n \"Drawable.renderPriority\",\n \"Drawable.debugDraw\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Default render priority for all Drawable conformants.\",\n \"doxygen\": {\n \"brief\": [\n \"Default render priority for all Drawable conformants.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 213,\n \"end_line_number\": 213,\n \"line_range\": [\n 213,\n 213\n ],\n \"text\": \"@brief Default render priority for all Drawable conformants.\",\n \"text_lines\": [\n \"@brief Default render priority for all Drawable conformants.\"\n ]\n },\n {\n \"start_line_number\": 216,\n \"end_line_number\": 216,\n \"line_range\": [\n 216,\n 216\n ],\n \"text\": \"@brief Debug draw with priority prefix.\",\n \"text_lines\": [\n \"@brief Debug draw with priority prefix.\"\n ]\n },\n {\n \"start_line_number\": 217,\n \"end_line_number\": 217,\n \"line_range\": [\n 217,\n 217\n ],\n \"text\": \"@return String with priority and rendered content.\",\n \"text_lines\": [\n \"@return String with priority and rendered content.\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 219,\n \"text\": \"return \\\"[\\\\(renderPriority)] \\\\(draw())\\\"\"\n }\n ]\n },\n {\n \"start_line_number\": 214,\n \"end_line_number\": 214,\n \"line_range\": [\n 214,\n 214\n ],\n \"declaration_order_index\": 27,\n \"symbol_name\": \"renderPriority\",\n \"qualified_name\": \"Drawable.renderPriority\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"var renderPriority: Int { return 0 }\",\n \"parent_symbol_name\": \"Drawable\",\n \"parent_qualified_name\": \"Drawable\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Default render priority for all Drawable conformants.\",\n \"doxygen\": {\n \"brief\": [\n \"Default render priority for all Drawable conformants.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 218,\n \"end_line_number\": 220,\n \"line_range\": [\n 218,\n 220\n ],\n \"declaration_order_index\": 28,\n \"symbol_name\": \"debugDraw\",\n \"qualified_name\": \"Drawable.debugDraw\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"func debugDraw() -> String\",\n \"parent_symbol_name\": \"Drawable\",\n \"parent_qualified_name\": \"Drawable\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Debug draw with priority prefix.\",\n \"doxygen\": {\n \"brief\": [\n \"Debug draw with priority prefix.\"\n ],\n \"returns\": [\n \"String with priority and rendered content.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 219,\n \"text\": \"return \\\"[\\\\(renderPriority)] \\\\(draw())\\\"\"\n }\n ]\n },\n {\n \"start_line_number\": 226,\n \"end_line_number\": 238,\n \"line_range\": [\n 226,\n 238\n ],\n \"declaration_order_index\": 29,\n \"symbol_name\": \"Animal\",\n \"qualified_name\": \"Animal\",\n \"symbol_kind\": \"EXTENSION\",\n \"type_label\": \"EXTENSION\",\n \"signature_text\": \"extension Animal: Drawable\",\n \"child_symbol_names\": [\n \"species\",\n \"legs\",\n \"description\",\n \"speak\",\n \"draw\",\n \"describe\"\n ],\n \"child_qualified_names\": [\n \"Animal.species\",\n \"Animal.legs\",\n \"Animal.description\",\n \"Animal.speak\",\n \"Animal.draw\",\n \"Animal.describe\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Render animal as a descriptive string.\",\n \"doxygen\": {\n \"brief\": [\n \"Render animal as a descriptive string.\"\n ],\n \"returns\": [\n \"Description of the animal.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 227,\n \"end_line_number\": 227,\n \"line_range\": [\n 227,\n 227\n ],\n \"text\": \"@brief Render animal as a descriptive string.\",\n \"text_lines\": [\n \"@brief Render animal as a descriptive string.\"\n ]\n },\n {\n \"start_line_number\": 228,\n \"end_line_number\": 228,\n \"line_range\": [\n 228,\n 228\n ],\n \"text\": \"@return Description of the animal.\",\n \"text_lines\": [\n \"@return Description of the animal.\"\n ]\n },\n {\n \"start_line_number\": 233,\n \"end_line_number\": 233,\n \"line_range\": [\n 233,\n 233\n ],\n \"text\": \"@brief Describe the animal for UI display.\",\n \"text_lines\": [\n \"@brief Describe the animal for UI display.\"\n ]\n },\n {\n \"start_line_number\": 234,\n \"end_line_number\": 234,\n \"line_range\": [\n 234,\n 234\n ],\n \"text\": \"@return A formatted string suitable for labels.\",\n \"text_lines\": [\n \"@return A formatted string suitable for labels.\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 230,\n \"text\": \"return description\"\n },\n {\n \"line_number\": 236,\n \"text\": \"return \\\"Animal: \\\\(species)\\\"\"\n }\n ]\n },\n {\n \"start_line_number\": 229,\n \"end_line_number\": 231,\n \"line_range\": [\n 229,\n 231\n ],\n \"declaration_order_index\": 30,\n \"symbol_name\": \"draw\",\n \"qualified_name\": \"Animal.draw\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"func draw() -> String\",\n \"parent_symbol_name\": \"Animal\",\n \"parent_qualified_name\": \"Animal\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Render animal as a descriptive string.\",\n \"doxygen\": {\n \"brief\": [\n \"Render animal as a descriptive string.\"\n ],\n \"returns\": [\n \"Description of the animal.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 230,\n \"text\": \"return description\"\n }\n ]\n },\n {\n \"start_line_number\": 235,\n \"end_line_number\": 237,\n \"line_range\": [\n 235,\n 237\n ],\n \"declaration_order_index\": 31,\n \"symbol_name\": \"describe\",\n \"qualified_name\": \"Animal.describe\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"func describe() -> String\",\n \"parent_symbol_name\": \"Animal\",\n \"parent_qualified_name\": \"Animal\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Describe the animal for UI display.\",\n \"doxygen\": {\n \"brief\": [\n \"Describe the animal for UI display.\"\n ],\n \"returns\": [\n \"A formatted string suitable for labels.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 236,\n \"text\": \"return \\\"Animal: \\\\(species)\\\"\"\n }\n ]\n },\n {\n \"start_line_number\": 247,\n \"end_line_number\": 268,\n \"line_range\": [\n 247,\n 268\n ],\n \"declaration_order_index\": 32,\n \"symbol_name\": \"Clamped\",\n \"qualified_name\": \"Clamped\",\n \"symbol_kind\": \"STRUCT\",\n \"type_label\": \"STRUCT\",\n \"signature_text\": \"struct Clamped<Value: Comparable>\",\n \"child_symbol_names\": [\n \"min\",\n \"max\",\n \"value\",\n \"wrappedValue\"\n ],\n \"child_qualified_names\": [\n \"Clamped.min\",\n \"Clamped.max\",\n \"Clamped.value\",\n \"Clamped.wrappedValue\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Minimum allowed value.\",\n \"doxygen\": {\n \"brief\": [\n \"Minimum allowed value.\",\n \"Maximum allowed value.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 248,\n \"end_line_number\": 248,\n \"line_range\": [\n 248,\n 248\n ],\n \"text\": \"@brief Minimum allowed value.\",\n \"text_lines\": [\n \"@brief Minimum allowed value.\"\n ]\n },\n {\n \"start_line_number\": 250,\n \"end_line_number\": 250,\n \"line_range\": [\n 250,\n 250\n ],\n \"text\": \"@brief Maximum allowed value.\",\n \"text_lines\": [\n \"@brief Maximum allowed value.\"\n ]\n },\n {\n \"start_line_number\": 252,\n \"end_line_number\": 252,\n \"line_range\": [\n 252,\n 252\n ],\n \"text\": \"@brief Current stored value.\",\n \"text_lines\": [\n \"@brief Current stored value.\"\n ]\n },\n {\n \"start_line_number\": 255,\n \"end_line_number\": 255,\n \"line_range\": [\n 255,\n 255\n ],\n \"text\": \"@brief The wrapped value, clamped on set.\",\n \"text_lines\": [\n \"@brief The wrapped value, clamped on set.\"\n ]\n },\n {\n \"start_line_number\": 261,\n \"end_line_number\": 261,\n \"line_range\": [\n 261,\n 261\n ],\n \"text\": \"@brief Initialize with range and starting value.\",\n \"text_lines\": [\n \"@brief Initialize with range and starting value.\"\n ]\n },\n {\n \"start_line_number\": 265,\n \"end_line_number\": 265,\n \"line_range\": [\n 265,\n 265\n ],\n \"text\": \"Clamp initial value to range\",\n \"text_lines\": [\n \"Clamp initial value to range\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 249,\n \"end_line_number\": 249,\n \"line_range\": [\n 249,\n 249\n ],\n \"declaration_order_index\": 33,\n \"symbol_name\": \"min\",\n \"qualified_name\": \"Clamped.min\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"let min: Value\",\n \"parent_symbol_name\": \"Clamped\",\n \"parent_qualified_name\": \"Clamped\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Minimum allowed value.\",\n \"doxygen\": {\n \"brief\": [\n \"Minimum allowed value.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 251,\n \"end_line_number\": 251,\n \"line_range\": [\n 251,\n 251\n ],\n \"declaration_order_index\": 34,\n \"symbol_name\": \"max\",\n \"qualified_name\": \"Clamped.max\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"let max: Value\",\n \"parent_symbol_name\": \"Clamped\",\n \"parent_qualified_name\": \"Clamped\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Maximum allowed value.\",\n \"doxygen\": {\n \"brief\": [\n \"Maximum allowed value.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 253,\n \"end_line_number\": 253,\n \"line_range\": [\n 253,\n 253\n ],\n \"declaration_order_index\": 35,\n \"symbol_name\": \"value\",\n \"qualified_name\": \"Clamped.value\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"private var value: Value\",\n \"visibility\": \"priv\",\n \"parent_symbol_name\": \"Clamped\",\n \"parent_qualified_name\": \"Clamped\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Current stored value.\",\n \"doxygen\": {\n \"brief\": [\n \"Current stored value.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 256,\n \"end_line_number\": 256,\n \"line_range\": [\n 256,\n 256\n ],\n \"declaration_order_index\": 36,\n \"symbol_name\": \"wrappedValue\",\n \"qualified_name\": \"Clamped.wrappedValue\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"var wrappedValue: Value\",\n \"parent_symbol_name\": \"Clamped\",\n \"parent_qualified_name\": \"Clamped\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"The wrapped value, clamped on set.\",\n \"doxygen\": {\n \"brief\": [\n \"The wrapped value, clamped on set.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 277,\n \"end_line_number\": 277,\n \"line_range\": [\n 277,\n 277\n ],\n \"declaration_order_index\": 37,\n \"symbol_name\": \"value\",\n \"qualified_name\": \"value\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"private var value: Int = 0\",\n \"visibility\": \"priv\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Current count value.\",\n \"doxygen\": {\n \"brief\": [\n \"Current count value.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 281,\n \"end_line_number\": 284,\n \"line_range\": [\n 281,\n 284\n ],\n \"declaration_order_index\": 38,\n \"symbol_name\": \"increment\",\n \"qualified_name\": \"increment\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"func increment() -> Int\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Increment the counter and return the new value.\",\n \"doxygen\": {\n \"brief\": [\n \"Increment the counter and return the new value.\"\n ],\n \"returns\": [\n \"The incremented count.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 283,\n \"text\": \"return value\"\n }\n ]\n },\n {\n \"start_line_number\": 287,\n \"end_line_number\": 289,\n \"line_range\": [\n 287,\n 289\n ],\n \"declaration_order_index\": 39,\n \"symbol_name\": \"reset\",\n \"qualified_name\": \"reset\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"func reset()\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Reset the counter to zero.\",\n \"doxygen\": {\n \"brief\": [\n \"Reset the counter to zero.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 296,\n \"end_line_number\": 298,\n \"line_range\": [\n 296,\n 298\n ],\n \"declaration_order_index\": 40,\n \"symbol_name\": \"greet\",\n \"qualified_name\": \"greet\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public func greet(name: String)\",\n \"visibility\": \"pub\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Greet a person by name.\",\n \"doxygen\": {\n \"brief\": [\n \"Greet a person by name.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"name\",\n \"description\": \"The person's name.\"\n }\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 302,\n \"end_line_number\": 304,\n \"line_range\": [\n 302,\n 304\n ],\n \"declaration_order_index\": 41,\n \"symbol_name\": \"makeDrawable\",\n \"qualified_name\": \"makeDrawable\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"func makeDrawable() -> some Drawable\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Build an opaque some-typed Drawable.\",\n \"doxygen\": {\n \"brief\": [\n \"Build an opaque some-typed Drawable.\"\n ],\n \"returns\": [\n \"An opaque Drawable hiding the concrete type.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 303,\n \"text\": \"return Animal(species: \\\"Cat\\\")\"\n }\n ]\n },\n {\n \"start_line_number\": 311,\n \"end_line_number\": 313,\n \"line_range\": [\n 311,\n 313\n ],\n \"declaration_order_index\": 42,\n \"symbol_name\": \"contains\",\n \"qualified_name\": \"contains\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"func contains<T: Collection>(items: T, target: T.Element) -> Bool where T.Element: Equatable\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Generic function with where clause constraint.\\n@tparam T Must be Equatable.\",\n \"doxygen\": {\n \"brief\": [\n \"Generic function with where clause constraint.\\n@tparam T Must be Equatable.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"items\",\n \"description\": \"Collection of items to search.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"target\",\n \"description\": \"The item to find.\"\n }\n ],\n \"returns\": [\n \"True if target exists in items.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 312,\n \"text\": \"return items.contains(target)\"\n }\n ]\n },\n {\n \"start_line_number\": 318,\n \"end_line_number\": 323,\n \"line_range\": [\n 318,\n 323\n ],\n \"declaration_order_index\": 43,\n \"symbol_name\": \"deferred\",\n \"qualified_name\": \"deferred\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"func deferred(_ action: @escaping () -> Void) -> () -> Void\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Higher-order function accepting an escaping closure.\",\n \"doxygen\": {\n \"brief\": [\n \"Higher-order function accepting an escaping closure.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"action\",\n \"description\": \"The closure to store for later execution.\"\n }\n ],\n \"returns\": [\n \"A wrapper closure that invokes action.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 320,\n \"end_line_number\": 320,\n \"line_range\": [\n 320,\n 320\n ],\n \"text\": \"Execute the captured closure\",\n \"text_lines\": [\n \"Execute the captured closure\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 319,\n \"text\": \"return {\"\n }\n ]\n },\n {\n \"start_line_number\": 328,\n \"end_line_number\": 328,\n \"line_range\": [\n 328,\n 328\n ],\n \"declaration_order_index\": 44,\n \"symbol_name\": \"MAX_SIZE\",\n \"qualified_name\": \"MAX_SIZE\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"let MAX_SIZE = 1024\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Application-wide maximum buffer size constant.\",\n \"doxygen\": {\n \"brief\": [\n \"Application-wide maximum buffer size constant.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 331,\n \"end_line_number\": 331,\n \"line_range\": [\n 331,\n 331\n ],\n \"declaration_order_index\": 45,\n \"symbol_name\": \"counter\",\n \"qualified_name\": \"counter\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"private var counter = 0\",\n \"visibility\": \"priv\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Module-scoped mutable counter with restricted access.\",\n \"doxygen\": {\n \"brief\": [\n \"Module-scoped mutable counter with restricted access.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 334,\n \"end_line_number\": 334,\n \"line_range\": [\n 334,\n 334\n ],\n \"declaration_order_index\": 46,\n \"symbol_name\": \"defaultConfig\",\n \"qualified_name\": \"defaultConfig\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"let defaultConfig: [String: Any] =\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Lazy computed constant using a closure.\",\n \"doxygen\": {\n \"brief\": [\n \"Lazy computed constant using a closure.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 335,\n \"end_line_number\": 335,\n \"line_range\": [\n 335,\n 335\n ],\n \"declaration_order_index\": 47,\n \"symbol_name\": \"config\",\n \"qualified_name\": \"config\",\n \"symbol_kind\": \"VARIABLE\",\n \"type_label\": \"VARIABLE\",\n \"signature_text\": \"var config: [String: Any] = [:]\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 347,\n \"end_line_number\": 347,\n \"line_range\": [\n 347,\n 347\n ],\n \"declaration_order_index\": 48,\n \"symbol_name\": \"ServiceController\",\n \"qualified_name\": \"ServiceController\",\n \"symbol_kind\": \"CLASS\",\n \"type_label\": \"CLASS\",\n \"signature_text\": \"class ServiceController {}\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 348,\n \"end_line_number\": 348,\n \"line_range\": [\n 348,\n 348\n ],\n \"declaration_order_index\": 49,\n \"symbol_name\": \"CacheStore\",\n \"qualified_name\": \"CacheStore\",\n \"symbol_kind\": \"CLASS\",\n \"type_label\": \"CLASS\",\n \"signature_text\": \"final class CacheStore {}\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 349,\n \"end_line_number\": 349,\n \"line_range\": [\n 349,\n 349\n ],\n \"declaration_order_index\": 50,\n \"symbol_name\": \"Vector2\",\n \"qualified_name\": \"Vector2\",\n \"symbol_kind\": \"STRUCT\",\n \"type_label\": \"STRUCT\",\n \"signature_text\": \"struct Vector2 { let x: Int; let y: Int }\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 350,\n \"end_line_number\": 350,\n \"line_range\": [\n 350,\n 350\n ],\n \"declaration_order_index\": 51,\n \"symbol_name\": \"Limits\",\n \"qualified_name\": \"Limits\",\n \"symbol_kind\": \"STRUCT\",\n \"type_label\": \"STRUCT\",\n \"signature_text\": \"struct Limits { let max: Int }\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 351,\n \"end_line_number\": 351,\n \"line_range\": [\n 351,\n 351\n ],\n \"declaration_order_index\": 52,\n \"symbol_name\": \"ModeSwift\",\n \"qualified_name\": \"ModeSwift\",\n \"symbol_kind\": \"ENUM\",\n \"type_label\": \"ENUM\",\n \"signature_text\": \"enum ModeSwift { case fast, safe }\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 352,\n \"end_line_number\": 352,\n \"line_range\": [\n 352,\n 352\n ],\n \"declaration_order_index\": 53,\n \"symbol_name\": \"PhaseSwift\",\n \"qualified_name\": \"PhaseSwift\",\n \"symbol_kind\": \"ENUM\",\n \"type_label\": \"ENUM\",\n \"signature_text\": \"enum PhaseSwift { case initState, done }\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 353,\n \"end_line_number\": 353,\n \"line_range\": [\n 353,\n 353\n ],\n \"declaration_order_index\": 54,\n \"symbol_name\": \"SignalSwift\",\n \"qualified_name\": \"SignalSwift\",\n \"symbol_kind\": \"ENUM\",\n \"type_label\": \"ENUM\",\n \"signature_text\": \"enum SignalSwift { case on, off }\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 354,\n \"end_line_number\": 354,\n \"line_range\": [\n 354,\n 354\n ],\n \"declaration_order_index\": 55,\n \"symbol_name\": \"RunnerSwift\",\n \"qualified_name\": \"RunnerSwift\",\n \"symbol_kind\": \"PROTOCOL\",\n \"type_label\": \"PROTOCOL\",\n \"signature_text\": \"protocol RunnerSwift { func run() }\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 355,\n \"end_line_number\": 355,\n \"line_range\": [\n 355,\n 355\n ],\n \"declaration_order_index\": 56,\n \"symbol_name\": \"LoggerSwift\",\n \"qualified_name\": \"LoggerSwift\",\n \"symbol_kind\": \"PROTOCOL\",\n \"type_label\": \"PROTOCOL\",\n \"signature_text\": \"protocol LoggerSwift { func log(_ msg: String) }\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 356,\n \"end_line_number\": 356,\n \"line_range\": [\n 356,\n 356\n ],\n \"declaration_order_index\": 57,\n \"symbol_name\": \"ParserSwift\",\n \"qualified_name\": \"ParserSwift\",\n \"symbol_kind\": \"PROTOCOL\",\n \"type_label\": \"PROTOCOL\",\n \"signature_text\": \"protocol ParserSwift { func parse(_ input: String) -> String }\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 357,\n \"end_line_number\": 357,\n \"line_range\": [\n 357,\n 357\n ],\n \"declaration_order_index\": 58,\n \"symbol_name\": \"String\",\n \"qualified_name\": \"String\",\n \"symbol_kind\": \"EXTENSION\",\n \"type_label\": \"EXTENSION\",\n \"signature_text\": \"extension String { func trimmed2() -> String { self.trimmingCharacters(in: .whitespaces) } }\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 358,\n \"end_line_number\": 358,\n \"line_range\": [\n 358,\n 358\n ],\n \"declaration_order_index\": 59,\n \"symbol_name\": \"Int\",\n \"qualified_name\": \"Int\",\n \"symbol_kind\": \"EXTENSION\",\n \"type_label\": \"EXTENSION\",\n \"signature_text\": \"extension Int { func doubled2() -> Int { self * 2 } }\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 359,\n \"end_line_number\": 359,\n \"line_range\": [\n 359,\n 359\n ],\n \"declaration_order_index\": 60,\n \"symbol_name\": \"Array\",\n \"qualified_name\": \"Array\",\n \"symbol_kind\": \"EXTENSION\",\n \"type_label\": \"EXTENSION\",\n \"signature_text\": \"extension Array { var isNotEmpty: Bool { !self.isEmpty } }\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 367,\n \"end_line_number\": 367,\n \"line_range\": [\n 367,\n 367\n ],\n \"declaration_order_index\": 61,\n \"symbol_name\": \"reqCoverSwift1\",\n \"qualified_name\": \"reqCoverSwift1\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"func reqCoverSwift1(_ value: Int) -> Int { value + 1 }\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Coverage helper construct 1.\",\n \"doxygen\": {\n \"brief\": [\n \"Coverage helper construct 1.\"\n ],\n \"details\": [\n \"Provides deterministic fixture-level Doxygen coverage block 1.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"value\",\n \"description\": \"Input value for helper construct 1.\"\n }\n ],\n \"returns\": [\n \"Output value for helper construct 1.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 374,\n \"end_line_number\": 374,\n \"line_range\": [\n 374,\n 374\n ],\n \"declaration_order_index\": 62,\n \"symbol_name\": \"reqCoverSwift2\",\n \"qualified_name\": \"reqCoverSwift2\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"func reqCoverSwift2(_ value: Int) -> Int { value + 2 }\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Coverage helper construct 2.\",\n \"doxygen\": {\n \"brief\": [\n \"Coverage helper construct 2.\"\n ],\n \"details\": [\n \"Provides deterministic fixture-level Doxygen coverage block 2.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"value\",\n \"description\": \"Input value for helper construct 2.\"\n }\n ],\n \"returns\": [\n \"Output value for helper construct 2.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 381,\n \"end_line_number\": 381,\n \"line_range\": [\n 381,\n 381\n ],\n \"declaration_order_index\": 63,\n \"symbol_name\": \"reqCoverSwift3\",\n \"qualified_name\": \"reqCoverSwift3\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"func reqCoverSwift3(_ value: Int) -> Int { value + 3 }\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Coverage helper construct 3.\",\n \"doxygen\": {\n \"brief\": [\n \"Coverage helper construct 3.\"\n ],\n \"details\": [\n \"Provides deterministic fixture-level Doxygen coverage block 3.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"value\",\n \"description\": \"Input value for helper construct 3.\"\n }\n ],\n \"returns\": [\n \"Output value for helper construct 3.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 388,\n \"end_line_number\": 388,\n \"line_range\": [\n 388,\n 388\n ],\n \"declaration_order_index\": 64,\n \"symbol_name\": \"reqCoverSwift4\",\n \"qualified_name\": \"reqCoverSwift4\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"func reqCoverSwift4(_ value: Int) -> Int { value + 4 }\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Coverage helper construct 4.\",\n \"doxygen\": {\n \"brief\": [\n \"Coverage helper construct 4.\"\n ],\n \"details\": [\n \"Provides deterministic fixture-level Doxygen coverage block 4.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"value\",\n \"description\": \"Input value for helper construct 4.\"\n }\n ],\n \"returns\": [\n \"Output value for helper construct 4.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 395,\n \"end_line_number\": 395,\n \"line_range\": [\n 395,\n 395\n ],\n \"declaration_order_index\": 65,\n \"symbol_name\": \"reqCoverSwift5\",\n \"qualified_name\": \"reqCoverSwift5\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"func reqCoverSwift5(_ value: Int) -> Int { value + 5 }\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Coverage helper construct 5.\",\n \"doxygen\": {\n \"brief\": [\n \"Coverage helper construct 5.\"\n ],\n \"details\": [\n \"Provides deterministic fixture-level Doxygen coverage block 5.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"value\",\n \"description\": \"Input value for helper construct 5.\"\n }\n ],\n \"returns\": [\n \"Output value for helper construct 5.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n }\n ],\n \"standalone_comments\": [\n {\n \"start_line_number\": 2,\n \"end_line_number\": 2,\n \"line_range\": [\n 2,\n 2\n ],\n \"text\": \"@brief Comprehensive Swift test fixture for parser validation.\",\n \"text_lines\": [\n \"@brief Comprehensive Swift 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 closures, computed properties, property observers,\",\n \"text_lines\": [\n \"@details Covers closures, computed properties, property observers,\"\n ]\n },\n {\n \"start_line_number\": 4,\n \"end_line_number\": 4,\n \"line_range\": [\n 4,\n 4\n ],\n \"text\": \"subscripts, generic constraints, result builders, actors,\",\n \"text_lines\": [\n \"subscripts, generic constraints, result builders, actors,\"\n ]\n },\n {\n \"start_line_number\": 5,\n \"end_line_number\": 5,\n \"line_range\": [\n 5,\n 5\n ],\n \"text\": \"opaque types, property wrappers, and key paths.\",\n \"text_lines\": [\n \"opaque types, property wrappers, and key paths.\"\n ]\n },\n {\n \"start_line_number\": 6,\n \"end_line_number\": 6,\n \"line_range\": [\n 6,\n 6\n ],\n \"text\": \"Single line comment\",\n \"text_lines\": [\n \"Single line comment\"\n ]\n },\n {\n \"start_line_number\": 7,\n \"end_line_number\": 7,\n \"line_range\": [\n 7,\n 7\n ],\n \"text\": \"Multi-line comment\",\n \"text_lines\": [\n \"Multi-line comment\"\n ]\n },\n {\n \"start_line_number\": 11,\n \"end_line_number\": 11,\n \"line_range\": [\n 11,\n 11\n ],\n \"text\": \"── Class with properties and observers ────────────────────────────────\",\n \"text_lines\": [\n \"── Class with properties and observers ────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 23,\n \"end_line_number\": 23,\n \"line_range\": [\n 23,\n 23\n ],\n \"text\": \"Log upcoming change from current to new value\",\n \"text_lines\": [\n \"Log upcoming change from current to new value\"\n ]\n },\n {\n \"start_line_number\": 27,\n \"end_line_number\": 27,\n \"line_range\": [\n 27,\n 27\n ],\n \"text\": \"Enforce minimum of zero legs\",\n \"text_lines\": [\n \"Enforce minimum of zero legs\"\n ]\n },\n {\n \"start_line_number\": 37,\n \"end_line_number\": 37,\n \"line_range\": [\n 37,\n 37\n ],\n \"text\": \"@brief Initialize an Animal with species name.\",\n \"text_lines\": [\n \"@brief Initialize an Animal with species name.\"\n ]\n },\n {\n \"start_line_number\": 38,\n \"end_line_number\": 38,\n \"line_range\": [\n 38,\n 38\n ],\n \"text\": \"@param species The species identifier string.\",\n \"text_lines\": [\n \"@param species The species identifier string.\"\n ]\n },\n {\n \"start_line_number\": 54,\n \"end_line_number\": 54,\n \"line_range\": [\n 54,\n 54\n ],\n \"text\": \"@brief Deinitializer for cleanup on deallocation.\",\n \"text_lines\": [\n \"@brief Deinitializer for cleanup on deallocation.\"\n ]\n },\n {\n \"start_line_number\": 67,\n \"end_line_number\": 67,\n \"line_range\": [\n 67,\n 67\n ],\n \"text\": \"@brief Initialize a named dog.\",\n \"text_lines\": [\n \"@brief Initialize a named dog.\"\n ]\n },\n {\n \"start_line_number\": 68,\n \"end_line_number\": 68,\n \"line_range\": [\n 68,\n 68\n ],\n \"text\": \"@param name The dog's name.\",\n \"text_lines\": [\n \"@param name The dog's name.\"\n ]\n },\n {\n \"start_line_number\": 80,\n \"end_line_number\": 80,\n \"line_range\": [\n 80,\n 80\n ],\n \"text\": \"── Struct with subscript and Equatable ─────────────────────────────────\",\n \"text_lines\": [\n \"── Struct with subscript and Equatable ─────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 89,\n \"end_line_number\": 89,\n \"line_range\": [\n 89,\n 89\n ],\n \"text\": \"@brief Add two points component-wise.\",\n \"text_lines\": [\n \"@brief Add two points component-wise.\"\n ]\n },\n {\n \"start_line_number\": 90,\n \"end_line_number\": 90,\n \"line_range\": [\n 90,\n 90\n ],\n \"text\": \"@param lhs Left-hand operand.\",\n \"text_lines\": [\n \"@param lhs Left-hand operand.\"\n ]\n },\n {\n \"start_line_number\": 91,\n \"end_line_number\": 91,\n \"line_range\": [\n 91,\n 91\n ],\n \"text\": \"@param rhs Right-hand operand.\",\n \"text_lines\": [\n \"@param rhs Right-hand operand.\"\n ]\n },\n {\n \"start_line_number\": 92,\n \"end_line_number\": 92,\n \"line_range\": [\n 92,\n 92\n ],\n \"text\": \"@return New Point with summed coordinates.\",\n \"text_lines\": [\n \"@return New Point with summed coordinates.\"\n ]\n },\n {\n \"start_line_number\": 116,\n \"end_line_number\": 116,\n \"line_range\": [\n 116,\n 116\n ],\n \"text\": \"@brief Initialize a zero-filled matrix.\",\n \"text_lines\": [\n \"@brief Initialize a zero-filled matrix.\"\n ]\n },\n {\n \"start_line_number\": 117,\n \"end_line_number\": 117,\n \"line_range\": [\n 117,\n 117\n ],\n \"text\": \"@param rows Number of rows.\",\n \"text_lines\": [\n \"@param rows Number of rows.\"\n ]\n },\n {\n \"start_line_number\": 118,\n \"end_line_number\": 118,\n \"line_range\": [\n 118,\n 118\n ],\n \"text\": \"@param cols Number of columns.\",\n \"text_lines\": [\n \"@param cols Number of columns.\"\n ]\n },\n {\n \"start_line_number\": 125,\n \"end_line_number\": 125,\n \"line_range\": [\n 125,\n 125\n ],\n \"text\": \"@brief Access matrix elements using row/column subscript.\",\n \"text_lines\": [\n \"@brief Access matrix elements using row/column subscript.\"\n ]\n },\n {\n \"start_line_number\": 126,\n \"end_line_number\": 126,\n \"line_range\": [\n 126,\n 126\n ],\n \"text\": \"@param row Row index (zero-based).\",\n \"text_lines\": [\n \"@param row Row index (zero-based).\"\n ]\n },\n {\n \"start_line_number\": 127,\n \"end_line_number\": 127,\n \"line_range\": [\n 127,\n 127\n ],\n \"text\": \"@param col Column index (zero-based).\",\n \"text_lines\": [\n \"@param col Column index (zero-based).\"\n ]\n },\n {\n \"start_line_number\": 128,\n \"end_line_number\": 128,\n \"line_range\": [\n 128,\n 128\n ],\n \"text\": \"@return The value at (row, col).\",\n \"text_lines\": [\n \"@return The value at (row, col).\"\n ]\n },\n {\n \"start_line_number\": 135,\n \"end_line_number\": 135,\n \"line_range\": [\n 135,\n 135\n ],\n \"text\": \"── Enum with associated values and methods ────────────────────────────\",\n \"text_lines\": [\n \"── Enum with associated values and methods ────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 158,\n \"end_line_number\": 158,\n \"line_range\": [\n 158,\n 158\n ],\n \"text\": \"Result-like enum with associated error types.\",\n \"text_lines\": [\n \"Result-like enum with associated error types.\"\n ]\n },\n {\n \"start_line_number\": 163,\n \"end_line_number\": 163,\n \"line_range\": [\n 163,\n 163\n ],\n \"text\": \"@brief Successful result carrying a value.\",\n \"text_lines\": [\n \"@brief Successful result carrying a value.\"\n ]\n },\n {\n \"start_line_number\": 165,\n \"end_line_number\": 165,\n \"line_range\": [\n 165,\n 165\n ],\n \"text\": \"@brief Failure carrying an error description.\",\n \"text_lines\": [\n \"@brief Failure carrying an error description.\"\n ]\n },\n {\n \"start_line_number\": 181,\n \"end_line_number\": 181,\n \"line_range\": [\n 181,\n 181\n ],\n \"text\": \"── Protocol ───────────────────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Protocol ───────────────────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 199,\n \"end_line_number\": 199,\n \"line_range\": [\n 199,\n 199\n ],\n \"text\": \"@brief The type of element stored in the container.\",\n \"text_lines\": [\n \"@brief The type of element stored in the container.\"\n ]\n },\n {\n \"start_line_number\": 202,\n \"end_line_number\": 202,\n \"line_range\": [\n 202,\n 202\n ],\n \"text\": \"@brief Add an item to the container.\",\n \"text_lines\": [\n \"@brief Add an item to the container.\"\n ]\n },\n {\n \"start_line_number\": 203,\n \"end_line_number\": 203,\n \"line_range\": [\n 203,\n 203\n ],\n \"text\": \"@param item The element to add.\",\n \"text_lines\": [\n \"@param item The element to add.\"\n ]\n },\n {\n \"start_line_number\": 240,\n \"end_line_number\": 240,\n \"line_range\": [\n 240,\n 240\n ],\n \"text\": \"── Property wrapper ───────────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Property wrapper ───────────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 242,\n \"end_line_number\": 242,\n \"line_range\": [\n 242,\n 242\n ],\n \"text\": \"Property wrapper clamping values to a specified range.\",\n \"text_lines\": [\n \"Property wrapper clamping values to a specified range.\"\n ]\n },\n {\n \"start_line_number\": 243,\n \"end_line_number\": 243,\n \"line_range\": [\n 243,\n 243\n ],\n \"text\": \"\",\n \"text_lines\": []\n },\n {\n \"start_line_number\": 261,\n \"end_line_number\": 261,\n \"line_range\": [\n 261,\n 261\n ],\n \"text\": \"@brief Initialize with range and starting value.\",\n \"text_lines\": [\n \"@brief Initialize with range and starting value.\"\n ]\n },\n {\n \"start_line_number\": 265,\n \"end_line_number\": 265,\n \"line_range\": [\n 265,\n 265\n ],\n \"text\": \"Clamp initial value to range\",\n \"text_lines\": [\n \"Clamp initial value to range\"\n ]\n },\n {\n \"start_line_number\": 270,\n \"end_line_number\": 270,\n \"line_range\": [\n 270,\n 270\n ],\n \"text\": \"── Actor (Swift concurrency) ──────────────────────────────────────────\",\n \"text_lines\": [\n \"── Actor (Swift concurrency) ──────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 272,\n \"end_line_number\": 272,\n \"line_range\": [\n 272,\n 272\n ],\n \"text\": \"Actor providing thread-safe counter operations.\",\n \"text_lines\": [\n \"Actor providing thread-safe counter operations.\"\n ]\n },\n {\n \"start_line_number\": 273,\n \"end_line_number\": 273,\n \"line_range\": [\n 273,\n 273\n ],\n \"text\": \"\",\n \"text_lines\": []\n },\n {\n \"start_line_number\": 292,\n \"end_line_number\": 292,\n \"line_range\": [\n 292,\n 292\n ],\n \"text\": \"── Free functions ─────────────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Free functions ─────────────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 306,\n \"end_line_number\": 306,\n \"line_range\": [\n 306,\n 306\n ],\n \"text\": \"@brief Generic function with where clause constraint.\",\n \"text_lines\": [\n \"@brief Generic function with where clause constraint.\"\n ]\n },\n {\n \"start_line_number\": 307,\n \"end_line_number\": 307,\n \"line_range\": [\n 307,\n 307\n ],\n \"text\": \"@tparam T Must be Equatable.\",\n \"text_lines\": [\n \"@tparam T Must be Equatable.\"\n ]\n },\n {\n \"start_line_number\": 320,\n \"end_line_number\": 320,\n \"line_range\": [\n 320,\n 320\n ],\n \"text\": \"Execute the captured closure\",\n \"text_lines\": [\n \"Execute the captured closure\"\n ]\n },\n {\n \"start_line_number\": 341,\n \"end_line_number\": 341,\n \"line_range\": [\n 341,\n 341\n ],\n \"text\": \"coverage extension block\",\n \"text_lines\": [\n \"coverage extension block\"\n ]\n },\n {\n \"start_line_number\": 361,\n \"end_line_number\": 361,\n \"line_range\": [\n 361,\n 361\n ],\n \"text\": \"REQ-COVER-SRS-231 START\",\n \"text_lines\": [\n \"REQ-COVER-SRS-231 START\"\n ]\n },\n {\n \"start_line_number\": 362,\n \"end_line_number\": 362,\n \"line_range\": [\n 362,\n 362\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\": 363,\n \"end_line_number\": 363,\n \"line_range\": [\n 363,\n 363\n ],\n \"text\": \"@brief Coverage helper construct 1.\",\n \"text_lines\": [\n \"@brief Coverage helper construct 1.\"\n ]\n },\n {\n \"start_line_number\": 369,\n \"end_line_number\": 369,\n \"line_range\": [\n 369,\n 369\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\": 370,\n \"end_line_number\": 370,\n \"line_range\": [\n 370,\n 370\n ],\n \"text\": \"@brief Coverage helper construct 2.\",\n \"text_lines\": [\n \"@brief Coverage helper construct 2.\"\n ]\n },\n {\n \"start_line_number\": 376,\n \"end_line_number\": 376,\n \"line_range\": [\n 376,\n 376\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\": 377,\n \"end_line_number\": 377,\n \"line_range\": [\n 377,\n 377\n ],\n \"text\": \"@brief Coverage helper construct 3.\",\n \"text_lines\": [\n \"@brief Coverage helper construct 3.\"\n ]\n },\n {\n \"start_line_number\": 383,\n \"end_line_number\": 383,\n \"line_range\": [\n 383,\n 383\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\": 384,\n \"end_line_number\": 384,\n \"line_range\": [\n 384,\n 384\n ],\n \"text\": \"@brief Coverage helper construct 4.\",\n \"text_lines\": [\n \"@brief Coverage helper construct 4.\"\n ]\n },\n {\n \"start_line_number\": 390,\n \"end_line_number\": 390,\n \"line_range\": [\n 390,\n 390\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\": 391,\n \"end_line_number\": 391,\n \"line_range\": [\n 391,\n 391\n ],\n \"text\": \"@brief Coverage helper construct 5.\",\n \"text_lines\": [\n \"@brief Coverage helper construct 5.\"\n ]\n },\n {\n \"start_line_number\": 397,\n \"end_line_number\": 397,\n \"line_range\": [\n 397,\n 397\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_swift.swift | Swift | 397L | 66 symbols | 7 imports | 156 comments\n> Path: `tests/fixtures/fixture_swift.swift`\n\n## Imports\n```\nimport Foundation\nimport Combine\nimport SwiftUI\nimport Combine\nimport Foundation\nimport Dispatch\nimport UIKit\n```\n\n## Definitions\n\n### class `class Animal` (L16-58)\n- @brief Base class with stored, computed, and observed properties.\n- @brief Species name identifier.\n- var `var species: String` (L18)\n - @brief Species name identifier.\n- var `var legs: Int = 4` (L21)\n - @brief Number of legs; triggers a didSet observer on change.\n- var `var description: String` (L33)\n - @brief Computed property returning a descriptive string.\n- fn `func speak()` (L44-46)\n - @brief Produce a sound; subclasses should override.\n\n### class `class func createDefault() -> Animal` (L50-52)\n- @brief Class method creating a generic instance.\n- @return An Animal with species \"Unknown\".\n\n### class `class Dog: Animal` : Animal (L63-78)\n- @brief Concrete animal with dog-specific behavior.\n- @brief Dog's name.\n- const `let name: String` (L65)\n - @brief Dog's name.\n- fn `override func speak()` (L75-77)\n - @brief Override speak to produce dog-specific sound.\n\n### struct `struct Point: Equatable` : Equatable (L85-102)\n- @brief Value type representing a coordinate pair.\n- var `var x: Double = 0.0` (L86)\n- var `var y: Double = 0.0` (L87)\n- var `var magnitude: Double` (L99)\n - @brief Compute Euclidean distance from origin.\n - @return Distance as a Double.\n\n### struct `struct Matrix` (L107-133)\n- @brief 2D matrix supporting element access via subscript.\n- @brief Flat storage for matrix values.\n- var `private var data: [[Double]]` `priv` (L109)\n - @brief Flat storage for matrix values.\n- const `let rows: Int` (L112)\n - @brief Number of rows.\n- const `let cols: Int` (L114)\n - @brief Number of columns.\n\n### enum `enum Direction: String, CaseIterable` (L140-156)\n- @brief Cardinal directions supporting CaseIterable iteration.\n- var `var opposite: Direction` (L148)\n - @brief Compute the opposite direction.\n - @return The direction 180 degrees from self.\n\n### enum `enum AppResult<T>` (L162-179)\n- @brief Successful result carrying a value.\n- @brief Failure carrying an error description.\n- fn `func map<U>(_ transform: (T) -> U) -> AppResult<U>` (L171-178)\n - @brief Map the success value using a transform closure.\n - @param transform Closure converting T to U.\n - @return A new AppResult with the transformed value.\n\n### proto `protocol Drawable` (L186-193)\n- @brief Defines the render contract with a default extension implementation.\n- @brief Render the object to a string representation.\n- @return Rendered string output.\n- fn `func draw() -> String` (L189-192)\n - @brief Render the object to a string representation.\n - @brief Optional priority for render ordering.\n - @return Rendered string output.\n- var `var renderPriority: Int { get }` (L192)\n - @brief Optional priority for render ordering.\n\n### proto `protocol Container` (L198-208)\n- @brief Defines a type-erased container interface.\n- @brief The type of element stored in the container.\n- var `var count: Int { get }` (L207)\n - @brief Number of elements in the container.\n\n### ext `extension Drawable` (L212-221)\n- @brief Default render priority for all Drawable conformants.\n- var `var renderPriority: Int { return 0 }` (L214)\n - @brief Default render priority for all Drawable conformants.\n- fn `func debugDraw() -> String` (L218-220)\n - @brief Debug draw with priority prefix.\n - @return String with priority and rendered content.\n\n### ext `extension Animal: Drawable` (L226-238)\n- @brief Render animal as a descriptive string.\n- @return Description of the animal.\n- fn `func draw() -> String` (L229-231)\n - @brief Render animal as a descriptive string.\n - @return Description of the animal.\n- fn `func describe() -> String` (L235-237)\n - @brief Describe the animal for UI display.\n - @return A formatted string suitable for labels.\n\n### struct `struct Clamped<Value: Comparable>` (L247-268)\n- @brief Minimum allowed value.\n- @brief Maximum allowed value.\n- const `let min: Value` (L249)\n - @brief Minimum allowed value.\n- const `let max: Value` (L251)\n - @brief Maximum allowed value.\n- var `private var value: Value` `priv` (L253)\n - @brief Current stored value.\n- var `var wrappedValue: Value` (L256)\n - @brief The wrapped value, clamped on set.\n\n- var `private var value: Int = 0` `priv` (L277)\n- @brief Current count value.\n### fn `func increment() -> Int` (L281-284)\n- @brief Increment the counter and return the new value.\n- @return The incremented count.\n\n### fn `func reset()` (L287-289)\n- @brief Reset the counter to zero.\n\n### fn `public func greet(name: String)` (L296-298)\n- @brief Greet a person by name.\n- @param name The person's name.\n\n### fn `func makeDrawable() -> some Drawable` (L302-304)\n- @brief Build an opaque some-typed Drawable.\n- @return An opaque Drawable hiding the concrete type.\n\n### fn `func contains<T: Collection>(items: T, target: T.Element) -> Bool where T.Element: Equatable` (L311-313)\n- @brief Generic function with where clause constraint.\n@tparam T Must be Equatable.\n- @param items Collection of items to search.\n- @param target The item to find.\n- @return True if target exists in items.\n\n### fn `func deferred(_ action: @escaping () -> Void) -> () -> Void` (L318-323)\n- @brief Higher-order function accepting an escaping closure.\n- @param action The closure to store for later execution.\n- @return A wrapper closure that invokes action.\n\n- const `let MAX_SIZE = 1024` (L328)\n- @brief Application-wide maximum buffer size constant.\n- var `private var counter = 0` `priv` (L331)\n- @brief Module-scoped mutable counter with restricted access.\n- const `let defaultConfig: [String: Any] = {` (L334)\n- @brief Lazy computed constant using a closure.\n- var `var config: [String: Any] = [:]` (L335)\n- class `class ServiceController {}` (L347)\n- class `final class CacheStore {}` (L348)\n- struct `struct Vector2 { let x: Int; let y: Int }` (L349)\n- struct `struct Limits { let max: Int }` (L350)\n- enum `enum ModeSwift { case fast, safe }` (L351)\n- enum `enum PhaseSwift { case initState, done }` (L352)\n- enum `enum SignalSwift { case on, off }` (L353)\n- proto `protocol RunnerSwift { func run() }` (L354)\n- proto `protocol LoggerSwift { func log(_ msg: String) }` (L355)\n- proto `protocol ParserSwift { func parse(_ input: String) -> String }` (L356)\n- ext `extension String { func trimmed2() -> String { self.trimmingCharacters(in: .whitespaces) } }` (L357)\n- ext `extension Int { func doubled2() -> Int { self * 2 } }` (L358)\n- ext `extension Array { var isNotEmpty: Bool { !self.isEmpty } }` (L359)\n- fn `func reqCoverSwift1(_ value: Int) -> Int { value + 1 }` (L367)\n- @brief Coverage helper construct 1.\n- @details Provides deterministic fixture-level Doxygen coverage block 1.\n- @param value Input value for helper construct 1.\n- @return Output value for helper construct 1.\n- fn `func reqCoverSwift2(_ value: Int) -> Int { value + 2 }` (L374)\n- @brief Coverage helper construct 2.\n- @details Provides deterministic fixture-level Doxygen coverage block 2.\n- @param value Input value for helper construct 2.\n- @return Output value for helper construct 2.\n- fn `func reqCoverSwift3(_ value: Int) -> Int { value + 3 }` (L381)\n- @brief Coverage helper construct 3.\n- @details Provides deterministic fixture-level Doxygen coverage block 3.\n- @param value Input value for helper construct 3.\n- @return Output value for helper construct 3.\n- fn `func reqCoverSwift4(_ value: Int) -> Int { value + 4 }` (L388)\n- @brief Coverage helper construct 4.\n- @details Provides deterministic fixture-level Doxygen coverage block 4.\n- @param value Input value for helper construct 4.\n- @return Output value for helper construct 4.\n- fn `func reqCoverSwift5(_ value: Int) -> Int { value + 5 }` (L395)\n- @brief Coverage helper construct 5.\n- @details Provides deterministic fixture-level Doxygen coverage block 5.\n- @param value Input value for helper construct 5.\n- @return Output value for helper construct 5.\n## Symbol Index\n|Symbol|Kind|Vis|Lines|Sig|\n|---|---|---|---|---|\n|`Animal`|class||16-58|class Animal|\n|`Animal.species`|var||18||\n|`Animal.legs`|var||21||\n|`Animal.description`|var||33||\n|`Animal.speak`|fn||44-46|func speak()|\n|`func`|class||50-52|class func createDefault() -> Animal|\n|`Dog`|class||63-78|class Dog: Animal|\n|`Dog.name`|const||65||\n|`Dog.speak`|fn||75-77|override func speak()|\n|`Point`|struct||85-102|struct Point: Equatable|\n|`Point.x`|var||86||\n|`Point.y`|var||87||\n|`Point.magnitude`|var||99||\n|`Matrix`|struct||107-133|struct Matrix|\n|`Matrix.data`|var|priv|109||\n|`Matrix.rows`|const||112||\n|`Matrix.cols`|const||114||\n|`Direction`|enum||140-156|enum Direction: String, CaseIterable|\n|`Direction.opposite`|var||148||\n|`AppResult`|enum||162-179|enum AppResult<T>|\n|`AppResult.map`|fn||171-178|func map<U>(_ transform: (T) -> U) -> AppResult<U>|\n|`Drawable`|proto||186-193||\n|`Drawable.draw`|fn||189-192|func draw() -> String|\n|`Drawable.renderPriority`|var||192||\n|`Container`|proto||198-208||\n|`Container.count`|var||207||\n|`Drawable`|ext||212-221||\n|`Drawable.renderPriority`|var||214||\n|`Drawable.debugDraw`|fn||218-220|func debugDraw() -> String|\n|`Animal`|ext||226-238||\n|`Animal.draw`|fn||229-231|func draw() -> String|\n|`Animal.describe`|fn||235-237|func describe() -> String|\n|`Clamped`|struct||247-268|struct Clamped<Value: Comparable>|\n|`Clamped.min`|const||249||\n|`Clamped.max`|const||251||\n|`Clamped.value`|var|priv|253||\n|`Clamped.wrappedValue`|var||256||\n|`value`|var|priv|277||\n|`increment`|fn||281-284|func increment() -> Int|\n|`reset`|fn||287-289|func reset()|\n|`greet`|fn|pub|296-298|public func greet(name: String)|\n|`makeDrawable`|fn||302-304|func makeDrawable() -> some Drawable|\n|`contains`|fn||311-313|func contains<T: Collection>(items: T, target: T.Element)...|\n|`deferred`|fn||318-323|func deferred(_ action: @escaping () -> Void) -> () -> Void|\n|`MAX_SIZE`|const||328||\n|`counter`|var|priv|331||\n|`defaultConfig`|const||334||\n|`config`|var||335||\n|`ServiceController`|class||347|class ServiceController {}|\n|`CacheStore`|class||348|final class CacheStore {}|\n|`Vector2`|struct||349|struct Vector2 { let x: Int; let y: Int }|\n|`Limits`|struct||350|struct Limits { let max: Int }|\n|`ModeSwift`|enum||351|enum ModeSwift { case fast, safe }|\n|`PhaseSwift`|enum||352|enum PhaseSwift { case initState, done }|\n|`SignalSwift`|enum||353|enum SignalSwift { case on, off }|\n|`RunnerSwift`|proto||354||\n|`LoggerSwift`|proto||355||\n|`ParserSwift`|proto||356||\n|`String`|ext||357||\n|`Int`|ext||358||\n|`Array`|ext||359||\n|`reqCoverSwift1`|fn||367|func reqCoverSwift1(_ value: Int) -> Int { value + 1 }|\n|`reqCoverSwift2`|fn||374|func reqCoverSwift2(_ value: Int) -> Int { value + 2 }|\n|`reqCoverSwift3`|fn||381|func reqCoverSwift3(_ value: Int) -> Int { value + 3 }|\n|`reqCoverSwift4`|fn||388|func reqCoverSwift4(_ value: Int) -> Int { value + 4 }|\n|`reqCoverSwift5`|fn||395|func reqCoverSwift5(_ value: Int) -> Int { value + 5 }|\n\n",
4
4
  "stderr": ""
5
5
  }