{"record":{"id":"d73d0b31e92aeada","repo":"iOfficeAI/OfficeCLI","slug":"plugin-idle-timeout-d73d0b","errorCode":"plugin_idle_timeout","errorMessage":"Dump-reader plugin '{plugin.Manifest.Name}' produced no output for {idle}s — likely hung.","messagePattern":"Dump-reader plugin '(.+?)' produced no output for (.+?)s — likely hung\\.","errorType":"exception","errorClass":"CliException","httpStatus":null,"severity":"error","filePath":"src/officecli/Core/Plugins/DumpReaderInvoker.cs","lineNumber":118,"sourceCode":"            {\n                ExecutablePath = plugin.ExecutablePath,\n                Arguments = new[] { \"dump\", sourceFullPath },\n                IdleTimeoutSeconds = idle,\n                OnStdoutLine = OnLine,\n            });\n\n            // Bubble up the per-line callback error first — its message is more\n            // actionable than the generic non-zero exit that follows.\n            if (PluginProcess.LineCallbackError is CliException ce)\n                throw ce;\n            if (PluginProcess.LineCallbackError is not null)\n                throw new CliException(\n                    $\"Dump-reader plugin '{plugin.Manifest.Name}' replay aborted: {PluginProcess.LineCallbackError.Message}\",\n                    PluginProcess.LineCallbackError)\n                { Code = \"plugin_command_failed\" };\n\n            if (result.IdleTimedOut)\n                throw new CliException(\n                    $\"Dump-reader plugin '{plugin.Manifest.Name}' produced no output for {idle}s — likely hung.\")\n                {\n                    Code = \"plugin_idle_timeout\",\n                    Suggestion = $\"Override with --timeout 0 or set a longer `idle_timeout_seconds.verbs.dump` in the plugin's manifest.\",\n                };\n\n            if (result.ExitCode != 0)\n                throw new CliException(\n                    $\"Dump-reader plugin '{plugin.Manifest.Name}' failed (exit {result.ExitCode}): {Truncate(result.Stderr, 500)}\")\n                {\n                    Code = result.ExitCode switch\n                    {\n                        2 => \"corrupt_input\",\n                        3 => \"unsupported_feature\",\n                        4 => \"license_expired\",\n                        5 => \"protocol_mismatch\",\n                        6 => \"plugin_idle_timeout\",\n                        _ => \"plugin_failed\",","sourceCodeStart":100,"sourceCodeEnd":136,"githubUrl":"https://github.com/iOfficeAI/OfficeCLI/blob/1ced45e900782c5083ed550ddf328ee974e425e7/src/officecli/Core/Plugins/DumpReaderInvoker.cs#L100-L136","documentation":"CliException (code 'plugin_idle_timeout') thrown when PluginProcess.Run reports IdleTimedOut — the dump-reader produced no stdout for `idle` seconds. Idle timeout is resolved per-verb via the manifest's idle_timeout_seconds.verbs.dump.","triggerScenarios":"Plugin started but stopped emitting JSONL lines; hung on input, deadlock, or waiting on a network resource. Distinguished from exit-code 6 (plugin_idle_timeout) which is plugin-reported.","commonSituations":"Plugin reads a huge/corrupt source synchronously with no progress output; plugin waits on a missing dependency; default idle budget too low for the dataset.","solutions":["Raise idle_timeout_seconds.verbs.dump in the plugin's manifest, or override with --timeout 0 for an unbounded run.","Profile the plugin to find where it stalls; add periodic output/heartbeats.","Confirm the source file is not corrupt or path-locked."],"exampleFix":"// before (manifest)\n\"idle_timeout_seconds\": { \"default\": 30 }\n\n// after (manifest)\n\"idle_timeout_seconds\": {\n  \"default\": 30,\n  \"verbs\": { \"dump\": 600 }\n}","handlingStrategy":"retry","validationCode":"var idle = plugin.Manifest.ResolveIdleTimeout(\"dump\");\nif (idle > 0 && estimatedWorkSeconds > idle)\n    Console.Error.WriteLine($\"Warning: work may exceed idle budget {idle}s; raise --timeout.\");","typeGuard":null,"tryCatchPattern":"try { DumpReaderInvoker.Run(source, ext); }\ncatch (CliException ex) when (ex.Code == \"plugin_idle_timeout\")\n{ /* retry once with --timeout 0 or a higher idle_timeout_seconds.verbs.dump */ }","preventionTips":["Size idle_timeout_seconds.verbs.dump to the largest expected dataset.","Have the plugin emit periodic output to reset the idle timer.","Use --timeout 0 for known-long unattended conversions."],"tags":["plugins","dump-reader","timeout","idle","cli-exception"],"backgroundTag":null,"analyzedSha":"1ced45e900782c5083ed550ddf328ee974e425e7","analyzedAt":"2026-08-13T13:01:07.193Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}