pi-usereq 0.7.0 → 0.10.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.
- package/.gitignore +2 -0
- package/CHANGELOG.md +6 -0
- package/README.md +1 -1
- package/docs/pi.dev/coding-agent-docs/custom-provider.md +42 -1
- package/docs/pi.dev/coding-agent-docs/extensions.md +302 -28
- package/docs/pi.dev/coding-agent-docs/keybindings.md +23 -1
- package/docs/pi.dev/coding-agent-docs/models.md +3 -0
- package/docs/pi.dev/coding-agent-docs/packages.md +2 -2
- package/docs/pi.dev/coding-agent-docs/prompt-templates.md +21 -0
- package/docs/pi.dev/coding-agent-docs/providers.md +1 -0
- package/docs/pi.dev/coding-agent-docs/rpc.md +36 -6
- package/docs/pi.dev/coding-agent-docs/sdk.md +30 -5
- package/docs/pi.dev/coding-agent-docs/session.md +1 -1
- package/docs/pi.dev/coding-agent-docs/settings.md +2 -1
- package/docs/pi.dev/coding-agent-docs/skills.md +12 -12
- package/docs/pi.dev/coding-agent-docs/tree.md +2 -0
- package/docs/pi.dev/coding-agent-docs/tui.md +31 -0
- package/docs/pi.dev/mom-docs/new.md +4 -4
- package/package.json +1 -1
- package/pi-usereq/docs/REFERENCES.md +5184 -24470
- package/pi-usereq/docs/REQUIREMENTS.md +300 -166
- package/pi-usereq/docs/WORKFLOW.md +303 -314
- package/pi.dev-src/pi-mono/agent/src/agent-loop.ts +683 -0
- package/pi.dev-src/pi-mono/agent/src/agent.ts +543 -0
- package/pi.dev-src/pi-mono/agent/src/index.ts +8 -0
- package/pi.dev-src/pi-mono/agent/src/proxy.ts +367 -0
- package/pi.dev-src/pi-mono/agent/src/types.ts +364 -0
- package/pi.dev-src/pi-mono/agent/test/agent-loop.test.ts +1181 -0
- package/pi.dev-src/pi-mono/agent/test/agent.test.ts +463 -0
- package/pi.dev-src/pi-mono/agent/test/e2e.test.ts +404 -0
- package/pi.dev-src/pi-mono/agent/test/utils/calculate.ts +32 -0
- package/pi.dev-src/pi-mono/agent/test/utils/get-current-time.ts +46 -0
- package/pi.dev-src/pi-mono/agent/vitest.config.ts +9 -0
- package/pi.dev-src/pi-mono/ai/bedrock-provider.d.ts +1 -0
- package/pi.dev-src/pi-mono/ai/bedrock-provider.js +1 -0
- package/pi.dev-src/pi-mono/ai/scripts/generate-models.ts +1635 -0
- package/pi.dev-src/pi-mono/ai/scripts/generate-test-image.ts +34 -0
- package/pi.dev-src/pi-mono/ai/src/api-registry.ts +98 -0
- package/pi.dev-src/pi-mono/ai/src/bedrock-provider.ts +6 -0
- package/pi.dev-src/pi-mono/ai/src/cli.ts +133 -0
- package/pi.dev-src/pi-mono/ai/src/env-api-keys.ts +134 -0
- package/pi.dev-src/pi-mono/ai/src/index.ts +35 -0
- package/pi.dev-src/pi-mono/ai/src/models.generated.ts +14928 -0
- package/pi.dev-src/pi-mono/ai/src/models.ts +82 -0
- package/pi.dev-src/pi-mono/ai/src/oauth.ts +1 -0
- package/pi.dev-src/pi-mono/ai/src/providers/amazon-bedrock.ts +929 -0
- package/pi.dev-src/pi-mono/ai/src/providers/anthropic.ts +1125 -0
- package/pi.dev-src/pi-mono/ai/src/providers/azure-openai-responses.ts +253 -0
- package/pi.dev-src/pi-mono/ai/src/providers/faux.ts +499 -0
- package/pi.dev-src/pi-mono/ai/src/providers/github-copilot-headers.ts +37 -0
- package/pi.dev-src/pi-mono/ai/src/providers/google-gemini-cli.ts +996 -0
- package/pi.dev-src/pi-mono/ai/src/providers/google-shared.ts +354 -0
- package/pi.dev-src/pi-mono/ai/src/providers/google-vertex.ts +543 -0
- package/pi.dev-src/pi-mono/ai/src/providers/google.ts +500 -0
- package/pi.dev-src/pi-mono/ai/src/providers/mistral.ts +629 -0
- package/pi.dev-src/pi-mono/ai/src/providers/openai-codex-responses.ts +984 -0
- package/pi.dev-src/pi-mono/ai/src/providers/openai-completions.ts +1063 -0
- package/pi.dev-src/pi-mono/ai/src/providers/openai-responses-shared.ts +539 -0
- package/pi.dev-src/pi-mono/ai/src/providers/openai-responses.ts +264 -0
- package/pi.dev-src/pi-mono/ai/src/providers/register-builtins.ts +433 -0
- package/pi.dev-src/pi-mono/ai/src/providers/simple-options.ts +47 -0
- package/pi.dev-src/pi-mono/ai/src/providers/transform-messages.ts +220 -0
- package/pi.dev-src/pi-mono/ai/src/stream.ts +59 -0
- package/pi.dev-src/pi-mono/ai/src/types.ts +417 -0
- package/pi.dev-src/pi-mono/ai/src/utils/event-stream.ts +87 -0
- package/pi.dev-src/pi-mono/ai/src/utils/hash.ts +13 -0
- package/pi.dev-src/pi-mono/ai/src/utils/headers.ts +7 -0
- package/pi.dev-src/pi-mono/ai/src/utils/json-parse.ts +124 -0
- package/pi.dev-src/pi-mono/ai/src/utils/overflow.ts +138 -0
- package/pi.dev-src/pi-mono/ai/src/utils/sanitize-unicode.ts +25 -0
- package/pi.dev-src/pi-mono/ai/src/utils/typebox-helpers.ts +24 -0
- package/pi.dev-src/pi-mono/ai/src/utils/validation.ts +324 -0
- package/pi.dev-src/pi-mono/ai/test/abort.test.ts +260 -0
- package/pi.dev-src/pi-mono/ai/test/anthropic-oauth.test.ts +99 -0
- package/pi.dev-src/pi-mono/ai/test/anthropic-opus-4-7-smoke.test.ts +72 -0
- package/pi.dev-src/pi-mono/ai/test/anthropic-sse-parsing.test.ts +113 -0
- package/pi.dev-src/pi-mono/ai/test/anthropic-thinking-disable.test.ts +152 -0
- package/pi.dev-src/pi-mono/ai/test/anthropic-tool-name-normalization.test.ts +205 -0
- package/pi.dev-src/pi-mono/ai/test/azure-utils.ts +28 -0
- package/pi.dev-src/pi-mono/ai/test/bedrock-endpoint-resolution.test.ts +131 -0
- package/pi.dev-src/pi-mono/ai/test/bedrock-models.test.ts +66 -0
- package/pi.dev-src/pi-mono/ai/test/bedrock-thinking-payload.test.ts +107 -0
- package/pi.dev-src/pi-mono/ai/test/bedrock-utils.ts +18 -0
- package/pi.dev-src/pi-mono/ai/test/cache-retention.test.ts +335 -0
- package/pi.dev-src/pi-mono/ai/test/context-overflow.test.ts +714 -0
- package/pi.dev-src/pi-mono/ai/test/cross-provider-handoff.test.ts +458 -0
- package/pi.dev-src/pi-mono/ai/test/data/red-circle.png +0 -0
- package/pi.dev-src/pi-mono/ai/test/empty.test.ts +742 -0
- package/pi.dev-src/pi-mono/ai/test/faux-provider.test.ts +597 -0
- package/pi.dev-src/pi-mono/ai/test/fireworks-models.test.ts +49 -0
- package/pi.dev-src/pi-mono/ai/test/github-copilot-anthropic.test.ts +108 -0
- package/pi.dev-src/pi-mono/ai/test/github-copilot-oauth.test.ts +196 -0
- package/pi.dev-src/pi-mono/ai/test/google-gemini-cli-claude-thinking-header.test.ts +103 -0
- package/pi.dev-src/pi-mono/ai/test/google-gemini-cli-empty-stream.test.ts +108 -0
- package/pi.dev-src/pi-mono/ai/test/google-gemini-cli-retry-delay.test.ts +53 -0
- package/pi.dev-src/pi-mono/ai/test/google-shared-convert-tools.test.ts +187 -0
- package/pi.dev-src/pi-mono/ai/test/google-shared-gemini3-unsigned-tool-call.test.ts +172 -0
- package/pi.dev-src/pi-mono/ai/test/google-shared-image-tool-result-routing.test.ts +124 -0
- package/pi.dev-src/pi-mono/ai/test/google-thinking-disable.test.ts +183 -0
- package/pi.dev-src/pi-mono/ai/test/google-thinking-signature.test.ts +38 -0
- package/pi.dev-src/pi-mono/ai/test/google-tool-call-missing-args.test.ts +105 -0
- package/pi.dev-src/pi-mono/ai/test/google-vertex-api-key-resolution.test.ts +144 -0
- package/pi.dev-src/pi-mono/ai/test/image-tool-result.test.ts +481 -0
- package/pi.dev-src/pi-mono/ai/test/interleaved-thinking.test.ts +145 -0
- package/pi.dev-src/pi-mono/ai/test/lazy-module-load.test.ts +102 -0
- package/pi.dev-src/pi-mono/ai/test/mistral-reasoning-mode.test.ts +66 -0
- package/pi.dev-src/pi-mono/ai/test/mistral-tool-schema.test.ts +61 -0
- package/pi.dev-src/pi-mono/ai/test/oauth.ts +89 -0
- package/pi.dev-src/pi-mono/ai/test/openai-codex-cache-affinity-e2e.test.ts +36 -0
- package/pi.dev-src/pi-mono/ai/test/openai-codex-stream.test.ts +686 -0
- package/pi.dev-src/pi-mono/ai/test/openai-completions-cache-control-format.test.ts +189 -0
- package/pi.dev-src/pi-mono/ai/test/openai-completions-prompt-cache.test.ts +198 -0
- package/pi.dev-src/pi-mono/ai/test/openai-completions-thinking-as-text.test.ts +214 -0
- package/pi.dev-src/pi-mono/ai/test/openai-completions-tool-choice.test.ts +560 -0
- package/pi.dev-src/pi-mono/ai/test/openai-completions-tool-result-images.test.ts +101 -0
- package/pi.dev-src/pi-mono/ai/test/openai-responses-cache-affinity-e2e.test.ts +32 -0
- package/pi.dev-src/pi-mono/ai/test/openai-responses-copilot-provider.test.ts +128 -0
- package/pi.dev-src/pi-mono/ai/test/openai-responses-foreign-toolcall-id.test.ts +66 -0
- package/pi.dev-src/pi-mono/ai/test/openai-responses-partial-json-cleanup.test.ts +101 -0
- package/pi.dev-src/pi-mono/ai/test/openai-responses-reasoning-replay-e2e.test.ts +292 -0
- package/pi.dev-src/pi-mono/ai/test/openai-responses-tool-result-images.test.ts +200 -0
- package/pi.dev-src/pi-mono/ai/test/openrouter-cache-write-repro.test.ts +78 -0
- package/pi.dev-src/pi-mono/ai/test/overflow.test.ts +64 -0
- package/pi.dev-src/pi-mono/ai/test/responseid.test.ts +145 -0
- package/pi.dev-src/pi-mono/ai/test/stream.test.ts +1405 -0
- package/pi.dev-src/pi-mono/ai/test/supports-xhigh.test.ts +34 -0
- package/pi.dev-src/pi-mono/ai/test/tokens.test.ts +304 -0
- package/pi.dev-src/pi-mono/ai/test/tool-call-id-normalization.test.ts +291 -0
- package/pi.dev-src/pi-mono/ai/test/tool-call-without-result.test.ts +313 -0
- package/pi.dev-src/pi-mono/ai/test/total-tokens.test.ts +695 -0
- package/pi.dev-src/pi-mono/ai/test/transform-messages-copilot-openai-to-anthropic.test.ts +191 -0
- package/pi.dev-src/pi-mono/ai/test/unicode-surrogate.test.ts +754 -0
- package/pi.dev-src/pi-mono/ai/test/validation.test.ts +116 -0
- package/pi.dev-src/pi-mono/ai/test/xhigh.test.ts +71 -0
- package/pi.dev-src/pi-mono/ai/test/zen.test.ts +25 -0
- package/pi.dev-src/pi-mono/ai/vitest.config.ts +9 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/antigravity-image-gen.ts +418 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/auto-commit-on-exit.ts +49 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/bash-spawn-hook.ts +30 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/bookmark.ts +50 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/built-in-tool-renderer.ts +249 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/claude-rules.ts +86 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/commands.ts +72 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/confirm-destructive.ts +59 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-compaction.ts +127 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-footer.ts +64 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-header.ts +73 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-provider-anthropic/index.ts +604 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-provider-gitlab-duo/index.ts +349 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/custom-provider-qwen-cli/index.ts +345 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/dirty-repo-guard.ts +56 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/doom/build.sh +152 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/doom-component.ts +132 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/doom-engine.ts +173 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/doom-keys.ts +104 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/index.ts +74 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/doom-overlay/wad-finder.ts +51 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/dynamic-resources/SKILL.md +8 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/dynamic-resources/dynamic.json +79 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/dynamic-resources/dynamic.md +5 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/dynamic-resources/index.ts +15 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/dynamic-tools.ts +74 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/event-bus.ts +43 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/file-trigger.ts +41 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/git-checkpoint.ts +53 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/github-issue-autocomplete.ts +185 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/handoff.ts +153 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/hello.ts +26 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/hidden-thinking-label.ts +53 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/inline-bash.ts +94 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/input-transform.ts +43 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/interactive-shell.ts +196 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/mac-system-theme.ts +47 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/message-renderer.ts +59 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/minimal-mode.ts +426 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/modal-editor.ts +85 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/model-status.ts +31 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/notify.ts +55 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/overlay-qa-tests.ts +1348 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/overlay-test.ts +150 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/permission-gate.ts +34 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/pirate.ts +47 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/plan-mode/index.ts +340 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/plan-mode/utils.ts +168 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/preset.ts +430 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/prompt-customizer.ts +97 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/protected-paths.ts +30 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/provider-payload.ts +18 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/qna.ts +122 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/question.ts +264 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/questionnaire.ts +427 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/rainbow-editor.ts +88 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/reload-runtime.ts +37 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/rpc-demo.ts +118 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/sandbox/index.ts +321 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/sandbox/package-lock.json +92 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/send-user-message.ts +97 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/session-name.ts +27 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/shutdown-command.ts +63 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/snake.ts +343 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/space-invaders.ts +560 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/ssh.ts +220 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/status-line.ts +32 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/structured-output.ts +65 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/agents/planner.md +37 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/agents/reviewer.md +35 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/agents/scout.md +50 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/agents/worker.md +24 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/agents.ts +126 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/index.ts +987 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/prompts/implement.md +10 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/summarize.ts +206 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/system-prompt-header.ts +17 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/tic-tac-toe.ts +1008 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/timed-confirm.ts +70 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/titlebar-spinner.ts +58 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/todo.ts +297 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/tool-override.ts +144 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/tools.ts +141 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/trigger-compact.ts +50 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/truncated-tool.ts +195 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/widget-placement.ts +9 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/with-deps/index.ts +32 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/with-deps/package-lock.json +31 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/working-indicator.ts +123 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/extensions/working-message-test.ts +25 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/rpc-extension-ui.ts +632 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/sdk/01-minimal.ts +22 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/sdk/02-custom-model.ts +49 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/sdk/03-custom-prompt.ts +62 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/sdk/04-skills.ts +55 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/sdk/05-tools.ts +44 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/sdk/06-extensions.ts +90 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/sdk/07-context-files.ts +42 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/sdk/08-prompt-templates.ts +51 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/sdk/09-api-keys-and-oauth.ts +48 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/sdk/10-settings.ts +53 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/sdk/11-sessions.ts +48 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/sdk/12-full-control.ts +73 -0
- package/pi.dev-src/pi-mono/coding-agent/examples/sdk/13-session-runtime.ts +67 -0
- package/pi.dev-src/pi-mono/coding-agent/scripts/migrate-sessions.sh +93 -0
- package/pi.dev-src/pi-mono/coding-agent/src/bun/cli.ts +6 -0
- package/pi.dev-src/pi-mono/coding-agent/src/bun/register-bedrock.ts +4 -0
- package/pi.dev-src/pi-mono/coding-agent/src/cli/args.ts +335 -0
- package/pi.dev-src/pi-mono/coding-agent/src/cli/config-selector.ts +52 -0
- package/pi.dev-src/pi-mono/coding-agent/src/cli/file-processor.ts +100 -0
- package/pi.dev-src/pi-mono/coding-agent/src/cli/initial-message.ts +43 -0
- package/pi.dev-src/pi-mono/coding-agent/src/cli/list-models.ts +110 -0
- package/pi.dev-src/pi-mono/coding-agent/src/cli/session-picker.ts +52 -0
- package/pi.dev-src/pi-mono/coding-agent/src/cli.ts +17 -0
- package/pi.dev-src/pi-mono/coding-agent/src/config.ts +261 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/agent-session-runtime.ts +394 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/agent-session-services.ts +196 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/agent-session.ts +3096 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/auth-storage.ts +493 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/bash-executor.ts +154 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/compaction/branch-summarization.ts +355 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/compaction/compaction.ts +839 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/compaction/index.ts +7 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/compaction/utils.ts +170 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/defaults.ts +3 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/diagnostics.ts +15 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/event-bus.ts +33 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/exec.ts +107 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/ansi-to-html.ts +258 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/index.ts +314 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/template.css +1017 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/template.html +55 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/template.js +1770 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/tool-renderer.ts +158 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/vendor/highlight.min.js +1213 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/export-html/vendor/marked.min.js +6 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/extensions/index.ts +171 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/extensions/loader.ts +606 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/extensions/runner.ts +1019 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/extensions/types.ts +1542 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/extensions/wrapper.ts +30 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/footer-data-provider.ts +354 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/index.ts +77 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/keybindings.ts +370 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/messages.ts +195 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/model-registry.ts +858 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/model-resolver.ts +629 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/output-guard.ts +74 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/package-manager.ts +2408 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/prompt-templates.ts +296 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/resolve-config-value.ts +142 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/resource-loader.ts +917 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/sdk.ts +380 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/session-cwd.ts +59 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/session-manager.ts +1425 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/settings-manager.ts +999 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/skills.ts +508 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/slash-commands.ts +39 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/source-info.ts +40 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/system-prompt.ts +172 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/telemetry.ts +13 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/timings.ts +31 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/bash.ts +448 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/edit-diff.ts +445 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/edit.ts +487 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/file-mutation-queue.ts +39 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/find.ts +370 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/grep.ts +384 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/index.ts +196 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/ls.ts +229 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/path-utils.ts +94 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/read.ts +273 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/render-utils.ts +64 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/tool-definition-wrapper.ts +45 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/truncate.ts +265 -0
- package/pi.dev-src/pi-mono/coding-agent/src/core/tools/write.ts +281 -0
- package/pi.dev-src/pi-mono/coding-agent/src/index.ts +352 -0
- package/pi.dev-src/pi-mono/coding-agent/src/main.ts +731 -0
- package/pi.dev-src/pi-mono/coding-agent/src/migrations.ts +314 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/index.ts +9 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/assets/clankolas.png +0 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/armin.ts +382 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/assistant-message.ts +147 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/bash-execution.ts +218 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/bordered-loader.ts +68 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/branch-summary-message.ts +58 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/compaction-summary-message.ts +59 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/config-selector.ts +592 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/countdown-timer.ts +38 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/custom-editor.ts +80 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/custom-message.ts +99 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/daxnuts.ts +164 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/diff.ts +147 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/dynamic-border.ts +25 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/earendil-announcement.ts +53 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/extension-editor.ts +147 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/extension-input.ts +87 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/extension-selector.ts +107 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/footer.ts +220 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/index.ts +32 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/keybinding-hints.ts +24 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/login-dialog.ts +178 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/model-selector.ts +338 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/oauth-selector.ts +121 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/scoped-models-selector.ts +355 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/session-selector-search.ts +194 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/session-selector.ts +1026 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/settings-selector.ts +456 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/show-images-selector.ts +50 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/skill-invocation-message.ts +55 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/theme-selector.ts +67 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/thinking-selector.ts +74 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/tool-execution.ts +352 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/tree-selector.ts +1246 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/user-message-selector.ts +155 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/user-message.ts +35 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/components/visual-truncate.ts +50 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/interactive-mode.ts +5155 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/theme/dark.json +85 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/theme/light.json +84 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/theme/theme-schema.json +335 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/interactive/theme/theme.ts +1141 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/print-mode.ts +158 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/rpc/jsonl.ts +58 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/rpc/rpc-client.ts +515 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/rpc/rpc-mode.ts +745 -0
- package/pi.dev-src/pi-mono/coding-agent/src/modes/rpc/rpc-types.ts +264 -0
- package/pi.dev-src/pi-mono/coding-agent/src/package-manager-cli.ts +270 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/changelog.ts +99 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/child-process.ts +86 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/clipboard-image.ts +300 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/clipboard-native.ts +22 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/clipboard.ts +81 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/exif-orientation.ts +183 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/frontmatter.ts +39 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/fs-watch.ts +30 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/git.ts +192 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/image-convert.ts +41 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/image-resize.ts +176 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/mime.ts +30 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/paths.ts +20 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/photon.ts +139 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/shell.ts +210 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/sleep.ts +18 -0
- package/pi.dev-src/pi-mono/coding-agent/src/utils/tools-manager.ts +287 -0
- package/pi.dev-src/pi-mono/coding-agent/test/agent-session-auto-compaction-queue.test.ts +437 -0
- package/pi.dev-src/pi-mono/coding-agent/test/agent-session-branching.test.ts +156 -0
- package/pi.dev-src/pi-mono/coding-agent/test/agent-session-compaction.test.ts +208 -0
- package/pi.dev-src/pi-mono/coding-agent/test/agent-session-concurrent.test.ts +618 -0
- package/pi.dev-src/pi-mono/coding-agent/test/agent-session-dynamic-provider.test.ts +117 -0
- package/pi.dev-src/pi-mono/coding-agent/test/agent-session-dynamic-tools.test.ts +182 -0
- package/pi.dev-src/pi-mono/coding-agent/test/agent-session-retry.test.ts +318 -0
- package/pi.dev-src/pi-mono/coding-agent/test/agent-session-runtime-events.test.ts +208 -0
- package/pi.dev-src/pi-mono/coding-agent/test/agent-session-stats.test.ts +143 -0
- package/pi.dev-src/pi-mono/coding-agent/test/agent-session-tree-navigation.test.ts +323 -0
- package/pi.dev-src/pi-mono/coding-agent/test/args.test.ts +328 -0
- package/pi.dev-src/pi-mono/coding-agent/test/assistant-message.test.ts +57 -0
- package/pi.dev-src/pi-mono/coding-agent/test/auth-storage.test.ts +462 -0
- package/pi.dev-src/pi-mono/coding-agent/test/bash-close-hang-windows.test.ts +126 -0
- package/pi.dev-src/pi-mono/coding-agent/test/bash-execution-width.test.ts +80 -0
- package/pi.dev-src/pi-mono/coding-agent/test/block-images.test.ts +120 -0
- package/pi.dev-src/pi-mono/coding-agent/test/clipboard-image-bmp-conversion.test.ts +88 -0
- package/pi.dev-src/pi-mono/coding-agent/test/clipboard-image.test.ts +136 -0
- package/pi.dev-src/pi-mono/coding-agent/test/compaction-extensions-example.test.ts +66 -0
- package/pi.dev-src/pi-mono/coding-agent/test/compaction-extensions.test.ts +415 -0
- package/pi.dev-src/pi-mono/coding-agent/test/compaction-serialization.test.ts +79 -0
- package/pi.dev-src/pi-mono/coding-agent/test/compaction-summary-reasoning.test.ts +118 -0
- package/pi.dev-src/pi-mono/coding-agent/test/compaction-thinking-model.test.ts +223 -0
- package/pi.dev-src/pi-mono/coding-agent/test/compaction.test.ts +550 -0
- package/pi.dev-src/pi-mono/coding-agent/test/config.test.ts +30 -0
- package/pi.dev-src/pi-mono/coding-agent/test/edit-tool-legacy-input.test.ts +116 -0
- package/pi.dev-src/pi-mono/coding-agent/test/edit-tool-no-full-redraw.test.ts +235 -0
- package/pi.dev-src/pi-mono/coding-agent/test/export-html-whitespace.test.ts +12 -0
- package/pi.dev-src/pi-mono/coding-agent/test/export-html-xss.test.ts +28 -0
- package/pi.dev-src/pi-mono/coding-agent/test/extensions-discovery.test.ts +463 -0
- package/pi.dev-src/pi-mono/coding-agent/test/extensions-input-event.test.ts +112 -0
- package/pi.dev-src/pi-mono/coding-agent/test/extensions-runner.test.ts +805 -0
- package/pi.dev-src/pi-mono/coding-agent/test/file-mutation-queue.test.ts +163 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/assistant-message-with-thinking-code.json +33 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/before-compaction.jsonl +1003 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/empty-agent/.gitkeep +0 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/empty-cwd/.gitkeep +0 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/large-session.jsonl +1019 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/consecutive-hyphens/SKILL.md +8 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/disable-model-invocation/SKILL.md +9 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/invalid-name-chars/SKILL.md +8 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/invalid-yaml/SKILL.md +8 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/long-name/SKILL.md +8 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/missing-description/SKILL.md +7 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/multiline-description/SKILL.md +11 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/name-mismatch/SKILL.md +8 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/nested/child-skill/SKILL.md +8 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/no-frontmatter/SKILL.md +3 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/root-skill-preferred/SKILL.md +3 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/root-skill-preferred/nested-child/SKILL.md +3 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/unknown-field/SKILL.md +10 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills/valid-skill/SKILL.md +8 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills-collision/first/calendar/SKILL.md +8 -0
- package/pi.dev-src/pi-mono/coding-agent/test/fixtures/skills-collision/second/calendar/SKILL.md +8 -0
- package/pi.dev-src/pi-mono/coding-agent/test/footer-data-provider.test.ts +265 -0
- package/pi.dev-src/pi-mono/coding-agent/test/footer-width.test.ts +115 -0
- package/pi.dev-src/pi-mono/coding-agent/test/frontmatter.test.ts +60 -0
- package/pi.dev-src/pi-mono/coding-agent/test/git-ssh-url.test.ts +78 -0
- package/pi.dev-src/pi-mono/coding-agent/test/git-update.test.ts +411 -0
- package/pi.dev-src/pi-mono/coding-agent/test/image-processing.test.ts +145 -0
- package/pi.dev-src/pi-mono/coding-agent/test/image-resize-callers.test.ts +53 -0
- package/pi.dev-src/pi-mono/coding-agent/test/initial-message.test.ts +48 -0
- package/pi.dev-src/pi-mono/coding-agent/test/interactive-mode-anthropic-warning.test.ts +73 -0
- package/pi.dev-src/pi-mono/coding-agent/test/interactive-mode-clone-command.test.ts +77 -0
- package/pi.dev-src/pi-mono/coding-agent/test/interactive-mode-compaction.test.ts +57 -0
- package/pi.dev-src/pi-mono/coding-agent/test/interactive-mode-import-command.test.ts +144 -0
- package/pi.dev-src/pi-mono/coding-agent/test/interactive-mode-status.test.ts +635 -0
- package/pi.dev-src/pi-mono/coding-agent/test/interactive-mode-suspend.test.ts +149 -0
- package/pi.dev-src/pi-mono/coding-agent/test/keybindings-migration.test.ts +88 -0
- package/pi.dev-src/pi-mono/coding-agent/test/model-registry.test.ts +1209 -0
- package/pi.dev-src/pi-mono/coding-agent/test/model-resolver.test.ts +436 -0
- package/pi.dev-src/pi-mono/coding-agent/test/package-command-paths.test.ts +144 -0
- package/pi.dev-src/pi-mono/coding-agent/test/package-manager-ssh.test.ts +97 -0
- package/pi.dev-src/pi-mono/coding-agent/test/package-manager.test.ts +1795 -0
- package/pi.dev-src/pi-mono/coding-agent/test/path-utils.test.ts +162 -0
- package/pi.dev-src/pi-mono/coding-agent/test/plan-mode-utils.test.ts +261 -0
- package/pi.dev-src/pi-mono/coding-agent/test/print-mode.test.ts +140 -0
- package/pi.dev-src/pi-mono/coding-agent/test/prompt-templates.test.ts +515 -0
- package/pi.dev-src/pi-mono/coding-agent/test/resource-loader.test.ts +576 -0
- package/pi.dev-src/pi-mono/coding-agent/test/rpc-client-clone.test.ts +29 -0
- package/pi.dev-src/pi-mono/coding-agent/test/rpc-example.ts +86 -0
- package/pi.dev-src/pi-mono/coding-agent/test/rpc-jsonl.test.ts +65 -0
- package/pi.dev-src/pi-mono/coding-agent/test/rpc-prompt-response-semantics.test.ts +285 -0
- package/pi.dev-src/pi-mono/coding-agent/test/rpc.test.ts +321 -0
- package/pi.dev-src/pi-mono/coding-agent/test/sdk-codex-cache-probe-tool-loop.ts +364 -0
- package/pi.dev-src/pi-mono/coding-agent/test/sdk-openrouter-attribution.test.ts +181 -0
- package/pi.dev-src/pi-mono/coding-agent/test/sdk-session-manager.test.ts +95 -0
- package/pi.dev-src/pi-mono/coding-agent/test/sdk-skills.test.ts +109 -0
- package/pi.dev-src/pi-mono/coding-agent/test/session-cwd.test.ts +91 -0
- package/pi.dev-src/pi-mono/coding-agent/test/session-info-modified-timestamp.test.ts +83 -0
- package/pi.dev-src/pi-mono/coding-agent/test/session-manager/build-context.test.ts +268 -0
- package/pi.dev-src/pi-mono/coding-agent/test/session-manager/custom-session-id.test.ts +109 -0
- package/pi.dev-src/pi-mono/coding-agent/test/session-manager/file-operations.test.ts +208 -0
- package/pi.dev-src/pi-mono/coding-agent/test/session-manager/labels.test.ts +198 -0
- package/pi.dev-src/pi-mono/coding-agent/test/session-manager/migration.test.ts +78 -0
- package/pi.dev-src/pi-mono/coding-agent/test/session-manager/save-entry.test.ts +55 -0
- package/pi.dev-src/pi-mono/coding-agent/test/session-manager/tree-traversal.test.ts +533 -0
- package/pi.dev-src/pi-mono/coding-agent/test/session-selector-path-delete.test.ts +315 -0
- package/pi.dev-src/pi-mono/coding-agent/test/session-selector-rename.test.ts +111 -0
- package/pi.dev-src/pi-mono/coding-agent/test/session-selector-search.test.ts +195 -0
- package/pi.dev-src/pi-mono/coding-agent/test/settings-manager-bug.test.ts +147 -0
- package/pi.dev-src/pi-mono/coding-agent/test/settings-manager.test.ts +319 -0
- package/pi.dev-src/pi-mono/coding-agent/test/skills.test.ts +432 -0
- package/pi.dev-src/pi-mono/coding-agent/test/stdout-cleanliness.test.ts +103 -0
- package/pi.dev-src/pi-mono/coding-agent/test/streaming-render-debug.ts +97 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-bash-persistence.test.ts +242 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-compaction.test.ts +343 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-model-extension.test.ts +325 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-prompt.test.ts +323 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-queue.test.ts +422 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-retry-events.test.ts +358 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/agent-session-runtime.test.ts +553 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/harness.ts +208 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/2023-queued-slash-command-followup.test.ts +80 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/2753-reload-stale-resource-settings.test.ts +100 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/2781-skill-collision-precedence.test.ts +120 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/2791-fswatch-error-crash.test.ts +106 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/2835-tools-allowlist-filters-extension-tools.test.ts +94 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/2860-replaced-session-context.test.ts +274 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/3217-scoped-model-order.test.ts +104 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/3302-find-path-glob.test.ts +72 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/3303-find-nested-gitignore.test.ts +83 -0
- package/pi.dev-src/pi-mono/coding-agent/test/suite/regressions/3317-network-connection-lost-retry.test.ts +33 -0
- package/pi.dev-src/pi-mono/coding-agent/test/system-prompt.test.ts +102 -0
- package/pi.dev-src/pi-mono/coding-agent/test/test-harness.test.ts +321 -0
- package/pi.dev-src/pi-mono/coding-agent/test/test-harness.ts +446 -0
- package/pi.dev-src/pi-mono/coding-agent/test/test-theme-colors.ts +246 -0
- package/pi.dev-src/pi-mono/coding-agent/test/theme-export.test.ts +104 -0
- package/pi.dev-src/pi-mono/coding-agent/test/tool-execution-component.test.ts +331 -0
- package/pi.dev-src/pi-mono/coding-agent/test/tools.test.ts +889 -0
- package/pi.dev-src/pi-mono/coding-agent/test/tree-selector.test.ts +655 -0
- package/pi.dev-src/pi-mono/coding-agent/test/trigger-compact-extension.test.ts +57 -0
- package/pi.dev-src/pi-mono/coding-agent/test/truncate-to-width.test.ts +81 -0
- package/pi.dev-src/pi-mono/coding-agent/test/user-message.test.ts +25 -0
- package/pi.dev-src/pi-mono/coding-agent/test/utilities.ts +316 -0
- package/pi.dev-src/pi-mono/coding-agent/tsconfig.examples.json +16 -0
- package/pi.dev-src/pi-mono/coding-agent/vitest.config.ts +26 -0
- package/pi.dev-src/pi-mono/mom/dev.sh +30 -0
- package/pi.dev-src/pi-mono/mom/docker.sh +95 -0
- package/pi.dev-src/pi-mono/mom/scripts/migrate-timestamps.ts +121 -0
- package/pi.dev-src/pi-mono/mom/src/agent.ts +882 -0
- package/pi.dev-src/pi-mono/mom/src/context.ts +180 -0
- package/pi.dev-src/pi-mono/mom/src/download.ts +117 -0
- package/pi.dev-src/pi-mono/mom/src/events.ts +442 -0
- package/pi.dev-src/pi-mono/mom/src/fs-watch.ts +30 -0
- package/pi.dev-src/pi-mono/mom/src/log.ts +271 -0
- package/pi.dev-src/pi-mono/mom/src/main.ts +367 -0
- package/pi.dev-src/pi-mono/mom/src/sandbox.ts +221 -0
- package/pi.dev-src/pi-mono/mom/src/slack.ts +623 -0
- package/pi.dev-src/pi-mono/mom/src/store.ts +234 -0
- package/pi.dev-src/pi-mono/mom/src/tools/attach.ts +47 -0
- package/pi.dev-src/pi-mono/mom/src/tools/bash.ts +97 -0
- package/pi.dev-src/pi-mono/mom/src/tools/edit.ts +165 -0
- package/pi.dev-src/pi-mono/mom/src/tools/index.ts +19 -0
- package/pi.dev-src/pi-mono/mom/src/tools/read.ts +159 -0
- package/pi.dev-src/pi-mono/mom/src/tools/truncate.ts +236 -0
- package/pi.dev-src/pi-mono/mom/src/tools/write.ts +45 -0
- package/pi.dev-src/pi-mono/mom/test/events.test.ts +50 -0
- package/pi.dev-src/pi-mono/pods/scripts/model_run.sh +83 -0
- package/pi.dev-src/pi-mono/pods/scripts/pod_setup.sh +336 -0
- package/pi.dev-src/pi-mono/pods/src/cli.ts +360 -0
- package/pi.dev-src/pi-mono/pods/src/commands/models.ts +753 -0
- package/pi.dev-src/pi-mono/pods/src/commands/pods.ts +205 -0
- package/pi.dev-src/pi-mono/pods/src/commands/prompt.ts +84 -0
- package/pi.dev-src/pi-mono/pods/src/config.ts +80 -0
- package/pi.dev-src/pi-mono/pods/src/index.ts +2 -0
- package/pi.dev-src/pi-mono/pods/src/model-configs.ts +111 -0
- package/pi.dev-src/pi-mono/pods/src/models.json +295 -0
- package/pi.dev-src/pi-mono/pods/src/ssh.ts +151 -0
- package/pi.dev-src/pi-mono/pods/src/types.ts +27 -0
- package/pi.dev-src/pi-mono/tui/src/autocomplete.ts +783 -0
- package/pi.dev-src/pi-mono/tui/src/components/box.ts +137 -0
- package/pi.dev-src/pi-mono/tui/src/components/cancellable-loader.ts +40 -0
- package/pi.dev-src/pi-mono/tui/src/components/editor.ts +2280 -0
- package/pi.dev-src/pi-mono/tui/src/components/image.ts +104 -0
- package/pi.dev-src/pi-mono/tui/src/components/input.ts +503 -0
- package/pi.dev-src/pi-mono/tui/src/components/loader.ts +86 -0
- package/pi.dev-src/pi-mono/tui/src/components/markdown.ts +852 -0
- package/pi.dev-src/pi-mono/tui/src/components/select-list.ts +229 -0
- package/pi.dev-src/pi-mono/tui/src/components/settings-list.ts +250 -0
- package/pi.dev-src/pi-mono/tui/src/components/spacer.ts +28 -0
- package/pi.dev-src/pi-mono/tui/src/components/text.ts +106 -0
- package/pi.dev-src/pi-mono/tui/src/components/truncated-text.ts +65 -0
- package/pi.dev-src/pi-mono/tui/src/editor-component.ts +74 -0
- package/pi.dev-src/pi-mono/tui/src/fuzzy.ts +133 -0
- package/pi.dev-src/pi-mono/tui/src/index.ts +106 -0
- package/pi.dev-src/pi-mono/tui/src/keybindings.ts +244 -0
- package/pi.dev-src/pi-mono/tui/src/keys.ts +1400 -0
- package/pi.dev-src/pi-mono/tui/src/kill-ring.ts +46 -0
- package/pi.dev-src/pi-mono/tui/src/stdin-buffer.ts +386 -0
- package/pi.dev-src/pi-mono/tui/src/terminal-image.ts +414 -0
- package/pi.dev-src/pi-mono/tui/src/terminal.ts +373 -0
- package/pi.dev-src/pi-mono/tui/src/tui.ts +1243 -0
- package/pi.dev-src/pi-mono/tui/src/undo-stack.ts +28 -0
- package/pi.dev-src/pi-mono/tui/src/utils.ts +1085 -0
- package/pi.dev-src/pi-mono/tui/test/autocomplete.test.ts +542 -0
- package/pi.dev-src/pi-mono/tui/test/bug-regression-isimageline-startswith-bug.test.ts +237 -0
- package/pi.dev-src/pi-mono/tui/test/chat-simple.ts +129 -0
- package/pi.dev-src/pi-mono/tui/test/editor.test.ts +3812 -0
- package/pi.dev-src/pi-mono/tui/test/fuzzy.test.ts +98 -0
- package/pi.dev-src/pi-mono/tui/test/image-test.ts +56 -0
- package/pi.dev-src/pi-mono/tui/test/input.test.ts +580 -0
- package/pi.dev-src/pi-mono/tui/test/key-tester.ts +105 -0
- package/pi.dev-src/pi-mono/tui/test/keybindings.test.ts +38 -0
- package/pi.dev-src/pi-mono/tui/test/keys.test.ts +614 -0
- package/pi.dev-src/pi-mono/tui/test/markdown.test.ts +1236 -0
- package/pi.dev-src/pi-mono/tui/test/overlay-non-capturing.test.ts +609 -0
- package/pi.dev-src/pi-mono/tui/test/overlay-options.test.ts +538 -0
- package/pi.dev-src/pi-mono/tui/test/overlay-short-content.test.ts +56 -0
- package/pi.dev-src/pi-mono/tui/test/regression-regional-indicator-width.test.ts +52 -0
- package/pi.dev-src/pi-mono/tui/test/select-list.test.ts +116 -0
- package/pi.dev-src/pi-mono/tui/test/stdin-buffer.test.ts +422 -0
- package/pi.dev-src/pi-mono/tui/test/terminal-image.test.ts +279 -0
- package/pi.dev-src/pi-mono/tui/test/test-themes.ts +38 -0
- package/pi.dev-src/pi-mono/tui/test/truncate-to-width.test.ts +62 -0
- package/pi.dev-src/pi-mono/tui/test/truncated-text.test.ts +129 -0
- package/pi.dev-src/pi-mono/tui/test/tui-cell-size-input.test.ts +81 -0
- package/pi.dev-src/pi-mono/tui/test/tui-overlay-style-leak.test.ts +72 -0
- package/pi.dev-src/pi-mono/tui/test/tui-render.test.ts +509 -0
- package/pi.dev-src/pi-mono/tui/test/viewport-overwrite-repro.ts +106 -0
- package/pi.dev-src/pi-mono/tui/test/virtual-terminal.ts +218 -0
- package/pi.dev-src/pi-mono/tui/test/wrap-ansi.test.ts +207 -0
- package/pi.dev-src/pi-mono/tui/vitest.config.ts +7 -0
- package/pi.dev-src/pi-mono/web-ui/example/index.html +13 -0
- package/pi.dev-src/pi-mono/web-ui/example/src/app.css +1 -0
- package/pi.dev-src/pi-mono/web-ui/example/src/custom-messages.ts +99 -0
- package/pi.dev-src/pi-mono/web-ui/example/src/main.ts +421 -0
- package/pi.dev-src/pi-mono/web-ui/example/tsconfig.json +23 -0
- package/pi.dev-src/pi-mono/web-ui/example/vite.config.ts +6 -0
- package/pi.dev-src/pi-mono/web-ui/scripts/count-prompt-tokens.ts +88 -0
- package/pi.dev-src/pi-mono/web-ui/src/ChatPanel.ts +209 -0
- package/pi.dev-src/pi-mono/web-ui/src/app.css +68 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/AgentInterface.ts +403 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/AttachmentTile.ts +107 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/ConsoleBlock.ts +72 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/CustomProviderCard.ts +100 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/ExpandableSection.ts +46 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/Input.ts +113 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/MessageEditor.ts +405 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/MessageList.ts +98 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/Messages.ts +383 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/ProviderKeyInput.ts +153 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/SandboxedIframe.ts +626 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/StreamingMessageContainer.ts +103 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/ThinkingBlock.ts +43 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/message-renderer-registry.ts +28 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/ArtifactsRuntimeProvider.ts +220 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/AttachmentsRuntimeProvider.ts +66 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/ConsoleRuntimeProvider.ts +186 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/FileDownloadRuntimeProvider.ts +110 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/RuntimeMessageBridge.ts +82 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/RuntimeMessageRouter.ts +216 -0
- package/pi.dev-src/pi-mono/web-ui/src/components/sandbox/SandboxRuntimeProvider.ts +52 -0
- package/pi.dev-src/pi-mono/web-ui/src/dialogs/ApiKeyPromptDialog.ts +75 -0
- package/pi.dev-src/pi-mono/web-ui/src/dialogs/AttachmentOverlay.ts +636 -0
- package/pi.dev-src/pi-mono/web-ui/src/dialogs/CustomProviderDialog.ts +274 -0
- package/pi.dev-src/pi-mono/web-ui/src/dialogs/ModelSelector.ts +370 -0
- package/pi.dev-src/pi-mono/web-ui/src/dialogs/PersistentStorageDialog.ts +144 -0
- package/pi.dev-src/pi-mono/web-ui/src/dialogs/ProvidersModelsTab.ts +212 -0
- package/pi.dev-src/pi-mono/web-ui/src/dialogs/SessionListDialog.ts +150 -0
- package/pi.dev-src/pi-mono/web-ui/src/dialogs/SettingsDialog.ts +218 -0
- package/pi.dev-src/pi-mono/web-ui/src/index.ts +120 -0
- package/pi.dev-src/pi-mono/web-ui/src/prompts/prompts.ts +282 -0
- package/pi.dev-src/pi-mono/web-ui/src/storage/app-storage.ts +60 -0
- package/pi.dev-src/pi-mono/web-ui/src/storage/backends/indexeddb-storage-backend.ts +193 -0
- package/pi.dev-src/pi-mono/web-ui/src/storage/store.ts +33 -0
- package/pi.dev-src/pi-mono/web-ui/src/storage/stores/custom-providers-store.ts +62 -0
- package/pi.dev-src/pi-mono/web-ui/src/storage/stores/provider-keys-store.ts +33 -0
- package/pi.dev-src/pi-mono/web-ui/src/storage/stores/sessions-store.ts +136 -0
- package/pi.dev-src/pi-mono/web-ui/src/storage/stores/settings-store.ts +34 -0
- package/pi.dev-src/pi-mono/web-ui/src/storage/types.ts +206 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/ArtifactElement.ts +14 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/ArtifactPill.ts +26 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/Console.ts +93 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/DocxArtifact.ts +213 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/ExcelArtifact.ts +231 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/GenericArtifact.ts +117 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/HtmlArtifact.ts +195 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/ImageArtifact.ts +116 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/MarkdownArtifact.ts +82 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/PdfArtifact.ts +201 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/SvgArtifact.ts +119 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/TextArtifact.ts +148 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/artifacts-tool-renderer.ts +310 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/artifacts.ts +713 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/artifacts/index.ts +7 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/extract-document.ts +275 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/index.ts +46 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/javascript-repl.ts +293 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/renderer-registry.ts +130 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/renderers/BashRenderer.ts +52 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/renderers/CalculateRenderer.ts +58 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/renderers/DefaultRenderer.ts +103 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/renderers/GetCurrentTimeRenderer.ts +92 -0
- package/pi.dev-src/pi-mono/web-ui/src/tools/types.ts +15 -0
- package/pi.dev-src/pi-mono/web-ui/src/utils/attachment-utils.ts +472 -0
- package/pi.dev-src/pi-mono/web-ui/src/utils/auth-token.ts +22 -0
- package/pi.dev-src/pi-mono/web-ui/src/utils/format.ts +42 -0
- package/pi.dev-src/pi-mono/web-ui/src/utils/i18n.ts +653 -0
- package/pi.dev-src/pi-mono/web-ui/src/utils/model-discovery.ts +277 -0
- package/pi.dev-src/pi-mono/web-ui/src/utils/proxy-utils.ts +139 -0
- package/pi.dev-src/pi-mono/web-ui/src/utils/test-sessions.ts +2357 -0
- package/pi.dev-src/pi-mono/web-ui/tsconfig.json +7 -0
- package/scripts/lib/extension-debug-harness.ts +3 -10
- package/scripts/lib/recording-extension-api.ts +71 -2
- package/scripts/pi-usereq-debug.sh +1 -1
- package/scripts/tool-args-to-params.ts +4 -15
- package/src/cli.ts +24 -68
- package/src/core/agent-tool-json.ts +53 -239
- package/src/core/compress-payload.ts +4 -74
- package/src/core/compress.ts +26 -15
- package/src/core/config.ts +468 -42
- package/src/core/debug-runtime.ts +542 -0
- package/src/core/extension-status.ts +296 -46
- package/src/core/find-constructs.ts +3 -3
- package/src/core/find-payload.ts +26 -132
- package/src/core/path-context.ts +346 -81
- package/src/core/pi-notify.ts +115 -5
- package/src/core/pi-usereq-tools.ts +57 -19
- package/src/core/prompt-command-catalog.ts +46 -0
- package/src/core/prompt-command-runtime.ts +1650 -0
- package/src/core/prompt-command-state.ts +211 -0
- package/src/core/prompts.ts +173 -41
- package/src/core/reference-payload.ts +5 -63
- package/src/core/resources.ts +61 -5
- package/src/core/settings-menu.ts +12 -6
- package/src/core/source-analyzer.ts +27 -7
- package/src/core/token-counter.ts +6 -76
- package/src/core/tool-runner.ts +38 -317
- package/src/index.ts +2062 -950
- package/src/resources/instructions/git_commit.md +16 -0
- package/src/resources/instructions/git_read-only.md +2 -0
- package/src/resources/prompts/analyze.md +12 -13
- package/src/resources/prompts/change.md +21 -59
- package/src/resources/prompts/check.md +14 -16
- package/src/resources/prompts/cover.md +21 -59
- package/src/resources/prompts/create.md +5 -4
- package/src/resources/prompts/fix.md +20 -58
- package/src/resources/prompts/flowchart.md +14 -49
- package/src/resources/prompts/implement.md +14 -50
- package/src/resources/prompts/new.md +20 -58
- package/src/resources/prompts/readme.md +14 -50
- package/src/resources/prompts/recreate.md +14 -45
- package/src/resources/prompts/refactor.md +20 -58
- package/src/resources/prompts/references.md +7 -43
- package/src/resources/prompts/renumber.md +8 -39
- package/src/resources/prompts/workflow.md +14 -50
- package/src/resources/prompts/write.md +5 -4
- package/tests/attended-results-scenarios.ts +30 -136
- package/tests/cli-command-option-parity.test.ts +148 -192
- package/tests/debug-extension-harness.test.ts +69 -68
- package/tests/extension-registration.test.ts +3118 -657
- package/tests/fixtures_attended_results/project/compress-line-numbers.json +1 -1
- package/tests/fixtures_attended_results/project/compress.json +1 -1
- package/tests/fixtures_attended_results/project/find-line-numbers.json +1 -1
- package/tests/fixtures_attended_results/project/find.json +1 -1
- package/tests/fixtures_attended_results/project/references.json +2 -2
- package/tests/fixtures_attended_results/standalone/files-compress/fixture_go.go.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-compress-line-numbers/fixture_go.go.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-find/fixture_go.go.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-find-line-numbers/fixture_go.go.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_c.c.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_cpp.cpp.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_csharp.cs.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_elixir.ex.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_go.go.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_haskell.hs.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_java.java.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_javascript.js.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_kotlin.kt.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_lua.lua.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_perl.pl.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_php.php.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_python.py.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_ruby.rb.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_rust.rs.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_scala.scala.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_shell.sh.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_swift.swift.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_typescript.ts.json +1 -1
- package/tests/fixtures_attended_results/standalone/files-references/fixture_zig.zig.json +1 -1
- package/tests/helpers.ts +24 -15
- package/tests/oracle-project.test.ts +29 -30
- package/tests/oracle-standalone.test.ts +27 -1
- package/tests/prompt-rendering.test.ts +40 -9
- 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_perl.pl\"\n ],\n \"requested_canonical_paths\": [\n \"tests/fixtures/fixture_perl.pl\"\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\": 30,\n \"total_import_count\": 5,\n \"total_comment_count\": 97,\n \"total_standalone_comment_count\": 44,\n \"total_doxygen_field_count\": 62,\n \"symbol_kind_counts\": {\n \"CONSTANT\": 6,\n \"FUNCTION\": 19,\n \"MODULE\": 5\n }\n },\n \"repository\": {\n \"root_directory_path\": \"<ROOT>\",\n \"source_directory_paths\": [],\n \"file_count\": 1,\n \"file_canonical_paths\": [\n \"tests/fixtures/fixture_perl.pl\"\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_perl.pl\",\n \"relative_path\": \"tests/fixtures/fixture_perl.pl\",\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\": 310,\n \"line_range\": [\n 1,\n 310\n ],\n \"request_index\": 0,\n \"input_path\": \"tests/fixtures/fixture_perl.pl\",\n \"canonical_path\": \"tests/fixtures/fixture_perl.pl\",\n \"absolute_path\": \"<ROOT>/tests/fixtures/fixture_perl.pl\",\n \"file_name\": \"fixture_perl.pl\",\n \"file_extension\": \".pl\",\n \"language_id\": \"perl\",\n \"language_name\": \"Perl\",\n \"status\": \"analyzed\",\n \"exists\": true,\n \"is_file\": true,\n \"import_count\": 5,\n \"symbol_count\": 30,\n \"comment_count\": 97,\n \"standalone_comment_count\": 44,\n \"doxygen_field_count\": 62,\n \"file_description_text\": \"@file fixture_perl.pl\",\n \"imports\": [\n {\n \"start_line_number\": 18,\n \"end_line_number\": 18,\n \"line_range\": [\n 18,\n 18\n ],\n \"import_name\": \"strict\",\n \"statement_text\": \"use strict;\"\n },\n {\n \"start_line_number\": 19,\n \"end_line_number\": 19,\n \"line_range\": [\n 19,\n 19\n ],\n \"import_name\": \"warnings\",\n \"statement_text\": \"use warnings;\"\n },\n {\n \"start_line_number\": 20,\n \"end_line_number\": 20,\n \"line_range\": [\n 20,\n 20\n ],\n \"import_name\": \"Carp qw(croak confess)\",\n \"statement_text\": \"use Carp qw(croak confess);\"\n },\n {\n \"start_line_number\": 21,\n \"end_line_number\": 21,\n \"line_range\": [\n 21,\n 21\n ],\n \"import_name\": \"Exporter\",\n \"statement_text\": \"require Exporter;\"\n },\n {\n \"start_line_number\": 257,\n \"end_line_number\": 257,\n \"line_range\": [\n 257,\n 257\n ],\n \"import_name\": \"lib 'lib'\",\n \"statement_text\": \"use lib 'lib';\"\n }\n ],\n \"symbols\": [\n {\n \"start_line_number\": 16,\n \"end_line_number\": 16,\n \"line_range\": [\n 16,\n 16\n ],\n \"declaration_order_index\": 0,\n \"symbol_name\": \"MyPackage\",\n \"qualified_name\": \"MyPackage\",\n \"symbol_kind\": \"MODULE\",\n \"type_label\": \"MODULE\",\n \"signature_text\": \"package MyPackage\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Comprehensive Perl test fixture for parser validation.\",\n \"doxygen\": {\n \"brief\": [\n \"Comprehensive Perl test fixture for parser validation.\",\n \"Documentation block for the fixture module.\"\n ],\n \"details\": [\n \"Covers OOP with bless, Moose-like attributes, closures,\\nhere-docs, wantarray, dispatch tables, prototypes, AUTOLOAD,\\nand regular expressions.\\nSingle line comment\\n=pod\",\n \"This module demonstrates advanced Perl constructs including\\nobject-oriented patterns, closures, and metaprogramming.\\n=cut\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 22,\n \"end_line_number\": 22,\n \"line_range\": [\n 22,\n 22\n ],\n \"declaration_order_index\": 1,\n \"symbol_name\": \"MAX_SIZE\",\n \"qualified_name\": \"MAX_SIZE\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"use constant MAX_SIZE => 100\",\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\": 48,\n \"end_line_number\": 48,\n \"line_range\": [\n 48,\n 48\n ],\n \"declaration_order_index\": 2,\n \"symbol_name\": \"new\",\n \"qualified_name\": \"new\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"sub new\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Create a new MyPackage instance.\",\n \"doxygen\": {\n \"brief\": [\n \"Create a new MyPackage instance.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"class\",\n \"description\": \"The class name (implicit first argument).\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"%args\",\n \"description\": \"Named arguments: name (required), age (optional).\"\n }\n ],\n \"returns\": [\n \"Blessed hashref instance.\\n=cut\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 62,\n \"end_line_number\": 62,\n \"line_range\": [\n 62,\n 62\n ],\n \"declaration_order_index\": 3,\n \"symbol_name\": \"name\",\n \"qualified_name\": \"name\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"sub name\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Accessor for the name attribute.\",\n \"doxygen\": {\n \"brief\": [\n \"Accessor for the name attribute.\"\n ],\n \"returns\": [\n \"The instance name string.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 74,\n \"end_line_number\": 74,\n \"line_range\": [\n 74,\n 74\n ],\n \"declaration_order_index\": 4,\n \"symbol_name\": \"is_valid\",\n \"qualified_name\": \"is_valid\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"sub is_valid\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Check if the instance is in a valid state.\",\n \"doxygen\": {\n \"brief\": [\n \"Check if the instance is in a valid state.\"\n ],\n \"returns\": [\n \"1 if valid, 0 otherwise.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 83,\n \"end_line_number\": 83,\n \"line_range\": [\n 83,\n 83\n ],\n \"declaration_order_index\": 5,\n \"symbol_name\": \"greet\",\n \"qualified_name\": \"greet\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"sub greet\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Print a greeting to stdout.\",\n \"doxygen\": {\n \"brief\": [\n \"Print a greeting to stdout.\"\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\": 95,\n \"end_line_number\": 95,\n \"line_range\": [\n 95,\n 95\n ],\n \"declaration_order_index\": 6,\n \"symbol_name\": \"process\",\n \"qualified_name\": \"process\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"sub process\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Process data and return result.\",\n \"doxygen\": {\n \"brief\": [\n \"Process data and return result.\"\n ],\n \"returns\": [\n \"1 indicating success.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 102,\n \"end_line_number\": 102,\n \"line_range\": [\n 102,\n 102\n ],\n \"declaration_order_index\": 7,\n \"symbol_name\": \"format_output\",\n \"qualified_name\": \"format_output\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"sub format_output\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Format output depending on context (list vs scalar).\",\n \"doxygen\": {\n \"brief\": [\n \"Format output depending on context (list vs scalar).\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"@items\",\n \"description\": \"List of items to format.\"\n }\n ],\n \"returns\": [\n \"In list context: formatted items. In scalar: count.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 115,\n \"end_line_number\": 115,\n \"line_range\": [\n 115,\n 115\n ],\n \"declaration_order_index\": 8,\n \"symbol_name\": \"helper\",\n \"qualified_name\": \"helper\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"sub helper\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Standalone helper for internal use.\",\n \"doxygen\": {\n \"brief\": [\n \"Standalone helper for internal use.\"\n ],\n \"returns\": [\n \"Always returns \\\"ok\\\".\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 124,\n \"end_line_number\": 124,\n \"line_range\": [\n 124,\n 124\n ],\n \"declaration_order_index\": 9,\n \"symbol_name\": \"extract_emails\",\n \"qualified_name\": \"extract_emails\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"sub extract_emails\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Extract all email addresses from text.\",\n \"doxygen\": {\n \"brief\": [\n \"Extract all email addresses from text.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"$text\",\n \"description\": \"Input text to scan.\"\n }\n ],\n \"returns\": [\n \"List of matched email addresses.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 139,\n \"end_line_number\": 139,\n \"line_range\": [\n 139,\n 139\n ],\n \"declaration_order_index\": 10,\n \"symbol_name\": \"replace_all\",\n \"qualified_name\": \"replace_all\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"sub replace_all\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Replace all occurrences of a pattern in text.\",\n \"doxygen\": {\n \"brief\": [\n \"Replace all occurrences of a pattern in text.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"$text\",\n \"description\": \"Input text.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"$pattern\",\n \"description\": \"Regex pattern to find.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"$replacement\",\n \"description\": \"Replacement string.\"\n }\n ],\n \"returns\": [\n \"Modified text with substitutions applied.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 150,\n \"end_line_number\": 150,\n \"line_range\": [\n 150,\n 150\n ],\n \"declaration_order_index\": 11,\n \"symbol_name\": \"make_multiplier\",\n \"qualified_name\": \"make_multiplier\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"sub make_multiplier\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Create a multiplier closure.\",\n \"doxygen\": {\n \"brief\": [\n \"Create a multiplier closure.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"$factor\",\n \"description\": \"The multiplication factor.\"\n }\n ],\n \"returns\": [\n \"Coderef that multiplies its argument by factor.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 178,\n \"end_line_number\": 178,\n \"line_range\": [\n 178,\n 178\n ],\n \"declaration_order_index\": 12,\n \"symbol_name\": \"dispatch\",\n \"qualified_name\": \"dispatch\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"sub dispatch\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"@param $b Second operand.\",\n \"attached_comment_lines\": [\n \"@param $b Second operand.\",\n \"@return Result of the operation.\",\n \"@raise Croaks if operation is unknown.\"\n ],\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 190,\n \"end_line_number\": 190,\n \"line_range\": [\n 190,\n 190\n ],\n \"declaration_order_index\": 13,\n \"symbol_name\": \"generate_template\",\n \"qualified_name\": \"generate_template\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"sub generate_template\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Generate a template string using a here-document.\",\n \"doxygen\": {\n \"brief\": [\n \"Generate a template string using a here-document.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"$name\",\n \"description\": \"Name to insert into the template.\"\n }\n ],\n \"returns\": [\n \"Formatted multi-line string.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 210,\n \"end_line_number\": 210,\n \"line_range\": [\n 210,\n 210\n ],\n \"declaration_order_index\": 14,\n \"symbol_name\": \"AUTOLOAD\",\n \"qualified_name\": \"AUTOLOAD\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"sub AUTOLOAD\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Handle undefined method calls dynamically.\",\n \"doxygen\": {\n \"brief\": [\n \"Handle undefined method calls dynamically.\"\n ],\n \"details\": [\n \"Methods named get_* return the corresponding attribute.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"@args\",\n \"description\": \"Arguments passed to the auto-loaded method.\"\n }\n ],\n \"returns\": [\n \"The attribute value or undef.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 230,\n \"end_line_number\": 230,\n \"line_range\": [\n 230,\n 230\n ],\n \"declaration_order_index\": 15,\n \"symbol_name\": \"safe_execute\",\n \"qualified_name\": \"safe_execute\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"sub safe_execute\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Execute a block with error trapping.\",\n \"doxygen\": {\n \"brief\": [\n \"Execute a block with error trapping.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"$code\",\n \"description\": \"Coderef to execute.\"\n }\n ],\n \"returns\": [\n \"Result of execution or undef on error.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 248,\n \"end_line_number\": 248,\n \"line_range\": [\n 248,\n 248\n ],\n \"declaration_order_index\": 16,\n \"symbol_name\": \"Extra::One\",\n \"qualified_name\": \"Extra::One\",\n \"symbol_kind\": \"MODULE\",\n \"type_label\": \"MODULE\",\n \"signature_text\": \"package Extra::One\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"=pod coverage extension block =cut\",\n \"attached_comment_lines\": [\n \"=pod\",\n \"coverage extension block\",\n \"=cut\"\n ],\n \"body_comment_entries\": [],\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\": 17,\n \"symbol_name\": \"Extra::Two\",\n \"qualified_name\": \"Extra::Two\",\n \"symbol_kind\": \"MODULE\",\n \"type_label\": \"MODULE\",\n \"signature_text\": \"package Extra::Two\",\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\": 250,\n \"end_line_number\": 250,\n \"line_range\": [\n 250,\n 250\n ],\n \"declaration_order_index\": 18,\n \"symbol_name\": \"Extra::Three\",\n \"qualified_name\": \"Extra::Three\",\n \"symbol_kind\": \"MODULE\",\n \"type_label\": \"MODULE\",\n \"signature_text\": \"package Extra::Three\",\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\": 251,\n \"end_line_number\": 251,\n \"line_range\": [\n 251,\n 251\n ],\n \"declaration_order_index\": 19,\n \"symbol_name\": \"Extra::Four\",\n \"qualified_name\": \"Extra::Four\",\n \"symbol_kind\": \"MODULE\",\n \"type_label\": \"MODULE\",\n \"signature_text\": \"package Extra::Four\",\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\": 252,\n \"end_line_number\": 252,\n \"line_range\": [\n 252,\n 252\n ],\n \"declaration_order_index\": 20,\n \"symbol_name\": \"RETRY_LIMIT\",\n \"qualified_name\": \"RETRY_LIMIT\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"use constant RETRY_LIMIT => 5\",\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\": 253,\n \"end_line_number\": 253,\n \"line_range\": [\n 253,\n 253\n ],\n \"declaration_order_index\": 21,\n \"symbol_name\": \"API_HOST\",\n \"qualified_name\": \"API_HOST\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"use constant API_HOST => 'localhost'\",\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\": 254,\n \"end_line_number\": 254,\n \"line_range\": [\n 254,\n 254\n ],\n \"declaration_order_index\": 22,\n \"symbol_name\": \"FEATURE_FLAG\",\n \"qualified_name\": \"FEATURE_FLAG\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"use constant FEATURE_FLAG => 1\",\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\": 255,\n \"end_line_number\": 255,\n \"line_range\": [\n 255,\n 255\n ],\n \"declaration_order_index\": 23,\n \"symbol_name\": \"CACHE_SIZE\",\n \"qualified_name\": \"CACHE_SIZE\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"use constant CACHE_SIZE => 256\",\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\": 256,\n \"end_line_number\": 256,\n \"line_range\": [\n 256,\n 256\n ],\n \"declaration_order_index\": 24,\n \"symbol_name\": \"DEFAULT_USER\",\n \"qualified_name\": \"DEFAULT_USER\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"use constant DEFAULT_USER => 'guest'\",\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\": 265,\n \"end_line_number\": 265,\n \"line_range\": [\n 265,\n 265\n ],\n \"declaration_order_index\": 25,\n \"symbol_name\": \"req_cover_perl_1\",\n \"qualified_name\": \"req_cover_perl_1\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"sub req_cover_perl_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\": 275,\n \"end_line_number\": 275,\n \"line_range\": [\n 275,\n 275\n ],\n \"declaration_order_index\": 26,\n \"symbol_name\": \"req_cover_perl_2\",\n \"qualified_name\": \"req_cover_perl_2\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"sub req_cover_perl_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\": 285,\n \"end_line_number\": 285,\n \"line_range\": [\n 285,\n 285\n ],\n \"declaration_order_index\": 27,\n \"symbol_name\": \"req_cover_perl_3\",\n \"qualified_name\": \"req_cover_perl_3\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"sub req_cover_perl_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\": 295,\n \"end_line_number\": 295,\n \"line_range\": [\n 295,\n 295\n ],\n \"declaration_order_index\": 28,\n \"symbol_name\": \"req_cover_perl_4\",\n \"qualified_name\": \"req_cover_perl_4\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"sub req_cover_perl_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\": 305,\n \"end_line_number\": 305,\n \"line_range\": [\n 305,\n 305\n ],\n \"declaration_order_index\": 29,\n \"symbol_name\": \"req_cover_perl_5\",\n \"qualified_name\": \"req_cover_perl_5\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"sub req_cover_perl_5\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Coverage helper construct 5.\",\n \"doxygen\": {\n \"brief\": [\n \"Coverage helper construct 5.\"\n ],\n \"details\": [\n \"Provides deterministic fixture-level Doxygen coverage block 5.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"value\",\n \"description\": \"Input value for helper construct 5.\"\n }\n ],\n \"returns\": [\n \"Output value for helper construct 5.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n }\n ],\n \"standalone_comments\": [\n {\n \"start_line_number\": 2,\n \"end_line_number\": 2,\n \"line_range\": [\n 2,\n 2\n ],\n \"text\": \"@file fixture_perl.pl\",\n \"text_lines\": [\n \"@file fixture_perl.pl\"\n ]\n },\n {\n \"start_line_number\": 3,\n \"end_line_number\": 3,\n \"line_range\": [\n 3,\n 3\n ],\n \"text\": \"@brief Comprehensive Perl test fixture for parser validation.\",\n \"text_lines\": [\n \"@brief Comprehensive Perl test fixture for parser validation.\"\n ]\n },\n {\n \"start_line_number\": 4,\n \"end_line_number\": 4,\n \"line_range\": [\n 4,\n 4\n ],\n \"text\": \"@details Covers OOP with bless, Moose-like attributes, closures,\",\n \"text_lines\": [\n \"@details Covers OOP with bless, Moose-like attributes, closures,\"\n ]\n },\n {\n \"start_line_number\": 5,\n \"end_line_number\": 5,\n \"line_range\": [\n 5,\n 5\n ],\n \"text\": \"here-docs, wantarray, dispatch tables, prototypes, AUTOLOAD,\",\n \"text_lines\": [\n \"here-docs, wantarray, dispatch tables, prototypes, AUTOLOAD,\"\n ]\n },\n {\n \"start_line_number\": 6,\n \"end_line_number\": 6,\n \"line_range\": [\n 6,\n 6\n ],\n \"text\": \"and regular expressions.\",\n \"text_lines\": [\n \"and regular expressions.\"\n ]\n },\n {\n \"start_line_number\": 7,\n \"end_line_number\": 7,\n \"line_range\": [\n 7,\n 7\n ],\n \"text\": \"Single line comment\",\n \"text_lines\": [\n \"Single line comment\"\n ]\n },\n {\n \"start_line_number\": 28,\n \"end_line_number\": 28,\n \"line_range\": [\n 28,\n 28\n ],\n \"text\": \"@brief Module version string.\",\n \"text_lines\": [\n \"@brief Module version string.\"\n ]\n },\n {\n \"start_line_number\": 31,\n \"end_line_number\": 31,\n \"line_range\": [\n 31,\n 31\n ],\n \"text\": \"@brief Symbols exported by default.\",\n \"text_lines\": [\n \"@brief Symbols exported by default.\"\n ]\n },\n {\n \"start_line_number\": 34,\n \"end_line_number\": 34,\n \"line_range\": [\n 34,\n 34\n ],\n \"text\": \"@brief Symbols available on request.\",\n \"text_lines\": [\n \"@brief Symbols available on request.\"\n ]\n },\n {\n \"start_line_number\": 37,\n \"end_line_number\": 37,\n \"line_range\": [\n 37,\n 37\n ],\n \"text\": \"── Constructor and OOP ──────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Constructor and OOP ──────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 65,\n \"end_line_number\": 65,\n \"line_range\": [\n 65,\n 65\n ],\n \"text\": \"Setter mode\",\n \"text_lines\": [\n \"Setter mode\"\n ]\n },\n {\n \"start_line_number\": 79,\n \"end_line_number\": 79,\n \"line_range\": [\n 79,\n 79\n ],\n \"text\": \"── Functions ────────────────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Functions ────────────────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 85,\n \"end_line_number\": 85,\n \"line_range\": [\n 85,\n 85\n ],\n \"text\": \"Validate input before printing\",\n \"text_lines\": [\n \"Validate input before printing\"\n ]\n },\n {\n \"start_line_number\": 105,\n \"end_line_number\": 105,\n \"line_range\": [\n 105,\n 105\n ],\n \"text\": \"List context — return formatted items\",\n \"text_lines\": [\n \"List context — return formatted items\"\n ]\n },\n {\n \"start_line_number\": 108,\n \"end_line_number\": 108,\n \"line_range\": [\n 108,\n 108\n ],\n \"text\": \"Scalar context — return count\",\n \"text_lines\": [\n \"Scalar context — return count\"\n ]\n },\n {\n \"start_line_number\": 119,\n \"end_line_number\": 119,\n \"line_range\": [\n 119,\n 119\n ],\n \"text\": \"── Regular expression functions ─────────────────────────────────────\",\n \"text_lines\": [\n \"── Regular expression functions ─────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 127,\n \"end_line_number\": 127,\n \"line_range\": [\n 127,\n 127\n ],\n \"text\": \"Match standard email pattern\",\n \"text_lines\": [\n \"Match standard email pattern\"\n ]\n },\n {\n \"start_line_number\": 134,\n \"end_line_number\": 134,\n \"line_range\": [\n 134,\n 134\n ],\n \"text\": \"@brief Replace all occurrences of a pattern in text.\",\n \"text_lines\": [\n \"@brief Replace all occurrences of a pattern in text.\"\n ]\n },\n {\n \"start_line_number\": 135,\n \"end_line_number\": 135,\n \"line_range\": [\n 135,\n 135\n ],\n \"text\": \"@param $text Input text.\",\n \"text_lines\": [\n \"@param $text Input text.\"\n ]\n },\n {\n \"start_line_number\": 145,\n \"end_line_number\": 145,\n \"line_range\": [\n 145,\n 145\n ],\n \"text\": \"── Closure factory ──────────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Closure factory ──────────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 152,\n \"end_line_number\": 152,\n \"line_range\": [\n 152,\n 152\n ],\n \"text\": \"Capture $factor in the returned closure\",\n \"text_lines\": [\n \"Capture $factor in the returned closure\"\n ]\n },\n {\n \"start_line_number\": 159,\n \"end_line_number\": 159,\n \"line_range\": [\n 159,\n 159\n ],\n \"text\": \"── Dispatch table ───────────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Dispatch table ───────────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 161,\n \"end_line_number\": 161,\n \"line_range\": [\n 161,\n 161\n ],\n \"text\": \"@brief Command dispatch table mapping names to handler coderefs.\",\n \"text_lines\": [\n \"@brief Command dispatch table mapping names to handler coderefs.\"\n ]\n },\n {\n \"start_line_number\": 172,\n \"end_line_number\": 172,\n \"line_range\": [\n 172,\n 172\n ],\n \"text\": \"@brief Execute a named operation from the dispatch table.\",\n \"text_lines\": [\n \"@brief Execute a named operation from the dispatch table.\"\n ]\n },\n {\n \"start_line_number\": 173,\n \"end_line_number\": 173,\n \"line_range\": [\n 173,\n 173\n ],\n \"text\": \"@param $op Operation name (add, sub, mul, div).\",\n \"text_lines\": [\n \"@param $op Operation name (add, sub, mul, div).\"\n ]\n },\n {\n \"start_line_number\": 174,\n \"end_line_number\": 174,\n \"line_range\": [\n 174,\n 174\n ],\n \"text\": \"@param $a First operand.\",\n \"text_lines\": [\n \"@param $a First operand.\"\n ]\n },\n {\n \"start_line_number\": 185,\n \"end_line_number\": 185,\n \"line_range\": [\n 185,\n 185\n ],\n \"text\": \"── Here-doc ─────────────────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Here-doc ─────────────────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 204,\n \"end_line_number\": 204,\n \"line_range\": [\n 204,\n 204\n ],\n \"text\": \"── AUTOLOAD for dynamic dispatch ────────────────────────────────────\",\n \"text_lines\": [\n \"── AUTOLOAD for dynamic dispatch ────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 206,\n \"end_line_number\": 206,\n \"line_range\": [\n 206,\n 206\n ],\n \"text\": \"@brief Handle undefined method calls dynamically.\",\n \"text_lines\": [\n \"@brief Handle undefined method calls dynamically.\"\n ]\n },\n {\n \"start_line_number\": 213,\n \"end_line_number\": 213,\n \"line_range\": [\n 213,\n 213\n ],\n \"text\": \"Extract method name from fully qualified AUTOLOAD\",\n \"text_lines\": [\n \"Extract method name from fully qualified AUTOLOAD\"\n ]\n },\n {\n \"start_line_number\": 225,\n \"end_line_number\": 225,\n \"line_range\": [\n 225,\n 225\n ],\n \"text\": \"── Error handling ───────────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Error handling ───────────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 236,\n \"end_line_number\": 236,\n \"line_range\": [\n 236,\n 236\n ],\n \"text\": \"Log and suppress error\",\n \"text_lines\": [\n \"Log and suppress error\"\n ]\n },\n {\n \"start_line_number\": 259,\n \"end_line_number\": 259,\n \"line_range\": [\n 259,\n 259\n ],\n \"text\": \"REQ-COVER-SRS-231 START\",\n \"text_lines\": [\n \"REQ-COVER-SRS-231 START\"\n ]\n },\n {\n \"start_line_number\": 260,\n \"end_line_number\": 260,\n \"line_range\": [\n 260,\n 260\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\": 261,\n \"end_line_number\": 261,\n \"line_range\": [\n 261,\n 261\n ],\n \"text\": \"@brief Coverage helper construct 1.\",\n \"text_lines\": [\n \"@brief Coverage helper construct 1.\"\n ]\n },\n {\n \"start_line_number\": 270,\n \"end_line_number\": 270,\n \"line_range\": [\n 270,\n 270\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\": 271,\n \"end_line_number\": 271,\n \"line_range\": [\n 271,\n 271\n ],\n \"text\": \"@brief Coverage helper construct 2.\",\n \"text_lines\": [\n \"@brief Coverage helper construct 2.\"\n ]\n },\n {\n \"start_line_number\": 280,\n \"end_line_number\": 280,\n \"line_range\": [\n 280,\n 280\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\": 281,\n \"end_line_number\": 281,\n \"line_range\": [\n 281,\n 281\n ],\n \"text\": \"@brief Coverage helper construct 3.\",\n \"text_lines\": [\n \"@brief Coverage helper construct 3.\"\n ]\n },\n {\n \"start_line_number\": 290,\n \"end_line_number\": 290,\n \"line_range\": [\n 290,\n 290\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\": 291,\n \"end_line_number\": 291,\n \"line_range\": [\n 291,\n 291\n ],\n \"text\": \"@brief Coverage helper construct 4.\",\n \"text_lines\": [\n \"@brief Coverage helper construct 4.\"\n ]\n },\n {\n \"start_line_number\": 300,\n \"end_line_number\": 300,\n \"line_range\": [\n 300,\n 300\n ],\n \"text\": \"@REQ-COVER-SRS-231 block 5\",\n \"text_lines\": [\n \"@REQ-COVER-SRS-231 block 5\"\n ]\n },\n {\n \"start_line_number\": 301,\n \"end_line_number\": 301,\n \"line_range\": [\n 301,\n 301\n ],\n \"text\": \"@brief Coverage helper construct 5.\",\n \"text_lines\": [\n \"@brief Coverage helper construct 5.\"\n ]\n },\n {\n \"start_line_number\": 310,\n \"end_line_number\": 310,\n \"line_range\": [\n 310,\n 310\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_perl.pl | Perl | 310L | 30 symbols | 5 imports | 97 comments\n> Path: `tests/fixtures/fixture_perl.pl`\n\n## Imports\n```\nuse strict;\nuse warnings;\nuse Carp qw(croak confess);\nrequire Exporter;\nuse lib 'lib';\n```\n\n## Definitions\n\n- mod `package MyPackage;` (L16)\n- @brief Comprehensive Perl test fixture for parser validation.\n- @brief Documentation block for the fixture module.\n- @details Covers OOP with bless, Moose-like attributes, closures,\nhere-docs, wantarray, dispatch tables, prototypes, AUTOLOAD,\nand regular expressions.\nSingle line comment\n=pod\n- @details This module demonstrates advanced Perl constructs including\nobject-oriented patterns, closures, and metaprogramming.\n=cut\n- const `use constant MAX_SIZE => 100;` (L22)\n- fn `sub new {` (L48)\n- @brief Create a new MyPackage instance.\n- @param class The class name (implicit first argument).\n- @param %args Named arguments: name (required), age (optional).\n- @return Blessed hashref instance.\n=cut\n- fn `sub name {` (L62)\n- @brief Accessor for the name attribute.\n- @return The instance name string.\n- fn `sub is_valid {` (L74)\n- @brief Check if the instance is in a valid state.\n- @return 1 if valid, 0 otherwise.\n- fn `sub greet {` (L83)\n- @brief Print a greeting to stdout.\n- @param $name The person's name.\n- fn `sub process {` (L95)\n- @brief Process data and return result.\n- @return 1 indicating success.\n- fn `sub format_output {` (L102)\n- @brief Format output depending on context (list vs scalar).\n- @param @items List of items to format.\n- @return In list context: formatted items. In scalar: count.\n- fn `sub helper {` (L115)\n- @brief Standalone helper for internal use.\n- @return Always returns \"ok\".\n- fn `sub extract_emails {` (L124)\n- @brief Extract all email addresses from text.\n- @param $text Input text to scan.\n- @return List of matched email addresses.\n- fn `sub replace_all {` (L139)\n- @brief Replace all occurrences of a pattern in text.\n- @param $text Input text.\n- @param $pattern Regex pattern to find.\n- @param $replacement Replacement string.\n- @return Modified text with substitutions applied.\n- fn `sub make_multiplier {` (L150)\n- @brief Create a multiplier closure.\n- @param $factor The multiplication factor.\n- @return Coderef that multiplies its argument by factor.\n- fn `sub dispatch {` (L178)\n- fn `sub generate_template {` (L190)\n- @brief Generate a template string using a here-document.\n- @param $name Name to insert into the template.\n- @return Formatted multi-line string.\n- fn `sub AUTOLOAD {` (L210)\n- @brief Handle undefined method calls dynamically.\n- @details Methods named get_* return the corresponding attribute.\n- @param @args Arguments passed to the auto-loaded method.\n- @return The attribute value or undef.\n- fn `sub safe_execute {` (L230)\n- @brief Execute a block with error trapping.\n- @param $code Coderef to execute.\n- @return Result of execution or undef on error.\n- mod `package Extra::One;` (L248)\n- mod `package Extra::Two;` (L249)\n- mod `package Extra::Three;` (L250)\n- mod `package Extra::Four;` (L251)\n- const `use constant RETRY_LIMIT => 5;` (L252)\n- const `use constant API_HOST => 'localhost';` (L253)\n- const `use constant FEATURE_FLAG => 1;` (L254)\n- const `use constant CACHE_SIZE => 256;` (L255)\n- const `use constant DEFAULT_USER => 'guest';` (L256)\n- fn `sub req_cover_perl_1 {` (L265)\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 `sub req_cover_perl_2 {` (L275)\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 `sub req_cover_perl_3 {` (L285)\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 `sub req_cover_perl_4 {` (L295)\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 `sub req_cover_perl_5 {` (L305)\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|`MyPackage`|mod||16||\n|`MAX_SIZE`|const||22||\n|`new`|fn||48|sub new|\n|`name`|fn||62|sub name|\n|`is_valid`|fn||74|sub is_valid|\n|`greet`|fn||83|sub greet|\n|`process`|fn||95|sub process|\n|`format_output`|fn||102|sub format_output|\n|`helper`|fn||115|sub helper|\n|`extract_emails`|fn||124|sub extract_emails|\n|`replace_all`|fn||139|sub replace_all|\n|`make_multiplier`|fn||150|sub make_multiplier|\n|`dispatch`|fn||178|sub dispatch|\n|`generate_template`|fn||190|sub generate_template|\n|`AUTOLOAD`|fn||210|sub AUTOLOAD|\n|`safe_execute`|fn||230|sub safe_execute|\n|`Extra::One`|mod||248||\n|`Extra::Two`|mod||249||\n|`Extra::Three`|mod||250||\n|`Extra::Four`|mod||251||\n|`RETRY_LIMIT`|const||252||\n|`API_HOST`|const||253||\n|`FEATURE_FLAG`|const||254||\n|`CACHE_SIZE`|const||255||\n|`DEFAULT_USER`|const||256||\n|`req_cover_perl_1`|fn||265|sub req_cover_perl_1|\n|`req_cover_perl_2`|fn||275|sub req_cover_perl_2|\n|`req_cover_perl_3`|fn||285|sub req_cover_perl_3|\n|`req_cover_perl_4`|fn||295|sub req_cover_perl_4|\n|`req_cover_perl_5`|fn||305|sub req_cover_perl_5|\n\n",
|
|
4
4
|
"stderr": ""
|
|
5
5
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
2
|
"code": 0,
|
|
3
|
-
"stdout": "{\n \"request\": {\n \"tool_name\": \"files-references\",\n \"scope\": \"explicit-files\",\n \"base_dir_path\": \"<ROOT>\",\n \"source_directory_count\": 0,\n \"source_directory_paths\": [],\n \"requested_file_count\": 1,\n \"requested_input_paths\": [\n \"tests/fixtures/fixture_php.php\"\n ],\n \"requested_canonical_paths\": [\n \"tests/fixtures/fixture_php.php\"\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\": 54,\n \"total_import_count\": 6,\n \"total_comment_count\": 70,\n \"total_standalone_comment_count\": 27,\n \"total_doxygen_field_count\": 108,\n \"symbol_kind_counts\": {\n \"CLASS\": 5,\n \"CONSTANT\": 5,\n \"FUNCTION\": 29,\n \"INTERFACE\": 5,\n \"NAMESPACE\": 5,\n \"TRAIT\": 5\n }\n },\n \"repository\": {\n \"root_directory_path\": \"<ROOT>\",\n \"source_directory_paths\": [],\n \"file_count\": 1,\n \"file_canonical_paths\": [\n \"tests/fixtures/fixture_php.php\"\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_php.php\",\n \"relative_path\": \"tests/fixtures/fixture_php.php\",\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\": 433,\n \"line_range\": [\n 1,\n 433\n ],\n \"request_index\": 0,\n \"input_path\": \"tests/fixtures/fixture_php.php\",\n \"canonical_path\": \"tests/fixtures/fixture_php.php\",\n \"absolute_path\": \"<ROOT>/tests/fixtures/fixture_php.php\",\n \"file_name\": \"fixture_php.php\",\n \"file_extension\": \".php\",\n \"language_id\": \"php\",\n \"language_name\": \"PHP\",\n \"status\": \"analyzed\",\n \"exists\": true,\n \"is_file\": true,\n \"import_count\": 6,\n \"symbol_count\": 54,\n \"comment_count\": 70,\n \"standalone_comment_count\": 27,\n \"doxygen_field_count\": 108,\n \"file_doxygen\": {\n \"brief\": [\n \"Comprehensive PHP test fixture for parser validation.\"\n ],\n \"details\": [\n \"Covers enums with methods, union/intersection types, readonly\\nproperties, constructor promotion, arrow functions, match expressions,\\nfirst-class callables, attributes, fibers, and named arguments.\"\n ]\n },\n \"imports\": [\n {\n \"start_line_number\": 14,\n \"end_line_number\": 14,\n \"line_range\": [\n 14,\n 14\n ],\n \"import_name\": \"App\\\\Contracts\\\\Repository\",\n \"statement_text\": \"use App\\\\Contracts\\\\Repository;\"\n },\n {\n \"start_line_number\": 15,\n \"end_line_number\": 15,\n \"line_range\": [\n 15,\n 15\n ],\n \"import_name\": \"App\\\\Events\\\\{ModelCreated, ModelDeleted}\",\n \"statement_text\": \"use App\\\\Events\\\\{ModelCreated, ModelDeleted};\"\n },\n {\n \"start_line_number\": 16,\n \"end_line_number\": 16,\n \"line_range\": [\n 16,\n 16\n ],\n \"import_name\": \"Psr\\\\Log\\\\LoggerInterface\",\n \"statement_text\": \"use Psr\\\\Log\\\\LoggerInterface;\"\n },\n {\n \"start_line_number\": 17,\n \"end_line_number\": 17,\n \"line_range\": [\n 17,\n 17\n ],\n \"import_name\": \"'config.php'\",\n \"statement_text\": \"require_once 'config.php';\"\n },\n {\n \"start_line_number\": 276,\n \"end_line_number\": 276,\n \"line_range\": [\n 276,\n 276\n ],\n \"import_name\": \"Cacheable\",\n \"statement_text\": \"use Cacheable;\"\n },\n {\n \"start_line_number\": 277,\n \"end_line_number\": 277,\n \"line_range\": [\n 277,\n 277\n ],\n \"import_name\": \"SoftDeletable\",\n \"statement_text\": \"use SoftDeletable;\"\n }\n ],\n \"symbols\": [\n {\n \"start_line_number\": 12,\n \"end_line_number\": 15,\n \"line_range\": [\n 12,\n 15\n ],\n \"declaration_order_index\": 0,\n \"symbol_name\": \"App\\\\Models\",\n \"qualified_name\": \"App\\\\Models\",\n \"symbol_kind\": \"NAMESPACE\",\n \"type_label\": \"NAMESPACE\",\n \"signature_text\": \"namespace App\\\\Models\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Single line comment\",\n \"attached_comment_lines\": [\n \"Single line comment\",\n \"Multi-line\",\n \"comment\"\n ],\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 22,\n \"end_line_number\": 22,\n \"line_range\": [\n 22,\n 22\n ],\n \"declaration_order_index\": 1,\n \"symbol_name\": \"VERSION\",\n \"qualified_name\": \"VERSION\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"const VERSION = \\\"1.0\\\"\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Application version string. */\",\n \"doxygen\": {\n \"brief\": [\n \"Application version string. */\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 25,\n \"end_line_number\": 25,\n \"line_range\": [\n 25,\n 25\n ],\n \"declaration_order_index\": 2,\n \"symbol_name\": \"MAX_PER_PAGE\",\n \"qualified_name\": \"MAX_PER_PAGE\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"const MAX_PER_PAGE = 50\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Maximum number of query results per page. */\",\n \"doxygen\": {\n \"brief\": [\n \"Maximum number of query results per page. */\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 45,\n \"end_line_number\": 47,\n \"line_range\": [\n 45,\n 47\n ],\n \"declaration_order_index\": 3,\n \"symbol_name\": \"isActive\",\n \"qualified_name\": \"isActive\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function isActive(): bool\",\n \"visibility\": \"pub\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Check if the status represents an active state.\",\n \"doxygen\": {\n \"brief\": [\n \"Check if the status represents an active state.\"\n ],\n \"returns\": [\n \"bool True if the entity is publicly visible.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 46,\n \"text\": \"return $this === self::Published;\"\n }\n ]\n },\n {\n \"start_line_number\": 53,\n \"end_line_number\": 59,\n \"line_range\": [\n 53,\n 59\n ],\n \"declaration_order_index\": 4,\n \"symbol_name\": \"label\",\n \"qualified_name\": \"label\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function label(): string\",\n \"visibility\": \"pub\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Get a human-readable label for display.\",\n \"doxygen\": {\n \"brief\": [\n \"Get a human-readable label for display.\"\n ],\n \"returns\": [\n \"string Formatted status label.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 54,\n \"text\": \"return match($this) {\"\n }\n ]\n },\n {\n \"start_line_number\": 69,\n \"end_line_number\": 111,\n \"line_range\": [\n 69,\n 111\n ],\n \"declaration_order_index\": 5,\n \"symbol_name\": \"BaseModel\",\n \"qualified_name\": \"BaseModel\",\n \"symbol_kind\": \"CLASS\",\n \"type_label\": \"CLASS\",\n \"signature_text\": \"abstract class BaseModel\",\n \"child_symbol_names\": [\n \"__construct\",\n \"save\",\n \"validateConstraints\"\n ],\n \"child_qualified_names\": [\n \"BaseModel.__construct\",\n \"BaseModel.save\",\n \"BaseModel.validateConstraints\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Abstract base model with common persistence operations.\",\n \"doxygen\": {\n \"brief\": [\n \"Abstract base model with common persistence operations.\",\n \"Construct a model with promoted properties.\"\n ],\n \"details\": [\n \"Uses constructor promotion for compact field declaration.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"int\",\n \"description\": \"$id Unique identifier (readonly after construction).\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"\\\\DateTimeImmutable\",\n \"description\": \"$createdAt Timestamp of creation.\"\n }\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 70,\n \"end_line_number\": 74,\n \"line_range\": [\n 70,\n 74\n ],\n \"text\": \"@brief Construct a model with promoted properties. @param int $id Unique identifier (readonly after construction). @param \\\\DateTimeImmutable $createdAt Timestamp of creation.\",\n \"text_lines\": [\n \"@brief Construct a model with promoted properties. @param int $id Unique identifier (readonly after construction). @param \\\\DateTimeImmutable $createdAt Timestamp of creation.\"\n ]\n },\n {\n \"start_line_number\": 80,\n \"end_line_number\": 83,\n \"line_range\": [\n 80,\n 83\n ],\n \"text\": \"@brief Persist the model to the data store. @return bool True if save succeeded.\",\n \"text_lines\": [\n \"@brief Persist the model to the data store. @return bool True if save succeeded.\"\n ]\n },\n {\n \"start_line_number\": 85,\n \"end_line_number\": 85,\n \"line_range\": [\n 85,\n 85\n ],\n \"text\": \"Validate before persisting\",\n \"text_lines\": [\n \"Validate before persisting\"\n ]\n },\n {\n \"start_line_number\": 92,\n \"end_line_number\": 95,\n \"line_range\": [\n 92,\n 95\n ],\n \"text\": \"@brief Validate model state before persistence. @return bool True if model is valid.\",\n \"text_lines\": [\n \"@brief Validate model state before persistence. @return bool True if model is valid.\"\n ]\n },\n {\n \"start_line_number\": 98,\n \"end_line_number\": 101,\n \"line_range\": [\n 98,\n 101\n ],\n \"text\": \"@brief Internal validation helper with type narrowing. @return bool True if entity passes all constraint checks.\",\n \"text_lines\": [\n \"@brief Internal validation helper with type narrowing. @return bool True if entity passes all constraint checks.\"\n ]\n },\n {\n \"start_line_number\": 106,\n \"end_line_number\": 109,\n \"line_range\": [\n 106,\n 109\n ],\n \"text\": \"@brief Convert model to array representation. @return array<string, mixed> Associative array of model properties.\",\n \"text_lines\": [\n \"@brief Convert model to array representation. @return array<string, mixed> Associative array of model properties.\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 87,\n \"text\": \"return false;\"\n },\n {\n \"line_number\": 89,\n \"text\": \"return true;\"\n },\n {\n \"line_number\": 103,\n \"text\": \"return true;\"\n }\n ]\n },\n {\n \"start_line_number\": 75,\n \"end_line_number\": 78,\n \"line_range\": [\n 75,\n 78\n ],\n \"declaration_order_index\": 6,\n \"symbol_name\": \"__construct\",\n \"qualified_name\": \"BaseModel.__construct\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function __construct(\",\n \"visibility\": \"pub\",\n \"parent_symbol_name\": \"BaseModel\",\n \"parent_qualified_name\": \"BaseModel\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Construct a model with promoted properties.\",\n \"doxygen\": {\n \"brief\": [\n \"Construct a model with promoted properties.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"int\",\n \"description\": \"$id Unique identifier (readonly after construction).\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"\\\\DateTimeImmutable\",\n \"description\": \"$createdAt Timestamp of creation.\"\n }\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 84,\n \"end_line_number\": 90,\n \"line_range\": [\n 84,\n 90\n ],\n \"declaration_order_index\": 7,\n \"symbol_name\": \"save\",\n \"qualified_name\": \"BaseModel.save\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function save(): bool\",\n \"visibility\": \"pub\",\n \"parent_symbol_name\": \"BaseModel\",\n \"parent_qualified_name\": \"BaseModel\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Persist the model to the data store.\",\n \"doxygen\": {\n \"brief\": [\n \"Persist the model to the data store.\"\n ],\n \"returns\": [\n \"bool True if save succeeded.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 85,\n \"end_line_number\": 85,\n \"line_range\": [\n 85,\n 85\n ],\n \"text\": \"Validate before persisting\",\n \"text_lines\": [\n \"Validate before persisting\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 87,\n \"text\": \"return false;\"\n },\n {\n \"line_number\": 89,\n \"text\": \"return true;\"\n }\n ]\n },\n {\n \"start_line_number\": 102,\n \"end_line_number\": 104,\n \"line_range\": [\n 102,\n 104\n ],\n \"declaration_order_index\": 8,\n \"symbol_name\": \"validateConstraints\",\n \"qualified_name\": \"BaseModel.validateConstraints\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"private static function validateConstraints(): bool\",\n \"visibility\": \"priv\",\n \"parent_symbol_name\": \"BaseModel\",\n \"parent_qualified_name\": \"BaseModel\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Internal validation helper with type narrowing.\",\n \"doxygen\": {\n \"brief\": [\n \"Internal validation helper with type narrowing.\"\n ],\n \"returns\": [\n \"bool True if entity passes all constraint checks.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 103,\n \"text\": \"return true;\"\n }\n ]\n },\n {\n \"start_line_number\": 120,\n \"end_line_number\": 179,\n \"line_range\": [\n 120,\n 179\n ],\n \"declaration_order_index\": 9,\n \"symbol_name\": \"User\",\n \"qualified_name\": \"User\",\n \"symbol_kind\": \"CLASS\",\n \"type_label\": \"CLASS\",\n \"signature_text\": \"final class User extends BaseModel\",\n \"child_symbol_names\": [\n \"__construct\",\n \"getName\",\n \"getIdentifier\",\n \"validate\",\n \"toArray\"\n ],\n \"child_qualified_names\": [\n \"User.__construct\",\n \"User.getName\",\n \"User.getIdentifier\",\n \"User.validate\",\n \"User.toArray\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Concrete user entity with union and intersection types.\",\n \"doxygen\": {\n \"brief\": [\n \"Concrete user entity with union and intersection types.\",\n \"User's display name.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 121,\n \"end_line_number\": 121,\n \"line_range\": [\n 121,\n 121\n ],\n \"text\": \"@brief User's display name.\",\n \"text_lines\": [\n \"@brief User's display name.\"\n ]\n },\n {\n \"start_line_number\": 124,\n \"end_line_number\": 124,\n \"line_range\": [\n 124,\n 124\n ],\n \"text\": \"@brief User's email address or null if unverified.\",\n \"text_lines\": [\n \"@brief User's email address or null if unverified.\"\n ]\n },\n {\n \"start_line_number\": 127,\n \"end_line_number\": 132,\n \"line_range\": [\n 127,\n 132\n ],\n \"text\": \"@brief Construct a User with promoted and explicit properties. @param int $id Unique user ID. @param string $name Display name. @param string|null $email Optional email address.\",\n \"text_lines\": [\n \"@brief Construct a User with promoted and explicit properties. @param int $id Unique user ID. @param string $name Display name. @param string|null $email Optional email address.\"\n ]\n },\n {\n \"start_line_number\": 143,\n \"end_line_number\": 146,\n \"line_range\": [\n 143,\n 146\n ],\n \"text\": \"@brief Get the user's display name. @return string The user name.\",\n \"text_lines\": [\n \"@brief Get the user's display name. @return string The user name.\"\n ]\n },\n {\n \"start_line_number\": 151,\n \"end_line_number\": 154,\n \"line_range\": [\n 151,\n 154\n ],\n \"text\": \"@brief Get a value that may be string or int. @return string|int The identifier in either format.\",\n \"text_lines\": [\n \"@brief Get a value that may be string or int. @return string|int The identifier in either format.\"\n ]\n },\n {\n \"start_line_number\": 156,\n \"end_line_number\": 156,\n \"line_range\": [\n 156,\n 156\n ],\n \"text\": \"Return email if available, otherwise numeric ID\",\n \"text_lines\": [\n \"Return email if available, otherwise numeric ID\"\n ]\n },\n {\n \"start_line_number\": 160,\n \"end_line_number\": 163,\n \"line_range\": [\n 160,\n 163\n ],\n \"text\": \"@brief Validate user-specific constraints. @return bool True if name is non-empty.\",\n \"text_lines\": [\n \"@brief Validate user-specific constraints. @return bool True if name is non-empty.\"\n ]\n },\n {\n \"start_line_number\": 168,\n \"end_line_number\": 171,\n \"line_range\": [\n 168,\n 171\n ],\n \"text\": \"@brief Serialize user to array. @return array<string, mixed> User data array.\",\n \"text_lines\": [\n \"@brief Serialize user to array. @return array<string, mixed> User data array.\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 148,\n \"text\": \"return $this->name;\"\n },\n {\n \"line_number\": 157,\n \"text\": \"return $this->email ?? $this->id;\"\n },\n {\n \"line_number\": 165,\n \"text\": \"return strlen($this->name) > 0;\"\n },\n {\n \"line_number\": 173,\n \"text\": \"return [\"\n }\n ]\n },\n {\n \"start_line_number\": 133,\n \"end_line_number\": 141,\n \"line_range\": [\n 133,\n 141\n ],\n \"declaration_order_index\": 10,\n \"symbol_name\": \"__construct\",\n \"qualified_name\": \"User.__construct\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function __construct(\",\n \"visibility\": \"pub\",\n \"parent_symbol_name\": \"User\",\n \"parent_qualified_name\": \"User\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Construct a User with promoted and explicit properties.\",\n \"doxygen\": {\n \"brief\": [\n \"Construct a User with promoted and explicit properties.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"int\",\n \"description\": \"$id Unique user ID.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"string\",\n \"description\": \"$name Display name.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"string|null\",\n \"description\": \"$email Optional email address.\"\n }\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 147,\n \"end_line_number\": 149,\n \"line_range\": [\n 147,\n 149\n ],\n \"declaration_order_index\": 11,\n \"symbol_name\": \"getName\",\n \"qualified_name\": \"User.getName\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function getName(): string\",\n \"visibility\": \"pub\",\n \"parent_symbol_name\": \"User\",\n \"parent_qualified_name\": \"User\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Get the user's display name.\",\n \"doxygen\": {\n \"brief\": [\n \"Get the user's display name.\"\n ],\n \"returns\": [\n \"string The user name.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 148,\n \"text\": \"return $this->name;\"\n }\n ]\n },\n {\n \"start_line_number\": 155,\n \"end_line_number\": 158,\n \"line_range\": [\n 155,\n 158\n ],\n \"declaration_order_index\": 12,\n \"symbol_name\": \"getIdentifier\",\n \"qualified_name\": \"User.getIdentifier\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function getIdentifier(): string|int\",\n \"visibility\": \"pub\",\n \"parent_symbol_name\": \"User\",\n \"parent_qualified_name\": \"User\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Get a value that may be string or int.\",\n \"doxygen\": {\n \"brief\": [\n \"Get a value that may be string or int.\"\n ],\n \"returns\": [\n \"string|int The identifier in either format.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 156,\n \"end_line_number\": 156,\n \"line_range\": [\n 156,\n 156\n ],\n \"text\": \"Return email if available, otherwise numeric ID\",\n \"text_lines\": [\n \"Return email if available, otherwise numeric ID\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 157,\n \"text\": \"return $this->email ?? $this->id;\"\n }\n ]\n },\n {\n \"start_line_number\": 164,\n \"end_line_number\": 166,\n \"line_range\": [\n 164,\n 166\n ],\n \"declaration_order_index\": 13,\n \"symbol_name\": \"validate\",\n \"qualified_name\": \"User.validate\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"protected function validate(): bool\",\n \"visibility\": \"prot\",\n \"parent_symbol_name\": \"User\",\n \"parent_qualified_name\": \"User\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Validate user-specific constraints.\",\n \"doxygen\": {\n \"brief\": [\n \"Validate user-specific constraints.\"\n ],\n \"returns\": [\n \"bool True if name is non-empty.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 165,\n \"text\": \"return strlen($this->name) > 0;\"\n }\n ]\n },\n {\n \"start_line_number\": 172,\n \"end_line_number\": 178,\n \"line_range\": [\n 172,\n 178\n ],\n \"declaration_order_index\": 14,\n \"symbol_name\": \"toArray\",\n \"qualified_name\": \"User.toArray\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function toArray(): array\",\n \"visibility\": \"pub\",\n \"parent_symbol_name\": \"User\",\n \"parent_qualified_name\": \"User\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Serialize user to array.\",\n \"doxygen\": {\n \"brief\": [\n \"Serialize user to array.\"\n ],\n \"returns\": [\n \"array<string, mixed> User data array.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 173,\n \"text\": \"return [\"\n }\n ]\n },\n {\n \"start_line_number\": 187,\n \"end_line_number\": 207,\n \"line_range\": [\n 187,\n 207\n ],\n \"declaration_order_index\": 15,\n \"symbol_name\": \"Repo\",\n \"qualified_name\": \"Repo\",\n \"symbol_kind\": \"INTERFACE\",\n \"type_label\": \"INTERFACE\",\n \"signature_text\": \"interface Repo\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Generic repository interface for data access patterns.\",\n \"doxygen\": {\n \"brief\": [\n \"Generic repository interface for data access patterns.\",\n \"Retrieve all entities.\"\n ],\n \"returns\": [\n \"iterable<BaseModel> Collection of models.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 188,\n \"end_line_number\": 191,\n \"line_range\": [\n 188,\n 191\n ],\n \"text\": \"@brief Retrieve all entities. @return iterable<BaseModel> Collection of models.\",\n \"text_lines\": [\n \"@brief Retrieve all entities. @return iterable<BaseModel> Collection of models.\"\n ]\n },\n {\n \"start_line_number\": 194,\n \"end_line_number\": 198,\n \"line_range\": [\n 194,\n 198\n ],\n \"text\": \"@brief Find a single entity by ID. @param int $id Entity identifier. @return BaseModel|null The found entity or null.\",\n \"text_lines\": [\n \"@brief Find a single entity by ID. @param int $id Entity identifier. @return BaseModel|null The found entity or null.\"\n ]\n },\n {\n \"start_line_number\": 201,\n \"end_line_number\": 205,\n \"line_range\": [\n 201,\n 205\n ],\n \"text\": \"@brief Count entities matching a filter. @param array<string, mixed> $criteria Filter criteria. @return int Number of matching entities.\",\n \"text_lines\": [\n \"@brief Count entities matching a filter. @param array<string, mixed> $criteria Filter criteria. @return int Number of matching entities.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 192,\n \"end_line_number\": 215,\n \"line_range\": [\n 192,\n 215\n ],\n \"declaration_order_index\": 16,\n \"symbol_name\": \"findAll\",\n \"qualified_name\": \"findAll\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function findAll(): iterable\",\n \"visibility\": \"pub\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Retrieve all entities.\",\n \"doxygen\": {\n \"brief\": [\n \"Retrieve all entities.\",\n \"Find a single entity by ID.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"int\",\n \"description\": \"$id Entity identifier.\"\n }\n ],\n \"returns\": [\n \"iterable<BaseModel> Collection of models.\",\n \"BaseModel|null The found entity or null.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 194,\n \"end_line_number\": 198,\n \"line_range\": [\n 194,\n 198\n ],\n \"text\": \"@brief Find a single entity by ID. @param int $id Entity identifier. @return BaseModel|null The found entity or null.\",\n \"text_lines\": [\n \"@brief Find a single entity by ID. @param int $id Entity identifier. @return BaseModel|null The found entity or null.\"\n ]\n },\n {\n \"start_line_number\": 201,\n \"end_line_number\": 205,\n \"line_range\": [\n 201,\n 205\n ],\n \"text\": \"@brief Count entities matching a filter. @param array<string, mixed> $criteria Filter criteria. @return int Number of matching entities.\",\n \"text_lines\": [\n \"@brief Count entities matching a filter. @param array<string, mixed> $criteria Filter criteria. @return int Number of matching entities.\"\n ]\n },\n {\n \"start_line_number\": 209,\n \"end_line_number\": 209,\n \"line_range\": [\n 209,\n 209\n ],\n \"text\": \"── Trait with abstract methods ────────────────────────────────────────\",\n \"text_lines\": [\n \"── Trait with abstract methods ────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 211,\n \"end_line_number\": 214,\n \"line_range\": [\n 211,\n 214\n ],\n \"text\": \"@trait Cacheable @brief Provides caching capabilities for models.\",\n \"text_lines\": [\n \"@trait Cacheable @brief Provides caching capabilities for models.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 199,\n \"end_line_number\": 215,\n \"line_range\": [\n 199,\n 215\n ],\n \"declaration_order_index\": 17,\n \"symbol_name\": \"findById\",\n \"qualified_name\": \"findById\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function findById(int $id): ?BaseModel\",\n \"visibility\": \"pub\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Find a single entity by ID.\",\n \"doxygen\": {\n \"brief\": [\n \"Find a single entity by ID.\",\n \"Count entities matching a filter.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"int\",\n \"description\": \"$id Entity identifier.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"array<string,\",\n \"description\": \"mixed> $criteria Filter criteria.\"\n }\n ],\n \"returns\": [\n \"BaseModel|null The found entity or null.\",\n \"int Number of matching entities.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 201,\n \"end_line_number\": 205,\n \"line_range\": [\n 201,\n 205\n ],\n \"text\": \"@brief Count entities matching a filter. @param array<string, mixed> $criteria Filter criteria. @return int Number of matching entities.\",\n \"text_lines\": [\n \"@brief Count entities matching a filter. @param array<string, mixed> $criteria Filter criteria. @return int Number of matching entities.\"\n ]\n },\n {\n \"start_line_number\": 209,\n \"end_line_number\": 209,\n \"line_range\": [\n 209,\n 209\n ],\n \"text\": \"── Trait with abstract methods ────────────────────────────────────────\",\n \"text_lines\": [\n \"── Trait with abstract methods ────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 211,\n \"end_line_number\": 214,\n \"line_range\": [\n 211,\n 214\n ],\n \"text\": \"@trait Cacheable @brief Provides caching capabilities for models.\",\n \"text_lines\": [\n \"@trait Cacheable @brief Provides caching capabilities for models.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 206,\n \"end_line_number\": 215,\n \"line_range\": [\n 206,\n 215\n ],\n \"declaration_order_index\": 18,\n \"symbol_name\": \"count\",\n \"qualified_name\": \"count\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function count(array $criteria = []): int\",\n \"visibility\": \"pub\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Count entities matching a filter.\",\n \"doxygen\": {\n \"brief\": [\n \"Count entities matching a filter.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"array<string,\",\n \"description\": \"mixed> $criteria Filter criteria.\"\n }\n ],\n \"returns\": [\n \"int Number of matching entities.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 209,\n \"end_line_number\": 209,\n \"line_range\": [\n 209,\n 209\n ],\n \"text\": \"── Trait with abstract methods ────────────────────────────────────────\",\n \"text_lines\": [\n \"── Trait with abstract methods ────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 211,\n \"end_line_number\": 214,\n \"line_range\": [\n 211,\n 214\n ],\n \"text\": \"@trait Cacheable @brief Provides caching capabilities for models.\",\n \"text_lines\": [\n \"@trait Cacheable @brief Provides caching capabilities for models.\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 215,\n \"end_line_number\": 241,\n \"line_range\": [\n 215,\n 241\n ],\n \"declaration_order_index\": 19,\n \"symbol_name\": \"Cacheable\",\n \"qualified_name\": \"Cacheable\",\n \"symbol_kind\": \"TRAIT\",\n \"type_label\": \"TRAIT\",\n \"signature_text\": \"trait Cacheable\",\n \"child_symbol_names\": [\n \"cache\",\n \"invalidateCache\"\n ],\n \"child_qualified_names\": [\n \"Cacheable.cache\",\n \"Cacheable.invalidateCache\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Provides caching capabilities for models.\",\n \"doxygen\": {\n \"brief\": [\n \"Provides caching capabilities for models.\",\n \"Cache TTL in seconds.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 216,\n \"end_line_number\": 216,\n \"line_range\": [\n 216,\n 216\n ],\n \"text\": \"@brief Cache TTL in seconds.\",\n \"text_lines\": [\n \"@brief Cache TTL in seconds.\"\n ]\n },\n {\n \"start_line_number\": 219,\n \"end_line_number\": 222,\n \"line_range\": [\n 219,\n 222\n ],\n \"text\": \"@brief Store the current object in cache. @return bool True if caching succeeded.\",\n \"text_lines\": [\n \"@brief Store the current object in cache. @return bool True if caching succeeded.\"\n ]\n },\n {\n \"start_line_number\": 224,\n \"end_line_number\": 224,\n \"line_range\": [\n 224,\n 224\n ],\n \"text\": \"Serialize and store with TTL\",\n \"text_lines\": [\n \"Serialize and store with TTL\"\n ]\n },\n {\n \"start_line_number\": 228,\n \"end_line_number\": 231,\n \"line_range\": [\n 228,\n 231\n ],\n \"text\": \"@brief Invalidate the cached version of this object. @return void\",\n \"text_lines\": [\n \"@brief Invalidate the cached version of this object. @return void\"\n ]\n },\n {\n \"start_line_number\": 233,\n \"end_line_number\": 233,\n \"line_range\": [\n 233,\n 233\n ],\n \"text\": \"Remove from cache backend\",\n \"text_lines\": [\n \"Remove from cache backend\"\n ]\n },\n {\n \"start_line_number\": 236,\n \"end_line_number\": 239,\n \"line_range\": [\n 236,\n 239\n ],\n \"text\": \"@brief Require implementing classes to provide a cache key. @return string The unique cache key.\",\n \"text_lines\": [\n \"@brief Require implementing classes to provide a cache key. @return string The unique cache key.\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 225,\n \"text\": \"return true;\"\n }\n ]\n },\n {\n \"start_line_number\": 223,\n \"end_line_number\": 226,\n \"line_range\": [\n 223,\n 226\n ],\n \"declaration_order_index\": 20,\n \"symbol_name\": \"cache\",\n \"qualified_name\": \"Cacheable.cache\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function cache(): bool\",\n \"visibility\": \"pub\",\n \"parent_symbol_name\": \"Cacheable\",\n \"parent_qualified_name\": \"Cacheable\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Store the current object in cache.\",\n \"doxygen\": {\n \"brief\": [\n \"Store the current object in cache.\"\n ],\n \"returns\": [\n \"bool True if caching succeeded.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 224,\n \"end_line_number\": 224,\n \"line_range\": [\n 224,\n 224\n ],\n \"text\": \"Serialize and store with TTL\",\n \"text_lines\": [\n \"Serialize and store with TTL\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 225,\n \"text\": \"return true;\"\n }\n ]\n },\n {\n \"start_line_number\": 232,\n \"end_line_number\": 234,\n \"line_range\": [\n 232,\n 234\n ],\n \"declaration_order_index\": 21,\n \"symbol_name\": \"invalidateCache\",\n \"qualified_name\": \"Cacheable.invalidateCache\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function invalidateCache(): void\",\n \"visibility\": \"pub\",\n \"parent_symbol_name\": \"Cacheable\",\n \"parent_qualified_name\": \"Cacheable\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Invalidate the cached version of this object.\",\n \"doxygen\": {\n \"brief\": [\n \"Invalidate the cached version of this object.\"\n ],\n \"returns\": [\n \"void\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 233,\n \"end_line_number\": 233,\n \"line_range\": [\n 233,\n 233\n ],\n \"text\": \"Remove from cache backend\",\n \"text_lines\": [\n \"Remove from cache backend\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 247,\n \"end_line_number\": 266,\n \"line_range\": [\n 247,\n 266\n ],\n \"declaration_order_index\": 22,\n \"symbol_name\": \"SoftDeletable\",\n \"qualified_name\": \"SoftDeletable\",\n \"symbol_kind\": \"TRAIT\",\n \"type_label\": \"TRAIT\",\n \"signature_text\": \"trait SoftDeletable\",\n \"child_symbol_names\": [\n \"softDelete\",\n \"isDeleted\"\n ],\n \"child_qualified_names\": [\n \"SoftDeletable.softDelete\",\n \"SoftDeletable.isDeleted\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Adds soft delete functionality to models.\",\n \"doxygen\": {\n \"brief\": [\n \"Adds soft delete functionality to models.\",\n \"Timestamp of soft deletion or null if active.\"\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 Timestamp of soft deletion or null if active.\",\n \"text_lines\": [\n \"@brief Timestamp of soft deletion or null if active.\"\n ]\n },\n {\n \"start_line_number\": 251,\n \"end_line_number\": 254,\n \"line_range\": [\n 251,\n 254\n ],\n \"text\": \"@brief Mark the entity as soft-deleted. @return void\",\n \"text_lines\": [\n \"@brief Mark the entity as soft-deleted. @return void\"\n ]\n },\n {\n \"start_line_number\": 259,\n \"end_line_number\": 262,\n \"line_range\": [\n 259,\n 262\n ],\n \"text\": \"@brief Check if the entity is currently deleted. @return bool True if soft-deleted.\",\n \"text_lines\": [\n \"@brief Check if the entity is currently deleted. @return bool True if soft-deleted.\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 264,\n \"text\": \"return $this->deletedAt !== null;\"\n }\n ]\n },\n {\n \"start_line_number\": 255,\n \"end_line_number\": 257,\n \"line_range\": [\n 255,\n 257\n ],\n \"declaration_order_index\": 23,\n \"symbol_name\": \"softDelete\",\n \"qualified_name\": \"SoftDeletable.softDelete\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function softDelete(): void\",\n \"visibility\": \"pub\",\n \"parent_symbol_name\": \"SoftDeletable\",\n \"parent_qualified_name\": \"SoftDeletable\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Mark the entity as soft-deleted.\",\n \"doxygen\": {\n \"brief\": [\n \"Mark the entity as soft-deleted.\"\n ],\n \"returns\": [\n \"void\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 263,\n \"end_line_number\": 265,\n \"line_range\": [\n 263,\n 265\n ],\n \"declaration_order_index\": 24,\n \"symbol_name\": \"isDeleted\",\n \"qualified_name\": \"SoftDeletable.isDeleted\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function isDeleted(): bool\",\n \"visibility\": \"pub\",\n \"parent_symbol_name\": \"SoftDeletable\",\n \"parent_qualified_name\": \"SoftDeletable\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Check if the entity is currently deleted.\",\n \"doxygen\": {\n \"brief\": [\n \"Check if the entity is currently deleted.\"\n ],\n \"returns\": [\n \"bool True if soft-deleted.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 264,\n \"text\": \"return $this->deletedAt !== null;\"\n }\n ]\n },\n {\n \"start_line_number\": 275,\n \"end_line_number\": 286,\n \"line_range\": [\n 275,\n 286\n ],\n \"declaration_order_index\": 25,\n \"symbol_name\": \"CachedUser\",\n \"qualified_name\": \"CachedUser\",\n \"symbol_kind\": \"CLASS\",\n \"type_label\": \"CLASS\",\n \"signature_text\": \"final class CachedUser extends User\",\n \"child_symbol_names\": [\n \"cacheKey\"\n ],\n \"child_qualified_names\": [\n \"CachedUser.cacheKey\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"User entity with caching and soft-delete capabilities.\",\n \"doxygen\": {\n \"brief\": [\n \"User entity with caching and soft-delete capabilities.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 279,\n \"end_line_number\": 282,\n \"line_range\": [\n 279,\n 282\n ],\n \"text\": \"@brief Generate a unique cache key for this user. @return string Cache key in format \\\"user:{id}\\\".\",\n \"text_lines\": [\n \"@brief Generate a unique cache key for this user. @return string Cache key in format \\\"user:{id}\\\".\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 284,\n \"text\": \"return \\\"user:{$this->id}\\\";\"\n }\n ]\n },\n {\n \"start_line_number\": 283,\n \"end_line_number\": 285,\n \"line_range\": [\n 283,\n 285\n ],\n \"declaration_order_index\": 26,\n \"symbol_name\": \"cacheKey\",\n \"qualified_name\": \"CachedUser.cacheKey\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function cacheKey(): string\",\n \"visibility\": \"pub\",\n \"parent_symbol_name\": \"CachedUser\",\n \"parent_qualified_name\": \"CachedUser\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Generate a unique cache key for this user.\",\n \"doxygen\": {\n \"brief\": [\n \"Generate a unique cache key for this user.\"\n ],\n \"returns\": [\n \"string Cache key in format \\\"user:{id}\\\".\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 284,\n \"text\": \"return \\\"user:{$this->id}\\\";\"\n }\n ]\n },\n {\n \"start_line_number\": 295,\n \"end_line_number\": 305,\n \"line_range\": [\n 295,\n 305\n ],\n \"declaration_order_index\": 27,\n \"symbol_name\": \"Route\",\n \"qualified_name\": \"Route\",\n \"symbol_kind\": \"CLASS\",\n \"type_label\": \"CLASS\",\n \"signature_text\": \"class Route\",\n \"child_symbol_names\": [\n \"__construct\"\n ],\n \"child_qualified_names\": [\n \"Route.__construct\"\n ],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"PHP attribute for annotating controller methods with routes.\",\n \"doxygen\": {\n \"brief\": [\n \"PHP attribute for annotating controller methods with routes.\",\n \"Define a route attribute.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"string\",\n \"description\": \"$path URL path pattern.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"string\",\n \"description\": \"$method HTTP method (GET, POST, etc.).\"\n }\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 296,\n \"end_line_number\": 300,\n \"line_range\": [\n 296,\n 300\n ],\n \"text\": \"@brief Define a route attribute. @param string $path URL path pattern. @param string $method HTTP method (GET, POST, etc.).\",\n \"text_lines\": [\n \"@brief Define a route attribute. @param string $path URL path pattern. @param string $method HTTP method (GET, POST, etc.).\"\n ]\n }\n ],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 301,\n \"end_line_number\": 304,\n \"line_range\": [\n 301,\n 304\n ],\n \"declaration_order_index\": 28,\n \"symbol_name\": \"__construct\",\n \"qualified_name\": \"Route.__construct\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"public function __construct(\",\n \"visibility\": \"pub\",\n \"parent_symbol_name\": \"Route\",\n \"parent_qualified_name\": \"Route\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 1,\n \"attached_comment_summary_text\": \"Define a route attribute.\",\n \"doxygen\": {\n \"brief\": [\n \"Define a route attribute.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"string\",\n \"description\": \"$path URL path pattern.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"string\",\n \"description\": \"$method HTTP method (GET, POST, etc.).\"\n }\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 314,\n \"end_line_number\": 316,\n \"line_range\": [\n 314,\n 316\n ],\n \"declaration_order_index\": 29,\n \"symbol_name\": \"helper\",\n \"qualified_name\": \"helper\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"function helper(): bool\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Standalone helper returning a boolean result.\",\n \"doxygen\": {\n \"brief\": [\n \"Standalone helper returning a boolean result.\"\n ],\n \"returns\": [\n \"bool Always returns true.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 315,\n \"text\": \"return true;\"\n }\n ]\n },\n {\n \"start_line_number\": 324,\n \"end_line_number\": 333,\n \"line_range\": [\n 324,\n 333\n ],\n \"declaration_order_index\": 30,\n \"symbol_name\": \"processData\",\n \"qualified_name\": \"processData\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"function processData(mixed $data): string\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Process data using match expression for type dispatching.\",\n \"doxygen\": {\n \"brief\": [\n \"Process data using match expression for type dispatching.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"mixed\",\n \"description\": \"$data Input data of any type.\"\n }\n ],\n \"returns\": [\n \"string Description of the processed data.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 325,\n \"end_line_number\": 325,\n \"line_range\": [\n 325,\n 325\n ],\n \"text\": \"Match expression for exhaustive type handling\",\n \"text_lines\": [\n \"Match expression for exhaustive type handling\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 326,\n \"text\": \"return match(true) {\"\n }\n ]\n },\n {\n \"start_line_number\": 342,\n \"end_line_number\": 344,\n \"line_range\": [\n 342,\n 344\n ],\n \"declaration_order_index\": 31,\n \"symbol_name\": \"applyTransform\",\n \"qualified_name\": \"applyTransform\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"function applyTransform(array $items, callable $fn): array\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Higher-order function using arrow function syntax.\",\n \"doxygen\": {\n \"brief\": [\n \"Higher-order function using arrow function syntax.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"array<int>\",\n \"description\": \"$items Array of integers.\"\n },\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"callable(int):\",\n \"description\": \"int $fn Transform function.\"\n }\n ],\n \"returns\": [\n \"array<int> Transformed array.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 343,\n \"text\": \"return array_map(fn(int $x): int => $fn($x), $items);\"\n }\n ]\n },\n {\n \"start_line_number\": 352,\n \"end_line_number\": 355,\n \"line_range\": [\n 352,\n 355\n ],\n \"declaration_order_index\": 32,\n \"symbol_name\": \"createMultiplier\",\n \"qualified_name\": \"createMultiplier\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"function createMultiplier(int $factor): \\\\Closure\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Create a closure that multiplies its argument.\",\n \"doxygen\": {\n \"brief\": [\n \"Create a closure that multiplies its argument.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"int\",\n \"description\": \"$factor The multiplication factor.\"\n }\n ],\n \"returns\": [\n \"\\\\Closure(int): int A multiplier closure.\"\n ]\n },\n \"body_comment_entries\": [\n {\n \"start_line_number\": 353,\n \"end_line_number\": 353,\n \"line_range\": [\n 353,\n 353\n ],\n \"text\": \"Capture $factor in the returned closure\",\n \"text_lines\": [\n \"Capture $factor in the returned closure\"\n ]\n }\n ],\n \"exit_point_entries\": [\n {\n \"line_number\": 354,\n \"text\": \"return fn(int $x): int => $x * $factor;\"\n }\n ]\n },\n {\n \"start_line_number\": 363,\n \"end_line_number\": 368,\n \"line_range\": [\n 363,\n 368\n ],\n \"declaration_order_index\": 33,\n \"symbol_name\": \"readFileContent\",\n \"qualified_name\": \"readFileContent\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"function readFileContent(string $path): string|false\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"Read file contents with comprehensive error handling.\",\n \"doxygen\": {\n \"brief\": [\n \"Read file contents with comprehensive error handling.\"\n ],\n \"params\": [\n {\n \"direction\": \"unspecified\",\n \"parameter_name\": \"string\",\n \"description\": \"$path File system path.\"\n }\n ],\n \"returns\": [\n \"string|false File contents or false on failure.\"\n ]\n },\n \"body_comment_entries\": [],\n \"exit_point_entries\": [\n {\n \"line_number\": 365,\n \"text\": \"return false;\"\n },\n {\n \"line_number\": 367,\n \"text\": \"return file_get_contents($path);\"\n }\n ]\n },\n {\n \"start_line_number\": 371,\n \"end_line_number\": 375,\n \"line_range\": [\n 371,\n 375\n ],\n \"declaration_order_index\": 34,\n \"symbol_name\": \"App\\\\Services\",\n \"qualified_name\": \"App\\\\Services\",\n \"symbol_kind\": \"NAMESPACE\",\n \"type_label\": \"NAMESPACE\",\n \"signature_text\": \"namespace App\\\\Services\",\n \"child_symbol_names\": [],\n \"child_qualified_names\": [],\n \"depth\": 0,\n \"attached_comment_summary_text\": \"coverage extension block\",\n \"attached_comment_lines\": [\n \"coverage extension block\"\n ],\n \"body_comment_entries\": [],\n \"exit_point_entries\": []\n },\n {\n \"start_line_number\": 372,\n \"end_line_number\": 375,\n \"line_range\": [\n 372,\n 375\n ],\n \"declaration_order_index\": 35,\n \"symbol_name\": \"App\\\\Http\",\n \"qualified_name\": \"App\\\\Http\",\n \"symbol_kind\": \"NAMESPACE\",\n \"type_label\": \"NAMESPACE\",\n \"signature_text\": \"namespace App\\\\Http\",\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\": 373,\n \"end_line_number\": 375,\n \"line_range\": [\n 373,\n 375\n ],\n \"declaration_order_index\": 36,\n \"symbol_name\": \"App\\\\Domain\",\n \"qualified_name\": \"App\\\\Domain\",\n \"symbol_kind\": \"NAMESPACE\",\n \"type_label\": \"NAMESPACE\",\n \"signature_text\": \"namespace App\\\\Domain\",\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\": 374,\n \"end_line_number\": 375,\n \"line_range\": [\n 374,\n 375\n ],\n \"declaration_order_index\": 37,\n \"symbol_name\": \"App\\\\Support\",\n \"qualified_name\": \"App\\\\Support\",\n \"symbol_kind\": \"NAMESPACE\",\n \"type_label\": \"NAMESPACE\",\n \"signature_text\": \"namespace App\\\\Support\",\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\": 375,\n \"end_line_number\": 375,\n \"line_range\": [\n 375,\n 375\n ],\n \"declaration_order_index\": 38,\n \"symbol_name\": \"ServiceContract\",\n \"qualified_name\": \"ServiceContract\",\n \"symbol_kind\": \"INTERFACE\",\n \"type_label\": \"INTERFACE\",\n \"signature_text\": \"interface ServiceContract {}\",\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\": 376,\n \"end_line_number\": 376,\n \"line_range\": [\n 376,\n 376\n ],\n \"declaration_order_index\": 39,\n \"symbol_name\": \"CacheContract\",\n \"qualified_name\": \"CacheContract\",\n \"symbol_kind\": \"INTERFACE\",\n \"type_label\": \"INTERFACE\",\n \"signature_text\": \"interface CacheContract {}\",\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\": 377,\n \"end_line_number\": 377,\n \"line_range\": [\n 377,\n 377\n ],\n \"declaration_order_index\": 40,\n \"symbol_name\": \"LoggerContract\",\n \"qualified_name\": \"LoggerContract\",\n \"symbol_kind\": \"INTERFACE\",\n \"type_label\": \"INTERFACE\",\n \"signature_text\": \"interface LoggerContract {}\",\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\": 378,\n \"end_line_number\": 378,\n \"line_range\": [\n 378,\n 378\n ],\n \"declaration_order_index\": 41,\n \"symbol_name\": \"EventContract\",\n \"qualified_name\": \"EventContract\",\n \"symbol_kind\": \"INTERFACE\",\n \"type_label\": \"INTERFACE\",\n \"signature_text\": \"interface EventContract {}\",\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\": 379,\n \"end_line_number\": 379,\n \"line_range\": [\n 379,\n 379\n ],\n \"declaration_order_index\": 42,\n \"symbol_name\": \"HandlesEvents\",\n \"qualified_name\": \"HandlesEvents\",\n \"symbol_kind\": \"TRAIT\",\n \"type_label\": \"TRAIT\",\n \"signature_text\": \"trait HandlesEvents {}\",\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\": 380,\n \"end_line_number\": 380,\n \"line_range\": [\n 380,\n 380\n ],\n \"declaration_order_index\": 43,\n \"symbol_name\": \"TracksChanges\",\n \"qualified_name\": \"TracksChanges\",\n \"symbol_kind\": \"TRAIT\",\n \"type_label\": \"TRAIT\",\n \"signature_text\": \"trait TracksChanges {}\",\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\": 381,\n \"end_line_number\": 381,\n \"line_range\": [\n 381,\n 381\n ],\n \"declaration_order_index\": 44,\n \"symbol_name\": \"AuthorizesRequests\",\n \"qualified_name\": \"AuthorizesRequests\",\n \"symbol_kind\": \"TRAIT\",\n \"type_label\": \"TRAIT\",\n \"signature_text\": \"trait AuthorizesRequests {}\",\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\": 382,\n \"end_line_number\": 382,\n \"line_range\": [\n 382,\n 382\n ],\n \"declaration_order_index\": 45,\n \"symbol_name\": \"API_LIMIT\",\n \"qualified_name\": \"API_LIMIT\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"const API_LIMIT = 50\",\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\": 383,\n \"end_line_number\": 383,\n \"line_range\": [\n 383,\n 383\n ],\n \"declaration_order_index\": 46,\n \"symbol_name\": \"DEFAULT_PAGE\",\n \"qualified_name\": \"DEFAULT_PAGE\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"const DEFAULT_PAGE = 1\",\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\": 384,\n \"end_line_number\": 384,\n \"line_range\": [\n 384,\n 384\n ],\n \"declaration_order_index\": 47,\n \"symbol_name\": \"TIMEOUT\",\n \"qualified_name\": \"TIMEOUT\",\n \"symbol_kind\": \"CONSTANT\",\n \"type_label\": \"CONSTANT\",\n \"signature_text\": \"const TIMEOUT = 30\",\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\": 385,\n \"end_line_number\": 385,\n \"line_range\": [\n 385,\n 385\n ],\n \"declaration_order_index\": 48,\n \"symbol_name\": \"ApiClient\",\n \"qualified_name\": \"ApiClient\",\n \"symbol_kind\": \"CLASS\",\n \"type_label\": \"CLASS\",\n \"signature_text\": \"final class ApiClient {}\",\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\": 395,\n \"end_line_number\": 395,\n \"line_range\": [\n 395,\n 395\n ],\n \"declaration_order_index\": 49,\n \"symbol_name\": \"req_cover_php_1\",\n \"qualified_name\": \"req_cover_php_1\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"function req_cover_php_1(int $value): int { return $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\": 404,\n \"end_line_number\": 404,\n \"line_range\": [\n 404,\n 404\n ],\n \"declaration_order_index\": 50,\n \"symbol_name\": \"req_cover_php_2\",\n \"qualified_name\": \"req_cover_php_2\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"function req_cover_php_2(int $value): int { return $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\": 413,\n \"end_line_number\": 413,\n \"line_range\": [\n 413,\n 413\n ],\n \"declaration_order_index\": 51,\n \"symbol_name\": \"req_cover_php_3\",\n \"qualified_name\": \"req_cover_php_3\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"function req_cover_php_3(int $value): int { return $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\": 422,\n \"end_line_number\": 422,\n \"line_range\": [\n 422,\n 422\n ],\n \"declaration_order_index\": 52,\n \"symbol_name\": \"req_cover_php_4\",\n \"qualified_name\": \"req_cover_php_4\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"function req_cover_php_4(int $value): int { return $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\": 431,\n \"end_line_number\": 431,\n \"line_range\": [\n 431,\n 431\n ],\n \"declaration_order_index\": 53,\n \"symbol_name\": \"req_cover_php_5\",\n \"qualified_name\": \"req_cover_php_5\",\n \"symbol_kind\": \"FUNCTION\",\n \"type_label\": \"FUNCTION\",\n \"signature_text\": \"function req_cover_php_5(int $value): int { return $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\": 27,\n \"end_line_number\": 27,\n \"line_range\": [\n 27,\n 27\n ],\n \"text\": \"── Enum with methods (PHP 8.1) ────────────────────────────────────────\",\n \"text_lines\": [\n \"── Enum with methods (PHP 8.1) ────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 29,\n \"end_line_number\": 32,\n \"line_range\": [\n 29,\n 32\n ],\n \"text\": \"@enum Status @brief Backed enum representing entity lifecycle states.\",\n \"text_lines\": [\n \"@enum Status\",\n \"@brief Backed enum representing entity lifecycle states.\"\n ]\n },\n {\n \"start_line_number\": 34,\n \"end_line_number\": 34,\n \"line_range\": [\n 34,\n 34\n ],\n \"text\": \"@brief Entity is in draft state, not yet visible.\",\n \"text_lines\": [\n \"@brief Entity is in draft state, not yet visible.\"\n ]\n },\n {\n \"start_line_number\": 36,\n \"end_line_number\": 36,\n \"line_range\": [\n 36,\n 36\n ],\n \"text\": \"@brief Entity is published and publicly accessible.\",\n \"text_lines\": [\n \"@brief Entity is published and publicly accessible.\"\n ]\n },\n {\n \"start_line_number\": 38,\n \"end_line_number\": 38,\n \"line_range\": [\n 38,\n 38\n ],\n \"text\": \"@brief Entity is archived and read-only.\",\n \"text_lines\": [\n \"@brief Entity is archived and read-only.\"\n ]\n },\n {\n \"start_line_number\": 62,\n \"end_line_number\": 62,\n \"line_range\": [\n 62,\n 62\n ],\n \"text\": \"── Abstract class with constructor promotion ──────────────────────────\",\n \"text_lines\": [\n \"── Abstract class with constructor promotion ──────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 85,\n \"end_line_number\": 85,\n \"line_range\": [\n 85,\n 85\n ],\n \"text\": \"Validate before persisting\",\n \"text_lines\": [\n \"Validate before persisting\"\n ]\n },\n {\n \"start_line_number\": 92,\n \"end_line_number\": 95,\n \"line_range\": [\n 92,\n 95\n ],\n \"text\": \"@brief Validate model state before persistence. @return bool True if model is valid.\",\n \"text_lines\": [\n \"@brief Validate model state before persistence.\",\n \"@return bool True if model is valid.\"\n ]\n },\n {\n \"start_line_number\": 106,\n \"end_line_number\": 109,\n \"line_range\": [\n 106,\n 109\n ],\n \"text\": \"@brief Convert model to array representation. @return array<string, mixed> Associative array of model properties.\",\n \"text_lines\": [\n \"@brief Convert model to array representation.\",\n \"@return array<string, mixed> Associative array of model properties.\"\n ]\n },\n {\n \"start_line_number\": 113,\n \"end_line_number\": 113,\n \"line_range\": [\n 113,\n 113\n ],\n \"text\": \"── Concrete class with union types ────────────────────────────────────\",\n \"text_lines\": [\n \"── Concrete class with union types ────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 121,\n \"end_line_number\": 121,\n \"line_range\": [\n 121,\n 121\n ],\n \"text\": \"@brief User's display name.\",\n \"text_lines\": [\n \"@brief User's display name.\"\n ]\n },\n {\n \"start_line_number\": 124,\n \"end_line_number\": 124,\n \"line_range\": [\n 124,\n 124\n ],\n \"text\": \"@brief User's email address or null if unverified.\",\n \"text_lines\": [\n \"@brief User's email address or null if unverified.\"\n ]\n },\n {\n \"start_line_number\": 156,\n \"end_line_number\": 156,\n \"line_range\": [\n 156,\n 156\n ],\n \"text\": \"Return email if available, otherwise numeric ID\",\n \"text_lines\": [\n \"Return email if available, otherwise numeric ID\"\n ]\n },\n {\n \"start_line_number\": 181,\n \"end_line_number\": 181,\n \"line_range\": [\n 181,\n 181\n ],\n \"text\": \"── Interface with type hints ──────────────────────────────────────────\",\n \"text_lines\": [\n \"── Interface with type hints ──────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 209,\n \"end_line_number\": 209,\n \"line_range\": [\n 209,\n 209\n ],\n \"text\": \"── Trait with abstract methods ────────────────────────────────────────\",\n \"text_lines\": [\n \"── Trait with abstract methods ────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 216,\n \"end_line_number\": 216,\n \"line_range\": [\n 216,\n 216\n ],\n \"text\": \"@brief Cache TTL in seconds.\",\n \"text_lines\": [\n \"@brief Cache TTL in seconds.\"\n ]\n },\n {\n \"start_line_number\": 224,\n \"end_line_number\": 224,\n \"line_range\": [\n 224,\n 224\n ],\n \"text\": \"Serialize and store with TTL\",\n \"text_lines\": [\n \"Serialize and store with TTL\"\n ]\n },\n {\n \"start_line_number\": 233,\n \"end_line_number\": 233,\n \"line_range\": [\n 233,\n 233\n ],\n \"text\": \"Remove from cache backend\",\n \"text_lines\": [\n \"Remove from cache backend\"\n ]\n },\n {\n \"start_line_number\": 236,\n \"end_line_number\": 239,\n \"line_range\": [\n 236,\n 239\n ],\n \"text\": \"@brief Require implementing classes to provide a cache key. @return string The unique cache key.\",\n \"text_lines\": [\n \"@brief Require implementing classes to provide a cache key.\",\n \"@return string The unique cache key.\"\n ]\n },\n {\n \"start_line_number\": 248,\n \"end_line_number\": 248,\n \"line_range\": [\n 248,\n 248\n ],\n \"text\": \"@brief Timestamp of soft deletion or null if active.\",\n \"text_lines\": [\n \"@brief Timestamp of soft deletion or null if active.\"\n ]\n },\n {\n \"start_line_number\": 268,\n \"end_line_number\": 268,\n \"line_range\": [\n 268,\n 268\n ],\n \"text\": \"── Class using multiple traits ────────────────────────────────────────\",\n \"text_lines\": [\n \"── Class using multiple traits ────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 288,\n \"end_line_number\": 288,\n \"line_range\": [\n 288,\n 288\n ],\n \"text\": \"── Attribute (PHP 8.0) ────────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Attribute (PHP 8.0) ────────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 307,\n \"end_line_number\": 307,\n \"line_range\": [\n 307,\n 307\n ],\n \"text\": \"── Free functions ─────────────────────────────────────────────────────\",\n \"text_lines\": [\n \"── Free functions ─────────────────────────────────────────────────────\"\n ]\n },\n {\n \"start_line_number\": 325,\n \"end_line_number\": 325,\n \"line_range\": [\n 325,\n 325\n ],\n \"text\": \"Match expression for exhaustive type handling\",\n \"text_lines\": [\n \"Match expression for exhaustive type handling\"\n ]\n },\n {\n \"start_line_number\": 353,\n \"end_line_number\": 353,\n \"line_range\": [\n 353,\n 353\n ],\n \"text\": \"Capture $factor in the returned closure\",\n \"text_lines\": [\n \"Capture $factor in the returned closure\"\n ]\n },\n {\n \"start_line_number\": 387,\n \"end_line_number\": 387,\n \"line_range\": [\n 387,\n 387\n ],\n \"text\": \"REQ-COVER-SRS-231 START\",\n \"text_lines\": [\n \"REQ-COVER-SRS-231 START\"\n ]\n },\n {\n \"start_line_number\": 433,\n \"end_line_number\": 433,\n \"line_range\": [\n 433,\n 433\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_php.php | PHP | 433L | 54 symbols | 6 imports | 70 comments\n> Path: `tests/fixtures/fixture_php.php`\n- @brief Comprehensive PHP test fixture for parser validation.\n- @details Covers enums with methods, union/intersection types, readonly\nproperties, constructor promotion, arrow functions, match expressions,\nfirst-class callables, attributes, fibers, and named arguments.\n\n## Imports\n```\nuse App\\Contracts\\Repository;\nuse App\\Events\\{ModelCreated, ModelDeleted};\nuse Psr\\Log\\LoggerInterface;\nrequire_once 'config.php';\nuse Cacheable;\nuse SoftDeletable;\n```\n\n## Definitions\n\n### ns `namespace App\\Models` (L12-15)\n\n- const `const VERSION = \"1.0\";` (L22)\n- @brief Application version string. */\n- const `const MAX_PER_PAGE = 50;` (L25)\n- @brief Maximum number of query results per page. */\n### fn `public function isActive(): bool` (L45-47)\n- @brief Check if the status represents an active state.\n- @return bool True if the entity is publicly visible.\n\n### fn `public function label(): string` (L53-59)\n- @brief Get a human-readable label for display.\n- @return string Formatted status label.\n\n### class `abstract class BaseModel` (L69-111)\n- @brief Abstract base model with common persistence operations.\n- @brief Construct a model with promoted properties.\n- @details Uses constructor promotion for compact field declaration.\n- @param int $id Unique identifier (readonly after construction).\n- @param \\DateTimeImmutable $createdAt Timestamp of creation.\n- fn `public function __construct(` (L75-78)\n - @brief Construct a model with promoted properties.\n - @param int $id Unique identifier (readonly after construction).\n - @param \\DateTimeImmutable $createdAt Timestamp of creation.\n- fn `public function save(): bool` (L84-90)\n - @brief Persist the model to the data store.\n - @return bool True if save succeeded.\n- fn `private static function validateConstraints(): bool` `priv` (L102-104)\n - @brief Internal validation helper with type narrowing.\n - @return bool True if entity passes all constraint checks.\n\n### class `final class User extends BaseModel` (L120-179)\n- @brief Concrete user entity with union and intersection types.\n- @brief User's display name.\n- fn `public function __construct(` (L133-141)\n - @brief Construct a User with promoted and explicit properties.\n - @param int $id Unique user ID.\n - @param string $name Display name.\n - @param string|null $email Optional email address.\n- fn `public function getName(): string` (L147-149)\n - @brief Get the user's display name.\n - @return string The user name.\n- fn `public function getIdentifier(): string|int` (L155-158)\n - @brief Get a value that may be string or int.\n - @return string|int The identifier in either format.\n- fn `protected function validate(): bool` `prot` (L164-166)\n - @brief Validate user-specific constraints.\n - @return bool True if name is non-empty.\n- fn `public function toArray(): array` (L172-178)\n - @brief Serialize user to array.\n - @return array<string, mixed> User data array.\n\n### iface `interface Repo` (L187-207)\n- @brief Generic repository interface for data access patterns.\n- @brief Retrieve all entities.\n- @return iterable<BaseModel> Collection of models.\n\n### fn `public function findAll(): iterable` (L192-215)\n- @brief Retrieve all entities.\n- @brief Find a single entity by ID.\n- @param int $id Entity identifier.\n- @return iterable<BaseModel> Collection of models.\n- @return BaseModel|null The found entity or null.\n\n### fn `public function findById(int $id): ?BaseModel` (L199-215)\n- @brief Find a single entity by ID.\n- @brief Count entities matching a filter.\n- @param int $id Entity identifier.\n- @param array<string, mixed> $criteria Filter criteria.\n- @return BaseModel|null The found entity or null.\n- @return int Number of matching entities.\n\n### fn `public function count(array $criteria = []): int` (L206-215)\n- @brief Count entities matching a filter.\n- @param array<string, mixed> $criteria Filter criteria.\n- @return int Number of matching entities.\n\n### trait `trait Cacheable` (L215-241)\n- @brief Provides caching capabilities for models.\n- @brief Cache TTL in seconds.\n- fn `public function cache(): bool` (L223-226)\n - @brief Store the current object in cache.\n - @return bool True if caching succeeded.\n- fn `public function invalidateCache(): void` (L232-234)\n - @brief Invalidate the cached version of this object.\n - @return void\n\n### trait `trait SoftDeletable` (L247-266)\n- @brief Adds soft delete functionality to models.\n- @brief Timestamp of soft deletion or null if active.\n- fn `public function softDelete(): void` (L255-257)\n - @brief Mark the entity as soft-deleted.\n - @return void\n- fn `public function isDeleted(): bool` (L263-265)\n - @brief Check if the entity is currently deleted.\n - @return bool True if soft-deleted.\n\n### class `final class CachedUser extends User` (L275-286)\n- @brief User entity with caching and soft-delete capabilities.\n- fn `public function cacheKey(): string` (L283-285)\n - @brief Generate a unique cache key for this user.\n - @return string Cache key in format \"user:{id}\".\n\n### class `class Route` (L295-305)\n- @brief PHP attribute for annotating controller methods with routes.\n- @brief Define a route attribute.\n- @param string $path URL path pattern.\n- @param string $method HTTP method (GET, POST, etc.).\n- fn `public function __construct(` (L301-304)\n - @brief Define a route attribute.\n - @param string $path URL path pattern.\n - @param string $method HTTP method (GET, POST, etc.).\n\n### fn `function helper(): bool` (L314-316)\n- @brief Standalone helper returning a boolean result.\n- @return bool Always returns true.\n\n### fn `function processData(mixed $data): string` (L324-333)\n- @brief Process data using match expression for type dispatching.\n- @param mixed $data Input data of any type.\n- @return string Description of the processed data.\n\n### fn `function applyTransform(array $items, callable $fn): array` (L342-344)\n- @brief Higher-order function using arrow function syntax.\n- @param array<int> $items Array of integers.\n- @param callable(int): int $fn Transform function.\n- @return array<int> Transformed array.\n\n### fn `function createMultiplier(int $factor): \\Closure` (L352-355)\n- @brief Create a closure that multiplies its argument.\n- @param int $factor The multiplication factor.\n- @return \\Closure(int): int A multiplier closure.\n\n### fn `function readFileContent(string $path): string|false` (L363-368)\n- @brief Read file contents with comprehensive error handling.\n- @param string $path File system path.\n- @return string|false File contents or false on failure.\n\n### ns `namespace App\\Services` (L371-375)\n\n### ns `namespace App\\Http` (L372-375)\n\n### ns `namespace App\\Domain` (L373-375)\n\n### ns `namespace App\\Support` (L374-375)\n\n- iface `interface ServiceContract {}` (L375)\n- iface `interface CacheContract {}` (L376)\n- iface `interface LoggerContract {}` (L377)\n- iface `interface EventContract {}` (L378)\n- trait `trait HandlesEvents {}` (L379)\n- trait `trait TracksChanges {}` (L380)\n- trait `trait AuthorizesRequests {}` (L381)\n- const `const API_LIMIT = 50;` (L382)\n- const `const DEFAULT_PAGE = 1;` (L383)\n- const `const TIMEOUT = 30;` (L384)\n- class `final class ApiClient {}` (L385)\n- fn `function req_cover_php_1(int $value): int { return $value + 1; }` (L395)\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 `function req_cover_php_2(int $value): int { return $value + 2; }` (L404)\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 `function req_cover_php_3(int $value): int { return $value + 3; }` (L413)\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 `function req_cover_php_4(int $value): int { return $value + 4; }` (L422)\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 `function req_cover_php_5(int $value): int { return $value + 5; }` (L431)\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|`App\\Models`|ns||12-15||\n|`VERSION`|const||22||\n|`MAX_PER_PAGE`|const||25||\n|`isActive`|fn|pub|45-47|public function isActive(): bool|\n|`label`|fn|pub|53-59|public function label(): string|\n|`BaseModel`|class||69-111|abstract class BaseModel|\n|`BaseModel.__construct`|fn|pub|75-78|public function __construct(|\n|`BaseModel.save`|fn|pub|84-90|public function save(): bool|\n|`BaseModel.validateConstraints`|fn|priv|102-104|private static function validateConstraints(): bool|\n|`User`|class||120-179|final class User extends BaseModel|\n|`User.__construct`|fn|pub|133-141|public function __construct(|\n|`User.getName`|fn|pub|147-149|public function getName(): string|\n|`User.getIdentifier`|fn|pub|155-158|public function getIdentifier(): string|int|\n|`User.validate`|fn|prot|164-166|protected function validate(): bool|\n|`User.toArray`|fn|pub|172-178|public function toArray(): array|\n|`Repo`|iface||187-207|interface Repo|\n|`findAll`|fn|pub|192-215|public function findAll(): iterable|\n|`findById`|fn|pub|199-215|public function findById(int $id): ?BaseModel|\n|`count`|fn|pub|206-215|public function count(array $criteria = []): int|\n|`Cacheable`|trait||215-241|trait Cacheable|\n|`Cacheable.cache`|fn|pub|223-226|public function cache(): bool|\n|`Cacheable.invalidateCache`|fn|pub|232-234|public function invalidateCache(): void|\n|`SoftDeletable`|trait||247-266|trait SoftDeletable|\n|`SoftDeletable.softDelete`|fn|pub|255-257|public function softDelete(): void|\n|`SoftDeletable.isDeleted`|fn|pub|263-265|public function isDeleted(): bool|\n|`CachedUser`|class||275-286|final class CachedUser extends User|\n|`CachedUser.cacheKey`|fn|pub|283-285|public function cacheKey(): string|\n|`Route`|class||295-305|class Route|\n|`Route.__construct`|fn|pub|301-304|public function __construct(|\n|`helper`|fn||314-316|function helper(): bool|\n|`processData`|fn||324-333|function processData(mixed $data): string|\n|`applyTransform`|fn||342-344|function applyTransform(array $items, callable $fn): array|\n|`createMultiplier`|fn||352-355|function createMultiplier(int $factor): \\Closure|\n|`readFileContent`|fn||363-368|function readFileContent(string $path): string|false|\n|`App\\Services`|ns||371-375||\n|`App\\Http`|ns||372-375||\n|`App\\Domain`|ns||373-375||\n|`App\\Support`|ns||374-375||\n|`ServiceContract`|iface||375|interface ServiceContract {}|\n|`CacheContract`|iface||376|interface CacheContract {}|\n|`LoggerContract`|iface||377|interface LoggerContract {}|\n|`EventContract`|iface||378|interface EventContract {}|\n|`HandlesEvents`|trait||379|trait HandlesEvents {}|\n|`TracksChanges`|trait||380|trait TracksChanges {}|\n|`AuthorizesRequests`|trait||381|trait AuthorizesRequests {}|\n|`API_LIMIT`|const||382||\n|`DEFAULT_PAGE`|const||383||\n|`TIMEOUT`|const||384||\n|`ApiClient`|class||385|final class ApiClient {}|\n|`req_cover_php_1`|fn||395|function req_cover_php_1(int $value): int { return $value...|\n|`req_cover_php_2`|fn||404|function req_cover_php_2(int $value): int { return $value...|\n|`req_cover_php_3`|fn||413|function req_cover_php_3(int $value): int { return $value...|\n|`req_cover_php_4`|fn||422|function req_cover_php_4(int $value): int { return $value...|\n|`req_cover_php_5`|fn||431|function req_cover_php_5(int $value): int { return $value...|\n\n",
|
|
4
4
|
"stderr": ""
|
|
5
5
|
}
|