harness-wingman 0.9.7 → 0.9.8

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.
@@ -1,4 +1,4 @@
1
- (function(){const n=document.createElement("link").relList;if(n&&n.supports&&n.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))r(s);new MutationObserver(s=>{for(const i of s)if(i.type==="childList")for(const o of i.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function t(s){const i={};return s.integrity&&(i.integrity=s.integrity),s.referrerPolicy&&(i.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?i.credentials="include":s.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(s){if(s.ep)return;s.ep=!0;const i=t(s);fetch(s.href,i)}})();const Dr={"adapter.cc.features.invalidValue":"Refusing to write: unknown format for {p1} in {p0}","adapter.cc.features.overridden":"Overridden by the {p0} layer; changes here have no effect","adapter.cc.features.invalidAction":"Refused: invalid feature action key or value","adapter.cc.features.noChange":"No change needed: {p0} is already in the requested state","adapter.cc.features.planChanged":"Refusing to apply: feature settings or the action plan changed; plan again","adapter.unknownError":"Unknown error","adapter.invalidPort":"Invalid port: {port}","adapter.cc.hooks.refusingToWriteIsNotValidJSONUnknownFormats":"Refusing to write: {p0} is not valid JSON ({p1}); unknown formats are not inferred","adapter.cc.hooks.refusingToWriteRootIsNotAJSONObject":"Refusing to write: {p0} root is not a JSON object; unknown formats are not inferred","adapter.cc.hooks.refusingToWriteHooksFieldIsNotAnObject":"Refusing to write: {p0} hooks field is not an object; unknown formats are not inferred","adapter.cc.hooks.refusingToWriteHooksIsNotAnArrayUnknown":"Refusing to write: {p0} hooks.{p1} is not an array; unknown formats are not inferred","adapter.cc.actions.refusingToWriteIsNotUTFTextUnknownFormats":"Refusing to write: {p0} is not UTF-8 text; unknown formats are not inferred","adapter.cc.actions.refusingToWriteSkillOverridesIsNotAnObjectUnknown":"Refusing to write: {p0} skillOverrides is not an object; unknown formats are not inferred","adapter.cc.actions.refusedSkillOverridesHasAnUnknownValueItsMeaningIs":"Refused: {p0} skillOverrides.{p1} has an unknown value {p2}; its meaning is not inferred","adapter.cc.actions.noChangeNeededSkillIsAlreadyDisabled":"No change needed: skill {p0} is already disabled","adapter.cc.actions.noChangeNeededSkillIsAlreadyEnabled":"No change needed: skill {p0} is already enabled","adapter.cc.actions.refusedWasNotFoundMCPConnectionSwitchesAreStored":"Refused: {p0} was not found (MCP connection switches are stored per project in this file)","adapter.cc.actions.refusedHasNoRecordForThisProjectInProjects":"Refused: {p0} has no record for this project ({p1}) in projects; ","adapter.cc.actions.mcpConnectionSwitchesAreStoredPerProjectRunClaude":"MCP connection switches are stored per project; run Claude Code in this project first","adapter.cc.actions.refusingToWriteDisabledMcpServersIsNotAnArrayUnknown":"Refusing to write: {p0} disabledMcpServers is not an array; unknown formats are not inferred","adapter.cc.actions.refusingToWriteDisabledMcpServersContainsANonStringMember":"Refusing to write: {p0} disabledMcpServers contains a non-string member; unknown formats are not inferred","adapter.cc.actions.noChangeNeededMCPServerIsAlreadyDisabled":"No change needed: MCP server {p0} is already disabled","adapter.cc.actions.noChangeNeededMCPServerIsAlreadyEnabled":"No change needed: MCP server {p0} is already enabled","adapter.cc.actions.unsupportedActionKindVOnlySupportsToggleThroughPlan":"Unsupported action kind: {p0} (v1 only supports toggle through plan→apply)","adapter.cc.actions.refusedToggleActionRequiresItemIdStringAndEnableBoolean":"Refused: toggle action requires itemId (string) and enable (boolean)","adapter.cc.actions.itemNotFoundTheItemMayHaveChangedScan":"Item not found: {p0} (the item may have changed; scan again)","adapter.cc.actions.itemCannotBeToggledVOnlySupportsSkillOverridesAnd":"Item cannot be toggled: {p0} (v1 only supports skillOverrides and MCP connection switches)","adapter.cc.actions.itemCannotBeToggledCannotParseTheServerName":"Item cannot be toggled: {p0} (cannot parse the server name from nativeName)","adapter.cc.actions.itemCannotBeToggled":"Item cannot be toggled: {p0}","adapter.cc.actions.refusingToApplyPlanIsNotAnObject":"Refusing to apply: plan is not an object","adapter.cc.actions.refusingToApplyPlanHarnessIsNotCcReceived":'Refusing to apply: plan.harness is not "cc" (received {p0}); only plans from this adapter are accepted',"adapter.cc.actions.refusingToApplyPlanActionIsNotToggleOnly":"Refusing to apply: plan.action is not toggle; only plans from this adapter are accepted","adapter.cc.actions.refusingToApplyPlanBackupDirIsMissing":"Refusing to apply: plan.backupDir is missing","adapter.cc.actions.refusingToApplyPlanWritesIsMissingOrEmpty":"Refusing to apply: plan.writes is missing or empty","adapter.cc.actions.refusingToApplyPlanWritesContainsAnEntryWithout":"Refusing to apply: plan.writes contains an entry without file","adapter.cc.actions.refusingToApplyCreateChangeForIsMissingAfter":"Refusing to apply: create change for {p0} is missing after","adapter.cc.actions.refusingToApplyModifyChangeForIsMissingBefore":"Refusing to apply: modify change for {p0} is missing before/after","adapter.cc.actions.refusingToApplyDeleteChangeForIsMissingBefore":"Refusing to apply: delete change for {p0} is missing before","adapter.cc.actions.refusingToApplyPlanWritesContainsAnUnknownKind":"Refusing to apply: plan.writes contains an unknown kind: {p0}","adapter.cc.actions.refusingToApplyWasCreatedAfterPlanningPlanAgain":"Refusing to apply: {p0} was created after planning; plan again","adapter.cc.actions.refusingToApplyNoLongerExistsChangedAfterPlanning":"Refusing to apply: {p0} no longer exists (changed after planning); plan again","adapter.cc.actions.refusingToApplyWasModifiedAfterPlanningPlanAgain":"Refusing to apply: {p0} was modified after planning; plan again","adapter.cc.actions.allWrittenFilesHaveBeenRolledBack":"All written files have been rolled back","adapter.cc.actions.filesThatCouldNotBeRolledBackOriginalsAre":"Files that could not be rolled back: {p0}; originals are backed up at {p1}","adapter.cc.actions.writeFailed":"Write failed: {p0}; {p1}","adapter.cc.actions.readBackVerificationFailedDiffersFromTheExpectedContent":"Read-back verification failed: {p0} differs from the expected content (Claude Code may have rewritten it concurrently). ","adapter.cc.actions.originalsAreBackedUpAtRestoreFromThisBackup":"Originals are backed up at {p0}; restore from this backup","adapter.cc.protocol.install":"install","adapter.cc.protocol.uninstall":"uninstall","adapter.cc.protocol.theManagedProtocolFileHasBeenModified":"The managed protocol file has been modified","adapter.cc.protocol.theManagedProtocolFileHasBeenModifiedRefusingTo":"The managed protocol file has been modified ({p0}); refusing to {p1} and preserving user content","adapter.codex.hooks.invalidPort":"Invalid port: {p0}","adapter.codex.hooks.theManagedWingmanCodexHookBlockWasModifiedOr":"The managed Wingman Codex hook block was modified or is incomplete ({p0}); wiring cannot be confirmed; ","adapter.codex.hooks.restoreTheCompleteBlockFromWingmanRootBackupsOr":"restore the complete block from <wingman root>/backups/, or review and remove the managed block manually, then reinstall and trust it","adapter.codex.hooks.theManagedWingmanCodexHookBlockWasModifiedOr52":"The managed Wingman Codex hook block was modified or is incomplete ({p0}); refusing to delete it automatically; ","adapter.codex.hooks.restoreTheCompleteBlockFromWingmanRootBackupsOr53":"restore the complete block from <wingman root>/backups/, or review and remove the managed block manually","adapter.codex.hooks.incompleteWingmanMarkerBlockRestoreFromWingmanRootBackups":"Incomplete wingman marker block ({p0}): restore from <wingman root>/backups/ or remove the markers manually and retry","adapter.codex.hooks.duplicateWingmanMarkerBlocksRestoreFromWingmanRootBackups":"Duplicate wingman marker blocks ({p0}): restore from <wingman root>/backups/ or remove the extra markers manually and retry","adapter.codex.hooks.cannotParseCodexConfigTomlRefusingToWrite":"Cannot parse Codex config.toml; refusing to write ({p0}): {p1}","adapter.codex.hooks.codexConfigTomlHooksKeyIsNotATable":"Codex config.toml hooks key is not a table; refusing to write an unknown format ({p0})","adapter.codex.hooks.userOwnedHooksConfigurationAlreadyExistsWingmanWillNot":"User-owned [hooks] configuration already exists ({p0}); wingman will not merge or overwrite it; ","adapter.codex.hooks.removeItManuallyOrAddTheForwardingCommandTo":"remove it manually or add the forwarding command to the existing hooks ({p0})","adapter.codex.actions.planHarnessIsNotCodexRefusingToApply":"plan.harness={p0} is not codex; refusing to apply","adapter.codex.actions.planWritesDoesNotMatchThisAdapterSFormat":"plan.writes does not match this adapter's format (expected exactly one modify); refusing to apply","adapter.codex.actions.backupdirIsOutsideTheWingmanBackupRootRefusingTo":"backupDir is outside the wingman backup root ({p0}); refusing to apply","adapter.codex.actions.fileWasModifiedAfterPlanningRefusingToApplyPlan":"File was modified after planning ({p0}); refusing to apply; plan again","adapter.codex.actions.theTargetFileInPlanWritesDoesNotMatch":"The target file in plan.writes does not match itemId; refusing to apply","adapter.codex.actions.planDiffersFromThisAdapterSExpectedChangesRefusing":"Plan differs from this adapter's expected changes; refusing to apply; plan again","adapter.codex.actions.unknownActionKindVOnlySupportsToggleThroughPlan":"Unknown action kind: {p0} (v1 only supports toggle through plan→apply)","adapter.codex.actions.unrecognizedOrUntoggleableItemIdCodexOnlySupportsMcpServers":"Unrecognized or untoggleable itemId: {p0} (codex only supports mcp_servers.* in tools and plugins.* in skills)","adapter.codex.actions.itemidNotFoundConfigurationFileDoesNotExist":"itemId not found: configuration file does not exist ({p0})","adapter.codex.actions.cannotParseCodexConfigTomlRefusingTheAction":"Cannot parse Codex config.toml; refusing the action ({p0}): {p1}","adapter.codex.actions.unrecognizedItemIdSkillsOnlySupportsPluginsEntriesReceived":"Unrecognized itemId: skills only supports plugins.* entries; received {p0}","adapter.codex.actions.itemidNotFoundPluginIsNotIn":"itemId not found: plugin {p0} is not in {p1}","adapter.codex.actions.pluginConfigurationIsNotATableRefusingToWrite":"Plugin {p0} configuration is not a table; refusing to write an unknown format ({p1})","adapter.codex.actions.enabledKeyFor":"enabled key for {p0}","adapter.codex.actions.enabledValueFor":"enabled value for {p0}","adapter.codex.actions.unrecognizedItemIdToolsOnlySupportsMcpServersEntriesReceived":"Unrecognized itemId: tools only supports mcp_servers.* entries; received {p0}","adapter.codex.actions.itemidNotFoundHasNoMcpServersConfiguration":"itemId not found: {p0} has no mcp_servers configuration","adapter.codex.actions.ambiguousItemIdBothServerAndServerExistCannotDetermine":'Ambiguous itemId: both server "{p0}" and server "{p1}" exist (cannot determine the target; refusing to guess)',"adapter.codex.actions.itemidNotFoundMCPServerDoesNotExistMcp":"itemId not found: MCP server does not exist (mcp_servers.{p0} @ {p1})","adapter.codex.actions.mcpServerConfigurationIsNotATableRefusingTo":"MCP server {p0} configuration is not a table; refusing to write an unknown format ({p1})","adapter.codex.actions.enabledKeyForMcpServers":"enabled key for mcp_servers.{p0}","adapter.codex.actions.enabledValueForMcpServers":"enabled value for mcp_servers.{p0}","adapter.codex.actions.conflictingConfigurationToolAppearsInBothEnabledToolsAnd":"Conflicting configuration: tool {p0} appears in both enabled_tools and disabled_tools for mcp_servers.{p1} ({p2}); refusing the action","adapter.codex.actions.cannotExplainTheStateOfMcpServersDisabledBut":"Cannot explain the state of mcp_servers.{p0}/{p1} (disabled but not in either list); refusing the action ({p2})","adapter.codex.actions.keyForMcpServers":"{p1} key for mcp_servers.{p0}","adapter.codex.actions.arrayForMcpServers":"{p1} array for mcp_servers.{p0}","adapter.codex.actions.arrayForMcpServersTextDiffersFromParsedData":"{p1} array for mcp_servers.{p0} (text differs from parsed data)","adapter.codex.actions.inForMcpServers":"{p2} in {p1} for mcp_servers.{p0}","adapter.codex.actions.mcpServersIsNotAStringArrayRefusingTo":"mcp_servers.{p0} {p1} is not a string array; refusing to write an unknown format ({p2})","adapter.codex.actions.editedResultIsNotValidTOMLWriteAbandoned":"Edited result is not valid TOML; write abandoned ({p0}): {p1}","adapter.codex.actions.editedResultDiffersFromTheExpectedMinimalChangeRefusing":"Edited result differs from the expected minimal change; refusing to write ({p0})","adapter.codex.actions.enabledForIsNotABooleanRefusingToWrite":"enabled for {p0} is not a boolean; refusing to write an unknown field format ({p1})","adapter.codex.actions.isAlreadyInTheRequestedStateEnabledNoWrite":"{p0} is already in the requested state (enabled={p1}); no write needed; scan again before retrying","adapter.codex.actions.tableHeaderInlineTableOrNonstandardSyntax":"[{p0}] table header (inline table or nonstandard syntax)","adapter.codex.actions.cannotSafelyLocateRefusingToWriteEditItManually":"Cannot safely locate {p0}; refusing to write ({p1}); edit it manually","adapter.codex.actions.internalErrorExpectedStructureIsMissingTable":"Internal error: expected structure is missing table {p0}","adapter.codex.protocol.thisAGENTSMdProtocolBlockIsSharedByCodex":"This AGENTS.md protocol block is shared by Codex and dsh","adapter.codex.protocol.blockRemovedAndUserChangesPreserved":"{p0}; block removed and user changes preserved","adapter.codex.protocol.theManagedBlockWasModifiedRefusingToAndPreserving":"{p0}: the managed block was modified; refusing to {p1} and preserving user content","adapter.dsh.hooks.refusingToWriteCannotParseYAMLInUnknownFormats":"Refusing to write: cannot parse YAML in {p0} ({p1}); unknown formats are not inferred","adapter.dsh.hooks.refusingToWriteRootIsNotAYAMLArray":"Refusing to write: {p0} root is not a YAML array (dsh patch layer format); unknown formats are not inferred","adapter.dsh.hooks.refusingToWriteEntryInIsNotAMapping":"Refusing to write: entry {p1} in {p0} is not a mapping (loader patch entry); unknown formats are not inferred","adapter.dsh.hooks.hasAWingmanStartMarkerWithoutAnEndMarker":"{p0} has a wingman start marker without an end marker (possibly modified manually); refusing automatic changes: remove the marker block manually or restore from backup","adapter.dsh.hooks.unknownWiringStateVersionRefusingToInferItsFormat":"Unknown wiring state version; refusing to infer its format","adapter.dsh.hooks.wiringStateStructureIsCorruptRefusingAutomaticChanges":"Wiring state structure is corrupt; refusing automatic changes","adapter.dsh.hooks.dshProfileDoesNotExistOrIsMissingPackage":"dsh profile does not exist or is missing package.json: {p0}","adapter.dsh.hooks.refusingToWriteAlreadyHasAnUnmarkedEntryPossibly":"Refusing to write: {p0} already has an unmarked {p1} entry (possibly copied manually); remove it manually first","adapter.dsh.hooks.refusingToWriteShapeValidationFailedAfterAppendingTo":"Refusing to write: shape validation failed after appending to {p0} (cannot safely append to the existing format); refusing to guess","adapter.dsh.hooks.refusingAutomaticChangesToDSHHOMECordisPatchYml":"Refusing automatic changes to $DSH_HOME/cordis.patch.yml: the file or wiring state cannot be safely read, parsed, or written; disconnect manually, then reconnect","adapter.dsh.toggle.wingmanToggleBlockInHasAMismatchedEndMarker":"Wingman toggle block ({p1}) in {p0} has a mismatched end marker (possibly modified manually); refusing automatic changes: remove the marker block manually or restore from backup","adapter.dsh.toggle.wingmanToggleBlockFlagIsCorruptInRefusingAutomatic":"Wingman toggle block flag is corrupt in {p0} ({p1}); refusing automatic changes","adapter.dsh.toggle.hasAnUnknownWingmanFlagRefusingAutomaticChangesOr":"{p0} has an unknown wingman flag ({p1}); refusing automatic changes or format inference","adapter.dsh.toggle.wingmanToggleBlockIdIsInvalidInRefusingAutomatic":"Wingman toggle block id is invalid in {p0} ({p1}); refusing automatic changes","adapter.dsh.toggle.containsDuplicateWingmanToggleBlocksPossiblyCopiedManuallyRefusing":"{p0} contains duplicate wingman toggle blocks ({p1}), possibly copied manually; refusing automatic changes","adapter.dsh.toggle.hasAnUnrecognizedWingmanMarkerLineRefusingAutomaticChanges":"{p0} has an unrecognized wingman marker line ({p1}…); refusing automatic changes or format inference","adapter.dsh.toggle.wingmanToggleBlockInHasNoEndMarkerPossibly":"Wingman toggle block ({p1}) in {p0} has no end marker (possibly modified manually); refusing automatic changes: remove the marker block manually or restore from backup","adapter.dsh.toggle.wingmanLiveHooksBlockInHasNoEndMarker":"Wingman live hooks block in {p0} has no end marker (possibly modified manually); refusing automatic changes","adapter.dsh.toggle.wingmanToggleBlockInWasModifiedRefusingAutomaticChanges":"Wingman toggle block ({p1}) in {p0} was modified; refusing automatic changes: remove the marker block manually or restore from backup","adapter.dsh.toggle.unsupportedActionKindDshVOnlySupportsToggle":"Unsupported action kind: {p0} (dsh v1 only supports toggle)","adapter.dsh.toggle.actionIsMissingItemIdTheTargetItemSSlotItem":"Action is missing itemId (the target item's SlotItem.id)","adapter.dsh.toggle.actionIsMissingEnableTrueOnFalseOff":"Action is missing enable (true=on, false=off)","adapter.dsh.toggle.itemWasNotFoundConfigurationMayHaveChangedScan":"Item {p0} was not found: configuration may have changed; scan again and retry","adapter.dsh.toggle.isALayerItselfRulesSlotAndCannotBe":'"{p0}" is a layer itself (rules slot) and cannot be toggled',"adapter.dsh.toggle.comesFromThePatchOverrideLayerAppliedAfterThe":`"{p0}" comes from the --patch override layer, applied after the home layer; Wingman's home patch cannot override it; toggle refused`,"adapter.dsh.toggle.itemIsNotAPluginRowAndCannotBe":"Item {p0} is not a plugin row and cannot be toggled","adapter.dsh.toggle.pluginInstanceIdContainsCharactersUnsafeForMarkersRefusing":"Plugin instance id contains characters unsafe for markers ({p0}); refusing to toggle or infer a format","adapter.dsh.toggle.wasAddedByWingmanLiveWiringLiveHooksBlock":'"{p0}" ({p1}) was added by Wingman live wiring (live hooks block); manage it with `wingman hook uninstall dsh`',"adapter.dsh.toggle.isAlreadyDisabledByWingmanEffectiveNextTimeDsh":'"{p0}" ({p1}) is already disabled by Wingman (effective next time dsh starts); toggle on to restore it',"adapter.dsh.toggle.alreadyHasAUserOwnedEntryNoMergeWill":"{p0} already has a user-owned {p1} entry; no merge will be inferred: handle the entry manually and retry","adapter.dsh.toggle.isAlreadyDisabledInLayerNativeSettingOutsideWingman":`"{p0}" ({p1}) is already disabled in layer {p2} (native setting outside Wingman's control); no further change needed`,"adapter.dsh.toggle.isNativelyDisabledInLayerOutsideWingmanSControl":`"{p0}" ({p1}) is natively disabled in layer {p2}, outside Wingman's control: edit that layer's bundle/profile configuration`,"adapter.dsh.toggle.isAlreadyEnabledNoToggleOnNeeded":'"{p0}" ({p1}) is already enabled; no toggle on needed',"adapter.dsh.toggle.planDidNotComeFromTheDshAdapterHarness":"Plan did not come from the dsh adapter (harness mismatch); refusing to apply","adapter.dsh.toggle.planWritesHasTheWrongShapeDshToggleWrites":"plan.writes has the wrong shape (dsh toggle writes to exactly one location); refusing to apply","adapter.dsh.toggle.planWriteTargetIsNotRefusingToApply":"Plan write target {p0} is not {p1}; refusing to apply","adapter.dsh.toggle.planWritesFieldsHaveTheWrongShapeBeforeAfter":"plan.writes[0] fields have the wrong shape (before/after do not match kind); refusing to apply","adapter.dsh.toggle.planBackupDirIsMissingRefusingToApply":"plan.backupDir is missing; refusing to apply","adapter.dsh.toggle.planBackupDirIsNotUnderRefusingToApply":"plan.backupDir is not under {p0}; refusing to apply","adapter.dsh.toggle.wasCreatedAfterPlanningAndNoLongerMatchesThe":"{p0} was created after planning and no longer matches the plan's assumptions; plan again","adapter.dsh.toggle.wasDeletedAfterPlanningAndNoLongerMatchesThe":"{p0} was deleted after planning and no longer matches the plan's assumptions; plan again","adapter.dsh.toggle.wasModifiedAfterPlanningAndDiffersFromThePlan":"{p0} was modified after planning and differs from the plan snapshot; plan again","adapter.dsh.protocol.theDshInstructionLoaderPluginIsDisabledSeeThe":"The dsh instruction loader plugin is disabled; see the switch on the controls page","adapter.dsh.protocol.uninstallingAffectsBothCodexAndDsh":"{p0}; uninstalling affects both Codex and dsh","adapter.dsh.protocol.uninstallingAffectsBothCodexAndDshUserChangesPreserved":"{p0}; uninstalling affects both Codex and dsh; user changes preserved","adapter.dsh.protocol.dshHasNoUserLevelInstructionFileInstallPer":"dsh has no user-level instruction file; install per project","adapter.dsh.dump-config.cannotParseDumpConfigYAML":"Cannot parse dump-config YAML: {p0}","adapter.dsh.dump-config.dumpConfigRootIsNotAPluginRowSequence":"dump-config root is not a plugin row sequence (YAML seq); differs from the pinned version's format; refusing to parse","adapter.dsh.dump-config.pluginRowInDumpConfigIsNotAYAML":"Plugin row {p0} in dump-config is not a YAML map; refusing to parse","adapter.dsh.dump-config.pluginRowInDumpConfigIsMissingItsBundle":'Plugin row {p0} in dump-config is missing its "# == <bundle>" source comment; refusing to parse',"adapter.dsh.dump-config.pluginRowInDumpConfigIsMissingAString":"Plugin row {p0} in dump-config is missing a string id/name; refusing to parse","adapter.dsh.dump-config.duplicateSlotItemIdSameLayerNameAndInstanceId":"Duplicate SlotItem.id: {p0} (same layer, name, and instance id cannot be distinguished); scan failed"},Wr={"cli.licenseStatusLine":`{state}: {detail}
1
+ (function(){const n=document.createElement("link").relList;if(n&&n.supports&&n.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))r(s);new MutationObserver(s=>{for(const o of s)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function t(s){const o={};return s.integrity&&(o.integrity=s.integrity),s.referrerPolicy&&(o.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?o.credentials="include":s.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(s){if(s.ep)return;s.ep=!0;const o=t(s);fetch(s.href,o)}})();const qr={"adapter.cc.features.invalidValue":"Refusing to write: unknown format for {p1} in {p0}","adapter.cc.features.overridden":"Overridden by the {p0} layer; changes here have no effect","adapter.cc.features.invalidAction":"Refused: invalid feature action key or value","adapter.cc.features.noChange":"No change needed: {p0} is already in the requested state","adapter.cc.features.planChanged":"Refusing to apply: feature settings or the action plan changed; plan again","adapter.unknownError":"Unknown error","adapter.invalidPort":"Invalid port: {port}","adapter.cc.hooks.refusingToWriteIsNotValidJSONUnknownFormats":"Refusing to write: {p0} is not valid JSON ({p1}); unknown formats are not inferred","adapter.cc.hooks.refusingToWriteRootIsNotAJSONObject":"Refusing to write: {p0} root is not a JSON object; unknown formats are not inferred","adapter.cc.hooks.refusingToWriteHooksFieldIsNotAnObject":"Refusing to write: {p0} hooks field is not an object; unknown formats are not inferred","adapter.cc.hooks.refusingToWriteHooksIsNotAnArrayUnknown":"Refusing to write: {p0} hooks.{p1} is not an array; unknown formats are not inferred","adapter.cc.actions.refusingToWriteIsNotUTFTextUnknownFormats":"Refusing to write: {p0} is not UTF-8 text; unknown formats are not inferred","adapter.cc.actions.refusingToWriteSkillOverridesIsNotAnObjectUnknown":"Refusing to write: {p0} skillOverrides is not an object; unknown formats are not inferred","adapter.cc.actions.refusedSkillOverridesHasAnUnknownValueItsMeaningIs":"Refused: {p0} skillOverrides.{p1} has an unknown value {p2}; its meaning is not inferred","adapter.cc.actions.noChangeNeededSkillIsAlreadyDisabled":"No change needed: skill {p0} is already disabled","adapter.cc.actions.noChangeNeededSkillIsAlreadyEnabled":"No change needed: skill {p0} is already enabled","adapter.cc.actions.refusedWasNotFoundMCPConnectionSwitchesAreStored":"Refused: {p0} was not found (MCP connection switches are stored per project in this file)","adapter.cc.actions.refusedHasNoRecordForThisProjectInProjects":"Refused: {p0} has no record for this project ({p1}) in projects; ","adapter.cc.actions.mcpConnectionSwitchesAreStoredPerProjectRunClaude":"MCP connection switches are stored per project; run Claude Code in this project first","adapter.cc.actions.refusingToWriteDisabledMcpServersIsNotAnArrayUnknown":"Refusing to write: {p0} disabledMcpServers is not an array; unknown formats are not inferred","adapter.cc.actions.refusingToWriteDisabledMcpServersContainsANonStringMember":"Refusing to write: {p0} disabledMcpServers contains a non-string member; unknown formats are not inferred","adapter.cc.actions.noChangeNeededMCPServerIsAlreadyDisabled":"No change needed: MCP server {p0} is already disabled","adapter.cc.actions.noChangeNeededMCPServerIsAlreadyEnabled":"No change needed: MCP server {p0} is already enabled","adapter.cc.actions.unsupportedActionKindVOnlySupportsToggleThroughPlan":"Unsupported action kind: {p0} (v1 only supports toggle through plan→apply)","adapter.cc.actions.refusedToggleActionRequiresItemIdStringAndEnableBoolean":"Refused: toggle action requires itemId (string) and enable (boolean)","adapter.cc.actions.itemNotFoundTheItemMayHaveChangedScan":"Item not found: {p0} (the item may have changed; scan again)","adapter.cc.actions.itemCannotBeToggledVOnlySupportsSkillOverridesAnd":"Item cannot be toggled: {p0} (v1 only supports skillOverrides and MCP connection switches)","adapter.cc.actions.itemCannotBeToggledCannotParseTheServerName":"Item cannot be toggled: {p0} (cannot parse the server name from nativeName)","adapter.cc.actions.itemCannotBeToggled":"Item cannot be toggled: {p0}","adapter.cc.actions.refusingToApplyPlanIsNotAnObject":"Refusing to apply: plan is not an object","adapter.cc.actions.refusingToApplyPlanHarnessIsNotCcReceived":'Refusing to apply: plan.harness is not "cc" (received {p0}); only plans from this adapter are accepted',"adapter.cc.actions.refusingToApplyPlanActionIsNotToggleOnly":"Refusing to apply: plan.action is not toggle; only plans from this adapter are accepted","adapter.cc.actions.refusingToApplyPlanBackupDirIsMissing":"Refusing to apply: plan.backupDir is missing","adapter.cc.actions.refusingToApplyPlanWritesIsMissingOrEmpty":"Refusing to apply: plan.writes is missing or empty","adapter.cc.actions.refusingToApplyPlanWritesContainsAnEntryWithout":"Refusing to apply: plan.writes contains an entry without file","adapter.cc.actions.refusingToApplyCreateChangeForIsMissingAfter":"Refusing to apply: create change for {p0} is missing after","adapter.cc.actions.refusingToApplyModifyChangeForIsMissingBefore":"Refusing to apply: modify change for {p0} is missing before/after","adapter.cc.actions.refusingToApplyDeleteChangeForIsMissingBefore":"Refusing to apply: delete change for {p0} is missing before","adapter.cc.actions.refusingToApplyPlanWritesContainsAnUnknownKind":"Refusing to apply: plan.writes contains an unknown kind: {p0}","adapter.cc.actions.refusingToApplyWasCreatedAfterPlanningPlanAgain":"Refusing to apply: {p0} was created after planning; plan again","adapter.cc.actions.refusingToApplyNoLongerExistsChangedAfterPlanning":"Refusing to apply: {p0} no longer exists (changed after planning); plan again","adapter.cc.actions.refusingToApplyWasModifiedAfterPlanningPlanAgain":"Refusing to apply: {p0} was modified after planning; plan again","adapter.cc.actions.allWrittenFilesHaveBeenRolledBack":"All written files have been rolled back","adapter.cc.actions.filesThatCouldNotBeRolledBackOriginalsAre":"Files that could not be rolled back: {p0}; originals are backed up at {p1}","adapter.cc.actions.writeFailed":"Write failed: {p0}; {p1}","adapter.cc.actions.readBackVerificationFailedDiffersFromTheExpectedContent":"Read-back verification failed: {p0} differs from the expected content (Claude Code may have rewritten it concurrently). ","adapter.cc.actions.originalsAreBackedUpAtRestoreFromThisBackup":"Originals are backed up at {p0}; restore from this backup","adapter.cc.protocol.install":"install","adapter.cc.protocol.uninstall":"uninstall","adapter.cc.protocol.theManagedProtocolFileHasBeenModified":"The managed protocol file has been modified","adapter.cc.protocol.theManagedProtocolFileHasBeenModifiedRefusingTo":"The managed protocol file has been modified ({p0}); refusing to {p1} and preserving user content","adapter.codex.hooks.invalidPort":"Invalid port: {p0}","adapter.codex.hooks.theManagedWingmanCodexHookBlockWasModifiedOr":"The managed Wingman Codex hook block was modified or is incomplete ({p0}); wiring cannot be confirmed; ","adapter.codex.hooks.restoreTheCompleteBlockFromWingmanRootBackupsOr":"restore the complete block from <wingman root>/backups/, or review and remove the managed block manually, then reinstall and trust it","adapter.codex.hooks.theManagedWingmanCodexHookBlockWasModifiedOr52":"The managed Wingman Codex hook block was modified or is incomplete ({p0}); refusing to delete it automatically; ","adapter.codex.hooks.restoreTheCompleteBlockFromWingmanRootBackupsOr53":"restore the complete block from <wingman root>/backups/, or review and remove the managed block manually","adapter.codex.hooks.incompleteWingmanMarkerBlockRestoreFromWingmanRootBackups":"Incomplete wingman marker block ({p0}): restore from <wingman root>/backups/ or remove the markers manually and retry","adapter.codex.hooks.duplicateWingmanMarkerBlocksRestoreFromWingmanRootBackups":"Duplicate wingman marker blocks ({p0}): restore from <wingman root>/backups/ or remove the extra markers manually and retry","adapter.codex.hooks.cannotParseCodexConfigTomlRefusingToWrite":"Cannot parse Codex config.toml; refusing to write ({p0}): {p1}","adapter.codex.hooks.codexConfigTomlHooksKeyIsNotATable":"Codex config.toml hooks key is not a table; refusing to write an unknown format ({p0})","adapter.codex.hooks.userOwnedHooksConfigurationAlreadyExistsWingmanWillNot":"User-owned [hooks] configuration already exists ({p0}); wingman will not merge or overwrite it; ","adapter.codex.hooks.removeItManuallyOrAddTheForwardingCommandTo":"remove it manually or add the forwarding command to the existing hooks ({p0})","adapter.codex.actions.planHarnessIsNotCodexRefusingToApply":"plan.harness={p0} is not codex; refusing to apply","adapter.codex.actions.planWritesDoesNotMatchThisAdapterSFormat":"plan.writes does not match this adapter's format (expected exactly one modify); refusing to apply","adapter.codex.actions.backupdirIsOutsideTheWingmanBackupRootRefusingTo":"backupDir is outside the wingman backup root ({p0}); refusing to apply","adapter.codex.actions.fileWasModifiedAfterPlanningRefusingToApplyPlan":"File was modified after planning ({p0}); refusing to apply; plan again","adapter.codex.actions.theTargetFileInPlanWritesDoesNotMatch":"The target file in plan.writes does not match itemId; refusing to apply","adapter.codex.actions.planDiffersFromThisAdapterSExpectedChangesRefusing":"Plan differs from this adapter's expected changes; refusing to apply; plan again","adapter.codex.actions.unknownActionKindVOnlySupportsToggleThroughPlan":"Unknown action kind: {p0} (v1 only supports toggle through plan→apply)","adapter.codex.actions.unrecognizedOrUntoggleableItemIdCodexOnlySupportsMcpServers":"Unrecognized or untoggleable itemId: {p0} (codex only supports mcp_servers.* in tools and plugins.* in skills)","adapter.codex.actions.itemidNotFoundConfigurationFileDoesNotExist":"itemId not found: configuration file does not exist ({p0})","adapter.codex.actions.cannotParseCodexConfigTomlRefusingTheAction":"Cannot parse Codex config.toml; refusing the action ({p0}): {p1}","adapter.codex.actions.unrecognizedItemIdSkillsOnlySupportsPluginsEntriesReceived":"Unrecognized itemId: skills only supports plugins.* entries; received {p0}","adapter.codex.actions.itemidNotFoundPluginIsNotIn":"itemId not found: plugin {p0} is not in {p1}","adapter.codex.actions.pluginConfigurationIsNotATableRefusingToWrite":"Plugin {p0} configuration is not a table; refusing to write an unknown format ({p1})","adapter.codex.actions.enabledKeyFor":"enabled key for {p0}","adapter.codex.actions.enabledValueFor":"enabled value for {p0}","adapter.codex.actions.unrecognizedItemIdToolsOnlySupportsMcpServersEntriesReceived":"Unrecognized itemId: tools only supports mcp_servers.* entries; received {p0}","adapter.codex.actions.itemidNotFoundHasNoMcpServersConfiguration":"itemId not found: {p0} has no mcp_servers configuration","adapter.codex.actions.ambiguousItemIdBothServerAndServerExistCannotDetermine":'Ambiguous itemId: both server "{p0}" and server "{p1}" exist (cannot determine the target; refusing to guess)',"adapter.codex.actions.itemidNotFoundMCPServerDoesNotExistMcp":"itemId not found: MCP server does not exist (mcp_servers.{p0} @ {p1})","adapter.codex.actions.mcpServerConfigurationIsNotATableRefusingTo":"MCP server {p0} configuration is not a table; refusing to write an unknown format ({p1})","adapter.codex.actions.enabledKeyForMcpServers":"enabled key for mcp_servers.{p0}","adapter.codex.actions.enabledValueForMcpServers":"enabled value for mcp_servers.{p0}","adapter.codex.actions.conflictingConfigurationToolAppearsInBothEnabledToolsAnd":"Conflicting configuration: tool {p0} appears in both enabled_tools and disabled_tools for mcp_servers.{p1} ({p2}); refusing the action","adapter.codex.actions.cannotExplainTheStateOfMcpServersDisabledBut":"Cannot explain the state of mcp_servers.{p0}/{p1} (disabled but not in either list); refusing the action ({p2})","adapter.codex.actions.keyForMcpServers":"{p1} key for mcp_servers.{p0}","adapter.codex.actions.arrayForMcpServers":"{p1} array for mcp_servers.{p0}","adapter.codex.actions.arrayForMcpServersTextDiffersFromParsedData":"{p1} array for mcp_servers.{p0} (text differs from parsed data)","adapter.codex.actions.inForMcpServers":"{p2} in {p1} for mcp_servers.{p0}","adapter.codex.actions.mcpServersIsNotAStringArrayRefusingTo":"mcp_servers.{p0} {p1} is not a string array; refusing to write an unknown format ({p2})","adapter.codex.actions.editedResultIsNotValidTOMLWriteAbandoned":"Edited result is not valid TOML; write abandoned ({p0}): {p1}","adapter.codex.actions.editedResultDiffersFromTheExpectedMinimalChangeRefusing":"Edited result differs from the expected minimal change; refusing to write ({p0})","adapter.codex.actions.enabledForIsNotABooleanRefusingToWrite":"enabled for {p0} is not a boolean; refusing to write an unknown field format ({p1})","adapter.codex.actions.isAlreadyInTheRequestedStateEnabledNoWrite":"{p0} is already in the requested state (enabled={p1}); no write needed; scan again before retrying","adapter.codex.actions.tableHeaderInlineTableOrNonstandardSyntax":"[{p0}] table header (inline table or nonstandard syntax)","adapter.codex.actions.cannotSafelyLocateRefusingToWriteEditItManually":"Cannot safely locate {p0}; refusing to write ({p1}); edit it manually","adapter.codex.actions.internalErrorExpectedStructureIsMissingTable":"Internal error: expected structure is missing table {p0}","adapter.codex.protocol.thisAGENTSMdProtocolBlockIsSharedByCodex":"This AGENTS.md protocol block is shared by Codex and dsh","adapter.codex.protocol.blockRemovedAndUserChangesPreserved":"{p0}; block removed and user changes preserved","adapter.codex.protocol.theManagedBlockWasModifiedRefusingToAndPreserving":"{p0}: the managed block was modified; refusing to {p1} and preserving user content","adapter.dsh.hooks.refusingToWriteCannotParseYAMLInUnknownFormats":"Refusing to write: cannot parse YAML in {p0} ({p1}); unknown formats are not inferred","adapter.dsh.hooks.refusingToWriteRootIsNotAYAMLArray":"Refusing to write: {p0} root is not a YAML array (dsh patch layer format); unknown formats are not inferred","adapter.dsh.hooks.refusingToWriteEntryInIsNotAMapping":"Refusing to write: entry {p1} in {p0} is not a mapping (loader patch entry); unknown formats are not inferred","adapter.dsh.hooks.hasAWingmanStartMarkerWithoutAnEndMarker":"{p0} has a wingman start marker without an end marker (possibly modified manually); refusing automatic changes: remove the marker block manually or restore from backup","adapter.dsh.hooks.unknownWiringStateVersionRefusingToInferItsFormat":"Unknown wiring state version; refusing to infer its format","adapter.dsh.hooks.wiringStateStructureIsCorruptRefusingAutomaticChanges":"Wiring state structure is corrupt; refusing automatic changes","adapter.dsh.hooks.dshProfileDoesNotExistOrIsMissingPackage":"dsh profile does not exist or is missing package.json: {p0}","adapter.dsh.hooks.refusingToWriteAlreadyHasAnUnmarkedEntryPossibly":"Refusing to write: {p0} already has an unmarked {p1} entry (possibly copied manually); remove it manually first","adapter.dsh.hooks.refusingToWriteShapeValidationFailedAfterAppendingTo":"Refusing to write: shape validation failed after appending to {p0} (cannot safely append to the existing format); refusing to guess","adapter.dsh.hooks.refusingAutomaticChangesToDSHHOMECordisPatchYml":"Refusing automatic changes to $DSH_HOME/cordis.patch.yml: the file or wiring state cannot be safely read, parsed, or written; disconnect manually, then reconnect","adapter.dsh.toggle.wingmanToggleBlockInHasAMismatchedEndMarker":"Wingman toggle block ({p1}) in {p0} has a mismatched end marker (possibly modified manually); refusing automatic changes: remove the marker block manually or restore from backup","adapter.dsh.toggle.wingmanToggleBlockFlagIsCorruptInRefusingAutomatic":"Wingman toggle block flag is corrupt in {p0} ({p1}); refusing automatic changes","adapter.dsh.toggle.hasAnUnknownWingmanFlagRefusingAutomaticChangesOr":"{p0} has an unknown wingman flag ({p1}); refusing automatic changes or format inference","adapter.dsh.toggle.wingmanToggleBlockIdIsInvalidInRefusingAutomatic":"Wingman toggle block id is invalid in {p0} ({p1}); refusing automatic changes","adapter.dsh.toggle.containsDuplicateWingmanToggleBlocksPossiblyCopiedManuallyRefusing":"{p0} contains duplicate wingman toggle blocks ({p1}), possibly copied manually; refusing automatic changes","adapter.dsh.toggle.hasAnUnrecognizedWingmanMarkerLineRefusingAutomaticChanges":"{p0} has an unrecognized wingman marker line ({p1}…); refusing automatic changes or format inference","adapter.dsh.toggle.wingmanToggleBlockInHasNoEndMarkerPossibly":"Wingman toggle block ({p1}) in {p0} has no end marker (possibly modified manually); refusing automatic changes: remove the marker block manually or restore from backup","adapter.dsh.toggle.wingmanLiveHooksBlockInHasNoEndMarker":"Wingman live hooks block in {p0} has no end marker (possibly modified manually); refusing automatic changes","adapter.dsh.toggle.wingmanToggleBlockInWasModifiedRefusingAutomaticChanges":"Wingman toggle block ({p1}) in {p0} was modified; refusing automatic changes: remove the marker block manually or restore from backup","adapter.dsh.toggle.unsupportedActionKindDshVOnlySupportsToggle":"Unsupported action kind: {p0} (dsh v1 only supports toggle)","adapter.dsh.toggle.actionIsMissingItemIdTheTargetItemSSlotItem":"Action is missing itemId (the target item's SlotItem.id)","adapter.dsh.toggle.actionIsMissingEnableTrueOnFalseOff":"Action is missing enable (true=on, false=off)","adapter.dsh.toggle.itemWasNotFoundConfigurationMayHaveChangedScan":"Item {p0} was not found: configuration may have changed; scan again and retry","adapter.dsh.toggle.isALayerItselfRulesSlotAndCannotBe":'"{p0}" is a layer itself (rules slot) and cannot be toggled',"adapter.dsh.toggle.comesFromThePatchOverrideLayerAppliedAfterThe":`"{p0}" comes from the --patch override layer, applied after the home layer; Wingman's home patch cannot override it; toggle refused`,"adapter.dsh.toggle.itemIsNotAPluginRowAndCannotBe":"Item {p0} is not a plugin row and cannot be toggled","adapter.dsh.toggle.pluginInstanceIdContainsCharactersUnsafeForMarkersRefusing":"Plugin instance id contains characters unsafe for markers ({p0}); refusing to toggle or infer a format","adapter.dsh.toggle.wasAddedByWingmanLiveWiringLiveHooksBlock":'"{p0}" ({p1}) was added by Wingman live wiring (live hooks block); manage it with `wingman hook uninstall dsh`',"adapter.dsh.toggle.isAlreadyDisabledByWingmanEffectiveNextTimeDsh":'"{p0}" ({p1}) is already disabled by Wingman (effective next time dsh starts); toggle on to restore it',"adapter.dsh.toggle.alreadyHasAUserOwnedEntryNoMergeWill":"{p0} already has a user-owned {p1} entry; no merge will be inferred: handle the entry manually and retry","adapter.dsh.toggle.isAlreadyDisabledInLayerNativeSettingOutsideWingman":`"{p0}" ({p1}) is already disabled in layer {p2} (native setting outside Wingman's control); no further change needed`,"adapter.dsh.toggle.isNativelyDisabledInLayerOutsideWingmanSControl":`"{p0}" ({p1}) is natively disabled in layer {p2}, outside Wingman's control: edit that layer's bundle/profile configuration`,"adapter.dsh.toggle.isAlreadyEnabledNoToggleOnNeeded":'"{p0}" ({p1}) is already enabled; no toggle on needed',"adapter.dsh.toggle.planDidNotComeFromTheDshAdapterHarness":"Plan did not come from the dsh adapter (harness mismatch); refusing to apply","adapter.dsh.toggle.planWritesHasTheWrongShapeDshToggleWrites":"plan.writes has the wrong shape (dsh toggle writes to exactly one location); refusing to apply","adapter.dsh.toggle.planWriteTargetIsNotRefusingToApply":"Plan write target {p0} is not {p1}; refusing to apply","adapter.dsh.toggle.planWritesFieldsHaveTheWrongShapeBeforeAfter":"plan.writes[0] fields have the wrong shape (before/after do not match kind); refusing to apply","adapter.dsh.toggle.planBackupDirIsMissingRefusingToApply":"plan.backupDir is missing; refusing to apply","adapter.dsh.toggle.planBackupDirIsNotUnderRefusingToApply":"plan.backupDir is not under {p0}; refusing to apply","adapter.dsh.toggle.wasCreatedAfterPlanningAndNoLongerMatchesThe":"{p0} was created after planning and no longer matches the plan's assumptions; plan again","adapter.dsh.toggle.wasDeletedAfterPlanningAndNoLongerMatchesThe":"{p0} was deleted after planning and no longer matches the plan's assumptions; plan again","adapter.dsh.toggle.wasModifiedAfterPlanningAndDiffersFromThePlan":"{p0} was modified after planning and differs from the plan snapshot; plan again","adapter.dsh.protocol.theDshInstructionLoaderPluginIsDisabledSeeThe":"The dsh instruction loader plugin is disabled; see the switch on the controls page","adapter.dsh.protocol.uninstallingAffectsBothCodexAndDsh":"{p0}; uninstalling affects both Codex and dsh","adapter.dsh.protocol.uninstallingAffectsBothCodexAndDshUserChangesPreserved":"{p0}; uninstalling affects both Codex and dsh; user changes preserved","adapter.dsh.protocol.dshHasNoUserLevelInstructionFileInstallPer":"dsh has no user-level instruction file; install per project","adapter.dsh.dump-config.cannotParseDumpConfigYAML":"Cannot parse dump-config YAML: {p0}","adapter.dsh.dump-config.dumpConfigRootIsNotAPluginRowSequence":"dump-config root is not a plugin row sequence (YAML seq); differs from the pinned version's format; refusing to parse","adapter.dsh.dump-config.pluginRowInDumpConfigIsNotAYAML":"Plugin row {p0} in dump-config is not a YAML map; refusing to parse","adapter.dsh.dump-config.pluginRowInDumpConfigIsMissingItsBundle":'Plugin row {p0} in dump-config is missing its "# == <bundle>" source comment; refusing to parse',"adapter.dsh.dump-config.pluginRowInDumpConfigIsMissingAString":"Plugin row {p0} in dump-config is missing a string id/name; refusing to parse","adapter.dsh.dump-config.duplicateSlotItemIdSameLayerNameAndInstanceId":"Duplicate SlotItem.id: {p0} (same layer, name, and instance id cannot be distinguished); scan failed"},Vr={"cli.licenseStatusLine":`{state}: {detail}
2
2
  `,"cli.scanSummary":`harness: {harness}{version}
3
3
  scannedAt: {scannedAt}
4
4
  {counts}
@@ -44,12 +44,12 @@ Backed up before writing; safe to repeat. Remove with: wingman hook uninstall {h
44
44
  `,"cli.scanHarness":"--harness requires {ids}; received {value}","cli.scanUnknownArg":"scan does not recognize argument: {arg}","cli.scanHarnessRequired":"scan requires --harness <cc|codex|dsh>","cli.servePort":"--port requires an integer from 0 to 65535; received {value}","cli.panelDistRequired":"--panel-dist requires a directory path; no argument provided","cli.serveUnknownArg":"serve does not recognize argument: {arg}","cli.missingArgument":"(missing argument)","cli.listSeparator":", ","cli.localeRequired":"--locale requires a language tag; no argument provided","cli.protocolUser":"User","cli.protocolProject":"Project","cli.protocolCancelled":`wingman: Cancelled; no files written.
45
45
  `,"cli.protocolDone":`wingman: {harness} protocol {action} complete
46
46
  `,"cli.protocolUsage":"Protocol usage: wingman protocol install|uninstall|status <cc|codex|dsh> [--project <dir> | --user] [--dry-run] [--yes]","cli.protocolHarness":"protocol requires a harness in cc|codex|dsh; received {value}","cli.projectRequired":"--project requires a directory path; no argument provided","cli.protocolUnknownArg":"protocol does not recognize argument: {arg}","cli.protocolExclusiveScope":"--user and --project are mutually exclusive","cli.protocolFixtureUser":"fixtures mode rejects --user and cannot access user instruction files","cli.protocolFixtures":"protocol does not support --fixtures","cli.protocolTruncation":`Warning: Codex may truncate this block; AGENTS.md is near or above the default 32 KiB project_doc_max_bytes after installation.
47
- `,"cli.confirmWrite":"Confirm write? [y/N] ","cli.licenseMissing":"No license installed; the free tier shows one tool. A trial or subscription unlocks all three tools, the project overview and config toggles.","cli.licenseDevelopment":"Development build: no embedded public key; all features are available","cli.licenseJson":"The license file is not valid JSON","cli.licenseFields":"The license file is missing token/signature fields","cli.licenseSignature":"License signature verification failed (modified content or issued for another product)","cli.licenseClaimsFields":"License payload fields are incomplete","cli.licenseClaimsDecode":"The license payload could not be decoded","cli.licenseValidUntil":"{plan} valid until {exp}","cli.trialExpired":"Your trial expired on {exp}; the free tier shows one tool. A trial or subscription unlocks all three tools, the project overview and config toggles.","cli.licenseGrace":"Your subscription expired on {exp} and is within the {days}-day offline grace period (connect to renew)","cli.subscriptionExpired":"Your subscription expired on {exp} and its grace period has ended; the free tier shows one tool. A trial or subscription unlocks all three tools, the project overview and config toggles.","cli.licenseWriteFailed":"Could not write {path}: {message}","cli.refreshMissing":"Could not find {path}. Import a trial or subscription license.json first.","cli.refreshNetwork":"Could not connect. Try again later; your current license is unchanged","cli.refreshHttp":"The license server returned HTTP {status}","cli.refreshRejected":"Renewal rejected: {detail}","cli.refreshJson":"The license server returned invalid JSON; the original license is unchanged","cli.refreshFields":"The license server response is missing token/signature; the original license is unchanged","cli.refreshInvalid":"The license server returned an invalid license: {detail}; the original license is unchanged","cli.refreshChanged":"The local license changed during refresh; the newer file was preserved. Select Refresh license again","cli.refreshChangedUnreadable":"The local license changed during refresh; the current file was not overwritten","cli.licenseRenewed":"License renewed{suffix}","cli.licenseRenewedSuffix":", {plan} valid until {exp}","cli.trial":"Trial","cli.subscription":"Subscription"},Hr={"panel.source.projectMemory":"Project memory","panel.source.planStep":"plan.md step","panel.source.planInstruction":"Instruction for the plan","panel.source.latestInstruction":"Latest instruction","panel.source.workingDirectory":"Working directory","panel.source.homeDirectory":"Working directory = home","panel.source.planHeading":".wingman/plan.md H1","panel.source.userNamed":"User title","panel.source.permissionEvents":"PermissionRequest/Notification events","panel.source.liveEmptyState":"Live wiring state; no session title is available","panel.source.currentPointAncestors":".wingman/plan.md steps marked [?]","panel.source.feedbackUnavailable":"sessions.feedback.state=unavailable / feedback not provided","panel.source.planGoal":".wingman/plan.md Goal: ","panel.source.lastActivity":"Maximum sessions.lastActivity (latest hook received_at / transcript timestamp)","panel.source.sessionPlanTitle":"sessions.title (plan.md step)","panel.source.sessionDirectory":"sessions.label (session working directory name / sessionId)","panel.source.sessionLabelFallback":"sessions[].label (project payload is not ready)","panel.source.userPrompt":"User prompt","panel.source.agentQuote":"Agent statement","panel.source.savingEstimate":"Savings = resident tokens for the item (estimates marked “about”); disabling uses plan/apply with a backup and rollback","panel.source.savingUnavailable":"The harness does not report resident usage for this item; no savings are estimated; disabling uses plan/apply with a backup and rollback","panel.source.historyEstimate":"Estimate = total usage for this turn (reported by the harness, exact) − total resident configuration (estimated, marked “about”)","panel.source.ancestorLine":".wingman/plan.md:{line} top-level ancestor of the current point","panel.source.waitingProvenance":"Source: {event} event, unresolved since {since}; threshold 60s","panel.source.referenceMatch":"Match: {origin} — “{context}” (scanReferences whole-word match)","panel.source.unusedServer":"Observation: no tool steps in this session matched mcp__{server}__* (transcript observation)","panel.source.item":"Item: {path}","panel.source.historyThreshold":"Threshold: context ≥ {tokens} and history share > 50%"},Ur={"narrative.worktreePlanDifferent":"The plan in worktree {name} differs from the main repository","narrative.projectHasSessions":"This project still has sessions","narrative.projectNotRemembered":"Project is not in local memory","narrative.noStateDirectory":"No local state directory is configured","narrative.acceptanceUnreadable":"Local acceptance state could not be read","narrative.homeDirectory":"No project directory (home)","narrative.sessionLimit":"Reached the 8-session limit","narrative.planMissing":"The plan file does not exist","narrative.memoryUnavailable":"Project memory is unavailable (~/.wingman/state/projects.json)","narrative.firstWriteBefore":"The plan file was first written before non-plan tool step 1","narrative.noPlanWrite":"No plan.md write through a file editing tool was observed for this session","narrative.waitingPermission":"Waiting for permission","narrative.waitingResponse":"Waiting for a response","narrative.feedbackUnavailable":"Feedback signals are unavailable","narrative.feedbackUnreported":"Feedback capabilities were not reported","narrative.feedbackUnmapped":"Feedback capabilities have not been mapped","narrative.acceptanceOnResponse":"Acceptance state is read when responding","narrative.unknownVersion":" (version unknown; another version may be installed)","narrative.firstWriteAfter":"The plan file was first written after non-plan tool step {step}","narrative.writeSummary":"This session wrote {count} times · Latest {at}","narrative.waitingPermissionDetail":"Waiting for permission: {reason}","narrative.waitingResponseDetail":"Waiting for a response: {reason}","narrative.feedbackNotWired":"Feedback signals are not wired; run {command}","narrative.feedbackNotWiredUnknownVersion":"Feedback signals are not wired; run {command} (version unknown; another version may be installed)","narrative.phase.inspect":"Inspect","narrative.phase.modify":"Modify","narrative.phase.verify":"Verify","narrative.phase.other":"Other","narrative.planTooLarge":"The plan file exceeds 1 MiB","narrative.planNotRegular":"The plan file is not a regular file","narrative.planOutsideRoot":"The symbolic link resolves outside the project root","narrative.planInvalidUtf8":"The plan file is not valid UTF-8","narrative.planTooManyLines":"The plan file exceeds 20000 lines","narrative.planUnsupportedVersion":"The format version is not supported","narrative.planConflict":"The plan file contains Git conflict markers","narrative.planTooManyNodes":"The plan exceeds 2000 nodes","narrative.currentPoint":"Current point","narrative.noCurrentPoint":"The plan has no step marked in progress","narrative.allComplete":"The agent marked all project steps complete","narrative.sessionCompleteProjectActive":"The session plan is complete; the project step is still in progress","narrative.cancelledParent":"The parent step is cancelled, but a descendant is still marked in progress","narrative.pending":"Pending","narrative.inProgress":"In progress","narrative.completed":"Complete","narrative.cancelled":"Cancelled","narrative.checkpoint":"Checkpoint","narrative.parallelPoints":"{count} items in parallel","narrative.noActiveSession":"No active session is currently observed under “{step}”","narrative.recentWriters":"{count} sessions wrote this file in the last 60 seconds","narrative.completedParent":"The parent step is marked complete, but a descendant is still marked {status}","narrative.pendingParent":"The parent step is pending, but a descendant is marked {status}","narrative.dshNoPlan":"dsh does not expose a stable local todo projection to Wingman hooks","narrative.ccPlanInvalid":"Claude Code plan tool arguments could not be parsed","narrative.codexPlanInvalid":"Codex update_plan arguments could not be parsed","narrative.memoryUnreadable":"Project memory could not be read (~/.wingman/state/projects.json)","narrative.memoryInvalid":"Project memory could not be parsed (~/.wingman/state/projects.json)","narrative.memoryRefuse":"Project memory is unavailable; refusing to overwrite (~/.wingman/state/projects.json)","narrative.memoryUpdateFailed":"Project memory could not be updated (~/.wingman/state/projects.json)","narrative.invalidStructure":"not a valid v1 structure","narrative.overlayUnreadable":"The overlay file could not be read; check {path}: {error}","narrative.overlayInvalid":"The overlay file could not be parsed; check {path}: {error}","narrative.overlayRefuse":"The overlay file could not be parsed; refusing to overwrite; check {path}","narrative.shellWriteUnconfirmed":"A write through the shell could not be confirmed","narrative.noAttributableChange":"No attributable change to an in-progress step was observed","narrative.ambiguousAttribution":"The write affects multiple in-progress steps and cannot be attributed uniquely","narrative.approximately":"about {value}","narrative.waited":"Waiting for {duration}: {message}","narrative.reenable":"{name} was mentioned and is off; you can enable it","narrative.saving":", disabling it can save {tokens} tok (resident estimate)","narrative.unused":"{server} has not been used in this session{saving}","narrative.historyBloat":"Conversation history uses about {percent}% of this turn’s context (about {history} / {context}); a new session resets it","narrative.canDisable":", it can be disabled"},Br={"panel.mobile.heading":"Phone","panel.mobile.pairedCount":"Paired devices: {count}","panel.mobile.paused":"Sync paused","panel.mobile.requiresLicense":"A trial or active subscription is required to pair a phone (the free tier shows one tool).","panel.mobile.localRemoved":"Local record removed; relay data clears automatically after 24 hours","panel.mobile.localWriteFailed":"Could not save the local phone pairing record. Check the local state directory and try again.","panel.mobile.pair":"Pair phone","panel.mobile.disclosure":"After pairing, your Mac uploads encrypted project and session status for the phone app to read. The relay only sees ciphertext.","panel.mobile.scan":"Scan with the Wingman app on your phone","panel.mobile.qrLabel":"Phone pairing QR code","panel.mobile.autoClose":"Closes automatically after you scan on your phone","panel.mobile.cancel":"Cancel pairing","panel.mobile.unnamed":"Phone","panel.mobile.paired":"Paired","panel.mobile.pending":"Waiting for scan","panel.mobile.unpaired":"Not paired","panel.mobile.pairedAt":"Paired at","panel.mobile.lastSync":"Last sync","panel.mobile.notSynced":"Not synced yet","panel.mobile.unpair":"Unpair","panel.mobile.confirm":"Unpair “{name}”? Your Mac will stop uploading and the relay will delete this pair’s data.","panel.mobile.keep":"Keep paired","panel.mobile.working":"Working…","panel.mobile.keychainUnavailable":"macOS Keychain is unavailable. Allow Keychain access and try again.","panel.mobile.stateUnavailable":"Could not read phone pairing records. Check local pairing settings and try again.","panel.mobile.relayUnavailable":"Could not connect to the relay. Try again shortly.","panel.mobile.unavailable":"Phone pairing action failed. Try again.","panel.mobile.invalidRelay":"The phone relay address is unavailable. Check local relay settings.","panel.mobile.pairNotFound":"This phone has been unpaired. Pair it again to continue.","island.waitingForYou":"{p0} is waiting for you: {p1}","panel.main.backToSessionSettingsResponseUnavailable":"Back-to-session settings response unavailable","panel.main.couldNotSaveBackToSession":"Could not save back-to-session settings","panel.main.couldNotLoadBackToSession":"Could not load back-to-session settings","panel.main.activationResponseUnavailable":"Activation response unavailable","panel.main.activationRequestFailed":"Activation request failed","panel.main.organizationRequestFailed":"Organization request failed: {p0}","panel.main.refreshFailed":"Refresh failed: {p0}","panel.main.licenseRefreshed":"License refreshed: {p0}","panel.main.licenseRefreshedReopenThePanelTo":"License refreshed; reopen the panel to see its latest status","panel.main.couldNotReadFile":"Could not read file: {p0}","panel.main.importRequestFailed":"Import request failed: {p0}","panel.main.dropToImportLicense":"Drop to import license","panel.main.demoSampleIsMissingItsMock":"Demo sample is missing its MOCK label (project rule 10)","panel.main.theServerHasNoActionEndpoint":"The server has no action endpoint (dev mode?), and the demo sample is unavailable: {p0}","panel.main.userPlanProtocol":"{p0} {p1} user Plan protocol","panel.main.install":"Install","panel.main.uninstall":"Uninstall","panel.main.thePlanDoesNotMatchThe":"The plan does not match the requested user protocol action","panel.main.applyRequestFailed":"Apply request failed: {p0}","panel.main.shareConfigurationSample":"Share configuration sample · {p0}","panel.main.shareEventSample":"Share event sample","panel.main.couldNotSend":"Could not send: {p0}","panel.actions.disableToSave":"Disable to save {p0}","panel.actions.enablingAdds":"Enabling adds +{p0}","panel.actions.create":"Create","panel.actions.delete":"Delete","panel.actions.modify":"Modify","panel.actions.lines":"{p0} lines","panel.actions.previouslyLines":"Previously {p0} lines","panel.actions.linesLines":"{p0} lines → {p1} lines","panel.actions.effectiveImmediatelyTheHarnessWatchesThis":"Effective immediately — the harness watches this mechanism; the current session also updates","panel.actions.effectiveAfterReconnectingRestartTheHarness":"Effective after reconnecting — restart the harness or reconnect its MCP server to load changes","panel.actions.effectiveNextSessionOngoingConversationsAre":"Effective next session — ongoing conversations are unaffected; a new session loads the new configuration","panel.actions.enable":"Enable","panel.actions.disable":"Disable","panel.actions.planPayloadViolatesTheContractCannot":"Plan payload violates the contract; cannot render: {p0}","panel.actions.writesIsNotAnObject":"writes[{p0}] is not an object","panel.actions.writesFileIsNotANonempty":"writes[{p0}].file is not a nonempty string","panel.actions.writesKindHasUnknownValue":"writes[{p0}].kind has unknown value {p1}","panel.actions.writesBeforeIsMissingKindRequires":"writes[{p0}].before is missing (kind={p1} requires complete previous content)","panel.actions.writesAfterIsMissingKindRequires":"writes[{p0}].after is missing (kind={p1} requires complete new content)","panel.actions.referencesIsNotAnObject":"references[{p0}] is not an object","panel.actions.referencesFileIsNotANonempty":"references[{p0}].file is not a nonempty string","panel.actions.referencesLineIsNotABased":"references[{p0}].line is not a 1-based line number","panel.actions.referencesMatchednameIsNotAString":"references[{p0}].matchedName is not a string","panel.actions.referencesContextIsNotAString":"references[{p0}].context is not a string","panel.actions.notAnObject":"Not an object","panel.actions.harnessHasUnknownValue":"harness has unknown value {p0}","panel.actions.actionIsNotAnObject":"action is not an object","panel.actions.actionKindHasUnknownValueV":"action.kind has unknown value {p0} (v1 plans only support toggle)","panel.actions.actionItemidIsNotANonempty":"action.itemId is not a nonempty string","panel.actions.actionEnableIsNotABoolean":"action.enable is not a boolean","panel.actions.writesIsNotAnArray":"writes is not an array","panel.actions.backupdirIsNotANonemptyString":"backupDir is not a nonempty string","panel.actions.referencesIsNotAnArray":"references is not an array","panel.actions.effectiveatHasUnknownValue":"effectiveAt has unknown value {p0}","panel.actions.applyResponseViolatesTheContractNot":"Apply response violates the contract: not an object","panel.actions.applyResponseViolatesTheContractOk":"Apply response violates the contract: ok=true but backupDir is missing","panel.actions.applyResponseViolatesTheContractOk59":"Apply response violates the contract: ok=false but the original error is missing","panel.actions.applyResponseViolatesTheContractOk60":"Apply response violates the contract: ok is not a boolean","panel.actions.kindHasAnUnknownValue":"kind has an unknown value","panel.actions.harnessDoesNotSupportUserPlan":"harness does not support user Plan protocol","panel.actions.hasblockIsNotABoolean":"hasBlock is not a boolean","panel.actions.blockbytesIsNotANonnegativeInteger":"blockBytes is not a nonnegative integer byte count","panel.actions.isNotANonemptyString":"{p0} is not a nonempty string","panel.actions.pathsMustUseTheAbbreviation":"Paths must use the ~/ abbreviation","panel.actions.updateVersionsMustBeIncreasingIntegers":"Update versions must be increasing integers fromVersion / toVersion for an existing block","panel.actions.applyResponseViolatesTheContractPlanprotocol":"Apply response violates the contract: planProtocol.user state is missing","panel.actions.applyResponseViolatesTheContractBackupdir":"Apply response violates the contract: backupDir must use the ~/ abbreviation","panel.actions.fixturesModeIsReadOnly":"Fixtures mode is read-only","panel.format.baseInstructions":"Base instructions","panel.format.yourRules":"Your rules","panel.format.skills":"Skills","panel.format.toolDefinitions":"Tool definitions","panel.format.gateHooks":"Gate hooks","panel.format.conversationHistory":"Conversation history","panel.format.builtInSystemPrompt":"Built-in system prompt","panel.format.builtInInstructions":"Built-in instructions","panel.format.corePluginEverythingIsAPlugin":"core plugin (everything is a plugin)","panel.format.skillPlugin":"skill plugin","panel.format.toolPlugins":"tool-* plugins","panel.format.approvalPermissionPlugins":"approval · permission plugins","panel.format.sessionLogPlugin":"session log plugin","panel.format.about":"About {p0}","panel.format.residentAfterTrigger":"Resident {p0} · After trigger {p1}","panel.format.fullPluginApi":"Full · Plugin API","panel.format.pushHooks":"Push · hooks","panel.format.notWired":"Not wired","panel.format.file":"File: {p0}","panel.format.noFileSource":"No file (source: {p0})","panel.format.estimateBytesLabeledAbout":"Estimate = bytes ÷ 3.5, labeled About","panel.format.exactValueHarnessReportedUsageTokens":"Exact value (harness-reported usage): {p0} tokens","panel.license.licenseImported":"License imported — {p0}","panel.license.licenseImportedNewStatusUnknownRefresh":"License imported (new status unknown; refresh this page)","panel.license.dropOneLicenseJsonFileAt":"Drop one license.json file at a time (received {p0})","panel.license.onlyJsonFilesAreAcceptedReceived":"Only .json files are accepted (received {p0})","panel.live.sessionStarted":"Session started","panel.live.sessionEnded":"Session ended","panel.live.promptSubmitted":"Prompt submitted","panel.live.toolCallStarted":"Tool call started","panel.live.toolCallCompleted":"Tool call completed","panel.live.toolBatchCompleted":"Tool batch completed","panel.live.turnEnded":"Turn ended","panel.live.subagentStarted":"Subagent started","panel.live.subagentEnded":"Subagent ended","panel.live.compactionStarted":"Compaction started","panel.live.compactionCompleted":"Compaction completed","panel.live.configurationChanged":"Configuration changed","panel.live.instructionsLoaded":"Instructions loaded","panel.live.notification":"Notification","panel.live.permissionRequest":"Permission request","panel.live.notWired":"Not wired","panel.live.waitingForEvents":"Waiting for events","panel.live.quiet":"Quiet","panel.live.running":"{p0} running","panel.live.demoReplayMock":"Demo replay · MOCK","panel.live.liveConnectionEstablished":"Live connection established","panel.live.disconnectedReconnectingAutomatically":"Disconnected · Reconnecting automatically","panel.live.connecting":"Connecting…","panel.taskboard.waitingForYou":"Waiting for you","panel.taskboard.turnEnded":"Turn ended","panel.taskboard.ended":"Ended","panel.taskboard.inProgress":"In progress","panel.taskboard.allowed":"Allowed","panel.taskboard.denied":"Declined","panel.taskboard.dshHasNoObservedCommandTo":"dsh has no observed command to resume a specific session; continue in the original terminal","panel.taskboard.sourceSessionIdFromHookEvents":"Source: session id from hook events; command syntax from codex resume --help","panel.taskboard.sourceSessionIdFromHookEvents132":"Source: session id from hook events; command syntax from claude --help; run in the original project directory","panel.taskboard.sourceSessionIdAndWorkingDirectory":"Source: session id and working directory from hook events; command syntax from claude --help","panel.taskboard.justNow":"just now","panel.taskboard.minutesAgo":"{p0} min ago","panel.taskboard.hoursAgo":"{p0} h ago","panel.share.linesAboutKbLimitKb":"{p0} lines · About {p1} KB / Limit 256 KB"},_r={"panel.narrative.invalidSkillInvocation":"Invalid skill invocation fields for {harness}","panel.narrative.payloadNotArray":"The payload is not a JSON array","panel.narrative.payloadEntryNotObject":"A payload entry is not an object","panel.narrative.payloadMissingFields":"A payload entry is missing harness/scannedAt","panel.narrative.projectUnavailable":"Project payload is unavailable","panel.narrative.sessionUnavailable":"Session narrative payload is unavailable","panel.narrative.goal":"Goal","panel.narrative.latestInstruction":"Latest instruction","panel.narrative.aborted":" (aborted)","panel.narrative.incomplete":" (incomplete)","panel.narrative.subagent":"Subagent","panel.narrative.mainAgent":"Main agent","panel.narrative.openRequest":"There is an open request","panel.narrative.waitingForYou":"Waiting for you","panel.narrative.inProgress":"In progress","panel.narrative.notWired":"Not wired","panel.narrative.waitingEvents":"Waiting for events","panel.narrative.missingSlot":"Harness {harness} is missing slot {slot}","panel.narrative.invalidUserProtocol":"Harness {harness} has an invalid planProtocol.user","panel.narrative.invalidProjectProtocol":"Harness {harness} has an invalid planProtocol.project","panel.narrative.unavailableProject":"Unavailable project {number}","panel.narrative.waitOverdue":" · Waiting for {minutes}m+","panel.narrative.waitLabel":"Waiting for you{who}: {message}{overdue}","panel.narrative.event.SessionStart":"Session started","panel.narrative.event.SessionEnd":"Session ended","panel.narrative.event.UserPromptSubmit":"New prompt received","panel.narrative.event.PreToolUse":"Tool call started","panel.narrative.event.PostToolUse":"Tool call completed","panel.narrative.event.userRejected":"You declined","panel.narrative.event.Stop":"Turn ended","panel.narrative.event.Notification":"Notification received","panel.narrative.event.PermissionRequest":"Waiting for permission","panel.narrative.event.SubagentStart":"Subagent started","panel.narrative.event.SubagentStop":"Subagent ended","panel.narrative.event.PreCompact":"Compaction started","panel.narrative.event.PostCompact":"Compaction completed"},qr={"panel.render.projectPaused":"Paused","panel.render.noSessionsYet":"No sessions yet","panel.render.forgetProject":"Forget this project","panel.render.forgetProjectConfirm":"Remove this project from Wingman’s local memory. Project files stay intact; it will reappear when a new session starts.","panel.render.forget":"Forget","panel.render.codexProjectHint":"Codex project: {name}","panel.render.projectWorktree":"Worktree {name}","panel.render.worktreePlan":"Worktree {name} plan: {path}","panel.render.originExec":"Codex CLI · exec","panel.render.originCli":"Codex CLI","panel.render.originDesktop":"Codex Desktop","panel.render.originSource":"Source: session_meta.originator / source","panel.render.chipNoInstruction":"No instruction yet · {p0}","panel.render.chipDirectory":"Directory: {p0}","panel.render.chipTitleSource":"Title source: {p0}","panel.render.chipTurnEnded":"Turn ended (no events or transcript activity since Stop or the main transcript turn-end signal)","panel.render.projectsPageTitle":"Project overview","panel.render.projectsPageHint":"Goals, progress and decisions across your coding apps.","panel.render.controlsPageHint":"Manage tools, preferences and how you return to a session.","panel.render.optionalSuggestions":"Optional suggestions","panel.render.suggestionsHint":"Based on observed session activity, for reference only. Review changes before applying.","panel.render.usagePageHint":"Reported usage and estimated context, kept separate.","panel.render.toolsAndPreferences":"Tools & preferences","panel.render.controlSkills":"Skills & plugins","panel.render.controlTools":"Tools & connections","panel.render.controlBehavior":"Behavior & permissions","panel.render.controlSummary":"{count} items · {enabled} enabled","panel.render.controlSummarySource":"Source: total toggleable entries and enabled entries in scanned slots.{slot}[]; this does not prove session use","panel.render.controlSettingsCount":"{count} settings","panel.render.codexPluginControlHint":"Codex plugins: controls the whole plugin package, not an individual skill.","panel.render.contextSources":"Explore context sources","panel.render.requestsUnavailable":"Requests unavailable · view details","panel.render.localFeedStatus":"Local feed · {status}","panel.render.lastHookReceived":"Last hook received {p0}","panel.render.hookNotReceived":"Not yet received","panel.render.hookReceiptSource":"Source: hooks received by this sidecar, {count} since startup","panel.render.hookReceiptUnavailable":"Sidecar hook receipt metadata is not yet available","panel.render.wingmanInstanceCount":"About {p0} Wingman instances detected","panel.render.wingmanInstanceSource":"Source: runtime directory records whose processes are alive","panel.render.codexBroadcastSource":"Codex events are delivered to every instance","panel.render.wingmanInstancesUnavailable":"Wingman instances {p0}","panel.render.notApplicable":"Not applicable","panel.render.wingmanInstancesFixtureSource":"Fixtures mode does not read the local runtime directory","panel.render.appFilter":"App","panel.render.olderSessions":"{count} older sessions","panel.render.olderSessionsSource":"Source: sessions.ended and lastActivity more than {days} days ago; display only","panel.render.archiveSession":"Archive","panel.render.archiveThisSession":"Archive this session","panel.render.restoreSession":"Restore","panel.render.archivedSessions":"Archived sessions ({count})","panel.render.sessionArchiveSource":"Source: local task-overlay.json session / project archived; harness data is retained","panel.render.sessionArchiveActivitySource":"Source: session event timestamp > session or project archivedAt","panel.render.ccEnabled":"Enabled","panel.render.ccPartial":"Partly restricted","panel.render.ccDisableAll":"Disable all","panel.render.ccPartialWarning":"Only some messaging tools are denied. Disable all denies both SendMessage and ListAgents.","panel.render.ccFeatures":"Claude Code settings","panel.render.ccSettingsHint":"Changes local user settings, not just the selected session. Review changes before confirming.","panel.render.ccMessageHelp":"What this changes","panel.render.ccInboundHelp":"Controls messages from other Claude Code sessions. Accept delivers messages to Claude. Hold shows a notice without delivery, until an effective setting allows acceptance. Refuse discards them.","panel.render.ccInboundImpact":"This does not control your chat input. Delivered messages can start a new turn in an idle session and incur usage. They do not automatically include the sender’s full history or files; the recipient’s own permissions still apply.","panel.render.ccOutboundHelp":"Lets Claude find and message other sessions, for example to share a task result. Enabling only removes these send and discovery tool denials; other permission rules still apply.","panel.render.ccAutoMemory":"Auto memory","panel.render.ccInbound":"Messages from other Claude sessions","panel.render.ccOutbound":"Allow Claude to send messages","panel.render.ccDefault":"Default","panel.render.ccByPermissionMode":"Determined by permission mode","panel.render.ccAccept":"Accept","panel.render.ccHold":"Hold","panel.render.ccRefuse":"Refuse","panel.render.ccOutboundWarning":"Disabling denies both SendMessage and ListAgents. It stops cross-session sending and also restricts communication with subagents (assistants Claude delegates to) and agent-team members. Receiving is controlled separately above.","panel.render.ccOverridden":"Overridden by {layer}; changes here have no effect","panel.render.ccLayerProject":"project settings","panel.render.ccLayerLocal":"project-local settings","panel.render.ccLayerManaged":"managed settings","panel.render.ccInvalid":"Unknown configuration format; changes disabled","panel.render.ccExactChanges":"Keys and values to write","panel.render.ccRemoveKey":"Remove key (restore default)","panel.render.ccSetInbound":"Set incoming messages to {value}","panel.render.ccInvalidPayload":"Invalid Claude Code feature payload","panel.render.ccScope":"Edits user settings.json only. Override checks cover project and project-local settings, managed JSON files and the remote cache; MDM, policy helpers and host-supplied policies are not inspected.","panel.render.skillAuto":"Auto","panel.render.skillManual":"Manual","panel.render.skillAgentOnly":"Agent only","panel.render.skillOff":"Off","panel.render.skillAutoMeaning":"Default disable-model-invocation: false / user-invocable: true; both the user and Agent can invoke it","panel.render.skillManualMeaning":"disable-model-invocation: true / user-invocable: true; explicit user invocation only, with no automatic Agent loading; the description is not loaded into context","panel.render.skillAgentOnlyMeaning":"disable-model-invocation: false / user-invocable: false; hidden from the user menu, only the Agent can invoke it","panel.render.skillOffMeaning":"disable-model-invocation: true / user-invocable: false; neither the user nor the Agent can invoke it","panel.render.skillFrontmatterSource":"Source: SKILL.md frontmatter disable-model-invocation / user-invocable; invocation mode is determined by SKILL.md. The toggle only controls configuration enablement","panel.render.skillOverridesSource":"Source: settings skillOverrides; disabled in configuration","panel.render.skillConfiguration":"Configuration","panel.render.dshControlsSummary":"{count} items · {enabled} enabled","panel.render.dshControlsSummarySource":"Source: total toggleable entries and enabled entries in slots.{slot}[] scanned from dsh --dump-config; configuration enablement does not prove session use","panel.render.plugins":"Plugins","panel.render.pluginConfigurationTip":"Configuration enablement does not prove session use; usage comes from the Codex transcript","panel.render.pluginsSummary":"{enabled} plugins enabled · {used} used this session","panel.render.pluginsUnobserved":"{enabled} plugins enabled · No plugin calls observed this session","panel.render.pluginsSummarySource":"Source: enabled entries in slots.skills[].enabled scanned from config.toml plugin configuration; session usage is the deduplicated pluginsUsed from matching MCP tool calls in the Codex transcript against configured plugin names (with a few aliases); configuration enablement does not prove session use","panel.render.skillConfigurationTip":"Whether this session actually loaded a skill is determined by the transcript","panel.render.ccSkillsSummary":"{enabled} skills enabled · {used} used this session","panel.render.ccSkillsUnobserved":"{enabled} skills enabled · No skill calls observed this session","panel.render.ccSkillsSummarySource":"Source: entries that are not off according to scanned slots.skills[].enabled and invocation (SKILL.md frontmatter); session usage is deduplicated skillsUsed from Skill tool calls or explicit skill command loading records in the Claude Code transcript; configuration enablement does not prove session use","panel.render.ccToolsSummary":"{enabled} MCP servers enabled · {used} used this session","panel.render.ccToolsUnobserved":"{enabled} MCP servers enabled · No MCP calls observed this session","panel.render.ccToolsSummarySource":"Source: enabled entries among mcpServers.* in scanned slots.tools[]; session usage is deduplicated mcpUsed from matching mcp__<server>__<tool> calls in the Claude Code transcript against configured server names (- and _ are equivalent); configuration enablement does not prove session use","panel.render.skillsUsed":"Used this session: {skills}","panel.render.skillsUsedSource":"Source: observed Skill tool calls / skill command triggers in the transcript","panel.render.projectMenu":"Project menu","panel.render.archiveProject":"Archive","panel.render.restoreProject":"Restore","panel.render.archivedProjects":"{count} archived projects","panel.render.projectArchiveNewActivity":"New activity","panel.render.projectArchiveActivitySource":"Source: firstScreen.lastActivity.at > user.archivedAt","panel.render.projectArchiveSource":"Source: local task-overlay.json archived / archivedAt; hidden in all tabs until you restore it, even after new activity","panel.render.moveProjectUp":"Move pinned project up","panel.render.moveProjectDown":"Move pinned project down","panel.render.projectPinSource":"Source: local task-overlay.json pinned / order","panel.render.filterBySessionHarness":"Filter by the harness each session belongs to","panel.render.projectsHiddenByFilters":"{count} projects hidden by filters","panel.render.projectFilterSource":"Source: project sessions, harness, status and local hidden flags","panel.render.expandAllProjects":"Expand all","panel.render.collapseAllProjects":"Collapse all","panel.render.waitTrace":"{label}: {message}{outcome}","panel.render.sessionIdentifier":"Session: {id}","panel.render.operationOnHost":"· {verb} will happen on this machine","panel.render.protocolFileOperation":"File for protocol {verb}","panel.render.protocolImpactLabel":"Effect on harness and projects","panel.render.protocolImpactInstall":"Only adds one managed block to this file so the agent writes its progress as a plan file. It never rewrites harness behavior or any project code.","panel.render.protocolImpactUpdate":"Only updates the managed block in this file to the new version so the agent writes its progress as a plan file. It never rewrites harness behavior or any project code.","panel.render.protocolImpactUninstall":"Only removes the managed block from this file and keeps everything else as is. It never rewrites harness behavior or any project code.","panel.render.deleteLineNumber":"Delete line {line}","panel.render.close":"Close","panel.render.language":"Language","panel.render.noConversationObserved":"No conversation observed yet","panel.render.conversationDetailsPending":"Waiting for conversation details","panel.render.conversationDetailsPendingHint":"A conversation was observed. Its details will appear here when available. If nothing updates, check the connection details.","panel.render.checkConnection":"Check your connection","panel.render.startConversationHint":"Start or continue a conversation in {harness}. Your tasks and progress will appear here.","panel.render.checkConnectionHint":"Activity from {harness} is not yet confirmed. Check the connection settings, then start a conversation in the app.","panel.render.conversationNotShowing":"Already started, but nothing here?","panel.render.viewConnectionSettings":"View connection settings","panel.render.connectionDetails":"Connection details","panel.render.connectionInstallCommand":"If you need to reconnect, use this command","panel.render.planDisplaySettings":"Plan display settings","panel.render.helpAndFeedback":"Help & feedback","panel.render.apiAnatomyReturnedAnEmptyArray":"/api/anatomy returned an empty array","panel.render.noHarnessDetected":"No harness detected","panel.render.firstRun":"First run","panel.render.thenThePanelReadsAnatomyData":", then the panel reads anatomy data from GET /api/anatomy.","panel.render.versionUnknownADifferentVersionMay":"(Version unknown; a different version may be installed)","panel.render.sourceClickToExpandThePanel":`{p0} · {p1}{p2}
47
+ `,"cli.confirmWrite":"Confirm write? [y/N] ","cli.licenseMissing":"No license installed; the free tier shows one tool. A trial or subscription unlocks all three tools, the project overview and config toggles.","cli.licenseDevelopment":"Development build: no embedded public key; all features are available","cli.licenseJson":"The license file is not valid JSON","cli.licenseFields":"The license file is missing token/signature fields","cli.licenseSignature":"License signature verification failed (modified content or issued for another product)","cli.licenseOtherDevice":"This license is bound to another device","cli.licenseDeviceUnavailable":"This Mac’s device identifier is unavailable. Activation is unavailable; existing unbound licenses keep their current validity.","cli.licenseDeviceLimit":"This license is already activated on 3 devices","cli.licenseActivationExpired":"This license has expired. Renew it before activating this device.","cli.licenseUnbindRequiresActiveDevice":"Unbind devices from an activated device with an unexpired license.","cli.licenseDeviceRevoked":"This device’s activation was revoked. Click “Activate this device” to activate it again.","cli.licenseFixturesOffline":"Fixture mode does not contact the online license server","cli.licenseDevicesInvalid":"The license server returned an invalid device list","cli.licenseClaimsFields":"License payload fields are incomplete","cli.licenseClaimsDecode":"The license payload could not be decoded","cli.licenseValidUntil":"{plan} valid until {exp}","cli.trialExpired":"Your trial expired on {exp}; the free tier shows one tool. A trial or subscription unlocks all three tools, the project overview and config toggles.","cli.licenseGrace":"Your subscription expired on {exp} and is within the {days}-day offline grace period (connect to renew)","cli.subscriptionExpired":"Your subscription expired on {exp} and its grace period has ended; the free tier shows one tool. A trial or subscription unlocks all three tools, the project overview and config toggles.","cli.licenseWriteFailed":"Could not write {path}: {message}","cli.refreshMissing":"Could not find {path}. Import a trial or subscription license.json first.","cli.refreshNetwork":"Could not connect. Try again later; your current license is unchanged","cli.refreshHttp":"The license server returned HTTP {status}","cli.refreshRejected":"Renewal rejected: {detail}","cli.refreshJson":"The license server returned invalid JSON; the original license is unchanged","cli.refreshFields":"The license server response is missing token/signature; the original license is unchanged","cli.refreshInvalid":"The license server returned an invalid license: {detail}; the original license is unchanged","cli.refreshChanged":"The local license changed during refresh; the newer file was preserved. Select Refresh license again","cli.refreshChangedUnreadable":"The local license changed during refresh; the current file was not overwritten","cli.licenseRenewed":"License renewed{suffix}","cli.licenseRenewedSuffix":", {plan} valid until {exp}","cli.trial":"Trial","cli.subscription":"Subscription"},Gr={"panel.source.projectMemory":"Project memory","panel.source.planStep":"plan.md step","panel.source.planInstruction":"Instruction for the plan","panel.source.latestInstruction":"Latest instruction","panel.source.workingDirectory":"Working directory","panel.source.homeDirectory":"Working directory = home","panel.source.planHeading":".wingman/plan.md H1","panel.source.userNamed":"User title","panel.source.permissionEvents":"PermissionRequest/Notification events","panel.source.liveEmptyState":"Live wiring state; no session title is available","panel.source.currentPointAncestors":".wingman/plan.md steps marked [?]","panel.source.feedbackUnavailable":"sessions.feedback.state=unavailable / feedback not provided","panel.source.planGoal":".wingman/plan.md Goal: ","panel.source.lastActivity":"Maximum sessions.lastActivity (latest hook received_at / transcript timestamp)","panel.source.sessionPlanTitle":"sessions.title (plan.md step)","panel.source.sessionDirectory":"sessions.label (session working directory name / sessionId)","panel.source.sessionLabelFallback":"sessions[].label (project payload is not ready)","panel.source.userPrompt":"User prompt","panel.source.agentQuote":"Agent statement","panel.source.savingEstimate":"Savings = resident tokens for the item (estimates marked “about”); disabling uses plan/apply with a backup and rollback","panel.source.savingUnavailable":"The harness does not report resident usage for this item; no savings are estimated; disabling uses plan/apply with a backup and rollback","panel.source.historyEstimate":"Estimate = total usage for this turn (reported by the harness, exact) − total resident configuration (estimated, marked “about”)","panel.source.ancestorLine":".wingman/plan.md:{line} top-level ancestor of the current point","panel.source.waitingProvenance":"Source: {event} event, unresolved since {since}; threshold 60s","panel.source.referenceMatch":"Match: {origin} — “{context}” (scanReferences whole-word match)","panel.source.unusedServer":"Observation: no tool steps in this session matched mcp__{server}__* (transcript observation)","panel.source.item":"Item: {path}","panel.source.historyThreshold":"Threshold: context ≥ {tokens} and history share > 50%"},Kr={"narrative.worktreePlanDifferent":"The plan in worktree {name} differs from the main repository","narrative.projectHasSessions":"This project still has sessions","narrative.projectNotRemembered":"Project is not in local memory","narrative.noStateDirectory":"No local state directory is configured","narrative.acceptanceUnreadable":"Local acceptance state could not be read","narrative.homeDirectory":"No project directory (home)","narrative.sessionLimit":"Reached the 8-session limit","narrative.planMissing":"The plan file does not exist","narrative.memoryUnavailable":"Project memory is unavailable (~/.wingman/state/projects.json)","narrative.firstWriteBefore":"The plan file was first written before non-plan tool step 1","narrative.noPlanWrite":"No plan.md write through a file editing tool was observed for this session","narrative.waitingPermission":"Waiting for permission","narrative.waitingResponse":"Waiting for a response","narrative.feedbackUnavailable":"Feedback signals are unavailable","narrative.feedbackUnreported":"Feedback capabilities were not reported","narrative.feedbackUnmapped":"Feedback capabilities have not been mapped","narrative.acceptanceOnResponse":"Acceptance state is read when responding","narrative.unknownVersion":" (version unknown; another version may be installed)","narrative.firstWriteAfter":"The plan file was first written after non-plan tool step {step}","narrative.writeSummary":"This session wrote {count} times · Latest {at}","narrative.waitingPermissionDetail":"Waiting for permission: {reason}","narrative.waitingResponseDetail":"Waiting for a response: {reason}","narrative.feedbackNotWired":"Feedback signals are not wired; run {command}","narrative.feedbackNotWiredUnknownVersion":"Feedback signals are not wired; run {command} (version unknown; another version may be installed)","narrative.phase.inspect":"Inspect","narrative.phase.modify":"Modify","narrative.phase.verify":"Verify","narrative.phase.other":"Other","narrative.planTooLarge":"The plan file exceeds 1 MiB","narrative.planNotRegular":"The plan file is not a regular file","narrative.planOutsideRoot":"The symbolic link resolves outside the project root","narrative.planInvalidUtf8":"The plan file is not valid UTF-8","narrative.planTooManyLines":"The plan file exceeds 20000 lines","narrative.planUnsupportedVersion":"The format version is not supported","narrative.planConflict":"The plan file contains Git conflict markers","narrative.planTooManyNodes":"The plan exceeds 2000 nodes","narrative.currentPoint":"Current point","narrative.noCurrentPoint":"The plan has no step marked in progress","narrative.allComplete":"The agent marked all project steps complete","narrative.sessionCompleteProjectActive":"The session plan is complete; the project step is still in progress","narrative.cancelledParent":"The parent step is cancelled, but a descendant is still marked in progress","narrative.pending":"Pending","narrative.inProgress":"In progress","narrative.completed":"Complete","narrative.cancelled":"Cancelled","narrative.checkpoint":"Checkpoint","narrative.parallelPoints":"{count} items in parallel","narrative.noActiveSession":"No active session is currently observed under “{step}”","narrative.recentWriters":"{count} sessions wrote this file in the last 60 seconds","narrative.completedParent":"The parent step is marked complete, but a descendant is still marked {status}","narrative.pendingParent":"The parent step is pending, but a descendant is marked {status}","narrative.dshNoPlan":"dsh does not expose a stable local todo projection to Wingman hooks","narrative.ccPlanInvalid":"Claude Code plan tool arguments could not be parsed","narrative.codexPlanInvalid":"Codex update_plan arguments could not be parsed","narrative.memoryUnreadable":"Project memory could not be read (~/.wingman/state/projects.json)","narrative.memoryInvalid":"Project memory could not be parsed (~/.wingman/state/projects.json)","narrative.memoryRefuse":"Project memory is unavailable; refusing to overwrite (~/.wingman/state/projects.json)","narrative.memoryUpdateFailed":"Project memory could not be updated (~/.wingman/state/projects.json)","narrative.invalidStructure":"not a valid v1 structure","narrative.overlayUnreadable":"The overlay file could not be read; check {path}: {error}","narrative.overlayInvalid":"The overlay file could not be parsed; check {path}: {error}","narrative.overlayRefuse":"The overlay file could not be parsed; refusing to overwrite; check {path}","narrative.shellWriteUnconfirmed":"A write through the shell could not be confirmed","narrative.noAttributableChange":"No attributable change to an in-progress step was observed","narrative.ambiguousAttribution":"The write affects multiple in-progress steps and cannot be attributed uniquely","narrative.approximately":"about {value}","narrative.waited":"Waiting for {duration}: {message}","narrative.reenable":"{name} was mentioned and is off; you can enable it","narrative.saving":", disabling it can save {tokens} tok (resident estimate)","narrative.unused":"{server} has not been used in this session{saving}","narrative.historyBloat":"Conversation history uses about {percent}% of this turn’s context (about {history} / {context}); a new session resets it","narrative.canDisable":", it can be disabled"},Yr={"panel.mobile.heading":"Phone","panel.mobile.pairedCount":"Paired devices: {count}","panel.mobile.paused":"Sync paused","panel.mobile.requiresLicense":"A trial or active subscription is required to pair a phone (the free tier shows one tool).","panel.mobile.localRemoved":"Local record removed; relay data clears automatically after 24 hours","panel.mobile.localWriteFailed":"Could not save the local phone pairing record. Check the local state directory and try again.","panel.mobile.pair":"Pair phone","panel.mobile.disclosure":"After pairing, your Mac uploads encrypted project and session status for the phone app to read. The relay only sees ciphertext.","panel.mobile.scan":"Scan with the Wingman app on your phone","panel.mobile.qrLabel":"Phone pairing QR code","panel.mobile.qrExpired":"QR code expired","panel.mobile.expired":"Expired","panel.mobile.regenerate":"Regenerate","panel.mobile.expiredTip":"The pairing window has ended. Generate a new QR code to scan.","panel.mobile.autoClose":"Closes automatically after you scan on your phone","panel.mobile.cancel":"Cancel pairing","panel.mobile.unnamed":"Phone","panel.mobile.paired":"Paired","panel.mobile.pending":"Waiting for scan","panel.mobile.unpaired":"Not paired","panel.mobile.pairedAt":"Paired at","panel.mobile.lastSync":"Last sync","panel.mobile.notSynced":"Not synced yet","panel.mobile.unpair":"Unpair","panel.mobile.confirm":"Unpair “{name}”? Your Mac will stop uploading and the relay will delete this pair’s data.","panel.mobile.keep":"Keep paired","panel.mobile.working":"Working…","panel.mobile.keychainUnavailable":"macOS Keychain is unavailable. Allow Keychain access and try again.","panel.mobile.stateUnavailable":"Could not read phone pairing records. Check local pairing settings and try again.","panel.mobile.relayUnavailable":"Could not connect to the relay. Try again shortly.","panel.mobile.unavailable":"Phone pairing action failed. Try again.","panel.mobile.invalidRelay":"The phone relay address is unavailable. Check local relay settings.","panel.mobile.pairNotFound":"This phone has been unpaired. Pair it again to continue.","island.waitingForYou":"{p0} is waiting for you: {p1}","panel.main.backToSessionSettingsResponseUnavailable":"Back-to-session settings response unavailable","panel.main.couldNotSaveBackToSession":"Could not save back-to-session settings","panel.main.couldNotLoadBackToSession":"Could not load back-to-session settings","panel.main.activationResponseUnavailable":"Activation response unavailable","panel.main.activationRequestFailed":"Activation request failed","panel.main.organizationRequestFailed":"Organization request failed: {p0}","panel.main.refreshFailed":"Refresh failed: {p0}","panel.main.licenseRefreshed":"License refreshed: {p0}","panel.main.licenseRefreshedReopenThePanelTo":"License refreshed; reopen the panel to see its latest status","panel.main.couldNotReadFile":"Could not read file: {p0}","panel.main.importRequestFailed":"Import request failed: {p0}","panel.main.dropToImportLicense":"Drop to import license","panel.main.demoSampleIsMissingItsMock":"Demo sample is missing its MOCK label (project rule 10)","panel.main.theServerHasNoActionEndpoint":"The server has no action endpoint (dev mode?), and the demo sample is unavailable: {p0}","panel.main.userPlanProtocol":"{p0} {p1} user Plan protocol","panel.main.install":"Install","panel.main.uninstall":"Uninstall","panel.main.thePlanDoesNotMatchThe":"The plan does not match the requested user protocol action","panel.main.applyRequestFailed":"Apply request failed: {p0}","panel.main.shareConfigurationSample":"Share configuration sample · {p0}","panel.main.shareEventSample":"Share event sample","panel.main.couldNotSend":"Could not send: {p0}","panel.actions.disableToSave":"Disable to save {p0}","panel.actions.enablingAdds":"Enabling adds +{p0}","panel.actions.create":"Create","panel.actions.delete":"Delete","panel.actions.modify":"Modify","panel.actions.lines":"{p0} lines","panel.actions.previouslyLines":"Previously {p0} lines","panel.actions.linesLines":"{p0} lines → {p1} lines","panel.actions.effectiveImmediatelyTheHarnessWatchesThis":"Effective immediately — the harness watches this mechanism; the current session also updates","panel.actions.effectiveAfterReconnectingRestartTheHarness":"Effective after reconnecting — restart the harness or reconnect its MCP server to load changes","panel.actions.effectiveNextSessionOngoingConversationsAre":"Effective next session — ongoing conversations are unaffected; a new session loads the new configuration","panel.actions.enable":"Enable","panel.actions.disable":"Disable","panel.actions.planPayloadViolatesTheContractCannot":"Plan payload violates the contract; cannot render: {p0}","panel.actions.writesIsNotAnObject":"writes[{p0}] is not an object","panel.actions.writesFileIsNotANonempty":"writes[{p0}].file is not a nonempty string","panel.actions.writesKindHasUnknownValue":"writes[{p0}].kind has unknown value {p1}","panel.actions.writesBeforeIsMissingKindRequires":"writes[{p0}].before is missing (kind={p1} requires complete previous content)","panel.actions.writesAfterIsMissingKindRequires":"writes[{p0}].after is missing (kind={p1} requires complete new content)","panel.actions.referencesIsNotAnObject":"references[{p0}] is not an object","panel.actions.referencesFileIsNotANonempty":"references[{p0}].file is not a nonempty string","panel.actions.referencesLineIsNotABased":"references[{p0}].line is not a 1-based line number","panel.actions.referencesMatchednameIsNotAString":"references[{p0}].matchedName is not a string","panel.actions.referencesContextIsNotAString":"references[{p0}].context is not a string","panel.actions.notAnObject":"Not an object","panel.actions.harnessHasUnknownValue":"harness has unknown value {p0}","panel.actions.actionIsNotAnObject":"action is not an object","panel.actions.actionKindHasUnknownValueV":"action.kind has unknown value {p0} (v1 plans only support toggle)","panel.actions.actionItemidIsNotANonempty":"action.itemId is not a nonempty string","panel.actions.actionEnableIsNotABoolean":"action.enable is not a boolean","panel.actions.writesIsNotAnArray":"writes is not an array","panel.actions.backupdirIsNotANonemptyString":"backupDir is not a nonempty string","panel.actions.referencesIsNotAnArray":"references is not an array","panel.actions.effectiveatHasUnknownValue":"effectiveAt has unknown value {p0}","panel.actions.applyResponseViolatesTheContractNot":"Apply response violates the contract: not an object","panel.actions.applyResponseViolatesTheContractOk":"Apply response violates the contract: ok=true but backupDir is missing","panel.actions.applyResponseViolatesTheContractOk59":"Apply response violates the contract: ok=false but the original error is missing","panel.actions.applyResponseViolatesTheContractOk60":"Apply response violates the contract: ok is not a boolean","panel.actions.kindHasAnUnknownValue":"kind has an unknown value","panel.actions.harnessDoesNotSupportUserPlan":"harness does not support user Plan protocol","panel.actions.hasblockIsNotABoolean":"hasBlock is not a boolean","panel.actions.blockbytesIsNotANonnegativeInteger":"blockBytes is not a nonnegative integer byte count","panel.actions.isNotANonemptyString":"{p0} is not a nonempty string","panel.actions.pathsMustUseTheAbbreviation":"Paths must use the ~/ abbreviation","panel.actions.updateVersionsMustBeIncreasingIntegers":"Update versions must be increasing integers fromVersion / toVersion for an existing block","panel.actions.applyResponseViolatesTheContractPlanprotocol":"Apply response violates the contract: planProtocol.user state is missing","panel.actions.applyResponseViolatesTheContractBackupdir":"Apply response violates the contract: backupDir must use the ~/ abbreviation","panel.actions.fixturesModeIsReadOnly":"Fixtures mode is read-only","panel.format.baseInstructions":"Base instructions","panel.format.yourRules":"Your rules","panel.format.skills":"Skills","panel.format.toolDefinitions":"Tool definitions","panel.format.gateHooks":"Gate hooks","panel.format.conversationHistory":"Conversation history","panel.format.builtInSystemPrompt":"Built-in system prompt","panel.format.builtInInstructions":"Built-in instructions","panel.format.corePluginEverythingIsAPlugin":"core plugin (everything is a plugin)","panel.format.skillPlugin":"skill plugin","panel.format.toolPlugins":"tool-* plugins","panel.format.approvalPermissionPlugins":"approval · permission plugins","panel.format.sessionLogPlugin":"session log plugin","panel.format.about":"About {p0}","panel.format.residentAfterTrigger":"Resident {p0} · After trigger {p1}","panel.format.fullPluginApi":"Full · Plugin API","panel.format.pushHooks":"Push · hooks","panel.format.notWired":"Not wired","panel.format.file":"File: {p0}","panel.format.noFileSource":"No file (source: {p0})","panel.format.estimateBytesLabeledAbout":"Estimate = bytes ÷ 3.5, labeled About","panel.format.exactValueHarnessReportedUsageTokens":"Exact value (harness-reported usage): {p0} tokens","panel.license.licenseImported":"License imported — {p0}","panel.license.licenseImportedNewStatusUnknownRefresh":"License imported (new status unknown; refresh this page)","panel.license.dropOneLicenseJsonFileAt":"Drop one license.json file at a time (received {p0})","panel.license.onlyJsonFilesAreAcceptedReceived":"Only .json files are accepted (received {p0})","panel.license.deviceActive":"This device is activated · {count}/{max} devices","panel.license.deviceLimit":"This license is activated on {count} devices","panel.license.deviceNotRegistered":"This device is not activated · {count}/{max} devices","panel.license.deviceNotRegisteredTip":"Import the license again to activate this device when a slot is available","panel.license.deviceRevoked":"Activation for this device was revoked","panel.license.deviceRevokedTip":"Your existing license is kept until it expires. Automatic and manual refresh cannot reactivate this device. Select Activate this device when a device slot is available.","panel.license.activateDevice":"Activate this device","panel.license.deviceUnavailable":"Cannot read this device’s identifier; activation is unavailable","panel.license.devicePending":"This device is not activated yet","panel.license.deviceTip":"Each subscription supports up to {max} devices. Licenses renew automatically every 24 hours. View devices.","panel.license.deviceLimitTip":"Unbind an old device from an activated device, then import the license again here. Any existing local license is kept until it expires.","panel.license.deviceManageElsewhere":"Unbind from an activated device with an unexpired license","panel.license.devices":"Activated devices","panel.license.unnamedDevice":"Unnamed device","panel.license.deviceLastSeen":"Last renewed: {at}","panel.license.unbind":"Unbind","panel.license.unbindTip":"Unbinding revokes renewals for that device. Its existing license is kept until it expires. Only importing a license again or selecting Activate this device on that machine can reactivate it.","panel.live.sessionStarted":"Session started","panel.live.sessionEnded":"Session ended","panel.live.promptSubmitted":"Prompt submitted","panel.live.toolCallStarted":"Tool call started","panel.live.toolCallCompleted":"Tool call completed","panel.live.toolBatchCompleted":"Tool batch completed","panel.live.turnEnded":"Turn ended","panel.live.subagentStarted":"Subagent started","panel.live.subagentEnded":"Subagent ended","panel.live.compactionStarted":"Compaction started","panel.live.compactionCompleted":"Compaction completed","panel.live.configurationChanged":"Configuration changed","panel.live.instructionsLoaded":"Instructions loaded","panel.live.notification":"Notification","panel.live.permissionRequest":"Permission request","panel.live.notWired":"Not wired","panel.live.waitingForEvents":"Waiting for events","panel.live.quiet":"Quiet","panel.live.running":"{p0} running","panel.live.demoReplayMock":"Demo replay · MOCK","panel.live.liveConnectionEstablished":"Live connection established","panel.live.disconnectedReconnectingAutomatically":"Disconnected · Reconnecting automatically","panel.live.connecting":"Connecting…","panel.taskboard.waitingForYou":"Waiting for you","panel.taskboard.turnEnded":"Turn ended","panel.taskboard.ended":"Ended","panel.taskboard.inProgress":"In progress","panel.taskboard.allowed":"Allowed","panel.taskboard.denied":"Declined","panel.taskboard.dshHasNoObservedCommandTo":"dsh has no observed command to resume a specific session; continue in the original terminal","panel.taskboard.sourceSessionIdFromHookEvents":"Source: session id from hook events; command syntax from codex resume --help","panel.taskboard.sourceSessionIdFromHookEvents132":"Source: session id from hook events; command syntax from claude --help; run in the original project directory","panel.taskboard.sourceSessionIdAndWorkingDirectory":"Source: session id and working directory from hook events; command syntax from claude --help","panel.taskboard.justNow":"just now","panel.taskboard.minutesAgo":"{p0} min ago","panel.taskboard.hoursAgo":"{p0} h ago","panel.share.linesAboutKbLimitKb":"{p0} lines · About {p1} KB / Limit 256 KB"},Jr={"panel.narrative.invalidSkillInvocation":"Invalid skill invocation fields for {harness}","panel.narrative.payloadNotArray":"The payload is not a JSON array","panel.narrative.payloadEntryNotObject":"A payload entry is not an object","panel.narrative.payloadMissingFields":"A payload entry is missing harness/scannedAt","panel.narrative.projectUnavailable":"Project payload is unavailable","panel.narrative.sessionUnavailable":"Session narrative payload is unavailable","panel.narrative.goal":"Goal","panel.narrative.latestInstruction":"Latest instruction","panel.narrative.aborted":" (aborted)","panel.narrative.incomplete":" (incomplete)","panel.narrative.subagent":"Subagent","panel.narrative.mainAgent":"Main agent","panel.narrative.openRequest":"There is an open request","panel.narrative.waitingForYou":"Waiting for you","panel.narrative.inProgress":"In progress","panel.narrative.notWired":"Not wired","panel.narrative.waitingEvents":"Waiting for events","panel.narrative.missingSlot":"Harness {harness} is missing slot {slot}","panel.narrative.invalidUserProtocol":"Harness {harness} has an invalid planProtocol.user","panel.narrative.invalidProjectProtocol":"Harness {harness} has an invalid planProtocol.project","panel.narrative.unavailableProject":"Unavailable project {number}","panel.narrative.waitOverdue":" · Waiting for {minutes}m+","panel.narrative.waitLabel":"Waiting for you{who}: {message}{overdue}","panel.narrative.event.SessionStart":"Session started","panel.narrative.event.SessionEnd":"Session ended","panel.narrative.event.UserPromptSubmit":"New prompt received","panel.narrative.event.PreToolUse":"Tool call started","panel.narrative.event.PostToolUse":"Tool call completed","panel.narrative.event.userRejected":"You declined","panel.narrative.event.Stop":"Turn ended","panel.narrative.event.Notification":"Notification received","panel.narrative.event.PermissionRequest":"Waiting for permission","panel.narrative.event.SubagentStart":"Subagent started","panel.narrative.event.SubagentStop":"Subagent ended","panel.narrative.event.PreCompact":"Compaction started","panel.narrative.event.PostCompact":"Compaction completed"},zr={"panel.render.projectPaused":"Paused","panel.render.noSessionsYet":"No sessions yet","panel.render.forgetProject":"Forget this project","panel.render.forgetProjectConfirm":"Remove this project from Wingman’s local memory. Project files stay intact; it will reappear when a new session starts.","panel.render.forget":"Forget","panel.render.codexProjectHint":"Codex project: {name}","panel.render.projectWorktree":"Worktree {name}","panel.render.worktreePlan":"Worktree {name} plan: {path}","panel.render.originExec":"Codex CLI · exec","panel.render.originCli":"Codex CLI","panel.render.originDesktop":"Codex Desktop","panel.render.originSource":"Source: session_meta.originator / source","panel.render.chipNoInstruction":"No instruction yet · {p0}","panel.render.chipDirectory":"Directory: {p0}","panel.render.chipTitleSource":"Title source: {p0}","panel.render.chipTurnEnded":"Turn ended (no events or transcript activity since Stop or the main transcript turn-end signal)","panel.render.projectsPageTitle":"Project overview","panel.render.projectsPageHint":"Goals, progress and decisions across your coding apps.","panel.render.controlsPageHint":"Manage tools, preferences and how you return to a session.","panel.render.optionalSuggestions":"Optional suggestions","panel.render.suggestionsHint":"Based on observed session activity, for reference only. Review changes before applying.","panel.render.usagePageHint":"Reported usage and estimated context, kept separate.","panel.render.toolsAndPreferences":"Tools & preferences","panel.render.controlSkills":"Skills & plugins","panel.render.controlTools":"Tools & connections","panel.render.controlBehavior":"Behavior & permissions","panel.render.controlSummary":"{count} items · {enabled} enabled","panel.render.controlSummarySource":"Source: total toggleable entries and enabled entries in scanned slots.{slot}[]; this does not prove session use","panel.render.controlSettingsCount":"{count} settings","panel.render.codexPluginControlHint":"Codex plugins: controls the whole plugin package, not an individual skill.","panel.render.contextSources":"Explore context sources","panel.render.requestsUnavailable":"Requests unavailable · view details","panel.render.localFeedStatus":"Local feed · {status}","panel.render.lastHookReceived":"Last hook received {p0}","panel.render.hookNotReceived":"Not yet received","panel.render.hookReceiptSource":"Source: hooks received by this sidecar, {count} since startup","panel.render.hookReceiptUnavailable":"Sidecar hook receipt metadata is not yet available","panel.render.wingmanInstanceCount":"About {p0} Wingman instances detected","panel.render.wingmanInstanceSource":"Source: runtime directory records whose processes are alive","panel.render.codexBroadcastSource":"Codex events are delivered to every instance","panel.render.wingmanInstancesUnavailable":"Wingman instances {p0}","panel.render.notApplicable":"Not applicable","panel.render.wingmanInstancesFixtureSource":"Fixtures mode does not read the local runtime directory","panel.render.appFilter":"App","panel.render.olderSessions":"{count} older sessions","panel.render.olderSessionsSource":"Source: sessions.ended and lastActivity more than {days} days ago; display only","panel.render.archiveSession":"Archive","panel.render.archiveThisSession":"Archive this session","panel.render.restoreSession":"Restore","panel.render.archivedSessions":"Archived sessions ({count})","panel.render.sessionArchiveSource":"Source: local task-overlay.json session / project archived; harness data is retained","panel.render.sessionArchiveActivitySource":"Source: session event timestamp > session or project archivedAt","panel.render.ccEnabled":"Enabled","panel.render.ccPartial":"Partly restricted","panel.render.ccDisableAll":"Disable all","panel.render.ccPartialWarning":"Only some messaging tools are denied. Disable all denies both SendMessage and ListAgents.","panel.render.ccFeatures":"Claude Code settings","panel.render.ccSettingsHint":"Changes local user settings, not just the selected session. Review changes before confirming.","panel.render.ccMessageHelp":"What this changes","panel.render.ccInboundHelp":"Controls messages from other Claude Code sessions. Accept delivers messages to Claude. Hold shows a notice without delivery, until an effective setting allows acceptance. Refuse discards them.","panel.render.ccInboundImpact":"This does not control your chat input. Delivered messages can start a new turn in an idle session and incur usage. They do not automatically include the sender’s full history or files; the recipient’s own permissions still apply.","panel.render.ccOutboundHelp":"Lets Claude find and message other sessions, for example to share a task result. Enabling only removes these send and discovery tool denials; other permission rules still apply.","panel.render.ccAutoMemory":"Auto memory","panel.render.ccInbound":"Messages from other Claude sessions","panel.render.ccOutbound":"Allow Claude to send messages","panel.render.ccDefault":"Default","panel.render.ccByPermissionMode":"Determined by permission mode","panel.render.ccAccept":"Accept","panel.render.ccHold":"Hold","panel.render.ccRefuse":"Refuse","panel.render.ccOutboundWarning":"Disabling denies both SendMessage and ListAgents. It stops cross-session sending and also restricts communication with subagents (assistants Claude delegates to) and agent-team members. Receiving is controlled separately above.","panel.render.ccOverridden":"Overridden by {layer}; changes here have no effect","panel.render.ccLayerProject":"project settings","panel.render.ccLayerLocal":"project-local settings","panel.render.ccLayerManaged":"managed settings","panel.render.ccInvalid":"Unknown configuration format; changes disabled","panel.render.ccExactChanges":"Keys and values to write","panel.render.ccRemoveKey":"Remove key (restore default)","panel.render.ccSetInbound":"Set incoming messages to {value}","panel.render.ccInvalidPayload":"Invalid Claude Code feature payload","panel.render.ccScope":"Edits user settings.json only. Override checks cover project and project-local settings, managed JSON files and the remote cache; MDM, policy helpers and host-supplied policies are not inspected.","panel.render.skillAuto":"Auto","panel.render.skillManual":"Manual","panel.render.skillAgentOnly":"Agent only","panel.render.skillOff":"Off","panel.render.skillAutoMeaning":"Default disable-model-invocation: false / user-invocable: true; both the user and Agent can invoke it","panel.render.skillManualMeaning":"disable-model-invocation: true / user-invocable: true; explicit user invocation only, with no automatic Agent loading; the description is not loaded into context","panel.render.skillAgentOnlyMeaning":"disable-model-invocation: false / user-invocable: false; hidden from the user menu, only the Agent can invoke it","panel.render.skillOffMeaning":"disable-model-invocation: true / user-invocable: false; neither the user nor the Agent can invoke it","panel.render.skillFrontmatterSource":"Source: SKILL.md frontmatter disable-model-invocation / user-invocable; invocation mode is determined by SKILL.md. The toggle only controls configuration enablement","panel.render.skillOverridesSource":"Source: settings skillOverrides; disabled in configuration","panel.render.skillConfiguration":"Configuration","panel.render.dshControlsSummary":"{count} items · {enabled} enabled","panel.render.dshControlsSummarySource":"Source: total toggleable entries and enabled entries in slots.{slot}[] scanned from dsh --dump-config; configuration enablement does not prove session use","panel.render.plugins":"Plugins","panel.render.pluginConfigurationTip":"Configuration enablement does not prove session use; usage comes from the Codex transcript","panel.render.pluginsSummary":"{enabled} plugins enabled · {used} used this session","panel.render.pluginsUnobserved":"{enabled} plugins enabled · No plugin calls observed this session","panel.render.pluginsSummarySource":"Source: enabled entries in slots.skills[].enabled scanned from config.toml plugin configuration; session usage is the deduplicated pluginsUsed from matching MCP tool calls in the Codex transcript against configured plugin names (with a few aliases); configuration enablement does not prove session use","panel.render.skillConfigurationTip":"Whether this session actually loaded a skill is determined by the transcript","panel.render.ccSkillsSummary":"{enabled} skills enabled · {used} used this session","panel.render.ccSkillsUnobserved":"{enabled} skills enabled · No skill calls observed this session","panel.render.ccSkillsSummarySource":"Source: entries that are not off according to scanned slots.skills[].enabled and invocation (SKILL.md frontmatter); session usage is deduplicated skillsUsed from Skill tool calls or explicit skill command loading records in the Claude Code transcript; configuration enablement does not prove session use","panel.render.ccToolsSummary":"{enabled} MCP servers enabled · {used} used this session","panel.render.ccToolsUnobserved":"{enabled} MCP servers enabled · No MCP calls observed this session","panel.render.ccToolsSummarySource":"Source: enabled entries among mcpServers.* in scanned slots.tools[]; session usage is deduplicated mcpUsed from matching mcp__<server>__<tool> calls in the Claude Code transcript against configured server names (- and _ are equivalent); configuration enablement does not prove session use","panel.render.skillsUsed":"Used this session: {skills}","panel.render.skillsUsedSource":"Source: observed Skill tool calls / skill command triggers in the transcript","panel.render.projectMenu":"Project menu","panel.render.archiveProject":"Archive","panel.render.restoreProject":"Restore","panel.render.archivedProjects":"{count} archived projects","panel.render.projectArchiveNewActivity":"New activity","panel.render.projectArchiveActivitySource":"Source: firstScreen.lastActivity.at > user.archivedAt","panel.render.projectArchiveSource":"Source: local task-overlay.json archived / archivedAt; hidden in all tabs until you restore it, even after new activity","panel.render.moveProjectUp":"Move pinned project up","panel.render.moveProjectDown":"Move pinned project down","panel.render.projectPinSource":"Source: local task-overlay.json pinned / order","panel.render.filterBySessionHarness":"Filter by the harness each session belongs to","panel.render.projectsHiddenByFilters":"{count} projects hidden by filters","panel.render.projectFilterSource":"Source: project sessions, harness, status and local hidden flags","panel.render.expandAllProjects":"Expand all","panel.render.collapseAllProjects":"Collapse all","panel.render.waitTrace":"{label}: {message}{outcome}","panel.render.sessionIdentifier":"Session: {id}","panel.render.operationOnHost":"· {verb} will happen on this machine","panel.render.protocolFileOperation":"File for protocol {verb}","panel.render.protocolImpactLabel":"Effect on harness and projects","panel.render.protocolImpactInstall":"Only adds one managed block to this file so the agent writes its progress as a plan file. It never rewrites harness behavior or any project code.","panel.render.protocolImpactUpdate":"Only updates the managed block in this file to the new version so the agent writes its progress as a plan file. It never rewrites harness behavior or any project code.","panel.render.protocolImpactUninstall":"Only removes the managed block from this file and keeps everything else as is. It never rewrites harness behavior or any project code.","panel.render.deleteLineNumber":"Delete line {line}","panel.render.close":"Close","panel.render.language":"Language","panel.render.noConversationObserved":"No conversation observed yet","panel.render.conversationDetailsPending":"Waiting for conversation details","panel.render.conversationDetailsPendingHint":"A conversation was observed. Its details will appear here when available. If nothing updates, check the connection details.","panel.render.checkConnection":"Check your connection","panel.render.startConversationHint":"Start or continue a conversation in {harness}. Your tasks and progress will appear here.","panel.render.checkConnectionHint":"Activity from {harness} is not yet confirmed. Check the connection settings, then start a conversation in the app.","panel.render.conversationNotShowing":"Already started, but nothing here?","panel.render.viewConnectionSettings":"View connection settings","panel.render.connectionDetails":"Connection details","panel.render.connectionInstallCommand":"If you need to reconnect, use this command","panel.render.planDisplaySettings":"Plan display settings","panel.render.helpAndFeedback":"Help & feedback","panel.render.apiAnatomyReturnedAnEmptyArray":"/api/anatomy returned an empty array","panel.render.noHarnessDetected":"No harness detected","panel.render.firstRun":"First run","panel.render.thenThePanelReadsAnatomyData":", then the panel reads anatomy data from GET /api/anatomy.","panel.render.versionUnknownADifferentVersionMay":"(Version unknown; a different version may be installed)","panel.render.sourceClickToExpandThePanel":`{p0} · {p1}{p2}
48
48
  Source: {p3}; click to expand the panel`,"panel.render.compactPillSource":`{p0} · {p1}{p2}
49
49
  Source: {p3}`,"panel.render.project":"Project","panel.render.residentTok":"Resident {p0} tok","panel.render.residentTotal":"Resident total","panel.render.totalResidentTokensOfEnabledItems":"Total = resident tokens of enabled items across all slots; ","panel.render.includesEstimatesMarkedAsApproximate":"Includes estimates, marked as approximate","panel.render.allValuesAreExactAndReported":"All values are exact and reported by the harness","panel.render.noTokenValuesCollectedInThis":"No token values collected in this scan (no byte source available for estimation)","panel.render.thisScanFoundNoEnabledItems":"{p0}: this scan found no enabled items with token sources in this slot","panel.render.residentTotalForEnabledItemsIndividual":"{p0} resident total for enabled items (individual sources below)","panel.render.items":"items","panel.render.sourcePanelTimeOfTheLast":"Source: panel time of the last successful GET /api/anatomy","panel.render.refreshFailedShowingDataFrom":"Refresh failed; showing data from","panel.render.dataSuffix":"","panel.render.contextBreakdown":"Context estimate","panel.render.previewTheCompleteContentBeforeSending":"Preview the complete content before sending; remove individual lines and select Send to submit; closing sends nothing","panel.render.shareConfigurationSample":"Share configuration sample","panel.render.thisItemIsDisabledToggleableItems":"This item is disabled; toggleable items can be enabled in CONFIGURE below","panel.render.disabled":"Disabled","panel.render.noFileThisItemHasNo":"No file: this item has no readable source file (for example, built-in injection or a boot tree row)","panel.render.noSourceFile":"No source file","panel.render.noItemsInThisScanThis":"No items in this scan (this slot has no readable source in this harness)","panel.render.sixSlotDetailsHoverForSources":"Six-slot details · hover for sources","panel.render.currentlyDisabled":"Disabled","panel.render.disable":"Disable","panel.render.enable":"Enable","panel.render.previewChangesBeforeApplyingNoFiles":"Preview changes before applying: no files are written until confirmation; originals are backed up and can be restored byte for byte","panel.render.noItemsInThisScanCan":"No items in this scan can be toggled from the panel; toggles only cover native harness mechanisms. Edit other items in their source files","panel.render.verifiedInPLANBConfigToml":"Verified in PLAN §4b: config.toml enabled_tools/disabled_tools toggles individual tools; CC toggles whole servers and dsh toggles whole plugins","panel.render.codexSupportsIndividualToolsThroughEnabled":"Codex supports individual tools through enabled_tools / disabled_tools, the finest granularity of the three","panel.render.otherSlots":"Other slots (","panel.render.haveNoToggleableItemsInThis":") have no toggleable items in this scan; toggles only cover native harness mechanisms","panel.render.noSupportedTerminalAppDetectedTerminal":"No supported terminal app detected (Terminal / iTerm / Ghostty / WezTerm / Warp / Alacritty / kitty / VS Code)","panel.render.sourceGETApiReturnTargetLocal":"Source: GET /api/return-target local app detection and user selection in ~/.wingman/state/settings.json","panel.render.switchToThisAppWhenReturning":"Switch to this app when returning to a session","panel.render.update":"Update","panel.render.install":"Install","panel.render.uninstall":"Uninstall","panel.render.sourcePOSTApiActionPlanHostname":"Source: POST /api/action/plan hostname","panel.render.hostRunningWingman":"Host running Wingman","panel.render.sourcePOSTApiActionPlanTargetPath":"Source: POST /api/action/plan targetPath / hasBlock / blockBytes","panel.render.bytes":"bytes","panel.render.aManagedBlockAlreadyExists":"A managed block already exists","panel.render.noManagedBlockYet":"No managed block yet","panel.render.sourcePOSTApiActionPlanFromVersion":"Source: POST /api/action/plan fromVersion / toVersion","panel.render.updateTheV":"Update the v","panel.render.blockToV":"block to v","panel.render.whenItTakesEffect":"When it takes effect","panel.render.appliesToTheNextNewSession":"Applies to the next new session; the current session stays unchanged","panel.render.sourcePOSTApiActionPlanBackupDir":"Source: POST /api/action/plan backupDir","panel.render.backupDirectoryRule":"Backup directory rule","panel.render.backUpBeforeWriting":"Back up before writing: ","panel.render.uninstallingPreservesExistingContentAndSupports":"; uninstalling preserves existing content and supports byte-for-byte restoration.","panel.render.cancel":"Cancel","panel.render.confirmWrite":"Confirm write","panel.render.thePlanContainsNoFileChanges":"The plan contains no file changes","panel.render.noOtherReferencesFoundInThe":"No other references found in the scanned content","panel.render.filesToWriteNoBytesChange":"Files to write","panel.render.references":"References","panel.render.matchesThesePlacesMentionItReported":"matches — these places mention it; reported without edits","panel.render.backup":"Backup","panel.render.beforeWritingBackUpOriginalsTo":"Before writing, back up originals to","panel.render.restoreByCopyingTheOriginalBytes":"; restore by copying the original bytes back","panel.render.generatingPlanReadOnlyNoFiles":"Generating plan… (read-only: no files or backup directories are created)","panel.render.writingOriginalsHaveBeenBackedUp":"Writing… (originals have been backed up to the directory in the plan)","panel.render.changesWrittenPanelDataRefreshed":"Changes written; panel data refreshed.","panel.render.noNewBackupWasCreated":"No new backup was created.","panel.render.backupPrefix":"Backup: ","panel.render.restoreByCopyingTheOriginalBytesBack":"(Restore by copying the original bytes back)","panel.render.demoModeActionsStopAtThe":"Demo mode: actions stop at the plan. The current data source is read-only (fixtures / dev demo), so no real files are written.","panel.render.gotIt":"Got it","panel.render.commonCausesFilesChangedAfterPlanning":"Common causes: files changed after planning (close and reopen the toggle to plan again), itemId is missing, or the target format is unknown and cannot be safely written.","panel.render.closeDialog":"Close dialog","panel.render.dayFreeTrialUntil":"30-day free trial until {p0}","panel.render.dayFreeTrialEnding":"30-day free trial until {p0} · then the free tier (one tool)","panel.render.freeTierHarness":"Free tier tool","panel.render.freeTierBarLabel":"Free tier","panel.render.freeTierBarChoose":"Choose one tool. You can change it after 7 days","panel.render.freeTierBarCurrent":"Current tool: {tool}","panel.render.freeTierBarDay":"Change in {days} day","panel.render.freeTierBarDays":"Change in {days} days","panel.render.freeTierBarToday":"Can change today","panel.render.freeTierBarChange":"Change","panel.render.freeTierBarSwitchableAt":"Can change on {date}","panel.render.freeTierModalTitle":"Free tier shows one tool","panel.render.freeTierModalBody":"You are currently viewing {tool}. A trial or subscription unlocks all three tools, the cross-tool project overview and write access to config toggles.","panel.render.freeTierModalTrial":"Start the 30-day free trial","panel.render.freeTierModalDismiss":"Not now","panel.render.freeTierModalExisting":"Already have a license?","panel.render.freeTierModalImport":"Import","panel.render.freeTierModalRefresh":"Refresh","panel.render.dayFreeTrialActive":"30-day free trial active","panel.render.freeTrialEndedRefreshOrSubscribe":"Free trial ended · the free tier shows one tool · refresh or subscribe","panel.render.subscriptionExpiredInGracePeriodRenew":"Subscription expired, in grace period · renew","panel.render.subscriptionExpiredFreeTier":"Subscription expired · the free tier shows one tool · refresh or subscribe","panel.render.importLicenseJsonFromTheActivation":"Import license.json from the activation page (writes ~/.wingman/license.json and backs up the old file), or drag the file into this panel","panel.render.importLicense":"Import license","panel.render.cancelSubscriptionsOrChangePaymentMethods":"Cancel subscriptions or change payment methods through Stripe using the links in emails sent to your subscription address.","panel.render.manageSubscriptionCancelPaymentMethodInvoices":"Manage subscription (cancel / payment method / invoices)","panel.render.refreshLicense":"Refresh license","panel.render.afterPaymentOrWhileYourSubscription":"After payment, or while your subscription is active, refresh to restore the latest status. Only this button contacts the license service.","panel.render.keepUsingWriteFeatures":"Unlock all three tools, the project overview and config toggles","panel.render.subscribeToWingman":"Subscribe to Wingman","panel.render.refreshing":"Refreshing…","panel.render.freeTrial":"Free trial","panel.render.licenseStatus":"License status","panel.render.freeTrialEnded":"Free trial ended","panel.render.dayFreeTrial":"30-day free trial","panel.render.currentStatus":"Current status","panel.render.subscriptionManagement":"Subscription management","panel.render.lineSuffix":"lines","panel.render.removeThisLineFromThisSubmission":"Remove this line from this submission","panel.render.nothingToSendMOCKDemoData":"Nothing to send (MOCK demo data is never shared; removing every line also sends nothing)","panel.render.sampleExceedsKBRemoveSomeContent":"Sample exceeds 256 KB; remove some content before sending","panel.render.shareASampleToHelpWingman":"Share a sample to help Wingman support more real environments. Everything that will be sent is shown below: review each line and use ✕ to remove anything you do not want to share. Select Send to submit; closing sends nothing. Samples contain no account or device identifiers, and the server does not log IP addresses.","panel.render.contentToSend":"Content to send ·","panel.render.closeWithoutSending":"Close without sending","panel.render.send":"Send","panel.render.sendingPOST":"Sending… (POST","panel.render.sentSamplesAreUsedOnlyTo":"Sent. Samples are used only to support real environments and expire automatically on the server after 90 days.","panel.render.sendFailed":"Send failed","panel.render.nothingWasSentYouCanShare":"Nothing was sent; you can share again later.","panel.render.noSessionId":"(No session_id)","panel.render.eventOriginalHookEventName":"Event: {p0} (original hook_event_name)","panel.render.timeReceiverReceivedAt":"Time = receiver received_at: {p0}","panel.render.mockInjectedDevDemoReplayNot":"MOCK: injected dev demo replay, not a real harness push (addendum 10)","panel.render.wiringConfigurationComplete":"Wiring configuration complete · {p0}","panel.render.eventsReceived":"Events received","panel.render.eventsNotVerified":"Events not verified","panel.render.notConnectedRun":"Not connected — run","panel.render.restartThisHarnessAfterConnectingIt":"Restart this harness after connecting (it reads hooks only at startup; Codex also requires trusting the hook in its UI). Its events will then appear below; the current stream contains events from other harnesses","panel.render.codexHooksConfigurationDetectedButNo":"○ Codex hooks configuration detected, but no events received — in Codex, enter","panel.render.confirmWingmanIsTrustedAndEnabled":", confirm Wingman is Trusted and Enabled. If the current task still produces no events, fully quit and reopen Codex, then test with a new task","panel.render.notConnectedIndicator":"○ Not connected — run","panel.render.toConnectThisHarnessSHooks":"to connect this harness's hooks to the panel (repeatable and reversible with uninstall), then restart the harness to load the hooks configuration. No data appears here before connecting","panel.render.codexHooksConfigurationDetectedButNoEvents":"○ Codex hooks configuration detected, but no events received; connectivity is not yet verified. In Codex, enter","panel.render.theNarrativeOverviewAlreadyHasA":" — the narrative overview already has a session for this harness","panel.render.liveEventsWillAppearAfterProduces":" — live events will appear after {p0} produces an event","panel.render.pushWiringConfigurationDetectedButNo":"○ Push wiring configuration detected, but no events received — live events will appear after","panel.render.producesAnEvent":"produces an event","panel.render.localDemoWhenEventSourceCannotConnect":"Local demo when EventSource cannot connect (no SSE endpoint in dev mode): replays the cc fixture events at 200 ms intervals; all injected events have a MOCK badge","panel.render.replayFixturesDemoMOCK":"Replay fixtures demo · MOCK","panel.render.live":"Live","panel.render.getApiEventsSSEConnectionStatus":"GET /api/events (SSE) connection status; EventSource reconnects automatically","panel.render.previewTheCompleteEventStreamBefore":"Preview the complete event stream before sending; remove individual lines and select Send to submit; closing sends nothing","panel.render.shareEventSample":"Share event sample","panel.render.recentActivity":"Recent activity: {p0}","panel.render.notObserved":"(Not observed)","panel.render.endedSessionEndOrNoEventsFor":"Ended (SessionEnd, or no events or transcript content activity for 10 minutes after a turn-end signal)","panel.render.inProgress":"In progress","panel.render.waitingForYouAnOpenPermission":"Waiting for you: an open permission request or notification","panel.render.discoveredOnStartup":"Registered by the startup scan; no hook events yet","panel.render.newActivitySinceLastViewed":"New activity since last viewed","panel.render.sinceWingmanStarted":"Since Wingman started (","panel.render.noHookEventsReceivedFrom":"), no hook events received from","panel.render.sessionsAreCreatedFromEventsOnly":"; startup only registers session transcripts updated in the last 30 minutes; older sessions are not restored.","panel.render.sessionsAreCreatedFromEventsOnlyDsh":"; sessions are created from events only, and history is not restored after restart.","panel.render.legacyHomeLevelWiringCouldNot":"Legacy home-level wiring could not be removed automatically; disconnect manually, then reconnect: ","panel.render.legacyHomeLevelWiringAndEarlier":"Legacy home-level wiring (0.6.0 and earlier) was removed to prevent dsh startup failures; reconnect: ","panel.render.evicted":"Evicted","panel.render.feedbackSignalsNotConnected":"Feedback signals not connected: ","panel.render.feedbackSignalsUnavailable":"Feedback signals unavailable","panel.render.previewThePlanFilesTimingAnd":"Preview the plan (files, timing, and backup) before confirming any writes","panel.render.viewPlan":"View plan","panel.render.dismissThisSuggestionForThisSession":"Dismiss this suggestion for this session; reopening the panel restores it","panel.render.dismiss":"Dismiss","panel.render.firstInProgressTodoSourceTaskCreate":"First in-progress todo (Source: TaskCreate/TaskUpdate events in the transcript)","panel.render.latestUserPromptSummaryNoIn":"Latest user prompt summary (no in-progress todo in this session)","panel.render.openEventAt":"Open {p0} event at {p1}","panel.render.waitingForYou":"Waiting for you: ","panel.render.totalTokensThisTurnReportedBy":"Total tokens this turn (reported by harness) = {p0}","panel.render.contextThisTurnReportedByHarness":"Context this turn (reported by harness) = {p0}","panel.render.cumulativeInputThisTurnDifferenceIn":"Cumulative input this turn (difference in harness totals) = {p0}","panel.render.estimatedFromTheBuiltInPrice":"$ estimated from the built-in price table","panel.render.thisTurn":"This turn","panel.render.current":"Current: ","panel.render.usage":"Usage: ","panel.render.agentSOwnWordsAssistantText":"Agent's own words (assistant text blocks in the transcript); quoted, not generated","panel.render.noTaskInformationInThisSession":"(No task information in this session)","panel.render.sessionsLabelProjectDataNotReady":"sessions[].label (project data not ready)","panel.render.noTaskTitleProvided":"No task title provided","panel.render.sourcePrefix":"Source: ","panel.render.sourceTaskWorkflowFeedbackReason":"Source: taskWorkflow.feedback.reason","panel.render.requestsNotObservable":"Requests not observable: ","panel.render.activityResumed":"; activity resumed","panel.render.sourceTaskWorkflowFeedbackState":"Source: taskWorkflow.feedback.state; ","panel.render.noOpenRequestObserved":"No open request observed","panel.render.needYou":"Need you?","panel.render.explicitFeedbackRequestReceived":"Explicit feedback request received","panel.render.sourceTaskWorkflowFeedbackSince":"Source: taskWorkflow.feedback.since","panel.render.source":"Source","panel.render.backToSession":"Back to session","panel.render.goal":"Goal","panel.render.latestInstruction":"Latest instruction","panel.render.parallelCurrentPoint":"Current point (parallel)","panel.render.currentPoint":"Current point","panel.render.sourceNeitherTaskWorkflowGoalNorLatestInstruction":"Source: neither taskWorkflow.goal nor latestInstruction was provided","panel.render.goalUnavailable":"Goal unavailable","panel.render.agentSDeclaredPlan":"Agent's declared plan","panel.render.noStructuredPlan":"The agent hasn't provided a structured plan","panel.render.notObservedValue":"Not observed","panel.render.sessionModel":"(Session model: {p0})","panel.render.sessionModelImpactUnknown":"(Session model: {p0}; impact unknown)","panel.render.orInstallThePlanProtocol":"; or install the Plan protocol: {p0}","panel.render.projectPlaceholder":"<project>","panel.render.sinceClaudeCodeDoesNotProvide":"Since {p1}, Claude Code {p0} does not provide plan tools by default for Opus 4.8 / Sonnet 5 / Fable 5 / Mythos 5 and newer models{p2}. Enable: {p3}{p4}","panel.render.sourceTranscriptVersionMessageModelClaude":"Source: transcript version / message.model; Claude Code CHANGELOG 2.1.233","panel.render.ifThisSettingIsAlreadyEnabled":". If this setting is already enabled, the agent has not created a plan.","panel.render.planSourceUnavailable":"Plan source unavailable ·","panel.render.sourceTaskWorkflowPlanForInstruction":"Source: taskWorkflow.plan.forInstruction","panel.render.noPlanDeclaredForThisInstruction":"No plan declared for this instruction","panel.render.previousInstructionSPlanRevision":"Previous instruction's plan · revision","panel.render.markedCompleteByAgent":"Agent has declared completion","panel.render.previousInstructionSPlan":" · Previous instruction's plan","panel.render.notProvided":"Not provided","panel.render.verificationFactsNotProvided":"Verification facts not provided","panel.render.agentCompleteChecksFailures":"{p0} · {p1} checks, {p2} failed · {p3}","panel.render.yes":"Yes","panel.render.no":"No","panel.render.acceptedByYou":"Accepted by you","panel.render.notAccepted":"Not accepted","panel.render.acceptanceUnavailable":"Acceptance unavailable · {p0}","panel.render.noRecentSteps":"No recent steps","panel.render.executionEvidence":"Execution evidence","panel.render.sourceTaskWorkflowExecutionEvidenceCountFailureCount":"Source: taskWorkflow.execution.evidenceCount / failureCount","panel.render.evidenceCountSeparator":"entries ·","panel.render.failed":"failed","panel.render.plan":"Plan","panel.render.verification":"Verification","panel.render.taskworkflowVerificationAgentStructuredPlanStep":"taskWorkflow.verification; agent structured plan step states; taskWorkflow.plan.forInstruction; Harness tool_result(is_error / exit_code); local task-overlay.json accepted","panel.render.recentSteps":"Recent steps","panel.render.transcriptHookToolEventThreeMost":"transcript / hook tool event; three most recent entries by ts","panel.render.failureSuffix":" · Failed","panel.render.sourceTranscriptHookToolEventOriginal":"Source: transcript / hook tool event; original parameters: ","panel.render.noWingmanPlanMd":"No .wingman/plan.md","panel.render.projectDataUnavailable":"Project data unavailable","panel.render.openProject":"Open project","panel.render.thisSessionAttachedTo":"This session: attached to","panel.render.thisSessionUnattached":"This session: unattached (","panel.render.copyInstallCommand":"Copy install command","panel.render.currentPointPrefix":"Project current point: ","panel.render.markedCompleteByAgentNoThe":"Agent has not declared completion (the previous instruction's plan is complete; no plan declared for this instruction)","panel.render.agentCompletionStatus":"Agent has not declared completion","panel.render.agentStructuredPlanStepStatesTaskWorkflow":"Agent structured plan step states; taskWorkflow.plan.forInstruction","panel.render.agentStructuredPlanStepStates":"Agent structured plan step states","panel.render.noObservableChecks":"No observable checks","panel.render.checksRunsFailures":"{p0} checks, {p1} failed","panel.render.currentStepFailuresRuns":" · Current step: {p1} checks, {p0} failed","panel.render.latestFailure":" · Latest failure: {p0}{p1}","panel.render.markedByYouAt":"Accepted by you · {p0}","panel.render.waitingForYourReply":"Waiting for your reply","panel.render.genericNotificationTip":"Claude Code notifications do not include the question. Return to the session to view it.","panel.render.notMarked":"Not accepted","panel.render.unavailable":"Unavailable · {p0}","panel.render.undoAcceptance":"Undo acceptance","panel.render.markAccepted":"Mark accepted","panel.render.sourceHarnessToolResultIsError":"Source: Harness tool_result(is_error / exit_code)","panel.render.sourceLocalTaskOverlayJsonAccepted":"Source: local task-overlay.json accepted","panel.render.other":"Other","panel.render.executionAttributedTo":"Execution attributed to: ","panel.render.noExecutionEvidenceYet":"○ No execution evidence yet","panel.render.tasks":"Tasks","panel.render.controls":"Controls","panel.render.billing":"Usage","panel.render.turns":"{p0} turns","panel.render.approx":" · Approx. {p0}","panel.render.subagent":"Subagent","panel.render.tool":"Tool: {p0}{p1}{p2}","panel.render.started":`
50
50
  Started: {p0}`,"panel.render.approximateTokensToolInputResultBytes":`
51
51
  Approximate tokens = tool input + result bytes ÷ 3.5 (estimate)`,"panel.render.waited":"Waited {p0}","panel.render.waiting":" · Waiting…","panel.render.eventStartEndObservedThroughHooks":"{p0} event start/end (observed through hooks)","panel.render.startedAt":"Started: {p0}","panel.render.resolvedEvent":"Resolved: {p0} (event {p1})","panel.render.notYetResolved":"Not yet resolved","panel.render.phaseGroupingToolTypeRulesDocumented":"Phase grouping: tool type rules (documented); click to {p0} steps{p1}","panel.render.collapse":"Collapse","panel.render.expand":"Expand","panel.render.approximateTokensSumOfStepByte":`
52
- Approximate tokens = sum of step byte estimates in this node`,"panel.render.steps":"steps","panel.render.stepsIncludeASubagentAttributionIs":"Steps include a subagent ({p0}); attribution is inferred from time windows and Agent spans; uncertain steps appear under Other","panel.render.stepsAttributedToTheMainAgent":"Steps attributed to the main agent (inferred from time windows)","panel.render.stepsThatCannotBeAssignedTo":"Steps that cannot be assigned to a todo appear under Other (missing timestamps, no in-progress todo, or ambiguous parallel tasks); uncertainty is preserved","panel.render.otherUnassignedSteps":"Other (unassigned steps)","panel.render.sourceMarkdownChecklistInAssistantText":"Source: markdown checklist in assistant text (- [ ] / - [x]); fallback when no tool-based checklist exists, replaced as soon as one appears","panel.render.textChecklistWrittenByAgent":"Text checklist (written by agent)","panel.render.thisHarnessDoesNotProduceA":"This harness does not produce a task checklist; execution trace follows","panel.render.thisSessionDidNotUseA":"This session did not use a task checklist; execution trace follows","panel.render.noNarrativeDataYetConnect":"○ No narrative data yet — connect (","panel.render.thenRestartTheHarnessAndRun":", then restart the harness) and run a conversation to see execution traces grouped by task","panel.render.rawHookEventStreamTheLive":"Raw hook event stream (the 0.2 live view); collapsed by default","panel.render.rawEvents":"Raw events","panel.render.eventsReceivedForThisSessionBut":"○ Events received for this session, but no Codex usage parsed yet. This does not mean zero usage; no estimate is shown here","panel.render.noCodexSessionUsageDataReceived":"○ No Codex session/usage data received yet — in Codex, enter","panel.render.andConfirmWingmanIsTrustedAnd":"and confirm Wingman is Trusted and Enabled","panel.render.noReadableUsageDataReceivedFor":"○ No readable usage data received for this session yet; turns are listed only when exact sources are available, without estimates","panel.render.usagePerTurnExactCodexToken":"Usage per turn · exact Codex token_count values; local events do not include subscription dollar charges","panel.render.usagePerTurnThreeExactUsage":"Usage per turn · three exact usage fields reported by the harness","panel.render.reasoningIncludedInOut":" · Reasoning {p0} (included in out)","panel.render.originalUsageExactReportedByHarness":"Original usage (exact, reported by harness): ","panel.render.cumulativeInputThisTurnDifferenceBetween":"Cumulative input this turn (difference between adjacent turn totals) {p0} · uncached {p1} · cache_write field {p2} · cached reads {p3} · output {p4}{p5}","panel.render.inputCachedWritesCachedReadsOutput":"Input {p0} · cached writes {p1} · cached reads {p2} · output {p3}{p4}","panel.render.contextThisTurnSumOfThe":"Context this turn = sum of the three input fields = {p0}","panel.render.totalTokensThisTurnReported":"Total tokens this turn (reported) = {p0}","panel.render.turnStateInterruptedUsageReportedBefore":"Turn state = interrupted (usage reported before interruption is preserved)","panel.render.turnStateOpenShowingUsageReported":"Turn state = open (showing usage reported so far)","panel.render.actualChatGPTCodexSubscriptionChargesAre":"$: actual ChatGPT/Codex subscription charges are not in local events; no conversion","panel.render.thisModelIsAbsentFromThe":"$: this model is absent from the built-in price table; no conversion","panel.render.estimatedFromTheBuiltInPriceTable":"$ estimated from the built-in price table (cached reads ×0.1, cached writes ×1.25/×2), marked ≈","panel.render.interrupted":"Interrupted","panel.render.open":"Open","panel.render.cumulativeInUncachedCacheWriteCached":"Cumulative in {p0} · uncached {p1} · cache_write {p2} · cached reads {p3} · out {p4}","panel.render.inCachedWritesCachedReadsOut":"In {p0} · cached writes {p1} · cached reads {p2} · out {p3}","panel.render.turnTotal":"Turn total —","panel.render.turnTotalValue":"Turn total {p0}","panel.render.cumulativeInputThisTurn":"Cumulative input this turn {p0}","panel.render.reportProblem":"Report a problem","panel.render.clickingSendsAllowlistedReproductionHintsTo":"Clicking sends allowlisted reproduction hints to Tally, whose service may also process connection information. The problem description and screenshots are sent only when you submit. Do not include prompts, source code, paths, account information, or credentials.","panel.render.pending":"Pending","panel.render.markedCompleteByAgentUser":"Marked complete by agent/user","panel.render.cancelled":"Cancelled","panel.render.checkpoint":"Checkpoint","panel.render.protocolNotInstalled":"Protocol not installed","panel.render.protocolInstalled":"Protocol installed","panel.render.installedButNotLoaded":"Installed but not loaded","panel.render.planAlreadyExists":"Plan already exists","panel.render.thisSessionHasWrittenAPlan":"This session has written a plan","panel.render.dshHasNoUserLevelInstruction":"dsh has no user-level instruction file","panel.render.sourceGETApiAnatomyPlanProtocolUser":"Source: GET /api/anatomy {p0}.planProtocol.user;{p1}","panel.render.takesEffectInTheNextNew":";takes effect in the next new session","panel.render.planProtocolInstalledForYourAccount":"Plan protocol · Installed for your account","panel.render.protocolVUpdateAvailable":"Protocol v1, update available","panel.render.notInstalled":"Not installed","panel.render.modified":"Modified","panel.render.unsupported":"Unsupported","panel.render.dshHasNoUserLevelInstructionFile":"dsh has no user-level instruction file; install the project-level protocol per project","panel.render.replaceLtProjectGtWithThe":"; replace &lt;project&gt; with the project path before running","panel.render.copyProjectInstallCommand":"Copy project install command","panel.render.backsUpBeforeUpdatingPreservesContent":"The plan only gives Wingman something to display. It never rewrites harness behavior or any code. Backs up before updating; takes effect in the next new session.","panel.render.theProtocolBlockHasBeenModified":"The protocol block has been modified. Existing content is preserved; resolve the changes before reinstalling.","panel.render.afterConfirmationInstallsInTheUser":"The plan only gives Wingman something to display. It never rewrites harness behavior or any code.","panel.render.reinstall":"Reinstall","panel.render.installAction":"Install","panel.render.planProtocol":"Plan protocol: {p0}","panel.render.protocolUpdateSuffix":"· Protocol v1, update available","panel.render.scopeUserLevelProtocolCommandVersion":"{p0};scope: user-level protocol;command version: GET /api/version","panel.render.installOnceToRequestPlansIn":"The plan is only for Wingman to display. It never rewrites harness behavior or code.","panel.render.projectCommandVersionGETApiVersion":"{p0} · {p1};project: {p2};command version: GET /api/version","panel.render.toBeFilledIn":"To be filled in","panel.render.wingmanVersionUnknownTheInstallCommand":"Wingman version unknown; the install command is not version-pinned","panel.render.theDshInstructionLoadingPluginIs":"The dsh instruction-loading plugin is disabled; see the toggle on the controls page","panel.render.sessionPlan":"Session plan ·","panel.render.noStructuredPlanProvided":"No structured plan provided","panel.render.unavailablePrefix":"Unavailable: ","panel.render.sourceSessionPlanForInstruction":"Source: sessionPlan.forInstruction","panel.render.sessionPlanRevisionAgentMarkedComplete":"Session plan revision {p0} · Agent marked {p1}/{p2} complete","panel.render.sessionPlanUnavailable":"Session plan unavailable: {p0}","panel.render.dataTipSourceSessionPlanForInstruction":' data-tip="Source: sessionPlan.forInstruction"',"panel.render.timestampSourceHookEvent":"Timestamp: {p0} · Source: hook event","panel.render.recentActivityPrefix":"Recent activity: ","panel.render.needsYou":"Needs you: ","panel.render.checksFailuresRuns":"Checks: {p0} failures / {p1} runs","panel.render.accepted":"Accepted {p0}","panel.render.acceptanceUnavailableReason":"Acceptance unavailable: {p0}","panel.render.notLinkedToAStep":"Not linked to a step","panel.render.linkedTo":"Linked to: {p0}","panel.render.pin":"Pin","panel.render.commandCopied":"Command copied","panel.render.couldNotCopyCommand":"Could not copy command","panel.render.thisHarnessHasNoCommandTo":"This harness has no command to resume a specific session","panel.render.noReturnAppSelected":"No return app selected","panel.render.switchedTo":"Switched to {p0}","panel.render.couldNotSwitch":"Could not switch: {p0}","panel.render.dshHasNoCommandToResume":" · dsh has no command to resume a specific session; return to the original terminal to continue","panel.render.sourceClipboardWriteResultResponseOr":"Source: clipboard write result{p0};{p1} response or request failure;harness resume command support","panel.render.thisHarnessHasNoResumeCommand":"(this harness has no resume command; nothing was copied)","panel.render.taskCardMenu":"Task card menu","panel.render.copy":"Copy","panel.render.rename":"Rename","panel.render.clearToRestoreTheAutomaticTitle":"Clear to restore the automatic title","panel.render.unpin":"Unpin","panel.render.unhide":"Unhide","panel.render.hide":"Hide","panel.render.hidden":"Hidden","panel.render.cards":" cards ·","panel.render.show":"Show","panel.render.planAcceptance":"Plan acceptance: ","panel.render.cardsHiddenByFilters":" cards hidden by filters","panel.render.sourceWingmanPlanMdNodesSubtree":"Source: .wingman/plan.md nodes; subtree leaf count","panel.render.expandChildSteps":"Expand child steps (","panel.render.noSessionObserved":"No session observed","panel.render.noTaskCardsMatchTheFilters":"No task cards match the filters (","panel.render.filteredOut":" filtered out)","panel.render.fileTimestamp":"File timestamp {p0}","panel.render.lastWriter":"Last writer: {p0} {p1} · {p2}","panel.render.lastWriterExternalEditNotObserved":"Last writer: external edit / not observed","panel.render.parentChildConflicts":"{p0} parent-child conflicts","panel.render.inProgressStepsWithoutAnActive":"{p0} in-progress steps without an active session","panel.render.otherFacts":"{p0} other facts","panel.render.pathSource":"{p0} · Source: {p1}","panel.render.waitingForYourDecision":"Waiting for your decision","panel.render.requests":" requests","panel.render.openSession":"Open session","panel.render.thePlanNeedsYourReview":"The plan needs your review","panel.render.goToNode":"Go to node","panel.render.projectInProgress":"In progress","panel.render.noPlanFile":"No plan file","panel.render.planUnreadable":"Plan unreadable","panel.render.cannotDetermineWhetherYouAreNeeded":"Cannot determine whether you are needed","panel.render.copyInstallCommandTip":"{p0} · Copy install command","panel.render.howToProvideAPlan":"How to provide a plan","panel.render.createAtTheProjectRoot":"Create at the project root: ","panel.render.withTheProjectTitleGoalAnd":", with the project title, goal and steps. A handwritten file is sufficient.","panel.render.projectName":"# Project name","panel.render.goalProjectGoal":"Goal: Project goal","panel.render.currentTask":"- [/] Current task","panel.render.pendingTask":"- [ ] Pending task","panel.render.connectFeedbackSignals":"Connect feedback signals ·","panel.render.notEnoughInformation":"Not enough information: ","panel.render.cannotReadPlanFile":"Cannot read plan file","panel.render.cannotSeeRequests":"Requests not observable","panel.render.projectEnded":"Ended","panel.render.sourceGETApiProjectsRequestOr":"Source: GET /api/projects request or payload validation failed","panel.render.projectRefreshFailedShowingThePrevious":"Project refresh failed. Showing the previous response; action status may have changed","panel.render.noProjectGoalProvided":"No project goal provided","panel.render.noSessionActivityTimestampObserved":"No session activity timestamp observed","panel.render.noActiveSessionThisProjectS":"No active session (this project's sessions are no longer in the panel)","panel.render.noActiveSessionWingmanHasReceived":"No active session (Wingman has received no events for this project since startup)","panel.render.timestamp":"Timestamp: ","panel.render.sourceSeparator":"· Source: ","panel.render.titleSource":"· Title source: ","panel.render.sourcePlanAvailabilityReasonLine":"Source: plan.availability / reason / line","panel.render.planUnavailable":"Plan unavailable: ","panel.render.line":" · Line {p0}","panel.render.sourceSessionsFeedbackState":"Source: sessions[].feedback.state","panel.render.feedbackSignalsAreNotConnectedOr":"Feedback signals are not connected or unavailable; cannot determine whether you are needed","panel.render.viewPlanProtocol":"· View plan protocol","panel.render.currentBranch":"Current branch","panel.render.moreBranches":"{count} more branches","panel.render.oneMoreBranch":"{count} more branch","panel.render.branchCurrentPoints":"{count} current points","panel.render.branchCurrentPoint":"{count} current point","panel.render.branchCurrentPointsSource":"Source: currentPoints within this top-level node subtree","panel.render.noCurrentBranchProvided":"No current branch provided","panel.render.currentTaskLabel":"Current task","panel.render.morePoints":"{count} more items","panel.render.oneMorePoint":"{count} more item","panel.render.sourceFirstScreenCurrentPointsLength":"Source: firstScreen.currentPoints.length","panel.render.parallel":"Parallel","panel.render.thePlanHasNoStepMarked":"The plan has no step marked in progress","panel.render.recentActivityLabel":"Recent activity","panel.render.thePlanHasNoSteps":"The plan has no steps","panel.render.planTree":"Plan tree","panel.render.fullRecord":"Full record","panel.render.completedMilestones":"{count} completed · Latest: {name}","panel.render.completedMilestonesSource":"Source: completed or cancelled top-level plan.nodes; latest in document order","panel.render.sessionsNotLinkedToAStep":"Sessions not linked to a step","panel.render.sourcePlanLastGood":"Source: plan.lastGood","panel.render.lastReadableVersion":"Last readable version","panel.render.projectSessions":"Project sessions","panel.render.sourceWingmanPlanMdLeafCounts":"Source: .wingman/plan.md leaf counts; counts.pending / inProgress / completed / cancelled / checkpoint","panel.render.agentUserMarksPending":"Agent/user marks · Pending","panel.render.inProgressCount":"· In progress","panel.render.complete":"· Complete","panel.render.cancelledCount":"· Cancelled","panel.render.checkpointCount":"· Checkpoint","panel.render.sourceCompletionLabel":"Source: completionLabel","panel.render.ignoredLine":"Line {p0}: {p1}","panel.render.ignored":"· Ignored","panel.render.sourcePlanHigherPlanPaths":"Source: plan.higherPlanPaths","panel.render.planFilesAlsoExistAbove":"Plan files also exist above: ","panel.render.sourceSessionsUnattachedReason":"Source: sessions[].unattachedReason","panel.render.notLinked":"· Not linked: ","panel.render.sourcePlanLastGoodRevisionMtime":"Source: plan.lastGood.revision / mtime","panel.render.lastReadableVersionRevision":"Last readable version · revision","panel.render.connectionsAndProtocolPlanSourceAnd":"Connections and protocol · Plan source and status","panel.render.sourceProjectRoot":"Source: project.root","panel.render.sourceRevisionMtimeLastWriter":"Source: revision / mtime / lastWriter","panel.render.all":"All","panel.render.waitingForYouLabel":"Waiting for you","panel.render.turnEnded":"Turn ended","panel.render.turnEndedSource":"{harness} Stop or main transcript turn-end signal time","panel.render.clickToAcknowledge":"Click to acknowledge","panel.render.additionalAttention":"Also: {events}","panel.render.ended":"Ended","panel.render.status":"Status","panel.render.dataTipSourceGETApiProjects":' data-tip="Source: GET /api/projects request and payload validation"',"panel.render.projectRefreshFailedProjectDataIs":"Project refresh failed; project data is unavailable","panel.render.projectDataIsUnavailable":"Project data is unavailable","panel.render.dismissProjectMemoryNotice":"Dismiss project memory notice","panel.render.projectRefreshFailedShowingThePreviousResponse":"Project refresh failed; showing the previous response","panel.render.noSessionWithAWorkingDirectory":"No session with a working directory observed","panel.render.mockDemoData":"MOCK demo data","panel.render.projectPlansAcrossHarnessesLocalAnd":"Project plans across harnesses · Local and read-only","panel.render.scannedAt":"{p0}{p1} · Scanned at {p2}","panel.render.collapseArrow":"Collapse ▴"},Vr={"cli.server.requestFailed":"[wingman] Request failed: {error}","cli.server.refreshFromPanel":"Refresh the license using the button in the Wingman panel","cli.server.harnessQuery":"harness must be {ids} (?harness=<id>), received {harness}","cli.server.anatomyHome":"anatomy requires an explicit homeDir","cli.server.detectFailed":"[wingman] {harness} detection failed, skipped: {error}","cli.server.scanFailed":"[wingman] {harness} scan failed, showing limited information: {error}","cli.server.configFailed":"Failed to read configuration: {error}","cli.server.jsonBody":"The request body must be valid JSON","cli.server.harnessRequired":"harness must be {ids}, received {harness}","cli.server.actionShape":'action must have the shape {kind:"toggle", itemId, enable}',"cli.server.fixturesAction":"Fixtures mode is read-only: actions stop at the plan and no files are written","cli.server.subscriptionRequired":"A trial or active subscription is required to write configuration changes (the free tier shows one tool).","cli.server.mobileRequiresLicense":"A trial or active subscription is required to pair a phone (the free tier shows one tool).","cli.server.fixturesMobile":"Fixtures mode is read-only: phones cannot be paired or unpaired","cli.server.planShape":"plan must be an ActionPlan object (returned by /api/action/plan)","cli.server.fixturesProtocol":"Fixtures mode is read-only: no preview or writing of the user-level protocol","cli.server.dshUserUnsupported":"unsupported: dsh has no user-level instruction file; install the plan protocol per project","cli.server.protocolHarness":"The user-level plan protocol requires harness cc|codex","cli.server.protocolHome":"The user-level plan protocol requires an explicit homeDir","cli.server.backupPreview":"~/.wingman/backups/<ISO timestamp> (append -N for duplicates)","cli.server.fixturesReturn":"Fixtures mode is read-only: return settings are not saved and apps are not activated","cli.server.returnHome":"Return settings require homeDir","cli.server.bundleShape":"The request only accepts a bundlePath string","cli.server.returnMissing":"The selected return app was not detected","cli.server.openTimeout":"App activation timed out","cli.server.openFailed":"App activation failed","cli.server.fixturesOverlay":"Fixtures mode is read-only: task card overlays are not written","cli.server.overlayShape":"Session requests require a valid harness, a nonempty sessionId and a title/pinned/hidden/accepted/archived patch; project requests require a nonempty root and a pinned/order/hidden/archived patch, with a nonnegative integer order","cli.server.overlayHome":"Task card overlays require homeDir","cli.server.licenseRead":"The license file exceeds the 64KB limit or could not be read","cli.server.panelBuild":"The panel has not been built: run pnpm --filter @wingman/panel build, then refresh this page.","cli.server.settingsRead":"Cannot read return settings; check settings.json","cli.server.settingsFormat":"Cannot parse return settings or unknown version; refusing to overwrite. Check settings.json","cli.server.settingsWrite":"Could not back up or write return settings; settings were not overwritten. Check settings.json","cli.server.localeInvalid":"locale must be a registered language tag","cli.server.settingsInvalid":"Settings require a registered locale, a valid island position and size, or a known freeHarness","cli.server.freeHarnessNotDetected":"This tool has not been detected and cannot be selected for the free tier.","cli.server.freeHarnessCooldown":"The free tool cannot be changed for 7 days after selection. You can change it on {switchableAt}.","cli.server.fixturesSettings":"Fixtures mode is read-only: language settings are not saved","cli.server.settingsHome":"Language settings require homeDir"},Gr={"narrative.waitedPermission":"Waiting for {duration}: Waiting for permission","narrative.waitedPermissionDetail":"Waiting for {duration}: Waiting for permission: {reason}","narrative.waitedResponse":"Waiting for {duration}: Waiting for a response","narrative.waitedResponseDetail":"Waiting for {duration}: Waiting for a response: {reason}","narrative.suggestionUnused":"{server} has not been used in this session, it can be disabled","narrative.suggestionUnusedExact":"{server} has not been used in this session, disabling it can save {tokens} tok (resident estimate)","narrative.suggestionUnusedEstimated":"{server} has not been used in this session, disabling it can save about {tokens} tok (resident estimate)"},Kr={tag:"en",nativeName:"English",messages:{...qr,...Br,...Hr,..._r,...Dr,...Wr,...Ur,...Vr,...Gr}},Yr={"adapter.cc.features.invalidValue":"{p0}:{p1} 格式未知,拒绝写入","adapter.cc.features.overridden":"被 {p0} 层覆盖,此处改动不生效","adapter.cc.features.invalidAction":"拒绝:功能操作的键或取值无效","adapter.cc.features.noChange":"无需切换:{p0} 已处于目标状态","adapter.cc.features.planChanged":"拒绝执行:功能配置或操作计划已改变,请重新 plan","adapter.unknownError":"未知错误","adapter.invalidPort":"非法端口:{port}","adapter.cc.hooks.refusingToWriteIsNotValidJSONUnknownFormats":"拒写:{p0} 不是合法 JSON({p1}),不猜格式","adapter.cc.hooks.refusingToWriteRootIsNotAJSONObject":"拒写:{p0} 顶层不是 JSON 对象,不猜格式","adapter.cc.hooks.refusingToWriteHooksFieldIsNotAnObject":"拒写:{p0} 的 hooks 字段不是对象,不猜格式","adapter.cc.hooks.refusingToWriteHooksIsNotAnArrayUnknown":"拒写:{p0} 的 hooks.{p1} 不是数组,不猜格式","adapter.cc.actions.refusingToWriteIsNotUTFTextUnknownFormats":"拒写:{p0} 不是 UTF-8 文本,未知格式不猜","adapter.cc.actions.refusingToWriteSkillOverridesIsNotAnObjectUnknown":"拒写:{p0} 的 skillOverrides 不是对象,不猜格式","adapter.cc.actions.refusedSkillOverridesHasAnUnknownValueItsMeaningIs":"拒绝:{p0} 的 skillOverrides.{p1} 取值 {p2} 未知,不猜语义","adapter.cc.actions.noChangeNeededSkillIsAlreadyDisabled":"无需切换:skill {p0} 已是关闭状态","adapter.cc.actions.noChangeNeededSkillIsAlreadyEnabled":"无需切换:skill {p0} 已是启用状态","adapter.cc.actions.refusedWasNotFoundMCPConnectionSwitchesAreStored":"拒绝:找不到 {p0}(MCP 连接开关按项目存放于该文件)","adapter.cc.actions.refusedHasNoRecordForThisProjectInProjects":"拒绝:{p0} 的 projects 里没有本项目({p1})的记录;","adapter.cc.actions.mcpConnectionSwitchesAreStoredPerProjectRunClaude":"MCP 连接开关按项目存放,请先在该项目里运行过 Claude Code","adapter.cc.actions.refusingToWriteDisabledMcpServersIsNotAnArrayUnknown":"拒写:{p0} 的 disabledMcpServers 不是数组,不猜格式","adapter.cc.actions.refusingToWriteDisabledMcpServersContainsANonStringMember":"拒写:{p0} 的 disabledMcpServers 含非字符串成员,不猜格式","adapter.cc.actions.noChangeNeededMCPServerIsAlreadyDisabled":"无需切换:MCP server {p0} 已是关闭状态","adapter.cc.actions.noChangeNeededMCPServerIsAlreadyEnabled":"无需切换:MCP server {p0} 已是启用状态","adapter.cc.actions.unsupportedActionKindVOnlySupportsToggleThroughPlan":"不支持的动作种类:{p0}(v1 仅 toggle 走 plan→apply)","adapter.cc.actions.refusedToggleActionRequiresItemIdStringAndEnableBoolean":"拒绝:toggle 动作缺少 itemId(string)或 enable(boolean)","adapter.cc.actions.itemNotFoundTheItemMayHaveChangedScan":"找不到条目:{p0}(条目可能已变动,请重新扫描)","adapter.cc.actions.itemCannotBeToggledVOnlySupportsSkillOverridesAnd":"条目不可开关:{p0}(v1 开关范围仅 skills 的 skillOverrides 与 MCP 连接开关)","adapter.cc.actions.itemCannotBeToggledCannotParseTheServerName":"条目不可开关:{p0}(无法从 nativeName 解析 server 名)","adapter.cc.actions.itemCannotBeToggled":"条目不可开关:{p0}","adapter.cc.actions.refusingToApplyPlanIsNotAnObject":"拒绝执行:plan 不是对象","adapter.cc.actions.refusingToApplyPlanHarnessIsNotCcReceived":'拒绝执行:plan.harness 不是 "cc"(得到 {p0}),只接受本 adapter 产出的 plan',"adapter.cc.actions.refusingToApplyPlanActionIsNotToggleOnly":"拒绝执行:plan.action 不是 toggle,只接受本 adapter 产出的 plan","adapter.cc.actions.refusingToApplyPlanBackupDirIsMissing":"拒绝执行:plan.backupDir 缺失","adapter.cc.actions.refusingToApplyPlanWritesIsMissingOrEmpty":"拒绝执行:plan.writes 缺失或为空","adapter.cc.actions.refusingToApplyPlanWritesContainsAnEntryWithout":"拒绝执行:plan.writes 含缺少 file 的条目","adapter.cc.actions.refusingToApplyCreateChangeForIsMissingAfter":"拒绝执行:{p0} 的 create 变更缺少 after","adapter.cc.actions.refusingToApplyModifyChangeForIsMissingBefore":"拒绝执行:{p0} 的 modify 变更缺少 before/after","adapter.cc.actions.refusingToApplyDeleteChangeForIsMissingBefore":"拒绝执行:{p0} 的 delete 变更缺少 before","adapter.cc.actions.refusingToApplyPlanWritesContainsAnUnknownKind":"拒绝执行:plan.writes 含未知 kind:{p0}","adapter.cc.actions.refusingToApplyWasCreatedAfterPlanningPlanAgain":"拒绝执行:{p0} 在 plan 后被创建,请重新 plan","adapter.cc.actions.refusingToApplyNoLongerExistsChangedAfterPlanning":"拒绝执行:{p0} 已不存在(plan 后被改动),请重新 plan","adapter.cc.actions.refusingToApplyWasModifiedAfterPlanningPlanAgain":"拒绝执行:{p0} 在 plan 后被改过,请重新 plan","adapter.cc.actions.allWrittenFilesHaveBeenRolledBack":"已回滚全部已写文件","adapter.cc.actions.filesThatCouldNotBeRolledBackOriginalsAre":"回滚失败的文件:{p0},原件备份在 {p1}","adapter.cc.actions.writeFailed":"写入失败:{p0};{p1}","adapter.cc.actions.readBackVerificationFailedDiffersFromTheExpectedContent":"写入后重读校验失败:{p0} 的内容与预期不符(可能被 Claude Code 并发重写)。","adapter.cc.actions.originalsAreBackedUpAtRestoreFromThisBackup":"原件备份在 {p0},可从该备份恢复","adapter.cc.protocol.install":"安装","adapter.cc.protocol.uninstall":"卸载","adapter.cc.protocol.theManagedProtocolFileHasBeenModified":"受管协议文件已被修改","adapter.cc.protocol.theManagedProtocolFileHasBeenModifiedRefusingTo":"受管协议文件已被修改({p0}),拒绝{p1}并保留用户内容","adapter.codex.hooks.invalidPort":"非法端口:{p0}","adapter.codex.hooks.theManagedWingmanCodexHookBlockWasModifiedOr":"Wingman Codex hook 受管块已被修改或残缺({p0}),拒绝谎报接线成功;","adapter.codex.hooks.restoreTheCompleteBlockFromWingmanRootBackupsOr":"请先从 <wingman根>/backups/ 恢复完整块,或人工核对后移除该受管块再重新安装并信任","adapter.codex.hooks.theManagedWingmanCodexHookBlockWasModifiedOr52":"Wingman Codex hook 受管块已被修改或残缺({p0}),拒绝自动删除;","adapter.codex.hooks.restoreTheCompleteBlockFromWingmanRootBackupsOr53":"请先从 <wingman根>/backups/ 恢复完整块,或人工核对后移除该受管块","adapter.codex.hooks.incompleteWingmanMarkerBlockRestoreFromWingmanRootBackups":"wingman 标记块残缺({p0}):请从 <wingman根>/backups/ 恢复或手动删除标记后重试","adapter.codex.hooks.duplicateWingmanMarkerBlocksRestoreFromWingmanRootBackups":"wingman 标记块重复({p0}):请从 <wingman根>/backups/ 恢复或手动删除多余标记后重试","adapter.codex.hooks.cannotParseCodexConfigTomlRefusingToWrite":"Codex config.toml 解析失败,拒绝写入({p0}):{p1}","adapter.codex.hooks.codexConfigTomlHooksKeyIsNotATable":"Codex config.toml 的 hooks 键不是表,未知格式拒绝写入({p0})","adapter.codex.hooks.userOwnedHooksConfigurationAlreadyExistsWingmanWillNot":"已存在用户自己的 [hooks] 配置({p0}),wingman 不合并不覆盖;","adapter.codex.hooks.removeItManuallyOrAddTheForwardingCommandTo":"请先手动移除或自行把转发命令加入现有 hooks({p0})","adapter.codex.actions.planHarnessIsNotCodexRefusingToApply":"plan.harness={p0} 不是 codex,拒绝执行","adapter.codex.actions.planWritesDoesNotMatchThisAdapterSFormat":"plan.writes 不是本 adapter 产出的形状(应恰为一处 modify),拒绝执行","adapter.codex.actions.backupdirIsOutsideTheWingmanBackupRootRefusingTo":"backupDir 不在 wingman 备份根({p0})下,拒绝执行","adapter.codex.actions.fileWasModifiedAfterPlanningRefusingToApplyPlan":"文件在 plan 之后被修改({p0}),拒绝执行;请重新 plan","adapter.codex.actions.theTargetFileInPlanWritesDoesNotMatch":"plan.writes 的目标文件与 itemId 对不上,拒绝执行","adapter.codex.actions.planDiffersFromThisAdapterSExpectedChangesRefusing":"plan 与本 adapter 的推演不一致,拒绝执行;请重新 plan","adapter.codex.actions.unknownActionKindVOnlySupportsToggleThroughPlan":"未知动作种类:{p0}(v1 仅 toggle 走 plan→apply)","adapter.codex.actions.unrecognizedOrUntoggleableItemIdCodexOnlySupportsMcpServers":"itemId 无法识别或不可开关:{p0}(codex 可开关条目仅限 tools 槽的 mcp_servers.* 与 skills 槽的 plugins.*)","adapter.codex.actions.itemidNotFoundConfigurationFileDoesNotExist":"itemId 找不到:配置文件不存在({p0})","adapter.codex.actions.cannotParseCodexConfigTomlRefusingTheAction":"Codex config.toml 解析失败,拒绝动作({p0}):{p1}","adapter.codex.actions.unrecognizedItemIdSkillsOnlySupportsPluginsEntriesReceived":"itemId 无法识别:skills 槽只支持 plugins.* 条目,得到 {p0}","adapter.codex.actions.itemidNotFoundPluginIsNotIn":"itemId 找不到:插件 {p0} 不在 {p1}","adapter.codex.actions.pluginConfigurationIsNotATableRefusingToWrite":"插件 {p0} 的配置不是表,未知格式拒绝写入({p1})","adapter.codex.actions.enabledKeyFor":"{p0} 的 enabled 键","adapter.codex.actions.enabledValueFor":"{p0} 的 enabled 值","adapter.codex.actions.unrecognizedItemIdToolsOnlySupportsMcpServersEntriesReceived":"itemId 无法识别:tools 槽只支持 mcp_servers.* 条目,得到 {p0}","adapter.codex.actions.itemidNotFoundHasNoMcpServersConfiguration":"itemId 找不到:{p0} 无 mcp_servers 配置","adapter.codex.actions.ambiguousItemIdBothServerAndServerExistCannotDetermine":'itemId 歧义:同时存在 server "{p0}" 与 server "{p1}"(无法断定目标,拒绝;不猜)',"adapter.codex.actions.itemidNotFoundMCPServerDoesNotExistMcp":"itemId 找不到:mcp server 不存在(mcp_servers.{p0} @ {p1})","adapter.codex.actions.mcpServerConfigurationIsNotATableRefusingTo":"mcp server {p0} 的配置不是表,未知格式拒绝写入({p1})","adapter.codex.actions.enabledKeyForMcpServers":"mcp_servers.{p0} 的 enabled 键","adapter.codex.actions.enabledValueForMcpServers":"mcp_servers.{p0} 的 enabled 值","adapter.codex.actions.conflictingConfigurationToolAppearsInBothEnabledToolsAnd":"矛盾配置:工具 {p0} 同时出现在 mcp_servers.{p1} 的 enabled_tools 与 disabled_tools({p2}),拒绝动作","adapter.codex.actions.cannotExplainTheStateOfMcpServersDisabledBut":"mcp_servers.{p0}/{p1} 状态无法解释(不在任何名单却判为关),拒绝动作({p2})","adapter.codex.actions.keyForMcpServers":"mcp_servers.{p0} 的 {p1} 键","adapter.codex.actions.arrayForMcpServers":"mcp_servers.{p0} 的 {p1} 数组","adapter.codex.actions.arrayForMcpServersTextDiffersFromParsedData":"mcp_servers.{p0} 的 {p1} 数组(文本与解析不一致)","adapter.codex.actions.inForMcpServers":"mcp_servers.{p0} 的 {p1} 中的 {p2}","adapter.codex.actions.mcpServersIsNotAStringArrayRefusingTo":"mcp_servers.{p0} 的 {p1} 不是字符串数组,未知格式拒绝写入({p2})","adapter.codex.actions.editedResultIsNotValidTOMLWriteAbandoned":"编辑结果不是合法 TOML,已放弃写入({p0}):{p1}","adapter.codex.actions.editedResultDiffersFromTheExpectedMinimalChangeRefusing":"编辑结果与期望的最小变更不一致,拒绝写入({p0})","adapter.codex.actions.enabledForIsNotABooleanRefusingToWrite":"{p0} 的 enabled 不是布尔值,未知字段形态拒绝写入({p1})","adapter.codex.actions.isAlreadyInTheRequestedStateEnabledNoWrite":"{p0} 已处于目标状态(enabled={p1}),无需写入;请重新扫描后再操作","adapter.codex.actions.tableHeaderInlineTableOrNonstandardSyntax":"[{p0}] 表头(内联表或非常规写法)","adapter.codex.actions.cannotSafelyLocateRefusingToWriteEditItManually":"无法安全定位 {p0},拒绝写入({p1});请手动编辑","adapter.codex.actions.internalErrorExpectedStructureIsMissingTable":"内部错误:期望结构里缺表 {p0}","adapter.codex.protocol.thisAGENTSMdProtocolBlockIsSharedByCodex":"此 AGENTS.md 协议块由 Codex 与 dsh 共用","adapter.codex.protocol.blockRemovedAndUserChangesPreserved":"{p0};已移除块并保留用户改动","adapter.codex.protocol.theManagedBlockWasModifiedRefusingToAndPreserving":"{p0}: 受管块已被修改,拒绝{p1}并保留用户内容","adapter.dsh.hooks.refusingToWriteCannotParseYAMLInUnknownFormats":"拒写:{p0} YAML 解析失败({p1}),未知格式不猜","adapter.dsh.hooks.refusingToWriteRootIsNotAYAMLArray":"拒写:{p0} 顶层不是 YAML 数组(dsh patch 层格式),未知格式不猜","adapter.dsh.hooks.refusingToWriteEntryInIsNotAMapping":"拒写:{p0} 第 {p1} 条不是映射(loader patch 条目),不猜","adapter.dsh.hooks.hasAWingmanStartMarkerWithoutAnEndMarker":"{p0} 有 wingman 起始标记但无结束标记(疑被手工改动),拒绝自动处理:请手工删除标记块或从备份恢复","adapter.dsh.hooks.unknownWiringStateVersionRefusingToInferItsFormat":"未知的接线状态版本,不猜","adapter.dsh.hooks.wiringStateStructureIsCorruptRefusingAutomaticChanges":"接线状态结构损坏,拒绝自动处理","adapter.dsh.hooks.dshProfileDoesNotExistOrIsMissingPackage":"dsh profile 不存在或缺 package.json:{p0}","adapter.dsh.hooks.refusingToWriteAlreadyHasAnUnmarkedEntryPossibly":"拒写:{p0} 已有未带 wingman 标记的 {p1} 条目(疑手工抄入),请先手工移除","adapter.dsh.hooks.refusingToWriteShapeValidationFailedAfterAppendingTo":"拒写:{p0} 追加后形状校验失败(原文件形态无法安全追加),不猜","adapter.dsh.hooks.refusingAutomaticChangesToDSHHOMECordisPatchYml":"拒绝自动处理 $DSH_HOME/cordis.patch.yml:文件或接线状态无法安全读取、解析或写入,请手动解线后重新接线","adapter.dsh.toggle.wingmanToggleBlockInHasAMismatchedEndMarker":"{p0} 的 wingman toggle 块({p1})结束标记对不上(疑被手工改动),拒绝自动处理:请手工删除标记块或从备份恢复","adapter.dsh.toggle.wingmanToggleBlockFlagIsCorruptInRefusingAutomatic":"{p0} 的 wingman toggle 块旗标损坏({p1}),拒绝自动处理","adapter.dsh.toggle.hasAnUnknownWingmanFlagRefusingAutomaticChangesOr":"{p0} 有未知的 wingman 旗标({p1}),拒绝自动处理,不猜","adapter.dsh.toggle.wingmanToggleBlockIdIsInvalidInRefusingAutomatic":"{p0} 的 wingman toggle 块 id 非法({p1}),拒绝自动处理","adapter.dsh.toggle.containsDuplicateWingmanToggleBlocksPossiblyCopiedManuallyRefusing":"{p0} 存在重复的 wingman toggle 块({p1}),疑被手工复制,拒绝自动处理","adapter.dsh.toggle.hasAnUnrecognizedWingmanMarkerLineRefusingAutomaticChanges":"{p0} 有无法识别的 wingman 标记行({p1}…),拒绝自动处理,不猜","adapter.dsh.toggle.wingmanToggleBlockInHasNoEndMarkerPossibly":"{p0} 的 wingman toggle 块({p1})有始无终(疑被手工改动),拒绝自动处理:请手工删除标记块或从备份恢复","adapter.dsh.toggle.wingmanLiveHooksBlockInHasNoEndMarker":"{p0} 的 wingman live hooks 块有始无终(疑被手工改动),拒绝自动处理","adapter.dsh.toggle.wingmanToggleBlockInWasModifiedRefusingAutomaticChanges":"{p0} 的 wingman toggle 块({p1})内容被改动,拒绝自动处理:请手工删除标记块或从备份恢复","adapter.dsh.toggle.unsupportedActionKindDshVOnlySupportsToggle":"不支持的动作种类:{p0}(dsh v1 仅支持 toggle)","adapter.dsh.toggle.actionIsMissingItemIdTheTargetItemSSlotItem":"动作缺少 itemId(目标条目的 SlotItem.id)","adapter.dsh.toggle.actionIsMissingEnableTrueOnFalseOff":"动作缺少 enable(true=打开,false=关闭)","adapter.dsh.toggle.itemWasNotFoundConfigurationMayHaveChangedScan":"找不到条目 {p0}:配置可能已变化,请重新扫描后再试","adapter.dsh.toggle.isALayerItselfRulesSlotAndCannotBe":"「{p0}」是分层本身(rules 槽),不可开关","adapter.dsh.toggle.comesFromThePatchOverrideLayerAppliedAfterThe":"「{p0}」来自 --patch 覆盖层,应用顺序在家目录层之后,Wingman 的家目录 patch 压不过它,拒绝开关","adapter.dsh.toggle.itemIsNotAPluginRowAndCannotBe":"条目 {p0} 不是插件行,无法开关","adapter.dsh.toggle.pluginInstanceIdContainsCharactersUnsafeForMarkersRefusing":"插件 instance id 含标记不安全字符({p0}),拒绝开关,不猜","adapter.dsh.toggle.wasAddedByWingmanLiveWiringLiveHooksBlock":"「{p0}」({p1})由 Wingman 实况接线(live hooks 块)引入,请用 `wingman hook uninstall dsh` 管理,不走开关","adapter.dsh.toggle.isAlreadyDisabledByWingmanEffectiveNextTimeDsh":"「{p0}」({p1})已由 Wingman 关闭(dsh 下次启动生效);如需恢复请 toggle on","adapter.dsh.toggle.alreadyHasAUserOwnedEntryNoMergeWill":"{p0} 已有用户自己的 {p1} 条目,不猜合并:请手工处理该条目后再试","adapter.dsh.toggle.isAlreadyDisabledInLayerNativeSettingOutsideWingman":"「{p0}」({p1})已在 {p2} 层被禁用(原生禁用非 Wingman 所辖),无需再关","adapter.dsh.toggle.isNativelyDisabledInLayerOutsideWingmanSControl":"「{p0}」({p1})在 {p2} 层被原生禁用,非 Wingman 所辖:请到该层(bundle/profile 配置)修改","adapter.dsh.toggle.isAlreadyEnabledNoToggleOnNeeded":"「{p0}」({p1})已是启用状态,无需 toggle on","adapter.dsh.toggle.planDidNotComeFromTheDshAdapterHarness":"plan 不是 dsh adapter 产出(harness 不符),拒绝执行","adapter.dsh.toggle.planWritesHasTheWrongShapeDshToggleWrites":"plan.writes 形状不符(dsh toggle 只写一处),拒绝执行","adapter.dsh.toggle.planWriteTargetIsNotRefusingToApply":"plan 写入目标 {p0} 不是 {p1},拒绝执行","adapter.dsh.toggle.planWritesFieldsHaveTheWrongShapeBeforeAfter":"plan.writes[0] 字段形状不符(before/after 与 kind 不匹配),拒绝执行","adapter.dsh.toggle.planBackupDirIsMissingRefusingToApply":"plan.backupDir 缺失,拒绝执行","adapter.dsh.toggle.planBackupDirIsNotUnderRefusingToApply":"plan.backupDir 不在 {p0} 之下,拒绝执行","adapter.dsh.toggle.wasCreatedAfterPlanningAndNoLongerMatchesThe":"{p0} 在 plan 之后被创建,与 plan 前提不符:请重新 plan","adapter.dsh.toggle.wasDeletedAfterPlanningAndNoLongerMatchesThe":"{p0} 在 plan 之后被删除,与 plan 前提不符:请重新 plan","adapter.dsh.toggle.wasModifiedAfterPlanningAndDiffersFromThePlan":"{p0} 在 plan 之后被改动,与 plan 快照不一致:请重新 plan","adapter.dsh.protocol.theDshInstructionLoaderPluginIsDisabledSeeThe":"dsh 指令加载插件已禁用,见控制页开关","adapter.dsh.protocol.uninstallingAffectsBothCodexAndDsh":"{p0};卸载同时影响 Codex 与 dsh","adapter.dsh.protocol.uninstallingAffectsBothCodexAndDshUserChangesPreserved":"{p0};卸载同时影响 Codex 与 dsh;已保留用户改动","adapter.dsh.protocol.dshHasNoUserLevelInstructionFileInstallPer":"dsh 没有用户级指令文件,请按项目安装","adapter.dsh.dump-config.cannotParseDumpConfigYAML":"dump-config YAML 解析失败:{p0}","adapter.dsh.dump-config.dumpConfigRootIsNotAPluginRowSequence":"dump-config 顶层不是插件行序列(YAML seq),与钉定版本格式不符,拒绝解析","adapter.dsh.dump-config.pluginRowInDumpConfigIsNotAYAML":"dump-config 第 {p0} 个插件行不是 YAML map,拒绝解析","adapter.dsh.dump-config.pluginRowInDumpConfigIsMissingItsBundle":"dump-config 第 {p0} 个插件行上方缺少「# == <bundle>」出处注释,拒绝解析","adapter.dsh.dump-config.pluginRowInDumpConfigIsMissingAString":"dump-config 第 {p0} 个插件行缺少字符串 id/name,拒绝解析","adapter.dsh.dump-config.duplicateSlotItemIdSameLayerNameAndInstanceId":"SlotItem.id 重复:{p0}(同层同名同实例 id,无法区分),scan 失败"},Jr={"cli.licenseStatusLine":`{state}:{detail}
52
+ Approximate tokens = sum of step byte estimates in this node`,"panel.render.steps":"steps","panel.render.stepsIncludeASubagentAttributionIs":"Steps include a subagent ({p0}); attribution is inferred from time windows and Agent spans; uncertain steps appear under Other","panel.render.stepsAttributedToTheMainAgent":"Steps attributed to the main agent (inferred from time windows)","panel.render.stepsThatCannotBeAssignedTo":"Steps that cannot be assigned to a todo appear under Other (missing timestamps, no in-progress todo, or ambiguous parallel tasks); uncertainty is preserved","panel.render.otherUnassignedSteps":"Other (unassigned steps)","panel.render.sourceMarkdownChecklistInAssistantText":"Source: markdown checklist in assistant text (- [ ] / - [x]); fallback when no tool-based checklist exists, replaced as soon as one appears","panel.render.textChecklistWrittenByAgent":"Text checklist (written by agent)","panel.render.thisHarnessDoesNotProduceA":"This harness does not produce a task checklist; execution trace follows","panel.render.thisSessionDidNotUseA":"This session did not use a task checklist; execution trace follows","panel.render.noNarrativeDataYetConnect":"○ No narrative data yet — connect (","panel.render.thenRestartTheHarnessAndRun":", then restart the harness) and run a conversation to see execution traces grouped by task","panel.render.rawHookEventStreamTheLive":"Raw hook event stream (the 0.2 live view); collapsed by default","panel.render.rawEvents":"Raw events","panel.render.eventsReceivedForThisSessionBut":"○ Events received for this session, but no Codex usage parsed yet. This does not mean zero usage; no estimate is shown here","panel.render.noCodexSessionUsageDataReceived":"○ No Codex session/usage data received yet — in Codex, enter","panel.render.andConfirmWingmanIsTrustedAnd":"and confirm Wingman is Trusted and Enabled","panel.render.noReadableUsageDataReceivedFor":"○ No readable usage data received for this session yet; turns are listed only when exact sources are available, without estimates","panel.render.usagePerTurnExactCodexToken":"Usage per turn · exact Codex token_count values; local events do not include subscription dollar charges","panel.render.usagePerTurnThreeExactUsage":"Usage per turn · three exact usage fields reported by the harness","panel.render.reasoningIncludedInOut":" · Reasoning {p0} (included in out)","panel.render.originalUsageExactReportedByHarness":"Original usage (exact, reported by harness): ","panel.render.cumulativeInputThisTurnDifferenceBetween":"Cumulative input this turn (difference between adjacent turn totals) {p0} · uncached {p1} · cache_write field {p2} · cached reads {p3} · output {p4}{p5}","panel.render.inputCachedWritesCachedReadsOutput":"Input {p0} · cached writes {p1} · cached reads {p2} · output {p3}{p4}","panel.render.contextThisTurnSumOfThe":"Context this turn = sum of the three input fields = {p0}","panel.render.totalTokensThisTurnReported":"Total tokens this turn (reported) = {p0}","panel.render.turnStateInterruptedUsageReportedBefore":"Turn state = interrupted (usage reported before interruption is preserved)","panel.render.turnStateOpenShowingUsageReported":"Turn state = open (showing usage reported so far)","panel.render.actualChatGPTCodexSubscriptionChargesAre":"$: actual ChatGPT/Codex subscription charges are not in local events; no conversion","panel.render.thisModelIsAbsentFromThe":"$: this model is absent from the built-in price table; no conversion","panel.render.estimatedFromTheBuiltInPriceTable":"$ estimated from the built-in price table (cached reads ×0.1, cached writes ×1.25/×2), marked ≈","panel.render.interrupted":"Interrupted","panel.render.open":"Open","panel.render.cumulativeInUncachedCacheWriteCached":"Cumulative in {p0} · uncached {p1} · cache_write {p2} · cached reads {p3} · out {p4}","panel.render.inCachedWritesCachedReadsOut":"In {p0} · cached writes {p1} · cached reads {p2} · out {p3}","panel.render.turnTotal":"Turn total —","panel.render.turnTotalValue":"Turn total {p0}","panel.render.cumulativeInputThisTurn":"Cumulative input this turn {p0}","panel.render.reportProblem":"Report a problem","panel.render.clickingSendsAllowlistedReproductionHintsTo":"Clicking sends allowlisted reproduction hints to Tally, whose service may also process connection information. The problem description and screenshots are sent only when you submit. Do not include prompts, source code, paths, account information, or credentials.","panel.render.pending":"Pending","panel.render.markedCompleteByAgentUser":"Marked complete by agent/user","panel.render.cancelled":"Cancelled","panel.render.checkpoint":"Checkpoint","panel.render.protocolNotInstalled":"Protocol not installed","panel.render.protocolInstalled":"Protocol installed","panel.render.installedButNotLoaded":"Installed but not loaded","panel.render.planAlreadyExists":"Plan already exists","panel.render.thisSessionHasWrittenAPlan":"This session has written a plan","panel.render.dshHasNoUserLevelInstruction":"dsh has no user-level instruction file","panel.render.sourceGETApiAnatomyPlanProtocolUser":"Source: GET /api/anatomy {p0}.planProtocol.user;{p1}","panel.render.takesEffectInTheNextNew":";takes effect in the next new session","panel.render.planProtocolInstalledForYourAccount":"Plan protocol · Installed for your account","panel.render.protocolVUpdateAvailable":"Protocol v1, update available","panel.render.notInstalled":"Not installed","panel.render.modified":"Modified","panel.render.unsupported":"Unsupported","panel.render.dshHasNoUserLevelInstructionFile":"dsh has no user-level instruction file; install the project-level protocol per project","panel.render.replaceLtProjectGtWithThe":"; replace &lt;project&gt; with the project path before running","panel.render.copyProjectInstallCommand":"Copy project install command","panel.render.backsUpBeforeUpdatingPreservesContent":"The plan only gives Wingman something to display. It never rewrites harness behavior or any code. Backs up before updating; takes effect in the next new session.","panel.render.theProtocolBlockHasBeenModified":"The protocol block has been modified. Existing content is preserved; resolve the changes before reinstalling.","panel.render.afterConfirmationInstallsInTheUser":"The plan only gives Wingman something to display. It never rewrites harness behavior or any code.","panel.render.reinstall":"Reinstall","panel.render.installAction":"Install","panel.render.planProtocol":"Plan protocol: {p0}","panel.render.protocolUpdateSuffix":"· Protocol v1, update available","panel.render.scopeUserLevelProtocolCommandVersion":"{p0};scope: user-level protocol;command version: GET /api/version","panel.render.installOnceToRequestPlansIn":"The plan is only for Wingman to display. It never rewrites harness behavior or code.","panel.render.projectCommandVersionGETApiVersion":"{p0} · {p1};project: {p2};command version: GET /api/version","panel.render.toBeFilledIn":"To be filled in","panel.render.wingmanVersionUnknownTheInstallCommand":"Wingman version unknown; the install command is not version-pinned","panel.render.theDshInstructionLoadingPluginIs":"The dsh instruction-loading plugin is disabled; see the toggle on the controls page","panel.render.sessionPlan":"Session plan ·","panel.render.noStructuredPlanProvided":"No structured plan provided","panel.render.unavailablePrefix":"Unavailable: ","panel.render.sourceSessionPlanForInstruction":"Source: sessionPlan.forInstruction","panel.render.sessionPlanRevisionAgentMarkedComplete":"Session plan revision {p0} · Agent marked {p1}/{p2} complete","panel.render.sessionPlanUnavailable":"Session plan unavailable: {p0}","panel.render.dataTipSourceSessionPlanForInstruction":' data-tip="Source: sessionPlan.forInstruction"',"panel.render.timestampSourceHookEvent":"Timestamp: {p0} · Source: hook event","panel.render.recentActivityPrefix":"Recent activity: ","panel.render.needsYou":"Needs you: ","panel.render.checksFailuresRuns":"Checks: {p0} failures / {p1} runs","panel.render.accepted":"Accepted {p0}","panel.render.acceptanceUnavailableReason":"Acceptance unavailable: {p0}","panel.render.notLinkedToAStep":"Not linked to a step","panel.render.linkedTo":"Linked to: {p0}","panel.render.pin":"Pin","panel.render.commandCopied":"Command copied","panel.render.couldNotCopyCommand":"Could not copy command","panel.render.thisHarnessHasNoCommandTo":"This harness has no command to resume a specific session","panel.render.noReturnAppSelected":"No return app selected","panel.render.switchedTo":"Switched to {p0}","panel.render.couldNotSwitch":"Could not switch: {p0}","panel.render.dshHasNoCommandToResume":" · dsh has no command to resume a specific session; return to the original terminal to continue","panel.render.sourceClipboardWriteResultResponseOr":"Source: clipboard write result{p0};{p1} response or request failure;harness resume command support","panel.render.thisHarnessHasNoResumeCommand":"(this harness has no resume command; nothing was copied)","panel.render.taskCardMenu":"Task card menu","panel.render.copy":"Copy","panel.render.rename":"Rename","panel.render.clearToRestoreTheAutomaticTitle":"Clear to restore the automatic title","panel.render.unpin":"Unpin","panel.render.unhide":"Unhide","panel.render.hide":"Hide","panel.render.hidden":"Hidden","panel.render.cards":" cards ·","panel.render.show":"Show","panel.render.planAcceptance":"Plan acceptance: ","panel.render.cardsHiddenByFilters":" cards hidden by filters","panel.render.sourceWingmanPlanMdNodesSubtree":"Source: .wingman/plan.md nodes; subtree leaf count","panel.render.expandChildSteps":"Expand child steps (","panel.render.noSessionObserved":"No session observed","panel.render.noTaskCardsMatchTheFilters":"No task cards match the filters (","panel.render.filteredOut":" filtered out)","panel.render.fileTimestamp":"File timestamp {p0}","panel.render.lastWriter":"Last writer: {p0} {p1} · {p2}","panel.render.lastWriterExternalEditNotObserved":"Last writer: external edit / not observed","panel.render.parentChildConflicts":"{p0} parent-child conflicts","panel.render.inProgressStepsWithoutAnActive":"{p0} in-progress steps without an active session","panel.render.otherFacts":"{p0} other facts","panel.render.pathSource":"{p0} · Source: {p1}","panel.render.waitingForYourDecision":"Waiting for your decision","panel.render.requests":" requests","panel.render.openSession":"Open session","panel.render.thePlanNeedsYourReview":"The plan needs your review","panel.render.goToNode":"Go to node","panel.render.projectInProgress":"In progress","panel.render.noPlanFile":"No plan file","panel.render.planUnreadable":"Plan unreadable","panel.render.cannotDetermineWhetherYouAreNeeded":"Cannot determine whether you are needed","panel.render.copyInstallCommandTip":"{p0} · Copy install command","panel.render.howToProvideAPlan":"How to provide a plan","panel.render.createAtTheProjectRoot":"Create at the project root: ","panel.render.withTheProjectTitleGoalAnd":", with the project title, goal and steps. A handwritten file is sufficient.","panel.render.projectName":"# Project name","panel.render.goalProjectGoal":"Goal: Project goal","panel.render.currentTask":"- [/] Current task","panel.render.pendingTask":"- [ ] Pending task","panel.render.connectFeedbackSignals":"Connect feedback signals ·","panel.render.notEnoughInformation":"Not enough information: ","panel.render.cannotReadPlanFile":"Cannot read plan file","panel.render.cannotSeeRequests":"Requests not observable","panel.render.projectEnded":"Ended","panel.render.sourceGETApiProjectsRequestOr":"Source: GET /api/projects request or payload validation failed","panel.render.projectRefreshFailedShowingThePrevious":"Project refresh failed. Showing the previous response; action status may have changed","panel.render.noProjectGoalProvided":"No project goal provided","panel.render.noSessionActivityTimestampObserved":"No session activity timestamp observed","panel.render.noActiveSessionThisProjectS":"No active session (this project's sessions are no longer in the panel)","panel.render.noActiveSessionWingmanHasReceived":"No active session (Wingman has received no events for this project since startup)","panel.render.timestamp":"Timestamp: ","panel.render.sourceSeparator":"· Source: ","panel.render.titleSource":"· Title source: ","panel.render.sourcePlanAvailabilityReasonLine":"Source: plan.availability / reason / line","panel.render.planUnavailable":"Plan unavailable: ","panel.render.line":" · Line {p0}","panel.render.sourceSessionsFeedbackState":"Source: sessions[].feedback.state","panel.render.feedbackSignalsAreNotConnectedOr":"Feedback signals are not connected or unavailable; cannot determine whether you are needed","panel.render.viewPlanProtocol":"· View plan protocol","panel.render.currentBranch":"Current branch","panel.render.moreBranches":"{count} more branches","panel.render.oneMoreBranch":"{count} more branch","panel.render.branchCurrentPoints":"{count} current points","panel.render.branchCurrentPoint":"{count} current point","panel.render.branchCurrentPointsSource":"Source: currentPoints within this top-level node subtree","panel.render.noCurrentBranchProvided":"No current branch provided","panel.render.currentTaskLabel":"Current task","panel.render.morePoints":"{count} more items","panel.render.oneMorePoint":"{count} more item","panel.render.sourceFirstScreenCurrentPointsLength":"Source: firstScreen.currentPoints.length","panel.render.parallel":"Parallel","panel.render.thePlanHasNoStepMarked":"The plan has no step marked in progress","panel.render.recentActivityLabel":"Recent activity","panel.render.thePlanHasNoSteps":"The plan has no steps","panel.render.planTree":"Plan tree","panel.render.fullRecord":"Full record","panel.render.completedMilestones":"{count} completed · Latest: {name}","panel.render.completedMilestonesSource":"Source: completed or cancelled top-level plan.nodes; latest in document order","panel.render.sessionsNotLinkedToAStep":"Sessions not linked to a step","panel.render.sourcePlanLastGood":"Source: plan.lastGood","panel.render.lastReadableVersion":"Last readable version","panel.render.projectSessions":"Project sessions","panel.render.sourceWingmanPlanMdLeafCounts":"Source: .wingman/plan.md leaf counts; counts.pending / inProgress / completed / cancelled / checkpoint","panel.render.agentUserMarksPending":"Agent/user marks · Pending","panel.render.inProgressCount":"· In progress","panel.render.complete":"· Complete","panel.render.cancelledCount":"· Cancelled","panel.render.checkpointCount":"· Checkpoint","panel.render.sourceCompletionLabel":"Source: completionLabel","panel.render.ignoredLine":"Line {p0}: {p1}","panel.render.ignored":"· Ignored","panel.render.sourcePlanHigherPlanPaths":"Source: plan.higherPlanPaths","panel.render.planFilesAlsoExistAbove":"Plan files also exist above: ","panel.render.sourceSessionsUnattachedReason":"Source: sessions[].unattachedReason","panel.render.notLinked":"· Not linked: ","panel.render.sourcePlanLastGoodRevisionMtime":"Source: plan.lastGood.revision / mtime","panel.render.lastReadableVersionRevision":"Last readable version · revision","panel.render.connectionsAndProtocolPlanSourceAnd":"Connections and protocol · Plan source and status","panel.render.sourceProjectRoot":"Source: project.root","panel.render.sourceRevisionMtimeLastWriter":"Source: revision / mtime / lastWriter","panel.render.all":"All","panel.render.waitingForYouLabel":"Waiting for you","panel.render.turnEnded":"Turn ended","panel.render.turnEndedSource":"{harness} Stop or main transcript turn-end signal time","panel.render.clickToAcknowledge":"Click to acknowledge","panel.render.additionalAttention":"Also: {events}","panel.render.ended":"Ended","panel.render.status":"Status","panel.render.dataTipSourceGETApiProjects":' data-tip="Source: GET /api/projects request and payload validation"',"panel.render.projectRefreshFailedProjectDataIs":"Project refresh failed; project data is unavailable","panel.render.projectDataIsUnavailable":"Project data is unavailable","panel.render.dismissProjectMemoryNotice":"Dismiss project memory notice","panel.render.projectRefreshFailedShowingThePreviousResponse":"Project refresh failed; showing the previous response","panel.render.noSessionWithAWorkingDirectory":"No session with a working directory observed","panel.render.mockDemoData":"MOCK demo data","panel.render.projectPlansAcrossHarnessesLocalAnd":"Project plans across harnesses · Local and read-only","panel.render.scannedAt":"{p0}{p1} · Scanned at {p2}","panel.render.collapseArrow":"Collapse ▴"},Qr={"cli.server.requestFailed":"[wingman] Request failed: {error}","cli.server.refreshFromPanel":"Refresh the license using the button in the Wingman panel","cli.server.harnessQuery":"harness must be {ids} (?harness=<id>), received {harness}","cli.server.anatomyHome":"anatomy requires an explicit homeDir","cli.server.detectFailed":"[wingman] {harness} detection failed, skipped: {error}","cli.server.scanFailed":"[wingman] {harness} scan failed, showing limited information: {error}","cli.server.configFailed":"Failed to read configuration: {error}","cli.server.jsonBody":"The request body must be valid JSON","cli.server.harnessRequired":"harness must be {ids}, received {harness}","cli.server.actionShape":'action must have the shape {kind:"toggle", itemId, enable}',"cli.server.fixturesAction":"Fixtures mode is read-only: actions stop at the plan and no files are written","cli.server.subscriptionRequired":"A trial or active subscription is required to write configuration changes (the free tier shows one tool).","cli.server.mobileRequiresLicense":"A trial or active subscription is required to pair a phone (the free tier shows one tool).","cli.server.fixturesMobile":"Fixtures mode is read-only: phones cannot be paired or unpaired","cli.server.planShape":"plan must be an ActionPlan object (returned by /api/action/plan)","cli.server.fixturesProtocol":"Fixtures mode is read-only: no preview or writing of the user-level protocol","cli.server.dshUserUnsupported":"unsupported: dsh has no user-level instruction file; install the plan protocol per project","cli.server.protocolHarness":"The user-level plan protocol requires harness cc|codex","cli.server.protocolHome":"The user-level plan protocol requires an explicit homeDir","cli.server.backupPreview":"~/.wingman/backups/<ISO timestamp> (append -N for duplicates)","cli.server.fixturesReturn":"Fixtures mode is read-only: return settings are not saved and apps are not activated","cli.server.returnHome":"Return settings require homeDir","cli.server.bundleShape":"The request only accepts a bundlePath string","cli.server.returnMissing":"The selected return app was not detected","cli.server.openTimeout":"App activation timed out","cli.server.openFailed":"App activation failed","cli.server.fixturesOverlay":"Fixtures mode is read-only: task card overlays are not written","cli.server.overlayShape":"Session requests require a valid harness, a nonempty sessionId and a title/pinned/hidden/accepted/archived patch; project requests require a nonempty root and a pinned/order/hidden/archived patch, with a nonnegative integer order","cli.server.overlayHome":"Task card overlays require homeDir","cli.server.licenseRead":"The license file exceeds the 64KB limit or could not be read","cli.server.panelBuild":"The panel has not been built: run pnpm --filter @wingman/panel build, then refresh this page.","cli.server.settingsRead":"Cannot read return settings; check settings.json","cli.server.settingsFormat":"Cannot parse return settings or unknown version; refusing to overwrite. Check settings.json","cli.server.settingsWrite":"Could not back up or write return settings; settings were not overwritten. Check settings.json","cli.server.localeInvalid":"locale must be a registered language tag","cli.server.settingsInvalid":"Settings require a registered locale, a valid island position and size, or a known freeHarness","cli.server.freeHarnessNotDetected":"This tool has not been detected and cannot be selected for the free tier.","cli.server.freeHarnessCooldown":"The free tool cannot be changed for 7 days after selection. You can change it on {switchableAt}.","cli.server.fixturesSettings":"Fixtures mode is read-only: language settings are not saved","cli.server.settingsHome":"Language settings require homeDir"},Xr={"narrative.waitedPermission":"Waiting for {duration}: Waiting for permission","narrative.waitedPermissionDetail":"Waiting for {duration}: Waiting for permission: {reason}","narrative.waitedResponse":"Waiting for {duration}: Waiting for a response","narrative.waitedResponseDetail":"Waiting for {duration}: Waiting for a response: {reason}","narrative.suggestionUnused":"{server} has not been used in this session, it can be disabled","narrative.suggestionUnusedExact":"{server} has not been used in this session, disabling it can save {tokens} tok (resident estimate)","narrative.suggestionUnusedEstimated":"{server} has not been used in this session, disabling it can save about {tokens} tok (resident estimate)"},Zr={tag:"en",nativeName:"English",messages:{...zr,...Yr,...Gr,...Jr,...qr,...Vr,...Kr,...Qr,...Xr}},es={"adapter.cc.features.invalidValue":"{p0}:{p1} 格式未知,拒绝写入","adapter.cc.features.overridden":"被 {p0} 层覆盖,此处改动不生效","adapter.cc.features.invalidAction":"拒绝:功能操作的键或取值无效","adapter.cc.features.noChange":"无需切换:{p0} 已处于目标状态","adapter.cc.features.planChanged":"拒绝执行:功能配置或操作计划已改变,请重新 plan","adapter.unknownError":"未知错误","adapter.invalidPort":"非法端口:{port}","adapter.cc.hooks.refusingToWriteIsNotValidJSONUnknownFormats":"拒写:{p0} 不是合法 JSON({p1}),不猜格式","adapter.cc.hooks.refusingToWriteRootIsNotAJSONObject":"拒写:{p0} 顶层不是 JSON 对象,不猜格式","adapter.cc.hooks.refusingToWriteHooksFieldIsNotAnObject":"拒写:{p0} 的 hooks 字段不是对象,不猜格式","adapter.cc.hooks.refusingToWriteHooksIsNotAnArrayUnknown":"拒写:{p0} 的 hooks.{p1} 不是数组,不猜格式","adapter.cc.actions.refusingToWriteIsNotUTFTextUnknownFormats":"拒写:{p0} 不是 UTF-8 文本,未知格式不猜","adapter.cc.actions.refusingToWriteSkillOverridesIsNotAnObjectUnknown":"拒写:{p0} 的 skillOverrides 不是对象,不猜格式","adapter.cc.actions.refusedSkillOverridesHasAnUnknownValueItsMeaningIs":"拒绝:{p0} 的 skillOverrides.{p1} 取值 {p2} 未知,不猜语义","adapter.cc.actions.noChangeNeededSkillIsAlreadyDisabled":"无需切换:skill {p0} 已是关闭状态","adapter.cc.actions.noChangeNeededSkillIsAlreadyEnabled":"无需切换:skill {p0} 已是启用状态","adapter.cc.actions.refusedWasNotFoundMCPConnectionSwitchesAreStored":"拒绝:找不到 {p0}(MCP 连接开关按项目存放于该文件)","adapter.cc.actions.refusedHasNoRecordForThisProjectInProjects":"拒绝:{p0} 的 projects 里没有本项目({p1})的记录;","adapter.cc.actions.mcpConnectionSwitchesAreStoredPerProjectRunClaude":"MCP 连接开关按项目存放,请先在该项目里运行过 Claude Code","adapter.cc.actions.refusingToWriteDisabledMcpServersIsNotAnArrayUnknown":"拒写:{p0} 的 disabledMcpServers 不是数组,不猜格式","adapter.cc.actions.refusingToWriteDisabledMcpServersContainsANonStringMember":"拒写:{p0} 的 disabledMcpServers 含非字符串成员,不猜格式","adapter.cc.actions.noChangeNeededMCPServerIsAlreadyDisabled":"无需切换:MCP server {p0} 已是关闭状态","adapter.cc.actions.noChangeNeededMCPServerIsAlreadyEnabled":"无需切换:MCP server {p0} 已是启用状态","adapter.cc.actions.unsupportedActionKindVOnlySupportsToggleThroughPlan":"不支持的动作种类:{p0}(v1 仅 toggle 走 plan→apply)","adapter.cc.actions.refusedToggleActionRequiresItemIdStringAndEnableBoolean":"拒绝:toggle 动作缺少 itemId(string)或 enable(boolean)","adapter.cc.actions.itemNotFoundTheItemMayHaveChangedScan":"找不到条目:{p0}(条目可能已变动,请重新扫描)","adapter.cc.actions.itemCannotBeToggledVOnlySupportsSkillOverridesAnd":"条目不可开关:{p0}(v1 开关范围仅 skills 的 skillOverrides 与 MCP 连接开关)","adapter.cc.actions.itemCannotBeToggledCannotParseTheServerName":"条目不可开关:{p0}(无法从 nativeName 解析 server 名)","adapter.cc.actions.itemCannotBeToggled":"条目不可开关:{p0}","adapter.cc.actions.refusingToApplyPlanIsNotAnObject":"拒绝执行:plan 不是对象","adapter.cc.actions.refusingToApplyPlanHarnessIsNotCcReceived":'拒绝执行:plan.harness 不是 "cc"(得到 {p0}),只接受本 adapter 产出的 plan',"adapter.cc.actions.refusingToApplyPlanActionIsNotToggleOnly":"拒绝执行:plan.action 不是 toggle,只接受本 adapter 产出的 plan","adapter.cc.actions.refusingToApplyPlanBackupDirIsMissing":"拒绝执行:plan.backupDir 缺失","adapter.cc.actions.refusingToApplyPlanWritesIsMissingOrEmpty":"拒绝执行:plan.writes 缺失或为空","adapter.cc.actions.refusingToApplyPlanWritesContainsAnEntryWithout":"拒绝执行:plan.writes 含缺少 file 的条目","adapter.cc.actions.refusingToApplyCreateChangeForIsMissingAfter":"拒绝执行:{p0} 的 create 变更缺少 after","adapter.cc.actions.refusingToApplyModifyChangeForIsMissingBefore":"拒绝执行:{p0} 的 modify 变更缺少 before/after","adapter.cc.actions.refusingToApplyDeleteChangeForIsMissingBefore":"拒绝执行:{p0} 的 delete 变更缺少 before","adapter.cc.actions.refusingToApplyPlanWritesContainsAnUnknownKind":"拒绝执行:plan.writes 含未知 kind:{p0}","adapter.cc.actions.refusingToApplyWasCreatedAfterPlanningPlanAgain":"拒绝执行:{p0} 在 plan 后被创建,请重新 plan","adapter.cc.actions.refusingToApplyNoLongerExistsChangedAfterPlanning":"拒绝执行:{p0} 已不存在(plan 后被改动),请重新 plan","adapter.cc.actions.refusingToApplyWasModifiedAfterPlanningPlanAgain":"拒绝执行:{p0} 在 plan 后被改过,请重新 plan","adapter.cc.actions.allWrittenFilesHaveBeenRolledBack":"已回滚全部已写文件","adapter.cc.actions.filesThatCouldNotBeRolledBackOriginalsAre":"回滚失败的文件:{p0},原件备份在 {p1}","adapter.cc.actions.writeFailed":"写入失败:{p0};{p1}","adapter.cc.actions.readBackVerificationFailedDiffersFromTheExpectedContent":"写入后重读校验失败:{p0} 的内容与预期不符(可能被 Claude Code 并发重写)。","adapter.cc.actions.originalsAreBackedUpAtRestoreFromThisBackup":"原件备份在 {p0},可从该备份恢复","adapter.cc.protocol.install":"安装","adapter.cc.protocol.uninstall":"卸载","adapter.cc.protocol.theManagedProtocolFileHasBeenModified":"受管协议文件已被修改","adapter.cc.protocol.theManagedProtocolFileHasBeenModifiedRefusingTo":"受管协议文件已被修改({p0}),拒绝{p1}并保留用户内容","adapter.codex.hooks.invalidPort":"非法端口:{p0}","adapter.codex.hooks.theManagedWingmanCodexHookBlockWasModifiedOr":"Wingman Codex hook 受管块已被修改或残缺({p0}),拒绝谎报接线成功;","adapter.codex.hooks.restoreTheCompleteBlockFromWingmanRootBackupsOr":"请先从 <wingman根>/backups/ 恢复完整块,或人工核对后移除该受管块再重新安装并信任","adapter.codex.hooks.theManagedWingmanCodexHookBlockWasModifiedOr52":"Wingman Codex hook 受管块已被修改或残缺({p0}),拒绝自动删除;","adapter.codex.hooks.restoreTheCompleteBlockFromWingmanRootBackupsOr53":"请先从 <wingman根>/backups/ 恢复完整块,或人工核对后移除该受管块","adapter.codex.hooks.incompleteWingmanMarkerBlockRestoreFromWingmanRootBackups":"wingman 标记块残缺({p0}):请从 <wingman根>/backups/ 恢复或手动删除标记后重试","adapter.codex.hooks.duplicateWingmanMarkerBlocksRestoreFromWingmanRootBackups":"wingman 标记块重复({p0}):请从 <wingman根>/backups/ 恢复或手动删除多余标记后重试","adapter.codex.hooks.cannotParseCodexConfigTomlRefusingToWrite":"Codex config.toml 解析失败,拒绝写入({p0}):{p1}","adapter.codex.hooks.codexConfigTomlHooksKeyIsNotATable":"Codex config.toml 的 hooks 键不是表,未知格式拒绝写入({p0})","adapter.codex.hooks.userOwnedHooksConfigurationAlreadyExistsWingmanWillNot":"已存在用户自己的 [hooks] 配置({p0}),wingman 不合并不覆盖;","adapter.codex.hooks.removeItManuallyOrAddTheForwardingCommandTo":"请先手动移除或自行把转发命令加入现有 hooks({p0})","adapter.codex.actions.planHarnessIsNotCodexRefusingToApply":"plan.harness={p0} 不是 codex,拒绝执行","adapter.codex.actions.planWritesDoesNotMatchThisAdapterSFormat":"plan.writes 不是本 adapter 产出的形状(应恰为一处 modify),拒绝执行","adapter.codex.actions.backupdirIsOutsideTheWingmanBackupRootRefusingTo":"backupDir 不在 wingman 备份根({p0})下,拒绝执行","adapter.codex.actions.fileWasModifiedAfterPlanningRefusingToApplyPlan":"文件在 plan 之后被修改({p0}),拒绝执行;请重新 plan","adapter.codex.actions.theTargetFileInPlanWritesDoesNotMatch":"plan.writes 的目标文件与 itemId 对不上,拒绝执行","adapter.codex.actions.planDiffersFromThisAdapterSExpectedChangesRefusing":"plan 与本 adapter 的推演不一致,拒绝执行;请重新 plan","adapter.codex.actions.unknownActionKindVOnlySupportsToggleThroughPlan":"未知动作种类:{p0}(v1 仅 toggle 走 plan→apply)","adapter.codex.actions.unrecognizedOrUntoggleableItemIdCodexOnlySupportsMcpServers":"itemId 无法识别或不可开关:{p0}(codex 可开关条目仅限 tools 槽的 mcp_servers.* 与 skills 槽的 plugins.*)","adapter.codex.actions.itemidNotFoundConfigurationFileDoesNotExist":"itemId 找不到:配置文件不存在({p0})","adapter.codex.actions.cannotParseCodexConfigTomlRefusingTheAction":"Codex config.toml 解析失败,拒绝动作({p0}):{p1}","adapter.codex.actions.unrecognizedItemIdSkillsOnlySupportsPluginsEntriesReceived":"itemId 无法识别:skills 槽只支持 plugins.* 条目,得到 {p0}","adapter.codex.actions.itemidNotFoundPluginIsNotIn":"itemId 找不到:插件 {p0} 不在 {p1}","adapter.codex.actions.pluginConfigurationIsNotATableRefusingToWrite":"插件 {p0} 的配置不是表,未知格式拒绝写入({p1})","adapter.codex.actions.enabledKeyFor":"{p0} 的 enabled 键","adapter.codex.actions.enabledValueFor":"{p0} 的 enabled 值","adapter.codex.actions.unrecognizedItemIdToolsOnlySupportsMcpServersEntriesReceived":"itemId 无法识别:tools 槽只支持 mcp_servers.* 条目,得到 {p0}","adapter.codex.actions.itemidNotFoundHasNoMcpServersConfiguration":"itemId 找不到:{p0} 无 mcp_servers 配置","adapter.codex.actions.ambiguousItemIdBothServerAndServerExistCannotDetermine":'itemId 歧义:同时存在 server "{p0}" 与 server "{p1}"(无法断定目标,拒绝;不猜)',"adapter.codex.actions.itemidNotFoundMCPServerDoesNotExistMcp":"itemId 找不到:mcp server 不存在(mcp_servers.{p0} @ {p1})","adapter.codex.actions.mcpServerConfigurationIsNotATableRefusingTo":"mcp server {p0} 的配置不是表,未知格式拒绝写入({p1})","adapter.codex.actions.enabledKeyForMcpServers":"mcp_servers.{p0} 的 enabled 键","adapter.codex.actions.enabledValueForMcpServers":"mcp_servers.{p0} 的 enabled 值","adapter.codex.actions.conflictingConfigurationToolAppearsInBothEnabledToolsAnd":"矛盾配置:工具 {p0} 同时出现在 mcp_servers.{p1} 的 enabled_tools 与 disabled_tools({p2}),拒绝动作","adapter.codex.actions.cannotExplainTheStateOfMcpServersDisabledBut":"mcp_servers.{p0}/{p1} 状态无法解释(不在任何名单却判为关),拒绝动作({p2})","adapter.codex.actions.keyForMcpServers":"mcp_servers.{p0} 的 {p1} 键","adapter.codex.actions.arrayForMcpServers":"mcp_servers.{p0} 的 {p1} 数组","adapter.codex.actions.arrayForMcpServersTextDiffersFromParsedData":"mcp_servers.{p0} 的 {p1} 数组(文本与解析不一致)","adapter.codex.actions.inForMcpServers":"mcp_servers.{p0} 的 {p1} 中的 {p2}","adapter.codex.actions.mcpServersIsNotAStringArrayRefusingTo":"mcp_servers.{p0} 的 {p1} 不是字符串数组,未知格式拒绝写入({p2})","adapter.codex.actions.editedResultIsNotValidTOMLWriteAbandoned":"编辑结果不是合法 TOML,已放弃写入({p0}):{p1}","adapter.codex.actions.editedResultDiffersFromTheExpectedMinimalChangeRefusing":"编辑结果与期望的最小变更不一致,拒绝写入({p0})","adapter.codex.actions.enabledForIsNotABooleanRefusingToWrite":"{p0} 的 enabled 不是布尔值,未知字段形态拒绝写入({p1})","adapter.codex.actions.isAlreadyInTheRequestedStateEnabledNoWrite":"{p0} 已处于目标状态(enabled={p1}),无需写入;请重新扫描后再操作","adapter.codex.actions.tableHeaderInlineTableOrNonstandardSyntax":"[{p0}] 表头(内联表或非常规写法)","adapter.codex.actions.cannotSafelyLocateRefusingToWriteEditItManually":"无法安全定位 {p0},拒绝写入({p1});请手动编辑","adapter.codex.actions.internalErrorExpectedStructureIsMissingTable":"内部错误:期望结构里缺表 {p0}","adapter.codex.protocol.thisAGENTSMdProtocolBlockIsSharedByCodex":"此 AGENTS.md 协议块由 Codex 与 dsh 共用","adapter.codex.protocol.blockRemovedAndUserChangesPreserved":"{p0};已移除块并保留用户改动","adapter.codex.protocol.theManagedBlockWasModifiedRefusingToAndPreserving":"{p0}: 受管块已被修改,拒绝{p1}并保留用户内容","adapter.dsh.hooks.refusingToWriteCannotParseYAMLInUnknownFormats":"拒写:{p0} YAML 解析失败({p1}),未知格式不猜","adapter.dsh.hooks.refusingToWriteRootIsNotAYAMLArray":"拒写:{p0} 顶层不是 YAML 数组(dsh patch 层格式),未知格式不猜","adapter.dsh.hooks.refusingToWriteEntryInIsNotAMapping":"拒写:{p0} 第 {p1} 条不是映射(loader patch 条目),不猜","adapter.dsh.hooks.hasAWingmanStartMarkerWithoutAnEndMarker":"{p0} 有 wingman 起始标记但无结束标记(疑被手工改动),拒绝自动处理:请手工删除标记块或从备份恢复","adapter.dsh.hooks.unknownWiringStateVersionRefusingToInferItsFormat":"未知的接线状态版本,不猜","adapter.dsh.hooks.wiringStateStructureIsCorruptRefusingAutomaticChanges":"接线状态结构损坏,拒绝自动处理","adapter.dsh.hooks.dshProfileDoesNotExistOrIsMissingPackage":"dsh profile 不存在或缺 package.json:{p0}","adapter.dsh.hooks.refusingToWriteAlreadyHasAnUnmarkedEntryPossibly":"拒写:{p0} 已有未带 wingman 标记的 {p1} 条目(疑手工抄入),请先手工移除","adapter.dsh.hooks.refusingToWriteShapeValidationFailedAfterAppendingTo":"拒写:{p0} 追加后形状校验失败(原文件形态无法安全追加),不猜","adapter.dsh.hooks.refusingAutomaticChangesToDSHHOMECordisPatchYml":"拒绝自动处理 $DSH_HOME/cordis.patch.yml:文件或接线状态无法安全读取、解析或写入,请手动解线后重新接线","adapter.dsh.toggle.wingmanToggleBlockInHasAMismatchedEndMarker":"{p0} 的 wingman toggle 块({p1})结束标记对不上(疑被手工改动),拒绝自动处理:请手工删除标记块或从备份恢复","adapter.dsh.toggle.wingmanToggleBlockFlagIsCorruptInRefusingAutomatic":"{p0} 的 wingman toggle 块旗标损坏({p1}),拒绝自动处理","adapter.dsh.toggle.hasAnUnknownWingmanFlagRefusingAutomaticChangesOr":"{p0} 有未知的 wingman 旗标({p1}),拒绝自动处理,不猜","adapter.dsh.toggle.wingmanToggleBlockIdIsInvalidInRefusingAutomatic":"{p0} 的 wingman toggle 块 id 非法({p1}),拒绝自动处理","adapter.dsh.toggle.containsDuplicateWingmanToggleBlocksPossiblyCopiedManuallyRefusing":"{p0} 存在重复的 wingman toggle 块({p1}),疑被手工复制,拒绝自动处理","adapter.dsh.toggle.hasAnUnrecognizedWingmanMarkerLineRefusingAutomaticChanges":"{p0} 有无法识别的 wingman 标记行({p1}…),拒绝自动处理,不猜","adapter.dsh.toggle.wingmanToggleBlockInHasNoEndMarkerPossibly":"{p0} 的 wingman toggle 块({p1})有始无终(疑被手工改动),拒绝自动处理:请手工删除标记块或从备份恢复","adapter.dsh.toggle.wingmanLiveHooksBlockInHasNoEndMarker":"{p0} 的 wingman live hooks 块有始无终(疑被手工改动),拒绝自动处理","adapter.dsh.toggle.wingmanToggleBlockInWasModifiedRefusingAutomaticChanges":"{p0} 的 wingman toggle 块({p1})内容被改动,拒绝自动处理:请手工删除标记块或从备份恢复","adapter.dsh.toggle.unsupportedActionKindDshVOnlySupportsToggle":"不支持的动作种类:{p0}(dsh v1 仅支持 toggle)","adapter.dsh.toggle.actionIsMissingItemIdTheTargetItemSSlotItem":"动作缺少 itemId(目标条目的 SlotItem.id)","adapter.dsh.toggle.actionIsMissingEnableTrueOnFalseOff":"动作缺少 enable(true=打开,false=关闭)","adapter.dsh.toggle.itemWasNotFoundConfigurationMayHaveChangedScan":"找不到条目 {p0}:配置可能已变化,请重新扫描后再试","adapter.dsh.toggle.isALayerItselfRulesSlotAndCannotBe":"「{p0}」是分层本身(rules 槽),不可开关","adapter.dsh.toggle.comesFromThePatchOverrideLayerAppliedAfterThe":"「{p0}」来自 --patch 覆盖层,应用顺序在家目录层之后,Wingman 的家目录 patch 压不过它,拒绝开关","adapter.dsh.toggle.itemIsNotAPluginRowAndCannotBe":"条目 {p0} 不是插件行,无法开关","adapter.dsh.toggle.pluginInstanceIdContainsCharactersUnsafeForMarkersRefusing":"插件 instance id 含标记不安全字符({p0}),拒绝开关,不猜","adapter.dsh.toggle.wasAddedByWingmanLiveWiringLiveHooksBlock":"「{p0}」({p1})由 Wingman 实况接线(live hooks 块)引入,请用 `wingman hook uninstall dsh` 管理,不走开关","adapter.dsh.toggle.isAlreadyDisabledByWingmanEffectiveNextTimeDsh":"「{p0}」({p1})已由 Wingman 关闭(dsh 下次启动生效);如需恢复请 toggle on","adapter.dsh.toggle.alreadyHasAUserOwnedEntryNoMergeWill":"{p0} 已有用户自己的 {p1} 条目,不猜合并:请手工处理该条目后再试","adapter.dsh.toggle.isAlreadyDisabledInLayerNativeSettingOutsideWingman":"「{p0}」({p1})已在 {p2} 层被禁用(原生禁用非 Wingman 所辖),无需再关","adapter.dsh.toggle.isNativelyDisabledInLayerOutsideWingmanSControl":"「{p0}」({p1})在 {p2} 层被原生禁用,非 Wingman 所辖:请到该层(bundle/profile 配置)修改","adapter.dsh.toggle.isAlreadyEnabledNoToggleOnNeeded":"「{p0}」({p1})已是启用状态,无需 toggle on","adapter.dsh.toggle.planDidNotComeFromTheDshAdapterHarness":"plan 不是 dsh adapter 产出(harness 不符),拒绝执行","adapter.dsh.toggle.planWritesHasTheWrongShapeDshToggleWrites":"plan.writes 形状不符(dsh toggle 只写一处),拒绝执行","adapter.dsh.toggle.planWriteTargetIsNotRefusingToApply":"plan 写入目标 {p0} 不是 {p1},拒绝执行","adapter.dsh.toggle.planWritesFieldsHaveTheWrongShapeBeforeAfter":"plan.writes[0] 字段形状不符(before/after 与 kind 不匹配),拒绝执行","adapter.dsh.toggle.planBackupDirIsMissingRefusingToApply":"plan.backupDir 缺失,拒绝执行","adapter.dsh.toggle.planBackupDirIsNotUnderRefusingToApply":"plan.backupDir 不在 {p0} 之下,拒绝执行","adapter.dsh.toggle.wasCreatedAfterPlanningAndNoLongerMatchesThe":"{p0} 在 plan 之后被创建,与 plan 前提不符:请重新 plan","adapter.dsh.toggle.wasDeletedAfterPlanningAndNoLongerMatchesThe":"{p0} 在 plan 之后被删除,与 plan 前提不符:请重新 plan","adapter.dsh.toggle.wasModifiedAfterPlanningAndDiffersFromThePlan":"{p0} 在 plan 之后被改动,与 plan 快照不一致:请重新 plan","adapter.dsh.protocol.theDshInstructionLoaderPluginIsDisabledSeeThe":"dsh 指令加载插件已禁用,见控制页开关","adapter.dsh.protocol.uninstallingAffectsBothCodexAndDsh":"{p0};卸载同时影响 Codex 与 dsh","adapter.dsh.protocol.uninstallingAffectsBothCodexAndDshUserChangesPreserved":"{p0};卸载同时影响 Codex 与 dsh;已保留用户改动","adapter.dsh.protocol.dshHasNoUserLevelInstructionFileInstallPer":"dsh 没有用户级指令文件,请按项目安装","adapter.dsh.dump-config.cannotParseDumpConfigYAML":"dump-config YAML 解析失败:{p0}","adapter.dsh.dump-config.dumpConfigRootIsNotAPluginRowSequence":"dump-config 顶层不是插件行序列(YAML seq),与钉定版本格式不符,拒绝解析","adapter.dsh.dump-config.pluginRowInDumpConfigIsNotAYAML":"dump-config 第 {p0} 个插件行不是 YAML map,拒绝解析","adapter.dsh.dump-config.pluginRowInDumpConfigIsMissingItsBundle":"dump-config 第 {p0} 个插件行上方缺少「# == <bundle>」出处注释,拒绝解析","adapter.dsh.dump-config.pluginRowInDumpConfigIsMissingAString":"dump-config 第 {p0} 个插件行缺少字符串 id/name,拒绝解析","adapter.dsh.dump-config.duplicateSlotItemIdSameLayerNameAndInstanceId":"SlotItem.id 重复:{p0}(同层同名同实例 id,无法区分),scan 失败"},ns={"cli.licenseStatusLine":`{state}:{detail}
53
53
  `,"cli.scanSummary":`harness:{harness}{version}
54
54
  scannedAt:{scannedAt}
55
55
  {counts}
@@ -95,108 +95,111 @@ scannedAt:{scannedAt}
95
95
  `,"cli.scanHarness":"--harness 需要 {ids},得到 {value}","cli.scanUnknownArg":"scan 不认识参数:{arg}","cli.scanHarnessRequired":"scan 需要 --harness <cc|codex|dsh>","cli.servePort":"--port 需要 0-65535 的整数,得到 {value}","cli.panelDistRequired":"--panel-dist 需要目录路径,得到(缺参)","cli.serveUnknownArg":"serve 不认识参数:{arg}","cli.missingArgument":"(缺参)","cli.listSeparator":"、","cli.localeRequired":"--locale 需要语言标签,得到(缺参)","cli.protocolUser":"用户级","cli.protocolProject":"项目级","cli.protocolCancelled":`wingman:已取消,未写入任何文件。
96
96
  `,"cli.protocolDone":`wingman:{harness} protocol {action} 完成
97
97
  `,"cli.protocolUsage":"protocol 用法:wingman protocol install|uninstall|status <cc|codex|dsh> [--project <dir> | --user] [--dry-run] [--yes]","cli.protocolHarness":"protocol 需要 harness ∈ cc|codex|dsh,得到 {value}","cli.projectRequired":"--project 需要目录路径,得到(缺参)","cli.protocolUnknownArg":"protocol 不认识参数:{arg}","cli.protocolExclusiveScope":"--user 与 --project 互斥","cli.protocolFixtureUser":"fixtures 模式拒绝 --user,不能访问用户级指令文件","cli.protocolFixtures":"protocol 不支持 --fixtures","cli.protocolTruncation":`警告:Codex 可能截断本块;AGENTS.md 装后已接近或超过默认 32 KiB project_doc_max_bytes。
98
- `,"cli.confirmWrite":"确认写入? [y/N] ","cli.licenseMissing":"未安装 license;免费层只显示一个工具。试用或订阅可查看全部工具与项目总览,并使用配置开关。","cli.licenseDevelopment":"开发构建:未嵌入公钥,全部功能可用","cli.licenseJson":"license 文件不是合法 JSON","cli.licenseFields":"license 文件缺 token/signature 字段","cli.licenseSignature":"license 验签失败(内容被改动或非本产品签发)","cli.licenseClaimsFields":"license 载荷字段不完整","cli.licenseClaimsDecode":"license 载荷无法解码","cli.licenseValidUntil":"{plan}有效至 {exp}","cli.trialExpired":"试用已于 {exp} 到期;免费层只显示一个工具。试用或订阅可查看全部工具与项目总览,并使用配置开关。","cli.licenseGrace":"订阅已于 {exp} 到期,处于 {days} 天离线宽限期(请联网续期)","cli.subscriptionExpired":"订阅已于 {exp} 到期且超出宽限期;免费层只显示一个工具。试用或订阅可查看全部工具与项目总览,并使用配置开关。","cli.licenseWriteFailed":"写入 {path} 失败:{message}","cli.refreshMissing":"未找到 {path};请先导入试用或订阅的 license.json。","cli.refreshNetwork":"联网失败,稍后再试;当前授权状态保持不变","cli.refreshHttp":"签发端返回 HTTP {status}","cli.refreshRejected":"续期被拒:{detail}","cli.refreshJson":"签发端返回的不是合法 JSON;原 license 未动","cli.refreshFields":"签发端返回缺 token/signature;原 license 未动","cli.refreshInvalid":"签发端返回的 license 无效:{detail};原 license 未动","cli.refreshChanged":"刷新期间本机授权已被更换;已保留较新的文件,请再点一次刷新","cli.refreshChangedUnreadable":"刷新期间本机授权已被更换;当前文件未被覆盖","cli.licenseRenewed":"license 已续期{suffix}","cli.licenseRenewedSuffix":",{plan}有效至 {exp}","cli.trial":"试用","cli.subscription":"订阅"},zr={"panel.source.projectMemory":"项目记忆","panel.source.planStep":"plan.md 步骤","panel.source.planInstruction":"计划所属指令","panel.source.latestInstruction":"最新指令","panel.source.workingDirectory":"工作目录","panel.source.homeDirectory":"工作目录 = 家目录","panel.source.planHeading":".wingman/plan.md H1","panel.source.userNamed":"用户命名","panel.source.permissionEvents":"PermissionRequest/Notification 事件","panel.source.liveEmptyState":"实况接线状态;尚无可显示的会话标题","panel.source.currentPointAncestors":".wingman/plan.md 中标为 [?] 的步骤","panel.source.feedbackUnavailable":"sessions.feedback.state=unavailable / feedback 未提供","panel.source.planGoal":".wingman/plan.md 目标: / Goal:","panel.source.lastActivity":"sessions.lastActivity(最近 hook received_at / transcript timestamp)最大值","panel.source.sessionPlanTitle":"sessions.title(plan.md 步骤)","panel.source.sessionDirectory":"sessions.label(会话工作目录名 / sessionId)","panel.source.sessionLabelFallback":"sessions[].label(项目载荷未就绪)","panel.source.userPrompt":"用户提示","panel.source.agentQuote":"agent 自述","panel.source.savingEstimate":"省额 = 条目常驻 token(估算标「约」);关停走 plan/apply,写前备份可回退","panel.source.savingUnavailable":"该 harness 未提供此条目的常驻占用数,不编省额;关停走 plan/apply,写前备份可回退","panel.source.historyEstimate":"估算 = 本轮 usage 合计(harness 自报,精确)− 配置常驻合计(估算,标「约」)","panel.source.ancestorLine":".wingman/plan.md:{line} 当前点顶层祖先","panel.source.waitingProvenance":"来源:{event} 事件,{since} 起未决;阈值 60s","panel.source.referenceMatch":"命中:{origin} —— 「{context}」(scanReferences 整词匹配)","panel.source.unusedServer":"判定:本 session 工具步骤零命中 mcp__{server}__*(transcript 观察)","panel.source.item":"条目:{path}","panel.source.historyThreshold":"阈值:context ≥ {tokens} 且历史占比 > 50%"},Qr={"narrative.worktreePlanDifferent":"工作树 {name} 的计划与主仓不同","narrative.projectHasSessions":"项目仍有会话","narrative.projectNotRemembered":"项目不在本机记忆中","narrative.noStateDirectory":"未配置本机状态目录","narrative.acceptanceUnreadable":"本机验收状态不可读","narrative.homeDirectory":"无项目目录(家目录)","narrative.sessionLimit":"已达 8 个会话上限","narrative.planMissing":"计划文件不存在","narrative.memoryUnavailable":"项目根记忆文件不可用(~/.wingman/state/projects.json)","narrative.firstWriteBefore":"计划文件首次写入发生在第 1 个非计划工具步骤之前","narrative.noPlanWrite":"未观察到该会话通过文件编辑工具写入 plan.md","narrative.waitingPermission":"等待授权","narrative.waitingResponse":"等待回应","narrative.feedbackUnavailable":"反馈信号不可用","narrative.feedbackUnreported":"反馈能力未报告","narrative.feedbackUnmapped":"反馈能力尚未映射","narrative.acceptanceOnResponse":"验收状态在响应时读取","narrative.unknownVersion":"(版本未知,可能装到别的版本)","narrative.firstWriteAfter":"计划文件首次写入发生在第 {step} 个非计划工具步骤之后","narrative.writeSummary":"本会话写入 {count} 次 · 最近 {at}","narrative.waitingPermissionDetail":"等待授权:{reason}","narrative.waitingResponseDetail":"等待回应:{reason}","narrative.feedbackNotWired":"反馈信号未接线;请运行 {command}","narrative.feedbackNotWiredUnknownVersion":"反馈信号未接线;请运行 {command}(版本未知,可能装到别的版本)","narrative.phase.inspect":"检查","narrative.phase.modify":"修改","narrative.phase.verify":"验证","narrative.phase.other":"其他","narrative.planTooLarge":"计划文件超过 1 MiB","narrative.planNotRegular":"计划文件不是普通文件","narrative.planOutsideRoot":"软链解析到项目根之外","narrative.planInvalidUtf8":"计划文件不是严格 UTF-8","narrative.planTooManyLines":"计划文件超过 20000 行","narrative.planUnsupportedVersion":"格式版本不受支持","narrative.planConflict":"计划文件含 git 冲突标记","narrative.planTooManyNodes":"计划节点超过 2000 个","narrative.currentPoint":"当前点","narrative.noCurrentPoint":"计划未标记进行中步骤","narrative.allComplete":"Agent 标记项目步骤全部完成","narrative.sessionCompleteProjectActive":"会话计划已全部完成,项目步骤仍为进行中","narrative.cancelledParent":"父步骤已取消,但后代仍标记为进行中","narrative.pending":"待做","narrative.inProgress":"进行中","narrative.completed":"完成","narrative.cancelled":"已取消","narrative.checkpoint":"检查点","narrative.parallelPoints":"并行 {count} 项","narrative.noActiveSession":"「{step}」步骤下当前没有观察到活跃会话","narrative.recentWriters":"最近 60 秒内 {count} 个会话写入此文件","narrative.completedParent":"父步骤标记完成,但后代仍标记为{status}","narrative.pendingParent":"父步骤仍待做,但后代已标记{status}","narrative.dshNoPlan":"dsh 没有向 Wingman hooks 暴露稳定的本地 todo projection","narrative.ccPlanInvalid":"Claude Code 计划工具参数无法解析","narrative.codexPlanInvalid":"Codex update_plan 参数无法解析","narrative.memoryUnreadable":"项目根记忆文件无法读取(~/.wingman/state/projects.json)","narrative.memoryInvalid":"项目根记忆文件无法解析(~/.wingman/state/projects.json)","narrative.memoryRefuse":"项目根记忆文件不可用,拒绝覆盖(~/.wingman/state/projects.json)","narrative.memoryUpdateFailed":"项目根记忆文件无法更新(~/.wingman/state/projects.json)","narrative.invalidStructure":"不是合法 v1 结构","narrative.overlayUnreadable":"overlay 文件无法读取;请人工检查 {path}:{error}","narrative.overlayInvalid":"overlay 文件无法解析;请人工检查 {path}:{error}","narrative.overlayRefuse":"overlay 文件无法解析,拒绝覆盖;请人工检查 {path}","narrative.shellWriteUnconfirmed":"通过 shell 写入无法确认","narrative.noAttributableChange":"未观察到可归属的进行中步骤变更","narrative.ambiguousAttribution":"一次写入涉及多个进行中步骤,无法唯一归属","narrative.approximately":"约 {value}","narrative.waited":"已等待 {duration}:{message}","narrative.reenable":"检测到提及 {name}(已关),可一键打开","narrative.saving":",关掉可省 {tokens} tok(常驻估算)","narrative.unused":"{server} 本 session 未使用{saving}","narrative.historyBloat":"对话历史约占本轮 context {percent}%(约 {history} / {context}),开新 session 可复位","narrative.canDisable":",可关"},Xr={"panel.mobile.heading":"手机","panel.mobile.pairedCount":"已配对 {count} 台","panel.mobile.paused":"已暂停同步","panel.mobile.requiresLicense":"需要试用或有效订阅才能配对手机(免费层只显示一个工具)","panel.mobile.localRemoved":"已移除本地记录;中转数据 24 小时后自动清除","panel.mobile.localWriteFailed":"无法保存本机手机配对记录。请检查本机状态目录后重试。","panel.mobile.pair":"配对手机","panel.mobile.disclosure":"配对后 Mac 会把项目与会话状态加密上传,手机 App 才能看到;中转只见密文","panel.mobile.scan":"打开手机上的 Wingman App 扫码配对","panel.mobile.qrLabel":"手机配对二维码","panel.mobile.autoClose":"已在手机上扫码后自动关闭","panel.mobile.cancel":"取消配对","panel.mobile.unnamed":"手机","panel.mobile.paired":"已配对","panel.mobile.pending":"等待扫码","panel.mobile.unpaired":"未配对","panel.mobile.pairedAt":"配对时刻","panel.mobile.lastSync":"最近同步","panel.mobile.notSynced":"尚未同步","panel.mobile.unpair":"解除配对","panel.mobile.confirm":"解除与「{name}」的配对后,Mac 停止上传,中转删除此配对的数据。","panel.mobile.keep":"保留配对","panel.mobile.working":"处理中…","panel.mobile.keychainUnavailable":"钥匙串不可用。请允许钥匙串访问后重试。","panel.mobile.stateUnavailable":"无法读取手机配对记录。请检查本机配对设置后重试。","panel.mobile.relayUnavailable":"暂时无法连接中转。请稍后重试。","panel.mobile.unavailable":"手机配对操作失败。请重试。","panel.mobile.invalidRelay":"手机中转地址不可用。请检查本机中转设置。","panel.mobile.pairNotFound":"此手机已解除配对。请重新配对。","island.waitingForYou":"{p0} 在等待:{p1}","panel.main.backToSessionSettingsResponseUnavailable":"回跳设置响应不可用","panel.main.couldNotSaveBackToSession":"回跳设置保存失败","panel.main.couldNotLoadBackToSession":"回跳设置读取失败","panel.main.activationResponseUnavailable":"激活响应不可用","panel.main.activationRequestFailed":"激活请求失败","panel.main.organizationRequestFailed":"整理请求失败:{p0}","panel.main.refreshFailed":"刷新失败:{p0}","panel.main.licenseRefreshed":"授权已刷新:{p0}","panel.main.licenseRefreshedReopenThePanelTo":"授权已刷新,请重新打开面板查看最新状态","panel.main.couldNotReadFile":"读取文件失败:{p0}","panel.main.importRequestFailed":"导入请求失败:{p0}","panel.main.dropToImportLicense":"松开导入 license","panel.main.demoSampleIsMissingItsMock":"演示件缺 MOCK 标注(增补条款 10)","panel.main.theServerHasNoActionEndpoint":"服务器无动作端点(dev 模式?),且演示件不可用:{p0}","panel.main.userPlanProtocol":"{p0} {p1} 用户级计划协议","panel.main.install":"安装","panel.main.uninstall":"卸载","panel.main.thePlanDoesNotMatchThe":"plan 与请求的用户级协议动作不一致","panel.main.applyRequestFailed":"apply 请求失败:{p0}","panel.main.shareConfigurationSample":"分享配置样本 · {p0}","panel.main.shareEventSample":"分享事件样本","panel.main.couldNotSend":"发送失败:{p0}","panel.actions.disableToSave":"关掉可省 {p0}","panel.actions.enablingAdds":"开启将 +{p0}","panel.actions.create":"新建","panel.actions.delete":"删除","panel.actions.modify":"修改","panel.actions.lines":"{p0} 行","panel.actions.previouslyLines":"原 {p0} 行","panel.actions.linesLines":"{p0} 行 → {p1} 行","panel.actions.effectiveImmediatelyTheHarnessWatchesThis":"立即生效 —— 该机制被 harness 实时监听,当前 session 也会更新","panel.actions.effectiveAfterReconnectingRestartTheHarness":"重连后生效 —— 需重启该 harness(或重连其 MCP server)才加载","panel.actions.effectiveNextSessionOngoingConversationsAre":"下个 session 生效 —— 正在进行的对话不受影响,新开会话才加载新配置","panel.actions.enable":"打开","panel.actions.disable":"关闭","panel.actions.planPayloadViolatesTheContractCannot":"plan 载荷不合合同,拒绝渲染:{p0}","panel.actions.writesIsNotAnObject":"writes[{p0}] 不是对象","panel.actions.writesFileIsNotANonempty":"writes[{p0}].file 不是非空字符串","panel.actions.writesKindHasUnknownValue":"writes[{p0}].kind 未知值 {p1}","panel.actions.writesBeforeIsMissingKindRequires":"writes[{p0}].before 缺失(kind={p1} 必须携带变更前完整内容)","panel.actions.writesAfterIsMissingKindRequires":"writes[{p0}].after 缺失(kind={p1} 必须携带变更后完整内容)","panel.actions.referencesIsNotAnObject":"references[{p0}] 不是对象","panel.actions.referencesFileIsNotANonempty":"references[{p0}].file 不是非空字符串","panel.actions.referencesLineIsNotABased":"references[{p0}].line 不是 1-based 行号","panel.actions.referencesMatchednameIsNotAString":"references[{p0}].matchedName 不是字符串","panel.actions.referencesContextIsNotAString":"references[{p0}].context 不是字符串","panel.actions.notAnObject":"不是对象","panel.actions.harnessHasUnknownValue":"harness 未知值 {p0}","panel.actions.actionIsNotAnObject":"action 不是对象","panel.actions.actionKindHasUnknownValueV":"action.kind 未知值 {p0}(v1 仅 toggle 走 plan)","panel.actions.actionItemidIsNotANonempty":"action.itemId 不是非空字符串","panel.actions.actionEnableIsNotABoolean":"action.enable 不是布尔值","panel.actions.writesIsNotAnArray":"writes 不是数组","panel.actions.backupdirIsNotANonemptyString":"backupDir 不是非空字符串","panel.actions.referencesIsNotAnArray":"references 不是数组","panel.actions.effectiveatHasUnknownValue":"effectiveAt 未知值 {p0}","panel.actions.applyResponseViolatesTheContractNot":"apply 响应不合合同:不是对象","panel.actions.applyResponseViolatesTheContractOk":"apply 响应不合合同:ok=true 但缺 backupDir","panel.actions.applyResponseViolatesTheContractOk59":"apply 响应不合合同:ok=false 但缺 error 原文","panel.actions.applyResponseViolatesTheContractOk60":"apply 响应不合合同:ok 不是布尔值","panel.actions.kindHasAnUnknownValue":"kind 未知值","panel.actions.harnessDoesNotSupportUserPlan":"harness 不支持用户级协议","panel.actions.hasblockIsNotABoolean":"hasBlock 不是布尔值","panel.actions.blockbytesIsNotANonnegativeInteger":"blockBytes 不是非负整数字节数","panel.actions.isNotANonemptyString":"{p0} 不是非空字符串","panel.actions.pathsMustUseTheAbbreviation":"路径必须用 ~/ 缩写","panel.actions.updateVersionsMustBeIncreasingIntegers":"更新版本必须为已有块的递增整数 fromVersion / toVersion","panel.actions.applyResponseViolatesTheContractPlanprotocol":"apply 响应不合合同:缺 planProtocol.user 状态","panel.actions.applyResponseViolatesTheContractBackupdir":"apply 响应不合合同:backupDir 必须用 ~/ 缩写","panel.actions.fixturesModeIsReadOnly":"fixtures 模式只读","panel.format.baseInstructions":"基础指令","panel.format.yourRules":"你的规则","panel.format.skills":"技能包","panel.format.toolDefinitions":"工具定义","panel.format.gateHooks":"闸门 hooks","panel.format.conversationHistory":"对话历史","panel.format.builtInSystemPrompt":"内置 system prompt","panel.format.builtInInstructions":"内置 instructions","panel.format.corePluginEverythingIsAPlugin":"core 插件(一切皆插件)","panel.format.skillPlugin":"skill 插件","panel.format.toolPlugins":"tool-* 插件","panel.format.approvalPermissionPlugins":"approval · permission 插件","panel.format.sessionLogPlugin":"session log 插件","panel.format.about":"约 {p0}","panel.format.residentAfterTrigger":"常驻 {p0} · 触发后 {p1}","panel.format.fullPluginApi":"完整 · 插件 API","panel.format.pushHooks":"推送 · hooks","panel.format.notWired":"未接线","panel.format.file":"文件:{p0}","panel.format.noFileSource":"无文件实体(source: {p0})","panel.format.estimateBytesLabeledAbout":"估算 = 字节 ÷ 3.5,故标「约」","panel.format.exactValueHarnessReportedUsageTokens":"精确值(harness 自报 usage):{p0} tokens","panel.license.licenseImported":"license 已导入 —— {p0}","panel.license.licenseImportedNewStatusUnknownRefresh":"license 已导入(新状态未知,刷新本页查看)","panel.license.dropOneLicenseJsonFileAt":"一次拖入 1 个 license.json 文件(收到 {p0} 个)","panel.license.onlyJsonFilesAreAcceptedReceived":"只认 .json 文件(收到 {p0})","panel.live.sessionStarted":"会话开始","panel.live.sessionEnded":"会话结束","panel.live.promptSubmitted":"提交提示","panel.live.toolCallStarted":"工具调用开始","panel.live.toolCallCompleted":"工具调用完成","panel.live.toolBatchCompleted":"工具批次完成","panel.live.turnEnded":"回合结束","panel.live.subagentStarted":"子代理启动","panel.live.subagentEnded":"子代理结束","panel.live.compactionStarted":"压缩开始","panel.live.compactionCompleted":"压缩完成","panel.live.configurationChanged":"配置变更","panel.live.instructionsLoaded":"指令加载","panel.live.notification":"通知","panel.live.permissionRequest":"权限请求","panel.live.notWired":"未接线","panel.live.waitingForEvents":"等待事件","panel.live.quiet":"静默","panel.live.running":"{p0} 运行中","panel.live.demoReplayMock":"演示重放中 · MOCK","panel.live.liveConnectionEstablished":"实况已连接","panel.live.disconnectedReconnectingAutomatically":"连接断开 · 自动重连中","panel.live.connecting":"连接中…","panel.taskboard.waitingForYou":"等待","panel.taskboard.turnEnded":"回合结束","panel.taskboard.ended":"已结束","panel.taskboard.inProgress":"进行中","panel.taskboard.allowed":"已允许","panel.taskboard.denied":"已拒绝","panel.taskboard.dshHasNoObservedCommandTo":"dsh 未提供按会话恢复的命令(未观察到),请在原终端继续","panel.taskboard.sourceSessionIdFromHookEvents":"来源:会话 id 来自 hook 事件;命令形式来自 codex resume --help","panel.taskboard.sourceSessionIdFromHookEvents132":"来源:会话 id 来自 hook 事件;命令形式来自 claude --help;需在原项目目录运行","panel.taskboard.sourceSessionIdAndWorkingDirectory":"来源:会话 id 与工作目录来自 hook 事件;命令形式来自 claude --help","panel.taskboard.justNow":"刚刚","panel.taskboard.minutesAgo":"{p0} 分钟前","panel.taskboard.hoursAgo":"{p0} 小时前","panel.share.linesAboutKbLimitKb":"共 {p0} 行 · 约 {p1} KB / 上限 256 KB"},Zr={"panel.narrative.invalidSkillInvocation":"{harness} 技能调用模式字段无效","panel.narrative.payloadNotArray":"载荷不是 JSON 数组","panel.narrative.payloadEntryNotObject":"载荷元素不是对象","panel.narrative.payloadMissingFields":"载荷元素缺少 harness/scannedAt 字段","panel.narrative.projectUnavailable":"项目载荷不可用","panel.narrative.sessionUnavailable":"会话叙事载荷不可用","panel.narrative.goal":"目标","panel.narrative.latestInstruction":"最新指令","panel.narrative.aborted":"(中断)","panel.narrative.incomplete":"(未收口)","panel.narrative.subagent":"子 agent","panel.narrative.mainAgent":"主 agent","panel.narrative.openRequest":"有待处理请求","panel.narrative.waitingForYou":"等待","panel.narrative.inProgress":"进行中","panel.narrative.notWired":"未接线","panel.narrative.waitingEvents":"等待事件","panel.narrative.missingSlot":"harness {harness} 缺少槽位 {slot}","panel.narrative.invalidUserProtocol":"harness {harness} 的 planProtocol.user 无效","panel.narrative.invalidProjectProtocol":"harness {harness} 的 planProtocol.project 无效","panel.narrative.unavailableProject":"不可用项目 {number}","panel.narrative.waitOverdue":" · 已等 {minutes}m+","panel.narrative.waitLabel":"等待{who}:{message}{overdue}","panel.narrative.event.SessionStart":"会话开始","panel.narrative.event.SessionEnd":"会话结束","panel.narrative.event.UserPromptSubmit":"收到新提示","panel.narrative.event.PreToolUse":"工具调用开始","panel.narrative.event.PostToolUse":"工具调用完成","panel.narrative.event.userRejected":"你拒绝了","panel.narrative.event.Stop":"回合结束","panel.narrative.event.Notification":"收到通知","panel.narrative.event.PermissionRequest":"等待授权","panel.narrative.event.SubagentStart":"子代理启动","panel.narrative.event.SubagentStop":"子代理结束","panel.narrative.event.PreCompact":"压缩开始","panel.narrative.event.PostCompact":"压缩完成"},es={"panel.render.projectPaused":"暂停","panel.render.noSessionsYet":"还没有会话","panel.render.forgetProject":"忘记这个项目","panel.render.forgetProjectConfirm":"从 Wingman 的本机记忆中移除这个项目,项目文件保持原样;以后再有会话时会重新出现。","panel.render.forget":"忘记","panel.render.codexProjectHint":"Codex 项目:{name}","panel.render.projectWorktree":"工作树 {name}","panel.render.worktreePlan":"工作树 {name} 的计划:{path}","panel.render.originExec":"Codex CLI · exec","panel.render.originCli":"Codex CLI","panel.render.originDesktop":"Codex 桌面版","panel.render.originSource":"来源:session_meta.originator / source","panel.render.chipNoInstruction":"尚无指令 · {p0}","panel.render.chipDirectory":"目录:{p0}","panel.render.chipTitleSource":"标题来源:{p0}","panel.render.chipTurnEnded":"回合结束(Stop 或主记录回合结束信号后无新事件或记录活动)","panel.render.projectsPageTitle":"项目总览","panel.render.projectsPageHint":"集中查看各个编程工具中的目标、进度和待决事项。","panel.render.controlsPageHint":"管理工具、偏好设置,以及返回会话的方式。","panel.render.optionalSuggestions":"可选优化建议","panel.render.suggestionsHint":"根据当前会话记录生成,仅供参考。应用前请查看方案。","panel.render.usagePageHint":"实际报告的用量与上下文估算,分开展示。","panel.render.toolsAndPreferences":"工具与偏好","panel.render.controlSkills":"技能与插件","panel.render.controlTools":"工具与连接","panel.render.controlBehavior":"行为与权限","panel.render.controlSummary":"共 {count} 项 · 已启用 {enabled} 项","panel.render.controlSummarySource":"来源:扫描的 slots.{slot}[] 中可开关条目的总数与 enabled 数;不代表当前会话实际使用","panel.render.controlSettingsCount":"{count} 项设置","panel.render.codexPluginControlHint":"Codex 插件:这里控制整个插件包,不是单个技能。","panel.render.contextSources":"查看上下文来源","panel.render.requestsUnavailable":"暂时无法观察请求 · 查看详情","panel.render.localFeedStatus":"本地数据流 · {status}","panel.render.lastHookReceived":"最近一次钩子到达 {p0}","panel.render.hookNotReceived":"尚未收到","panel.render.hookReceiptSource":"来源:sidecar 接收的钩子事件,本次启动已收到 {count} 条","panel.render.hookReceiptUnavailable":"尚无 sidecar 钩子到达元数据","panel.render.wingmanInstanceCount":"检测到约 {p0} 个 Wingman 实例","panel.render.wingmanInstanceSource":"来源:运行态目录中进程仍存活的记录","panel.render.codexBroadcastSource":"Codex 事件会投递给每个实例","panel.render.wingmanInstancesUnavailable":"Wingman 实例 {p0}","panel.render.notApplicable":"不适用","panel.render.wingmanInstancesFixtureSource":"fixtures 模式不读取本机运行态目录","panel.render.appFilter":"应用","panel.render.olderSessions":"更早的 {count} 个会话","panel.render.olderSessionsSource":"来源:sessions.ended 且 lastActivity 早于当前时间 {days} 天;仅折叠显示","panel.render.archiveSession":"归档","panel.render.archiveThisSession":"归档此会话","panel.render.restoreSession":"恢复","panel.render.archivedSessions":"已归档 {count} 个会话","panel.render.sessionArchiveSource":"来源:本机 task-overlay.json 会话 / 项目 archived;不删除 harness 数据","panel.render.sessionArchiveActivitySource":"来源:会话事件时间 > 会话或项目 archivedAt","panel.render.ccEnabled":"已开启","panel.render.ccPartial":"部分受限","panel.render.ccDisableAll":"全部关闭","panel.render.ccPartialWarning":"仅禁用了部分消息工具;全部关闭会同时拒绝 SendMessage 与 ListAgents。","panel.render.ccFeatures":"Claude Code 设置","panel.render.ccSettingsHint":"修改本机用户级配置,不只影响当前会话。确认前可查看改动。","panel.render.ccMessageHelp":"了解影响","panel.render.ccInboundHelp":"处理其他 Claude Code 会话发来的消息。接收:交给 Claude;暂存:先显示收到提示,不交给 Claude,之后有效设置允许接收时再交付;拒绝:丢弃消息。","panel.render.ccInboundImpact":"这不是你的聊天输入开关。收到并交付的消息可能让空闲的 Claude 开始新一轮处理,产生用量;不会自动附带发送方的完整对话或文件,接收方仍遵守自身权限。","panel.render.ccOutboundHelp":"允许 Claude 查找其他会话并发送消息,例如把完成情况告诉另一个任务。开启只移除这里对发送和查找工具的禁用,仍受其他权限设置限制。","panel.render.ccAutoMemory":"Auto memory","panel.render.ccInbound":"接收其他 Claude 会话的消息","panel.render.ccOutbound":"允许 Claude 发送消息","panel.render.ccDefault":"默认","panel.render.ccByPermissionMode":"按权限模式决定","panel.render.ccAccept":"接收","panel.render.ccHold":"暂存","panel.render.ccRefuse":"拒绝","panel.render.ccOutboundWarning":"关闭会同时禁用 SendMessage 和 ListAgents;不仅停止跨会话发消息,也会限制 Claude 与子代理(它分派出去的助手)和 Agent 团队成员的通信。接收消息由上面的设置单独控制。","panel.render.ccOverridden":"被 {layer} 覆盖,此处改动不生效","panel.render.ccLayerProject":"项目层","panel.render.ccLayerLocal":"项目本地层","panel.render.ccLayerManaged":"管理层","panel.render.ccInvalid":"配置格式未知,无法修改","panel.render.ccExactChanges":"将写入的键与值","panel.render.ccRemoveKey":"删除键(恢复默认)","panel.render.ccSetInbound":"将接收其他会话的消息设为 {value}","panel.render.ccInvalidPayload":"Claude Code 功能载荷无效","panel.render.ccScope":"只修改用户级 settings.json;覆盖检查包含项目、项目本地、管理策略 JSON 文件与远端缓存,未检测 MDM、策略辅助程序或宿主注入策略。","panel.render.skillAuto":"自动","panel.render.skillManual":"手动","panel.render.skillAgentOnly":"仅 Agent","panel.render.skillOff":"关闭","panel.render.skillAutoMeaning":"默认 disable-model-invocation: false / user-invocable: true;用户和 Agent 均可调用","panel.render.skillManualMeaning":"disable-model-invocation: true / user-invocable: true;仅用户显式调用,Agent 不自动加载,描述不加载进上下文","panel.render.skillAgentOnlyMeaning":"disable-model-invocation: false / user-invocable: false;用户菜单隐藏,仅 Agent 可调用","panel.render.skillOffMeaning":"disable-model-invocation: true / user-invocable: false;用户和 Agent 双方均不可调用","panel.render.skillFrontmatterSource":"来源:SKILL.md frontmatter disable-model-invocation / user-invocable;调用模式由 SKILL.md 决定,开关只控制配置启用状态","panel.render.skillOverridesSource":"来源:settings skillOverrides;配置已禁用","panel.render.skillConfiguration":"配置级","panel.render.dshControlsSummary":"共 {count} 项 · 已启用 {enabled} 项","panel.render.dshControlsSummarySource":"来源:dsh --dump-config 扫描 slots.{slot}[] 中 toggleable 条目的总数与 enabled 数;配置启用不等于会话使用","panel.render.plugins":"插件","panel.render.pluginConfigurationTip":"配置启用不代表本会话调用;会话使用以 Codex transcript 为准","panel.render.pluginsSummary":"{enabled} 个插件已启用 · 本会话用到 {used} 个","panel.render.pluginsUnobserved":"{enabled} 个插件已启用 · 本会话未观察到插件调用","panel.render.pluginsSummarySource":"来源:config.toml 插件配置扫描 slots.skills[].enabled 的启用条目数;本会话用到数来自按配置插件名匹配 Codex transcript 里的 MCP 工具调用(少量别名)后去重的 pluginsUsed,配置启用不等于会话使用","panel.render.skillConfigurationTip":"本会话是否真的加载以 transcript 为准","panel.render.ccSkillsSummary":"{enabled} 个技能已启用 · 本会话用到 {used} 个","panel.render.ccSkillsUnobserved":"{enabled} 个技能已启用 · 本会话未观察到技能调用","panel.render.ccSkillsSummarySource":"来源:配置扫描 slots.skills[].enabled 与 invocation(SKILL.md frontmatter)的非关闭条目数;本会话用到数来自 Claude Code transcript 中 Skill 工具调用或明确技能命令加载记录,去重后为 skillsUsed,配置启用不等于会话使用","panel.render.ccToolsSummary":"{enabled} 个 MCP 服务已启用 · 本会话用到 {used} 个","panel.render.ccToolsUnobserved":"{enabled} 个 MCP 服务已启用 · 本会话未观察到 MCP 调用","panel.render.ccToolsSummarySource":"来源:配置扫描 slots.tools[] 中 mcpServers.* 条目的 enabled 启用数;本会话用到数来自 Claude Code transcript 中 mcp__<server>__<tool> 调用与配置服务名匹配(- / _ 等价),去重后为 mcpUsed,配置启用不等于会话使用","panel.render.skillsUsed":"本会话已用:{skills}","panel.render.skillsUsedSource":"来源:transcript 中观察到的 Skill 工具调用 / 技能命令触发记录","panel.render.projectMenu":"项目菜单","panel.render.archiveProject":"归档","panel.render.restoreProject":"恢复","panel.render.archivedProjects":"已归档 {count} 个","panel.render.projectArchiveNewActivity":"有新活动","panel.render.projectArchiveActivitySource":"来源:firstScreen.lastActivity.at > user.archivedAt","panel.render.projectArchiveSource":"来源:本机 task-overlay.json archived / archivedAt;在所有 tab 都不显示,有新活动也需手动恢复","panel.render.moveProjectUp":"上移置顶项目","panel.render.moveProjectDown":"下移置顶项目","panel.render.projectPinSource":"来源:本机 task-overlay.json pinned / order","panel.render.filterBySessionHarness":"按会话所属 harness 筛选","panel.render.projectsHiddenByFilters":"{count} 个项目被筛选隐藏","panel.render.projectFilterSource":"来源:项目会话的 harness、状态与本机 hidden 标记","panel.render.expandAllProjects":"全部展开","panel.render.collapseAllProjects":"全部收起","panel.render.waitTrace":"{label}:{message}{outcome}","panel.render.sessionIdentifier":"session:{id}","panel.render.operationOnHost":"· 本次{verb}发生在这台机器","panel.render.protocolFileOperation":"将{verb}协议的文件","panel.render.protocolImpactLabel":"对 harness 与项目的影响","panel.render.protocolImpactInstall":"只在这个文件里加一个受管块,让 agent 把进度写成计划文件;不改写 harness 行为,不改任何项目代码。","panel.render.protocolImpactUpdate":"只把这个文件里的受管块更新到新版,让 agent 把进度写成计划文件;不改写 harness 行为,不改任何项目代码。","panel.render.protocolImpactUninstall":"只移除这个文件里的受管块,其余内容原样保留;不改写 harness 行为,不改任何项目代码。","panel.render.deleteLineNumber":"删除第 {line} 行","panel.render.close":"关闭","panel.render.language":"语言","panel.render.noConversationObserved":"还没有观察到会话","panel.render.conversationDetailsPending":"正在等待会话详情","panel.render.conversationDetailsPendingHint":"已收到会话信息。详情可用后会显示在这里;如果一直没有更新,请查看连接详情。","panel.render.checkConnection":"先检查连接设置","panel.render.startConversationHint":"在 {harness} 中开始或继续对话,任务和进展会出现在这里。","panel.render.checkConnectionHint":"尚未确认 {harness} 的活动接入。查看连接设置后,在原应用中开始对话。","panel.render.conversationNotShowing":"已经开始对话,但没有显示?","panel.render.viewConnectionSettings":"查看连接设置","panel.render.connectionDetails":"连接详情","panel.render.connectionInstallCommand":"需要重新接入时,可使用此命令:","panel.render.planDisplaySettings":"计划显示设置","panel.render.helpAndFeedback":"帮助与反馈","panel.render.apiAnatomyReturnedAnEmptyArray":"/api/anatomy 返回了空数组","panel.render.noHarnessDetected":"未检测到 harness","panel.render.firstRun":"先运行","panel.render.thenThePanelReadsAnatomyData":",面板从 GET /api/anatomy 读取解剖数据。","panel.render.versionUnknownADifferentVersionMay":"(版本未知,可能装到别的版本)","panel.render.sourceClickToExpandThePanel":`{p0} · {p1}{p2}
98
+ `,"cli.confirmWrite":"确认写入? [y/N] ","cli.licenseMissing":"未安装 license;免费层只显示一个工具。试用或订阅可查看全部工具与项目总览,并使用配置开关。","cli.licenseDevelopment":"开发构建:未嵌入公钥,全部功能可用","cli.licenseJson":"license 文件不是合法 JSON","cli.licenseFields":"license 文件缺 token/signature 字段","cli.licenseSignature":"license 验签失败(内容被改动或非本产品签发)","cli.licenseOtherDevice":"此 license 绑定了其他设备","cli.licenseDeviceUnavailable":"无法获取本机设备标识,暂时无法激活;已有未绑定 license 仍按原有效期使用。","cli.licenseDeviceLimit":"此 license 已在 3 台设备激活","cli.licenseActivationExpired":"此 license 已到期,请先续期后再激活本机。","cli.licenseUnbindRequiresActiveDevice":"请从已激活且授权未到期的设备解绑。","cli.licenseDeviceRevoked":"本机激活已被撤销;如需继续使用,请点击「激活本机」。","cli.licenseFixturesOffline":"样例模式不会联系在线签发端","cli.licenseDevicesInvalid":"签发端返回的设备列表无效","cli.licenseClaimsFields":"license 载荷字段不完整","cli.licenseClaimsDecode":"license 载荷无法解码","cli.licenseValidUntil":"{plan}有效至 {exp}","cli.trialExpired":"试用已于 {exp} 到期;免费层只显示一个工具。试用或订阅可查看全部工具与项目总览,并使用配置开关。","cli.licenseGrace":"订阅已于 {exp} 到期,处于 {days} 天离线宽限期(请联网续期)","cli.subscriptionExpired":"订阅已于 {exp} 到期且超出宽限期;免费层只显示一个工具。试用或订阅可查看全部工具与项目总览,并使用配置开关。","cli.licenseWriteFailed":"写入 {path} 失败:{message}","cli.refreshMissing":"未找到 {path};请先导入试用或订阅的 license.json。","cli.refreshNetwork":"联网失败,稍后再试;当前授权状态保持不变","cli.refreshHttp":"签发端返回 HTTP {status}","cli.refreshRejected":"续期被拒:{detail}","cli.refreshJson":"签发端返回的不是合法 JSON;原 license 未动","cli.refreshFields":"签发端返回缺 token/signature;原 license 未动","cli.refreshInvalid":"签发端返回的 license 无效:{detail};原 license 未动","cli.refreshChanged":"刷新期间本机授权已被更换;已保留较新的文件,请再点一次刷新","cli.refreshChangedUnreadable":"刷新期间本机授权已被更换;当前文件未被覆盖","cli.licenseRenewed":"license 已续期{suffix}","cli.licenseRenewedSuffix":",{plan}有效至 {exp}","cli.trial":"试用","cli.subscription":"订阅"},ts={"panel.source.projectMemory":"项目记忆","panel.source.planStep":"plan.md 步骤","panel.source.planInstruction":"计划所属指令","panel.source.latestInstruction":"最新指令","panel.source.workingDirectory":"工作目录","panel.source.homeDirectory":"工作目录 = 家目录","panel.source.planHeading":".wingman/plan.md H1","panel.source.userNamed":"用户命名","panel.source.permissionEvents":"PermissionRequest/Notification 事件","panel.source.liveEmptyState":"实况接线状态;尚无可显示的会话标题","panel.source.currentPointAncestors":".wingman/plan.md 中标为 [?] 的步骤","panel.source.feedbackUnavailable":"sessions.feedback.state=unavailable / feedback 未提供","panel.source.planGoal":".wingman/plan.md 目标: / Goal:","panel.source.lastActivity":"sessions.lastActivity(最近 hook received_at / transcript timestamp)最大值","panel.source.sessionPlanTitle":"sessions.title(plan.md 步骤)","panel.source.sessionDirectory":"sessions.label(会话工作目录名 / sessionId)","panel.source.sessionLabelFallback":"sessions[].label(项目载荷未就绪)","panel.source.userPrompt":"用户提示","panel.source.agentQuote":"agent 自述","panel.source.savingEstimate":"省额 = 条目常驻 token(估算标「约」);关停走 plan/apply,写前备份可回退","panel.source.savingUnavailable":"该 harness 未提供此条目的常驻占用数,不编省额;关停走 plan/apply,写前备份可回退","panel.source.historyEstimate":"估算 = 本轮 usage 合计(harness 自报,精确)− 配置常驻合计(估算,标「约」)","panel.source.ancestorLine":".wingman/plan.md:{line} 当前点顶层祖先","panel.source.waitingProvenance":"来源:{event} 事件,{since} 起未决;阈值 60s","panel.source.referenceMatch":"命中:{origin} —— 「{context}」(scanReferences 整词匹配)","panel.source.unusedServer":"判定:本 session 工具步骤零命中 mcp__{server}__*(transcript 观察)","panel.source.item":"条目:{path}","panel.source.historyThreshold":"阈值:context ≥ {tokens} 且历史占比 > 50%"},as={"narrative.worktreePlanDifferent":"工作树 {name} 的计划与主仓不同","narrative.projectHasSessions":"项目仍有会话","narrative.projectNotRemembered":"项目不在本机记忆中","narrative.noStateDirectory":"未配置本机状态目录","narrative.acceptanceUnreadable":"本机验收状态不可读","narrative.homeDirectory":"无项目目录(家目录)","narrative.sessionLimit":"已达 8 个会话上限","narrative.planMissing":"计划文件不存在","narrative.memoryUnavailable":"项目根记忆文件不可用(~/.wingman/state/projects.json)","narrative.firstWriteBefore":"计划文件首次写入发生在第 1 个非计划工具步骤之前","narrative.noPlanWrite":"未观察到该会话通过文件编辑工具写入 plan.md","narrative.waitingPermission":"等待授权","narrative.waitingResponse":"等待回应","narrative.feedbackUnavailable":"反馈信号不可用","narrative.feedbackUnreported":"反馈能力未报告","narrative.feedbackUnmapped":"反馈能力尚未映射","narrative.acceptanceOnResponse":"验收状态在响应时读取","narrative.unknownVersion":"(版本未知,可能装到别的版本)","narrative.firstWriteAfter":"计划文件首次写入发生在第 {step} 个非计划工具步骤之后","narrative.writeSummary":"本会话写入 {count} 次 · 最近 {at}","narrative.waitingPermissionDetail":"等待授权:{reason}","narrative.waitingResponseDetail":"等待回应:{reason}","narrative.feedbackNotWired":"反馈信号未接线;请运行 {command}","narrative.feedbackNotWiredUnknownVersion":"反馈信号未接线;请运行 {command}(版本未知,可能装到别的版本)","narrative.phase.inspect":"检查","narrative.phase.modify":"修改","narrative.phase.verify":"验证","narrative.phase.other":"其他","narrative.planTooLarge":"计划文件超过 1 MiB","narrative.planNotRegular":"计划文件不是普通文件","narrative.planOutsideRoot":"软链解析到项目根之外","narrative.planInvalidUtf8":"计划文件不是严格 UTF-8","narrative.planTooManyLines":"计划文件超过 20000 行","narrative.planUnsupportedVersion":"格式版本不受支持","narrative.planConflict":"计划文件含 git 冲突标记","narrative.planTooManyNodes":"计划节点超过 2000 个","narrative.currentPoint":"当前点","narrative.noCurrentPoint":"计划未标记进行中步骤","narrative.allComplete":"Agent 标记项目步骤全部完成","narrative.sessionCompleteProjectActive":"会话计划已全部完成,项目步骤仍为进行中","narrative.cancelledParent":"父步骤已取消,但后代仍标记为进行中","narrative.pending":"待做","narrative.inProgress":"进行中","narrative.completed":"完成","narrative.cancelled":"已取消","narrative.checkpoint":"检查点","narrative.parallelPoints":"并行 {count} 项","narrative.noActiveSession":"「{step}」步骤下当前没有观察到活跃会话","narrative.recentWriters":"最近 60 秒内 {count} 个会话写入此文件","narrative.completedParent":"父步骤标记完成,但后代仍标记为{status}","narrative.pendingParent":"父步骤仍待做,但后代已标记{status}","narrative.dshNoPlan":"dsh 没有向 Wingman hooks 暴露稳定的本地 todo projection","narrative.ccPlanInvalid":"Claude Code 计划工具参数无法解析","narrative.codexPlanInvalid":"Codex update_plan 参数无法解析","narrative.memoryUnreadable":"项目根记忆文件无法读取(~/.wingman/state/projects.json)","narrative.memoryInvalid":"项目根记忆文件无法解析(~/.wingman/state/projects.json)","narrative.memoryRefuse":"项目根记忆文件不可用,拒绝覆盖(~/.wingman/state/projects.json)","narrative.memoryUpdateFailed":"项目根记忆文件无法更新(~/.wingman/state/projects.json)","narrative.invalidStructure":"不是合法 v1 结构","narrative.overlayUnreadable":"overlay 文件无法读取;请人工检查 {path}:{error}","narrative.overlayInvalid":"overlay 文件无法解析;请人工检查 {path}:{error}","narrative.overlayRefuse":"overlay 文件无法解析,拒绝覆盖;请人工检查 {path}","narrative.shellWriteUnconfirmed":"通过 shell 写入无法确认","narrative.noAttributableChange":"未观察到可归属的进行中步骤变更","narrative.ambiguousAttribution":"一次写入涉及多个进行中步骤,无法唯一归属","narrative.approximately":"约 {value}","narrative.waited":"已等待 {duration}:{message}","narrative.reenable":"检测到提及 {name}(已关),可一键打开","narrative.saving":",关掉可省 {tokens} tok(常驻估算)","narrative.unused":"{server} 本 session 未使用{saving}","narrative.historyBloat":"对话历史约占本轮 context {percent}%(约 {history} / {context}),开新 session 可复位","narrative.canDisable":",可关"},rs={"panel.mobile.heading":"手机","panel.mobile.pairedCount":"已配对 {count} 台","panel.mobile.paused":"已暂停同步","panel.mobile.requiresLicense":"需要试用或有效订阅才能配对手机(免费层只显示一个工具)","panel.mobile.localRemoved":"已移除本地记录;中转数据 24 小时后自动清除","panel.mobile.localWriteFailed":"无法保存本机手机配对记录。请检查本机状态目录后重试。","panel.mobile.pair":"配对手机","panel.mobile.disclosure":"配对后 Mac 会把项目与会话状态加密上传,手机 App 才能看到;中转只见密文","panel.mobile.scan":"打开手机上的 Wingman App 扫码配对","panel.mobile.qrLabel":"手机配对二维码","panel.mobile.qrExpired":"二维码已过期","panel.mobile.expired":"已过期","panel.mobile.regenerate":"重新生成","panel.mobile.expiredTip":"配对等待窗口已结束,请重新生成二维码后扫码。","panel.mobile.autoClose":"已在手机上扫码后自动关闭","panel.mobile.cancel":"取消配对","panel.mobile.unnamed":"手机","panel.mobile.paired":"已配对","panel.mobile.pending":"等待扫码","panel.mobile.unpaired":"未配对","panel.mobile.pairedAt":"配对时刻","panel.mobile.lastSync":"最近同步","panel.mobile.notSynced":"尚未同步","panel.mobile.unpair":"解除配对","panel.mobile.confirm":"解除与「{name}」的配对后,Mac 停止上传,中转删除此配对的数据。","panel.mobile.keep":"保留配对","panel.mobile.working":"处理中…","panel.mobile.keychainUnavailable":"钥匙串不可用。请允许钥匙串访问后重试。","panel.mobile.stateUnavailable":"无法读取手机配对记录。请检查本机配对设置后重试。","panel.mobile.relayUnavailable":"暂时无法连接中转。请稍后重试。","panel.mobile.unavailable":"手机配对操作失败。请重试。","panel.mobile.invalidRelay":"手机中转地址不可用。请检查本机中转设置。","panel.mobile.pairNotFound":"此手机已解除配对。请重新配对。","island.waitingForYou":"{p0} 在等待:{p1}","panel.main.backToSessionSettingsResponseUnavailable":"回跳设置响应不可用","panel.main.couldNotSaveBackToSession":"回跳设置保存失败","panel.main.couldNotLoadBackToSession":"回跳设置读取失败","panel.main.activationResponseUnavailable":"激活响应不可用","panel.main.activationRequestFailed":"激活请求失败","panel.main.organizationRequestFailed":"整理请求失败:{p0}","panel.main.refreshFailed":"刷新失败:{p0}","panel.main.licenseRefreshed":"授权已刷新:{p0}","panel.main.licenseRefreshedReopenThePanelTo":"授权已刷新,请重新打开面板查看最新状态","panel.main.couldNotReadFile":"读取文件失败:{p0}","panel.main.importRequestFailed":"导入请求失败:{p0}","panel.main.dropToImportLicense":"松开导入 license","panel.main.demoSampleIsMissingItsMock":"演示件缺 MOCK 标注(增补条款 10)","panel.main.theServerHasNoActionEndpoint":"服务器无动作端点(dev 模式?),且演示件不可用:{p0}","panel.main.userPlanProtocol":"{p0} {p1} 用户级计划协议","panel.main.install":"安装","panel.main.uninstall":"卸载","panel.main.thePlanDoesNotMatchThe":"plan 与请求的用户级协议动作不一致","panel.main.applyRequestFailed":"apply 请求失败:{p0}","panel.main.shareConfigurationSample":"分享配置样本 · {p0}","panel.main.shareEventSample":"分享事件样本","panel.main.couldNotSend":"发送失败:{p0}","panel.actions.disableToSave":"关掉可省 {p0}","panel.actions.enablingAdds":"开启将 +{p0}","panel.actions.create":"新建","panel.actions.delete":"删除","panel.actions.modify":"修改","panel.actions.lines":"{p0} 行","panel.actions.previouslyLines":"原 {p0} 行","panel.actions.linesLines":"{p0} 行 → {p1} 行","panel.actions.effectiveImmediatelyTheHarnessWatchesThis":"立即生效 —— 该机制被 harness 实时监听,当前 session 也会更新","panel.actions.effectiveAfterReconnectingRestartTheHarness":"重连后生效 —— 需重启该 harness(或重连其 MCP server)才加载","panel.actions.effectiveNextSessionOngoingConversationsAre":"下个 session 生效 —— 正在进行的对话不受影响,新开会话才加载新配置","panel.actions.enable":"打开","panel.actions.disable":"关闭","panel.actions.planPayloadViolatesTheContractCannot":"plan 载荷不合合同,拒绝渲染:{p0}","panel.actions.writesIsNotAnObject":"writes[{p0}] 不是对象","panel.actions.writesFileIsNotANonempty":"writes[{p0}].file 不是非空字符串","panel.actions.writesKindHasUnknownValue":"writes[{p0}].kind 未知值 {p1}","panel.actions.writesBeforeIsMissingKindRequires":"writes[{p0}].before 缺失(kind={p1} 必须携带变更前完整内容)","panel.actions.writesAfterIsMissingKindRequires":"writes[{p0}].after 缺失(kind={p1} 必须携带变更后完整内容)","panel.actions.referencesIsNotAnObject":"references[{p0}] 不是对象","panel.actions.referencesFileIsNotANonempty":"references[{p0}].file 不是非空字符串","panel.actions.referencesLineIsNotABased":"references[{p0}].line 不是 1-based 行号","panel.actions.referencesMatchednameIsNotAString":"references[{p0}].matchedName 不是字符串","panel.actions.referencesContextIsNotAString":"references[{p0}].context 不是字符串","panel.actions.notAnObject":"不是对象","panel.actions.harnessHasUnknownValue":"harness 未知值 {p0}","panel.actions.actionIsNotAnObject":"action 不是对象","panel.actions.actionKindHasUnknownValueV":"action.kind 未知值 {p0}(v1 仅 toggle 走 plan)","panel.actions.actionItemidIsNotANonempty":"action.itemId 不是非空字符串","panel.actions.actionEnableIsNotABoolean":"action.enable 不是布尔值","panel.actions.writesIsNotAnArray":"writes 不是数组","panel.actions.backupdirIsNotANonemptyString":"backupDir 不是非空字符串","panel.actions.referencesIsNotAnArray":"references 不是数组","panel.actions.effectiveatHasUnknownValue":"effectiveAt 未知值 {p0}","panel.actions.applyResponseViolatesTheContractNot":"apply 响应不合合同:不是对象","panel.actions.applyResponseViolatesTheContractOk":"apply 响应不合合同:ok=true 但缺 backupDir","panel.actions.applyResponseViolatesTheContractOk59":"apply 响应不合合同:ok=false 但缺 error 原文","panel.actions.applyResponseViolatesTheContractOk60":"apply 响应不合合同:ok 不是布尔值","panel.actions.kindHasAnUnknownValue":"kind 未知值","panel.actions.harnessDoesNotSupportUserPlan":"harness 不支持用户级协议","panel.actions.hasblockIsNotABoolean":"hasBlock 不是布尔值","panel.actions.blockbytesIsNotANonnegativeInteger":"blockBytes 不是非负整数字节数","panel.actions.isNotANonemptyString":"{p0} 不是非空字符串","panel.actions.pathsMustUseTheAbbreviation":"路径必须用 ~/ 缩写","panel.actions.updateVersionsMustBeIncreasingIntegers":"更新版本必须为已有块的递增整数 fromVersion / toVersion","panel.actions.applyResponseViolatesTheContractPlanprotocol":"apply 响应不合合同:缺 planProtocol.user 状态","panel.actions.applyResponseViolatesTheContractBackupdir":"apply 响应不合合同:backupDir 必须用 ~/ 缩写","panel.actions.fixturesModeIsReadOnly":"fixtures 模式只读","panel.format.baseInstructions":"基础指令","panel.format.yourRules":"你的规则","panel.format.skills":"技能包","panel.format.toolDefinitions":"工具定义","panel.format.gateHooks":"闸门 hooks","panel.format.conversationHistory":"对话历史","panel.format.builtInSystemPrompt":"内置 system prompt","panel.format.builtInInstructions":"内置 instructions","panel.format.corePluginEverythingIsAPlugin":"core 插件(一切皆插件)","panel.format.skillPlugin":"skill 插件","panel.format.toolPlugins":"tool-* 插件","panel.format.approvalPermissionPlugins":"approval · permission 插件","panel.format.sessionLogPlugin":"session log 插件","panel.format.about":"约 {p0}","panel.format.residentAfterTrigger":"常驻 {p0} · 触发后 {p1}","panel.format.fullPluginApi":"完整 · 插件 API","panel.format.pushHooks":"推送 · hooks","panel.format.notWired":"未接线","panel.format.file":"文件:{p0}","panel.format.noFileSource":"无文件实体(source: {p0})","panel.format.estimateBytesLabeledAbout":"估算 = 字节 ÷ 3.5,故标「约」","panel.format.exactValueHarnessReportedUsageTokens":"精确值(harness 自报 usage):{p0} tokens","panel.license.licenseImported":"license 已导入 —— {p0}","panel.license.licenseImportedNewStatusUnknownRefresh":"license 已导入(新状态未知,刷新本页查看)","panel.license.dropOneLicenseJsonFileAt":"一次拖入 1 个 license.json 文件(收到 {p0} 个)","panel.license.onlyJsonFilesAreAcceptedReceived":"只认 .json 文件(收到 {p0})","panel.license.deviceActive":"本机已激活 · {count}/{max} 台","panel.license.deviceLimit":"此 license 已在 {count} 台设备激活","panel.license.deviceNotRegistered":"本机尚未激活 · {count}/{max} 台","panel.license.deviceNotRegisteredTip":"有设备名额时,请重新导入 license 以激活本机","panel.license.deviceRevoked":"本机激活已被撤销","panel.license.deviceRevokedTip":"现有授权保留至到期,自动或手动刷新不会重新激活。若要继续在本机使用,请在有设备名额时点「激活本机」。","panel.license.activateDevice":"激活本机","panel.license.deviceUnavailable":"无法读取本机设备标识,暂时无法激活","panel.license.devicePending":"本机尚未激活","panel.license.deviceTip":"每条订阅最多 {max} 台设备,授权每 24 小时自动续期。点此查看设备。","panel.license.deviceLimitTip":"请先在已激活设备上解绑一台旧设备,再在本机重新导入 license;本机已有授权保留至其到期。","panel.license.deviceManageElsewhere":"请在已激活且授权未到期的设备上解绑","panel.license.devices":"已激活设备","panel.license.unnamedDevice":"未命名设备","panel.license.deviceLastSeen":"最近续期:{at}","panel.license.unbind":"解绑","panel.license.unbindTip":"解绑会撤销该设备的续期资格,现有授权保留至到期;只有在那台机器重新导入 license 或点「激活本机」才会重新激活。","panel.live.sessionStarted":"会话开始","panel.live.sessionEnded":"会话结束","panel.live.promptSubmitted":"提交提示","panel.live.toolCallStarted":"工具调用开始","panel.live.toolCallCompleted":"工具调用完成","panel.live.toolBatchCompleted":"工具批次完成","panel.live.turnEnded":"回合结束","panel.live.subagentStarted":"子代理启动","panel.live.subagentEnded":"子代理结束","panel.live.compactionStarted":"压缩开始","panel.live.compactionCompleted":"压缩完成","panel.live.configurationChanged":"配置变更","panel.live.instructionsLoaded":"指令加载","panel.live.notification":"通知","panel.live.permissionRequest":"权限请求","panel.live.notWired":"未接线","panel.live.waitingForEvents":"等待事件","panel.live.quiet":"静默","panel.live.running":"{p0} 运行中","panel.live.demoReplayMock":"演示重放中 · MOCK","panel.live.liveConnectionEstablished":"实况已连接","panel.live.disconnectedReconnectingAutomatically":"连接断开 · 自动重连中","panel.live.connecting":"连接中…","panel.taskboard.waitingForYou":"等待","panel.taskboard.turnEnded":"回合结束","panel.taskboard.ended":"已结束","panel.taskboard.inProgress":"进行中","panel.taskboard.allowed":"已允许","panel.taskboard.denied":"已拒绝","panel.taskboard.dshHasNoObservedCommandTo":"dsh 未提供按会话恢复的命令(未观察到),请在原终端继续","panel.taskboard.sourceSessionIdFromHookEvents":"来源:会话 id 来自 hook 事件;命令形式来自 codex resume --help","panel.taskboard.sourceSessionIdFromHookEvents132":"来源:会话 id 来自 hook 事件;命令形式来自 claude --help;需在原项目目录运行","panel.taskboard.sourceSessionIdAndWorkingDirectory":"来源:会话 id 与工作目录来自 hook 事件;命令形式来自 claude --help","panel.taskboard.justNow":"刚刚","panel.taskboard.minutesAgo":"{p0} 分钟前","panel.taskboard.hoursAgo":"{p0} 小时前","panel.share.linesAboutKbLimitKb":"共 {p0} 行 · 约 {p1} KB / 上限 256 KB"},ss={"panel.narrative.invalidSkillInvocation":"{harness} 技能调用模式字段无效","panel.narrative.payloadNotArray":"载荷不是 JSON 数组","panel.narrative.payloadEntryNotObject":"载荷元素不是对象","panel.narrative.payloadMissingFields":"载荷元素缺少 harness/scannedAt 字段","panel.narrative.projectUnavailable":"项目载荷不可用","panel.narrative.sessionUnavailable":"会话叙事载荷不可用","panel.narrative.goal":"目标","panel.narrative.latestInstruction":"最新指令","panel.narrative.aborted":"(中断)","panel.narrative.incomplete":"(未收口)","panel.narrative.subagent":"子 agent","panel.narrative.mainAgent":"主 agent","panel.narrative.openRequest":"有待处理请求","panel.narrative.waitingForYou":"等待","panel.narrative.inProgress":"进行中","panel.narrative.notWired":"未接线","panel.narrative.waitingEvents":"等待事件","panel.narrative.missingSlot":"harness {harness} 缺少槽位 {slot}","panel.narrative.invalidUserProtocol":"harness {harness} 的 planProtocol.user 无效","panel.narrative.invalidProjectProtocol":"harness {harness} 的 planProtocol.project 无效","panel.narrative.unavailableProject":"不可用项目 {number}","panel.narrative.waitOverdue":" · 已等 {minutes}m+","panel.narrative.waitLabel":"等待{who}:{message}{overdue}","panel.narrative.event.SessionStart":"会话开始","panel.narrative.event.SessionEnd":"会话结束","panel.narrative.event.UserPromptSubmit":"收到新提示","panel.narrative.event.PreToolUse":"工具调用开始","panel.narrative.event.PostToolUse":"工具调用完成","panel.narrative.event.userRejected":"你拒绝了","panel.narrative.event.Stop":"回合结束","panel.narrative.event.Notification":"收到通知","panel.narrative.event.PermissionRequest":"等待授权","panel.narrative.event.SubagentStart":"子代理启动","panel.narrative.event.SubagentStop":"子代理结束","panel.narrative.event.PreCompact":"压缩开始","panel.narrative.event.PostCompact":"压缩完成"},os={"panel.render.projectPaused":"暂停","panel.render.noSessionsYet":"还没有会话","panel.render.forgetProject":"忘记这个项目","panel.render.forgetProjectConfirm":"从 Wingman 的本机记忆中移除这个项目,项目文件保持原样;以后再有会话时会重新出现。","panel.render.forget":"忘记","panel.render.codexProjectHint":"Codex 项目:{name}","panel.render.projectWorktree":"工作树 {name}","panel.render.worktreePlan":"工作树 {name} 的计划:{path}","panel.render.originExec":"Codex CLI · exec","panel.render.originCli":"Codex CLI","panel.render.originDesktop":"Codex 桌面版","panel.render.originSource":"来源:session_meta.originator / source","panel.render.chipNoInstruction":"尚无指令 · {p0}","panel.render.chipDirectory":"目录:{p0}","panel.render.chipTitleSource":"标题来源:{p0}","panel.render.chipTurnEnded":"回合结束(Stop 或主记录回合结束信号后无新事件或记录活动)","panel.render.projectsPageTitle":"项目总览","panel.render.projectsPageHint":"集中查看各个编程工具中的目标、进度和待决事项。","panel.render.controlsPageHint":"管理工具、偏好设置,以及返回会话的方式。","panel.render.optionalSuggestions":"可选优化建议","panel.render.suggestionsHint":"根据当前会话记录生成,仅供参考。应用前请查看方案。","panel.render.usagePageHint":"实际报告的用量与上下文估算,分开展示。","panel.render.toolsAndPreferences":"工具与偏好","panel.render.controlSkills":"技能与插件","panel.render.controlTools":"工具与连接","panel.render.controlBehavior":"行为与权限","panel.render.controlSummary":"共 {count} 项 · 已启用 {enabled} 项","panel.render.controlSummarySource":"来源:扫描的 slots.{slot}[] 中可开关条目的总数与 enabled 数;不代表当前会话实际使用","panel.render.controlSettingsCount":"{count} 项设置","panel.render.codexPluginControlHint":"Codex 插件:这里控制整个插件包,不是单个技能。","panel.render.contextSources":"查看上下文来源","panel.render.requestsUnavailable":"暂时无法观察请求 · 查看详情","panel.render.localFeedStatus":"本地数据流 · {status}","panel.render.lastHookReceived":"最近一次钩子到达 {p0}","panel.render.hookNotReceived":"尚未收到","panel.render.hookReceiptSource":"来源:sidecar 接收的钩子事件,本次启动已收到 {count} 条","panel.render.hookReceiptUnavailable":"尚无 sidecar 钩子到达元数据","panel.render.wingmanInstanceCount":"检测到约 {p0} 个 Wingman 实例","panel.render.wingmanInstanceSource":"来源:运行态目录中进程仍存活的记录","panel.render.codexBroadcastSource":"Codex 事件会投递给每个实例","panel.render.wingmanInstancesUnavailable":"Wingman 实例 {p0}","panel.render.notApplicable":"不适用","panel.render.wingmanInstancesFixtureSource":"fixtures 模式不读取本机运行态目录","panel.render.appFilter":"应用","panel.render.olderSessions":"更早的 {count} 个会话","panel.render.olderSessionsSource":"来源:sessions.ended 且 lastActivity 早于当前时间 {days} 天;仅折叠显示","panel.render.archiveSession":"归档","panel.render.archiveThisSession":"归档此会话","panel.render.restoreSession":"恢复","panel.render.archivedSessions":"已归档 {count} 个会话","panel.render.sessionArchiveSource":"来源:本机 task-overlay.json 会话 / 项目 archived;不删除 harness 数据","panel.render.sessionArchiveActivitySource":"来源:会话事件时间 > 会话或项目 archivedAt","panel.render.ccEnabled":"已开启","panel.render.ccPartial":"部分受限","panel.render.ccDisableAll":"全部关闭","panel.render.ccPartialWarning":"仅禁用了部分消息工具;全部关闭会同时拒绝 SendMessage 与 ListAgents。","panel.render.ccFeatures":"Claude Code 设置","panel.render.ccSettingsHint":"修改本机用户级配置,不只影响当前会话。确认前可查看改动。","panel.render.ccMessageHelp":"了解影响","panel.render.ccInboundHelp":"处理其他 Claude Code 会话发来的消息。接收:交给 Claude;暂存:先显示收到提示,不交给 Claude,之后有效设置允许接收时再交付;拒绝:丢弃消息。","panel.render.ccInboundImpact":"这不是你的聊天输入开关。收到并交付的消息可能让空闲的 Claude 开始新一轮处理,产生用量;不会自动附带发送方的完整对话或文件,接收方仍遵守自身权限。","panel.render.ccOutboundHelp":"允许 Claude 查找其他会话并发送消息,例如把完成情况告诉另一个任务。开启只移除这里对发送和查找工具的禁用,仍受其他权限设置限制。","panel.render.ccAutoMemory":"Auto memory","panel.render.ccInbound":"接收其他 Claude 会话的消息","panel.render.ccOutbound":"允许 Claude 发送消息","panel.render.ccDefault":"默认","panel.render.ccByPermissionMode":"按权限模式决定","panel.render.ccAccept":"接收","panel.render.ccHold":"暂存","panel.render.ccRefuse":"拒绝","panel.render.ccOutboundWarning":"关闭会同时禁用 SendMessage 和 ListAgents;不仅停止跨会话发消息,也会限制 Claude 与子代理(它分派出去的助手)和 Agent 团队成员的通信。接收消息由上面的设置单独控制。","panel.render.ccOverridden":"被 {layer} 覆盖,此处改动不生效","panel.render.ccLayerProject":"项目层","panel.render.ccLayerLocal":"项目本地层","panel.render.ccLayerManaged":"管理层","panel.render.ccInvalid":"配置格式未知,无法修改","panel.render.ccExactChanges":"将写入的键与值","panel.render.ccRemoveKey":"删除键(恢复默认)","panel.render.ccSetInbound":"将接收其他会话的消息设为 {value}","panel.render.ccInvalidPayload":"Claude Code 功能载荷无效","panel.render.ccScope":"只修改用户级 settings.json;覆盖检查包含项目、项目本地、管理策略 JSON 文件与远端缓存,未检测 MDM、策略辅助程序或宿主注入策略。","panel.render.skillAuto":"自动","panel.render.skillManual":"手动","panel.render.skillAgentOnly":"仅 Agent","panel.render.skillOff":"关闭","panel.render.skillAutoMeaning":"默认 disable-model-invocation: false / user-invocable: true;用户和 Agent 均可调用","panel.render.skillManualMeaning":"disable-model-invocation: true / user-invocable: true;仅用户显式调用,Agent 不自动加载,描述不加载进上下文","panel.render.skillAgentOnlyMeaning":"disable-model-invocation: false / user-invocable: false;用户菜单隐藏,仅 Agent 可调用","panel.render.skillOffMeaning":"disable-model-invocation: true / user-invocable: false;用户和 Agent 双方均不可调用","panel.render.skillFrontmatterSource":"来源:SKILL.md frontmatter disable-model-invocation / user-invocable;调用模式由 SKILL.md 决定,开关只控制配置启用状态","panel.render.skillOverridesSource":"来源:settings skillOverrides;配置已禁用","panel.render.skillConfiguration":"配置级","panel.render.dshControlsSummary":"共 {count} 项 · 已启用 {enabled} 项","panel.render.dshControlsSummarySource":"来源:dsh --dump-config 扫描 slots.{slot}[] 中 toggleable 条目的总数与 enabled 数;配置启用不等于会话使用","panel.render.plugins":"插件","panel.render.pluginConfigurationTip":"配置启用不代表本会话调用;会话使用以 Codex transcript 为准","panel.render.pluginsSummary":"{enabled} 个插件已启用 · 本会话用到 {used} 个","panel.render.pluginsUnobserved":"{enabled} 个插件已启用 · 本会话未观察到插件调用","panel.render.pluginsSummarySource":"来源:config.toml 插件配置扫描 slots.skills[].enabled 的启用条目数;本会话用到数来自按配置插件名匹配 Codex transcript 里的 MCP 工具调用(少量别名)后去重的 pluginsUsed,配置启用不等于会话使用","panel.render.skillConfigurationTip":"本会话是否真的加载以 transcript 为准","panel.render.ccSkillsSummary":"{enabled} 个技能已启用 · 本会话用到 {used} 个","panel.render.ccSkillsUnobserved":"{enabled} 个技能已启用 · 本会话未观察到技能调用","panel.render.ccSkillsSummarySource":"来源:配置扫描 slots.skills[].enabled 与 invocation(SKILL.md frontmatter)的非关闭条目数;本会话用到数来自 Claude Code transcript 中 Skill 工具调用或明确技能命令加载记录,去重后为 skillsUsed,配置启用不等于会话使用","panel.render.ccToolsSummary":"{enabled} 个 MCP 服务已启用 · 本会话用到 {used} 个","panel.render.ccToolsUnobserved":"{enabled} 个 MCP 服务已启用 · 本会话未观察到 MCP 调用","panel.render.ccToolsSummarySource":"来源:配置扫描 slots.tools[] 中 mcpServers.* 条目的 enabled 启用数;本会话用到数来自 Claude Code transcript 中 mcp__<server>__<tool> 调用与配置服务名匹配(- / _ 等价),去重后为 mcpUsed,配置启用不等于会话使用","panel.render.skillsUsed":"本会话已用:{skills}","panel.render.skillsUsedSource":"来源:transcript 中观察到的 Skill 工具调用 / 技能命令触发记录","panel.render.projectMenu":"项目菜单","panel.render.archiveProject":"归档","panel.render.restoreProject":"恢复","panel.render.archivedProjects":"已归档 {count} 个","panel.render.projectArchiveNewActivity":"有新活动","panel.render.projectArchiveActivitySource":"来源:firstScreen.lastActivity.at > user.archivedAt","panel.render.projectArchiveSource":"来源:本机 task-overlay.json archived / archivedAt;在所有 tab 都不显示,有新活动也需手动恢复","panel.render.moveProjectUp":"上移置顶项目","panel.render.moveProjectDown":"下移置顶项目","panel.render.projectPinSource":"来源:本机 task-overlay.json pinned / order","panel.render.filterBySessionHarness":"按会话所属 harness 筛选","panel.render.projectsHiddenByFilters":"{count} 个项目被筛选隐藏","panel.render.projectFilterSource":"来源:项目会话的 harness、状态与本机 hidden 标记","panel.render.expandAllProjects":"全部展开","panel.render.collapseAllProjects":"全部收起","panel.render.waitTrace":"{label}:{message}{outcome}","panel.render.sessionIdentifier":"session:{id}","panel.render.operationOnHost":"· 本次{verb}发生在这台机器","panel.render.protocolFileOperation":"将{verb}协议的文件","panel.render.protocolImpactLabel":"对 harness 与项目的影响","panel.render.protocolImpactInstall":"只在这个文件里加一个受管块,让 agent 把进度写成计划文件;不改写 harness 行为,不改任何项目代码。","panel.render.protocolImpactUpdate":"只把这个文件里的受管块更新到新版,让 agent 把进度写成计划文件;不改写 harness 行为,不改任何项目代码。","panel.render.protocolImpactUninstall":"只移除这个文件里的受管块,其余内容原样保留;不改写 harness 行为,不改任何项目代码。","panel.render.deleteLineNumber":"删除第 {line} 行","panel.render.close":"关闭","panel.render.language":"语言","panel.render.noConversationObserved":"还没有观察到会话","panel.render.conversationDetailsPending":"正在等待会话详情","panel.render.conversationDetailsPendingHint":"已收到会话信息。详情可用后会显示在这里;如果一直没有更新,请查看连接详情。","panel.render.checkConnection":"先检查连接设置","panel.render.startConversationHint":"在 {harness} 中开始或继续对话,任务和进展会出现在这里。","panel.render.checkConnectionHint":"尚未确认 {harness} 的活动接入。查看连接设置后,在原应用中开始对话。","panel.render.conversationNotShowing":"已经开始对话,但没有显示?","panel.render.viewConnectionSettings":"查看连接设置","panel.render.connectionDetails":"连接详情","panel.render.connectionInstallCommand":"需要重新接入时,可使用此命令:","panel.render.planDisplaySettings":"计划显示设置","panel.render.helpAndFeedback":"帮助与反馈","panel.render.apiAnatomyReturnedAnEmptyArray":"/api/anatomy 返回了空数组","panel.render.noHarnessDetected":"未检测到 harness","panel.render.firstRun":"先运行","panel.render.thenThePanelReadsAnatomyData":",面板从 GET /api/anatomy 读取解剖数据。","panel.render.versionUnknownADifferentVersionMay":"(版本未知,可能装到别的版本)","panel.render.sourceClickToExpandThePanel":`{p0} · {p1}{p2}
99
99
  来源:{p3};点击展开面板`,"panel.render.compactPillSource":`{p0} · {p1}{p2}
100
100
  来源:{p3}`,"panel.render.project":"项目","panel.render.residentTok":"常驻 {p0} tok","panel.render.residentTotal":"常驻合计","panel.render.totalResidentTokensOfEnabledItems":"合计 = 各槽位启用条目的常驻 token 之和;","panel.render.includesEstimatesMarkedAsApproximate":"含估算值,故标「约」","panel.render.allValuesAreExactAndReported":"全部为 harness 自报精确值","panel.render.noTokenValuesCollectedInThis":"本次扫描未采到 token 数值(无可估算的字节来源)","panel.render.thisScanFoundNoEnabledItems":"{p0}:本次扫描该槽位无带 token 来源的启用条目","panel.render.residentTotalForEnabledItemsIndividual":"{p0} 启用条目常驻合计(逐条来源见下方明细)","panel.render.items":"项","panel.render.sourcePanelTimeOfTheLast":"来源:上次成功 GET /api/anatomy 的面板时间","panel.render.refreshFailedShowingDataFrom":"刷新失败,显示的是","panel.render.dataSuffix":"的数据","panel.render.contextBreakdown":"上下文估算","panel.render.previewTheCompleteContentBeforeSending":"打开预览弹层:先看到将发送的完整内容,可逐行删,点「发送」才会发出;关闭 = 什么都不发","panel.render.shareConfigurationSample":"分享配置样本","panel.render.thisItemIsDisabledToggleableItems":"该条目当前被关闭;可开关条目在下方 CONFIGURE 区一键打开","panel.render.disabled":"已关闭","panel.render.noFileThisItemHasNo":"无文件实体:该条目不来自可读文件(如内置注入 / boot 树行)","panel.render.noSourceFile":"无文件实体","panel.render.noItemsInThisScanThis":"本次扫描无条目(该槽位在此 harness 无可读来源)","panel.render.sixSlotDetailsHoverForSources":"六槽位明细 · hover 查看来源","panel.render.currentlyDisabled":"关闭中","panel.render.disable":"关闭","panel.render.enable":"打开","panel.render.previewChangesBeforeApplyingNoFiles":"点击预览改动 —— 先 plan 后 apply:确认前不写任何文件;写前自动备份,可 byte-identical 回退","panel.render.noItemsInThisScanCan":"该 harness 本次扫描没有可在面板开关的条目 —— 开关范围仅限各家原生支持的机制,其余条目请在源文件里改","panel.render.verifiedInPLANBConfigToml":"PLAN §4b 实测:config.toml 的 enabled_tools/disabled_tools 按单个工具开关;CC 只能整 server 开关,dsh 只能整插件开关","panel.render.codexSupportsIndividualToolsThroughEnabled":"Codex 独有:enabled_tools / disabled_tools 可精确到单个工具 —— 三家里粒度最细","panel.render.otherSlots":"其余槽位(","panel.render.haveNoToggleableItemsInThis":")本次扫描无可开关条目 —— 开关范围仅限各家原生支持的机制","panel.render.noSupportedTerminalAppDetectedTerminal":"本机未检测到支持的终端应用(Terminal / iTerm / Ghostty / WezTerm / Warp / Alacritty / kitty / VS Code)","panel.render.sourceGETApiReturnTargetLocal":"来源:GET /api/return-target 本机应用检测与 ~/.wingman/state/settings.json 用户选择","panel.render.switchToThisAppWhenReturning":"回到会话时切换到","panel.render.update":"更新","panel.render.install":"安装","panel.render.uninstall":"卸载","panel.render.sourcePOSTApiActionPlanHostname":"来源:POST /api/action/plan hostname","panel.render.hostRunningWingman":"运行 Wingman 的主机","panel.render.sourcePOSTApiActionPlanTargetPath":"来源:POST /api/action/plan targetPath / hasBlock / blockBytes","panel.render.bytes":"字节","panel.render.aManagedBlockAlreadyExists":"已有受管块","panel.render.noManagedBlockYet":"尚无受管块","panel.render.sourcePOSTApiActionPlanFromVersion":"来源:POST /api/action/plan fromVersion / toVersion","panel.render.updateTheV":"将把 v","panel.render.blockToV":"块更新为 v","panel.render.whenItTakesEffect":"生效时机","panel.render.appliesToTheNextNewSession":"下一个新会话生效,当前会话不变","panel.render.sourcePOSTApiActionPlanBackupDir":"来源:POST /api/action/plan backupDir","panel.render.backupDirectoryRule":"备份目录规则","panel.render.backUpBeforeWriting":"写入前先备份:","panel.render.uninstallingPreservesExistingContentAndSupports":";卸载保留原有内容,可 byte-identical 恢复。","panel.render.cancel":"取消","panel.render.confirmWrite":"确认写入","panel.render.thePlanContainsNoFileChanges":"plan 未包含任何文件变更","panel.render.noOtherReferencesFoundInThe":"引用语料里没有别处提到它","panel.render.filesToWriteNoBytesChange":"将写入的文件","panel.render.references":"引用命中","panel.render.matchesThesePlacesMentionItReported":"处 — 这些地方提到了它;只提醒,不修复","panel.render.backup":"备份","panel.render.beforeWritingBackUpOriginalsTo":"写入前,原件先备份到","panel.render.restoreByCopyingTheOriginalBytes":";回退 = 原样拷回(byte-identical)","panel.render.generatingPlanReadOnlyNoFiles":"正在生成 plan…(纯读:不写盘、不建备份目录)","panel.render.writingOriginalsHaveBeenBackedUp":"正在写入…(原件已先备份到 plan 里的备份目录)","panel.render.changesWrittenPanelDataRefreshed":"已写入,面板数据已重拉刷新。","panel.render.noNewBackupWasCreated":"本次没有新增备份。","panel.render.backupPrefix":"备份:","panel.render.restoreByCopyingTheOriginalBytesBack":"(回退 = 原样拷回)","panel.render.demoModeActionsStopAtThe":"演示模式:动作只到 plan 为止 —— 当前数据源只读(fixtures / dev 演示),不写任何真实文件。","panel.render.gotIt":"知道了","panel.render.commonCausesFilesChangedAfterPlanning":"常见原因:文件在 plan 之后被外部改过(关闭后重新点开关生成新 plan)、itemId 不存在、或目标格式未知被拒写(不猜,如实拒绝)。","panel.render.closeDialog":"关闭弹窗","panel.render.dayFreeTrialUntil":"30 天免费试用至 {p0}","panel.render.dayFreeTrialEnding":"30 天免费试用至 {p0} · 到期后转为免费层(一个工具)","panel.render.freeTierHarness":"免费层工具","panel.render.freeTierBarLabel":"免费层","panel.render.freeTierBarChoose":"选一个工具,7 天内不能更换","panel.render.freeTierBarCurrent":"当前工具 {tool}","panel.render.freeTierBarDay":"{days} 天后可更换","panel.render.freeTierBarDays":"{days} 天后可更换","panel.render.freeTierBarToday":"今天可更换","panel.render.freeTierBarChange":"更换","panel.render.freeTierBarSwitchableAt":"可更换时间:{date}","panel.render.freeTierModalTitle":"免费层只显示一个工具","panel.render.freeTierModalBody":"你现在看的是 {tool}。试用或订阅后,三家工具和跨工具的项目总览一起打开,配置开关也能写入。","panel.render.freeTierModalTrial":"开始 30 天免费试用","panel.render.freeTierModalDismiss":"先不用","panel.render.freeTierModalExisting":"已有 license?","panel.render.freeTierModalImport":"导入 license","panel.render.freeTierModalRefresh":"刷新授权","panel.render.dayFreeTrialActive":"30 天免费试用中","panel.render.freeTrialEndedRefreshOrSubscribe":"免费试用已结束 · 免费层只显示一个工具 · 刷新或订阅","panel.render.subscriptionExpiredInGracePeriodRenew":"订阅已到期,宽限期内 · 点此续期","panel.render.subscriptionExpiredFreeTier":"订阅已到期 · 免费层只显示一个工具 · 刷新或订阅","panel.render.importLicenseJsonFromTheActivation":"选择激活页下载的 license.json 导入(写入 ~/.wingman/license.json,旧文件自动备份);也可把文件直接拖进本面板","panel.render.importLicense":"导入 license","panel.render.cancelSubscriptionsOrChangePaymentMethods":"取消订阅或更换付款方式需在 Stripe 侧操作,入口在订阅邮箱收到的 Stripe 邮件里。","panel.render.manageSubscriptionCancelPaymentMethodInvoices":"管理订阅(取消/换卡/发票)","panel.render.refreshLicense":"刷新授权","panel.render.afterPaymentOrWhileYourSubscription":"付款成功或订阅仍有效时,点击刷新即可恢复最新状态。仅此按钮会联系授权服务。","panel.render.keepUsingWriteFeatures":"解锁三家工具、项目总览与配置开关","panel.render.subscribeToWingman":"订阅 Wingman","panel.render.refreshing":"刷新中…","panel.render.freeTrial":"免费试用","panel.render.licenseStatus":"授权状态","panel.render.freeTrialEnded":"免费试用已结束","panel.render.dayFreeTrial":"30 天免费试用","panel.render.currentStatus":"当前状态","panel.render.subscriptionManagement":"订阅管理","panel.render.lineSuffix":"行","panel.render.removeThisLineFromThisSubmission":"删掉这一行(只影响本次发送)","panel.render.nothingToSendMOCKDemoData":"没有可发送的内容(MOCK 演示数据不外发;删光了也一样不发)","panel.render.sampleExceedsKBRemoveSomeContent":"样本超过 256 KB 上限,删减后才能发送","panel.render.shareASampleToHelpWingman":"分享样本帮助 Wingman 适配更多真实环境。下面就是将要发送的全部内容:逐行检查,不想发的行点 ✕ 删掉;点「发送」才会发出,关闭则什么都不发。样本不含任何账号或设备标识,服务端也不记录 IP。","panel.render.contentToSend":"将发送的内容 ·","panel.render.closeWithoutSending":"关闭(不发送)","panel.render.send":"发送","panel.render.sendingPOST":"发送中…(POST","panel.render.sentSamplesAreUsedOnlyTo":"已发送。样本只用于适配真实环境,90 天后在服务端自动过期。","panel.render.sendFailed":"发送失败","panel.render.nothingWasSentYouCanShare":"没有发出任何内容;稍后可重新分享。","panel.render.noSessionId":"(无 session_id)","panel.render.eventOriginalHookEventName":"事件:{p0}(hook_event_name 原文)","panel.render.timeReceiverReceivedAt":"时间 = receiver 收到时刻 received_at:{p0}","panel.render.mockInjectedDevDemoReplayNot":"MOCK:dev 演示重放注入,非真实 harness 推送(增补条款 10)","panel.render.wiringConfigurationComplete":"接线配置完整 · {p0}","panel.render.eventsReceived":"已收到事件","panel.render.eventsNotVerified":"事件未验证","panel.render.notConnectedRun":"未接线 —— 运行","panel.render.restartThisHarnessAfterConnectingIt":"接线后重启一次该 harness(它只在启动时读 hooks 配置;Codex 首次还需在其界面信任 hook),其 hook 事件才会出现在下方流里(当前流内是别家事件)","panel.render.codexHooksConfigurationDetectedButNo":"○ 检测到 Codex hooks 配置,但尚未收到事件 —— 在 Codex 输入","panel.render.confirmWingmanIsTrustedAndEnabled":",确认 Wingman 为 Trusted 且 Enabled;若当前任务仍无事件,完整退出并重开 Codex 后新建任务验证","panel.render.notConnectedIndicator":"○ 未接线 —— 运行","panel.render.toConnectThisHarnessSHooks":"把该 harness 的 hooks 指到本面板(幂等、可 uninstall 恢复),然后重启一次该 harness 生效——它只在启动时读 hooks 配置;接线前这里不显示任何数据","panel.render.codexHooksConfigurationDetectedButNoEvents":"○ 检测到 Codex hooks 配置,但尚未收到事件 —— 这还不能证明已连通。请在 Codex 输入","panel.render.theNarrativeOverviewAlreadyHasA":" —— narrative 概览已有该 Harness 会话","panel.render.liveEventsWillAppearAfterProduces":" —— 在 {p0} 产生事件后这里才会显示实况流","panel.render.pushWiringConfigurationDetectedButNo":"○ 检测到接线配置(推送),尚未收到事件 —— 在","panel.render.producesAnEvent":"产生事件后这里才会显示实况流","panel.render.localDemoWhenEventSourceCannotConnect":"EventSource 连不上(dev 模式无 SSE 端点)时的本地演示:以 200ms 间隔重放 fixtures 的 cc 事件序列,注入事件全部带 MOCK 徽章","panel.render.replayFixturesDemoMOCK":"重放 fixtures 演示 · MOCK","panel.render.live":"实况","panel.render.getApiEventsSSEConnectionStatus":"GET /api/events(SSE)连接状态;断线由 EventSource 自动重连","panel.render.previewTheCompleteEventStreamBefore":"打开预览弹层:先看到将发送的完整事件流,可逐行删,点「发送」才会发出;关闭 = 什么都不发","panel.render.shareEventSample":"分享事件样本","panel.render.recentActivity":"最近活动:{p0}","panel.render.notObserved":"(未观察到)","panel.render.endedSessionEndOrNoEventsFor":"已结束(SessionEnd,或回合结束信号后 10 分钟无事件或记录内容活动)","panel.render.inProgress":"进行中","panel.render.waitingForYouAnOpenPermission":"等待:有未决的权限请求/通知","panel.render.discoveredOnStartup":"由启动扫描登记,尚无 hook 事件","panel.render.newActivitySinceLastViewed":"有新活动(上次查看后)","panel.render.sinceWingmanStarted":"Wingman 启动(","panel.render.noHookEventsReceivedFrom":")后尚未收到","panel.render.sessionsAreCreatedFromEventsOnly":"的 hook 事件;启动时只登记最近 30 分钟内有更新的会话记录,更早的不恢复。","panel.render.sessionsAreCreatedFromEventsOnlyDsh":"的 hook 事件;会话只由事件建立,重启不恢复历史。","panel.render.legacyHomeLevelWiringCouldNot":"旧版家目录层接线无法自动解除,请手动解线后重新接线:","panel.render.legacyHomeLevelWiringAndEarlier":"旧版(0.6.0 及更早)家目录层接线已解除,避免 dsh 无法启动;重新接线:","panel.render.evicted":"已驱逐","panel.render.feedbackSignalsNotConnected":"反馈信号未接线:","panel.render.feedbackSignalsUnavailable":"反馈信号不可用","panel.render.previewThePlanFilesTimingAnd":"打开 M3 plan 弹窗:先看方案(写哪些文件/生效时机/备份),确认才写入","panel.render.viewPlan":"看方案","panel.render.dismissThisSuggestionForThisSession":"本 session 不再提示这条(内存态,重开面板恢复)","panel.render.dismiss":"不再提示","panel.render.firstInProgressTodoSourceTaskCreate":"第一条进行中 todo(来源:transcript 的 TaskCreate/TaskUpdate 事件)","panel.render.latestUserPromptSummaryNoIn":"最新用户提示摘要(本会话暂无进行中 todo)","panel.render.openEventAt":"未决 {p0} 事件,发生于 {p1}","panel.render.waitingForYou":"等待:","panel.render.totalTokensThisTurnReportedBy":"本轮总 token(harness 自报) = {p0}","panel.render.contextThisTurnReportedByHarness":"本轮 context(harness 自报) = {p0}","panel.render.cumulativeInputThisTurnDifferenceIn":"本轮累计 input(harness 累计值差分) = {p0}","panel.render.estimatedFromTheBuiltInPrice":"$ 按内置价目表换算(约)","panel.render.thisTurn":"本轮","panel.render.current":"正在:","panel.render.usage":"消耗:","panel.render.agentSOwnWordsAssistantText":"agent 自述原话(transcript assistant 文本块);引用,不生成","panel.render.noTaskInformationInThisSession":"(本会话暂无任务信息)","panel.render.sessionsLabelProjectDataNotReady":"sessions[].label(项目载荷未就绪)","panel.render.noTaskTitleProvided":"尚未提供任务标题","panel.render.sourcePrefix":"来源:","panel.render.sourceTaskWorkflowFeedbackReason":"来源:taskWorkflow.feedback.reason","panel.render.requestsNotObservable":"看不到请求:","panel.render.activityResumed":";检测到活动恢复","panel.render.sourceTaskWorkflowFeedbackState":"来源:taskWorkflow.feedback.state;","panel.render.noOpenRequestObserved":"当前未观察到待处理请求","panel.render.needYou":"要不要我","panel.render.explicitFeedbackRequestReceived":"收到显式反馈请求","panel.render.sourceTaskWorkflowFeedbackSince":"来源:taskWorkflow.feedback.since","panel.render.source":"来源","panel.render.backToSession":"回到会话","panel.render.goal":"目标","panel.render.latestInstruction":"最新指令","panel.render.parallelCurrentPoint":"当前点(并行)","panel.render.currentPoint":"当前点","panel.render.sourceNeitherTaskWorkflowGoalNorLatestInstruction":"来源:taskWorkflow.goal / latestInstruction 均未提供","panel.render.goalUnavailable":"目标不可用","panel.render.agentSDeclaredPlan":"Agent 声明计划","panel.render.noStructuredPlan":"Agent 尚未提供结构化计划","panel.render.notObservedValue":"未观察到","panel.render.sessionModel":"(本会话模型 {p0})","panel.render.sessionModelImpactUnknown":"(本会话模型 {p0},是否受影响未知)","panel.render.orInstallThePlanProtocol":";或安装 Plan Protocol:{p0}","panel.render.projectPlaceholder":"<项目>","panel.render.sinceClaudeCodeDoesNotProvide":"Claude Code {p0} 自 {p1} 起对 Opus 4.8 / Sonnet 5 / Fable 5 / Mythos 5 及更新模型默认不提供计划工具{p2}。启用:{p3}{p4}","panel.render.sourceTranscriptVersionMessageModelClaude":"来源:transcript version / message.model;Claude Code CHANGELOG 2.1.233","panel.render.ifThisSettingIsAlreadyEnabled":"。若已设置该开关,则 Agent 只是没有建计划。","panel.render.planSourceUnavailable":"计划来源不可用 ·","panel.render.sourceTaskWorkflowPlanForInstruction":"来源:taskWorkflow.plan.forInstruction","panel.render.noPlanDeclaredForThisInstruction":"本条指令尚未声明计划","panel.render.previousInstructionSPlanRevision":"上一条指令的计划 · revision","panel.render.markedCompleteByAgent":"Agent 已声明完成","panel.render.previousInstructionSPlan":" · 上一条指令的计划","panel.render.notProvided":"未提供","panel.render.verificationFactsNotProvided":"验证事实未提供","panel.render.agentCompleteChecksFailures":"{p0} · {p1} 项检查,{p2} 项失败 · {p3}","panel.render.yes":"是","panel.render.no":"否","panel.render.acceptedByYou":"你已验收","panel.render.notAccepted":"未验收","panel.render.acceptanceUnavailable":"验收不可用 · {p0}","panel.render.noRecentSteps":"尚无最近步骤","panel.render.executionEvidence":"执行证据","panel.render.sourceTaskWorkflowExecutionEvidenceCountFailureCount":"来源:taskWorkflow.execution.evidenceCount / failureCount","panel.render.evidenceCountSeparator":"条 ·","panel.render.failed":"失败","panel.render.plan":"计划","panel.render.verification":"验证证据","panel.render.taskworkflowVerificationAgentStructuredPlanStep":"taskWorkflow.verification;Agent 结构化计划步骤状态;taskWorkflow.plan.forInstruction;Harness tool_result(is_error / exit_code);本机 task-overlay.json accepted","panel.render.recentSteps":"最近步骤","panel.render.transcriptHookToolEventThreeMost":"transcript / hook tool event;按 ts 倒序取前三条","panel.render.failureSuffix":" · 失败","panel.render.sourceTranscriptHookToolEventOriginal":"来源:transcript / hook tool event;原始参数:","panel.render.noWingmanPlanMd":"没有 .wingman/plan.md","panel.render.projectDataUnavailable":"项目载荷不可用","panel.render.openProject":"打开项目","panel.render.thisSessionAttachedTo":"本会话:归属","panel.render.thisSessionUnattached":"本会话:未关联(","panel.render.copyInstallCommand":"复制安装命令","panel.render.currentPointPrefix":"项目当前点:","panel.render.markedCompleteByAgentNoThe":"Agent 未声明完成(上一条指令的计划已完成,本条指令尚未声明计划)","panel.render.agentCompletionStatus":"Agent 未声明完成","panel.render.agentStructuredPlanStepStatesTaskWorkflow":"Agent 结构化计划步骤状态;taskWorkflow.plan.forInstruction","panel.render.agentStructuredPlanStepStates":"Agent 结构化计划步骤状态","panel.render.noObservableChecks":"无可观察检查","panel.render.checksRunsFailures":"{p0} 项检查,{p1} 项失败","panel.render.currentStepFailuresRuns":" · 当前步骤 {p1} 项检查,{p0} 项失败","panel.render.latestFailure":" · 最近失败:{p0}{p1}","panel.render.markedByYouAt":"你已验收 · {p0}","panel.render.waitingForYourReply":"等待你回复","panel.render.genericNotificationTip":"Claude Code 通知不携带问题内容,请回到会话查看","panel.render.notMarked":"未验收","panel.render.unavailable":"不可用 · {p0}","panel.render.undoAcceptance":"撤销验收","panel.render.markAccepted":"标记验收","panel.render.sourceHarnessToolResultIsError":"来源:Harness tool_result(is_error / exit_code)","panel.render.sourceLocalTaskOverlayJsonAccepted":"来源:本机 task-overlay.json accepted","panel.render.other":"其他","panel.render.executionAttributedTo":"执行归属:","panel.render.noExecutionEvidenceYet":"○ 尚无执行证据","panel.render.tasks":"任务","panel.render.controls":"控制","panel.render.billing":"用量","panel.render.turns":"{p0} 轮","panel.render.approx":" · 约 {p0}","panel.render.subagent":"子 agent","panel.render.tool":"工具:{p0}{p1}{p2}","panel.render.started":`
101
101
  开始:{p0}`,"panel.render.approximateTokensToolInputResultBytes":`
102
102
  约 token = 工具输入+结果字节 ÷ 3.5(估算)`,"panel.render.waited":"等了 {p0}","panel.render.waiting":" · 等待中…","panel.render.eventStartEndObservedThroughHooks":"{p0} 事件起止(hook 层观察)","panel.render.startedAt":"开始:{p0}","panel.render.resolvedEvent":"解除:{p0}(事件 {p1})","panel.render.notYetResolved":"尚未解除","panel.render.phaseGroupingToolTypeRulesDocumented":"阶段归类:工具类型规则(规则表公开);点击{p0}步骤{p1}","panel.render.collapse":"收起","panel.render.expand":"展开","panel.render.approximateTokensSumOfStepByte":`
103
- 约 token = 节点内步骤字节估算之和`,"panel.render.steps":"步","panel.render.stepsIncludeASubagentAttributionIs":"步骤归属含子代理({p0});归属 = 时间窗 + Agent 跨度推断,归不准会进「其他」","panel.render.stepsAttributedToTheMainAgent":"步骤归属:主 agent(时间窗推断)","panel.render.stepsThatCannotBeAssignedTo":"归不到具体 todo 的步骤进「其他」桶(无时间戳/无进行中 todo/多任务并行归不准);推断规则如实降级,不硬塞","panel.render.otherUnassignedSteps":"其他(归不准的步骤)","panel.render.sourceMarkdownChecklistInAssistantText":"来源:assistant 文本里的 markdown 勾选清单(- [ ] / - [x]);会话没用工具清单时的降级展示,工具清单一旦出现立即让位","panel.render.textChecklistWrittenByAgent":"文本清单(agent 手写)","panel.render.thisHarnessDoesNotProduceA":"该 harness 不产生任务清单 —— 以下为执行轨迹","panel.render.thisSessionDidNotUseA":"本次会话未使用任务清单 —— 以下为执行轨迹","panel.render.noNarrativeDataYetConnect":"○ 暂无叙事数据 —— 接线(","panel.render.thenRestartTheHarnessAndRun":",接线后重启该 harness 生效)并跑一轮对话后,这里按任务展示执行轨迹","panel.render.rawHookEventStreamTheLive":"逐条 hook 事件原始流(0.2 的实况视图);默认折叠","panel.render.rawEvents":"原始事件","panel.render.eventsReceivedForThisSessionBut":"○ 已收到本会话事件,但尚未解析到 Codex usage 数据 —— 这不代表零消耗,此处不显示估算值","panel.render.noCodexSessionUsageDataReceived":"○ 尚未收到 Codex session/usage 数据 —— 请先在 Codex 输入","panel.render.andConfirmWingmanIsTrustedAnd":"确认 Wingman 为 Trusted 且 Enabled","panel.render.noReadableUsageDataReceivedFor":"○ 本会话尚未收到可读的 usage 数据 —— 有精确来源后才会逐轮列出,此处不作估算","panel.render.usagePerTurnExactCodexToken":"每轮消耗 · Codex token_count 自报精确值;本地事件不提供订阅美元账单","panel.render.usagePerTurnThreeExactUsage":"每轮消耗 · usage 三字段为 harness 自报精确值","panel.render.reasoningIncludedInOut":" · reasoning {p0}(含在 out 内)","panel.render.originalUsageExactReportedByHarness":"usage 原文(harness 自报,精确):","panel.render.cumulativeInputThisTurnDifferenceBetween":"本轮累计 input(累计值相邻 turn 差) {p0} · 非缓存 {p1} · cache_write 字段 {p2} · 缓存读 {p3} · output {p4}{p5}","panel.render.inputCachedWritesCachedReadsOutput":"input {p0} · 缓存写 {p1} · 缓存读 {p2} · output {p3}{p4}","panel.render.contextThisTurnSumOfThe":"本轮 context = 三个 input 字段之和 = {p0}","panel.render.totalTokensThisTurnReported":"本轮总 token(自报) = {p0}","panel.render.turnStateInterruptedUsageReportedBefore":"本轮状态 = 中断(已保留中断前自报消耗)","panel.render.turnStateOpenShowingUsageReported":"本轮状态 = 未收口(仅显示目前已自报消耗)","panel.render.actualChatGPTCodexSubscriptionChargesAre":"$:ChatGPT/Codex 订阅实际账单不在本地事件中,不换算","panel.render.thisModelIsAbsentFromThe":"$:该模型不在内置价目表,不换算(宁缺勿编)","panel.render.estimatedFromTheBuiltInPriceTable":"$ 按内置价目表换算(缓存读 ×0.1、缓存写 ×1.25/×2),标 ≈","panel.render.interrupted":"中断","panel.render.open":"未收口","panel.render.cumulativeInUncachedCacheWriteCached":"累计 in {p0} · 非缓存 {p1} · cache_write {p2} · 缓读 {p3} · out {p4}","panel.render.inCachedWritesCachedReadsOut":"in {p0} · 缓写 {p1} · 缓读 {p2} · out {p3}","panel.render.turnTotal":"本轮合计 —","panel.render.turnTotalValue":"本轮合计 {p0}","panel.render.cumulativeInputThisTurn":"本轮累计 input {p0}","panel.render.reportProblem":"报告问题","panel.render.clickingSendsAllowlistedReproductionHintsTo":"点击会向 Tally 发送白名单复现提示,服务商也可能处理连接信息;问题正文和截图仅在你提交时发送。请勿提交 prompt、源码、路径、账号信息或凭证。","panel.render.pending":"待做","panel.render.markedCompleteByAgentUser":"Agent/用户标记完成","panel.render.cancelled":"已取消","panel.render.checkpoint":"检查点","panel.render.protocolNotInstalled":"协议未安装","panel.render.protocolInstalled":"协议已安装","panel.render.installedButNotLoaded":"已安装但未加载","panel.render.planAlreadyExists":"计划已存在","panel.render.thisSessionHasWrittenAPlan":"本会话已写计划","panel.render.dshHasNoUserLevelInstruction":"dsh 没有用户级指令文件","panel.render.sourceGETApiAnatomyPlanProtocolUser":"来源:GET /api/anatomy {p0}.planProtocol.user;{p1}","panel.render.takesEffectInTheNextNew":";下一个新会话生效","panel.render.planProtocolInstalledForYourAccount":"计划协议 · 用户级已装","panel.render.protocolVUpdateAvailable":"协议 v1,可更新","panel.render.notInstalled":"未装","panel.render.modified":"已被修改","panel.render.unsupported":"不支持","panel.render.dshHasNoUserLevelInstructionFile":"dsh 没有用户级指令文件,请按项目安装项目级协议","panel.render.replaceLtProjectGtWithThe":",运行前将 &lt;项目&gt; 替换为项目路径","panel.render.copyProjectInstallCommand":"复制项目级安装命令","panel.render.backsUpBeforeUpdatingPreservesContent":"计划只为 Wingman 提供计划展示功能,不改写 harness 行为或任何代码。更新前先备份,下一个新会话生效。","panel.render.theProtocolBlockHasBeenModified":"协议块已被修改;保留现有内容,请先处理修改后再重新安装。","panel.render.afterConfirmationInstallsInTheUser":"计划只为 Wingman 提供计划展示功能,不改写 harness 行为或任何代码。","panel.render.reinstall":"重新安装","panel.render.installAction":"一键安装","panel.render.planProtocol":"计划协议:{p0}","panel.render.protocolUpdateSuffix":"· 协议 v1,可更新","panel.render.scopeUserLevelProtocolCommandVersion":"{p0};安装范围来自用户级协议;命令版本:GET /api/version","panel.render.installOnceToRequestPlansIn":"计划只用于 Wingman 展示,不改写 harness 行为或代码。","panel.render.projectCommandVersionGETApiVersion":"{p0} · {p1};项目:{p2};命令版本:GET /api/version","panel.render.toBeFilledIn":"待用户填写","panel.render.wingmanVersionUnknownTheInstallCommand":"Wingman 版本未知,安装命令未钉版本","panel.render.theDshInstructionLoadingPluginIs":"dsh 指令加载插件已禁用,见控制页开关","panel.render.sessionPlan":"会话计划 ·","panel.render.noStructuredPlanProvided":"未提供结构化计划","panel.render.unavailablePrefix":"不可用:","panel.render.sourceSessionPlanForInstruction":"来源:sessionPlan.forInstruction","panel.render.sessionPlanRevisionAgentMarkedComplete":"会话计划 revision {p0} · Agent 标记 {p1}/{p2} 完成","panel.render.sessionPlanUnavailable":"会话计划不可用:{p0}","panel.render.dataTipSourceSessionPlanForInstruction":' data-tip="来源:sessionPlan.forInstruction"',"panel.render.timestampSourceHookEvent":"绝对时间:{p0} · 来源:hook 事件","panel.render.recentActivityPrefix":"最近活动:","panel.render.needsYou":"需要你:","panel.render.checksFailuresRuns":"检查 {p0} 次失败 / {p1} 次运行","panel.render.accepted":"已验收 {p0}","panel.render.acceptanceUnavailableReason":"验收不可用:{p0}","panel.render.notLinkedToAStep":"未关联到步骤","panel.render.linkedTo":"归属:{p0}","panel.render.pin":"置顶","panel.render.commandCopied":"命令已复制","panel.render.couldNotCopyCommand":"命令复制失败","panel.render.thisHarnessHasNoCommandTo":"该 Harness 无按会话恢复命令","panel.render.noReturnAppSelected":"未设置回跳应用","panel.render.switchedTo":"已切到 {p0}","panel.render.couldNotSwitch":"切换失败:{p0}","panel.render.dshHasNoCommandToResume":" · dsh 没有按会话恢复的命令,请回到原终端继续","panel.render.sourceClipboardWriteResultResponseOr":"来源:剪贴板写入结果{p0};{p1} 返回或请求失败;Harness 恢复命令能力","panel.render.thisHarnessHasNoResumeCommand":"(该 Harness 无恢复命令,未写入)","panel.render.taskCardMenu":"任务卡菜单","panel.render.copy":"复制","panel.render.rename":"重命名","panel.render.clearToRestoreTheAutomaticTitle":"清空后恢复自动标题","panel.render.unpin":"取消置顶","panel.render.unhide":"取消隐藏","panel.render.hide":"隐藏","panel.render.hidden":"已隐藏","panel.render.cards":"张 ·","panel.render.show":"显示","panel.render.planAcceptance":"计划验收:","panel.render.cardsHiddenByFilters":"张卡被筛选隐藏","panel.render.sourceWingmanPlanMdNodesSubtree":"来源:.wingman/plan.md nodes; 子树叶节点数量","panel.render.expandChildSteps":"展开子步骤 (","panel.render.noSessionObserved":"没有观察到会话","panel.render.noTaskCardsMatchTheFilters":"没有符合筛选的任务卡(","panel.render.filteredOut":"张被筛掉)","panel.render.fileTimestamp":"文件时间 {p0}","panel.render.lastWriter":"最近写入者:{p0} {p1} · {p2}","panel.render.lastWriterExternalEditNotObserved":"最近写入者:外部编辑/未观察到","panel.render.parentChildConflicts":"父子矛盾 {p0} 处","panel.render.inProgressStepsWithoutAnActive":"进行中步骤下无活跃会话 {p0} 处","panel.render.otherFacts":"其他 {p0} 条","panel.render.pathSource":"{p0} · 来源:{p1}","panel.render.waitingForYourDecision":"等待你的决定","panel.render.requests":"条请求","panel.render.openSession":"查看会话","panel.render.thePlanNeedsYourReview":"计划需要你检查","panel.render.goToNode":"定位节点","panel.render.projectInProgress":"正在进行","panel.render.noPlanFile":"没有计划文件","panel.render.planUnreadable":"计划不可读","panel.render.cannotDetermineWhetherYouAreNeeded":"无法确认是否需要你","panel.render.copyInstallCommandTip":"{p0} · 复制安装命令","panel.render.howToProvideAPlan":"如何提供计划","panel.render.createAtTheProjectRoot":"在项目根创建","panel.render.withTheProjectTitleGoalAnd":",填写项目标题、目标和步骤;手写一份即可生效。","panel.render.projectName":"# 项目名称","panel.render.goalProjectGoal":"目标: 项目目标","panel.render.currentTask":"- [/] 当前任务","panel.render.pendingTask":"- [ ] 待做任务","panel.render.connectFeedbackSignals":"连接反馈信号 ·","panel.render.notEnoughInformation":"信息不足:","panel.render.cannotReadPlanFile":"计划文件读不了","panel.render.cannotSeeRequests":"看不到请求","panel.render.projectEnded":"已结束","panel.render.sourceGETApiProjectsRequestOr":"来源:GET /api/projects 请求或载荷校验失败","panel.render.projectRefreshFailedShowingThePrevious":"项目刷新失败,当前显示上次载荷;行动状态可能已变化","panel.render.noProjectGoalProvided":"尚未提供项目目标","panel.render.noSessionActivityTimestampObserved":"尚未观察到会话活动时间","panel.render.noActiveSessionThisProjectS":"当前无活跃会话(此项目的会话已不在面板)","panel.render.noActiveSessionWingmanHasReceived":"当前无活跃会话(Wingman 启动后尚未收到此项目的事件)","panel.render.timestamp":"绝对时间:","panel.render.sourceSeparator":"· 来源:","panel.render.titleSource":"· 标题来源:","panel.render.sourcePlanAvailabilityReasonLine":"来源:plan.availability / reason / line","panel.render.planUnavailable":"计划不可用:","panel.render.line":" · 第 {p0} 行","panel.render.sourceSessionsFeedbackState":"来源:sessions[].feedback.state","panel.render.feedbackSignalsAreNotConnectedOr":"反馈信号未接线或不可用,无法确认是否需要你","panel.render.viewPlanProtocol":"· 查看计划协议","panel.render.currentBranch":"所在分支","panel.render.moreBranches":"还有 {count} 条分支","panel.render.oneMoreBranch":"还有 {count} 条分支","panel.render.branchCurrentPoints":"{count} 个当前点","panel.render.branchCurrentPoint":"{count} 个当前点","panel.render.branchCurrentPointsSource":"来源:currentPoints 中属于该顶层节点子树的当前点","panel.render.noCurrentBranchProvided":"尚未提供所在分支","panel.render.currentTaskLabel":"当前任务","panel.render.morePoints":"还有 {count} 项","panel.render.oneMorePoint":"还有 {count} 项","panel.render.sourceFirstScreenCurrentPointsLength":"来源:firstScreen.currentPoints.length","panel.render.parallel":"并行","panel.render.thePlanHasNoStepMarked":"计划未标记进行中步骤","panel.render.recentActivityLabel":"最近活动","panel.render.thePlanHasNoSteps":"计划没有步骤","panel.render.planTree":"计划树","panel.render.fullRecord":"完整记录","panel.render.completedMilestones":"已完成 {count} 项 · 最近:{name}","panel.render.completedMilestonesSource":"来源:plan.nodes 中已完成或已取消的顶层节点;最近项按文档顺序","panel.render.sessionsNotLinkedToAStep":"未关联到步骤的会话","panel.render.sourcePlanLastGood":"来源:plan.lastGood","panel.render.lastReadableVersion":"上次可解析版本","panel.render.projectSessions":"项目会话","panel.render.sourceWingmanPlanMdLeafCounts":"来源:.wingman/plan.md leaf counts; counts.pending / inProgress / completed / cancelled / checkpoint","panel.render.agentUserMarksPending":"Agent/用户标记 · 待做","panel.render.inProgressCount":"· 进行中","panel.render.complete":"· 完成","panel.render.cancelledCount":"· 取消","panel.render.checkpointCount":"· 检查点","panel.render.sourceCompletionLabel":"来源:completionLabel","panel.render.ignoredLine":"第 {p0} 行:{p1}","panel.render.ignored":"· 忽略","panel.render.sourcePlanHigherPlanPaths":"来源:plan.higherPlanPaths","panel.render.planFilesAlsoExistAbove":"上层还存在计划文件:","panel.render.sourceSessionsUnattachedReason":"来源:sessions[].unattachedReason","panel.render.notLinked":"· 未关联:","panel.render.sourcePlanLastGoodRevisionMtime":"来源:plan.lastGood.revision / mtime","panel.render.lastReadableVersionRevision":"上次可解析版本 · revision","panel.render.connectionsAndProtocolPlanSourceAnd":"连接与协议 · 计划来源与状态","panel.render.sourceProjectRoot":"来源:project.root","panel.render.sourceRevisionMtimeLastWriter":"来源:revision / mtime / lastWriter","panel.render.all":"全部","panel.render.waitingForYouLabel":"等待","panel.render.turnEnded":"回合结束","panel.render.turnEndedSource":"{harness} Stop 或主记录回合结束信号时刻","panel.render.clickToAcknowledge":"点击确认提醒","panel.render.additionalAttention":"另有:{events}","panel.render.ended":"已结束","panel.render.status":"状态","panel.render.dataTipSourceGETApiProjects":' data-tip="来源:GET /api/projects 请求与载荷校验"',"panel.render.projectRefreshFailedProjectDataIs":"项目刷新失败,项目载荷尚不可用","panel.render.projectDataIsUnavailable":"项目载荷尚不可用","panel.render.dismissProjectMemoryNotice":"关闭项目记忆提示","panel.render.projectRefreshFailedShowingThePreviousResponse":"项目刷新失败,当前显示上次载荷","panel.render.noSessionWithAWorkingDirectory":"尚未观察到带工作目录的会话","panel.render.mockDemoData":"MOCK 演示数据","panel.render.projectPlansAcrossHarnessesLocalAnd":"跨 Harness 项目计划 · 本机只读","panel.render.scannedAt":"{p0}{p1} · 扫描于 {p2}","panel.render.collapseArrow":"收起 ▴"},ns={"cli.server.requestFailed":"[wingman] 请求处理失败:{error}","cli.server.refreshFromPanel":"刷新授权必须由 Wingman 面板中的按钮触发","cli.server.harnessQuery":"harness 需要 {ids}(?harness=<id>),得到 {harness}","cli.server.anatomyHome":"anatomy 需要显式 homeDir","cli.server.detectFailed":"[wingman] {harness} detect 失败,已跳过:{error}","cli.server.scanFailed":"[wingman] {harness} 扫描失败,降级显示:{error}","cli.server.configFailed":"读取配置失败:{error}","cli.server.jsonBody":"请求体必须是合法 JSON","cli.server.harnessRequired":"harness 需要 {ids},得到 {harness}","cli.server.actionShape":'action 需要 {kind:"toggle", itemId, enable} 形状',"cli.server.fixturesAction":"fixtures 模式只读:动作只到 plan 为止,不写任何文件","cli.server.subscriptionRequired":"需要试用或有效订阅才能写入配置(免费层只显示一个工具)","cli.server.mobileRequiresLicense":"需要试用或有效订阅才能配对手机(免费层只显示一个工具)","cli.server.fixturesMobile":"fixtures 模式只读:不配对或解除配对手机","cli.server.planShape":"plan 需要 ActionPlan 对象(由 /api/action/plan 产出)","cli.server.fixturesProtocol":"fixtures 模式只读:不预览或写入用户级协议","cli.server.dshUserUnsupported":"unsupported: dsh 无用户级指令文件,请按项目安装计划协议","cli.server.protocolHarness":"用户级计划协议 harness 需要 cc|codex","cli.server.protocolHome":"用户级计划协议需要显式 homeDir","cli.server.backupPreview":"~/.wingman/backups/<ISO 时间戳>(重名追加 -N)","cli.server.fixturesReturn":"fixtures 模式只读:不保存回跳设置或激活应用","cli.server.returnHome":"回跳设置缺少 homeDir","cli.server.bundleShape":"请求只接受 bundlePath 字符串","cli.server.returnMissing":"未检测到该回跳应用","cli.server.openTimeout":"应用激活超时","cli.server.openFailed":"应用激活失败","cli.server.fixturesOverlay":"fixtures 模式只读:不写任务卡 overlay","cli.server.overlayShape":"会话请求需要合法 harness、非空 sessionId 与 title/pinned/hidden/accepted/archived 补丁;项目请求需要非空 root 与 pinned/order/hidden/archived 补丁,order 为非负整数","cli.server.overlayHome":"任务卡 overlay 缺少 homeDir","cli.server.licenseRead":"license 文件超过 64KB 上限或读取失败","cli.server.panelBuild":"面板未构建:请先运行 pnpm --filter @wingman/panel build,再刷新本页。","cli.server.settingsRead":"回跳设置无法读取;请人工检查 settings.json","cli.server.settingsFormat":"回跳设置无法解析或版本未知,拒绝覆盖;请人工检查 settings.json","cli.server.settingsWrite":"回跳设置备份或写入失败,未覆盖设置;请人工检查 settings.json","cli.server.localeInvalid":"locale 只接受已注册语言标签","cli.server.settingsInvalid":"设置只接受已注册的 locale、合法的 island 位置与大小或已知的 freeHarness","cli.server.freeHarnessNotDetected":"尚未探测到这个工具,不能设为免费工具。","cli.server.freeHarnessCooldown":"免费工具选定后 7 天内不能更换,可于 {switchableAt} 更换。","cli.server.fixturesSettings":"fixtures 模式只读:不保存语言设置","cli.server.settingsHome":"语言设置缺少 homeDir"},ts={"narrative.waitedPermission":"已等待 {duration}:等待授权","narrative.waitedPermissionDetail":"已等待 {duration}:等待授权:{reason}","narrative.waitedResponse":"已等待 {duration}:等待回应","narrative.waitedResponseDetail":"已等待 {duration}:等待回应:{reason}","narrative.suggestionUnused":"{server} 本 session 未使用,可关","narrative.suggestionUnusedExact":"{server} 本 session 未使用,关掉可省 {tokens} tok(常驻估算)","narrative.suggestionUnusedEstimated":"{server} 本 session 未使用,关掉可省 约 {tokens} tok(常驻估算)"},ca={tag:"zh",nativeName:"中文",messages:{...es,...Xr,...zr,...Zr,...Yr,...Jr,...Qr,...ns,...ts}},dt=[ca,Kr],ct=dt.map(({tag:e,nativeName:n})=>({tag:e,nativeName:n}));let pt="zh";function oe(){return ct}function Me(){return pt}function ze(e){if(!ct.some(n=>n.tag===e))throw new Error(`Unsupported locale: ${e}`);pt=e}function a(e,n={}){const t=dt.find(({tag:r})=>r===pt)?.messages[e];if(t===void 0)throw new Error(`Missing translation: ${e}`);return t.replace(/\{(\w+)\}/g,(r,s)=>Object.hasOwn(n,s)?String(n[s]):r)}function yn(e){return e===null||typeof e!="object"||Array.isArray(e)||!Object.hasOwn(e,"key")||!("key"in e)||typeof e.key!="string"||!Object.hasOwn(ca.messages,e.key)?!1:!("params"in e)||e.params===void 0?!0:e.params===null||typeof e.params!="object"||Array.isArray(e.params)?!1:Object.values(e.params).every(n=>typeof n=="string"||typeof n=="number"&&Number.isFinite(n))}function as(e){const n=e?.toLowerCase().replaceAll("_","-");return ct.find(({tag:t})=>n===t.toLowerCase()||n?.startsWith(`${t.toLowerCase()}-`))?.tag}const Fe=["base","rules","skills","tools","gates","history"],pa={get base(){return a("panel.format.baseInstructions")},get rules(){return a("panel.format.yourRules")},get skills(){return a("panel.format.skills")},get tools(){return a("panel.format.toolDefinitions")},get gates(){return a("panel.format.gateHooks")},get history(){return a("panel.format.conversationHistory")}},un={base:"#3987e5",rules:"#d95926",skills:"#199e70",tools:"#c98500",gates:"#898781",history:"#d55181"},R={cc:"Claude Code",codex:"Codex",dsh:"dsh"},Ve={cc:{get base(){return a("panel.format.builtInSystemPrompt")},rules:"CLAUDE.md · rules/*.md",skills:"Skills · SKILL.md",tools:"MCP servers",gates:"hooks · permissions",history:"projects/*.jsonl"},codex:{get base(){return a("panel.format.builtInInstructions")},rules:"AGENTS.md · config.toml",skills:"plugins",tools:"mcp_servers",gates:"approval_policy · hooks",history:"history.jsonl"},dsh:{get base(){return a("panel.format.corePluginEverythingIsAPlugin")},rules:"profile · patch",get skills(){return a("panel.format.skillPlugin")},get tools(){return a("panel.format.toolPlugins")},get gates(){return a("panel.format.approvalPermissionPlugins")},get history(){return a("panel.format.sessionLogPlugin")}}};function U(e){return e<1e3?String(e):`${(Math.round(e/100)/10).toFixed(1)}k`}function me(e){if(!e)return"—";const n=U(e.value);return e.kind==="estimate"?a("panel.format.about",{p0:n}):n}function rs(e){return e.onTriggerTokens?a("panel.format.residentAfterTrigger",{p0:me(e.tokens),p1:me(e.onTriggerTokens)}):me(e.tokens)}function ua(e){let n=0,t=!1,r="exact";for(const s of e)!s.enabled||!s.tokens||(n+=s.tokens.value,t=!0,s.tokens.kind==="estimate"&&(r="estimate"));return t?{kind:r,value:n}:void 0}function ss(e){let n=0,t=!1,r="exact";for(const s of Fe){const i=ua(e.slots[s]??[]);i&&(n+=i.value,t=!0,i.kind==="estimate"&&(r="estimate"))}return t?{kind:r,value:n}:void 0}function os(e){return a(e==="full"?"panel.format.fullPluginApi":e==="push"?"panel.format.pushHooks":"panel.format.notWired")}function fn(e){return`${e.slice(0,16).replace("T"," ")} UTC`}function fa(e){const n=[];return n.push(e.nativePath?a("panel.format.file",{p0:e.nativePath}):a("panel.format.noFileSource",{p0:e.source})),e.__source_note&&n.push(e.__source_note),(e.tokens?.kind==="estimate"||e.onTriggerTokens?.kind==="estimate")&&n.push(a("panel.format.estimateBytesLabeledAbout")),e.tokens?.kind==="exact"&&n.push(a("panel.format.exactValueHarnessReportedUsageTokens",{p0:e.tokens.value.toLocaleString("en-US")})),n.join(`
104
- `)}function he(e,n){const t=Math.max(0,n-Date.parse(e)),r=Math.floor(t/6e4);if(r<1)return a("panel.taskboard.justNow");if(r<60)return a("panel.taskboard.minutesAgo",{p0:r});const s=Math.floor(r/60);return s<24?a("panel.taskboard.hoursAgo",{p0:s}):e.slice(0,10)}function is(e){const n=[],t=[],r=e.harness==="cc"?(e.slots.gates??[]).filter(s=>s.ccFeature!==void 0):[];for(const s of Fe){const i=(e.slots[s]??[]).filter(o=>o.toggleable&&!r.includes(o));i.length>0?n.push({slot:s,items:i}):(s!=="gates"||r.length===0)&&t.push(s)}return{groups:n,slotsWithoutToggle:t,ccFeatures:r}}function ma(e){return a(e==="autoMemoryEnabled"?"panel.render.ccAutoMemory":e==="crossSessionInbound"?"panel.render.ccInbound":"panel.render.ccOutbound")}function Yn(e){return a(e==="accept"?"panel.render.ccAccept":e==="hold"?"panel.render.ccHold":"panel.render.ccRefuse")}function ga(e){const n=e.action.itemId.replace("cc:gates:user:","");return e.harness!=="cc"||e.action.itemId!==`cc:gates:user:${n}`||!["autoMemoryEnabled","crossSessionInbound","permissions.deny"].includes(n)?[]:e.writes.map(t=>{let r;try{if(r=t.after===void 0?{}:JSON.parse(t.after),typeof r!="object"||r===null||Array.isArray(r))throw new Error}catch{N(a("panel.render.ccInvalidPayload"))}const s=n==="permissions.deny"?r.permissions?.deny:r[n];return`${n} = ${s===void 0?a("panel.render.ccRemoveKey"):JSON.stringify(s)}`})}function ls(e){return e.tokens?e.enabled?a("panel.actions.disableToSave",{p0:me(e.tokens)}):a("panel.actions.enablingAdds",{p0:me(e.tokens)}):""}function ln(e){return e===""?0:e.split(`
103
+ 约 token = 节点内步骤字节估算之和`,"panel.render.steps":"步","panel.render.stepsIncludeASubagentAttributionIs":"步骤归属含子代理({p0});归属 = 时间窗 + Agent 跨度推断,归不准会进「其他」","panel.render.stepsAttributedToTheMainAgent":"步骤归属:主 agent(时间窗推断)","panel.render.stepsThatCannotBeAssignedTo":"归不到具体 todo 的步骤进「其他」桶(无时间戳/无进行中 todo/多任务并行归不准);推断规则如实降级,不硬塞","panel.render.otherUnassignedSteps":"其他(归不准的步骤)","panel.render.sourceMarkdownChecklistInAssistantText":"来源:assistant 文本里的 markdown 勾选清单(- [ ] / - [x]);会话没用工具清单时的降级展示,工具清单一旦出现立即让位","panel.render.textChecklistWrittenByAgent":"文本清单(agent 手写)","panel.render.thisHarnessDoesNotProduceA":"该 harness 不产生任务清单 —— 以下为执行轨迹","panel.render.thisSessionDidNotUseA":"本次会话未使用任务清单 —— 以下为执行轨迹","panel.render.noNarrativeDataYetConnect":"○ 暂无叙事数据 —— 接线(","panel.render.thenRestartTheHarnessAndRun":",接线后重启该 harness 生效)并跑一轮对话后,这里按任务展示执行轨迹","panel.render.rawHookEventStreamTheLive":"逐条 hook 事件原始流(0.2 的实况视图);默认折叠","panel.render.rawEvents":"原始事件","panel.render.eventsReceivedForThisSessionBut":"○ 已收到本会话事件,但尚未解析到 Codex usage 数据 —— 这不代表零消耗,此处不显示估算值","panel.render.noCodexSessionUsageDataReceived":"○ 尚未收到 Codex session/usage 数据 —— 请先在 Codex 输入","panel.render.andConfirmWingmanIsTrustedAnd":"确认 Wingman 为 Trusted 且 Enabled","panel.render.noReadableUsageDataReceivedFor":"○ 本会话尚未收到可读的 usage 数据 —— 有精确来源后才会逐轮列出,此处不作估算","panel.render.usagePerTurnExactCodexToken":"每轮消耗 · Codex token_count 自报精确值;本地事件不提供订阅美元账单","panel.render.usagePerTurnThreeExactUsage":"每轮消耗 · usage 三字段为 harness 自报精确值","panel.render.reasoningIncludedInOut":" · reasoning {p0}(含在 out 内)","panel.render.originalUsageExactReportedByHarness":"usage 原文(harness 自报,精确):","panel.render.cumulativeInputThisTurnDifferenceBetween":"本轮累计 input(累计值相邻 turn 差) {p0} · 非缓存 {p1} · cache_write 字段 {p2} · 缓存读 {p3} · output {p4}{p5}","panel.render.inputCachedWritesCachedReadsOutput":"input {p0} · 缓存写 {p1} · 缓存读 {p2} · output {p3}{p4}","panel.render.contextThisTurnSumOfThe":"本轮 context = 三个 input 字段之和 = {p0}","panel.render.totalTokensThisTurnReported":"本轮总 token(自报) = {p0}","panel.render.turnStateInterruptedUsageReportedBefore":"本轮状态 = 中断(已保留中断前自报消耗)","panel.render.turnStateOpenShowingUsageReported":"本轮状态 = 未收口(仅显示目前已自报消耗)","panel.render.actualChatGPTCodexSubscriptionChargesAre":"$:ChatGPT/Codex 订阅实际账单不在本地事件中,不换算","panel.render.thisModelIsAbsentFromThe":"$:该模型不在内置价目表,不换算(宁缺勿编)","panel.render.estimatedFromTheBuiltInPriceTable":"$ 按内置价目表换算(缓存读 ×0.1、缓存写 ×1.25/×2),标 ≈","panel.render.interrupted":"中断","panel.render.open":"未收口","panel.render.cumulativeInUncachedCacheWriteCached":"累计 in {p0} · 非缓存 {p1} · cache_write {p2} · 缓读 {p3} · out {p4}","panel.render.inCachedWritesCachedReadsOut":"in {p0} · 缓写 {p1} · 缓读 {p2} · out {p3}","panel.render.turnTotal":"本轮合计 —","panel.render.turnTotalValue":"本轮合计 {p0}","panel.render.cumulativeInputThisTurn":"本轮累计 input {p0}","panel.render.reportProblem":"报告问题","panel.render.clickingSendsAllowlistedReproductionHintsTo":"点击会向 Tally 发送白名单复现提示,服务商也可能处理连接信息;问题正文和截图仅在你提交时发送。请勿提交 prompt、源码、路径、账号信息或凭证。","panel.render.pending":"待做","panel.render.markedCompleteByAgentUser":"Agent/用户标记完成","panel.render.cancelled":"已取消","panel.render.checkpoint":"检查点","panel.render.protocolNotInstalled":"协议未安装","panel.render.protocolInstalled":"协议已安装","panel.render.installedButNotLoaded":"已安装但未加载","panel.render.planAlreadyExists":"计划已存在","panel.render.thisSessionHasWrittenAPlan":"本会话已写计划","panel.render.dshHasNoUserLevelInstruction":"dsh 没有用户级指令文件","panel.render.sourceGETApiAnatomyPlanProtocolUser":"来源:GET /api/anatomy {p0}.planProtocol.user;{p1}","panel.render.takesEffectInTheNextNew":";下一个新会话生效","panel.render.planProtocolInstalledForYourAccount":"计划协议 · 用户级已装","panel.render.protocolVUpdateAvailable":"协议 v1,可更新","panel.render.notInstalled":"未装","panel.render.modified":"已被修改","panel.render.unsupported":"不支持","panel.render.dshHasNoUserLevelInstructionFile":"dsh 没有用户级指令文件,请按项目安装项目级协议","panel.render.replaceLtProjectGtWithThe":",运行前将 &lt;项目&gt; 替换为项目路径","panel.render.copyProjectInstallCommand":"复制项目级安装命令","panel.render.backsUpBeforeUpdatingPreservesContent":"计划只为 Wingman 提供计划展示功能,不改写 harness 行为或任何代码。更新前先备份,下一个新会话生效。","panel.render.theProtocolBlockHasBeenModified":"协议块已被修改;保留现有内容,请先处理修改后再重新安装。","panel.render.afterConfirmationInstallsInTheUser":"计划只为 Wingman 提供计划展示功能,不改写 harness 行为或任何代码。","panel.render.reinstall":"重新安装","panel.render.installAction":"一键安装","panel.render.planProtocol":"计划协议:{p0}","panel.render.protocolUpdateSuffix":"· 协议 v1,可更新","panel.render.scopeUserLevelProtocolCommandVersion":"{p0};安装范围来自用户级协议;命令版本:GET /api/version","panel.render.installOnceToRequestPlansIn":"计划只用于 Wingman 展示,不改写 harness 行为或代码。","panel.render.projectCommandVersionGETApiVersion":"{p0} · {p1};项目:{p2};命令版本:GET /api/version","panel.render.toBeFilledIn":"待用户填写","panel.render.wingmanVersionUnknownTheInstallCommand":"Wingman 版本未知,安装命令未钉版本","panel.render.theDshInstructionLoadingPluginIs":"dsh 指令加载插件已禁用,见控制页开关","panel.render.sessionPlan":"会话计划 ·","panel.render.noStructuredPlanProvided":"未提供结构化计划","panel.render.unavailablePrefix":"不可用:","panel.render.sourceSessionPlanForInstruction":"来源:sessionPlan.forInstruction","panel.render.sessionPlanRevisionAgentMarkedComplete":"会话计划 revision {p0} · Agent 标记 {p1}/{p2} 完成","panel.render.sessionPlanUnavailable":"会话计划不可用:{p0}","panel.render.dataTipSourceSessionPlanForInstruction":' data-tip="来源:sessionPlan.forInstruction"',"panel.render.timestampSourceHookEvent":"绝对时间:{p0} · 来源:hook 事件","panel.render.recentActivityPrefix":"最近活动:","panel.render.needsYou":"需要你:","panel.render.checksFailuresRuns":"检查 {p0} 次失败 / {p1} 次运行","panel.render.accepted":"已验收 {p0}","panel.render.acceptanceUnavailableReason":"验收不可用:{p0}","panel.render.notLinkedToAStep":"未关联到步骤","panel.render.linkedTo":"归属:{p0}","panel.render.pin":"置顶","panel.render.commandCopied":"命令已复制","panel.render.couldNotCopyCommand":"命令复制失败","panel.render.thisHarnessHasNoCommandTo":"该 Harness 无按会话恢复命令","panel.render.noReturnAppSelected":"未设置回跳应用","panel.render.switchedTo":"已切到 {p0}","panel.render.couldNotSwitch":"切换失败:{p0}","panel.render.dshHasNoCommandToResume":" · dsh 没有按会话恢复的命令,请回到原终端继续","panel.render.sourceClipboardWriteResultResponseOr":"来源:剪贴板写入结果{p0};{p1} 返回或请求失败;Harness 恢复命令能力","panel.render.thisHarnessHasNoResumeCommand":"(该 Harness 无恢复命令,未写入)","panel.render.taskCardMenu":"任务卡菜单","panel.render.copy":"复制","panel.render.rename":"重命名","panel.render.clearToRestoreTheAutomaticTitle":"清空后恢复自动标题","panel.render.unpin":"取消置顶","panel.render.unhide":"取消隐藏","panel.render.hide":"隐藏","panel.render.hidden":"已隐藏","panel.render.cards":"张 ·","panel.render.show":"显示","panel.render.planAcceptance":"计划验收:","panel.render.cardsHiddenByFilters":"张卡被筛选隐藏","panel.render.sourceWingmanPlanMdNodesSubtree":"来源:.wingman/plan.md nodes; 子树叶节点数量","panel.render.expandChildSteps":"展开子步骤 (","panel.render.noSessionObserved":"没有观察到会话","panel.render.noTaskCardsMatchTheFilters":"没有符合筛选的任务卡(","panel.render.filteredOut":"张被筛掉)","panel.render.fileTimestamp":"文件时间 {p0}","panel.render.lastWriter":"最近写入者:{p0} {p1} · {p2}","panel.render.lastWriterExternalEditNotObserved":"最近写入者:外部编辑/未观察到","panel.render.parentChildConflicts":"父子矛盾 {p0} 处","panel.render.inProgressStepsWithoutAnActive":"进行中步骤下无活跃会话 {p0} 处","panel.render.otherFacts":"其他 {p0} 条","panel.render.pathSource":"{p0} · 来源:{p1}","panel.render.waitingForYourDecision":"等待你的决定","panel.render.requests":"条请求","panel.render.openSession":"查看会话","panel.render.thePlanNeedsYourReview":"计划需要你检查","panel.render.goToNode":"定位节点","panel.render.projectInProgress":"正在进行","panel.render.noPlanFile":"没有计划文件","panel.render.planUnreadable":"计划不可读","panel.render.cannotDetermineWhetherYouAreNeeded":"无法确认是否需要你","panel.render.copyInstallCommandTip":"{p0} · 复制安装命令","panel.render.howToProvideAPlan":"如何提供计划","panel.render.createAtTheProjectRoot":"在项目根创建","panel.render.withTheProjectTitleGoalAnd":",填写项目标题、目标和步骤;手写一份即可生效。","panel.render.projectName":"# 项目名称","panel.render.goalProjectGoal":"目标: 项目目标","panel.render.currentTask":"- [/] 当前任务","panel.render.pendingTask":"- [ ] 待做任务","panel.render.connectFeedbackSignals":"连接反馈信号 ·","panel.render.notEnoughInformation":"信息不足:","panel.render.cannotReadPlanFile":"计划文件读不了","panel.render.cannotSeeRequests":"看不到请求","panel.render.projectEnded":"已结束","panel.render.sourceGETApiProjectsRequestOr":"来源:GET /api/projects 请求或载荷校验失败","panel.render.projectRefreshFailedShowingThePrevious":"项目刷新失败,当前显示上次载荷;行动状态可能已变化","panel.render.noProjectGoalProvided":"尚未提供项目目标","panel.render.noSessionActivityTimestampObserved":"尚未观察到会话活动时间","panel.render.noActiveSessionThisProjectS":"当前无活跃会话(此项目的会话已不在面板)","panel.render.noActiveSessionWingmanHasReceived":"当前无活跃会话(Wingman 启动后尚未收到此项目的事件)","panel.render.timestamp":"绝对时间:","panel.render.sourceSeparator":"· 来源:","panel.render.titleSource":"· 标题来源:","panel.render.sourcePlanAvailabilityReasonLine":"来源:plan.availability / reason / line","panel.render.planUnavailable":"计划不可用:","panel.render.line":" · 第 {p0} 行","panel.render.sourceSessionsFeedbackState":"来源:sessions[].feedback.state","panel.render.feedbackSignalsAreNotConnectedOr":"反馈信号未接线或不可用,无法确认是否需要你","panel.render.viewPlanProtocol":"· 查看计划协议","panel.render.currentBranch":"所在分支","panel.render.moreBranches":"还有 {count} 条分支","panel.render.oneMoreBranch":"还有 {count} 条分支","panel.render.branchCurrentPoints":"{count} 个当前点","panel.render.branchCurrentPoint":"{count} 个当前点","panel.render.branchCurrentPointsSource":"来源:currentPoints 中属于该顶层节点子树的当前点","panel.render.noCurrentBranchProvided":"尚未提供所在分支","panel.render.currentTaskLabel":"当前任务","panel.render.morePoints":"还有 {count} 项","panel.render.oneMorePoint":"还有 {count} 项","panel.render.sourceFirstScreenCurrentPointsLength":"来源:firstScreen.currentPoints.length","panel.render.parallel":"并行","panel.render.thePlanHasNoStepMarked":"计划未标记进行中步骤","panel.render.recentActivityLabel":"最近活动","panel.render.thePlanHasNoSteps":"计划没有步骤","panel.render.planTree":"计划树","panel.render.fullRecord":"完整记录","panel.render.completedMilestones":"已完成 {count} 项 · 最近:{name}","panel.render.completedMilestonesSource":"来源:plan.nodes 中已完成或已取消的顶层节点;最近项按文档顺序","panel.render.sessionsNotLinkedToAStep":"未关联到步骤的会话","panel.render.sourcePlanLastGood":"来源:plan.lastGood","panel.render.lastReadableVersion":"上次可解析版本","panel.render.projectSessions":"项目会话","panel.render.sourceWingmanPlanMdLeafCounts":"来源:.wingman/plan.md leaf counts; counts.pending / inProgress / completed / cancelled / checkpoint","panel.render.agentUserMarksPending":"Agent/用户标记 · 待做","panel.render.inProgressCount":"· 进行中","panel.render.complete":"· 完成","panel.render.cancelledCount":"· 取消","panel.render.checkpointCount":"· 检查点","panel.render.sourceCompletionLabel":"来源:completionLabel","panel.render.ignoredLine":"第 {p0} 行:{p1}","panel.render.ignored":"· 忽略","panel.render.sourcePlanHigherPlanPaths":"来源:plan.higherPlanPaths","panel.render.planFilesAlsoExistAbove":"上层还存在计划文件:","panel.render.sourceSessionsUnattachedReason":"来源:sessions[].unattachedReason","panel.render.notLinked":"· 未关联:","panel.render.sourcePlanLastGoodRevisionMtime":"来源:plan.lastGood.revision / mtime","panel.render.lastReadableVersionRevision":"上次可解析版本 · revision","panel.render.connectionsAndProtocolPlanSourceAnd":"连接与协议 · 计划来源与状态","panel.render.sourceProjectRoot":"来源:project.root","panel.render.sourceRevisionMtimeLastWriter":"来源:revision / mtime / lastWriter","panel.render.all":"全部","panel.render.waitingForYouLabel":"等待","panel.render.turnEnded":"回合结束","panel.render.turnEndedSource":"{harness} Stop 或主记录回合结束信号时刻","panel.render.clickToAcknowledge":"点击确认提醒","panel.render.additionalAttention":"另有:{events}","panel.render.ended":"已结束","panel.render.status":"状态","panel.render.dataTipSourceGETApiProjects":' data-tip="来源:GET /api/projects 请求与载荷校验"',"panel.render.projectRefreshFailedProjectDataIs":"项目刷新失败,项目载荷尚不可用","panel.render.projectDataIsUnavailable":"项目载荷尚不可用","panel.render.dismissProjectMemoryNotice":"关闭项目记忆提示","panel.render.projectRefreshFailedShowingThePreviousResponse":"项目刷新失败,当前显示上次载荷","panel.render.noSessionWithAWorkingDirectory":"尚未观察到带工作目录的会话","panel.render.mockDemoData":"MOCK 演示数据","panel.render.projectPlansAcrossHarnessesLocalAnd":"跨 Harness 项目计划 · 本机只读","panel.render.scannedAt":"{p0}{p1} · 扫描于 {p2}","panel.render.collapseArrow":"收起 ▴"},is={"cli.server.requestFailed":"[wingman] 请求处理失败:{error}","cli.server.refreshFromPanel":"刷新授权必须由 Wingman 面板中的按钮触发","cli.server.harnessQuery":"harness 需要 {ids}(?harness=<id>),得到 {harness}","cli.server.anatomyHome":"anatomy 需要显式 homeDir","cli.server.detectFailed":"[wingman] {harness} detect 失败,已跳过:{error}","cli.server.scanFailed":"[wingman] {harness} 扫描失败,降级显示:{error}","cli.server.configFailed":"读取配置失败:{error}","cli.server.jsonBody":"请求体必须是合法 JSON","cli.server.harnessRequired":"harness 需要 {ids},得到 {harness}","cli.server.actionShape":'action 需要 {kind:"toggle", itemId, enable} 形状',"cli.server.fixturesAction":"fixtures 模式只读:动作只到 plan 为止,不写任何文件","cli.server.subscriptionRequired":"需要试用或有效订阅才能写入配置(免费层只显示一个工具)","cli.server.mobileRequiresLicense":"需要试用或有效订阅才能配对手机(免费层只显示一个工具)","cli.server.fixturesMobile":"fixtures 模式只读:不配对或解除配对手机","cli.server.planShape":"plan 需要 ActionPlan 对象(由 /api/action/plan 产出)","cli.server.fixturesProtocol":"fixtures 模式只读:不预览或写入用户级协议","cli.server.dshUserUnsupported":"unsupported: dsh 无用户级指令文件,请按项目安装计划协议","cli.server.protocolHarness":"用户级计划协议 harness 需要 cc|codex","cli.server.protocolHome":"用户级计划协议需要显式 homeDir","cli.server.backupPreview":"~/.wingman/backups/<ISO 时间戳>(重名追加 -N)","cli.server.fixturesReturn":"fixtures 模式只读:不保存回跳设置或激活应用","cli.server.returnHome":"回跳设置缺少 homeDir","cli.server.bundleShape":"请求只接受 bundlePath 字符串","cli.server.returnMissing":"未检测到该回跳应用","cli.server.openTimeout":"应用激活超时","cli.server.openFailed":"应用激活失败","cli.server.fixturesOverlay":"fixtures 模式只读:不写任务卡 overlay","cli.server.overlayShape":"会话请求需要合法 harness、非空 sessionId 与 title/pinned/hidden/accepted/archived 补丁;项目请求需要非空 root 与 pinned/order/hidden/archived 补丁,order 为非负整数","cli.server.overlayHome":"任务卡 overlay 缺少 homeDir","cli.server.licenseRead":"license 文件超过 64KB 上限或读取失败","cli.server.panelBuild":"面板未构建:请先运行 pnpm --filter @wingman/panel build,再刷新本页。","cli.server.settingsRead":"回跳设置无法读取;请人工检查 settings.json","cli.server.settingsFormat":"回跳设置无法解析或版本未知,拒绝覆盖;请人工检查 settings.json","cli.server.settingsWrite":"回跳设置备份或写入失败,未覆盖设置;请人工检查 settings.json","cli.server.localeInvalid":"locale 只接受已注册语言标签","cli.server.settingsInvalid":"设置只接受已注册的 locale、合法的 island 位置与大小或已知的 freeHarness","cli.server.freeHarnessNotDetected":"尚未探测到这个工具,不能设为免费工具。","cli.server.freeHarnessCooldown":"免费工具选定后 7 天内不能更换,可于 {switchableAt} 更换。","cli.server.fixturesSettings":"fixtures 模式只读:不保存语言设置","cli.server.settingsHome":"语言设置缺少 homeDir"},ls={"narrative.waitedPermission":"已等待 {duration}:等待授权","narrative.waitedPermissionDetail":"已等待 {duration}:等待授权:{reason}","narrative.waitedResponse":"已等待 {duration}:等待回应","narrative.waitedResponseDetail":"已等待 {duration}:等待回应:{reason}","narrative.suggestionUnused":"{server} 本 session 未使用,可关","narrative.suggestionUnusedExact":"{server} 本 session 未使用,关掉可省 {tokens} tok(常驻估算)","narrative.suggestionUnusedEstimated":"{server} 本 session 未使用,关掉可省 约 {tokens} tok(常驻估算)"},ma={tag:"zh",nativeName:"中文",messages:{...os,...rs,...ts,...ss,...es,...ns,...as,...is,...ls}},mt=[ma,Zr],gt=mt.map(({tag:e,nativeName:n})=>({tag:e,nativeName:n}));let ht="zh";function oe(){return gt}function Me(){return ht}function ze(e){if(!gt.some(n=>n.tag===e))throw new Error(`Unsupported locale: ${e}`);ht=e}function a(e,n={}){const t=mt.find(({tag:r})=>r===ht)?.messages[e];if(t===void 0)throw new Error(`Missing translation: ${e}`);return t.replace(/\{(\w+)\}/g,(r,s)=>Object.hasOwn(n,s)?String(n[s]):r)}function yn(e){return e===null||typeof e!="object"||Array.isArray(e)||!Object.hasOwn(e,"key")||!("key"in e)||typeof e.key!="string"||!Object.hasOwn(ma.messages,e.key)?!1:!("params"in e)||e.params===void 0?!0:e.params===null||typeof e.params!="object"||Array.isArray(e.params)?!1:Object.values(e.params).every(n=>typeof n=="string"||typeof n=="number"&&Number.isFinite(n))}function ds(e){const n=e?.toLowerCase().replaceAll("_","-");return gt.find(({tag:t})=>n===t.toLowerCase()||n?.startsWith(`${t.toLowerCase()}-`))?.tag}const Fe=["base","rules","skills","tools","gates","history"],ga={get base(){return a("panel.format.baseInstructions")},get rules(){return a("panel.format.yourRules")},get skills(){return a("panel.format.skills")},get tools(){return a("panel.format.toolDefinitions")},get gates(){return a("panel.format.gateHooks")},get history(){return a("panel.format.conversationHistory")}},un={base:"#3987e5",rules:"#d95926",skills:"#199e70",tools:"#c98500",gates:"#898781",history:"#d55181"},E={cc:"Claude Code",codex:"Codex",dsh:"dsh"},Ve={cc:{get base(){return a("panel.format.builtInSystemPrompt")},rules:"CLAUDE.md · rules/*.md",skills:"Skills · SKILL.md",tools:"MCP servers",gates:"hooks · permissions",history:"projects/*.jsonl"},codex:{get base(){return a("panel.format.builtInInstructions")},rules:"AGENTS.md · config.toml",skills:"plugins",tools:"mcp_servers",gates:"approval_policy · hooks",history:"history.jsonl"},dsh:{get base(){return a("panel.format.corePluginEverythingIsAPlugin")},rules:"profile · patch",get skills(){return a("panel.format.skillPlugin")},get tools(){return a("panel.format.toolPlugins")},get gates(){return a("panel.format.approvalPermissionPlugins")},get history(){return a("panel.format.sessionLogPlugin")}}};function B(e){return e<1e3?String(e):`${(Math.round(e/100)/10).toFixed(1)}k`}function ge(e){if(!e)return"—";const n=B(e.value);return e.kind==="estimate"?a("panel.format.about",{p0:n}):n}function cs(e){return e.onTriggerTokens?a("panel.format.residentAfterTrigger",{p0:ge(e.tokens),p1:ge(e.onTriggerTokens)}):ge(e.tokens)}function ha(e){let n=0,t=!1,r="exact";for(const s of e)!s.enabled||!s.tokens||(n+=s.tokens.value,t=!0,s.tokens.kind==="estimate"&&(r="estimate"));return t?{kind:r,value:n}:void 0}function ps(e){let n=0,t=!1,r="exact";for(const s of Fe){const o=ha(e.slots[s]??[]);o&&(n+=o.value,t=!0,o.kind==="estimate"&&(r="estimate"))}return t?{kind:r,value:n}:void 0}function us(e){return a(e==="full"?"panel.format.fullPluginApi":e==="push"?"panel.format.pushHooks":"panel.format.notWired")}function fn(e){return`${e.slice(0,16).replace("T"," ")} UTC`}function va(e){const n=[];return n.push(e.nativePath?a("panel.format.file",{p0:e.nativePath}):a("panel.format.noFileSource",{p0:e.source})),e.__source_note&&n.push(e.__source_note),(e.tokens?.kind==="estimate"||e.onTriggerTokens?.kind==="estimate")&&n.push(a("panel.format.estimateBytesLabeledAbout")),e.tokens?.kind==="exact"&&n.push(a("panel.format.exactValueHarnessReportedUsageTokens",{p0:e.tokens.value.toLocaleString("en-US")})),n.join(`
104
+ `)}function ve(e,n){const t=Math.max(0,n-Date.parse(e)),r=Math.floor(t/6e4);if(r<1)return a("panel.taskboard.justNow");if(r<60)return a("panel.taskboard.minutesAgo",{p0:r});const s=Math.floor(r/60);return s<24?a("panel.taskboard.hoursAgo",{p0:s}):e.slice(0,10)}function fs(e){const n=[],t=[],r=e.harness==="cc"?(e.slots.gates??[]).filter(s=>s.ccFeature!==void 0):[];for(const s of Fe){const o=(e.slots[s]??[]).filter(i=>i.toggleable&&!r.includes(i));o.length>0?n.push({slot:s,items:o}):(s!=="gates"||r.length===0)&&t.push(s)}return{groups:n,slotsWithoutToggle:t,ccFeatures:r}}function ba(e){return a(e==="autoMemoryEnabled"?"panel.render.ccAutoMemory":e==="crossSessionInbound"?"panel.render.ccInbound":"panel.render.ccOutbound")}function Zn(e){return a(e==="accept"?"panel.render.ccAccept":e==="hold"?"panel.render.ccHold":"panel.render.ccRefuse")}function ya(e){const n=e.action.itemId.replace("cc:gates:user:","");return e.harness!=="cc"||e.action.itemId!==`cc:gates:user:${n}`||!["autoMemoryEnabled","crossSessionInbound","permissions.deny"].includes(n)?[]:e.writes.map(t=>{let r;try{if(r=t.after===void 0?{}:JSON.parse(t.after),typeof r!="object"||r===null||Array.isArray(r))throw new Error}catch{N(a("panel.render.ccInvalidPayload"))}const s=n==="permissions.deny"?r.permissions?.deny:r[n];return`${n} = ${s===void 0?a("panel.render.ccRemoveKey"):JSON.stringify(s)}`})}function ms(e){return e.tokens?e.enabled?a("panel.actions.disableToSave",{p0:ge(e.tokens)}):a("panel.actions.enablingAdds",{p0:ge(e.tokens)}):""}function ln(e){return e===""?0:e.split(`
105
105
  `).length-(e.endsWith(`
106
- `)?1:0)}function ds(e){return a(e==="create"?"panel.actions.create":e==="delete"?"panel.actions.delete":"panel.actions.modify")}function cs(e){return e.kind==="create"?a("panel.actions.lines",{p0:ln(e.after??"")}):e.kind==="delete"?a("panel.actions.previouslyLines",{p0:ln(e.before??"")}):a("panel.actions.linesLines",{p0:ln(e.before??""),p1:ln(e.after??"")})}function ps(e){return a(e==="immediate"?"panel.actions.effectiveImmediatelyTheHarnessWatchesThis":e==="reconnect"?"panel.actions.effectiveAfterReconnectingRestartTheHarness":"panel.actions.effectiveNextSessionOngoingConversationsAre")}function ha(e,n){return`${a(n?"panel.actions.enable":"panel.actions.disable")} ${e}`}function us(e){const n=e.action.itemId.split(":");return n.length>=4?n.slice(3).join(":"):e.action.itemId}const va=["cc","codex","dsh"],fs=["immediate","next_session","reconnect"],ms=["create","modify","delete"];function N(e){throw new Error(a("panel.actions.planPayloadViolatesTheContractCannot",{p0:e}))}function gs(e,n){(typeof e!="object"||e===null)&&N(a("panel.actions.writesIsNotAnObject",{p0:n}));const t=e;(typeof t.file!="string"||t.file==="")&&N(a("panel.actions.writesFileIsNotANonempty",{p0:n})),ms.includes(t.kind)||N(a("panel.actions.writesKindHasUnknownValue",{p0:n,p1:JSON.stringify(t.kind)})),t.kind!=="create"&&typeof t.before!="string"&&N(a("panel.actions.writesBeforeIsMissingKindRequires",{p0:n,p1:String(t.kind)})),t.kind!=="delete"&&typeof t.after!="string"&&N(a("panel.actions.writesAfterIsMissingKindRequires",{p0:n,p1:String(t.kind)}))}function hs(e,n){(typeof e!="object"||e===null)&&N(a("panel.actions.referencesIsNotAnObject",{p0:n}));const t=e;(typeof t.file!="string"||t.file==="")&&N(a("panel.actions.referencesFileIsNotANonempty",{p0:n})),(typeof t.line!="number"||!Number.isInteger(t.line)||t.line<1)&&N(a("panel.actions.referencesLineIsNotABased",{p0:n})),typeof t.matchedName!="string"&&N(a("panel.actions.referencesMatchednameIsNotAString",{p0:n})),typeof t.context!="string"&&N(a("panel.actions.referencesContextIsNotAString",{p0:n}))}function ba(e){(typeof e!="object"||e===null)&&N(a("panel.actions.notAnObject"));const n=e;va.includes(n.harness)||N(a("panel.actions.harnessHasUnknownValue",{p0:JSON.stringify(n.harness)})),(typeof n.action!="object"||n.action===null)&&N(a("panel.actions.actionIsNotAnObject"));const t=n.action;return t.kind!=="toggle"&&N(a("panel.actions.actionKindHasUnknownValueV",{p0:JSON.stringify(t.kind)})),(typeof t.itemId!="string"||t.itemId==="")&&N(a("panel.actions.actionItemidIsNotANonempty")),typeof t.enable!="boolean"&&N(a("panel.actions.actionEnableIsNotABoolean")),t.itemId==="cc:gates:user:crossSessionInbound"?(n.harness!=="cc"||t.enable!==!0||!["accept","hold","refuse"].includes(t.value))&&N(a("panel.render.ccInvalidPayload")):t.value!==void 0&&N(a("panel.render.ccInvalidPayload")),Array.isArray(n.writes)||N(a("panel.actions.writesIsNotAnArray")),n.writes.forEach(gs),(typeof n.backupDir!="string"||n.backupDir==="")&&N(a("panel.actions.backupdirIsNotANonemptyString")),Array.isArray(n.references)||N(a("panel.actions.referencesIsNotAnArray")),n.references.forEach(hs),fs.includes(n.effectiveAt)||N(a("panel.actions.effectiveatHasUnknownValue",{p0:JSON.stringify(n.effectiveAt)})),ga(e),e}function ya(e){if(typeof e!="object"||e===null)throw new Error(a("panel.actions.applyResponseViolatesTheContractNot"));const n=e;if(n.ok===!0){if(typeof n.backupDir!="string"||n.backupDir==="")throw new Error(a("panel.actions.applyResponseViolatesTheContractOk"));return{ok:!0,backupDir:n.backupDir}}if(n.ok===!1){if(typeof n.error!="string"||n.error==="")throw new Error(a("panel.actions.applyResponseViolatesTheContractOk59"));return{ok:!1,error:n.error}}throw new Error(a("panel.actions.applyResponseViolatesTheContractOk60"))}function vs(e){(typeof e!="object"||e===null)&&N(a("panel.actions.notAnObject"));const n=e;n.kind!=="protocol_user_install"&&n.kind!=="protocol_user_uninstall"&&N(a("panel.actions.kindHasAnUnknownValue")),n.harness!=="cc"&&n.harness!=="codex"&&N(a("panel.actions.harnessDoesNotSupportUserPlan")),typeof n.hasBlock!="boolean"&&N(a("panel.actions.hasblockIsNotABoolean")),(typeof n.blockBytes!="number"||!Number.isSafeInteger(n.blockBytes)||n.blockBytes<0)&&N(a("panel.actions.blockbytesIsNotANonnegativeInteger"));for(const t of["targetPath","backupDir","hostname"])(typeof n[t]!="string"||n[t]==="")&&N(a("panel.actions.isNotANonemptyString",{p0:t}));return(!n.targetPath.startsWith("~/")||!n.backupDir.startsWith("~/"))&&N(a("panel.actions.pathsMustUseTheAbbreviation")),(n.fromVersion!==void 0||n.toVersion!==void 0)&&(n.kind!=="protocol_user_install"||n.hasBlock!==!0||!Number.isSafeInteger(n.fromVersion)||!Number.isSafeInteger(n.toVersion)||n.fromVersion<1||n.fromVersion>=n.toVersion)&&N(a("panel.actions.updateVersionsMustBeIncreasingIntegers")),e}function bs(e){if(typeof e!="object"||e===null)throw new Error(a("panel.actions.applyResponseViolatesTheContractNot"));const n=e;if(n.ok!==!0)return ya(e);const t=n.planProtocol;if(typeof t!="object"||t===null||!["installed","outdated","missing","modified"].includes(t.user))throw new Error(a("panel.actions.applyResponseViolatesTheContractPlanprotocol"));if(n.backupDir!==void 0&&(typeof n.backupDir!="string"||!n.backupDir.startsWith("~/")))throw new Error(a("panel.actions.applyResponseViolatesTheContractBackupdir"));return n.backupDir===void 0?{ok:!0}:{ok:!0,backupDir:n.backupDir}}function ys(e,n){return dt.some(({messages:t})=>n.includes(t["panel.actions.fixturesModeIsReadOnly"]??"Fixtures mode is read-only"))?{phase:"demo",title:e}:{phase:"error",title:e,message:n}}function ks(e,n=!1){return e===null?!1:e.sessions.some(t=>t.waiting||n&&t.turnEnded)?!0:Object.values(e.states).some(t=>t.taskWorkflow?.feedback.state==="needs_user")}function $s(e,n,t,r=1e4,s=!1){return setInterval(()=>{const i=e(),o=(Array.isArray(i)?i:[i]).filter(c=>ks(c,s));if(o.length!==0){n();for(const c of o)t(c)}},r)}const Jn="codex:plugins",ka="cc:skills",$a="cc:tools",Sa="dsh:controls:";function En(e){try{const n=JSON.parse(localStorage.getItem(e)??"[]");return Array.isArray(n)&&n.every(t=>typeof t=="string")?n:[]}catch{return[]}}function ut(e,n){try{localStorage.setItem(e,JSON.stringify([...new Set(n)]))}catch{}}const Q={planStep:"plan.md 步骤",planInstruction:"计划所属指令",latestInstruction:"最新指令",workingDirectory:"工作目录",homeDirectory:"工作目录 = 家目录",planHeading:".wingman/plan.md H1",projectMemory:"项目记忆",permissionEvents:"PermissionRequest/Notification 事件",liveEmptyState:"实况接线状态;尚无可显示的会话标题"},Ss="用户命名",qt={项目记忆:"panel.source.projectMemory","plan.md 步骤":"panel.source.planStep",计划所属指令:"panel.source.planInstruction",最新指令:"panel.source.latestInstruction",工作目录:"panel.source.workingDirectory","工作目录 = 家目录":"panel.source.homeDirectory",".wingman/plan.md H1":"panel.source.planHeading",用户命名:"panel.source.userNamed","PermissionRequest/Notification 事件":"panel.source.permissionEvents","实况接线状态;尚无可显示的会话标题":"panel.source.liveEmptyState",".wingman/plan.md [?] status":"panel.source.currentPointAncestors","sessions.feedback.state=unavailable / feedback 未提供":"panel.source.feedbackUnavailable",".wingman/plan.md 目标: / Goal:":"panel.source.planGoal","sessions.lastActivity(最近 hook received_at / transcript timestamp)最大值":"panel.source.lastActivity","sessions.title(plan.md 步骤)":"panel.source.sessionPlanTitle","sessions.label(会话工作目录名 / sessionId)":"panel.source.sessionDirectory","sessions[].label(项目载荷未就绪)":"panel.source.sessionLabelFallback",用户提示:"panel.source.userPrompt","agent 自述":"panel.source.agentQuote","省额 = 条目常驻 token(估算标「约」);关停走 plan/apply,写前备份可回退":"panel.source.savingEstimate","该 harness 未提供此条目的常驻占用数,不编省额;关停走 plan/apply,写前备份可回退":"panel.source.savingUnavailable","估算 = 本轮 usage 合计(harness 自报,精确)− 配置常驻合计(估算,标「约」)":"panel.source.historyEstimate"};function I(e){const n=Object.hasOwn(qt,e)?qt[e]:void 0;if(n!==void 0)return a(n);if(e.includes(`
106
+ `)?1:0)}function gs(e){return a(e==="create"?"panel.actions.create":e==="delete"?"panel.actions.delete":"panel.actions.modify")}function hs(e){return e.kind==="create"?a("panel.actions.lines",{p0:ln(e.after??"")}):e.kind==="delete"?a("panel.actions.previouslyLines",{p0:ln(e.before??"")}):a("panel.actions.linesLines",{p0:ln(e.before??""),p1:ln(e.after??"")})}function vs(e){return a(e==="immediate"?"panel.actions.effectiveImmediatelyTheHarnessWatchesThis":e==="reconnect"?"panel.actions.effectiveAfterReconnectingRestartTheHarness":"panel.actions.effectiveNextSessionOngoingConversationsAre")}function ka(e,n){return`${a(n?"panel.actions.enable":"panel.actions.disable")} ${e}`}function bs(e){const n=e.action.itemId.split(":");return n.length>=4?n.slice(3).join(":"):e.action.itemId}const $a=["cc","codex","dsh"],ys=["immediate","next_session","reconnect"],ks=["create","modify","delete"];function N(e){throw new Error(a("panel.actions.planPayloadViolatesTheContractCannot",{p0:e}))}function $s(e,n){(typeof e!="object"||e===null)&&N(a("panel.actions.writesIsNotAnObject",{p0:n}));const t=e;(typeof t.file!="string"||t.file==="")&&N(a("panel.actions.writesFileIsNotANonempty",{p0:n})),ks.includes(t.kind)||N(a("panel.actions.writesKindHasUnknownValue",{p0:n,p1:JSON.stringify(t.kind)})),t.kind!=="create"&&typeof t.before!="string"&&N(a("panel.actions.writesBeforeIsMissingKindRequires",{p0:n,p1:String(t.kind)})),t.kind!=="delete"&&typeof t.after!="string"&&N(a("panel.actions.writesAfterIsMissingKindRequires",{p0:n,p1:String(t.kind)}))}function ws(e,n){(typeof e!="object"||e===null)&&N(a("panel.actions.referencesIsNotAnObject",{p0:n}));const t=e;(typeof t.file!="string"||t.file==="")&&N(a("panel.actions.referencesFileIsNotANonempty",{p0:n})),(typeof t.line!="number"||!Number.isInteger(t.line)||t.line<1)&&N(a("panel.actions.referencesLineIsNotABased",{p0:n})),typeof t.matchedName!="string"&&N(a("panel.actions.referencesMatchednameIsNotAString",{p0:n})),typeof t.context!="string"&&N(a("panel.actions.referencesContextIsNotAString",{p0:n}))}function wa(e){(typeof e!="object"||e===null)&&N(a("panel.actions.notAnObject"));const n=e;$a.includes(n.harness)||N(a("panel.actions.harnessHasUnknownValue",{p0:JSON.stringify(n.harness)})),(typeof n.action!="object"||n.action===null)&&N(a("panel.actions.actionIsNotAnObject"));const t=n.action;return t.kind!=="toggle"&&N(a("panel.actions.actionKindHasUnknownValueV",{p0:JSON.stringify(t.kind)})),(typeof t.itemId!="string"||t.itemId==="")&&N(a("panel.actions.actionItemidIsNotANonempty")),typeof t.enable!="boolean"&&N(a("panel.actions.actionEnableIsNotABoolean")),t.itemId==="cc:gates:user:crossSessionInbound"?(n.harness!=="cc"||t.enable!==!0||!["accept","hold","refuse"].includes(t.value))&&N(a("panel.render.ccInvalidPayload")):t.value!==void 0&&N(a("panel.render.ccInvalidPayload")),Array.isArray(n.writes)||N(a("panel.actions.writesIsNotAnArray")),n.writes.forEach($s),(typeof n.backupDir!="string"||n.backupDir==="")&&N(a("panel.actions.backupdirIsNotANonemptyString")),Array.isArray(n.references)||N(a("panel.actions.referencesIsNotAnArray")),n.references.forEach(ws),ys.includes(n.effectiveAt)||N(a("panel.actions.effectiveatHasUnknownValue",{p0:JSON.stringify(n.effectiveAt)})),ya(e),e}function Sa(e){if(typeof e!="object"||e===null)throw new Error(a("panel.actions.applyResponseViolatesTheContractNot"));const n=e;if(n.ok===!0){if(typeof n.backupDir!="string"||n.backupDir==="")throw new Error(a("panel.actions.applyResponseViolatesTheContractOk"));return{ok:!0,backupDir:n.backupDir}}if(n.ok===!1){if(typeof n.error!="string"||n.error==="")throw new Error(a("panel.actions.applyResponseViolatesTheContractOk59"));return{ok:!1,error:n.error}}throw new Error(a("panel.actions.applyResponseViolatesTheContractOk60"))}function Ss(e){(typeof e!="object"||e===null)&&N(a("panel.actions.notAnObject"));const n=e;n.kind!=="protocol_user_install"&&n.kind!=="protocol_user_uninstall"&&N(a("panel.actions.kindHasAnUnknownValue")),n.harness!=="cc"&&n.harness!=="codex"&&N(a("panel.actions.harnessDoesNotSupportUserPlan")),typeof n.hasBlock!="boolean"&&N(a("panel.actions.hasblockIsNotABoolean")),(typeof n.blockBytes!="number"||!Number.isSafeInteger(n.blockBytes)||n.blockBytes<0)&&N(a("panel.actions.blockbytesIsNotANonnegativeInteger"));for(const t of["targetPath","backupDir","hostname"])(typeof n[t]!="string"||n[t]==="")&&N(a("panel.actions.isNotANonemptyString",{p0:t}));return(!n.targetPath.startsWith("~/")||!n.backupDir.startsWith("~/"))&&N(a("panel.actions.pathsMustUseTheAbbreviation")),(n.fromVersion!==void 0||n.toVersion!==void 0)&&(n.kind!=="protocol_user_install"||n.hasBlock!==!0||!Number.isSafeInteger(n.fromVersion)||!Number.isSafeInteger(n.toVersion)||n.fromVersion<1||n.fromVersion>=n.toVersion)&&N(a("panel.actions.updateVersionsMustBeIncreasingIntegers")),e}function Ts(e){if(typeof e!="object"||e===null)throw new Error(a("panel.actions.applyResponseViolatesTheContractNot"));const n=e;if(n.ok!==!0)return Sa(e);const t=n.planProtocol;if(typeof t!="object"||t===null||!["installed","outdated","missing","modified"].includes(t.user))throw new Error(a("panel.actions.applyResponseViolatesTheContractPlanprotocol"));if(n.backupDir!==void 0&&(typeof n.backupDir!="string"||!n.backupDir.startsWith("~/")))throw new Error(a("panel.actions.applyResponseViolatesTheContractBackupdir"));return n.backupDir===void 0?{ok:!0}:{ok:!0,backupDir:n.backupDir}}function As(e,n){return mt.some(({messages:t})=>n.includes(t["panel.actions.fixturesModeIsReadOnly"]??"Fixtures mode is read-only"))?{phase:"demo",title:e}:{phase:"error",title:e,message:n}}function Ps(e,n=!1){return e===null?!1:e.sessions.some(t=>t.waiting||n&&t.turnEnded)?!0:Object.values(e.states).some(t=>t.taskWorkflow?.feedback.state==="needs_user")}function xs(e,n,t,r=1e4,s=!1){return setInterval(()=>{const o=e(),i=(Array.isArray(o)?o:[o]).filter(c=>Ps(c,s));if(i.length!==0){n();for(const c of i)t(c)}},r)}const et="codex:plugins",Ta="cc:skills",Aa="cc:tools",Pa="dsh:controls:";function Mn(e){try{const n=JSON.parse(localStorage.getItem(e)??"[]");return Array.isArray(n)&&n.every(t=>typeof t=="string")?n:[]}catch{return[]}}function vt(e,n){try{localStorage.setItem(e,JSON.stringify([...new Set(n)]))}catch{}}const Z={planStep:"plan.md 步骤",planInstruction:"计划所属指令",latestInstruction:"最新指令",workingDirectory:"工作目录",homeDirectory:"工作目录 = 家目录",planHeading:".wingman/plan.md H1",projectMemory:"项目记忆",permissionEvents:"PermissionRequest/Notification 事件",liveEmptyState:"实况接线状态;尚无可显示的会话标题"},Cs="用户命名",Yt={项目记忆:"panel.source.projectMemory","plan.md 步骤":"panel.source.planStep",计划所属指令:"panel.source.planInstruction",最新指令:"panel.source.latestInstruction",工作目录:"panel.source.workingDirectory","工作目录 = 家目录":"panel.source.homeDirectory",".wingman/plan.md H1":"panel.source.planHeading",用户命名:"panel.source.userNamed","PermissionRequest/Notification 事件":"panel.source.permissionEvents","实况接线状态;尚无可显示的会话标题":"panel.source.liveEmptyState",".wingman/plan.md [?] status":"panel.source.currentPointAncestors","sessions.feedback.state=unavailable / feedback 未提供":"panel.source.feedbackUnavailable",".wingman/plan.md 目标: / Goal:":"panel.source.planGoal","sessions.lastActivity(最近 hook received_at / transcript timestamp)最大值":"panel.source.lastActivity","sessions.title(plan.md 步骤)":"panel.source.sessionPlanTitle","sessions.label(会话工作目录名 / sessionId)":"panel.source.sessionDirectory","sessions[].label(项目载荷未就绪)":"panel.source.sessionLabelFallback",用户提示:"panel.source.userPrompt","agent 自述":"panel.source.agentQuote","省额 = 条目常驻 token(估算标「约」);关停走 plan/apply,写前备份可回退":"panel.source.savingEstimate","该 harness 未提供此条目的常驻占用数,不编省额;关停走 plan/apply,写前备份可回退":"panel.source.savingUnavailable","估算 = 本轮 usage 合计(harness 自报,精确)− 配置常驻合计(估算,标「约」)":"panel.source.historyEstimate"};function C(e){const n=Object.hasOwn(Yt,e)?Yt[e]:void 0;if(n!==void 0)return a(n);if(e.includes(`
107
107
  `))return e.split(`
108
- `).map(I).join(`
109
- `);let t=/^\.wingman\/plan\.md:(\d+) 当前点顶层祖先$/u.exec(e);return t?a("panel.source.ancestorLine",{line:t[1]??""}):(t=/^来源:(PermissionRequest|Notification) 事件,(.+) 起未决;阈值 60s$/u.exec(e),t?a("panel.source.waitingProvenance",{event:t[1]??"",since:t[2]??""}):(t=/^命中:(用户提示|agent 自述) —— 「(.*)」\(scanReferences 整词匹配\)$/u.exec(e),t?a("panel.source.referenceMatch",{origin:I(t[1]??""),context:t[2]??""}):(t=/^判定:本 session 工具步骤零命中 mcp__(.+)__\*\(transcript 观察\)$/u.exec(e),t?a("panel.source.unusedServer",{server:t[1]??""}):(t=/^条目:(.*)$/u.exec(e),t?a("panel.source.item",{path:t[1]??""}):(t=/^阈值:context ≥ (.+) 且历史占比 > 50%$/u.exec(e),t?a("panel.source.historyThreshold",{tokens:t[1]??""}):e)))))}const ve={harness:"all",status:"all"};function Ne(e){return e.user.title===void 0?e.title:{text:e.user.title,source:Ss}}function Qe(e){const n=e.sessionPlan?.availability==="available"&&e.sessionPlan.forInstruction==="current"&&e.sessionPlan.steps.length>0&&e.sessionPlan.steps.every(t=>t.status==="completed");return{...wa(e),agentComplete:n}}function wa(e){if(e.waiting||e.feedback?.state==="needs_user")return{kind:"waiting",label:a("panel.taskboard.waitingForYou")};const n=e.waitOutcome?{note:{text:a(`panel.taskboard.${e.waitOutcome.outcome}`),kind:e.waitOutcome.outcome}}:{};return e.ended?{kind:"ended",label:a("panel.taskboard.ended"),...n}:e.turnEnded?{kind:"turnEnded",label:a("panel.taskboard.turnEnded"),...n}:{kind:"active",label:a("panel.taskboard.inProgress"),...n}}function ws(e){if(!(e?.availability!=="available"||e.forInstruction!=="current"))return{completed:e.steps.filter(n=>n.status==="completed").length,total:e.steps.length}}function ft(e){const n={waiting:0,turnEnded:1,active:2,ended:3};return[...e].sort((t,r)=>{const s=Number(r.user.pinned)-Number(t.user.pinned);if(s!==0)return s;const i=Qe(t).kind,o=Qe(r).kind,c=n[i]-n[o];return c!==0?c:i!=="active"?0:t.lastActivity===void 0?r.lastActivity===void 0?0:1:r.lastActivity===void 0?-1:r.lastActivity.localeCompare(t.lastActivity)})}function mt(e){return{visible:e.filter(n=>!n.user.hidden),hidden:e.filter(n=>n.user.hidden)}}function Ta(e){return e.harness==="dsh"?{unavailable:a("panel.taskboard.dshHasNoObservedCommandTo")}:e.harness==="codex"?{command:`codex resume ${e.id}`,note:a("panel.taskboard.sourceSessionIdFromHookEvents")}:e.cwd===void 0?{command:`claude --resume ${e.id}`,note:a("panel.taskboard.sourceSessionIdFromHookEvents132")}:{command:`cd "${Ts(e.cwd)}" && claude --resume ${e.id}`,note:a("panel.taskboard.sourceSessionIdAndWorkingDirectory")}}function Ts(e){return e.replace(/[\\"$`]/g,"\\$&")}function gt(e,n){return e.filter(t=>(n.harness==="all"||t.harness===n.harness)&&(n.status==="all"||Qe(t).kind===n.status))}function ht(e,n){return e.filter(t=>n.harness==="all"||"payloadUnavailable"in t||gt(mt(t.sessions.filter(r=>!be(r.harness,r.id,{projects:e}))).visible,n).length>0)}function mn(e,n=[]){return e.filter(t=>!ae(t)).sort((t,r)=>{const s="payloadUnavailable"in t?void 0:t.user,i="payloadUnavailable"in r?void 0:r.user,o=+(i?.pinned===!0)-+(s?.pinned===!0);if(o!==0)return o;if(s?.pinned&&i?.pinned)return(s.order??Number.MAX_SAFE_INTEGER)-(i.order??Number.MAX_SAFE_INTEGER)||t.root.localeCompare(r.root);const c=n.indexOf(t.root),p=n.indexOf(r.root);return(c<0?n.length:c)-(p<0?n.length:p)})}function nn(e,n,t,r){return e.find(s=>!("payloadUnavailable"in s)&&s.sessions.some(i=>i.harness===n&&i.id===t))??e.find(s=>s.root===r)}function ae(e){return!("payloadUnavailable"in e)&&e.user?.archived===!0}function be(e,n,t){return t?.projects.some(r=>!("payloadUnavailable"in r)&&r.sessions.some(s=>s.harness===e&&s.id===n&&(ae(r)||s.user.archived===!0)))??!1}const Aa=7;function Nn(e,n){return e.ended&&Date.parse(e.lastActivity)<n-Aa*864e5}function ye(e,n){if(e===null)return null;const t=n?.projects.filter(ae)??[],r=new Set(e.sessions.filter(s=>s.archived===!0||be(e.harness,s.id,n)).map(s=>s.id));for(const[s,i]of Object.entries(e.states))(be(e.harness,s,n)||t.some(o=>o.root===i.project?.root))&&r.add(s);return r.size===0?e:{...e,sessions:e.sessions.filter(s=>!r.has(s.id)),states:Object.fromEntries(Object.entries(e.states).filter(([s])=>!r.has(s)))}}function vt(e){return new URLSearchParams(e).get("island")==="1"}function Pa(e){return vt(e)&&new URLSearchParams(e).get("size")==="compact"}function bt(e){const n=yt(e);return vt(e)&&(n==="left"||n==="right")&&new URLSearchParams(e).get("tab")==="1"}function yt(e){const n=new URLSearchParams(e).get("edge");return n==="bottom"||n==="left"||n==="right"?n:"top"}function As(e,n,t=null,r=null,s=null,i=null){const o=e?`#island=open${n?`:${Vt(n)}`:""}`:`#island=pill:${Vt(n??{x:0,y:0,w:0,h:0})}`,c=t?`;focus:${t.target},${t.seq}`:"",p=r?`;waiting:${Math.round(r.sinceMs)},${encodeURIComponent(r.message)}`:"",u=s===null?"":`;reveal:${s}`,m=i===null?"":`;transition:${i}`;return`${o}${c}${p}${u}${m}`}function Vt(e){return`${Math.round(e.x)},${Math.round(e.y)},${Math.round(e.w)},${Math.round(e.h)}`}function Ps(e){return e.island&&e.open&&!e.inPanel&&!e.modalOpen}const Ca="https://billing.stripe.com/p/login/14AcMZ8Z147F4MmaTKcMM00",xa="https://buy.stripe.com/6oUbIV5MPbA792C8LCcMM04",Cs=["none","invalid","active","grace","expired"];function kt(e){if(typeof e!="object"||e===null)return null;const n=e;if(!Cs.includes(n.state)||typeof n.detail!="string"||n.plan!==void 0&&n.plan!=="trial"&&n.plan!=="subscription"||n.exp!==void 0&&typeof n.exp!="string")return null;if(n.freeHarnessSwitchableAt!==void 0){const t=n.freeHarnessSwitchableAt;if(typeof t!="string"||!Number.isFinite(Date.parse(t))||new Date(t).toISOString()!==t)return null}return n.tier!==void 0&&n.tier!=="full"&&n.tier!=="free"||(n.tier==="free"||n.freeHarness!==void 0)&&!["cc","codex","dsh"].includes(n.freeHarness)?null:{state:n.state,detail:n.detail,...n.plan===void 0?{}:{plan:n.plan},...n.exp===void 0?{}:{exp:n.exp},...n.tier===void 0?{}:{tier:n.tier},...n.freeHarness===void 0?{}:{freeHarness:n.freeHarness},...n.freeHarnessSwitchableAt===void 0?{}:{freeHarnessSwitchableAt:n.freeHarnessSwitchableAt}}}function ce(e,n){return n?.tier==="free"&&e!==n.freeHarness}function $t(e,n){return ce(e,n)?n?.freeHarness??e:e}function Ia(e){if(e?.tier==="free")return"free";if(e?.plan==="trial"){if(e.state==="active")return"trial-active";if(e.state==="expired")return"trial-expired"}return e&&(e.state==="grace"||e.state==="expired")?e.state:null}function xs(e){return e?a("panel.license.licenseImported",{p0:e.detail}):a("panel.license.licenseImportedNewStatusUnknownRefresh")}function Is(e){if(e.length!==1)return a("panel.license.dropOneLicenseJsonFileAt",{p0:e.length});const n=e[0]??"";return n.toLowerCase().endsWith(".json")?null:a("panel.license.onlyJsonFilesAreAcceptedReceived",{p0:n})}function kn(e){return va.flatMap(n=>{if(!e.configs.some(r=>r.harness===n)||ce(n,e.license))return[];const t=ye(e.narratives?.[n]??null,e.projects??null);return(t?.sessions??[]).map(r=>({harness:n,session:r,narrative:t?.states[r.id]}))})}function ja(e){return kn(e).filter(({session:n})=>n.lastInstruction!==void 0)}function js(e){return ja(e).filter(({session:n})=>!n.ended)}function Rs(e){const n=[];for(const{harness:t,session:r,narrative:s}of kn(e)){const i=s?.taskWorkflow?.feedback;if(r.waiting||i?.state==="needs_user"){const o=s?.waiting??void 0,c=i?.state==="needs_user"?i.since:void 0;n.push({harness:t,id:r.id,label:r.label,kind:"waiting",at:o?.since??c??"",...o===void 0?{}:{waiting:{label:r.label,message:o.message,since:o.since}}})}}for(const{harness:t,session:r}of js(e))!n.some(s=>s.harness===t&&s.id===r.id)&&r.turnEnded&&r.turnEndedAt!==void 0&&e.turnEndedAck?.[`${t}:${r.id}`]!==r.turnEndedAt&&n.push({harness:t,id:r.id,label:r.label,kind:"turnEnded",at:r.turnEndedAt});return n.sort((t,r)=>+(r.kind==="waiting")-+(t.kind==="waiting")||(Date.parse(r.at)||0)-(Date.parse(t.at)||0))}function St(e){const n=Rs(e),t=n[0];return t?{...t,extra:n.length-1,others:n.slice(1)}:void 0}function Es(e,n){const t=[...e.classList].filter(r=>r.startsWith("island-"));e.className=n.className,e.classList.add(...t),e.innerHTML=n.innerHTML,e.dataset.tip=n.dataset.tip??""}function Ns(e){let n=null,t=!1,r=()=>{};const s=["island-reveal","island-retract","island-prepare","island-edge-left","island-edge-right","island-motion-reduced"],i=()=>{r(),n?.classList.remove(...s),n=null,t=!1};return{get active(){return t},get element(){return n},start(o,c,p,u,m){if(c!=="left"&&c!=="right"){i();return}const f=p==="prepare"||p==="reveal"&&(n!==o||o.classList.contains("island-prepare"));if(r(),n=o,t=!0,o.classList.remove(...s),o.classList.add(p==="retract"?"island-retract":"island-reveal",`island-edge-${c}`),m&&o.classList.add("island-motion-reduced"),f&&o.classList.add("island-prepare"),p==="prepare")return;let h,v,y=!1;const w=()=>{y||(r(),t=!1,e(p,u))},g=S=>{S.target===o&&S.propertyName==="opacity"&&w()};r=()=>{y=!0,h!==void 0&&cancelAnimationFrame(h),v!==void 0&&clearTimeout(v),o.removeEventListener("transitionend",g)};const k=()=>{o.classList.remove("island-prepare"),o.addEventListener("transitionend",g),p==="reveal"&&(v=setTimeout(w,m?80:200))};f?(o.offsetWidth,h=requestAnimationFrame(k)):k()},cancel:i}}const Os=50,Ms=15e3,Fs={get SessionStart(){return a("panel.live.sessionStarted")},get SessionEnd(){return a("panel.live.sessionEnded")},get UserPromptSubmit(){return a("panel.live.promptSubmitted")},get PreToolUse(){return a("panel.live.toolCallStarted")},get PostToolUse(){return a("panel.live.toolCallCompleted")},get PostToolBatch(){return a("panel.live.toolBatchCompleted")},get Stop(){return a("panel.live.turnEnded")},get SubagentStart(){return a("panel.live.subagentStarted")},get SubagentStop(){return a("panel.live.subagentEnded")},get PreCompact(){return a("panel.live.compactionStarted")},get PostCompact(){return a("panel.live.compactionCompleted")},get ConfigChange(){return a("panel.live.configurationChanged")},get InstructionsLoaded(){return a("panel.live.instructionsLoaded")},get Notification(){return a("panel.live.notification")},get PermissionRequest(){return a("panel.live.permissionRequest")}};function Ra(e){return Fs[e]??e}function Ls(e,n,t=Os){if(n.sseId!==void 0&&e.some(s=>s.sseId===n.sseId))return[...e];const r=[...e,n];return r.length>t?r.slice(r.length-t):r}function Ea(e){return e.slice(11,19)}function Ds(e,n){const t=[];for(const{event:r}of e){if(r.harness!==n)continue;const{hook_event_name:s,session_id:i,tool_name:o}=r.payload,c=typeof i=="string"?i:"";if(s==="PreToolUse"&&typeof o=="string")t.push({session:c,tool:o});else if(s==="PostToolUse"&&typeof o=="string")for(let p=t.length-1;p>=0;p--){const u=t[p];if(u&&u.session===c&&u.tool===o){t.splice(p,1);break}}else if(s==="Stop"||s==="SessionEnd")for(let p=t.length-1;p>=0;p--)t[p]?.session===c&&t.splice(p,1)}return t[t.length-1]?.tool}function Na(e,n,t,r){const s=e.filter(p=>p.event.harness===n),i=s[s.length-1];if(!i)return{active:!1,label:a(t==="none"?"panel.live.notWired":"panel.live.waitingForEvents")};const o=Date.parse(i.event.received_at);if(!Number.isFinite(o)||r-o>Ms)return{active:!1,get label(){return a("panel.live.quiet")}};const c=Ds(e,n);return{active:!0,label:c?a("panel.live.running",{p0:c}):Ra(i.event.payload.hook_event_name)}}function Oa(e){return e.replaying?a("panel.live.demoReplayMock"):e.connection==="open"?a("panel.live.liveConnectionEstablished"):e.connection==="retrying"?a("panel.live.disconnectedReconnectingAutomatically"):a("panel.live.connecting")}const Ma=[0,7,10,15,20,26,18,20,24,30,18,20,24,26,30,22,24,28,30,28,28,28,28,30,30,26,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],Fa=[0,1,1,1,1,1,2,2,2,2,4,4,4,4,4,6,6,6,6,7,8,8,9,9,10,12,12,12,13,14,15,16,17,18,19,19,20,21,22,24,25];function zn(e){const n=Math.floor(e/7)+2;return Math.floor(((16*e+128)*e+64-(e<2?0:(25*n-10)*n-55)-(e<7?0:36))/8)}function On(e,n){let t=0;for(let r=7;r>=0;r--)t=t<<1^(t>>>7)*285,t^=(n>>>r&1)*e;return t}function Ws(e,n){const t=Fa[n]??0,r=Ma[n]??0,s=t-zn(n)%t,i=Math.floor(zn(n)/t)-r,o=Array(r).fill(0);o[r-1]=1;let c=1;for(let f=0;f<r;f++){for(let h=0;h<r;h++)o[h]=On(o[h]??0,c)^(o[h+1]??0);c=On(c,2)}const p=[];let u=0;for(let f=0;f<t;f++){const h=e.slice(u,u+i+(f<s?0:1));u+=h.length;const v=Array(r).fill(0);for(const y of h){const w=y^(v.shift()??0);v.push(0),o.forEach((g,k)=>{v[k]=(v[k]??0)^On(g,w)})}f<s&&h.push(0),p.push([...h,...v])}const m=[];for(let f=0;f<i+1+r;f++)p.forEach((h,v)=>{(f!==i||v>=s)&&m.push(h[f]??0)});return m}function Hs(e){const n=new TextEncoder().encode(e);if(n.length>2953)throw new RangeError("QR data too long");let t=1;const r=g=>zn(g)-(Ma[g]??0)*(Fa[g]??0);for(;4+(t<10?8:16)+n.length*8>r(t)*8;)t++;const s=[],i=(g,k)=>{for(let S=k-1;S>=0;S--)s.push(g>>>S&1)};i(4,4),i(n.length,t<10?8:16);for(const g of n)i(g,8);i(0,Math.min(4,r(t)*8-s.length)),i(0,(8-s.length%8)%8);for(let g=236;s.length<r(t)*8;g^=253)i(g,8);const o=Array(s.length/8).fill(0);s.forEach((g,k)=>{o[k>>>3]=(o[k>>>3]??0)|g<<7-(k&7)});const c=Ws(o,t),p=t*4+17,u=Array.from({length:p},()=>Array(p).fill(!1)),m=Array.from({length:p},()=>Array(p).fill(!1)),f=(g,k,S)=>{const A=u[k],P=m[k];A&&P&&g>=0&&g<p&&(A[g]=S,P[g]=!0)};for(let g=0;g<p;g++)f(6,g,g%2===0),f(g,6,g%2===0);for(const[g=0,k=0]of[[3,3],[p-4,3],[3,p-4]])for(let S=-4;S<=4;S++)for(let A=-4;A<=4;A++){const P=Math.max(Math.abs(A),Math.abs(S));f(g+A,k+S,P!==2&&P!==4)}if(t>1){const g=Math.floor(t/7)+2,k=Math.floor((t*8+g*3+5)/(g*4-4))*2,S=[6];for(let A=p-7;S.length<g;A-=k)S.splice(1,0,A);S.forEach((A,P)=>{S.forEach((F,E)=>{if(!(P===0&&E===0||P===0&&E===g-1||P===g-1&&E===0))for(let K=-2;K<=2;K++)for(let C=-2;C<=2;C++)f(A+C,F+K,Math.max(Math.abs(C),Math.abs(K))!==1)})})}let h=8;for(let g=0;g<10;g++)h=h<<1^(h>>>9)*1335;const v=(8192|h)^21522,y=(g,k)=>(g>>>k&1)!==0;for(let g=0;g<=5;g++)f(8,g,y(v,g));f(8,7,y(v,6)),f(8,8,y(v,7)),f(7,8,y(v,8));for(let g=9;g<15;g++)f(14-g,8,y(v,g));for(let g=0;g<8;g++)f(p-1-g,8,y(v,g));for(let g=8;g<15;g++)f(8,p-15+g,y(v,g));if(f(8,p-8,!0),t>=7){let g=t;for(let k=0;k<12;k++)g=g<<1^(g>>>11)*7973;for(let k=0;k<18;k++){const S=p-11+k%3,A=Math.floor(k/3);f(S,A,y(t<<12|g,k)),f(A,S,y(t<<12|g,k))}}let w=0;for(let g=p-1;g>=1;g-=2){g===6&&(g=5);for(let k=0;k<p;k++)for(let S=0;S<2;S++){const A=g-S,P=(g+1&2)===0?p-1-k:k,F=u[P];if(m[P]?.[A]||!F)continue;const E=w<c.length*8&&y(c[w>>>3]??0,7-(w&7));F[A]=E!==((A+P)%2===0),w++}}return u}function Us(e){const n=Hs(e),t=n.length+8,r=n.flatMap((s,i)=>s.flatMap((o,c)=>o?[`M${c+4},${i+4}h1v1h-1z`]:[])).join("");return`<svg viewBox="0 0 ${t} ${t}" aria-hidden="true" shape-rendering="crispEdges"><rect width="${t}" height="${t}" fill="white"/><path d="${r}" fill="black"/></svg>`}const La={"cli.server.mobileRequiresLicense":"panel.mobile.requiresLicense","cli.server.fixturesMobile":"panel.render.demoModeActionsStopAtThe","mobile.keychainUnavailable":"panel.mobile.keychainUnavailable","mobile.stateUnavailable":"panel.mobile.stateUnavailable","mobile.localWriteFailed":"panel.mobile.localWriteFailed","mobile.relayUnavailable":"panel.mobile.relayUnavailable","mobile.unavailable":"panel.mobile.unavailable","mobile.invalidRelay":"panel.mobile.invalidRelay","mobile.pairNotFound":"panel.mobile.pairNotFound"};function Ge(e){const n=e instanceof Error?e.message:e;return typeof n=="string"&&Object.hasOwn(La,n)?n:"mobile.unavailable"}function q(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function Bs(e){if(e===null||typeof e!="object"||!("pairs"in e)||!Array.isArray(e.pairs))return null;const n=[];for(const t of e.pairs){if(t===null||typeof t!="object"||typeof t.pairId!="string"||!/^[A-Za-z0-9_-]+$/.test(t.pairId)||typeof t.relay!="string"||typeof t.pairedAt!="string"||!Number.isFinite(Date.parse(t.pairedAt))||!["pending","paired","unpaired"].includes(t.status)||t.paused!==void 0&&typeof t.paused!="boolean"||t.deviceName!==void 0&&typeof t.deviceName!="string"||t.subscribedAt!==void 0&&(typeof t.subscribedAt!="string"||!Number.isFinite(Date.parse(t.subscribedAt)))||t.lastSyncAt!==void 0&&(typeof t.lastSyncAt!="string"||!Number.isFinite(Date.parse(t.lastSyncAt))))return null;n.push({pairId:t.pairId,relay:t.relay,pairedAt:t.pairedAt,status:t.status,...t.paused===void 0?{}:{paused:t.paused},...t.deviceName===void 0?{}:{deviceName:t.deviceName},...t.subscribedAt===void 0?{}:{subscribedAt:t.subscribedAt},...t.lastSyncAt===void 0?{}:{lastSyncAt:t.lastSyncAt}})}return{pairs:n,..."error"in e&&e.error!==void 0?{error:Ge(e.error)}:{}}}function _s(e,n){const t={pairs:[],pairing:null,confirmPairId:null,busy:!1,error:null};let r,s=!1,i=!1,o=0,c=!0;function p(){s||n()}function u(){clearTimeout(r),!s&&c&&t.pairing&&!t.pairs.find(v=>v.pairId===t.pairing?.pairId)?.paused&&(r=setTimeout(()=>{m()},2e3))}async function m(){if(i||s||t.busy)return;i=!0;const v=o;try{const y=await e.list(c?t.pairing?.pairId:void 0);if(s||v!==o)return;if(t.pairs=y.pairs,t.error=y.error??null,t.pairing){const w=y.pairs.find(g=>g.pairId===t.pairing?.pairId);w?.status==="paired"?t.pairing=null:(!w||w.status==="unpaired")&&(t.pairing=null,t.error??="mobile.pairNotFound")}}catch(y){v===o&&(t.error=Ge(y))}finally{i=!1,p(),u()}}async function f(){if(!(t.busy||t.pairing)){t.busy=!0,t.error=null,t.notice=null,o++,p();try{const v=await e.create();t.pairing={pairId:v.pairId,svg:""},t.pairing.svg=Us(v.url)}catch(v){t.error=Ge(v)}finally{t.busy=!1,p(),u()}}}async function h(v){if(!t.busy){t.busy=!0,t.error=null,t.notice=null,o++,p();try{const y=await e.remove(v);y?.notice==="mobile.localRemoved"&&(t.notice=y.notice),t.pairs=t.pairs.filter(w=>w.pairId!==v),t.pairing?.pairId===v&&(t.pairing=null),t.confirmPairId=null}catch(y){t.error=Ge(y)}finally{t.busy=!1,p(),u()}}}return{state:t,load:m,pair:f,setVisible:v=>{c!==v&&(c=v,clearTimeout(r),c&&m())},cancelPairing:async()=>{t.pairing&&await h(t.pairing.pairId)},confirmUnpair:v=>{t.confirmPairId=v,t.error=null,p()},closeConfirmation:()=>{t.busy||(t.confirmPairId=null,t.error=null,p())},unpair:async()=>{t.confirmPairId&&await h(t.confirmPairId)},dispose:()=>{s=!0,clearTimeout(r)}}}function wt(e){return(e.notice==="mobile.localRemoved"?`<p class="cfgnote" role="status">${q(a("panel.mobile.localRemoved"))}</p>`:"")+(e.error?`<p class="merror" role="alert">${q(a(La[Ge(e.error)]))}</p>`:"")}function qs(e){const n=e??{pairs:[],pairing:null,confirmPairId:null,busy:!1,error:null},t=n.busy?" disabled":"",s=n.pairs.filter(o=>o.pairId!==n.pairing?.pairId).map(o=>`<li class="mobile-device" data-mobile-pair="${q(o.pairId)}">
110
- <div><strong>${q(o.deviceName??a("panel.mobile.unnamed"))}</strong><span class="statechip">${a(o.status==="paired"?"panel.mobile.paired":o.status==="pending"?"panel.mobile.pending":"panel.mobile.unpaired")}</span>
111
- <dl><dt>${a("panel.mobile.pairedAt")}</dt><dd><time datetime="${q(o.pairedAt)}" data-tip="GET /api/mobile · pairedAt · ${q(o.pairedAt)}">${q(fn(o.pairedAt))}</time></dd>
112
- <dt>${a("panel.mobile.lastSync")}</dt><dd>${o.lastSyncAt?`<time datetime="${q(o.lastSyncAt)}" data-tip="GET /api/mobile · lastSyncAt · ${q(o.lastSyncAt)}">${q(fn(o.lastSyncAt))}</time>`:a("panel.mobile.notSynced")}</dd></dl></div>
113
- <button class="btn ghost" data-act="mobile-unpair" data-pair="${q(o.pairId)}" type="button"${t}>${a("panel.mobile.unpair")}</button></li>`).join(""),i=n.pairing?`<div class="mobile-pairing" role="region" aria-label="${a("panel.mobile.scan")}">
108
+ `).map(C).join(`
109
+ `);let t=/^\.wingman\/plan\.md:(\d+) 当前点顶层祖先$/u.exec(e);return t?a("panel.source.ancestorLine",{line:t[1]??""}):(t=/^来源:(PermissionRequest|Notification) 事件,(.+) 起未决;阈值 60s$/u.exec(e),t?a("panel.source.waitingProvenance",{event:t[1]??"",since:t[2]??""}):(t=/^命中:(用户提示|agent 自述) —— 「(.*)」\(scanReferences 整词匹配\)$/u.exec(e),t?a("panel.source.referenceMatch",{origin:C(t[1]??""),context:t[2]??""}):(t=/^判定:本 session 工具步骤零命中 mcp__(.+)__\*\(transcript 观察\)$/u.exec(e),t?a("panel.source.unusedServer",{server:t[1]??""}):(t=/^条目:(.*)$/u.exec(e),t?a("panel.source.item",{path:t[1]??""}):(t=/^阈值:context ≥ (.+) 且历史占比 > 50%$/u.exec(e),t?a("panel.source.historyThreshold",{tokens:t[1]??""}):e)))))}const be={harness:"all",status:"all"};function Ne(e){return e.user.title===void 0?e.title:{text:e.user.title,source:Cs}}function Qe(e){const n=e.sessionPlan?.availability==="available"&&e.sessionPlan.forInstruction==="current"&&e.sessionPlan.steps.length>0&&e.sessionPlan.steps.every(t=>t.status==="completed");return{...xa(e),agentComplete:n}}function xa(e){if(e.waiting||e.feedback?.state==="needs_user")return{kind:"waiting",label:a("panel.taskboard.waitingForYou")};const n=e.waitOutcome?{note:{text:a(`panel.taskboard.${e.waitOutcome.outcome}`),kind:e.waitOutcome.outcome}}:{};return e.ended?{kind:"ended",label:a("panel.taskboard.ended"),...n}:e.turnEnded?{kind:"turnEnded",label:a("panel.taskboard.turnEnded"),...n}:{kind:"active",label:a("panel.taskboard.inProgress"),...n}}function Is(e){if(!(e?.availability!=="available"||e.forInstruction!=="current"))return{completed:e.steps.filter(n=>n.status==="completed").length,total:e.steps.length}}function bt(e){const n={waiting:0,turnEnded:1,active:2,ended:3};return[...e].sort((t,r)=>{const s=Number(r.user.pinned)-Number(t.user.pinned);if(s!==0)return s;const o=Qe(t).kind,i=Qe(r).kind,c=n[o]-n[i];return c!==0?c:o!=="active"?0:t.lastActivity===void 0?r.lastActivity===void 0?0:1:r.lastActivity===void 0?-1:r.lastActivity.localeCompare(t.lastActivity)})}function yt(e){return{visible:e.filter(n=>!n.user.hidden),hidden:e.filter(n=>n.user.hidden)}}function Ca(e){return e.harness==="dsh"?{unavailable:a("panel.taskboard.dshHasNoObservedCommandTo")}:e.harness==="codex"?{command:`codex resume ${e.id}`,note:a("panel.taskboard.sourceSessionIdFromHookEvents")}:e.cwd===void 0?{command:`claude --resume ${e.id}`,note:a("panel.taskboard.sourceSessionIdFromHookEvents132")}:{command:`cd "${Rs(e.cwd)}" && claude --resume ${e.id}`,note:a("panel.taskboard.sourceSessionIdAndWorkingDirectory")}}function Rs(e){return e.replace(/[\\"$`]/g,"\\$&")}function kt(e,n){return e.filter(t=>(n.harness==="all"||t.harness===n.harness)&&(n.status==="all"||Qe(t).kind===n.status))}function $t(e,n){return e.filter(t=>n.harness==="all"||"payloadUnavailable"in t||kt(yt(t.sessions.filter(r=>!ye(r.harness,r.id,{projects:e}))).visible,n).length>0)}function mn(e,n=[]){return e.filter(t=>!re(t)).sort((t,r)=>{const s="payloadUnavailable"in t?void 0:t.user,o="payloadUnavailable"in r?void 0:r.user,i=+(o?.pinned===!0)-+(s?.pinned===!0);if(i!==0)return i;if(s?.pinned&&o?.pinned)return(s.order??Number.MAX_SAFE_INTEGER)-(o.order??Number.MAX_SAFE_INTEGER)||t.root.localeCompare(r.root);const c=n.indexOf(t.root),p=n.indexOf(r.root);return(c<0?n.length:c)-(p<0?n.length:p)})}function nn(e,n,t,r){return e.find(s=>!("payloadUnavailable"in s)&&s.sessions.some(o=>o.harness===n&&o.id===t))??e.find(s=>s.root===r)}function re(e){return!("payloadUnavailable"in e)&&e.user?.archived===!0}function ye(e,n,t){return t?.projects.some(r=>!("payloadUnavailable"in r)&&r.sessions.some(s=>s.harness===e&&s.id===n&&(re(r)||s.user.archived===!0)))??!1}const Ia=7;function Fn(e,n){return e.ended&&Date.parse(e.lastActivity)<n-Ia*864e5}function ke(e,n){if(e===null)return null;const t=n?.projects.filter(re)??[],r=new Set(e.sessions.filter(s=>s.archived===!0||ye(e.harness,s.id,n)).map(s=>s.id));for(const[s,o]of Object.entries(e.states))(ye(e.harness,s,n)||t.some(i=>i.root===o.project?.root))&&r.add(s);return r.size===0?e:{...e,sessions:e.sessions.filter(s=>!r.has(s.id)),states:Object.fromEntries(Object.entries(e.states).filter(([s])=>!r.has(s)))}}function wt(e){return new URLSearchParams(e).get("island")==="1"}function Ra(e){return wt(e)&&new URLSearchParams(e).get("size")==="compact"}function St(e){const n=Tt(e);return wt(e)&&(n==="left"||n==="right")&&new URLSearchParams(e).get("tab")==="1"}function Tt(e){const n=new URLSearchParams(e).get("edge");return n==="bottom"||n==="left"||n==="right"?n:"top"}function js(e,n,t=null,r=null,s=null,o=null){const i=e?`#island=open${n?`:${Jt(n)}`:""}`:`#island=pill:${Jt(n??{x:0,y:0,w:0,h:0})}`,c=t?`;focus:${t.target},${t.seq}`:"",p=r?`;waiting:${Math.round(r.sinceMs)},${encodeURIComponent(r.message)}`:"",u=s===null?"":`;reveal:${s}`,m=o===null?"":`;transition:${o}`;return`${i}${c}${p}${u}${m}`}function Jt(e){return`${Math.round(e.x)},${Math.round(e.y)},${Math.round(e.w)},${Math.round(e.h)}`}function Es(e){return e.island&&e.open&&!e.inPanel&&!e.modalOpen}const ja="https://billing.stripe.com/p/login/14AcMZ8Z147F4MmaTKcMM00",Ea="https://buy.stripe.com/6oUbIV5MPbA792C8LCcMM04",Ns=["none","invalid","active","grace","expired"];function kn(e){if(typeof e!="object"||e===null)return null;const n=e;if(!Ns.includes(n.state)||typeof n.detail!="string"||n.plan!==void 0&&n.plan!=="trial"&&n.plan!=="subscription"||n.exp!==void 0&&typeof n.exp!="string")return null;if(n.activation!==void 0){const t=n.activation;if(!t||typeof t!="object"||!["active","device_limit","device_revoked","unavailable","pending"].includes(t.state)||!Number.isInteger(t.maxDevices)||t.maxDevices<1||t.detail!==void 0&&typeof t.detail!="string"||!Array.isArray(t.devices)||t.devices.some(r=>!r||typeof r.id!="string"||!r.id||r.name!==void 0&&typeof r.name!="string"||typeof r.registeredAt!="string"||!Number.isFinite(Date.parse(r.registeredAt))||typeof r.renewedAt!="string"||!Number.isFinite(Date.parse(r.renewedAt))))return null}if(n.freeHarnessSwitchableAt!==void 0){const t=n.freeHarnessSwitchableAt;if(typeof t!="string"||!Number.isFinite(Date.parse(t))||new Date(t).toISOString()!==t)return null}return n.tier!==void 0&&n.tier!=="full"&&n.tier!=="free"||(n.tier==="free"||n.freeHarness!==void 0)&&!["cc","codex","dsh"].includes(n.freeHarness)?null:{state:n.state,detail:n.detail,...n.plan===void 0?{}:{plan:n.plan},...n.exp===void 0?{}:{exp:n.exp},...n.activation===void 0?{}:{activation:n.activation},...n.tier===void 0?{}:{tier:n.tier},...n.freeHarness===void 0?{}:{freeHarness:n.freeHarness},...n.freeHarnessSwitchableAt===void 0?{}:{freeHarnessSwitchableAt:n.freeHarnessSwitchableAt}}}function pe(e,n){return n?.tier==="free"&&e!==n.freeHarness}function At(e,n){return pe(e,n)?n?.freeHarness??e:e}function Na(e){if(e?.tier==="free")return"free";if(e?.plan==="trial"){if(e.state==="active")return"trial-active";if(e.state==="expired")return"trial-expired"}return e&&(e.state==="grace"||e.state==="expired")?e.state:null}function Os(e){return e?a("panel.license.licenseImported",{p0:e.detail}):a("panel.license.licenseImportedNewStatusUnknownRefresh")}function Ms(e){if(e.length!==1)return a("panel.license.dropOneLicenseJsonFileAt",{p0:e.length});const n=e[0]??"";return n.toLowerCase().endsWith(".json")?null:a("panel.license.onlyJsonFilesAreAcceptedReceived",{p0:n})}function $n(e){return $a.flatMap(n=>{if(!e.configs.some(r=>r.harness===n)||pe(n,e.license))return[];const t=ke(e.narratives?.[n]??null,e.projects??null);return(t?.sessions??[]).map(r=>({harness:n,session:r,narrative:t?.states[r.id]}))})}function Oa(e){return $n(e).filter(({session:n})=>n.lastInstruction!==void 0)}function Fs(e){return Oa(e).filter(({session:n})=>!n.ended)}function Ls(e){const n=[];for(const{harness:t,session:r,narrative:s}of $n(e)){const o=s?.taskWorkflow?.feedback;if(r.waiting||o?.state==="needs_user"){const i=s?.waiting??void 0,c=o?.state==="needs_user"?o.since:void 0;n.push({harness:t,id:r.id,label:r.label,kind:"waiting",at:i?.since??c??"",...i===void 0?{}:{waiting:{label:r.label,message:i.message,since:i.since}}})}}for(const{harness:t,session:r}of Fs(e))!n.some(s=>s.harness===t&&s.id===r.id)&&r.turnEnded&&r.turnEndedAt!==void 0&&e.turnEndedAck?.[`${t}:${r.id}`]!==r.turnEndedAt&&n.push({harness:t,id:r.id,label:r.label,kind:"turnEnded",at:r.turnEndedAt});return n.sort((t,r)=>+(r.kind==="waiting")-+(t.kind==="waiting")||(Date.parse(r.at)||0)-(Date.parse(t.at)||0))}function Pt(e){const n=Ls(e),t=n[0];return t?{...t,extra:n.length-1,others:n.slice(1)}:void 0}function Ds(e,n){const t=[...e.classList].filter(r=>r.startsWith("island-"));e.className=n.className,e.classList.add(...t),e.innerHTML=n.innerHTML,e.dataset.tip=n.dataset.tip??""}function Ws(e){let n=null,t=!1,r=()=>{};const s=["island-reveal","island-retract","island-prepare","island-edge-left","island-edge-right","island-motion-reduced"],o=()=>{r(),n?.classList.remove(...s),n=null,t=!1};return{get active(){return t},get element(){return n},start(i,c,p,u,m){if(c!=="left"&&c!=="right"){o();return}const f=p==="prepare"||p==="reveal"&&(n!==i||i.classList.contains("island-prepare"));if(r(),n=i,t=!0,i.classList.remove(...s),i.classList.add(p==="retract"?"island-retract":"island-reveal",`island-edge-${c}`),m&&i.classList.add("island-motion-reduced"),f&&i.classList.add("island-prepare"),p==="prepare")return;let h,v,y=!1;const $=()=>{y||(r(),t=!1,e(p,u))},g=S=>{S.target===i&&S.propertyName==="opacity"&&$()};r=()=>{y=!0,h!==void 0&&cancelAnimationFrame(h),v!==void 0&&clearTimeout(v),i.removeEventListener("transitionend",g)};const k=()=>{i.classList.remove("island-prepare"),i.addEventListener("transitionend",g),p==="reveal"&&(v=setTimeout($,m?80:200))};f?(i.offsetWidth,h=requestAnimationFrame(k)):k()},cancel:o}}const Hs=50,Us=15e3,Bs={get SessionStart(){return a("panel.live.sessionStarted")},get SessionEnd(){return a("panel.live.sessionEnded")},get UserPromptSubmit(){return a("panel.live.promptSubmitted")},get PreToolUse(){return a("panel.live.toolCallStarted")},get PostToolUse(){return a("panel.live.toolCallCompleted")},get PostToolBatch(){return a("panel.live.toolBatchCompleted")},get Stop(){return a("panel.live.turnEnded")},get SubagentStart(){return a("panel.live.subagentStarted")},get SubagentStop(){return a("panel.live.subagentEnded")},get PreCompact(){return a("panel.live.compactionStarted")},get PostCompact(){return a("panel.live.compactionCompleted")},get ConfigChange(){return a("panel.live.configurationChanged")},get InstructionsLoaded(){return a("panel.live.instructionsLoaded")},get Notification(){return a("panel.live.notification")},get PermissionRequest(){return a("panel.live.permissionRequest")}};function Ma(e){return Bs[e]??e}function _s(e,n,t=Hs){if(n.sseId!==void 0&&e.some(s=>s.sseId===n.sseId))return[...e];const r=[...e,n];return r.length>t?r.slice(r.length-t):r}function Fa(e){return e.slice(11,19)}function qs(e,n){const t=[];for(const{event:r}of e){if(r.harness!==n)continue;const{hook_event_name:s,session_id:o,tool_name:i}=r.payload,c=typeof o=="string"?o:"";if(s==="PreToolUse"&&typeof i=="string")t.push({session:c,tool:i});else if(s==="PostToolUse"&&typeof i=="string")for(let p=t.length-1;p>=0;p--){const u=t[p];if(u&&u.session===c&&u.tool===i){t.splice(p,1);break}}else if(s==="Stop"||s==="SessionEnd")for(let p=t.length-1;p>=0;p--)t[p]?.session===c&&t.splice(p,1)}return t[t.length-1]?.tool}function La(e,n,t,r){const s=e.filter(p=>p.event.harness===n),o=s[s.length-1];if(!o)return{active:!1,label:a(t==="none"?"panel.live.notWired":"panel.live.waitingForEvents")};const i=Date.parse(o.event.received_at);if(!Number.isFinite(i)||r-i>Us)return{active:!1,get label(){return a("panel.live.quiet")}};const c=qs(e,n);return{active:!0,label:c?a("panel.live.running",{p0:c}):Ma(o.event.payload.hook_event_name)}}function Da(e){return e.replaying?a("panel.live.demoReplayMock"):e.connection==="open"?a("panel.live.liveConnectionEstablished"):e.connection==="retrying"?a("panel.live.disconnectedReconnectingAutomatically"):a("panel.live.connecting")}const Wa=[0,7,10,15,20,26,18,20,24,30,18,20,24,26,30,22,24,28,30,28,28,28,28,30,30,26,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],Ha=[0,1,1,1,1,1,2,2,2,2,4,4,4,4,4,6,6,6,6,7,8,8,9,9,10,12,12,12,13,14,15,16,17,18,19,19,20,21,22,24,25];function nt(e){const n=Math.floor(e/7)+2;return Math.floor(((16*e+128)*e+64-(e<2?0:(25*n-10)*n-55)-(e<7?0:36))/8)}function Ln(e,n){let t=0;for(let r=7;r>=0;r--)t=t<<1^(t>>>7)*285,t^=(n>>>r&1)*e;return t}function Vs(e,n){const t=Ha[n]??0,r=Wa[n]??0,s=t-nt(n)%t,o=Math.floor(nt(n)/t)-r,i=Array(r).fill(0);i[r-1]=1;let c=1;for(let f=0;f<r;f++){for(let h=0;h<r;h++)i[h]=Ln(i[h]??0,c)^(i[h+1]??0);c=Ln(c,2)}const p=[];let u=0;for(let f=0;f<t;f++){const h=e.slice(u,u+o+(f<s?0:1));u+=h.length;const v=Array(r).fill(0);for(const y of h){const $=y^(v.shift()??0);v.push(0),i.forEach((g,k)=>{v[k]=(v[k]??0)^Ln(g,$)})}f<s&&h.push(0),p.push([...h,...v])}const m=[];for(let f=0;f<o+1+r;f++)p.forEach((h,v)=>{(f!==o||v>=s)&&m.push(h[f]??0)});return m}function Gs(e){const n=new TextEncoder().encode(e);if(n.length>2953)throw new RangeError("QR data too long");let t=1;const r=g=>nt(g)-(Wa[g]??0)*(Ha[g]??0);for(;4+(t<10?8:16)+n.length*8>r(t)*8;)t++;const s=[],o=(g,k)=>{for(let S=k-1;S>=0;S--)s.push(g>>>S&1)};o(4,4),o(n.length,t<10?8:16);for(const g of n)o(g,8);o(0,Math.min(4,r(t)*8-s.length)),o(0,(8-s.length%8)%8);for(let g=236;s.length<r(t)*8;g^=253)o(g,8);const i=Array(s.length/8).fill(0);s.forEach((g,k)=>{i[k>>>3]=(i[k>>>3]??0)|g<<7-(k&7)});const c=Vs(i,t),p=t*4+17,u=Array.from({length:p},()=>Array(p).fill(!1)),m=Array.from({length:p},()=>Array(p).fill(!1)),f=(g,k,S)=>{const A=u[k],P=m[k];A&&P&&g>=0&&g<p&&(A[g]=S,P[g]=!0)};for(let g=0;g<p;g++)f(6,g,g%2===0),f(g,6,g%2===0);for(const[g=0,k=0]of[[3,3],[p-4,3],[3,p-4]])for(let S=-4;S<=4;S++)for(let A=-4;A<=4;A++){const P=Math.max(Math.abs(A),Math.abs(S));f(g+A,k+S,P!==2&&P!==4)}if(t>1){const g=Math.floor(t/7)+2,k=Math.floor((t*8+g*3+5)/(g*4-4))*2,S=[6];for(let A=p-7;S.length<g;A-=k)S.splice(1,0,A);S.forEach((A,P)=>{S.forEach((F,j)=>{if(!(P===0&&j===0||P===0&&j===g-1||P===g-1&&j===0))for(let K=-2;K<=2;K++)for(let x=-2;x<=2;x++)f(A+x,F+K,Math.max(Math.abs(x),Math.abs(K))!==1)})})}let h=8;for(let g=0;g<10;g++)h=h<<1^(h>>>9)*1335;const v=(8192|h)^21522,y=(g,k)=>(g>>>k&1)!==0;for(let g=0;g<=5;g++)f(8,g,y(v,g));f(8,7,y(v,6)),f(8,8,y(v,7)),f(7,8,y(v,8));for(let g=9;g<15;g++)f(14-g,8,y(v,g));for(let g=0;g<8;g++)f(p-1-g,8,y(v,g));for(let g=8;g<15;g++)f(8,p-15+g,y(v,g));if(f(8,p-8,!0),t>=7){let g=t;for(let k=0;k<12;k++)g=g<<1^(g>>>11)*7973;for(let k=0;k<18;k++){const S=p-11+k%3,A=Math.floor(k/3);f(S,A,y(t<<12|g,k)),f(A,S,y(t<<12|g,k))}}let $=0;for(let g=p-1;g>=1;g-=2){g===6&&(g=5);for(let k=0;k<p;k++)for(let S=0;S<2;S++){const A=g-S,P=(g+1&2)===0?p-1-k:k,F=u[P];if(m[P]?.[A]||!F)continue;const j=$<c.length*8&&y(c[$>>>3]??0,7-($&7));F[A]=j!==((A+P)%2===0),$++}}return u}function Ks(e){const n=Gs(e),t=n.length+8,r=n.flatMap((s,o)=>s.flatMap((i,c)=>i?[`M${c+4},${o+4}h1v1h-1z`]:[])).join("");return`<svg viewBox="0 0 ${t} ${t}" aria-hidden="true" shape-rendering="crispEdges"><rect width="${t}" height="${t}" fill="white"/><path d="${r}" fill="black"/></svg>`}const Ua={"cli.server.mobileRequiresLicense":"panel.mobile.requiresLicense","cli.server.fixturesMobile":"panel.render.demoModeActionsStopAtThe","mobile.keychainUnavailable":"panel.mobile.keychainUnavailable","mobile.stateUnavailable":"panel.mobile.stateUnavailable","mobile.localWriteFailed":"panel.mobile.localWriteFailed","mobile.relayUnavailable":"panel.mobile.relayUnavailable","mobile.unavailable":"panel.mobile.unavailable","mobile.invalidRelay":"panel.mobile.invalidRelay","mobile.pairNotFound":"panel.mobile.pairNotFound"};function Ge(e){const n=e instanceof Error?e.message:e;return typeof n=="string"&&Object.hasOwn(Ua,n)?n:"mobile.unavailable"}function U(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function Ys(e){if(e===null||typeof e!="object"||!("pairs"in e)||!Array.isArray(e.pairs))return null;const n=[];for(const t of e.pairs){if(t===null||typeof t!="object"||typeof t.pairId!="string"||!/^[A-Za-z0-9_-]+$/.test(t.pairId)||typeof t.relay!="string"||typeof t.pairedAt!="string"||!Number.isFinite(Date.parse(t.pairedAt))||!["pending","paired","unpaired"].includes(t.status)||t.paused!==void 0&&typeof t.paused!="boolean"||t.expired!==void 0&&typeof t.expired!="boolean"||t.deviceName!==void 0&&typeof t.deviceName!="string"||t.subscribedAt!==void 0&&(typeof t.subscribedAt!="string"||!Number.isFinite(Date.parse(t.subscribedAt)))||t.lastSyncAt!==void 0&&(typeof t.lastSyncAt!="string"||!Number.isFinite(Date.parse(t.lastSyncAt))))return null;n.push({pairId:t.pairId,relay:t.relay,pairedAt:t.pairedAt,status:t.status,...t.paused===void 0?{}:{paused:t.paused},...t.expired===void 0?{}:{expired:t.expired},...t.deviceName===void 0?{}:{deviceName:t.deviceName},...t.subscribedAt===void 0?{}:{subscribedAt:t.subscribedAt},...t.lastSyncAt===void 0?{}:{lastSyncAt:t.lastSyncAt}})}return{pairs:n,..."error"in e&&e.error!==void 0?{error:Ge(e.error)}:{}}}function Js(e,n){const t={pairs:[],pairing:null,confirmPairId:null,busy:!1,error:null};let r,s=!1,o=!1,i=0,c=!0;function p(){s||n()}function u(){clearTimeout(r);const v=t.pairs.find(y=>y.pairId===t.pairing?.pairId);!s&&c&&t.pairing&&!v?.paused&&!v?.expired&&(r=setTimeout(()=>{m()},2e3))}async function m(){if(o||s||t.busy)return;o=!0;const v=i;try{const y=await e.list(c?t.pairing?.pairId:void 0);if(s||v!==i)return;if(t.pairs=y.pairs,t.error=y.error??null,t.pairing){const $=y.pairs.find(g=>g.pairId===t.pairing?.pairId);$?.status==="paired"?t.pairing=null:(!$||$.status==="unpaired")&&(t.pairing=null,t.error??="mobile.pairNotFound")}}catch(y){v===i&&(t.error=Ge(y))}finally{o=!1,p(),u()}}async function f(){if(!(t.busy||t.pairing)){t.busy=!0,t.error=null,t.notice=null,i++,p();try{for(const y of t.pairs.filter($=>$.status==="pending")){const $=await e.remove(y.pairId);$?.notice==="mobile.localRemoved"&&(t.notice=$.notice),t.pairs=t.pairs.filter(g=>g.pairId!==y.pairId)}const v=await e.create();t.pairing={pairId:v.pairId,svg:""},t.pairing.svg=Ks(v.url)}catch(v){t.error=Ge(v)}finally{t.busy=!1,p(),u()}}}async function h(v){if(t.busy)return!1;t.busy=!0,t.error=null,t.notice=null,i++,p();try{const y=await e.remove(v);return y?.notice==="mobile.localRemoved"&&(t.notice=y.notice),t.pairs=t.pairs.filter($=>$.pairId!==v),t.pairing?.pairId===v&&(t.pairing=null),t.confirmPairId=null,!0}catch(y){return t.error=Ge(y),!1}finally{t.busy=!1,p(),u()}}return{state:t,load:m,pair:f,regenerate:async v=>{const y=t.pairs.find(g=>g.pairId===v);if(y?.status!=="pending"||!y.expired||t.pairing&&t.pairing.pairId!==v||!await h(v))return;const $=t.notice;await f(),$&&!t.notice&&(t.notice=$,p())},setVisible:v=>{c!==v&&(c=v,clearTimeout(r),c&&m())},cancelPairing:async()=>{t.pairing&&await h(t.pairing.pairId)},confirmUnpair:v=>{t.confirmPairId=v,t.error=null,p()},closeConfirmation:()=>{t.busy||(t.confirmPairId=null,t.error=null,p())},unpair:async()=>{t.confirmPairId&&await h(t.confirmPairId)},dispose:()=>{s=!0,clearTimeout(r)}}}function xt(e){return(e.notice==="mobile.localRemoved"?`<p class="cfgnote" role="status">${U(a("panel.mobile.localRemoved"))}</p>`:"")+(e.error?`<p class="merror" role="alert">${U(a(Ua[Ge(e.error)]))}</p>`:"")}function zs(e){const n=e??{pairs:[],pairing:null,confirmPairId:null,busy:!1,error:null},t=n.busy?" disabled":"",r=`GET /api/mobile · pairs[].expired = true · ${U(a("panel.mobile.expiredTip"))}`,s=u=>`<button class="btn" data-act="mobile-regenerate" data-pair="${U(u)}" type="button"${t}>${a("panel.mobile.regenerate")}</button>`,i=n.pairs.filter(u=>u.pairId!==n.pairing?.pairId).map(u=>{const m=u.status==="pending"&&u.expired;return`<li class="mobile-device" data-mobile-pair="${U(u.pairId)}">
110
+ <div><strong>${U(u.deviceName??a("panel.mobile.unnamed"))}</strong><span class="statechip"${m?` data-tip="${r}"`:""}>${a(u.status==="paired"?"panel.mobile.paired":u.status==="pending"?m?"panel.mobile.expired":"panel.mobile.pending":"panel.mobile.unpaired")}</span>
111
+ <dl><dt>${a("panel.mobile.pairedAt")}</dt><dd><time datetime="${U(u.pairedAt)}" data-tip="GET /api/mobile · pairedAt · ${U(u.pairedAt)}">${U(fn(u.pairedAt))}</time></dd>
112
+ <dt>${a("panel.mobile.lastSync")}</dt><dd>${u.lastSyncAt?`<time datetime="${U(u.lastSyncAt)}" data-tip="GET /api/mobile · lastSyncAt · ${U(u.lastSyncAt)}">${U(fn(u.lastSyncAt))}</time>`:a("panel.mobile.notSynced")}</dd></dl></div>
113
+ ${m&&!n.pairing?s(u.pairId):""}<button class="btn ghost" data-act="mobile-unpair" data-pair="${U(u.pairId)}" type="button"${t}>${a("panel.mobile.unpair")}</button></li>`}).join(""),c=n.pairs.some(u=>u.pairId===n.pairing?.pairId&&u.status==="pending"&&u.expired),p=n.pairing?c?`<div class="mobile-pairing" role="region" aria-label="${a("panel.mobile.qrExpired")}">
114
+ <p class="cfgnote" role="status" data-tip="${r}">${a("panel.mobile.qrExpired")}</p>
115
+ ${s(n.pairing.pairId)}
116
+ <button class="btn ghost" data-act="mobile-cancel" type="button"${t}>${a("panel.mobile.cancel")}</button></div>`:`<div class="mobile-pairing" role="region" aria-label="${a("panel.mobile.scan")}">
114
117
  <div class="mobile-qr" role="img" aria-label="${a("panel.mobile.qrLabel")}">${n.pairing.svg}</div>
115
118
  <p class="cfgnote">${a("panel.mobile.scan")}</p><p class="cfgnote">${a("panel.mobile.autoClose")}</p>
116
- <button class="btn ghost" data-act="mobile-cancel" type="button"${t}>${a("panel.mobile.cancel")}</button></div>`:"";return`<section class="sec mobile-section" aria-labelledby="mobile-heading"><div class="label" id="mobile-heading" data-tip="${q(a("panel.mobile.disclosure"))}">${a("panel.mobile.heading")}</div>
117
- ${n.confirmPairId?"":wt(n)}${i}${s?`<ul class="mobile-devices">${s}</ul>`:""}
118
- ${n.pairing?"":`<button class="btn" data-act="mobile-pair" type="button"${t}>${a(n.busy?"panel.mobile.working":"panel.mobile.pair")}</button>`}</section>`}function Vs(e){const n=e?.pairs.filter(o=>o.status==="paired")??[];if(!e)return"";const t=o=>`<li class="mobile-device" data-mobile-pair="${q(o.pairId)}">
119
- <div><strong>${q(o.deviceName??a("panel.mobile.unnamed"))}</strong>${o.status==="unpaired"?`<span class="statechip">${a("panel.mobile.unpaired")}</span>`:""}</div>
120
- <button class="btn ghost" data-act="mobile-unpair" data-pair="${q(o.pairId)}" type="button"${e.busy?" disabled":""}>${a("panel.mobile.unpair")}</button></li>`,r=e.pairs.filter(o=>o.status==="unpaired"&&(o.subscribedAt||o.lastSyncAt)).map(t).join(""),s=r?`<ul class="mobile-devices">${r}</ul>`:"",i=e.confirmPairId?"":wt(e);return n.length===0?s?`<section class="sec mobile-section" aria-labelledby="mobile-billing-heading"><div class="label" id="mobile-billing-heading">${a("panel.mobile.heading")}</div>${i}${s}</section>`:i:`<section class="sec mobile-section" aria-labelledby="mobile-billing-heading"><div class="label" id="mobile-billing-heading">${a("panel.mobile.heading")}</div>
119
+ <button class="btn ghost" data-act="mobile-cancel" type="button"${t}>${a("panel.mobile.cancel")}</button></div>`:"";return`<section class="sec mobile-section" aria-labelledby="mobile-heading"><div class="label" id="mobile-heading" data-tip="${U(a("panel.mobile.disclosure"))}">${a("panel.mobile.heading")}</div>
120
+ ${n.confirmPairId?"":xt(n)}${p}${i?`<ul class="mobile-devices">${i}</ul>`:""}
121
+ ${n.pairing?"":`<button class="btn" data-act="mobile-pair" type="button"${t}>${a(n.busy?"panel.mobile.working":"panel.mobile.pair")}</button>`}</section>`}function Qs(e){const n=e?.pairs.filter(i=>i.status==="paired")??[];if(!e)return"";const t=i=>`<li class="mobile-device" data-mobile-pair="${U(i.pairId)}">
122
+ <div><strong>${U(i.deviceName??a("panel.mobile.unnamed"))}</strong>${i.status==="unpaired"?`<span class="statechip">${a("panel.mobile.unpaired")}</span>`:""}</div>
123
+ <button class="btn ghost" data-act="mobile-unpair" data-pair="${U(i.pairId)}" type="button"${e.busy?" disabled":""}>${a("panel.mobile.unpair")}</button></li>`,r=e.pairs.filter(i=>i.status==="unpaired"&&(i.subscribedAt||i.lastSyncAt)).map(t).join(""),s=r?`<ul class="mobile-devices">${r}</ul>`:"",o=e.confirmPairId?"":xt(e);return n.length===0?s?`<section class="sec mobile-section" aria-labelledby="mobile-billing-heading"><div class="label" id="mobile-billing-heading">${a("panel.mobile.heading")}</div>${o}${s}</section>`:o:`<section class="sec mobile-section" aria-labelledby="mobile-billing-heading"><div class="label" id="mobile-billing-heading">${a("panel.mobile.heading")}</div>
121
124
  <p class="cfgnote" data-tip="GET /api/mobile · pairs[].status = paired">${a("panel.mobile.pairedCount",{count:n.length})} (${a("panel.mobile.paused")})</p>
122
- ${i}<ul class="mobile-devices">${n.map(t).join("")}</ul></section>${s}`}function Gs(e){if(!e?.confirmPairId)return"";const n=e.pairs.find(t=>t.pairId===e.confirmPairId);return`<div class="overlay mobile-overlay"><div class="scrim"${e.busy?"":' data-act="mobile-close"'}></div>
125
+ ${o}<ul class="mobile-devices">${n.map(t).join("")}</ul></section>${s}`}function Xs(e){if(!e?.confirmPairId)return"";const n=e.pairs.find(t=>t.pairId===e.confirmPairId);return`<div class="overlay mobile-overlay"><div class="scrim"${e.busy?"":' data-act="mobile-close"'}></div>
123
126
  <div class="modal" role="dialog" aria-modal="true" aria-labelledby="mobile-unpair-title" aria-describedby="mobile-unpair-description">
124
127
  <div class="mhead"><span class="mtitle" id="mobile-unpair-title">${a("panel.mobile.unpair")}</span></div>
125
- <p class="mtext" id="mobile-unpair-description">${q(a("panel.mobile.confirm",{name:n?.deviceName??a("panel.mobile.unnamed")}))}</p>${wt(e)}
128
+ <p class="mtext" id="mobile-unpair-description">${U(a("panel.mobile.confirm",{name:n?.deviceName??a("panel.mobile.unnamed")}))}</p>${xt(e)}
126
129
  <div class="mact"><button class="btn ghost" data-act="mobile-close" type="button"${e.busy?" disabled":""}>${a("panel.mobile.keep")}</button>
127
- <button class="btn primary" data-act="mobile-confirm" type="button"${e.busy?" disabled":""}>${a(e.busy?"panel.mobile.working":"panel.mobile.unpair")}</button></div></div></div>`}function Ks(e){if(!Array.isArray(e))throw new Error(a("panel.narrative.payloadNotArray"));for(const n of e){if(!T(n))throw new Error(a("panel.narrative.payloadEntryNotObject"));if(typeof n.harness!="string"||typeof n.scannedAt!="string")throw new Error(a("panel.narrative.payloadMissingFields"));const t=n.slots;for(const s of Fe){if(!T(t)||!Array.isArray(t[s]))throw new Error(a("panel.narrative.missingSlot",{harness:n.harness,slot:s}));if(s==="skills"&&t[s].some(i=>T(i)&&(i.invocation!==void 0&&!["auto","manual","agent-only","off"].includes(i.invocation)||i.invocationSource!==void 0&&!["frontmatter","settings"].includes(i.invocationSource))))throw new Error(a("panel.narrative.invalidSkillInvocation",{harness:n.harness}));for(const i of t[s]){if(!T(i)||i.ccFeature===void 0)continue;const o=i.ccFeature;if(!T(o)||Object.keys(o).some(c=>!["key","value","source","overriddenBy","invalid","partial"].includes(c))||n.harness!=="cc"||s!=="gates"||!["autoMemoryEnabled","crossSessionInbound","permissions.deny"].includes(o.key)||i.id!==`cc:gates:user:${o.key}`||!["user","default"].includes(o.source)||o.overriddenBy!==void 0&&!["project","local","managed"].includes(o.overriddenBy)||o.invalid!==void 0&&typeof o.invalid!="boolean"||o.partial!==void 0&&(typeof o.partial!="boolean"||o.key!=="permissions.deny"||o.value!==!1)||o.value!=="unknown"&&(o.key==="crossSessionInbound"?!["accept","hold","refuse","default"].includes(o.value):typeof o.value!="boolean")||o.value==="unknown"&&o.invalid!==!0||(o.overriddenBy!==void 0||o.invalid===!0)&&i.toggleable!==!1)throw new Error(a("panel.render.ccInvalidPayload"))}}const r=n.planProtocol;if(r!==void 0&&(!T(r)||typeof r.user!="string"||!["installed","outdated","missing","modified","unsupported"].includes(r.user)))throw new Error(a("panel.narrative.invalidUserProtocol",{harness:n.harness}));if(T(r)&&r.project!==void 0&&!["not_installed","installed","outdated","modified","invalid","installed_not_loaded"].includes(r.project))throw new Error(a("panel.narrative.invalidProjectProtocol",{harness:n.harness}))}return e}function Ys(e){return T(e)&&(e.activated===!0&&M(e,["activated","name"])&&typeof e.name=="string"&&e.name!==""||e.activated===!1&&M(e,["activated","reason"])&&typeof e.reason=="string"&&e.reason!=="")?e:null}function Js(e){return!T(e)||!M(e,["available","selected","settings"])||!Array.isArray(e.available)||!e.available.every(n=>T(n)&&M(n,["name","bundlePath"])&&typeof n.name=="string"&&n.name!==""&&typeof n.bundlePath=="string"&&n.bundlePath!=="")||e.selected!==void 0&&!Da(e.selected)||e.settings!==void 0&&(!Wa(e.settings)||e.settings.unavailable==="")?null:e}function zs(e){return!T(e)||!M(e,["selected"])||!Da(e.selected)?null:e}function Da(e){return T(e)&&M(e,["bundlePath"])&&typeof e.bundlePath=="string"&&e.bundlePath!==""}function Qs(e){if(typeof e!="object"||e===null)return null;const n=e;return typeof n.harness!="string"||!Array.isArray(n.todos)||!Array.isArray(n.traces)||!Array.isArray(n.turnUsages)||typeof n.updatedAt!="string"||n.suggestions!==void 0&&(!Array.isArray(n.suggestions)||!n.suggestions.every(t=>T(t)&&(t.textI18n===void 0||yn(t.textI18n))))||n.taskWorkflow!==void 0&&!wo(n.taskWorkflow)||n.origin!==void 0&&!Tt(n.origin)||n.project!==void 0&&!ko(n.project)||n.skillsUsed!==void 0&&!dn(n.skillsUsed)||n.pluginsUsed!==void 0&&!dn(n.pluginsUsed)||n.mcpUsed!==void 0&&!dn(n.mcpUsed)?null:e}function dn(e){return Array.isArray(e)&&e.every(n=>typeof n=="string"&&n.trim()!=="")}function Tt(e){return T(e)&&typeof e.originator=="string"&&(e.source===void 0||typeof e.source=="string")}function Xs(e){if(!T(e)||!Array.isArray(e.projects)||e.memory!==void 0&&!Wa(e.memory))return null;const n=e.projects.map((t,r)=>ao(t)?t:to(t,r));return e.memory===void 0?{projects:n}:{projects:n,memory:e.memory}}function Wa(e){return T(e)&&M(e,["unavailable"])&&typeof e.unavailable=="string"}function Zs(e){if(typeof e!="object"||e===null)return null;const n=e;if(typeof n.harness!="string"||typeof n.startedAt!="string"||n.hooks!==void 0&&!eo(n.hooks)||!Array.isArray(n.notices)||!n.notices.every(no)||!Array.isArray(n.sessions))return null;const t=[];for(const i of n.sessions){if(typeof i!="object"||i===null)return null;const o=i;if(typeof o.id!="string"||typeof o.label!="string"||o.discovered!==void 0&&o.discovered!==!0||o.origin!==void 0&&!Tt(o.origin)||o.cwd!==void 0&&typeof o.cwd!="string"||typeof o.lastActivity!="string"||o.lastInstruction!==void 0&&typeof o.lastInstruction!="string"||o.archived!==void 0&&typeof o.archived!="boolean"||o.archivedHasNewActivity!==void 0&&typeof o.archivedHasNewActivity!="boolean"||typeof o.waiting!="boolean"||typeof o.ended!="boolean"||o.turnEnded!==void 0&&o.turnEnded!==!0||o.turnEndedAt!==void 0&&(typeof o.turnEndedAt!="string"||!Number.isFinite(Date.parse(o.turnEndedAt)))||o.waitOutcome!==void 0&&!Ua(o.waitOutcome))return null;if(o.feedback!==void 0&&o.feedback!=="available"&&o.feedback!=="not_wired"&&o.feedback!=="unavailable"){t.push({id:o.id,label:o.label,lastActivity:o.lastActivity,...o.lastInstruction===void 0?{}:{lastInstruction:o.lastInstruction},waiting:o.waiting,ended:o.ended,...o.turnEnded===!0?{turnEnded:!0}:{},...o.turnEndedAt===void 0?{}:{turnEndedAt:o.turnEndedAt},...o.waitOutcome===void 0?{}:{waitOutcome:o.waitOutcome},...o.discovered===!0?{discovered:!0}:{},...o.origin===void 0?{}:{origin:o.origin},...o.archived===void 0?{}:{archived:o.archived},...o.archivedHasNewActivity===void 0?{}:{archivedHasNewActivity:o.archivedHasNewActivity}});continue}t.push(i)}if(typeof n.states!="object"||n.states===null||Array.isArray(n.states))return null;const r=n.states,s={};for(const i of t)s[i.id]=Qs(r[i.id])??So(n.harness,i);return{harness:n.harness,startedAt:n.startedAt,...n.hooks===void 0?{}:{hooks:n.hooks},notices:n.notices,sessions:t,states:s}}function eo(e){if(!T(e)||!M(e,["lastReceivedAt","count","instances"])||!Y(e.count)||e.lastReceivedAt!==void 0&&(typeof e.lastReceivedAt!="string"||!Number.isFinite(Date.parse(e.lastReceivedAt))))return!1;if(e.instances===void 0)return!0;const n=e.instances;return T(n)?M(n,["count","source"])&&Y(n.count)&&n.source==="runtime-dir"||M(n,["unavailable"])&&n.unavailable==="fixtures":!1}function no(e){return T(e)?e.kind==="evicted"?Object.keys(e).length===5&&typeof e.sessionId=="string"&&typeof e.label=="string"&&typeof e.at=="string"&&typeof e.reason=="string":e.kind==="dsh_legacy_hooks_retired"&&Object.keys(e).length===4&&typeof e.at=="string"&&(e.restored==="byte-identical"||e.restored==="surgical"||e.restored==="unavailable")&&typeof e.command=="string":!1}function to(e,n){const t=T(e)&&typeof e.root=="string"?e.root:a("panel.narrative.unavailableProject",{number:n+1}),r=T(e)&&T(e.title)&&typeof e.title.text=="string"?e.title.text:t;return{root:t,title:{text:r,source:Q.workingDirectory},plan:{availability:"unavailable",reason:a("panel.narrative.projectUnavailable")},payloadUnavailable:!0}}function ao(e){return!T(e)||typeof e.root!="string"||!io(e.title)||e.isHome!==void 0&&typeof e.isHome!="boolean"||!Array.isArray(e.harnesses)||!e.harnesses.every(Xe)||e.lastSeen!==void 0&&!Ha(e.lastSeen)||e.codexProjectNames!==void 0&&(!Array.isArray(e.codexProjectNames)||!e.codexProjectNames.every(de))||e.user!==void 0&&(!T(e.user)||!M(e.user,["pinned","order","hidden","archived","archivedAt"])||typeof e.user.pinned!="boolean"||e.user.hidden!==void 0&&typeof e.user.hidden!="boolean"||e.user.archived!==void 0&&typeof e.user.archived!="boolean"||e.user.archived===!0&&(typeof e.user.archivedAt!="string"||!Number.isFinite(Date.parse(e.user.archivedAt)))||e.user.archivedAt!==void 0&&e.user.archived!==!0||e.user.order!==void 0&&(!e.user.pinned||!Y(e.user.order)))||e.archivedHasNewActivity!==void 0&&typeof e.archivedHasNewActivity!="boolean"||!so(e.firstScreen)||e.presence!=="active"&&e.presence!=="remembered"||typeof e.seenSinceStart!="boolean"||e.goal!==void 0&&typeof e.goal!="string"||!lo(e.plan)||e.revision!==void 0&&!Ce(e.revision)||e.mtime!==void 0&&typeof e.mtime!="string"||e.lastWriter!==void 0&&!uo(e.lastWriter)||typeof e.currentPointLabel!="string"||e.currentPointEmptyText!==void 0&&typeof e.currentPointEmptyText!="string"||e.currentPointEmptyTextI18n!==void 0&&!yn(e.currentPointEmptyTextI18n)||!gn(e.currentPoints)||!gn(e.checkpoints)||!fo(e.counts)||typeof e.allLeavesDone!="boolean"||e.completionLabel!==void 0&&typeof e.completionLabel!="string"||!Array.isArray(e.contradictions)||!e.contradictions.every(mo)||!Array.isArray(e.facts)||!e.facts.every(n=>typeof n=="string")||!oo(e.protocol)?!1:Array.isArray(e.sessions)&&e.sessions.every(go)}function ro(e){return T(e)&&M(e,["text","source"])&&typeof e.text=="string"&&de(e.source)}function de(e){return typeof e=="string"&&e.trim()!==""}function Mn(e){return T(e)&&M(e,["key","path","text","source","verification"])&&gn([e])&&de(e.source)&&(e.verification===void 0||typeof e.verification=="string")}function so(e){if(!T(e)||!M(e,["source","goal","branch","currentPoints","lastActivity","action"])||!de(e.source)||e.goal!==void 0&&!ro(e.goal)||!Array.isArray(e.branch)||!e.branch.every(Mn)||!Array.isArray(e.currentPoints)||!e.currentPoints.every(Mn))return!1;const n=e.lastActivity;if(n!==void 0&&!Ha(n)&&(!T(n)||!M(n,["at","harness","sessionId","label","source","labelSource"])||typeof n.at!="string"||!Number.isFinite(Date.parse(n.at))||!Xe(n.harness)||typeof n.sessionId!="string"||typeof n.label!="string"||!de(n.source)||!de(n.labelSource)))return!1;const t=e.action;return!T(t)||!de(t.source)?!1:t.kind==="in_progress"||t.kind==="ended"?M(t,["kind","source"]):t.kind==="insufficient"?M(t,["kind","source","reason"])&&["no_plan","plan_unavailable","feedback_unavailable"].includes(t.reason):!M(t,["kind","source","items"])||!Array.isArray(t.items)||t.items.length===0?!1:t.kind==="checkpoint"?t.items.every(Mn):t.kind!=="decision"?!1:t.items.every(r=>T(r)&&M(r,["harness","sessionId","label","since","text","source"])&&Xe(r.harness)&&typeof r.sessionId=="string"&&typeof r.label=="string"&&typeof r.since=="string"&&Number.isFinite(Date.parse(r.since))&&de(r.source)&&(r.text===void 0||typeof r.text=="string"))}function oo(e){return T(e)&&Fn(e.cc)&&Fn(e.codex)&&Fn(e.dsh)}function Fn(e){return T(e)&&Ba(e.state)&&typeof e.targetPath=="string"&&(e.version===void 0||Ce(e.version))&&(e.planMtime===void 0||typeof e.planMtime=="string")&&(e.message===void 0||typeof e.message=="string")&&(e.reason===void 0||typeof e.reason=="string")}function io(e){return T(e)&&typeof e.text=="string"&&(e.source===Q.planHeading||e.source===Q.workingDirectory||e.source===Q.homeDirectory)&&(e.suffix===void 0||T(e.suffix)&&M(e.suffix,["text","source"])&&typeof e.suffix.text=="string"&&e.suffix.source===Q.workingDirectory)}function Ha(e){return T(e)&&M(e,["at","source"])&&typeof e.at=="string"&&Number.isFinite(Date.parse(e.at))&&e.source===Q.projectMemory}function lo(e){return T(e)?e.availability==="available"?Y(e.ignoredLineCount)&&co(e.ignoredLines)&&e.ignoredLines.length===e.ignoredLineCount&&Array.isArray(e.nodes)&&e.nodes.every(At)&&Array.isArray(e.higherPlanPaths)&&e.higherPlanPaths.every(n=>typeof n=="string"):e.availability==="missing"?Array.isArray(e.lookedUp)&&e.lookedUp.every(n=>typeof n=="string"):e.availability!=="unavailable"||typeof e.reason!="string"||e.line!==void 0&&!Ce(e.line)?!1:e.lastGood===void 0||po(e.lastGood):!1}function co(e){return Array.isArray(e)&&e.every(n=>T(n)&&Ce(n.line)&&typeof n.preview=="string")}function At(e){return T(e)&&typeof e.key=="string"&&typeof e.text=="string"&&$o(e.status)&&Ce(e.line)&&(e.verification===void 0||typeof e.verification=="string")&&Array.isArray(e.children)&&e.children.every(At)}function po(e){return T(e)&&Ce(e.revision)&&typeof e.mtime=="string"&&(e.title===void 0||typeof e.title=="string")&&(e.goal===void 0||typeof e.goal=="string")&&Y(e.ignoredLineCount)&&Array.isArray(e.nodes)&&e.nodes.every(At)}function uo(e){return T(e)&&Xe(e.harness)&&typeof e.id=="string"&&typeof e.label=="string"&&typeof e.at=="string"}function gn(e){return Array.isArray(e)&&e.every(n=>T(n)&&typeof n.key=="string"&&typeof n.text=="string"&&Array.isArray(n.path)&&n.path.every(t=>typeof t=="string"))}function fo(e){return T(e)&&Y(e.pending)&&Y(e.inProgress)&&Y(e.completed)&&Y(e.cancelled)&&Y(e.checkpoint)}function mo(e){return T(e)&&typeof e.key=="string"&&typeof e.text=="string"}function Ua(e){return T(e)&&(e.outcome==="allowed"||e.outcome==="denied")&&typeof e.at=="string"&&typeof e.message=="string"&&typeof e.source=="string"}function go(e){if(!T(e)||!Xe(e.harness)||typeof e.id!="string"||typeof e.label!="string"||typeof e.ended!="boolean"||!vo(e.title)||!ho(e.user)||typeof e.waiting!="boolean"||e.archivedHasNewActivity!==void 0&&typeof e.archivedHasNewActivity!="boolean"||e.cwd!==void 0&&typeof e.cwd!="string"||e.worktree!==void 0&&typeof e.worktree!="string"||e.worktreePlanDiffers!==void 0&&e.worktreePlanDiffers!==!0||e.planPathIdentity!==void 0&&typeof e.planPathIdentity!="string")return!1;if(e.projectPlan!==void 0){const n=e.projectPlan;if(!T(n)||!M(n,["availability","currentPoints","currentPointEmptyText","currentPointEmptyTextI18n","source"])||!["available","missing","unavailable"].includes(n.availability)||!gn(n.currentPoints)||!de(n.source)||n.currentPointEmptyText!==void 0&&typeof n.currentPointEmptyText!="string"||n.currentPointEmptyTextI18n!==void 0&&!yn(n.currentPointEmptyTextI18n))return!1}return e.discovered!==void 0&&e.discovered!==!0||e.turnEnded!==void 0&&e.turnEnded!==!0||e.turnEndedAt!==void 0&&(typeof e.turnEndedAt!="string"||!Number.isFinite(Date.parse(e.turnEndedAt)))||e.waitOutcome!==void 0&&!Ua(e.waitOutcome)||e.origin!==void 0&&!Tt(e.origin)||e.lastActivity!==void 0&&typeof e.lastActivity!="string"||e.attachedTo!==void 0&&typeof e.attachedTo!="string"||e.attachedBy!==void 0&&!yo(e.attachedBy)||e.attachedTo===void 0!=(e.attachedBy===void 0)||e.unattachedReason!==void 0&&typeof e.unattachedReason!="string"||e.sessionPlan!==void 0&&!Ga(e.sessionPlan)||e.feedback!==void 0&&!Ka(e.feedback)||e.skillsUsed!==void 0&&!dn(e.skillsUsed)||e.checks!==void 0&&!_a(e.checks)||e.acceptance!==void 0&&!Va(e.acceptance)?!1:bo(e.compliance)}function ho(e){return T(e)&&(e.title===void 0||typeof e.title=="string")&&typeof e.pinned=="boolean"&&typeof e.hidden=="boolean"&&(e.archived===void 0||typeof e.archived=="boolean")&&(e.archived===!0?typeof e.archivedAt=="string"&&Number.isFinite(Date.parse(e.archivedAt)):e.archivedAt===void 0)}function vo(e){return T(e)&&typeof e.text=="string"&&(e.source===Q.planStep||e.source===Q.planInstruction||e.source===Q.latestInstruction||e.source===Q.workingDirectory)}function bo(e){return!T(e)||!Ba(e.level)||!Y(e.writeCount)||e.latestWriteAt!==void 0&&typeof e.latestWriteAt!="string"||e.writeSummary!==void 0&&typeof e.writeSummary!="string"?!1:e.timing===void 0?!0:T(e.timing)&&(e.timing.relation==="before"||e.timing.relation==="after")&&Ce(e.timing.nonPlanToolStep)&&typeof e.timing.text=="string"}function Ba(e){return e==="not_installed"||e==="installed"||e==="installed_not_loaded"||e==="plan_present"||e==="session_wrote_plan"}function yo(e){return T(e)&&e.kind==="plan_file_write"&&typeof e.node=="string"&&typeof e.method=="string"&&(e.at===void 0||typeof e.at=="string")}function ko(e){return T(e)&&typeof e.root=="string"&&(e.attachedTo===void 0||typeof e.attachedTo=="string")}function $o(e){return e==="pending"||e==="in_progress"||e==="completed"||e==="cancelled"||e==="checkpoint"}function Xe(e){return e==="cc"||e==="codex"||e==="dsh"}function Ce(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=1}function So(e,n){return{harness:e,sessionId:n.id,transcriptPath:null,...n.origin===void 0?{}:{origin:n.origin},todos:[],traces:[],turnUsages:[],currentAction:null,waiting:null,agentQuote:null,lastPrompt:null,taskWorkflow:{plan:{availability:"unavailable",source:e,reason:a("panel.narrative.sessionUnavailable")},execution:{evidenceCount:0,failureCount:0},feedback:{state:"unavailable",reason:a("panel.narrative.sessionUnavailable")}},updatedAt:n.lastActivity}}function wo(e){return!T(e)||e.goal!==void 0&&!Ln(e.goal)||e.latestInstruction!==void 0&&!Ln(e.latestInstruction)||!Ga(e.plan)||!T(e.execution)||!Y(e.execution.evidenceCount)||!Y(e.execution.failureCount)||e.execution.failureCount>e.execution.evidenceCount||e.execution.currentAction!==void 0&&!Ln(e.execution.currentAction)||!Ka(e.feedback)?!1:e.verification===void 0||To(e.verification)}function To(e){return!T(e)||!M(e,["agentMarkedComplete","checks","currentStep","acceptance"])||typeof e.agentMarkedComplete!="boolean"||!_a(e.checks)||!Va(e.acceptance)?!1:e.currentStep===void 0?!0:T(e.currentStep)&&M(e.currentStep,["text","runs","failures"])&&typeof e.currentStep.text=="string"&&qa(e.currentStep)}function _a(e){return!T(e)||!M(e,["runs","failures","latestFailure","source"])||e.source!=="Harness tool_result(is_error / exit_code)"||!qa(e)?!1:e.latestFailure===void 0?!0:T(e.latestFailure)&&M(e.latestFailure,["toolName","brief","at"])&&typeof e.latestFailure.toolName=="string"&&(e.latestFailure.brief===void 0||typeof e.latestFailure.brief=="string")&&(e.latestFailure.at===void 0||typeof e.latestFailure.at=="string")}function qa(e){return Y(e.runs)&&Y(e.failures)&&e.failures<=e.runs}function Va(e){return!T(e)||typeof e.state!="string"?!1:e.state==="none"?M(e,["state"]):e.state==="accepted"?M(e,["state","at"])&&typeof e.at=="string":e.state==="unavailable"&&M(e,["state","reason"])&&typeof e.reason=="string"}function M(e,n){return Object.keys(e).every(t=>n.includes(t))}function Ga(e){return!T(e)||typeof e.source!="string"?!1:e.availability==="missing"?e.toolGate===void 0||Ao(e.toolGate):e.availability==="unavailable"?typeof e.reason=="string":e.availability!=="available"||e.forInstruction!=="current"&&e.forInstruction!=="previous"||!Number.isSafeInteger(e.revision)||e.revision<1||e.semantics!==void 0&&e.semantics!=="current_snapshot"||!Array.isArray(e.steps)?!1:e.steps.every(n=>T(n)&&typeof n.id=="string"&&typeof n.text=="string"&&(n.description===void 0||typeof n.description=="string")&&Po(n.status))}function Ao(e){return T(e)&&typeof e.harnessVersion=="string"&&(e.model===void 0||typeof e.model=="string")&&(e.affected==="known"||e.affected==="unknown")&&e.since==="2.1.233"&&e.enable==="CLAUDE_CODE_ENABLE_TODO_TOOLS=1"}function Ka(e){return T(e)?e.state==="unavailable"?typeof e.reason=="string"&&(e.reasonI18n===void 0||yn(e.reasonI18n)):typeof e.source!="string"?!1:e.state==="no_open_request"?!0:e.state==="needs_user"?typeof e.since=="string"&&(e.generic===void 0||typeof e.generic=="boolean")&&(e.message===void 0||typeof e.message=="string"):e.state==="activity_resumed_unknown"?typeof e.requestSince=="string"&&typeof e.resumedAt=="string"&&(e.message===void 0||typeof e.message=="string"):!1:!1}function Ln(e){return T(e)&&typeof e.text=="string"&&typeof e.source=="string"&&(e.observedAt===void 0||typeof e.observedAt=="string")}function Po(e){return e==="pending"||e==="in_progress"||e==="completed"}function Y(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0}function T(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Te(e,n){return!e||e.sessions.length===0?null:n!==void 0&&e.states[n]!==void 0?n:e.sessions[0]?.id??null}function Ya(e){if(!e)return null;for(const n of e.sessions){if(!n.waiting)continue;const t=e.states[n.id]?.waiting;if(t)return{label:n.label,message:t.message,since:t.since}}return null}function Ja(e){return e?e.todos.length>0||e.traces.length>0||e.turnUsages.length>0||e.currentAction!==null||e.waiting!==null||(e.skillsUsed?.length??0)>0||e.taskWorkflow!==void 0:!1}function tn(e,n){return n===void 0?e:a(n.key,n.params)}const za={completed:"✓",in_progress:"▶",pending:"○"};function Qa(e){const n=e.taskWorkflow?.plan;return n?.availability==="available"&&n.forInstruction==="current"?n.steps.filter(t=>t.status==="in_progress").map(t=>t.text):[]}function Co(e){return e.availability==="available"?`${I(e.source)} · revision ${e.revision}`:I(e.source)}function xo(e){const n=e.todos.find(t=>t.status==="in_progress");return n?n.activeForm??n.content:e.lastPrompt}function Io(e){return e?e.kind==="tool"?e.detail===""?e.toolName:`${e.toolName} · ${e.detail}`:Xa(e.name):null}const Gt={SessionStart:"panel.narrative.event.SessionStart",SessionEnd:"panel.narrative.event.SessionEnd",UserPromptSubmit:"panel.narrative.event.UserPromptSubmit",PreToolUse:"panel.narrative.event.PreToolUse",PostToolUse:"panel.narrative.event.PostToolUse",Stop:"panel.narrative.event.Stop",Notification:"panel.narrative.event.Notification",PermissionRequest:"panel.narrative.event.PermissionRequest",SubagentStart:"panel.narrative.event.SubagentStart",SubagentStop:"panel.narrative.event.SubagentStop",PreCompact:"panel.narrative.event.PreCompact",PostCompact:"panel.narrative.event.PostCompact","transcript:user-rejected":"panel.narrative.event.userRejected"};function Xa(e){const n=Object.hasOwn(Gt,e)?Gt[e]:void 0;return n===void 0?e:a(n)}function jo(e){return e?e.turnUsages[e.turnUsages.length-1]??null:null}function Za(e){return e<.005?"<$0.01":`$${e.toFixed(2)}`}function er(e){return e.totalTokens??e.contextTotal?.value??e.inputTotalTokens??null}function Ro(e){const n=er(e);if(n===null)return"—";const t=e.status==="aborted"?a("panel.narrative.aborted"):e.status==="incomplete"?a("panel.narrative.incomplete"):"",r=`${U(n)} ${e.totalTokens===void 0&&e.contextTotal===void 0?"input":"tok"}${t}`;return e.costUsd===void 0?r:`${r} ≈ ${Za(e.costUsd)}`}function $n(e){if(e<1e3)return"<1s";const n=Math.round(e/1e3);return n<60?`${n}s`:`${Math.floor(n/60)}m${n%60===0?"":` ${n%60}s`}`}function Eo(e,n){return e.agents.length>0?a("panel.narrative.subagent"):n&&n.nodes.length>0?a("panel.narrative.mainAgent"):null}function No(e){if(!e||e.todos.length===0)return null;const n=e.taskWorkflow?.plan;return n?.availability==="available"&&n.forInstruction==="previous"?null:`${e.todos.filter(r=>r.status==="completed").length}/${e.todos.length}`}const Oo=6e4;function Mo(e,n,t={},r,s){const i=t.feedback??e?.taskWorkflow?.feedback,o=r??(i?.state==="needs_user"?{label:"",message:i.message??a("panel.narrative.openRequest"),since:i.since}:r===void 0&&e?.waiting?{label:"",message:e.waiting.message,since:e.waiting.since}:null);if(o){const p=o.label===""?"":`(${o.label})`,u=Date.parse(o.since),m=s!==void 0&&Number.isFinite(u)?s-u:Number.NaN,f=Number.isFinite(m)&&m>Oo?a("panel.narrative.waitOverdue",{minutes:Math.floor(m/6e4)}):"";return{mode:"waiting",label:a("panel.narrative.waitLabel",{who:p,message:o.message,overdue:f}),source:i?.state==="needs_user"&&!r?i.source:Q.permissionEvents}}const c=t.projectTitle?[t.projectTitle,t.taskTitle].filter(Boolean).join(" · "):t.sessionTitle;return c?t.turnEnded?{mode:"turnEnded",label:c,status:a("panel.render.turnEnded"),source:t.source}:{mode:t.status===a("panel.narrative.waitingForYou")?"waiting":t.status===a("panel.narrative.inProgress")?"working":"idle",label:c,status:t.waitOutcome?a(`panel.taskboard.${t.waitOutcome.outcome}`):t.status,source:t.waitOutcome?.source??t.source}:{mode:"idle",label:n.label===a("panel.narrative.notWired")?a("panel.narrative.notWired"):a("panel.narrative.waitingEvents"),source:Q.liveEmptyState}}function nr(e,n){const t=n[e.id];return t!==void 0?t:e.status==="in_progress"}async function Qn(e,n=globalThis.navigator?.clipboard){if(n===void 0)return!1;try{return await n.writeText(e),!0}catch{return!1}}function Fo(e,n){if(!e)return;const t=n?`${e} / ${n}`:e;let r="other";return e==="codex_exec"?r=n==="exec"?"exec":"cli":(e==="codex_work_desktop"||e==="Codex Desktop")&&(r="desktop"),{key:r,raw:t}}function Sn(e){return`npx harness-wingman${e?`@${e}`:""}`}function Ze(e,n){return`${Sn(n)} hook install ${e}`}function Lo(e){return`'${e.replaceAll("'",`'"'"'`)}'`}function tr(e,n,t){return`${Sn(t)} protocol install ${e} --project ${Lo(n)}`}function Do(e,n){return`${Sn(n)} protocol install ${e} --user`}const Wo=["tray","panel","site"],Ho=["codex","claude-code","dsh"];function Uo(e,n){const t=new URL(e);if(t.protocol!=="https:")throw new Error("反馈表单必须使用 HTTPS");if(!Wo.includes(n.source))throw new Error("反馈入口来源不合法");return t.search="",t.hash="",t.searchParams.set("source",n.source),Dn(t,"wingman_version",n.wingmanVersion),Dn(t,"os",n.os),n.harness!==void 0&&Ho.includes(n.harness)&&t.searchParams.set("harness",n.harness),Dn(t,"harness_version",n.harnessVersion),t.toString()}function Dn(e,n,t){if(t===void 0)return;const r=t.trim();r.length===0||/[\r\n\u2028\u2029]/u.test(r)||[...r].length>64||e.searchParams.set(n,r)}const Bo="https://tally.so/r/aQMeVW",Kt="support@getwingman.dev",_o={cc:"claude-code",codex:"codex",dsh:"dsh"};function qo(e){const n=e?.harnessVersion;return Uo(Bo,{source:"panel",...e===void 0?{}:{harness:_o[e.harness]},...n===void 0?{}:{harnessVersion:n}})}const Vo={zh:"30 天免费试用 · 之后 $7.99/月或 $79/年 · 可随时取消",en:"30-day free trial · Then $7.99/mo or $79/yr · Cancel anytime"},Go="https://api.getwingman.dev/samples",Ko=256*1024;function Yo(e){if(e.__mock_note)return[];const n={harness:e.harness,...e.harnessVersion===void 0?{}:{harnessVersion:e.harnessVersion},scannedAt:e.scannedAt,slots:e.slots,capabilities:e.capabilities};return JSON.stringify(n,null,2).split(`
128
- `)}function Jo(e){return e.filter(n=>!n.mock&&!Xn(n.event)).map(n=>JSON.stringify(n.event))}function Xn(e){if(typeof e=="string")return/(?:^|[\\/])\.wingman[\\/]plan\.md(?:$|\s)/u.test(e);if(Array.isArray(e))return e.some(Xn);if(e===null||typeof e!="object")return!1;for(const[n,t]of Object.entries(e))if(/^(?:project|project_?(?:root|path)|plan|plan_?text)$/iu.test(n)||Xn(t))return!0;return!1}function zo(e,n){return!Number.isInteger(n)||n<0||n>=e.length?[...e]:e.filter((t,r)=>r!==n)}function Qo(e){return e.join(`
129
- `)}function ar(e,n){return JSON.stringify({kind:e,sample:Qo(n)})}function rr(e,n){return new TextEncoder().encode(ar(e,n)).length}function sr(e,n){return rr(e,n)>Ko}function Xo(e,n){const t=(rr(e,n)/1024).toFixed(1);return a("panel.share.linesAboutKbLimitKb",{p0:n.length,p1:t})}function Zo(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}const l=Zo;function ei(e,n){const t=e?`<div class="empty-detail">${l(e)}</div>`:`<div class="empty-detail">${a("panel.render.apiAnatomyReturnedAnEmptyArray")}</div>`;return`<div class="empty-card">
130
+ <button class="btn primary" data-act="mobile-confirm" type="button"${e.busy?" disabled":""}>${a(e.busy?"panel.mobile.working":"panel.mobile.unpair")}</button></div></div></div>`}function Zs(e){if(!Array.isArray(e))throw new Error(a("panel.narrative.payloadNotArray"));for(const n of e){if(!T(n))throw new Error(a("panel.narrative.payloadEntryNotObject"));if(typeof n.harness!="string"||typeof n.scannedAt!="string")throw new Error(a("panel.narrative.payloadMissingFields"));const t=n.slots;for(const s of Fe){if(!T(t)||!Array.isArray(t[s]))throw new Error(a("panel.narrative.missingSlot",{harness:n.harness,slot:s}));if(s==="skills"&&t[s].some(o=>T(o)&&(o.invocation!==void 0&&!["auto","manual","agent-only","off"].includes(o.invocation)||o.invocationSource!==void 0&&!["frontmatter","settings"].includes(o.invocationSource))))throw new Error(a("panel.narrative.invalidSkillInvocation",{harness:n.harness}));for(const o of t[s]){if(!T(o)||o.ccFeature===void 0)continue;const i=o.ccFeature;if(!T(i)||Object.keys(i).some(c=>!["key","value","source","overriddenBy","invalid","partial"].includes(c))||n.harness!=="cc"||s!=="gates"||!["autoMemoryEnabled","crossSessionInbound","permissions.deny"].includes(i.key)||o.id!==`cc:gates:user:${i.key}`||!["user","default"].includes(i.source)||i.overriddenBy!==void 0&&!["project","local","managed"].includes(i.overriddenBy)||i.invalid!==void 0&&typeof i.invalid!="boolean"||i.partial!==void 0&&(typeof i.partial!="boolean"||i.key!=="permissions.deny"||i.value!==!1)||i.value!=="unknown"&&(i.key==="crossSessionInbound"?!["accept","hold","refuse","default"].includes(i.value):typeof i.value!="boolean")||i.value==="unknown"&&i.invalid!==!0||(i.overriddenBy!==void 0||i.invalid===!0)&&o.toggleable!==!1)throw new Error(a("panel.render.ccInvalidPayload"))}}const r=n.planProtocol;if(r!==void 0&&(!T(r)||typeof r.user!="string"||!["installed","outdated","missing","modified","unsupported"].includes(r.user)))throw new Error(a("panel.narrative.invalidUserProtocol",{harness:n.harness}));if(T(r)&&r.project!==void 0&&!["not_installed","installed","outdated","modified","invalid","installed_not_loaded"].includes(r.project))throw new Error(a("panel.narrative.invalidProjectProtocol",{harness:n.harness}))}return e}function eo(e){return T(e)&&(e.activated===!0&&M(e,["activated","name"])&&typeof e.name=="string"&&e.name!==""||e.activated===!1&&M(e,["activated","reason"])&&typeof e.reason=="string"&&e.reason!=="")?e:null}function no(e){return!T(e)||!M(e,["available","selected","settings"])||!Array.isArray(e.available)||!e.available.every(n=>T(n)&&M(n,["name","bundlePath"])&&typeof n.name=="string"&&n.name!==""&&typeof n.bundlePath=="string"&&n.bundlePath!=="")||e.selected!==void 0&&!Ba(e.selected)||e.settings!==void 0&&(!_a(e.settings)||e.settings.unavailable==="")?null:e}function to(e){return!T(e)||!M(e,["selected"])||!Ba(e.selected)?null:e}function Ba(e){return T(e)&&M(e,["bundlePath"])&&typeof e.bundlePath=="string"&&e.bundlePath!==""}function ao(e){if(typeof e!="object"||e===null)return null;const n=e;return typeof n.harness!="string"||!Array.isArray(n.todos)||!Array.isArray(n.traces)||!Array.isArray(n.turnUsages)||typeof n.updatedAt!="string"||n.suggestions!==void 0&&(!Array.isArray(n.suggestions)||!n.suggestions.every(t=>T(t)&&(t.textI18n===void 0||yn(t.textI18n))))||n.taskWorkflow!==void 0&&!Io(n.taskWorkflow)||n.origin!==void 0&&!Ct(n.origin)||n.project!==void 0&&!Po(n.project)||n.skillsUsed!==void 0&&!dn(n.skillsUsed)||n.pluginsUsed!==void 0&&!dn(n.pluginsUsed)||n.mcpUsed!==void 0&&!dn(n.mcpUsed)?null:e}function dn(e){return Array.isArray(e)&&e.every(n=>typeof n=="string"&&n.trim()!=="")}function Ct(e){return T(e)&&typeof e.originator=="string"&&(e.source===void 0||typeof e.source=="string")}function ro(e){if(!T(e)||!Array.isArray(e.projects)||e.memory!==void 0&&!_a(e.memory))return null;const n=e.projects.map((t,r)=>co(t)?t:lo(t,r));return e.memory===void 0?{projects:n}:{projects:n,memory:e.memory}}function _a(e){return T(e)&&M(e,["unavailable"])&&typeof e.unavailable=="string"}function so(e){if(typeof e!="object"||e===null)return null;const n=e;if(typeof n.harness!="string"||typeof n.startedAt!="string"||n.hooks!==void 0&&!oo(n.hooks)||!Array.isArray(n.notices)||!n.notices.every(io)||!Array.isArray(n.sessions))return null;const t=[];for(const o of n.sessions){if(typeof o!="object"||o===null)return null;const i=o;if(typeof i.id!="string"||typeof i.label!="string"||i.discovered!==void 0&&i.discovered!==!0||i.origin!==void 0&&!Ct(i.origin)||i.cwd!==void 0&&typeof i.cwd!="string"||typeof i.lastActivity!="string"||i.lastInstruction!==void 0&&typeof i.lastInstruction!="string"||i.archived!==void 0&&typeof i.archived!="boolean"||i.archivedHasNewActivity!==void 0&&typeof i.archivedHasNewActivity!="boolean"||typeof i.waiting!="boolean"||typeof i.ended!="boolean"||i.turnEnded!==void 0&&i.turnEnded!==!0||i.turnEndedAt!==void 0&&(typeof i.turnEndedAt!="string"||!Number.isFinite(Date.parse(i.turnEndedAt)))||i.waitOutcome!==void 0&&!Va(i.waitOutcome))return null;if(i.feedback!==void 0&&i.feedback!=="available"&&i.feedback!=="not_wired"&&i.feedback!=="unavailable"){t.push({id:i.id,label:i.label,lastActivity:i.lastActivity,...i.lastInstruction===void 0?{}:{lastInstruction:i.lastInstruction},waiting:i.waiting,ended:i.ended,...i.turnEnded===!0?{turnEnded:!0}:{},...i.turnEndedAt===void 0?{}:{turnEndedAt:i.turnEndedAt},...i.waitOutcome===void 0?{}:{waitOutcome:i.waitOutcome},...i.discovered===!0?{discovered:!0}:{},...i.origin===void 0?{}:{origin:i.origin},...i.archived===void 0?{}:{archived:i.archived},...i.archivedHasNewActivity===void 0?{}:{archivedHasNewActivity:i.archivedHasNewActivity}});continue}t.push(o)}if(typeof n.states!="object"||n.states===null||Array.isArray(n.states))return null;const r=n.states,s={};for(const o of t)s[o.id]=ao(r[o.id])??Co(n.harness,o);return{harness:n.harness,startedAt:n.startedAt,...n.hooks===void 0?{}:{hooks:n.hooks},notices:n.notices,sessions:t,states:s}}function oo(e){if(!T(e)||!M(e,["lastReceivedAt","count","instances"])||!J(e.count)||e.lastReceivedAt!==void 0&&(typeof e.lastReceivedAt!="string"||!Number.isFinite(Date.parse(e.lastReceivedAt))))return!1;if(e.instances===void 0)return!0;const n=e.instances;return T(n)?M(n,["count","source"])&&J(n.count)&&n.source==="runtime-dir"||M(n,["unavailable"])&&n.unavailable==="fixtures":!1}function io(e){return T(e)?e.kind==="evicted"?Object.keys(e).length===5&&typeof e.sessionId=="string"&&typeof e.label=="string"&&typeof e.at=="string"&&typeof e.reason=="string":e.kind==="dsh_legacy_hooks_retired"&&Object.keys(e).length===4&&typeof e.at=="string"&&(e.restored==="byte-identical"||e.restored==="surgical"||e.restored==="unavailable")&&typeof e.command=="string":!1}function lo(e,n){const t=T(e)&&typeof e.root=="string"?e.root:a("panel.narrative.unavailableProject",{number:n+1}),r=T(e)&&T(e.title)&&typeof e.title.text=="string"?e.title.text:t;return{root:t,title:{text:r,source:Z.workingDirectory},plan:{availability:"unavailable",reason:a("panel.narrative.projectUnavailable")},payloadUnavailable:!0}}function co(e){return!T(e)||typeof e.root!="string"||!mo(e.title)||e.isHome!==void 0&&typeof e.isHome!="boolean"||!Array.isArray(e.harnesses)||!e.harnesses.every(Xe)||e.lastSeen!==void 0&&!qa(e.lastSeen)||e.codexProjectNames!==void 0&&(!Array.isArray(e.codexProjectNames)||!e.codexProjectNames.every(ce))||e.user!==void 0&&(!T(e.user)||!M(e.user,["pinned","order","hidden","archived","archivedAt"])||typeof e.user.pinned!="boolean"||e.user.hidden!==void 0&&typeof e.user.hidden!="boolean"||e.user.archived!==void 0&&typeof e.user.archived!="boolean"||e.user.archived===!0&&(typeof e.user.archivedAt!="string"||!Number.isFinite(Date.parse(e.user.archivedAt)))||e.user.archivedAt!==void 0&&e.user.archived!==!0||e.user.order!==void 0&&(!e.user.pinned||!J(e.user.order)))||e.archivedHasNewActivity!==void 0&&typeof e.archivedHasNewActivity!="boolean"||!uo(e.firstScreen)||e.presence!=="active"&&e.presence!=="remembered"||typeof e.seenSinceStart!="boolean"||e.goal!==void 0&&typeof e.goal!="string"||!go(e.plan)||e.revision!==void 0&&!xe(e.revision)||e.mtime!==void 0&&typeof e.mtime!="string"||e.lastWriter!==void 0&&!bo(e.lastWriter)||typeof e.currentPointLabel!="string"||e.currentPointEmptyText!==void 0&&typeof e.currentPointEmptyText!="string"||e.currentPointEmptyTextI18n!==void 0&&!yn(e.currentPointEmptyTextI18n)||!gn(e.currentPoints)||!gn(e.checkpoints)||!yo(e.counts)||typeof e.allLeavesDone!="boolean"||e.completionLabel!==void 0&&typeof e.completionLabel!="string"||!Array.isArray(e.contradictions)||!e.contradictions.every(ko)||!Array.isArray(e.facts)||!e.facts.every(n=>typeof n=="string")||!fo(e.protocol)?!1:Array.isArray(e.sessions)&&e.sessions.every($o)}function po(e){return T(e)&&M(e,["text","source"])&&typeof e.text=="string"&&ce(e.source)}function ce(e){return typeof e=="string"&&e.trim()!==""}function Dn(e){return T(e)&&M(e,["key","path","text","source","verification"])&&gn([e])&&ce(e.source)&&(e.verification===void 0||typeof e.verification=="string")}function uo(e){if(!T(e)||!M(e,["source","goal","branch","currentPoints","lastActivity","action"])||!ce(e.source)||e.goal!==void 0&&!po(e.goal)||!Array.isArray(e.branch)||!e.branch.every(Dn)||!Array.isArray(e.currentPoints)||!e.currentPoints.every(Dn))return!1;const n=e.lastActivity;if(n!==void 0&&!qa(n)&&(!T(n)||!M(n,["at","harness","sessionId","label","source","labelSource"])||typeof n.at!="string"||!Number.isFinite(Date.parse(n.at))||!Xe(n.harness)||typeof n.sessionId!="string"||typeof n.label!="string"||!ce(n.source)||!ce(n.labelSource)))return!1;const t=e.action;return!T(t)||!ce(t.source)?!1:t.kind==="in_progress"||t.kind==="ended"?M(t,["kind","source"]):t.kind==="insufficient"?M(t,["kind","source","reason"])&&["no_plan","plan_unavailable","feedback_unavailable"].includes(t.reason):!M(t,["kind","source","items"])||!Array.isArray(t.items)||t.items.length===0?!1:t.kind==="checkpoint"?t.items.every(Dn):t.kind!=="decision"?!1:t.items.every(r=>T(r)&&M(r,["harness","sessionId","label","since","text","source"])&&Xe(r.harness)&&typeof r.sessionId=="string"&&typeof r.label=="string"&&typeof r.since=="string"&&Number.isFinite(Date.parse(r.since))&&ce(r.source)&&(r.text===void 0||typeof r.text=="string"))}function fo(e){return T(e)&&Wn(e.cc)&&Wn(e.codex)&&Wn(e.dsh)}function Wn(e){return T(e)&&Ga(e.state)&&typeof e.targetPath=="string"&&(e.version===void 0||xe(e.version))&&(e.planMtime===void 0||typeof e.planMtime=="string")&&(e.message===void 0||typeof e.message=="string")&&(e.reason===void 0||typeof e.reason=="string")}function mo(e){return T(e)&&typeof e.text=="string"&&(e.source===Z.planHeading||e.source===Z.workingDirectory||e.source===Z.homeDirectory)&&(e.suffix===void 0||T(e.suffix)&&M(e.suffix,["text","source"])&&typeof e.suffix.text=="string"&&e.suffix.source===Z.workingDirectory)}function qa(e){return T(e)&&M(e,["at","source"])&&typeof e.at=="string"&&Number.isFinite(Date.parse(e.at))&&e.source===Z.projectMemory}function go(e){return T(e)?e.availability==="available"?J(e.ignoredLineCount)&&ho(e.ignoredLines)&&e.ignoredLines.length===e.ignoredLineCount&&Array.isArray(e.nodes)&&e.nodes.every(It)&&Array.isArray(e.higherPlanPaths)&&e.higherPlanPaths.every(n=>typeof n=="string"):e.availability==="missing"?Array.isArray(e.lookedUp)&&e.lookedUp.every(n=>typeof n=="string"):e.availability!=="unavailable"||typeof e.reason!="string"||e.line!==void 0&&!xe(e.line)?!1:e.lastGood===void 0||vo(e.lastGood):!1}function ho(e){return Array.isArray(e)&&e.every(n=>T(n)&&xe(n.line)&&typeof n.preview=="string")}function It(e){return T(e)&&typeof e.key=="string"&&typeof e.text=="string"&&xo(e.status)&&xe(e.line)&&(e.verification===void 0||typeof e.verification=="string")&&Array.isArray(e.children)&&e.children.every(It)}function vo(e){return T(e)&&xe(e.revision)&&typeof e.mtime=="string"&&(e.title===void 0||typeof e.title=="string")&&(e.goal===void 0||typeof e.goal=="string")&&J(e.ignoredLineCount)&&Array.isArray(e.nodes)&&e.nodes.every(It)}function bo(e){return T(e)&&Xe(e.harness)&&typeof e.id=="string"&&typeof e.label=="string"&&typeof e.at=="string"}function gn(e){return Array.isArray(e)&&e.every(n=>T(n)&&typeof n.key=="string"&&typeof n.text=="string"&&Array.isArray(n.path)&&n.path.every(t=>typeof t=="string"))}function yo(e){return T(e)&&J(e.pending)&&J(e.inProgress)&&J(e.completed)&&J(e.cancelled)&&J(e.checkpoint)}function ko(e){return T(e)&&typeof e.key=="string"&&typeof e.text=="string"}function Va(e){return T(e)&&(e.outcome==="allowed"||e.outcome==="denied")&&typeof e.at=="string"&&typeof e.message=="string"&&typeof e.source=="string"}function $o(e){if(!T(e)||!Xe(e.harness)||typeof e.id!="string"||typeof e.label!="string"||typeof e.ended!="boolean"||!So(e.title)||!wo(e.user)||typeof e.waiting!="boolean"||e.archivedHasNewActivity!==void 0&&typeof e.archivedHasNewActivity!="boolean"||e.cwd!==void 0&&typeof e.cwd!="string"||e.worktree!==void 0&&typeof e.worktree!="string"||e.worktreePlanDiffers!==void 0&&e.worktreePlanDiffers!==!0||e.planPathIdentity!==void 0&&typeof e.planPathIdentity!="string")return!1;if(e.projectPlan!==void 0){const n=e.projectPlan;if(!T(n)||!M(n,["availability","currentPoints","currentPointEmptyText","currentPointEmptyTextI18n","source"])||!["available","missing","unavailable"].includes(n.availability)||!gn(n.currentPoints)||!ce(n.source)||n.currentPointEmptyText!==void 0&&typeof n.currentPointEmptyText!="string"||n.currentPointEmptyTextI18n!==void 0&&!yn(n.currentPointEmptyTextI18n))return!1}return e.discovered!==void 0&&e.discovered!==!0||e.turnEnded!==void 0&&e.turnEnded!==!0||e.turnEndedAt!==void 0&&(typeof e.turnEndedAt!="string"||!Number.isFinite(Date.parse(e.turnEndedAt)))||e.waitOutcome!==void 0&&!Va(e.waitOutcome)||e.origin!==void 0&&!Ct(e.origin)||e.lastActivity!==void 0&&typeof e.lastActivity!="string"||e.attachedTo!==void 0&&typeof e.attachedTo!="string"||e.attachedBy!==void 0&&!Ao(e.attachedBy)||e.attachedTo===void 0!=(e.attachedBy===void 0)||e.unattachedReason!==void 0&&typeof e.unattachedReason!="string"||e.sessionPlan!==void 0&&!za(e.sessionPlan)||e.feedback!==void 0&&!Qa(e.feedback)||e.skillsUsed!==void 0&&!dn(e.skillsUsed)||e.checks!==void 0&&!Ka(e.checks)||e.acceptance!==void 0&&!Ja(e.acceptance)?!1:To(e.compliance)}function wo(e){return T(e)&&(e.title===void 0||typeof e.title=="string")&&typeof e.pinned=="boolean"&&typeof e.hidden=="boolean"&&(e.archived===void 0||typeof e.archived=="boolean")&&(e.archived===!0?typeof e.archivedAt=="string"&&Number.isFinite(Date.parse(e.archivedAt)):e.archivedAt===void 0)}function So(e){return T(e)&&typeof e.text=="string"&&(e.source===Z.planStep||e.source===Z.planInstruction||e.source===Z.latestInstruction||e.source===Z.workingDirectory)}function To(e){return!T(e)||!Ga(e.level)||!J(e.writeCount)||e.latestWriteAt!==void 0&&typeof e.latestWriteAt!="string"||e.writeSummary!==void 0&&typeof e.writeSummary!="string"?!1:e.timing===void 0?!0:T(e.timing)&&(e.timing.relation==="before"||e.timing.relation==="after")&&xe(e.timing.nonPlanToolStep)&&typeof e.timing.text=="string"}function Ga(e){return e==="not_installed"||e==="installed"||e==="installed_not_loaded"||e==="plan_present"||e==="session_wrote_plan"}function Ao(e){return T(e)&&e.kind==="plan_file_write"&&typeof e.node=="string"&&typeof e.method=="string"&&(e.at===void 0||typeof e.at=="string")}function Po(e){return T(e)&&typeof e.root=="string"&&(e.attachedTo===void 0||typeof e.attachedTo=="string")}function xo(e){return e==="pending"||e==="in_progress"||e==="completed"||e==="cancelled"||e==="checkpoint"}function Xe(e){return e==="cc"||e==="codex"||e==="dsh"}function xe(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=1}function Co(e,n){return{harness:e,sessionId:n.id,transcriptPath:null,...n.origin===void 0?{}:{origin:n.origin},todos:[],traces:[],turnUsages:[],currentAction:null,waiting:null,agentQuote:null,lastPrompt:null,taskWorkflow:{plan:{availability:"unavailable",source:e,reason:a("panel.narrative.sessionUnavailable")},execution:{evidenceCount:0,failureCount:0},feedback:{state:"unavailable",reason:a("panel.narrative.sessionUnavailable")}},updatedAt:n.lastActivity}}function Io(e){return!T(e)||e.goal!==void 0&&!Hn(e.goal)||e.latestInstruction!==void 0&&!Hn(e.latestInstruction)||!za(e.plan)||!T(e.execution)||!J(e.execution.evidenceCount)||!J(e.execution.failureCount)||e.execution.failureCount>e.execution.evidenceCount||e.execution.currentAction!==void 0&&!Hn(e.execution.currentAction)||!Qa(e.feedback)?!1:e.verification===void 0||Ro(e.verification)}function Ro(e){return!T(e)||!M(e,["agentMarkedComplete","checks","currentStep","acceptance"])||typeof e.agentMarkedComplete!="boolean"||!Ka(e.checks)||!Ja(e.acceptance)?!1:e.currentStep===void 0?!0:T(e.currentStep)&&M(e.currentStep,["text","runs","failures"])&&typeof e.currentStep.text=="string"&&Ya(e.currentStep)}function Ka(e){return!T(e)||!M(e,["runs","failures","latestFailure","source"])||e.source!=="Harness tool_result(is_error / exit_code)"||!Ya(e)?!1:e.latestFailure===void 0?!0:T(e.latestFailure)&&M(e.latestFailure,["toolName","brief","at"])&&typeof e.latestFailure.toolName=="string"&&(e.latestFailure.brief===void 0||typeof e.latestFailure.brief=="string")&&(e.latestFailure.at===void 0||typeof e.latestFailure.at=="string")}function Ya(e){return J(e.runs)&&J(e.failures)&&e.failures<=e.runs}function Ja(e){return!T(e)||typeof e.state!="string"?!1:e.state==="none"?M(e,["state"]):e.state==="accepted"?M(e,["state","at"])&&typeof e.at=="string":e.state==="unavailable"&&M(e,["state","reason"])&&typeof e.reason=="string"}function M(e,n){return Object.keys(e).every(t=>n.includes(t))}function za(e){return!T(e)||typeof e.source!="string"?!1:e.availability==="missing"?e.toolGate===void 0||jo(e.toolGate):e.availability==="unavailable"?typeof e.reason=="string":e.availability!=="available"||e.forInstruction!=="current"&&e.forInstruction!=="previous"||!Number.isSafeInteger(e.revision)||e.revision<1||e.semantics!==void 0&&e.semantics!=="current_snapshot"||!Array.isArray(e.steps)?!1:e.steps.every(n=>T(n)&&typeof n.id=="string"&&typeof n.text=="string"&&(n.description===void 0||typeof n.description=="string")&&Eo(n.status))}function jo(e){return T(e)&&typeof e.harnessVersion=="string"&&(e.model===void 0||typeof e.model=="string")&&(e.affected==="known"||e.affected==="unknown")&&e.since==="2.1.233"&&e.enable==="CLAUDE_CODE_ENABLE_TODO_TOOLS=1"}function Qa(e){return T(e)?e.state==="unavailable"?typeof e.reason=="string"&&(e.reasonI18n===void 0||yn(e.reasonI18n)):typeof e.source!="string"?!1:e.state==="no_open_request"?!0:e.state==="needs_user"?typeof e.since=="string"&&(e.generic===void 0||typeof e.generic=="boolean")&&(e.message===void 0||typeof e.message=="string"):e.state==="activity_resumed_unknown"?typeof e.requestSince=="string"&&typeof e.resumedAt=="string"&&(e.message===void 0||typeof e.message=="string"):!1:!1}function Hn(e){return T(e)&&typeof e.text=="string"&&typeof e.source=="string"&&(e.observedAt===void 0||typeof e.observedAt=="string")}function Eo(e){return e==="pending"||e==="in_progress"||e==="completed"}function J(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0}function T(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Te(e,n){return!e||e.sessions.length===0?null:n!==void 0&&e.states[n]!==void 0?n:e.sessions[0]?.id??null}function Xa(e){if(!e)return null;for(const n of e.sessions){if(!n.waiting)continue;const t=e.states[n.id]?.waiting;if(t)return{label:n.label,message:t.message,since:t.since}}return null}function Za(e){return e?e.todos.length>0||e.traces.length>0||e.turnUsages.length>0||e.currentAction!==null||e.waiting!==null||(e.skillsUsed?.length??0)>0||e.taskWorkflow!==void 0:!1}function tn(e,n){return n===void 0?e:a(n.key,n.params)}const er={completed:"✓",in_progress:"▶",pending:"○"};function nr(e){const n=e.taskWorkflow?.plan;return n?.availability==="available"&&n.forInstruction==="current"?n.steps.filter(t=>t.status==="in_progress").map(t=>t.text):[]}function No(e){return e.availability==="available"?`${C(e.source)} · revision ${e.revision}`:C(e.source)}function Oo(e){const n=e.todos.find(t=>t.status==="in_progress");return n?n.activeForm??n.content:e.lastPrompt}function Mo(e){return e?e.kind==="tool"?e.detail===""?e.toolName:`${e.toolName} · ${e.detail}`:tr(e.name):null}const zt={SessionStart:"panel.narrative.event.SessionStart",SessionEnd:"panel.narrative.event.SessionEnd",UserPromptSubmit:"panel.narrative.event.UserPromptSubmit",PreToolUse:"panel.narrative.event.PreToolUse",PostToolUse:"panel.narrative.event.PostToolUse",Stop:"panel.narrative.event.Stop",Notification:"panel.narrative.event.Notification",PermissionRequest:"panel.narrative.event.PermissionRequest",SubagentStart:"panel.narrative.event.SubagentStart",SubagentStop:"panel.narrative.event.SubagentStop",PreCompact:"panel.narrative.event.PreCompact",PostCompact:"panel.narrative.event.PostCompact","transcript:user-rejected":"panel.narrative.event.userRejected"};function tr(e){const n=Object.hasOwn(zt,e)?zt[e]:void 0;return n===void 0?e:a(n)}function Fo(e){return e?e.turnUsages[e.turnUsages.length-1]??null:null}function ar(e){return e<.005?"<$0.01":`$${e.toFixed(2)}`}function rr(e){return e.totalTokens??e.contextTotal?.value??e.inputTotalTokens??null}function Lo(e){const n=rr(e);if(n===null)return"—";const t=e.status==="aborted"?a("panel.narrative.aborted"):e.status==="incomplete"?a("panel.narrative.incomplete"):"",r=`${B(n)} ${e.totalTokens===void 0&&e.contextTotal===void 0?"input":"tok"}${t}`;return e.costUsd===void 0?r:`${r} ≈ ${ar(e.costUsd)}`}function wn(e){if(e<1e3)return"<1s";const n=Math.round(e/1e3);return n<60?`${n}s`:`${Math.floor(n/60)}m${n%60===0?"":` ${n%60}s`}`}function Do(e,n){return e.agents.length>0?a("panel.narrative.subagent"):n&&n.nodes.length>0?a("panel.narrative.mainAgent"):null}function Wo(e){if(!e||e.todos.length===0)return null;const n=e.taskWorkflow?.plan;return n?.availability==="available"&&n.forInstruction==="previous"?null:`${e.todos.filter(r=>r.status==="completed").length}/${e.todos.length}`}const Ho=6e4;function Uo(e,n,t={},r,s){const o=t.feedback??e?.taskWorkflow?.feedback,i=r??(o?.state==="needs_user"?{label:"",message:o.message??a("panel.narrative.openRequest"),since:o.since}:r===void 0&&e?.waiting?{label:"",message:e.waiting.message,since:e.waiting.since}:null);if(i){const p=i.label===""?"":`(${i.label})`,u=Date.parse(i.since),m=s!==void 0&&Number.isFinite(u)?s-u:Number.NaN,f=Number.isFinite(m)&&m>Ho?a("panel.narrative.waitOverdue",{minutes:Math.floor(m/6e4)}):"";return{mode:"waiting",label:a("panel.narrative.waitLabel",{who:p,message:i.message,overdue:f}),source:o?.state==="needs_user"&&!r?o.source:Z.permissionEvents}}const c=t.projectTitle?[t.projectTitle,t.taskTitle].filter(Boolean).join(" · "):t.sessionTitle;return c?t.turnEnded?{mode:"turnEnded",label:c,status:a("panel.render.turnEnded"),source:t.source}:{mode:t.status===a("panel.narrative.waitingForYou")?"waiting":t.status===a("panel.narrative.inProgress")?"working":"idle",label:c,status:t.waitOutcome?a(`panel.taskboard.${t.waitOutcome.outcome}`):t.status,source:t.waitOutcome?.source??t.source}:{mode:"idle",label:n.label===a("panel.narrative.notWired")?a("panel.narrative.notWired"):a("panel.narrative.waitingEvents"),source:Z.liveEmptyState}}function sr(e,n){const t=n[e.id];return t!==void 0?t:e.status==="in_progress"}async function tt(e,n=globalThis.navigator?.clipboard){if(n===void 0)return!1;try{return await n.writeText(e),!0}catch{return!1}}function Bo(e,n){if(!e)return;const t=n?`${e} / ${n}`:e;let r="other";return e==="codex_exec"?r=n==="exec"?"exec":"cli":(e==="codex_work_desktop"||e==="Codex Desktop")&&(r="desktop"),{key:r,raw:t}}function Sn(e){return`npx harness-wingman${e?`@${e}`:""}`}function Ze(e,n){return`${Sn(n)} hook install ${e}`}function _o(e){return`'${e.replaceAll("'",`'"'"'`)}'`}function or(e,n,t){return`${Sn(t)} protocol install ${e} --project ${_o(n)}`}function qo(e,n){return`${Sn(n)} protocol install ${e} --user`}const Vo=["tray","panel","site"],Go=["codex","claude-code","dsh"];function Ko(e,n){const t=new URL(e);if(t.protocol!=="https:")throw new Error("反馈表单必须使用 HTTPS");if(!Vo.includes(n.source))throw new Error("反馈入口来源不合法");return t.search="",t.hash="",t.searchParams.set("source",n.source),Un(t,"wingman_version",n.wingmanVersion),Un(t,"os",n.os),n.harness!==void 0&&Go.includes(n.harness)&&t.searchParams.set("harness",n.harness),Un(t,"harness_version",n.harnessVersion),t.toString()}function Un(e,n,t){if(t===void 0)return;const r=t.trim();r.length===0||/[\r\n\u2028\u2029]/u.test(r)||[...r].length>64||e.searchParams.set(n,r)}const Yo="https://tally.so/r/aQMeVW",Qt="support@getwingman.dev",Jo={cc:"claude-code",codex:"codex",dsh:"dsh"};function zo(e){const n=e?.harnessVersion;return Ko(Yo,{source:"panel",...e===void 0?{}:{harness:Jo[e.harness]},...n===void 0?{}:{harnessVersion:n}})}const Qo={zh:"30 天免费试用 · 之后 $7.99/月或 $79.99/年 · 可随时取消",en:"30-day free trial · Then $7.99/mo or $79.99/yr · Cancel anytime"},Xo="https://api.getwingman.dev/samples",Zo=256*1024;function ei(e){if(e.__mock_note)return[];const n={harness:e.harness,...e.harnessVersion===void 0?{}:{harnessVersion:e.harnessVersion},scannedAt:e.scannedAt,slots:e.slots,capabilities:e.capabilities};return JSON.stringify(n,null,2).split(`
131
+ `)}function ni(e){return e.filter(n=>!n.mock&&!at(n.event)).map(n=>JSON.stringify(n.event))}function at(e){if(typeof e=="string")return/(?:^|[\\/])\.wingman[\\/]plan\.md(?:$|\s)/u.test(e);if(Array.isArray(e))return e.some(at);if(e===null||typeof e!="object")return!1;for(const[n,t]of Object.entries(e))if(/^(?:project|project_?(?:root|path)|plan|plan_?text)$/iu.test(n)||at(t))return!0;return!1}function ti(e,n){return!Number.isInteger(n)||n<0||n>=e.length?[...e]:e.filter((t,r)=>r!==n)}function ai(e){return e.join(`
132
+ `)}function ir(e,n){return JSON.stringify({kind:e,sample:ai(n)})}function lr(e,n){return new TextEncoder().encode(ir(e,n)).length}function dr(e,n){return lr(e,n)>Zo}function ri(e,n){const t=(lr(e,n)/1024).toFixed(1);return a("panel.share.linesAboutKbLimitKb",{p0:n.length,p1:t})}function si(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}const l=si;function oi(e,n){const t=e?`<div class="empty-detail">${l(e)}</div>`:`<div class="empty-detail">${a("panel.render.apiAnatomyReturnedAnEmptyArray")}</div>`;return`<div class="empty-card">
130
133
  <div class="empty-title">${a("panel.render.noHarnessDetected")}</div>
131
134
  ${t}
132
135
  <div class="empty-hint">${a("panel.render.firstRun")} <code>${l(Sn(n))} serve</code>${Ae(n)}${a("panel.render.thenThePanelReadsAnatomyData")}</div>
133
- </div>`}function Ae(e){return e===null?`<span class="muted">${a("panel.render.versionUnknownADifferentVersionMay")}</span>`:""}function ni(e){const n=e??a("panel.render.noHarnessDetected");return`<div class="wrap"><div class="pill" data-tip="${l(n)}">
136
+ </div>`}function Ae(e){return e===null?`<span class="muted">${a("panel.render.versionUnknownADifferentVersionMay")}</span>`:""}function ii(e){const n=e??a("panel.render.noHarnessDetected");return`<div class="wrap"><div class="pill" data-tip="${l(n)}">
134
137
  <span class="dot quiet"></span><span class="t2">${l(n)}</span>
135
- </div></div>`}function or(e){return e==="waiting"?"wait":e==="turnEnded"?"turn":e==="working"?"live":"quiet"}function hn(e){return`<button class="island-tab ${or(e)}" type="button" data-act="island-reveal" aria-label="${a("panel.render.expand")}"></button>`}function ti(e,n,t="standard",r=!1){const s=t==="compact",i=s&&(n.acknowledgeable===!0||n.mode==="turnEnded"),o=` ${or(n.mode)}`,c=a(s?"panel.render.compactPillSource":"panel.render.sourceClickToExpandThePanel",{p0:String(R[e.harness]),p1:n.attentionCount===void 0?n.label:n.label.slice(R[e.harness].length+3),p2:n.status?` · ${n.status}`:"",p3:String(I(n.source??""))}),p=r?`
136
- ${a("panel.render.discoveredOnStartup")}`:"",u=i?`
138
+ </div></div>`}function cr(e){return e==="waiting"?"wait":e==="turnEnded"?"turn":e==="working"?"live":"quiet"}function hn(e){return`<button class="island-tab ${cr(e)}" type="button" data-act="island-reveal" aria-label="${a("panel.render.expand")}"></button>`}function li(e,n,t="standard",r=!1){const s=t==="compact",o=s&&(n.acknowledgeable===!0||n.mode==="turnEnded"),i=` ${cr(n.mode)}`,c=a(s?"panel.render.compactPillSource":"panel.render.sourceClickToExpandThePanel",{p0:String(E[e.harness]),p1:n.attentionCount===void 0?n.label:n.label.slice(E[e.harness].length+3),p2:n.status?` · ${n.status}`:"",p3:String(C(n.source??""))}),p=r?`
139
+ ${a("panel.render.discoveredOnStartup")}`:"",u=o?`
137
140
  ${a("panel.render.clickToAcknowledge")}`:"",m=n.attentionOthers?.length?a("panel.render.additionalAttention",{events:n.attentionOthers.join(`
138
- `)}):"",f=n.attentionCount?`<span class="attention-count"${m?` data-tip="${l(m)}"`:""}>+${n.attentionCount}</span>`:"";return`<div class="pill${n.mode==="waiting"?" waiting":n.mode==="turnEnded"?" turn-ended":""}"${s?i?' data-act="ack-turn-ended"':"":' data-act="toggle"'} data-tip="${l(c+p+u+(m?`
141
+ `)}):"",f=n.attentionCount?`<span class="attention-count"${m?` data-tip="${l(m)}"`:""}>+${n.attentionCount}</span>`:"";return`<div class="pill${n.mode==="waiting"?" waiting":n.mode==="turnEnded"?" turn-ended":""}"${s?o?' data-act="ack-turn-ended"':"":' data-act="toggle"'} data-tip="${l(c+p+u+(m?`
139
142
  ${m}`:""))}">
140
- <span class="dot${o}"></span>
143
+ <span class="dot${i}"></span>
141
144
  <span class="t2">${l(n.label)}</span>${n.status&&(!s||n.attentionCount!==void 0)?`
142
145
  <span class="t1">${l(n.status)}</span>`:""}
143
146
  ${s?"":'<span class="chev">▾</span>'}${f}
144
- </div>`}function ai(e,n,t){const r=(o,c)=>{const p=ce(o,t);return`<button class="tab${o===n?" act":""}${p?" locked":""}" data-tab="${o}"${p?' aria-disabled="true" data-act="tier-lock"':""}>${l(c)}${p?'<span class="tab-lock" aria-hidden="true"></span>':""}</button>`},s=r("projects",a("panel.render.project")),i=e.map(o=>r(o.harness,R[o.harness])).join("");return`<div class="tabs">${s}${i}</div>`}function ri(e,n){const t=Fe.map(f=>({slot:f,total:ua(e.slots[f]??[])})),r=t.reduce((f,h)=>f+(h.total?.value??0),0),s=ss(e),i=s?a("panel.render.residentTok",{p0:String(me(s))}):null,o=s?`${a("panel.render.residentTotal")} <b data-tip="${a("panel.render.totalResidentTokensOfEnabledItems")}${s.kind==="estimate"?a("panel.render.includesEstimatesMarkedAsApproximate"):a("panel.render.allValuesAreExactAndReported")}">${l(i??"")}</b>`:a("panel.render.noTokenValuesCollectedInThis"),c=r>0?t.filter(f=>f.total&&f.total.value>0).map(f=>{const h=(f.total?.value??0)/r*100,v=`${_e(e.harness,f.slot)} · ${me(f.total)}`;return`<div class="seg" style="width:${h.toFixed(1)}%;background:${un[f.slot]}" data-tip="${l(v)}"></div>`}).join(""):"",p=c?`<div class="stack">${c}</div>`:"",u=t.map(({slot:f,total:h})=>{const v=!h,y=e.slots[f]??[],w=v?a("panel.render.thisScanFoundNoEnabledItems",{p0:String(_e(e.harness,f))}):a("panel.render.residentTotalForEnabledItemsIndividual",{p0:String(_e(e.harness,f))});return`<div class="lrow${v?" na":""}" data-tip="${l(w)}">
147
+ </div>`}function di(e,n,t){const r=(i,c)=>{const p=pe(i,t);return`<button class="tab${i===n?" act":""}${p?" locked":""}" data-tab="${i}"${p?' aria-disabled="true" data-act="tier-lock"':""}>${l(c)}${p?'<span class="tab-lock" aria-hidden="true"></span>':""}</button>`},s=r("projects",a("panel.render.project")),o=e.map(i=>r(i.harness,E[i.harness])).join("");return`<div class="tabs">${s}${o}</div>`}function ci(e,n){const t=Fe.map(f=>({slot:f,total:ha(e.slots[f]??[])})),r=t.reduce((f,h)=>f+(h.total?.value??0),0),s=ps(e),o=s?a("panel.render.residentTok",{p0:String(ge(s))}):null,i=s?`${a("panel.render.residentTotal")} <b data-tip="${a("panel.render.totalResidentTokensOfEnabledItems")}${s.kind==="estimate"?a("panel.render.includesEstimatesMarkedAsApproximate"):a("panel.render.allValuesAreExactAndReported")}">${l(o??"")}</b>`:a("panel.render.noTokenValuesCollectedInThis"),c=r>0?t.filter(f=>f.total&&f.total.value>0).map(f=>{const h=(f.total?.value??0)/r*100,v=`${_e(e.harness,f.slot)} · ${ge(f.total)}`;return`<div class="seg" style="width:${h.toFixed(1)}%;background:${un[f.slot]}" data-tip="${l(v)}"></div>`}).join(""):"",p=c?`<div class="stack">${c}</div>`:"",u=t.map(({slot:f,total:h})=>{const v=!h,y=e.slots[f]??[],$=v?a("panel.render.thisScanFoundNoEnabledItems",{p0:String(_e(e.harness,f))}):a("panel.render.residentTotalForEnabledItemsIndividual",{p0:String(_e(e.harness,f))});return`<div class="lrow${v?" na":""}" data-tip="${l($)}">
145
148
  <span class="sw" style="background:${v?"var(--grid)":un[f]}"></span>${_e(e.harness,f)}
146
149
  <span class="nat">${l(Ve[e.harness][f])}</span>
147
- <span class="v">${l(me(h))}</span>
150
+ <span class="v">${l(ge(h))}</span>
148
151
  <span class="cnt">${y.length} ${a("panel.render.items")}</span>
149
152
  </div>`}).join("");let m="";if(n.anatomyRefreshFailed&&n.anatomyLoadedAt!==null){const f=new Date(n.anatomyLoadedAt),h=`${String(f.getHours()).padStart(2,"0")}:${String(f.getMinutes()).padStart(2,"0")}`;m=`<div class="anatomy-refresh-warning" data-tip="${a("panel.render.sourcePanelTimeOfTheLast")} ${l(n.anatomyLoadedAt)}">${a("panel.render.refreshFailedShowingDataFrom")} ${l(h)} ${a("panel.render.dataSuffix")}</div>`}return`<div class="sec">
150
153
  <div class="label">${a("panel.render.contextBreakdown")}<span class="labr"><button class="sharelink" data-act="share-config" data-tip="${a("panel.render.previewTheCompleteContentBeforeSending")}">${a("panel.render.shareConfigurationSample")}</button></span></div>${m}
151
- <div class="headline">${o}</div>
154
+ <div class="headline">${i}</div>
152
155
  ${p}
153
156
  <div class="legend">${u}</div>
154
- </div>`}function ir(e){if(e.slot!=="skills"||!e.id.startsWith("cc:")&&e.invocation===void 0)return"";const n=e.enabled?e.invocation??"auto":"off",t={auto:a("panel.render.skillAuto"),manual:a("panel.render.skillManual"),"agent-only":a("panel.render.skillAgentOnly"),off:a("panel.render.skillOff")}[n],r={auto:a("panel.render.skillAutoMeaning"),manual:a("panel.render.skillManualMeaning"),"agent-only":a("panel.render.skillAgentOnlyMeaning"),off:a("panel.render.skillOffMeaning")}[n],s=n==="off"&&e.invocationSource!=="frontmatter"?a("panel.render.skillOverridesSource"):`${a("panel.render.skillFrontmatterSource")}; ${r}`;return`<span class="statechip invocation ${n}" data-tip="${l(s)}">${t}</span>`}function _e(e,n){return e==="codex"&&n==="skills"?a("panel.render.plugins"):pa[n]}function xe(e){return e==="skills"?a("panel.render.controlSkills"):e==="tools"?a("panel.render.controlTools"):e==="gates"?a("panel.render.controlBehavior"):pa[e]}function Zn(e,n){return e==="skills"?`<span class="chip skill-scope" data-tip="${a(n==="codex"?"panel.render.pluginConfigurationTip":"panel.render.skillConfigurationTip")}">${a("panel.render.skillConfiguration")}</span>`:""}function si(e){if(e.ccFeature)return Pt(e,!1);const n=ir(e)||(e.enabled?"":`<span class="statechip off" data-tip="${a("panel.render.thisItemIsDisabledToggleableItems")}">${a("panel.render.disabled")}</span>`),t=e.nativePath?"":`<span class="statechip nofile" data-tip="${a("panel.render.noFileThisItemHasNo")}">${a("panel.render.noSourceFile")}</span>`;return`<div class="crow${e.enabled?"":" offrow"}" data-tip="${l(fa(e))}">
157
+ </div>`}function pr(e){if(e.slot!=="skills"||!e.id.startsWith("cc:")&&e.invocation===void 0)return"";const n=e.enabled?e.invocation??"auto":"off",t={auto:a("panel.render.skillAuto"),manual:a("panel.render.skillManual"),"agent-only":a("panel.render.skillAgentOnly"),off:a("panel.render.skillOff")}[n],r={auto:a("panel.render.skillAutoMeaning"),manual:a("panel.render.skillManualMeaning"),"agent-only":a("panel.render.skillAgentOnlyMeaning"),off:a("panel.render.skillOffMeaning")}[n],s=n==="off"&&e.invocationSource!=="frontmatter"?a("panel.render.skillOverridesSource"):`${a("panel.render.skillFrontmatterSource")}; ${r}`;return`<span class="statechip invocation ${n}" data-tip="${l(s)}">${t}</span>`}function _e(e,n){return e==="codex"&&n==="skills"?a("panel.render.plugins"):ga[n]}function Ce(e){return e==="skills"?a("panel.render.controlSkills"):e==="tools"?a("panel.render.controlTools"):e==="gates"?a("panel.render.controlBehavior"):ga[e]}function rt(e,n){return e==="skills"?`<span class="chip skill-scope" data-tip="${a(n==="codex"?"panel.render.pluginConfigurationTip":"panel.render.skillConfigurationTip")}">${a("panel.render.skillConfiguration")}</span>`:""}function pi(e){if(e.ccFeature)return Rt(e,!1);const n=pr(e)||(e.enabled?"":`<span class="statechip off" data-tip="${a("panel.render.thisItemIsDisabledToggleableItems")}">${a("panel.render.disabled")}</span>`),t=e.nativePath?"":`<span class="statechip nofile" data-tip="${a("panel.render.noFileThisItemHasNo")}">${a("panel.render.noSourceFile")}</span>`;return`<div class="crow${e.enabled?"":" offrow"}" data-tip="${l(va(e))}">
155
158
  <span class="cname">${l(e.nativeName)}</span>
156
- <span class="chip">${l(I(e.source))}</span>
159
+ <span class="chip">${l(C(e.source))}</span>
157
160
  ${n}${t}
158
- <span class="ctok">${l(rs(e))}</span>
159
- </div>`}function oi(e){const n=Fe.map(t=>{const r=e.slots[t]??[],s=r.length?r.map(i=>si(i)).join(""):`<div class="crow emptyrow">${a("panel.render.noItemsInThisScanThis")}</div>`;return`<div class="grp">
160
- <div class="gtitle"><span class="gdot" style="background:${un[t]}"></span>${_e(e.harness,t)}${Zn(t,e.harness)}
161
+ <span class="ctok">${l(cs(e))}</span>
162
+ </div>`}function ui(e){const n=Fe.map(t=>{const r=e.slots[t]??[],s=r.length?r.map(o=>pi(o)).join(""):`<div class="crow emptyrow">${a("panel.render.noItemsInThisScanThis")}</div>`;return`<div class="grp">
163
+ <div class="gtitle"><span class="gdot" style="background:${un[t]}"></span>${_e(e.harness,t)}${rt(t,e.harness)}
161
164
  <span class="nat">${l(Ve[e.harness][t])}</span>
162
165
  </div>
163
166
  ${s}
164
167
  </div>`}).join("");return`<div class="sec">
165
168
  <div class="label">${a("panel.render.sixSlotDetailsHoverForSources")}</div>
166
169
  ${n}
167
- </div>`}function ii(e){if(e.ccFeature)return Pt(e);const n=ls(e),t=ir(e)||(e.enabled?"":`<span class="statechip off">${a("panel.render.currentlyDisabled")}</span>`);return`<div class="crow${e.enabled?"":" offrow"}" data-tip="${l(fa(e))}">
170
+ </div>`}function fi(e){if(e.ccFeature)return Rt(e);const n=ms(e),t=pr(e)||(e.enabled?"":`<span class="statechip off">${a("panel.render.currentlyDisabled")}</span>`);return`<div class="crow${e.enabled?"":" offrow"}" data-tip="${l(va(e))}">
168
171
  <span class="cname">${l(e.nativeName)}</span>
169
- <span class="chip">${l(I(e.source))}</span>
172
+ <span class="chip">${l(C(e.source))}</span>
170
173
  ${t}
171
174
  <span class="ctok">${l(n)}</span>
172
175
  <span class="cright"><button class="toggle${e.enabled?" on":""}" data-act="tgl" data-id="${l(e.id)}" role="switch" aria-checked="${e.enabled}" aria-label="${l(`${e.enabled?a("panel.render.disable"):a("panel.render.enable")} ${e.nativeName}`)}" data-tip="${a("panel.render.previewChangesBeforeApplyingNoFiles")}"></button></span>
173
- </div>`}function Pt(e,n=!0,t={}){const r=e.ccFeature;if(!r)return"";const s=ma(r.key),i=r.source==="default"?a("panel.render.ccDefault"):I("user"),o=`${i}
174
- ${e.nativePath} ${r.key}`,c=!e.toggleable||r.overriddenBy!==void 0||r.invalid===!0,p=r.overriddenBy==="managed"?a("panel.render.ccLayerManaged"):r.overriddenBy==="local"?a("panel.render.ccLayerLocal"):a("panel.render.ccLayerProject"),u=r.value===!0?a("panel.render.ccEnabled"):r.value==="accept"||r.value==="hold"||r.value==="refuse"?Yn(r.value):"",m=r.overriddenBy!==void 0?a("panel.render.ccOverridden",{layer:p}):r.invalid?a("panel.render.ccInvalid"):r.value==="default"?a("panel.render.ccByPermissionMode"):r.partial?a("panel.render.ccPartial"):r.value===!1?a("panel.render.currentlyDisabled"):n?"":u,f=r.key==="crossSessionInbound"?`<span class="cc-segments" role="group" aria-label="${l(s)}">${["accept","hold","refuse"].map(g=>`<button type="button" data-act="tgl" data-id="${l(e.id)}" data-value="${g}" aria-pressed="${r.value===g}"${c?" disabled":""}>${Yn(g)}</button>`).join("")}</span>`:`<button class="toggle${r.value===!0?" on":""}" data-act="tgl" data-id="${l(e.id)}"${typeof r.value=="boolean"?` role="switch" aria-checked="${r.value}"`:""} aria-label="${l(`${r.value===!0?a("panel.render.disable"):a("panel.render.enable")} ${s}`)}"${c?" disabled":""} data-tip="${a("panel.render.previewChangesBeforeApplyingNoFiles")}"></button>`,v=`panel:cc:${r.key==="crossSessionInbound"?"inbound":"outbound"}-help`,y=n&&r.key!=="autoMemoryEnabled"?`<details class="cc-feature-help"${t?.[v]===!0?" open":""}><summary data-act="workflow-fold" data-key="${v}" aria-label="${l(`${s}:${a("panel.render.ccMessageHelp")}`)}">${a("panel.render.ccMessageHelp")}</summary><div class="cc-help-body"><p>${a(r.key==="crossSessionInbound"?"panel.render.ccInboundHelp":"panel.render.ccOutboundHelp")}</p><p>${a(r.key==="crossSessionInbound"?"panel.render.ccInboundImpact":"panel.render.ccOutboundWarning")}</p></div></details>`:"",w=r.partial?`<button type="button" class="btn ghost cc-disable-all" data-act="tgl" data-id="${l(e.id)}" data-enable="0"${c?" disabled":""} data-tip="${a("panel.render.ccPartialWarning")}">${a("panel.render.ccDisableAll")}</button>`:"";return`<div class="crow cc-feature${r.value===!1&&!r.partial?" offrow":""}">
176
+ </div>`}function Rt(e,n=!0,t={}){const r=e.ccFeature;if(!r)return"";const s=ba(r.key),o=r.source==="default"?a("panel.render.ccDefault"):C("user"),i=`${o}
177
+ ${e.nativePath} ${r.key}`,c=!e.toggleable||r.overriddenBy!==void 0||r.invalid===!0,p=r.overriddenBy==="managed"?a("panel.render.ccLayerManaged"):r.overriddenBy==="local"?a("panel.render.ccLayerLocal"):a("panel.render.ccLayerProject"),u=r.value===!0?a("panel.render.ccEnabled"):r.value==="accept"||r.value==="hold"||r.value==="refuse"?Zn(r.value):"",m=r.overriddenBy!==void 0?a("panel.render.ccOverridden",{layer:p}):r.invalid?a("panel.render.ccInvalid"):r.value==="default"?a("panel.render.ccByPermissionMode"):r.partial?a("panel.render.ccPartial"):r.value===!1?a("panel.render.currentlyDisabled"):n?"":u,f=r.key==="crossSessionInbound"?`<span class="cc-segments" role="group" aria-label="${l(s)}">${["accept","hold","refuse"].map(g=>`<button type="button" data-act="tgl" data-id="${l(e.id)}" data-value="${g}" aria-pressed="${r.value===g}"${c?" disabled":""}>${Zn(g)}</button>`).join("")}</span>`:`<button class="toggle${r.value===!0?" on":""}" data-act="tgl" data-id="${l(e.id)}"${typeof r.value=="boolean"?` role="switch" aria-checked="${r.value}"`:""} aria-label="${l(`${r.value===!0?a("panel.render.disable"):a("panel.render.enable")} ${s}`)}"${c?" disabled":""} data-tip="${a("panel.render.previewChangesBeforeApplyingNoFiles")}"></button>`,v=`panel:cc:${r.key==="crossSessionInbound"?"inbound":"outbound"}-help`,y=n&&r.key!=="autoMemoryEnabled"?`<details class="cc-feature-help"${t?.[v]===!0?" open":""}><summary data-act="workflow-fold" data-key="${v}" aria-label="${l(`${s}:${a("panel.render.ccMessageHelp")}`)}">${a("panel.render.ccMessageHelp")}</summary><div class="cc-help-body"><p>${a(r.key==="crossSessionInbound"?"panel.render.ccInboundHelp":"panel.render.ccOutboundHelp")}</p><p>${a(r.key==="crossSessionInbound"?"panel.render.ccInboundImpact":"panel.render.ccOutboundWarning")}</p></div></details>`:"",$=r.partial?`<button type="button" class="btn ghost cc-disable-all" data-act="tgl" data-id="${l(e.id)}" data-enable="0"${c?" disabled":""} data-tip="${a("panel.render.ccPartialWarning")}">${a("panel.render.ccDisableAll")}</button>`:"";return`<div class="crow cc-feature${r.value===!1&&!r.partial?" offrow":""}">
175
178
  <span class="cname">${l(s)}${!n&&r.key==="permissions.deny"?`<span class="cc-warning" data-tip="${a("panel.render.ccOutboundWarning")}" aria-label="${a("panel.render.ccOutboundWarning")}">ⓘ</span>`:""}</span>
176
- <span class="chip" data-tip="${l(o)}">${l(i)}</span>
177
- ${n?`<span class="cright">${f}${w}</span>`:""}
179
+ <span class="chip" data-tip="${l(i)}">${l(o)}</span>
180
+ ${n?`<span class="cright">${f}${$}</span>`:""}
178
181
  ${m?`<span class="cc-status${c?" blocked":""}">${l(m)}</span>`:""}${y?`
179
182
  ${y}`:""}
180
- </div>`}function li(e,n){const t=is(e);let r;if(t.groups.length===0&&t.ccFeatures.length===0)r=`<div class="crow emptyrow">${a("panel.render.noItemsInThisScanCan")}</div>`;else{if(r=t.groups.map(s=>{const i=s.items.map(f=>ii(f)).join("");if(e.harness==="dsh"){const f=`${Sa}${s.slot}`,h=n.expandedText?.[f]===!0,v=a("panel.render.dshControlsSummary",{count:s.items.length,enabled:s.items.filter(w=>w.enabled).length}),y=a("panel.render.dshControlsSummarySource",{slot:s.slot});return`<details class="grp fold dsh-controls" data-slot="${s.slot}"${h?" open":""}><summary data-act="workflow-fold" data-key="${f}"><span class="wflabel">${l(xe(s.slot))}</span><span class="fold-summary" data-tip="${l(y)}">${l(v)}</span></summary><div class="fold-body"><div class="cfgnote">${l(Ve.dsh[s.slot])}</div>${i}</div></details>`}if(e.harness==="codex"&&s.slot==="skills"){const f=e.slots.skills.filter(w=>w.enabled).length,h=n.narrative?.pluginsUsed?.length??0,v=a(h>0?"panel.render.pluginsSummary":"panel.render.pluginsUnobserved",{enabled:f,used:h});return`<details class="grp fold codex-plugins" data-slot="skills"${n.expandedText?.[Jn]===!0?" open":""}><summary data-act="workflow-fold" data-key="${Jn}"><span class="wflabel">${l(xe(s.slot))}</span>${Zn("skills","codex")}<span class="fold-summary" data-tip="${a("panel.render.pluginsSummarySource")}">${l(v)}</span></summary><div class="fold-body"><div class="cfgnote">${a("panel.render.codexPluginControlHint")}</div>${i}</div></details>`}if(e.harness==="cc"&&(s.slot==="skills"||s.slot==="tools")){const f=s.slot==="skills",h=f?e.slots.skills.filter(S=>S.enabled&&S.invocation!=="off").length:e.slots.tools.filter(S=>S.enabled&&S.nativeName.startsWith("mcpServers.")).length,v=(f?n.narrative?.skillsUsed?.length:n.narrative?.mcpUsed?.length)??0,y=a(f?v>0?"panel.render.ccSkillsSummary":"panel.render.ccSkillsUnobserved":v>0?"panel.render.ccToolsSummary":"panel.render.ccToolsUnobserved",{enabled:h,used:v}),w=a(f?"panel.render.ccSkillsSummarySource":"panel.render.ccToolsSummarySource"),g=f?ka:$a,k=n.expandedText?.[g]===!0;return`<details class="grp fold cc-${s.slot}" data-slot="${s.slot}"${k?" open":""}><summary data-act="workflow-fold" data-key="${g}"><span class="wflabel">${l(xe(s.slot))}</span>${Zn(s.slot,"cc")}<span class="fold-summary" data-tip="${l(w)}">${l(y)}</span></summary><div class="fold-body"><div class="cfgnote">${l(Ve.cc[s.slot])}</div>${i}</div></details>`}const o=e.harness==="codex"&&s.slot==="tools"?`<div class="cfgnote" data-tip="${a("panel.render.verifiedInPLANBConfigToml")}">${a("panel.render.codexSupportsIndividualToolsThroughEnabled")}</div>`:"",c=`panel:controls:${e.harness}:${s.slot}`,p=n.expandedText?.[c]===!0,u=a("panel.render.controlSummary",{count:s.items.length,enabled:s.items.filter(f=>f.enabled).length}),m=a("panel.render.controlSummarySource",{slot:s.slot});return`<details class="grp fold controls-group" data-slot="${s.slot}"${p?" open":""}><summary data-act="workflow-fold" data-key="${c}"><span class="wflabel">${l(xe(s.slot))}</span><span class="fold-summary" data-tip="${l(m)}">${l(u)}</span></summary><div class="fold-body"><div class="cfgnote">${l(Ve[e.harness][s.slot])}</div>${i}${o}</div></details>`}).join(""),t.ccFeatures.length>0){const s="panel:controls:cc:features",i=n.expandedText?.[s]===!0,o=a("panel.render.controlSettingsCount",{count:t.ccFeatures.length});r+=`<details class="grp fold control-features" data-slot="gates"${i?" open":""}><summary data-act="workflow-fold" data-key="${s}"><span class="wflabel">${l(xe("gates"))}</span><span class="fold-summary" data-tip="${a("panel.render.ccScope")}">${l(o)}</span></summary><div class="fold-body"><div class="grp cc-features"><div class="gtitle" data-tip="${a("panel.render.ccScope")}"><span class="gdot" style="background:${un.gates}"></span>${a("panel.render.ccFeatures")}<span class="nat">settings.json</span></div><p class="cfgnote cc-settings-note">${a("panel.render.ccSettingsHint")}</p>${t.ccFeatures.map(c=>Pt(c,!0,n.expandedText)).join("")}</div></div></details>`}if(t.slotsWithoutToggle.length>0){const s=t.slotsWithoutToggle.map(i=>xe(i)).join(" · ");r+=`<div class="cfgnote">${a("panel.render.otherSlots")}${s}${a("panel.render.haveNoToggleableItemsInThis")}</div>`}}return`<div class="sec configure-section">
183
+ </div>`}function mi(e,n){const t=fs(e);let r;if(t.groups.length===0&&t.ccFeatures.length===0)r=`<div class="crow emptyrow">${a("panel.render.noItemsInThisScanCan")}</div>`;else{if(r=t.groups.map(s=>{const o=s.items.map(f=>fi(f)).join("");if(e.harness==="dsh"){const f=`${Pa}${s.slot}`,h=n.expandedText?.[f]===!0,v=a("panel.render.dshControlsSummary",{count:s.items.length,enabled:s.items.filter($=>$.enabled).length}),y=a("panel.render.dshControlsSummarySource",{slot:s.slot});return`<details class="grp fold dsh-controls" data-slot="${s.slot}"${h?" open":""}><summary data-act="workflow-fold" data-key="${f}"><span class="wflabel">${l(Ce(s.slot))}</span><span class="fold-summary" data-tip="${l(y)}">${l(v)}</span></summary><div class="fold-body"><div class="cfgnote">${l(Ve.dsh[s.slot])}</div>${o}</div></details>`}if(e.harness==="codex"&&s.slot==="skills"){const f=e.slots.skills.filter($=>$.enabled).length,h=n.narrative?.pluginsUsed?.length??0,v=a(h>0?"panel.render.pluginsSummary":"panel.render.pluginsUnobserved",{enabled:f,used:h});return`<details class="grp fold codex-plugins" data-slot="skills"${n.expandedText?.[et]===!0?" open":""}><summary data-act="workflow-fold" data-key="${et}"><span class="wflabel">${l(Ce(s.slot))}</span>${rt("skills","codex")}<span class="fold-summary" data-tip="${a("panel.render.pluginsSummarySource")}">${l(v)}</span></summary><div class="fold-body"><div class="cfgnote">${a("panel.render.codexPluginControlHint")}</div>${o}</div></details>`}if(e.harness==="cc"&&(s.slot==="skills"||s.slot==="tools")){const f=s.slot==="skills",h=f?e.slots.skills.filter(S=>S.enabled&&S.invocation!=="off").length:e.slots.tools.filter(S=>S.enabled&&S.nativeName.startsWith("mcpServers.")).length,v=(f?n.narrative?.skillsUsed?.length:n.narrative?.mcpUsed?.length)??0,y=a(f?v>0?"panel.render.ccSkillsSummary":"panel.render.ccSkillsUnobserved":v>0?"panel.render.ccToolsSummary":"panel.render.ccToolsUnobserved",{enabled:h,used:v}),$=a(f?"panel.render.ccSkillsSummarySource":"panel.render.ccToolsSummarySource"),g=f?Ta:Aa,k=n.expandedText?.[g]===!0;return`<details class="grp fold cc-${s.slot}" data-slot="${s.slot}"${k?" open":""}><summary data-act="workflow-fold" data-key="${g}"><span class="wflabel">${l(Ce(s.slot))}</span>${rt(s.slot,"cc")}<span class="fold-summary" data-tip="${l($)}">${l(y)}</span></summary><div class="fold-body"><div class="cfgnote">${l(Ve.cc[s.slot])}</div>${o}</div></details>`}const i=e.harness==="codex"&&s.slot==="tools"?`<div class="cfgnote" data-tip="${a("panel.render.verifiedInPLANBConfigToml")}">${a("panel.render.codexSupportsIndividualToolsThroughEnabled")}</div>`:"",c=`panel:controls:${e.harness}:${s.slot}`,p=n.expandedText?.[c]===!0,u=a("panel.render.controlSummary",{count:s.items.length,enabled:s.items.filter(f=>f.enabled).length}),m=a("panel.render.controlSummarySource",{slot:s.slot});return`<details class="grp fold controls-group" data-slot="${s.slot}"${p?" open":""}><summary data-act="workflow-fold" data-key="${c}"><span class="wflabel">${l(Ce(s.slot))}</span><span class="fold-summary" data-tip="${l(m)}">${l(u)}</span></summary><div class="fold-body"><div class="cfgnote">${l(Ve[e.harness][s.slot])}</div>${o}${i}</div></details>`}).join(""),t.ccFeatures.length>0){const s="panel:controls:cc:features",o=n.expandedText?.[s]===!0,i=a("panel.render.controlSettingsCount",{count:t.ccFeatures.length});r+=`<details class="grp fold control-features" data-slot="gates"${o?" open":""}><summary data-act="workflow-fold" data-key="${s}"><span class="wflabel">${l(Ce("gates"))}</span><span class="fold-summary" data-tip="${a("panel.render.ccScope")}">${l(i)}</span></summary><div class="fold-body"><div class="grp cc-features"><div class="gtitle" data-tip="${a("panel.render.ccScope")}"><span class="gdot" style="background:${un.gates}"></span>${a("panel.render.ccFeatures")}<span class="nat">settings.json</span></div><p class="cfgnote cc-settings-note">${a("panel.render.ccSettingsHint")}</p>${t.ccFeatures.map(c=>Rt(c,!0,n.expandedText)).join("")}</div></div></details>`}if(t.slotsWithoutToggle.length>0){const s=t.slotsWithoutToggle.map(o=>Ce(o)).join(" · ");r+=`<div class="cfgnote">${a("panel.render.otherSlots")}${s}${a("panel.render.haveNoToggleableItemsInThis")}</div>`}}return`<div class="sec configure-section">
181
184
  <div class="label">${a("panel.render.toolsAndPreferences")}</div>
182
185
  ${r}
183
- </div>`}function di(e){const n=e.returnTargets;if(n==null)return"";const t=n.available.map(o=>{const c=n.selected?.bundlePath===o.bundlePath;return`<button class="return-target-option${c?" act":""}" data-act="return-target-select" data-bundle-path="${l(o.bundlePath)}" type="button" aria-pressed="${c}"${e.returnTargetSaving?" disabled":""}>${l(o.name)}</button>`}).join(""),r=n.settings!==void 0&&!e.returnSettingsDismissed?`<div class="task-error">${l(n.settings.unavailable)} <button class="return-settings-dismiss" data-act="return-settings-dismiss" type="button">${a("panel.render.close")}</button></div>`:"",s=e.returnTargetError===null||e.returnTargetError===void 0?"":`<div class="task-error" role="status">${l(e.returnTargetError)}</div>`;if(t===""&&r===""&&s==="")return"";const i=t===""?"":`<div class="label">${a("panel.render.switchToThisAppWhenReturning")}</div><div class="return-target-options">${t}</div>`;return`<div class="sec return-targets" data-tip="${a("panel.render.sourceGETApiReturnTargetLocal")}">
184
- ${i}${r}${s}
185
- </div>`}function ci(e,n){if("kind"in e){const c=e.fromVersion!==void 0&&e.toVersion!==void 0,p=c?a("panel.render.update"):e.kind==="protocol_user_install"?a("panel.render.install"):a("panel.render.uninstall"),u=c?a("panel.render.protocolImpactUpdate"):e.kind==="protocol_user_install"?a("panel.render.protocolImpactInstall"):a("panel.render.protocolImpactUninstall"),m=`<div class="msec"><div class="mlabel">${a("panel.render.protocolImpactLabel")}</div><div class="mtext">${u}</div></div>`;return`<div class="msec" data-tip="${a("panel.render.sourcePOSTApiActionPlanHostname")}"><div class="mlabel">${a("panel.render.hostRunningWingman")}</div><div class="mtext">${l(e.hostname)} ${a("panel.render.operationOnHost",{verb:p})}</div></div>
186
+ </div>`}function gi(e){const n=e.returnTargets;if(n==null)return"";const t=n.available.map(i=>{const c=n.selected?.bundlePath===i.bundlePath;return`<button class="return-target-option${c?" act":""}" data-act="return-target-select" data-bundle-path="${l(i.bundlePath)}" type="button" aria-pressed="${c}"${e.returnTargetSaving?" disabled":""}>${l(i.name)}</button>`}).join(""),r=n.settings!==void 0&&!e.returnSettingsDismissed?`<div class="task-error">${l(n.settings.unavailable)} <button class="return-settings-dismiss" data-act="return-settings-dismiss" type="button">${a("panel.render.close")}</button></div>`:"",s=e.returnTargetError===null||e.returnTargetError===void 0?"":`<div class="task-error" role="status">${l(e.returnTargetError)}</div>`;if(t===""&&r===""&&s==="")return"";const o=t===""?"":`<div class="label">${a("panel.render.switchToThisAppWhenReturning")}</div><div class="return-target-options">${t}</div>`;return`<div class="sec return-targets" data-tip="${a("panel.render.sourceGETApiReturnTargetLocal")}">
187
+ ${o}${r}${s}
188
+ </div>`}function hi(e,n){if("kind"in e){const c=e.fromVersion!==void 0&&e.toVersion!==void 0,p=c?a("panel.render.update"):e.kind==="protocol_user_install"?a("panel.render.install"):a("panel.render.uninstall"),u=c?a("panel.render.protocolImpactUpdate"):e.kind==="protocol_user_install"?a("panel.render.protocolImpactInstall"):a("panel.render.protocolImpactUninstall"),m=`<div class="msec"><div class="mlabel">${a("panel.render.protocolImpactLabel")}</div><div class="mtext">${u}</div></div>`;return`<div class="msec" data-tip="${a("panel.render.sourcePOSTApiActionPlanHostname")}"><div class="mlabel">${a("panel.render.hostRunningWingman")}</div><div class="mtext">${l(e.hostname)} ${a("panel.render.operationOnHost",{verb:p})}</div></div>
186
189
  <div class="msec" data-tip="${a("panel.render.sourcePOSTApiActionPlanTargetPath")}"><div class="mlabel">${a("panel.render.protocolFileOperation",{verb:p})}</div><div class="mfile"><code class="mpath">${l(e.targetPath)}</code><span class="mlines">${e.blockBytes} ${a("panel.render.bytes")}</span></div><div class="mtext">${e.hasBlock?a("panel.render.aManagedBlockAlreadyExists"):a("panel.render.noManagedBlockYet")}</div></div>
187
190
  ${m}
188
191
  ${c?`<div class="msec" data-tip="${a("panel.render.sourcePOSTApiActionPlanFromVersion")}"><div class="mtext">${a("panel.render.updateTheV")}${e.fromVersion} ${a("panel.render.blockToV")}${e.toVersion}</div></div>`:""}
189
192
  <div class="msec"><div class="mlabel">${a("panel.render.whenItTakesEffect")}</div><div class="mtext">${a("panel.render.appliesToTheNextNewSession")}</div></div>
190
193
  <div class="msec" data-tip="${a("panel.render.sourcePOSTApiActionPlanBackupDir")}"><div class="mlabel">${a("panel.render.backupDirectoryRule")}</div><div class="mtext">${a("panel.render.backUpBeforeWriting")}<code>${l(e.backupDir)}</code>${a("panel.render.uninstallingPreservesExistingContentAndSupports")}</div></div>
191
- <div class="mact"><button class="btn ghost" data-act="plan-cancel">${a("panel.render.cancel")}</button><button class="btn primary" data-act="plan-confirm">${a("panel.render.confirmWrite")}</button></div>`}const t=e.writes.length?e.writes.map(c=>`<div class="mfile"><span class="mkind ${c.kind}">${ds(c.kind)}</span><code class="mpath">${l(c.file)}</code><span class="mlines">${l(cs(c))}</span></div>`).join(""):`<div class="mtext muted">${a("panel.render.thePlanContainsNoFileChanges")}</div>`,r=e.references.length?e.references.map(c=>`<div class="mref"><code class="mpath">${l(`${c.file}:${c.line}`)}</code><span class="mctx">${l(c.context)}</span></div>`).join(""):`<div class="mtext muted">${a("panel.render.noOtherReferencesFoundInThe")}</div>`,s=n?`<div class="mnote">${l(n)}</div>`:"",i=ga(e),o=i.length>0?`<div class="msec"><div class="mlabel">${a("panel.render.ccExactChanges")}</div>${i.map(c=>`<div class="mtext"><code>${l(c)}</code></div>`).join("")}</div>`:"";return`${s}
192
- <div class="msec"><div class="mlabel">${a("panel.render.filesToWriteNoBytesChange")}</div>${t}</div>${o}
194
+ <div class="mact"><button class="btn ghost" data-act="plan-cancel">${a("panel.render.cancel")}</button><button class="btn primary" data-act="plan-confirm">${a("panel.render.confirmWrite")}</button></div>`}const t=e.writes.length?e.writes.map(c=>`<div class="mfile"><span class="mkind ${c.kind}">${gs(c.kind)}</span><code class="mpath">${l(c.file)}</code><span class="mlines">${l(hs(c))}</span></div>`).join(""):`<div class="mtext muted">${a("panel.render.thePlanContainsNoFileChanges")}</div>`,r=e.references.length?e.references.map(c=>`<div class="mref"><code class="mpath">${l(`${c.file}:${c.line}`)}</code><span class="mctx">${l(c.context)}</span></div>`).join(""):`<div class="mtext muted">${a("panel.render.noOtherReferencesFoundInThe")}</div>`,s=n?`<div class="mnote">${l(n)}</div>`:"",o=ya(e),i=o.length>0?`<div class="msec"><div class="mlabel">${a("panel.render.ccExactChanges")}</div>${o.map(c=>`<div class="mtext"><code>${l(c)}</code></div>`).join("")}</div>`:"";return`${s}
195
+ <div class="msec"><div class="mlabel">${a("panel.render.filesToWriteNoBytesChange")}</div>${t}</div>${i}
193
196
  <div class="msec"><div class="mlabel">${a("panel.render.references")} ${e.references.length} ${a("panel.render.matchesThesePlacesMentionItReported")}</div>${r}</div>
194
- <div class="msec"><div class="mlabel">${a("panel.render.whenItTakesEffect")}</div><div class="mtext">${l(ps(e.effectiveAt))}</div></div>
197
+ <div class="msec"><div class="mlabel">${a("panel.render.whenItTakesEffect")}</div><div class="mtext">${l(vs(e.effectiveAt))}</div></div>
195
198
  <div class="msec"><div class="mlabel">${a("panel.render.backup")}</div><div class="mtext">${a("panel.render.beforeWritingBackUpOriginalsTo")} <code>${l(e.backupDir)}</code>${a("panel.render.restoreByCopyingTheOriginalBytes")}</div></div>
196
199
  <div class="mact">
197
200
  <button class="btn ghost" data-act="plan-cancel">${a("panel.render.cancel")}</button>
198
201
  <button class="btn primary" data-act="plan-confirm">${a("panel.render.confirmWrite")}</button>
199
- </div>`}function pi(e){const n=e.phase==="confirm"&&e.mockNote?`<span class="mockchip" data-tip="${l(e.mockNote)}">MOCK</span>`:"";let t;e.phase==="planning"?t=`<div class="mtext muted">${a("panel.render.generatingPlanReadOnlyNoFiles")}</div>`:e.phase==="applying"?t=`<div class="mtext muted">${a("panel.render.writingOriginalsHaveBeenBackedUp")}</div>`:e.phase==="confirm"?t=ci(e.plan,e.mockNote):e.phase==="applied"?t=`<div class="mtext">${a("panel.render.changesWrittenPanelDataRefreshed")}</div>
202
+ </div>`}function vi(e){const n=e.phase==="confirm"&&e.mockNote?`<span class="mockchip" data-tip="${l(e.mockNote)}">MOCK</span>`:"";let t;e.phase==="planning"?t=`<div class="mtext muted">${a("panel.render.generatingPlanReadOnlyNoFiles")}</div>`:e.phase==="applying"?t=`<div class="mtext muted">${a("panel.render.writingOriginalsHaveBeenBackedUp")}</div>`:e.phase==="confirm"?t=hi(e.plan,e.mockNote):e.phase==="applied"?t=`<div class="mtext">${a("panel.render.changesWrittenPanelDataRefreshed")}</div>
200
203
  ${e.backupDir===void 0?`<div class="mtext">${a("panel.render.noNewBackupWasCreated")}</div>`:`<div class="mtext">${a("panel.render.backupPrefix")}<code>${l(e.backupDir)}</code>${a("panel.render.restoreByCopyingTheOriginalBytesBack")}</div>`}
201
204
  <div class="mact"><button class="btn primary" data-act="plan-cancel">${a("panel.render.close")}</button></div>`:e.phase==="demo"?t=`<div class="mtext">${a("panel.render.demoModeActionsStopAtThe")}</div>
202
205
  <div class="mact"><button class="btn primary" data-act="plan-cancel">${a("panel.render.gotIt")}</button></div>`:t=`<div class="merror">${l(e.message)}</div>
@@ -207,36 +210,36 @@ ${e.nativePath} ${r.key}`,c=!e.toggleable||r.overriddenBy!==void 0||r.invalid===
207
210
  <div class="mhead"><span class="mtitle">${l(e.title)}</span>${n}${r?`<button class="mclose" data-act="plan-cancel" aria-label="${a("panel.render.closeDialog")}">✕</button>`:""}</div>
208
211
  ${t}
209
212
  </div>
210
- </div>`}function ui(e,n=Date.now(),t=[],r=!1){const s=Ia(e??null);if(!s||!e)return"";if(s==="free"){const o=e.freeHarnessSwitchableAt,c=o===void 0?0:Date.parse(o)-n,p=Math.ceil(c/864e5),u=o===void 0||c<=0&&r,m='<span class="licsep" aria-hidden="true">·</span>',f=e.detail?` data-tip="${l(e.detail)}"`:"",h=o===void 0?void 0:new Date(o),v=a("panel.render.freeTierBarSwitchableAt",{date:h?`${h.getFullYear()}-${String(h.getMonth()+1).padStart(2,"0")}-${String(h.getDate()).padStart(2,"0")}`:""}),y=o===void 0?`<span>${a("panel.render.freeTierBarChoose")}</span>`:`<span${f}>${a("panel.render.freeTierBarCurrent",{tool:R[e.freeHarness]})}</span>${m}${c>0?`<span class="free-harness-cooldown" aria-disabled="true" data-tip="${l(v)}">${a(p===1?"panel.render.freeTierBarDay":"panel.render.freeTierBarDays",{days:p})}</span>`:`<span>${a("panel.render.freeTierBarToday")}</span><button class="licfootlink" data-act="free-harness-change" aria-expanded="${r}">${a("panel.render.freeTierBarChange")}</button>`}`,w=o===void 0?"":`${m}${et("licfootlink")}<button class="licfootlink" data-act="lic-refresh">${a("panel.render.refreshLicense")}</button>`;return`<div class="licrow free"><b${f}>${a("panel.render.freeTierBarLabel")}</b>${m}${y}${u?fi(e,t):""}${w}</div>`}if(s==="trial-active"){const o=e.exp?.match(/^\d{4}-\d{2}-\d{2}/)?.[0],c=Date.parse(e.exp??"")-n,p=o?a(c>=0&&c<=7*864e5?"panel.render.dayFreeTrialEnding":"panel.render.dayFreeTrialUntil",{p0:String(o)}):a("panel.render.dayFreeTrialActive");return`<div class="lictrial"><button class="licfootlink" data-act="lic-open" data-tip="${l(e.detail)}">${p}</button></div>`}if(s==="trial-expired")return`<div class="licrow"><button class="licbar expired" data-act="lic-open" data-tip="${l(e.detail)}">${a("panel.render.freeTrialEndedRefreshOrSubscribe")}</button></div>`;const i=a(s==="grace"?"panel.render.subscriptionExpiredInGracePeriodRenew":"panel.render.subscriptionExpiredFreeTier");return`<div class="licrow"><button class="licbar ${s}" data-act="lic-open" data-tip="${l(e.detail)}">${l(i)}</button>${et("licimport")}</div>`}function fi(e,n){return e.tier!=="free"||n.length===0?"":`<span class="free-harness" role="group" aria-label="${a("panel.render.freeTierHarness")}">${n.map(({harness:t})=>{const r=e.freeHarnessSwitchableAt!==void 0&&t===e.freeHarness;return`<button class="btn ghost${r?" act":""}" data-act="free-harness" data-harness="${t}" aria-pressed="${r}">${l(R[t])}</button>`}).join("")}</span>`}function mi(e){return`<div class="overlay">
213
+ </div>`}function bi(e,n=Date.now(),t=[],r=!1){return ki(e,n,t,r)+yi(e)}function yi(e){const n=e?.activation;if(!n)return"";const t=n.state==="device_limit",r=t&&n.devices.length<n.maxDevices,s=n.state==="device_revoked",o=n.state==="active"?a("panel.license.deviceActive",{count:n.devices.length,max:n.maxDevices}):t?r?a("panel.license.deviceNotRegistered",{count:n.devices.length,max:n.maxDevices}):a("panel.license.deviceLimit",{count:n.devices.length}):s?a("panel.license.deviceRevoked"):n.detail??a(n.state==="unavailable"?"panel.license.deviceUnavailable":"panel.license.devicePending"),i=t?a(r?"panel.license.deviceNotRegisteredTip":"panel.license.deviceLimitTip"):s?a("panel.license.deviceRevokedTip"):a("panel.license.deviceTip",{max:n.maxDevices});return`<div class="licactivation${t||s?" limited":""}"><button class="licfootlink" data-act="lic-open" data-tip="${l(i)}">${l(o)}</button>${ur(e)}${t?fr(e):""}</div>`}function ur(e){return e.activation?.state==="device_revoked"?`<button class="licfootlink" data-act="lic-activate" data-tip="${l(a("panel.license.deviceRevokedTip"))}">${a("panel.license.activateDevice")}</button>`:""}function fr(e){const n=e.activation?.devices;if(!n?.length)return"";const t=e.state==="active"&&e.activation?.state==="active";return`<div class="licdevices" role="group" aria-label="${a("panel.license.devices")}"${t?"":` data-tip="${l(a("panel.license.deviceManageElsewhere"))}"`}>${n.map(r=>`<div class="licdevice"><span class="licdevice-info"><span>${l(r.name||a("panel.license.unnamedDevice"))}</span><time datetime="${l(r.renewedAt)}" data-tip="${l(a("panel.license.deviceLastSeen",{at:r.renewedAt}))}">${l(new Date(r.renewedAt).toISOString().slice(0,16).replace("T"," "))} UTC</time></span>${t?`<button class="licfootlink" data-act="lic-unbind" data-device-id="${l(r.id)}" data-tip="${l(a("panel.license.unbindTip"))}">${a("panel.license.unbind")}</button>`:""}</div>`).join("")}</div>`}function ki(e,n,t,r){const s=Na(e??null);if(!s||!e)return"";if(s==="free"){const i=e.freeHarnessSwitchableAt,c=i===void 0?0:Date.parse(i)-n,p=Math.ceil(c/864e5),u=i===void 0||c<=0&&r,m='<span class="licsep" aria-hidden="true">·</span>',f=e.detail?` data-tip="${l(e.detail)}"`:"",h=i===void 0?void 0:new Date(i),v=a("panel.render.freeTierBarSwitchableAt",{date:h?`${h.getFullYear()}-${String(h.getMonth()+1).padStart(2,"0")}-${String(h.getDate()).padStart(2,"0")}`:""}),y=i===void 0?`<span>${a("panel.render.freeTierBarChoose")}</span>`:`<span${f}>${a("panel.render.freeTierBarCurrent",{tool:E[e.freeHarness]})}</span>${m}${c>0?`<span class="free-harness-cooldown" aria-disabled="true" data-tip="${l(v)}">${a(p===1?"panel.render.freeTierBarDay":"panel.render.freeTierBarDays",{days:p})}</span>`:`<span>${a("panel.render.freeTierBarToday")}</span><button class="licfootlink" data-act="free-harness-change" aria-expanded="${r}">${a("panel.render.freeTierBarChange")}</button>`}`,$=i===void 0?"":`${m}${st("licfootlink")}<button class="licfootlink" data-act="lic-refresh">${a("panel.render.refreshLicense")}</button>`;return`<div class="licrow free"><b${f}>${a("panel.render.freeTierBarLabel")}</b>${m}${y}${u?$i(e,t):""}${$}</div>`}if(s==="trial-active"){const i=e.exp?.match(/^\d{4}-\d{2}-\d{2}/)?.[0],c=Date.parse(e.exp??"")-n,p=i?a(c>=0&&c<=7*864e5?"panel.render.dayFreeTrialEnding":"panel.render.dayFreeTrialUntil",{p0:String(i)}):a("panel.render.dayFreeTrialActive");return`<div class="lictrial"><button class="licfootlink" data-act="lic-open" data-tip="${l(e.detail)}">${p}</button></div>`}if(s==="trial-expired")return`<div class="licrow"><button class="licbar expired" data-act="lic-open" data-tip="${l(e.detail)}">${a("panel.render.freeTrialEndedRefreshOrSubscribe")}</button></div>`;const o=a(s==="grace"?"panel.render.subscriptionExpiredInGracePeriodRenew":"panel.render.subscriptionExpiredFreeTier");return`<div class="licrow"><button class="licbar ${s}" data-act="lic-open" data-tip="${l(e.detail)}">${l(o)}</button>${st("licimport")}</div>`}function $i(e,n){return e.tier!=="free"||n.length===0?"":`<span class="free-harness" role="group" aria-label="${a("panel.render.freeTierHarness")}">${n.map(({harness:t})=>{const r=e.freeHarnessSwitchableAt!==void 0&&t===e.freeHarness;return`<button class="btn ghost${r?" act":""}" data-act="free-harness" data-harness="${t}" aria-pressed="${r}">${l(E[t])}</button>`}).join("")}</span>`}function wi(e){return`<div class="overlay">
211
214
  <div class="scrim" data-act="tier-lock-close"></div>
212
215
  <div class="modal tier-lock-modal" role="dialog" aria-modal="true" aria-label="${a("panel.render.freeTierModalTitle")}">
213
216
  <div class="mhead"><span class="mtitle">${a("panel.render.freeTierModalTitle")}</span><button class="mclose" data-act="tier-lock-close" aria-label="${a("panel.render.closeDialog")}">✕</button></div>
214
- <p class="mtext">${a("panel.render.freeTierModalBody",{tool:R[e.freeHarness]})}</p>
215
- <p class="tier-price">${l(Vo[Me()==="zh"?"zh":"en"])}</p>
216
- <div class="mact"><a class="btn primary" data-act="tier-trial" href="${xa}" target="_blank" rel="noreferrer">${a("panel.render.freeTierModalTrial")}</a><button class="btn ghost" data-act="tier-lock-close">${a("panel.render.freeTierModalDismiss")}</button></div>
217
+ <p class="mtext">${a("panel.render.freeTierModalBody",{tool:E[e.freeHarness]})}</p>
218
+ <p class="tier-price">${l(Qo[Me()==="zh"?"zh":"en"])}</p>
219
+ <div class="mact"><a class="btn primary" data-act="tier-trial" href="${Ea}" target="_blank" rel="noreferrer">${a("panel.render.freeTierModalTrial")}</a><button class="btn ghost" data-act="tier-lock-close">${a("panel.render.freeTierModalDismiss")}</button></div>
217
220
  <div class="tier-license-links"><span>${a("panel.render.freeTierModalExisting")}</span><button class="licfootlink" data-act="lic-import">${a("panel.render.freeTierModalImport")}</button><span aria-hidden="true">·</span><button class="licfootlink" data-act="lic-refresh">${a("panel.render.freeTierModalRefresh")}</button></div>
218
221
  </div>
219
- </div>`}function et(e){return`<button class="${e}" data-act="lic-import" data-tip="${a("panel.render.importLicenseJsonFromTheActivation")}">${a("panel.render.importLicense")}</button>`}function gi(e){const n=e.ok?`<div class="mtext">${l(e.message)}</div>`:`<div class="merror">${l(e.message)}</div>`;return`<div class="overlay">
222
+ </div>`}function st(e){return`<button class="${e}" data-act="lic-import" data-tip="${a("panel.render.importLicenseJsonFromTheActivation")}">${a("panel.render.importLicense")}</button>`}function Si(e){const n=e.ok?`<div class="mtext">${l(e.message)}</div>`:`<div class="merror">${l(e.message)}</div>`;return`<div class="overlay">
220
223
  <div class="scrim" data-act="import-close"></div>
221
224
  <div class="modal" role="dialog" aria-modal="true" aria-label="${a("panel.render.importLicense")}">
222
225
  <div class="mhead"><span class="mtitle">${a("panel.render.importLicense")}</span><button class="mclose" data-act="import-close" aria-label="${a("panel.render.closeDialog")}">✕</button></div>
223
226
  ${n}
224
227
  <div class="mact"><button class="btn primary" data-act="import-close">${a("panel.render.close")}</button></div>
225
228
  </div>
226
- </div>`}function hi(e,n=Ca,t=!1,r=null,s=!1){const i=e.plan==="trial",o=i&&e.state==="expired",c=n===""?a("panel.render.cancelSubscriptionsOrChangePaymentMethods"):`<a href="${l(n)}" target="_blank" rel="noreferrer">${a("panel.render.manageSubscriptionCancelPaymentMethodInvoices")}</a>`,p=i&&!o?"":`<div class="msec"><div class="mlabel">${a("panel.render.refreshLicense")}</div><div class="mtext">${a("panel.render.afterPaymentOrWhileYourSubscription")}</div></div>`,u=o&&s?`<div class="msec"><div class="mlabel">${a("panel.render.keepUsingWriteFeatures")}</div><div class="mtext"><a href="${l(xa)}" target="_blank" rel="noreferrer">${a("panel.render.subscribeToWingman")}</a></div></div>`:"",m=r?`<div class="${r.ok?"mtext":"merror"}" aria-live="polite">${l(r.message)}</div>`:"",f=i&&!o?"":`<button class="btn primary" data-act="lic-refresh"${t?" disabled":""}>${a(t?"panel.render.refreshing":"panel.render.refreshLicense")}</button>`;return`<div class="overlay">
229
+ </div>`}function Ti(e,n=ja,t=!1,r=null,s=!1){const o=e.plan==="trial",i=o&&e.state==="expired",c=n===""?a("panel.render.cancelSubscriptionsOrChangePaymentMethods"):`<a href="${l(n)}" target="_blank" rel="noreferrer">${a("panel.render.manageSubscriptionCancelPaymentMethodInvoices")}</a>`,p=o&&!i?"":`<div class="msec"><div class="mlabel">${a("panel.render.refreshLicense")}</div><div class="mtext">${a("panel.render.afterPaymentOrWhileYourSubscription")}</div></div>`,u=i&&s?`<div class="msec"><div class="mlabel">${a("panel.render.keepUsingWriteFeatures")}</div><div class="mtext"><a href="${l(Ea)}" target="_blank" rel="noreferrer">${a("panel.render.subscribeToWingman")}</a></div></div>`:"",m=r?`<div class="${r.ok?"mtext":"merror"}" aria-live="polite">${l(r.message)}</div>`:"",f=o&&!i?"":`<button class="btn primary" data-act="lic-refresh"${t?" disabled":""}>${a(t?"panel.render.refreshing":"panel.render.refreshLicense")}</button>`;return`<div class="overlay">
227
230
  <div class="scrim" data-act="lic-close"></div>
228
- <div class="modal" role="dialog" aria-modal="true" aria-label="${a(i?"panel.render.freeTrial":"panel.render.licenseStatus")}">
229
- <div class="mhead"><span class="mtitle">${a(o?"panel.render.freeTrialEnded":i?"panel.render.dayFreeTrial":"panel.render.licenseStatus")}</span><button class="mclose" data-act="lic-close" aria-label="${a("panel.render.closeDialog")}">✕</button></div>
230
- <div class="msec"><div class="mlabel">${a("panel.render.currentStatus")}</div><div class="mtext">${l(e.detail)}</div></div>${p}${u}
231
+ <div class="modal" role="dialog" aria-modal="true" aria-label="${a(o?"panel.render.freeTrial":"panel.render.licenseStatus")}">
232
+ <div class="mhead"><span class="mtitle">${a(i?"panel.render.freeTrialEnded":o?"panel.render.dayFreeTrial":"panel.render.licenseStatus")}</span><button class="mclose" data-act="lic-close" aria-label="${a("panel.render.closeDialog")}">✕</button></div>
233
+ <div class="msec"><div class="mlabel">${a("panel.render.currentStatus")}</div><div class="mtext">${l(e.detail)}</div></div>${fr(e)}${p}${u}
231
234
  <div class="msec"><div class="mlabel">${a("panel.render.subscriptionManagement")}</div><div class="mtext">${c}</div></div>
232
- ${m}<div class="mact"><button class="btn ghost" data-act="lic-close">${a("panel.render.close")}</button>${f}</div>
235
+ ${m}<div class="mact"><button class="btn ghost" data-act="lic-close">${a("panel.render.close")}</button>${ur(e)}${f}</div>
233
236
  </div>
234
- </div>`}function vi(e){let n;if(e.phase==="preview"){const t=e.lines.length?e.lines.map((o,c)=>`<div class="shline"><button class="shdel" data-act="share-del" data-i="${c}" aria-label="${a("panel.render.deleteLineNumber",{line:c+1})}" data-tip="${a("panel.render.removeThisLineFromThisSubmission")}">✕</button><span class="shtext">${l(o)}</span></div>`).join(""):`<div class="mtext muted">${a("panel.render.nothingToSendMOCKDemoData")}</div>`,r=sr(e.kind,e.lines),s=r?`<div class="merror">${a("panel.render.sampleExceedsKBRemoveSomeContent")}</div>`:"",i=e.lines.length===0||r?" disabled":"";n=`<div class="mtext">${a("panel.render.shareASampleToHelpWingman")}</div>
235
- <div class="msec"><div class="mlabel">${a("panel.render.contentToSend")} ${l(Xo(e.kind,e.lines))}</div>
237
+ </div>`}function Ai(e){let n;if(e.phase==="preview"){const t=e.lines.length?e.lines.map((i,c)=>`<div class="shline"><button class="shdel" data-act="share-del" data-i="${c}" aria-label="${a("panel.render.deleteLineNumber",{line:c+1})}" data-tip="${a("panel.render.removeThisLineFromThisSubmission")}">✕</button><span class="shtext">${l(i)}</span></div>`).join(""):`<div class="mtext muted">${a("panel.render.nothingToSendMOCKDemoData")}</div>`,r=dr(e.kind,e.lines),s=r?`<div class="merror">${a("panel.render.sampleExceedsKBRemoveSomeContent")}</div>`:"",o=e.lines.length===0||r?" disabled":"";n=`<div class="mtext">${a("panel.render.shareASampleToHelpWingman")}</div>
238
+ <div class="msec"><div class="mlabel">${a("panel.render.contentToSend")} ${l(ri(e.kind,e.lines))}</div>
236
239
  <div class="sharebox">${t}</div>${s}</div>
237
240
  <div class="mact">
238
241
  <button class="btn ghost" data-act="share-close">${a("panel.render.closeWithoutSending")}</button>
239
- <button class="btn primary" data-act="share-send"${i}>${a("panel.render.send")}</button>
242
+ <button class="btn primary" data-act="share-send"${o}>${a("panel.render.send")}</button>
240
243
  </div>`}else e.phase==="sending"?n=`<div class="mtext muted">${a("panel.render.sendingPOST")} ${l("api.getwingman.dev/samples")})</div>`:e.phase==="sent"?n=`<div class="mtext">${a("panel.render.sentSamplesAreUsedOnlyTo")}</div>
241
244
  <div class="mact"><button class="btn primary" data-act="share-close">${a("panel.render.close")}</button></div>`:n=`<div class="merror">${l(e.message??a("panel.render.sendFailed"))}</div>
242
245
  <div class="mtext muted">${a("panel.render.nothingWasSentYouCanShare")}</div>
@@ -246,133 +249,133 @@ ${e.nativePath} ${r.key}`,c=!e.toggleable||r.overriddenBy!==void 0||r.invalid===
246
249
  <div class="mhead"><span class="mtitle">${l(e.title)}</span><button class="mclose" data-act="share-close" aria-label="${a("panel.render.closeDialog")}">✕</button></div>
247
250
  ${n}
248
251
  </div>
249
- </div>`}function bi(e,n){const{event:t}=e,r=t.payload.hook_event_name,s=typeof t.payload.tool_name=="string"?t.payload.tool_name:"",i=typeof t.payload.session_id=="string"?t.payload.session_id:a("panel.render.noSessionId"),o=[a("panel.render.eventOriginalHookEventName",{p0:String(r)}),a("panel.render.timeReceiverReceivedAt",{p0:String(t.received_at)}),a("panel.render.sessionIdentifier",{id:i})];return e.mock&&o.push(a("panel.render.mockInjectedDevDemoReplayNot")),`<div class="lvrow${t.harness===n?" own":" other"}" data-tip="${l(o.join(`
252
+ </div>`}function Pi(e,n){const{event:t}=e,r=t.payload.hook_event_name,s=typeof t.payload.tool_name=="string"?t.payload.tool_name:"",o=typeof t.payload.session_id=="string"?t.payload.session_id:a("panel.render.noSessionId"),i=[a("panel.render.eventOriginalHookEventName",{p0:String(r)}),a("panel.render.timeReceiverReceivedAt",{p0:String(t.received_at)}),a("panel.render.sessionIdentifier",{id:o})];return e.mock&&i.push(a("panel.render.mockInjectedDevDemoReplayNot")),`<div class="lvrow${t.harness===n?" own":" other"}" data-tip="${l(i.join(`
250
253
  `))}">
251
- <span class="lvtime">${l(Ea(t.received_at))}</span>
252
- <span class="lvname">${l(Ra(r))}</span>
254
+ <span class="lvtime">${l(Fa(t.received_at))}</span>
255
+ <span class="lvname">${l(Ma(r))}</span>
253
256
  ${s?`<span class="chip">${l(s)}</span>`:""}
254
257
  ${e.mock?'<span class="mockchip">MOCK</span>':""}
255
258
  <span class="lvharness">${l(t.harness)}</span>
256
- </div>`}function lr(e,n,t,r){const s=e.capabilities.live,i=s==="full"?a("panel.render.wiringConfigurationComplete",{p0:String(a(r?"panel.render.eventsReceived":"panel.render.eventsNotVerified"))}):os(s),o=n.entries.filter(u=>u.event.harness===e.harness);let c;n.entries.length>0?(c=`<div class="feed">${[...n.entries].reverse().map(m=>bi(m,e.harness)).join("")}</div>`,s==="none"&&o.length===0?c=`<div class="livenone">○ ${l(R[e.harness])} ${a("panel.render.notConnectedRun")} <code>${l(Ze(e.harness,t))}</code>${Ae(t)} ${a("panel.render.restartThisHarnessAfterConnectingIt")}</div>`+c:e.harness==="codex"&&o.length===0&&(c=`<div class="livenone">${a("panel.render.codexHooksConfigurationDetectedButNo")} <code>/hooks</code>${a("panel.render.confirmWingmanIsTrustedAndEnabled")}</div>`+c)):s==="none"?c=`<div class="livenone">${a("panel.render.notConnectedIndicator")} <code>${l(Ze(e.harness,t))}</code>${Ae(t)} ${a("panel.render.toConnectThisHarnessSHooks")}</div>`:e.harness==="codex"?c=`<div class="livenone">${a("panel.render.codexHooksConfigurationDetectedButNoEvents")} <code>/hooks</code>${a("panel.render.confirmWingmanIsTrustedAndEnabled")}</div>`:c=s==="full"?`<div class="livenone">○ ${l(i)}${r?a("panel.render.theNarrativeOverviewAlreadyHasA"):a("panel.render.liveEventsWillAppearAfterProduces",{p0:String(l(R[e.harness]))})}</div>`:`<div class="livenone">${a("panel.render.pushWiringConfigurationDetectedButNo")} ${l(R[e.harness])} ${a("panel.render.producesAnEvent")}</div>`;const p=n.connection==="retrying"?`<button class="demobtn" data-act="demo" ${n.replaying?"disabled":""} data-tip="${a("panel.render.localDemoWhenEventSourceCannotConnect")}">${a("panel.render.replayFixturesDemoMOCK")}</button>`:"";return`<div class="sec">
257
- <div class="label">${a("panel.render.live")} <span class="tier${s==="none"?" none":""}">${l(i)}</span>
258
- <span class="conn ${n.replaying?"replay":n.connection}" data-tip="${a("panel.render.getApiEventsSSEConnectionStatus")}">${l(Oa(n))}</span>
259
+ </div>`}function mr(e,n,t,r){const s=e.capabilities.live,o=s==="full"?a("panel.render.wiringConfigurationComplete",{p0:String(a(r?"panel.render.eventsReceived":"panel.render.eventsNotVerified"))}):us(s),i=n.entries.filter(u=>u.event.harness===e.harness);let c;n.entries.length>0?(c=`<div class="feed">${[...n.entries].reverse().map(m=>Pi(m,e.harness)).join("")}</div>`,s==="none"&&i.length===0?c=`<div class="livenone">○ ${l(E[e.harness])} ${a("panel.render.notConnectedRun")} <code>${l(Ze(e.harness,t))}</code>${Ae(t)} ${a("panel.render.restartThisHarnessAfterConnectingIt")}</div>`+c:e.harness==="codex"&&i.length===0&&(c=`<div class="livenone">${a("panel.render.codexHooksConfigurationDetectedButNo")} <code>/hooks</code>${a("panel.render.confirmWingmanIsTrustedAndEnabled")}</div>`+c)):s==="none"?c=`<div class="livenone">${a("panel.render.notConnectedIndicator")} <code>${l(Ze(e.harness,t))}</code>${Ae(t)} ${a("panel.render.toConnectThisHarnessSHooks")}</div>`:e.harness==="codex"?c=`<div class="livenone">${a("panel.render.codexHooksConfigurationDetectedButNoEvents")} <code>/hooks</code>${a("panel.render.confirmWingmanIsTrustedAndEnabled")}</div>`:c=s==="full"?`<div class="livenone">○ ${l(o)}${r?a("panel.render.theNarrativeOverviewAlreadyHasA"):a("panel.render.liveEventsWillAppearAfterProduces",{p0:String(l(E[e.harness]))})}</div>`:`<div class="livenone">${a("panel.render.pushWiringConfigurationDetectedButNo")} ${l(E[e.harness])} ${a("panel.render.producesAnEvent")}</div>`;const p=n.connection==="retrying"?`<button class="demobtn" data-act="demo" ${n.replaying?"disabled":""} data-tip="${a("panel.render.localDemoWhenEventSourceCannotConnect")}">${a("panel.render.replayFixturesDemoMOCK")}</button>`:"";return`<div class="sec">
260
+ <div class="label">${a("panel.render.live")} <span class="tier${s==="none"?" none":""}">${l(o)}</span>
261
+ <span class="conn ${n.replaying?"replay":n.connection}" data-tip="${a("panel.render.getApiEventsSSEConnectionStatus")}">${l(Da(n))}</span>
259
262
  <span class="labr">${p}<button class="sharelink" data-act="share-events" data-tip="${a("panel.render.previewTheCompleteEventStreamBefore")}">${a("panel.render.shareEventSample")}</button></span>
260
263
  </div>
261
264
  ${c}
262
- </div>`}const Ct={now:new Date(0).toISOString(),wingmanVersion:void 0,view:"tasks",narrative:null,projects:null,anatomyLoadedAt:null,anatomyRefreshFailed:!1,projectMemoryDismissed:!1,projectRefreshFailed:!1,startedAt:null,notices:[],noticeDismissed:{},sessions:[],selectedSession:null,sessionSeen:{},suggHidden:{},island:!1,todoOpen:{},nodeOpen:{},evidenceOpen:!1,rawOpen:!1,taskFilter:ve,taskMenuOpen:null,taskResumeOpen:null,returnTargets:null,returnSettingsDismissed:!1,returnTargetSaving:!1,returnTargetError:null,taskReturnResults:{},hiddenOpen:{},factsOpen:{},taskError:null};function yi(e){return e.replace(/^session-/u,"").slice(0,8)}function xt(e,n){if(e!=="codex"||n===void 0)return"";const t=Fo(n.originator,n.source);if(t===void 0)return"";const r={exec:"panel.render.originExec",cli:"panel.render.originCli",desktop:"panel.render.originDesktop"},s=t.key==="other"?t.raw:a(r[t.key]);return`<span class="chip session-origin" data-tip="${a("panel.render.originSource")}">${l(s)}</span>`}function ki(e){return e.split("/").filter(n=>n!=="").pop()??e}function $i(e,n){const t=e.sessions.filter(p=>!p.archived&&!be(n,p.id,e.projects)),r=Date.parse(e.now),s=new Map;for(const p of e.projects?.projects??[])if(!("payloadUnavailable"in p))for(const u of p.sessions)u.harness===n&&s.set(u.id,{project:p,session:u});if(t.length<2&&!t.some(p=>Nn(p,r)||s.get(p.id)?.project.isHome===!0))return"";const i=new Map;for(const p of t){const u=s.get(p.id)?.project,m=u?.isHome===!0?"home":u?.root??`label:${p.label}`,f=i.get(m)??{title:u?.isHome===!0?a("narrative.homeDirectory"):u?.root!==void 0?ki(u.root):p.label,members:[],lastActivity:""};f.members.push(p),p.lastActivity>f.lastActivity&&(f.lastActivity=p.lastActivity),i.set(m,f)}const o=(p,u)=>{const m=s.get(p.id),f=m?.session,h=p.cwd??f?.cwd??m?.project.root??u,v=f?Ne(f):{text:p.label,source:a("panel.source.sessionLabelFallback")},y=p.id===e.selectedSession,w=e.sessionSeen[`${n}:${p.id}`]??"",g=!y&&p.lastActivity>w,k=[a("panel.render.sessionIdentifier",{id:p.id}),a("panel.render.recentActivity",{p0:p.lastActivity?he(p.lastActivity,Date.parse(e.now)):a("panel.render.notObserved")}),p.lastActivity,p.ended?a("panel.render.endedSessionEndOrNoEventsFor"):p.turnEnded&&!p.waiting?a("panel.render.chipTurnEnded"):a("panel.render.inProgress"),p.waiting?a("panel.render.waitingForYouAnOpenPermission"):"",p.discovered?a("panel.render.discoveredOnStartup"):"",g?a("panel.render.newActivitySinceLastViewed"):"",a("panel.render.chipDirectory",{p0:h}),a("panel.render.chipTitleSource",{p0:I(v.source)})].filter(K=>K!=="").join(`
263
- `),S=p.waiting?'<span class="sdot wait"></span>':"",A=v.source===Q.workingDirectory?a("panel.render.chipNoInstruction",{p0:p.lastActivity?he(p.lastActivity,r):a("panel.render.notObservedValue")}):v.text,P=xt(n,p.origin),F=`${n}:${p.id}`,E=e.taskError?.key===F?`<div class="task-error" role="status">${l(e.taskError.message)}</div>`:"";return`<span class="session-chip"><button class="schip${g&&!p.waiting?" fresh":""}${y?" act":""}${p.ended?" ended":""}${P?" has-session-origin":""}" data-act="session" data-id="${l(p.id)}" data-tip="${l(k)}">${S}<span class="session-chip-title">${l(A)}</span>${P}</button><button class="session-chip-archive" data-act="task-archive" data-key="${l(F)}" data-value="true" type="button" aria-label="${a("panel.render.archiveThisSession")}" data-tip="${a("panel.render.archiveThisSession")}">×</button></span>${E}`},c=(p,u,m)=>{const f=m.filter(k=>Nn(k,r)),h=m.filter(k=>!Nn(k,r)),v=`${n}:${p}`,y=e.oldSessionsOpen?.includes(v)===!0,w=h.length===0?"":`<div class="schips">${h.map(k=>o(k,u)).join("")}</div>`,g=f.length===0?"":`<div class="old-sessions"><button class="task-hidden-toggle" data-act="old-sessions-toggle" data-group="${l(v)}" type="button" aria-expanded="${y}" data-tip="${a("panel.render.olderSessionsSource",{days:Aa})}">${a("panel.render.olderSessions",{count:f.length})}</button>${y?`<div class="schips">${f.map(k=>o(k,u)).join("")}</div>`:""}</div>`;return`<div class="session-chip-group" data-session-group="${l(p)}"><div class="project-label">${l(u)}</div>${w}${g}</div>`};return[...i].sort(([,p],[,u])=>u.lastActivity.localeCompare(p.lastActivity)).map(([p,{title:u,members:m}])=>c(p,u,m)).join("")}function Si(e,n){if(e.sessions.length!==0||e.startedAt===null)return"";const t=n==="dsh"?"panel.render.sessionsAreCreatedFromEventsOnlyDsh":"panel.render.sessionsAreCreatedFromEventsOnly";return`<div class="sessions-empty">${a("panel.render.sinceWingmanStarted")}${l(e.startedAt)}${a("panel.render.noHookEventsReceivedFrom")} ${l(R[n])} ${a(t)}</div>`}function wn(e,n,t,r,s,i={},o=!1){return`<details class="fold panel-detail ${e}-detail"${o||i[n]===!0?" open":""}><summary data-act="workflow-fold" data-key="${l(n)}"><span>${l(t)}</span>${r?`<span class="fold-summary">${l(r)}</span>`:""}</summary><div class="fold-body">${s}</div></details>`}function wi(e,n){const t=n.sessions.length>0,r=e.capabilities.live!=="none",s=a(t?"panel.render.conversationDetailsPending":r?"panel.render.noConversationObserved":"panel.render.checkConnection"),i=t?a("panel.render.conversationDetailsPendingHint"):a(r?"panel.render.startConversationHint":"panel.render.checkConnectionHint",{harness:R[e.harness]}),o=`panel:${e.harness}:connection`;return`<section class="task-empty"><span class="empty-eyebrow">${l(R[e.harness])}</span><h2>${l(s)}</h2><p>${l(i)}</p><button type="button" class="empty-action${r?" secondary":""}" data-act="panel-detail-open" data-key="${o}">${a(r?"panel.render.conversationNotShowing":"panel.render.viewConnectionSettings")}</button></section>`}function Yt(e,n,t,r=!0){const s=Ze(e.harness,t.wingmanVersion),i=a("panel.render.scannedAt",{p0:R[e.harness],p1:e.harnessVersion?` ${e.harnessVersion}`:"",p2:fn(e.scannedAt)}),o=t.hooks,c=a("panel.render.lastHookReceived",{p0:o?.lastReceivedAt?fn(o.lastReceivedAt):a("panel.render.hookNotReceived")}),p=o?a("panel.render.hookReceiptSource",{count:o.count})+(o.lastReceivedAt?`
264
- ${o.lastReceivedAt}`:""):a("panel.render.hookReceiptUnavailable"),u=`<p class="connection-meta" data-tip="${l(p)}">${l(c)}</p>`;let m="";if(e.harness==="codex"&&o?.instances){const h=o.instances,v="count"in h?a("panel.render.wingmanInstanceCount",{p0:h.count}):a("panel.render.wingmanInstancesUnavailable",{p0:a("panel.render.notApplicable")}),y="count"in h?a("panel.render.wingmanInstanceSource")+(h.count>1?`
265
- ${a("panel.render.codexBroadcastSource")}`:""):a("panel.render.wingmanInstancesFixtureSource");m=`<p class="connection-meta" data-tip="${l(y)}">${l(v)}</p>`}const f=`<p class="connection-meta">${l(i)}</p>${u}${m}${Si(t,e.harness)}${dr(t,e.harness)}${r?lr(e,n,t.wingmanVersion,t.sessions.length>0):""}<div class="connection-command"><span>${a("panel.render.connectionInstallCommand")}</span><code>${l(s)}</code>${Ae(t.wingmanVersion)}<button type="button" data-act="protocol-copy" data-command="${l(s)}">${a("panel.render.copy")}</button></div>`;return wn("connection",`panel:${e.harness}:connection`,a("panel.render.connectionDetails"),a("panel.render.localFeedStatus",{status:Oa(n)}),f,t.expandedText)}function Ti(e,n){const t=e.planProtocol?.user;if(t===void 0)return"";const r={installed:a("panel.render.protocolInstalled"),outdated:a("panel.render.protocolVUpdateAvailable"),missing:a("panel.render.notInstalled"),modified:a("panel.render.modified"),unsupported:a("panel.render.unsupported")};return wn("protocol",`panel:${e.harness}:protocol`,a("panel.render.planDisplaySettings"),r[t],Zi(e,n),n.expandedText,n.protocolBannerHighlight===e.harness)}function Jt(e,n){return n.kind==="evicted"?`${e}:${n.sessionId}:${n.at}`:`${e}:${n.kind}:${n.at}`}function Ai(e,n){return e.notices.filter(t=>!e.noticeDismissed[Jt(n,t)]).map(t=>{const r=Jt(n,t);if(t.kind==="dsh_legacy_hooks_retired"){if(n!=="dsh")return"";const s=t.restored==="unavailable"?a("panel.render.legacyHomeLevelWiringCouldNot"):a("panel.render.legacyHomeLevelWiringAndEarlier");return`<div class="session-notice" data-kind="dsh_legacy_hooks_retired" data-act="notice-dismiss" data-key="${l(r)}">${l(s)}<code>${l(t.command)}</code><span class="session-notice-close">${a("panel.render.close")}</span></div>`}return`<div class="session-notice" data-act="notice-dismiss" data-key="${l(r)}">${a("panel.render.evicted")} ${l(t.label)}(${l(yi(t.sessionId))}) · ${l(Ea(t.at))} · ${l(t.reason)}<span class="session-notice-close">${a("panel.render.close")}</span></div>`}).join("")}function dr(e,n){const t=e.sessions.find(r=>r.id===e.selectedSession)??e.sessions[0];return t?.feedback==="not_wired"?`<div class="feedbacksignal">${a("panel.render.feedbackSignalsNotConnected")}${l(Ze(n,e.wingmanVersion))}${Ae(e.wingmanVersion)}</div>`:t?.feedback==="unavailable"?`<div class="feedbacksignal">${a("panel.render.feedbackSignalsUnavailable")}</div>`:""}function Pi(e,n){const t=e.narrative?.suggestions??[];if(t.length===0)return"";const r=e.selectedSession??"",s=t.filter(i=>e.suggHidden[`${n}:${r}:${i.id}`]!==!0).map(i=>{const o=i.action?`<button class="sugbtn" data-act="sugg-plan" data-item="${l(i.action.itemId)}" data-enable="${i.action.enable?"1":"0"}" data-tip="${a("panel.render.previewThePlanFilesTimingAnd")}">${a("panel.render.viewPlan")}</button>`:"";return`<div class="sugg r-${i.rule}" data-tip="${l(I(i.source))}">
266
- <span class="sugtext">${l(tn(i.text,i.textI18n))}</span><span class="sugactions">${o}<button class="sugdismiss" data-act="sugg-dismiss" data-sugg="${l(i.id)}" data-tip="${a("panel.render.dismissThisSuggestionForThisSession")}">${a("panel.render.dismiss")}</button></span>
265
+ </div>`}const jt={now:new Date(0).toISOString(),wingmanVersion:void 0,view:"tasks",narrative:null,projects:null,anatomyLoadedAt:null,anatomyRefreshFailed:!1,projectMemoryDismissed:!1,projectRefreshFailed:!1,startedAt:null,notices:[],noticeDismissed:{},sessions:[],selectedSession:null,sessionSeen:{},suggHidden:{},island:!1,todoOpen:{},nodeOpen:{},evidenceOpen:!1,rawOpen:!1,taskFilter:be,taskMenuOpen:null,taskResumeOpen:null,returnTargets:null,returnSettingsDismissed:!1,returnTargetSaving:!1,returnTargetError:null,taskReturnResults:{},hiddenOpen:{},factsOpen:{},taskError:null};function xi(e){return e.replace(/^session-/u,"").slice(0,8)}function Et(e,n){if(e!=="codex"||n===void 0)return"";const t=Bo(n.originator,n.source);if(t===void 0)return"";const r={exec:"panel.render.originExec",cli:"panel.render.originCli",desktop:"panel.render.originDesktop"},s=t.key==="other"?t.raw:a(r[t.key]);return`<span class="chip session-origin" data-tip="${a("panel.render.originSource")}">${l(s)}</span>`}function Ci(e){return e.split("/").filter(n=>n!=="").pop()??e}function Ii(e,n){const t=e.sessions.filter(p=>!p.archived&&!ye(n,p.id,e.projects)),r=Date.parse(e.now),s=new Map;for(const p of e.projects?.projects??[])if(!("payloadUnavailable"in p))for(const u of p.sessions)u.harness===n&&s.set(u.id,{project:p,session:u});if(t.length<2&&!t.some(p=>Fn(p,r)||s.get(p.id)?.project.isHome===!0))return"";const o=new Map;for(const p of t){const u=s.get(p.id)?.project,m=u?.isHome===!0?"home":u?.root??`label:${p.label}`,f=o.get(m)??{title:u?.isHome===!0?a("narrative.homeDirectory"):u?.root!==void 0?Ci(u.root):p.label,members:[],lastActivity:""};f.members.push(p),p.lastActivity>f.lastActivity&&(f.lastActivity=p.lastActivity),o.set(m,f)}const i=(p,u)=>{const m=s.get(p.id),f=m?.session,h=p.cwd??f?.cwd??m?.project.root??u,v=f?Ne(f):{text:p.label,source:a("panel.source.sessionLabelFallback")},y=p.id===e.selectedSession,$=e.sessionSeen[`${n}:${p.id}`]??"",g=!y&&p.lastActivity>$,k=[a("panel.render.sessionIdentifier",{id:p.id}),a("panel.render.recentActivity",{p0:p.lastActivity?ve(p.lastActivity,Date.parse(e.now)):a("panel.render.notObserved")}),p.lastActivity,p.ended?a("panel.render.endedSessionEndOrNoEventsFor"):p.turnEnded&&!p.waiting?a("panel.render.chipTurnEnded"):a("panel.render.inProgress"),p.waiting?a("panel.render.waitingForYouAnOpenPermission"):"",p.discovered?a("panel.render.discoveredOnStartup"):"",g?a("panel.render.newActivitySinceLastViewed"):"",a("panel.render.chipDirectory",{p0:h}),a("panel.render.chipTitleSource",{p0:C(v.source)})].filter(K=>K!=="").join(`
266
+ `),S=p.waiting?'<span class="sdot wait"></span>':"",A=v.source===Z.workingDirectory?a("panel.render.chipNoInstruction",{p0:p.lastActivity?ve(p.lastActivity,r):a("panel.render.notObservedValue")}):v.text,P=Et(n,p.origin),F=`${n}:${p.id}`,j=e.taskError?.key===F?`<div class="task-error" role="status">${l(e.taskError.message)}</div>`:"";return`<span class="session-chip"><button class="schip${g&&!p.waiting?" fresh":""}${y?" act":""}${p.ended?" ended":""}${P?" has-session-origin":""}" data-act="session" data-id="${l(p.id)}" data-tip="${l(k)}">${S}<span class="session-chip-title">${l(A)}</span>${P}</button><button class="session-chip-archive" data-act="task-archive" data-key="${l(F)}" data-value="true" type="button" aria-label="${a("panel.render.archiveThisSession")}" data-tip="${a("panel.render.archiveThisSession")}">×</button></span>${j}`},c=(p,u,m)=>{const f=m.filter(k=>Fn(k,r)),h=m.filter(k=>!Fn(k,r)),v=`${n}:${p}`,y=e.oldSessionsOpen?.includes(v)===!0,$=h.length===0?"":`<div class="schips">${h.map(k=>i(k,u)).join("")}</div>`,g=f.length===0?"":`<div class="old-sessions"><button class="task-hidden-toggle" data-act="old-sessions-toggle" data-group="${l(v)}" type="button" aria-expanded="${y}" data-tip="${a("panel.render.olderSessionsSource",{days:Ia})}">${a("panel.render.olderSessions",{count:f.length})}</button>${y?`<div class="schips">${f.map(k=>i(k,u)).join("")}</div>`:""}</div>`;return`<div class="session-chip-group" data-session-group="${l(p)}"><div class="project-label">${l(u)}</div>${$}${g}</div>`};return[...o].sort(([,p],[,u])=>u.lastActivity.localeCompare(p.lastActivity)).map(([p,{title:u,members:m}])=>c(p,u,m)).join("")}function Ri(e,n){if(e.sessions.length!==0||e.startedAt===null)return"";const t=n==="dsh"?"panel.render.sessionsAreCreatedFromEventsOnlyDsh":"panel.render.sessionsAreCreatedFromEventsOnly";return`<div class="sessions-empty">${a("panel.render.sinceWingmanStarted")}${l(e.startedAt)}${a("panel.render.noHookEventsReceivedFrom")} ${l(E[n])} ${a(t)}</div>`}function Tn(e,n,t,r,s,o={},i=!1){return`<details class="fold panel-detail ${e}-detail"${i||o[n]===!0?" open":""}><summary data-act="workflow-fold" data-key="${l(n)}"><span>${l(t)}</span>${r?`<span class="fold-summary">${l(r)}</span>`:""}</summary><div class="fold-body">${s}</div></details>`}function ji(e,n){const t=n.sessions.length>0,r=e.capabilities.live!=="none",s=a(t?"panel.render.conversationDetailsPending":r?"panel.render.noConversationObserved":"panel.render.checkConnection"),o=t?a("panel.render.conversationDetailsPendingHint"):a(r?"panel.render.startConversationHint":"panel.render.checkConnectionHint",{harness:E[e.harness]}),i=`panel:${e.harness}:connection`;return`<section class="task-empty"><span class="empty-eyebrow">${l(E[e.harness])}</span><h2>${l(s)}</h2><p>${l(o)}</p><button type="button" class="empty-action${r?" secondary":""}" data-act="panel-detail-open" data-key="${i}">${a(r?"panel.render.conversationNotShowing":"panel.render.viewConnectionSettings")}</button></section>`}function Xt(e,n,t,r=!0){const s=Ze(e.harness,t.wingmanVersion),o=a("panel.render.scannedAt",{p0:E[e.harness],p1:e.harnessVersion?` ${e.harnessVersion}`:"",p2:fn(e.scannedAt)}),i=t.hooks,c=a("panel.render.lastHookReceived",{p0:i?.lastReceivedAt?fn(i.lastReceivedAt):a("panel.render.hookNotReceived")}),p=i?a("panel.render.hookReceiptSource",{count:i.count})+(i.lastReceivedAt?`
267
+ ${i.lastReceivedAt}`:""):a("panel.render.hookReceiptUnavailable"),u=`<p class="connection-meta" data-tip="${l(p)}">${l(c)}</p>`;let m="";if(e.harness==="codex"&&i?.instances){const h=i.instances,v="count"in h?a("panel.render.wingmanInstanceCount",{p0:h.count}):a("panel.render.wingmanInstancesUnavailable",{p0:a("panel.render.notApplicable")}),y="count"in h?a("panel.render.wingmanInstanceSource")+(h.count>1?`
268
+ ${a("panel.render.codexBroadcastSource")}`:""):a("panel.render.wingmanInstancesFixtureSource");m=`<p class="connection-meta" data-tip="${l(y)}">${l(v)}</p>`}const f=`<p class="connection-meta">${l(o)}</p>${u}${m}${Ri(t,e.harness)}${gr(t,e.harness)}${r?mr(e,n,t.wingmanVersion,t.sessions.length>0):""}<div class="connection-command"><span>${a("panel.render.connectionInstallCommand")}</span><code>${l(s)}</code>${Ae(t.wingmanVersion)}<button type="button" data-act="protocol-copy" data-command="${l(s)}">${a("panel.render.copy")}</button></div>`;return Tn("connection",`panel:${e.harness}:connection`,a("panel.render.connectionDetails"),a("panel.render.localFeedStatus",{status:Da(n)}),f,t.expandedText)}function Ei(e,n){const t=e.planProtocol?.user;if(t===void 0)return"";const r={installed:a("panel.render.protocolInstalled"),outdated:a("panel.render.protocolVUpdateAvailable"),missing:a("panel.render.notInstalled"),modified:a("panel.render.modified"),unsupported:a("panel.render.unsupported")};return Tn("protocol",`panel:${e.harness}:protocol`,a("panel.render.planDisplaySettings"),r[t],il(e,n),n.expandedText,n.protocolBannerHighlight===e.harness)}function Zt(e,n){return n.kind==="evicted"?`${e}:${n.sessionId}:${n.at}`:`${e}:${n.kind}:${n.at}`}function Ni(e,n){return e.notices.filter(t=>!e.noticeDismissed[Zt(n,t)]).map(t=>{const r=Zt(n,t);if(t.kind==="dsh_legacy_hooks_retired"){if(n!=="dsh")return"";const s=t.restored==="unavailable"?a("panel.render.legacyHomeLevelWiringCouldNot"):a("panel.render.legacyHomeLevelWiringAndEarlier");return`<div class="session-notice" data-kind="dsh_legacy_hooks_retired" data-act="notice-dismiss" data-key="${l(r)}">${l(s)}<code>${l(t.command)}</code><span class="session-notice-close">${a("panel.render.close")}</span></div>`}return`<div class="session-notice" data-act="notice-dismiss" data-key="${l(r)}">${a("panel.render.evicted")} ${l(t.label)}(${l(xi(t.sessionId))}) · ${l(Fa(t.at))} · ${l(t.reason)}<span class="session-notice-close">${a("panel.render.close")}</span></div>`}).join("")}function gr(e,n){const t=e.sessions.find(r=>r.id===e.selectedSession)??e.sessions[0];return t?.feedback==="not_wired"?`<div class="feedbacksignal">${a("panel.render.feedbackSignalsNotConnected")}${l(Ze(n,e.wingmanVersion))}${Ae(e.wingmanVersion)}</div>`:t?.feedback==="unavailable"?`<div class="feedbacksignal">${a("panel.render.feedbackSignalsUnavailable")}</div>`:""}function Oi(e,n){const t=e.narrative?.suggestions??[];if(t.length===0)return"";const r=e.selectedSession??"",s=t.filter(o=>e.suggHidden[`${n}:${r}:${o.id}`]!==!0).map(o=>{const i=o.action?`<button class="sugbtn" data-act="sugg-plan" data-item="${l(o.action.itemId)}" data-enable="${o.action.enable?"1":"0"}" data-tip="${a("panel.render.previewThePlanFilesTimingAnd")}">${a("panel.render.viewPlan")}</button>`:"";return`<div class="sugg r-${o.rule}" data-tip="${l(C(o.source))}">
269
+ <span class="sugtext">${l(tn(o.text,o.textI18n))}</span><span class="sugactions">${i}<button class="sugdismiss" data-act="sugg-dismiss" data-sugg="${l(o.id)}" data-tip="${a("panel.render.dismissThisSuggestionForThisSession")}">${a("panel.render.dismiss")}</button></span>
267
270
  </div>`}).join("");return s?`<section class="suggestions-section" aria-labelledby="suggestions-heading">
268
271
  <h3 id="suggestions-heading">${a("panel.render.optionalSuggestions")}</h3>
269
272
  <p>${a("panel.render.suggestionsHint")}</p>
270
273
  <div class="suggslot">${s}</div>
271
- </section>`:""}function Ci(e){const n=xo(e),t=e.todos.some(f=>f.status==="in_progress"),r=a(t?"panel.render.firstInProgressTodoSourceTaskCreate":"panel.render.latestUserPromptSummaryNoIn"),s=Io(e.currentAction),i=jo(e),o=e.__mock_note?`<span class="mockchip" data-tip="${l(e.__mock_note)}">MOCK</span>`:"",c=e.waiting?`<div class="nwait" data-tip="${l(a("panel.render.openEventAt",{p0:e.waiting.kind==="permission"?"PermissionRequest":"Notification",p1:String(e.waiting.since)}))}">${a("panel.render.waitingForYou")}${l(e.waiting.message)}</div>`:"",p=i?`<span data-tip="${l([i.totalTokens!==void 0?a("panel.render.totalTokensThisTurnReportedBy",{p0:String(i.totalTokens)}):i.contextTotal!==void 0?a("panel.render.contextThisTurnReportedByHarness",{p0:String(i.contextTotal.value)}):a("panel.render.cumulativeInputThisTurnDifferenceIn",{p0:String(i.inputTotalTokens??"—")}),i.costUsd===void 0?"":a("panel.render.estimatedFromTheBuiltInPrice")].filter(f=>f!=="").join(`
272
- `))}">${a("panel.render.thisTurn")} ${l(Ro(i))}</span>`:"",u=s!==null?`<div class="ndoing">${a("panel.render.current")}<b>${l(s)}</b>${p===""?"":` · ${p}`}</div>`:p===""?"":`<div class="ndoing">${a("panel.render.usage")}${p}</div>`,m=e.agentQuote?`<div class="nquote" data-tip="${a("panel.render.agentSOwnWordsAssistantText")}">「${l(e.agentQuote)}」</div>`:"";return`<div class="now">
274
+ </section>`:""}function Mi(e){const n=Oo(e),t=e.todos.some(f=>f.status==="in_progress"),r=a(t?"panel.render.firstInProgressTodoSourceTaskCreate":"panel.render.latestUserPromptSummaryNoIn"),s=Mo(e.currentAction),o=Fo(e),i=e.__mock_note?`<span class="mockchip" data-tip="${l(e.__mock_note)}">MOCK</span>`:"",c=e.waiting?`<div class="nwait" data-tip="${l(a("panel.render.openEventAt",{p0:e.waiting.kind==="permission"?"PermissionRequest":"Notification",p1:String(e.waiting.since)}))}">${a("panel.render.waitingForYou")}${l(e.waiting.message)}</div>`:"",p=o?`<span data-tip="${l([o.totalTokens!==void 0?a("panel.render.totalTokensThisTurnReportedBy",{p0:String(o.totalTokens)}):o.contextTotal!==void 0?a("panel.render.contextThisTurnReportedByHarness",{p0:String(o.contextTotal.value)}):a("panel.render.cumulativeInputThisTurnDifferenceIn",{p0:String(o.inputTotalTokens??"—")}),o.costUsd===void 0?"":a("panel.render.estimatedFromTheBuiltInPrice")].filter(f=>f!=="").join(`
275
+ `))}">${a("panel.render.thisTurn")} ${l(Lo(o))}</span>`:"",u=s!==null?`<div class="ndoing">${a("panel.render.current")}<b>${l(s)}</b>${p===""?"":` · ${p}`}</div>`:p===""?"":`<div class="ndoing">${a("panel.render.usage")}${p}</div>`,m=e.agentQuote?`<div class="nquote" data-tip="${a("panel.render.agentSOwnWordsAssistantText")}">「${l(e.agentQuote)}」</div>`:"";return`<div class="now">
273
276
  ${c}
274
- <div class="ntask" data-tip="${l(r)}">${n===null?`<span class="muted">${a("panel.render.noTaskInformationInThisSession")}</span>`:l(n)}${o}</div>
277
+ <div class="ntask" data-tip="${l(r)}">${n===null?`<span class="muted">${a("panel.render.noTaskInformationInThisSession")}</span>`:l(n)}${i}</div>
275
278
  ${u}
276
279
  ${m}
277
- </div>`}function cr(e,n){const t=nn(n.projects?.projects??[],e.harness,e.sessionId,e.project?.root),r=t===void 0||"payloadUnavailable"in t?void 0:t.sessions.find(o=>o.harness===e.harness&&o.id===e.sessionId),s=n.sessions.find(o=>o.id===e.sessionId)?.label;return r!==void 0?Ne(r):s!==void 0?{text:s,source:a("panel.render.sessionsLabelProjectDataNotReady")}:{text:e.sessionId??a("panel.render.noTaskTitleProvided"),source:"narrative.sessionId"}}function xi(e,n){const t=cr(e,n),r=`${e.harness}:${e.sessionId}:workflow-title`,s=xt(e.harness,e.origin),o=n.sessions.find(c=>c.id===e.sessionId)?.discovered?`
278
- ${a("panel.render.discoveredOnStartup")}`:"";return`<div class="wftitle${s?" has-session-origin":""}" data-tip="${a("panel.render.sourcePrefix")}${l(I(t.source)+o)}"><span${V(r,n)}>${l(t.text)}</span>${s}${G(r,n)}</div>`}function Ii(e,n){if(e.taskWorkflow===void 0)return`${Ci(e)}${hr(e.skillsUsed)}`;const t=e.__mock_note?`<span class="mockchip" data-tip="${l(e.__mock_note)}">MOCK</span>`:"";return`<div class="taskflow">${ji(e,n)}${Ri(e,n)}${t}${Ni(e,n)}</div>`}function ji(e,n){const t=e.taskWorkflow?.feedback;if(t===void 0)return"";if(t.state==="unavailable"){const i=`${e.harness}:${e.sessionId}:feedback`;return`<div class="ask-line" data-tip="${a("panel.render.sourceTaskWorkflowFeedbackReason")}"><details class="feedback-reason"${n.expandedText?.[i]===!0?" open":""}><summary data-act="workflow-fold" data-key="${l(i)}">${a("panel.render.requestsUnavailable")}</summary><div class="cfgnote">${a("panel.render.requestsNotObservable")}${l(tn(t.reason,t.reasonI18n))}</div></details></div>`}if(t.state!=="needs_user"){const i=t.source,o=t.state==="activity_resumed_unknown"?a("panel.render.activityResumed"):"";return`<div class="ask-line" data-tip="${a("panel.render.sourceTaskWorkflowFeedbackState")}${l(I(i))}${o}">${a("panel.render.noOpenRequestObserved")}</div>`}const r=`${e.harness}:${e.sessionId}`,s=t.generic?`<div class="ask-text">${a("panel.render.waitingForYourReply")}</div><div class="ask-generic" data-tip="${a("panel.render.genericNotificationTip")}">${l(t.message??"")}</div>`:`<div class="ask-text"><span${V(`${r}:feedback`,n)}>${l(t.message??a("panel.render.explicitFeedbackRequestReceived"))}</span>${G(`${r}:feedback`,n)}</div>`;return`<section class="box ask-box active" data-tip="${a("panel.render.sourcePrefix")}${l(I(t.source))}">
280
+ </div>`}function hr(e,n){const t=nn(n.projects?.projects??[],e.harness,e.sessionId,e.project?.root),r=t===void 0||"payloadUnavailable"in t?void 0:t.sessions.find(i=>i.harness===e.harness&&i.id===e.sessionId),s=n.sessions.find(i=>i.id===e.sessionId)?.label;return r!==void 0?Ne(r):s!==void 0?{text:s,source:a("panel.render.sessionsLabelProjectDataNotReady")}:{text:e.sessionId??a("panel.render.noTaskTitleProvided"),source:"narrative.sessionId"}}function Fi(e,n){const t=hr(e,n),r=`${e.harness}:${e.sessionId}:workflow-title`,s=Et(e.harness,e.origin),i=n.sessions.find(c=>c.id===e.sessionId)?.discovered?`
281
+ ${a("panel.render.discoveredOnStartup")}`:"";return`<div class="wftitle${s?" has-session-origin":""}" data-tip="${a("panel.render.sourcePrefix")}${l(C(t.source)+i)}"><span${V(r,n)}>${l(t.text)}</span>${s}${G(r,n)}</div>`}function Li(e,n){if(e.taskWorkflow===void 0)return`${Mi(e)}${wr(e.skillsUsed)}`;const t=e.__mock_note?`<span class="mockchip" data-tip="${l(e.__mock_note)}">MOCK</span>`:"";return`<div class="taskflow">${Di(e,n)}${Wi(e,n)}${t}${Ui(e,n)}</div>`}function Di(e,n){const t=e.taskWorkflow?.feedback;if(t===void 0)return"";if(t.state==="unavailable"){const o=`${e.harness}:${e.sessionId}:feedback`;return`<div class="ask-line" data-tip="${a("panel.render.sourceTaskWorkflowFeedbackReason")}"><details class="feedback-reason"${n.expandedText?.[o]===!0?" open":""}><summary data-act="workflow-fold" data-key="${l(o)}">${a("panel.render.requestsUnavailable")}</summary><div class="cfgnote">${a("panel.render.requestsNotObservable")}${l(tn(t.reason,t.reasonI18n))}</div></details></div>`}if(t.state!=="needs_user"){const o=t.source,i=t.state==="activity_resumed_unknown"?a("panel.render.activityResumed"):"";return`<div class="ask-line" data-tip="${a("panel.render.sourceTaskWorkflowFeedbackState")}${l(C(o))}${i}">${a("panel.render.noOpenRequestObserved")}</div>`}const r=`${e.harness}:${e.sessionId}`,s=t.generic?`<div class="ask-text">${a("panel.render.waitingForYourReply")}</div><div class="ask-generic" data-tip="${a("panel.render.genericNotificationTip")}">${l(t.message??"")}</div>`:`<div class="ask-text"><span${V(`${r}:feedback`,n)}>${l(t.message??a("panel.render.explicitFeedbackRequestReceived"))}</span>${G(`${r}:feedback`,n)}</div>`;return`<section class="box ask-box active" data-tip="${a("panel.render.sourcePrefix")}${l(C(t.source))}">
279
282
  <span class="wflabel">${a("panel.render.needYou")}</span>${s}
280
- <div class="ask-meta"><time data-tip="${a("panel.render.sourceTaskWorkflowFeedbackSince")} · ${l(t.since)}">${l(he(t.since,Date.parse(n.now)))}</time><span>${a("panel.render.source")} ${l(R[e.harness])}</span><button class="wfverify-action" data-act="task-resume" data-key="${l(r)}" type="button">${a("panel.render.backToSession")}</button></div>
281
- ${vr(n.taskReturnResults?.[r])}</section>`}function Ri(e,n){const t=e.taskWorkflow;if(t===void 0)return"";const r=t.latestInstruction,s=t.goal,i=s===void 0?"":`<div class="wfgoal" data-tip="${a("panel.render.sourcePrefix")}${l(I(s.source))}"><span class="wflabel">${a("panel.render.goal")}</span><span${V(`${e.harness}:${e.sessionId}:goal`,n)}>${l(s.text)}</span>${G(`${e.harness}:${e.sessionId}:goal`,n)}</div>`,o=`${e.harness}:${e.sessionId}:lead`,c=r===void 0||r.text===cr(e,n).text||r.text===s?.text?"":`<div class="wflead" data-tip="${a("panel.render.sourcePrefix")}${l(I(r.source))}"><span class="wflabel">${a("panel.render.latestInstruction")}</span><span${V(o,n)}>${l(r.text)}</span>${G(o,n)}</div>`,p=e.project?.root,u=nn(n.projects?.projects??[],e.harness,e.sessionId,p),m=u?.title,f=p===void 0?"":`<span data-tip="${a("panel.render.sourcePrefix")}${l(I(m?.source??"narrative.project.root"))}">${a("panel.render.project")} ${l(u===void 0||"payloadUnavailable"in u?m?.text??p:en(u))}</span>`,h=Qa(e),v=u===void 0||"payloadUnavailable"in u?void 0:jt(u,e),y=u===void 0||"payloadUnavailable"in u?void 0:mr(u,v),w=h.length>0?"taskWorkflow.plan.steps(status=in_progress);taskWorkflow.plan.forInstruction":v?.source??"GET /api/projects currentPoints / currentPointEmptyText / plan.availability",g=`${e.harness}:${e.sessionId}:current`,k=h.length===0&&y===void 0?"":`<span class="wfcurrent" data-tip="${a("panel.render.sourcePrefix")}${l(w)}"><span class="wflabel">${h.length>1?a("panel.render.parallelCurrentPoint"):a("panel.render.currentPoint")}</span><span${V(g,n)}>${h.length>0?h.map(l).join(" · "):l(y??"")}</span>${G(g,n)}</span>`,S=t.goal===void 0&&r===void 0?`<span class="muted" data-tip="${a("panel.render.sourceNeitherTaskWorkflowGoalNorLatestInstruction")}">${a("panel.render.goalUnavailable")}</span>`:"",A=n.sessions.find(E=>E.id===e.sessionId),P=wa({waiting:A?.waiting??e.waiting!==null,ended:A?.ended??!1,...A?.turnEnded?{turnEnded:!0}:{},...A?.waitOutcome?{waitOutcome:A.waitOutcome}:{},feedback:t.feedback}),F=P.note?`<span class="note ${P.note.kind}" data-tip="${a("panel.render.sourcePrefix")}${l(A?.waitOutcome?.source??"")}">${l(P.note.text)}</span>`:"";return`<section class="box"><div class="wfheading">${xi(e,n)}<span class="task-status ${P.kind}">${P.label}${F}</span></div>${i}<div class="wfproject">${f}${f&&k?" · ":""}${k}${S}</div>${c}${hr(e.skillsUsed)}</section>`}function Ei(e,n){const t=e.taskWorkflow;if(t===void 0)return"";const r=`${e.harness}:${e.sessionId}:plan`;let s;if(t.plan.availability==="missing"){const i=nn(n.projects?.projects??[],e.harness,e.sessionId,e.project?.root),o=i===void 0||"payloadUnavailable"in i?i?.plan:jt(i,e)??i.plan,p=o!==void 0&&o.availability!=="missing"?void 0:t.plan.toolGate;if(p===void 0)s="";else{const u=p.model??a("panel.render.notObservedValue"),m=p.affected==="known"?a("panel.render.sessionModel",{p0:String(u)}):a("panel.render.sessionModelImpactUnknown",{p0:String(u)}),f=ge(e.harness,n)==="installed",h=f?"":a("panel.render.orInstallThePlanProtocol",{p0:String(tr("cc",a("panel.render.projectPlaceholder"),n.wingmanVersion))}),v=a("panel.render.sinceClaudeCodeDoesNotProvide",{p0:String(p.harnessVersion),p1:String(p.since),p2:String(m),p3:String(p.enable),p4:String(h)});s=`<div class="wfplan"><span class="wflabel">${a("panel.render.agentSDeclaredPlan")}</span><div class="cfgnote">${a("panel.render.noStructuredPlan")}</div><div class="cfgnote wfgate" data-tip="${a("panel.render.sourceTranscriptVersionMessageModelClaude")}"${V(r,n)}>${l(v)}${f?"":Ae(n.wingmanVersion)}${a("panel.render.ifThisSettingIsAlreadyEnabled")}</div>${G(r,n)}</div>`}}else if(t.plan.availability==="unavailable")s=`<div class="wfplan"><span class="wflabel">${a("panel.render.agentSDeclaredPlan")}</span><div class="cfgnote"${V(r,n)}>${a("panel.render.planSourceUnavailable")} ${l(e.harness)} · ${l(t.plan.reason)}</div>${G(r,n)}</div>`;else{const i=t.plan.forInstruction==="previous",o=!i&&t.plan.steps.length>0&&t.plan.steps.every(u=>u.status==="completed"),c=t.plan.steps.map(u=>`<div class="wfstep ${u.status}"><span class="mk">${za[u.status]}</span><span>${l(u.text)}</span></div>`).join(""),p=i?`<div class="cfgnote" data-tip="${a("panel.render.sourceTaskWorkflowPlanForInstruction")}">${a("panel.render.noPlanDeclaredForThisInstruction")}</div><span class="wfsource muted" data-tip="${a("panel.render.sourcePrefix")}${l(I(t.plan.source))};taskWorkflow.plan.forInstruction / revision">${a("panel.render.previousInstructionSPlanRevision")} ${t.plan.revision}</span>`:`<span class="wfsource">${l(Co(t.plan))}</span>`;s=`<div class="wfplan"><span class="wflabel">${a("panel.render.agentSDeclaredPlan")}</span>${p}${o?`<span class="statechip">${a("panel.render.markedCompleteByAgent")}</span>`:""}<div class="wfsteps"${V(r,n)}>${c}</div>${G(r,n)}</div>`}return`${Fi(e,n)}${s}`}function pr(e){const n=e.taskWorkflow?.plan;return n?.availability==="available"&&n.forInstruction==="current"&&e.taskWorkflow?.verification?.agentMarkedComplete===!0}function Ni(e,n){const t=e.taskWorkflow;if(t===void 0)return"";const r=t.plan,s=ws(r),i=r.availability==="available"?`${s?.completed??r.steps.filter(k=>k.status==="completed").length}/${s?.total??r.steps.length}${r.forInstruction==="previous"?a("panel.render.previousInstructionSPlan"):""}`:a("panel.render.notProvided"),o=t.verification,c=pr(e),p=o===void 0?a("panel.render.verificationFactsNotProvided"):a("panel.render.agentCompleteChecksFailures",{p0:a(c?"panel.render.markedCompleteByAgent":"panel.render.agentCompletionStatus"),p1:String(o.checks.runs),p2:String(o.checks.failures),p3:String(o.acceptance.state==="accepted"?a("panel.render.acceptedByYou"):o.acceptance.state==="none"?a("panel.render.notAccepted"):a("panel.render.acceptanceUnavailable",{p0:String(o.acceptance.reason)}))}),u=Oi(e.traces),m=u.length===0?a("panel.render.noRecentSteps"):u.map(k=>fr(k,e.project?.root)).join(" · "),f=(k,S,A,P,F)=>{const E=`${e.harness}:${e.sessionId}:${k}`;return`<details class="fold"${n.expandedText?.[E]===!0?" open":""}><summary data-act="workflow-fold" data-key="${l(E)}"><span class="wflabel">${S}</span><span class="fold-summary" data-tip="${a("panel.render.sourcePrefix")}${l(I(P))}">${l(A)}</span></summary><div class="fold-body">${F}</div></details>`},h=t.execution,v=n.expandedText?.[`${e.harness}:${e.sessionId}:evidence`]??n.evidenceOpen,y=h.currentAction,w=y===void 0?"":`<div class="cfgnote" data-tip="${a("panel.render.sourcePrefix")}${l(I(y.source))}">${a("panel.render.current")}${l(y.text)}</div>`,g=`<details class="fold"${v?" open":""}><summary data-act="evidence"><span class="wflabel">${a("panel.render.executionEvidence")}</span><span class="fold-summary" data-tip="${a("panel.render.sourceTaskWorkflowExecutionEvidenceCountFailureCount")}">${h.evidenceCount} ${a("panel.render.evidenceCountSeparator")} ${h.failureCount} ${a("panel.render.failed")}</span></summary><div class="fold-body rawbody${v?" open":""}">${w}${v?Di(e,n):""}</div></details>`;return f("plan",a("panel.render.plan"),i,`${I(r.source)};taskWorkflow.plan.availability / steps / forInstruction`,Ei(e,n))+f("verification",a("panel.render.verification"),p,a("panel.render.taskworkflowVerificationAgentStructuredPlanStep"),Li(e,n))+f("recent",a("panel.render.recentSteps"),m,a("panel.render.transcriptHookToolEventThreeMost"),Mi(u,e.project?.root))+g}function Oi(e){return e.flatMap(n=>n.nodes.flatMap(t=>t.steps)).filter(n=>n.ts!==void 0).sort((n,t)=>t.ts.localeCompare(n.ts)).slice(0,3)}function ur(e,n){const t=e.detail,r=e.toolName.split(".").at(-1)??e.toolName;if(/^(?:Bash|shell|shell_command|exec|exec_command)$/u.test(r))return t;const s=/^(?:Read|Edit|Write|NotebookEdit|read_file|write)$/u.test(r);if(t.includes("://")||!t.startsWith("/")&&(!t.includes("/")||!s&&/\s/u.test(t)))return t;if(n===void 0)return t.split("/").filter(Boolean).at(-1)??t;if(!t.startsWith("/"))return t;const i=u=>u.split("/").reduce((m,f)=>(f===".."?m.pop():f!==""&&f!=="."&&m.push(f),m),[]),o=i(n),c=i(t);let p=0;for(;p<o.length&&o[p]===c[p];)p+=1;return[...o.slice(p).map(()=>".."),...c.slice(p)].join("/")||"."}function It(e){return(e.split(/[\r\n]/u)[0]??"").slice(0,80)}function fr(e,n){const t=ur(e,n),r=t.length<=60?t:`${t.slice(0,59)}…`;return[e.toolName,r].filter(Boolean).join(" · ")}function Mi(e,n){if(e.length===0)return"";const t=e.map(r=>{const s=r.endTs===void 0?Number.NaN:Date.parse(r.endTs)-Date.parse(r.ts),i=Number.isFinite(s)&&s>=0?` · ${$n(s)}`:"",o=r.isError?a("panel.render.failureSuffix"):"",c=fr(r,n),p=r.isError&&r.errorBrief!==void 0?` · ${l(It(r.errorBrief))}`:"";return`<span class="wfrecent-step" data-tip="${a("panel.render.sourceTranscriptHookToolEventOriginal")}${l(r.detail)}">${l(c)}${i}${o}${p}</span>`}).join("");return`<div class="wfrecent"><span class="wflabel">${a("panel.render.recentSteps")}</span>${t}</div>`}function jt(e,n){return e.sessions.find(t=>t.harness===n.harness&&t.id===n.sessionId)?.projectPlan}function mr(e,n){const t=n??e;return(n?.availability??e.plan.availability)==="missing"?a("panel.render.noWingmanPlanMd"):t.currentPoints.length>0?t.currentPoints.map(r=>r.path.join(" → ")).join(" · "):t.currentPointEmptyText===void 0?void 0:tn(t.currentPointEmptyText,t.currentPointEmptyTextI18n)}function Fi(e,n){const t=e.project?.root;if(t===void 0||n.projects===null)return"";const r=nn(n.projects.projects,e.harness,e.sessionId,t);if(r===void 0)return"";if("payloadUnavailable"in r)return`<div class="wfproject-details"><span class="muted">${a("panel.render.projectDataUnavailable")}</span><button class="wfproject-link" data-act="project-card-link" data-root="${l(t)}" type="button">${a("panel.render.openProject")}</button></div>`;const s=jt(r,e),i=Qa(e).length>0?mr(r,s):void 0,o=i===void 0?"":`<span>${a("panel.render.currentPointPrefix")}${l(i)}</span>`,c=r.sessions.find(m=>m.harness===e.harness&&m.id===e.sessionId),p=c?.attachedTo!==void 0?`<span>${a("panel.render.thisSessionAttachedTo")}</span><button class="project-crumb wfproject-node" data-tip="${l(c.attachedTo.replaceAll(" > "," → "))}" data-act="project-node-link" data-node-target="${Tn(r.root,c.attachedTo)}" type="button">${l(c.attachedTo.replaceAll(" > "," → "))}</button>`:c?.worktree!==void 0&&e.project?.attachedTo!==void 0?`<span data-tip="${l(c.unattachedReason??"")}">${l(a("panel.render.worktreePlan",{name:c.worktree,path:e.project.attachedTo.replaceAll(" > "," → ")}))}</span>`:c?.unattachedReason===void 0?"":`<span>${a("panel.render.thisSessionUnattached")}${l(c.unattachedReason)})</span>`;return`<div class="wfproject-details">${(s?.availability??r.plan.availability)==="missing"&&(ge(e.harness,n)==="missing"||e.harness==="dsh")?Oe(e.harness,s===void 0?r.root:t,n,a("panel.render.copyInstallCommand")):""}${o}${p}<button class="wfproject-link" data-act="project-card-link" data-root="${l(r.root)}" type="button">${a("panel.render.openProject")}</button></div>`}function Li(e,n){const t=e.taskWorkflow?.verification;if(t===void 0)return"";const r=e.taskWorkflow?.plan,s=r?.availability==="available"&&r.forInstruction==="previous",i=s&&r.steps.length>0&&r.steps.every(P=>P.status==="completed"),o=pr(e),c=a(i?"panel.render.markedCompleteByAgentNoThe":o?"panel.render.markedCompleteByAgent":"panel.render.agentCompletionStatus"),p=a(s?"panel.render.agentStructuredPlanStepStatesTaskWorkflow":"panel.render.agentStructuredPlanStepStates"),u=t.checks,m=u.runs===0?a("panel.render.noObservableChecks"):a("panel.render.checksRunsFailures",{p0:String(u.runs),p1:String(u.failures)}),f=s?void 0:t.currentStep,h=f===void 0?"":a("panel.render.currentStepFailuresRuns",{p0:String(f.failures),p1:String(f.runs)}),v=u.latestFailure,y=v===void 0?"":a("panel.render.latestFailure",{p0:String(l(It(v.brief??v.toolName))),p1:v.at===void 0?"":` <time data-tip="${l(v.at)}">${l(he(v.at,Date.parse(n.now)))}</time>`}),w=t.acceptance,g=w.state==="accepted"?a("panel.render.markedByYouAt",{p0:`<time data-tip="${l(w.at)}">${l(he(w.at,Date.parse(n.now)))}</time>`}):w.state==="none"?a("panel.render.notMarked"):a("panel.render.acceptanceUnavailable",{p0:l(w.reason)}),k=e.sessionId===null?void 0:`${e.harness}:${e.sessionId}`,S=k===void 0||w.state==="unavailable"?"":`<button class="wfverify-action" data-act="task-accept" data-key="${l(k)}" data-value="${w.state!=="accepted"}" type="button">${w.state==="accepted"?a("panel.render.undoAcceptance"):a("panel.render.markAccepted")}</button>`,A=k!==void 0&&n.taskError?.key===k?`<div class="task-error wfverify-error">${l(n.taskError.message)}</div>`:"";return`<div class="wfverify"><span class="wflabel">${a("panel.render.verification")}</span><span data-tip="${a("panel.render.sourcePrefix")}${p}">${c}</span><span class="wfverify-sep">·</span><span data-tip="${a("panel.render.sourceHarnessToolResultIsError")}">${m}${h}${y}</span><span class="wfverify-sep">·</span><span data-tip="${a("panel.render.sourceLocalTaskOverlayJsonAccepted")}">${g}</span>${S}</div>${A}`}function Di(e,n){const t=e.traces.map(r=>{const s=r.todoId===null?void 0:e.todos.find(c=>c.id===r.todoId),i=s===void 0?a("panel.render.other"):s.content,o={...r,nodes:r.nodes.map(c=>({...c,steps:c.steps.map(p=>({...p,detail:ur(p,e.project?.root),...p.errorBrief===void 0?{}:{errorBrief:It(p.errorBrief)}}))}))};return`<div class="evidencegroup"><div class="cfgnote">${a("panel.render.executionAttributedTo")}${l(i)}</div>${Rt(o,r.todoId??"__other__",n.nodeOpen)}</div>`}).join("");return t===""?`<div class="livenone">${a("panel.render.noExecutionEvidenceYet")}</div>`:t}function Wi(e){const n=No(e.narrative),t=e.narrative?.turnUsages.length??0,r=(s,i,o)=>`<button class="vtab${e.view===s?" act":""}" data-act="view" data-view="${s}">${i}${o===null?"":` <span class="vcnt">${l(o)}</span>`}</button>`;return`<div class="vtabs">
283
+ <div class="ask-meta"><time data-tip="${a("panel.render.sourceTaskWorkflowFeedbackSince")} · ${l(t.since)}">${l(ve(t.since,Date.parse(n.now)))}</time><span>${a("panel.render.source")} ${l(E[e.harness])}</span><button class="wfverify-action" data-act="task-resume" data-key="${l(r)}" type="button">${a("panel.render.backToSession")}</button></div>
284
+ ${Sr(n.taskReturnResults?.[r])}</section>`}function Wi(e,n){const t=e.taskWorkflow;if(t===void 0)return"";const r=t.latestInstruction,s=t.goal,o=s===void 0?"":`<div class="wfgoal" data-tip="${a("panel.render.sourcePrefix")}${l(C(s.source))}"><span class="wflabel">${a("panel.render.goal")}</span><span${V(`${e.harness}:${e.sessionId}:goal`,n)}>${l(s.text)}</span>${G(`${e.harness}:${e.sessionId}:goal`,n)}</div>`,i=`${e.harness}:${e.sessionId}:lead`,c=r===void 0||r.text===hr(e,n).text||r.text===s?.text?"":`<div class="wflead" data-tip="${a("panel.render.sourcePrefix")}${l(C(r.source))}"><span class="wflabel">${a("panel.render.latestInstruction")}</span><span${V(i,n)}>${l(r.text)}</span>${G(i,n)}</div>`,p=e.project?.root,u=nn(n.projects?.projects??[],e.harness,e.sessionId,p),m=u?.title,f=p===void 0?"":`<span data-tip="${a("panel.render.sourcePrefix")}${l(C(m?.source??"narrative.project.root"))}">${a("panel.render.project")} ${l(u===void 0||"payloadUnavailable"in u?m?.text??p:en(u))}</span>`,h=nr(e),v=u===void 0||"payloadUnavailable"in u?void 0:Ot(u,e),y=u===void 0||"payloadUnavailable"in u?void 0:kr(u,v),$=h.length>0?"taskWorkflow.plan.steps(status=in_progress);taskWorkflow.plan.forInstruction":v?.source??"GET /api/projects currentPoints / currentPointEmptyText / plan.availability",g=`${e.harness}:${e.sessionId}:current`,k=h.length===0&&y===void 0?"":`<span class="wfcurrent" data-tip="${a("panel.render.sourcePrefix")}${l($)}"><span class="wflabel">${h.length>1?a("panel.render.parallelCurrentPoint"):a("panel.render.currentPoint")}</span><span${V(g,n)}>${h.length>0?h.map(l).join(" · "):l(y??"")}</span>${G(g,n)}</span>`,S=t.goal===void 0&&r===void 0?`<span class="muted" data-tip="${a("panel.render.sourceNeitherTaskWorkflowGoalNorLatestInstruction")}">${a("panel.render.goalUnavailable")}</span>`:"",A=n.sessions.find(j=>j.id===e.sessionId),P=xa({waiting:A?.waiting??e.waiting!==null,ended:A?.ended??!1,...A?.turnEnded?{turnEnded:!0}:{},...A?.waitOutcome?{waitOutcome:A.waitOutcome}:{},feedback:t.feedback}),F=P.note?`<span class="note ${P.note.kind}" data-tip="${a("panel.render.sourcePrefix")}${l(A?.waitOutcome?.source??"")}">${l(P.note.text)}</span>`:"";return`<section class="box"><div class="wfheading">${Fi(e,n)}<span class="task-status ${P.kind}">${P.label}${F}</span></div>${o}<div class="wfproject">${f}${f&&k?" · ":""}${k}${S}</div>${c}${wr(e.skillsUsed)}</section>`}function Hi(e,n){const t=e.taskWorkflow;if(t===void 0)return"";const r=`${e.harness}:${e.sessionId}:plan`;let s;if(t.plan.availability==="missing"){const o=nn(n.projects?.projects??[],e.harness,e.sessionId,e.project?.root),i=o===void 0||"payloadUnavailable"in o?o?.plan:Ot(o,e)??o.plan,p=i!==void 0&&i.availability!=="missing"?void 0:t.plan.toolGate;if(p===void 0)s="";else{const u=p.model??a("panel.render.notObservedValue"),m=p.affected==="known"?a("panel.render.sessionModel",{p0:String(u)}):a("panel.render.sessionModelImpactUnknown",{p0:String(u)}),f=he(e.harness,n)==="installed",h=f?"":a("panel.render.orInstallThePlanProtocol",{p0:String(or("cc",a("panel.render.projectPlaceholder"),n.wingmanVersion))}),v=a("panel.render.sinceClaudeCodeDoesNotProvide",{p0:String(p.harnessVersion),p1:String(p.since),p2:String(m),p3:String(p.enable),p4:String(h)});s=`<div class="wfplan"><span class="wflabel">${a("panel.render.agentSDeclaredPlan")}</span><div class="cfgnote">${a("panel.render.noStructuredPlan")}</div><div class="cfgnote wfgate" data-tip="${a("panel.render.sourceTranscriptVersionMessageModelClaude")}"${V(r,n)}>${l(v)}${f?"":Ae(n.wingmanVersion)}${a("panel.render.ifThisSettingIsAlreadyEnabled")}</div>${G(r,n)}</div>`}}else if(t.plan.availability==="unavailable")s=`<div class="wfplan"><span class="wflabel">${a("panel.render.agentSDeclaredPlan")}</span><div class="cfgnote"${V(r,n)}>${a("panel.render.planSourceUnavailable")} ${l(e.harness)} · ${l(t.plan.reason)}</div>${G(r,n)}</div>`;else{const o=t.plan.forInstruction==="previous",i=!o&&t.plan.steps.length>0&&t.plan.steps.every(u=>u.status==="completed"),c=t.plan.steps.map(u=>`<div class="wfstep ${u.status}"><span class="mk">${er[u.status]}</span><span>${l(u.text)}</span></div>`).join(""),p=o?`<div class="cfgnote" data-tip="${a("panel.render.sourceTaskWorkflowPlanForInstruction")}">${a("panel.render.noPlanDeclaredForThisInstruction")}</div><span class="wfsource muted" data-tip="${a("panel.render.sourcePrefix")}${l(C(t.plan.source))};taskWorkflow.plan.forInstruction / revision">${a("panel.render.previousInstructionSPlanRevision")} ${t.plan.revision}</span>`:`<span class="wfsource">${l(No(t.plan))}</span>`;s=`<div class="wfplan"><span class="wflabel">${a("panel.render.agentSDeclaredPlan")}</span>${p}${i?`<span class="statechip">${a("panel.render.markedCompleteByAgent")}</span>`:""}<div class="wfsteps"${V(r,n)}>${c}</div>${G(r,n)}</div>`}return`${qi(e,n)}${s}`}function vr(e){const n=e.taskWorkflow?.plan;return n?.availability==="available"&&n.forInstruction==="current"&&e.taskWorkflow?.verification?.agentMarkedComplete===!0}function Ui(e,n){const t=e.taskWorkflow;if(t===void 0)return"";const r=t.plan,s=Is(r),o=r.availability==="available"?`${s?.completed??r.steps.filter(k=>k.status==="completed").length}/${s?.total??r.steps.length}${r.forInstruction==="previous"?a("panel.render.previousInstructionSPlan"):""}`:a("panel.render.notProvided"),i=t.verification,c=vr(e),p=i===void 0?a("panel.render.verificationFactsNotProvided"):a("panel.render.agentCompleteChecksFailures",{p0:a(c?"panel.render.markedCompleteByAgent":"panel.render.agentCompletionStatus"),p1:String(i.checks.runs),p2:String(i.checks.failures),p3:String(i.acceptance.state==="accepted"?a("panel.render.acceptedByYou"):i.acceptance.state==="none"?a("panel.render.notAccepted"):a("panel.render.acceptanceUnavailable",{p0:String(i.acceptance.reason)}))}),u=Bi(e.traces),m=u.length===0?a("panel.render.noRecentSteps"):u.map(k=>yr(k,e.project?.root)).join(" · "),f=(k,S,A,P,F)=>{const j=`${e.harness}:${e.sessionId}:${k}`;return`<details class="fold"${n.expandedText?.[j]===!0?" open":""}><summary data-act="workflow-fold" data-key="${l(j)}"><span class="wflabel">${S}</span><span class="fold-summary" data-tip="${a("panel.render.sourcePrefix")}${l(C(P))}">${l(A)}</span></summary><div class="fold-body">${F}</div></details>`},h=t.execution,v=n.expandedText?.[`${e.harness}:${e.sessionId}:evidence`]??n.evidenceOpen,y=h.currentAction,$=y===void 0?"":`<div class="cfgnote" data-tip="${a("panel.render.sourcePrefix")}${l(C(y.source))}">${a("panel.render.current")}${l(y.text)}</div>`,g=`<details class="fold"${v?" open":""}><summary data-act="evidence"><span class="wflabel">${a("panel.render.executionEvidence")}</span><span class="fold-summary" data-tip="${a("panel.render.sourceTaskWorkflowExecutionEvidenceCountFailureCount")}">${h.evidenceCount} ${a("panel.render.evidenceCountSeparator")} ${h.failureCount} ${a("panel.render.failed")}</span></summary><div class="fold-body rawbody${v?" open":""}">${$}${v?Gi(e,n):""}</div></details>`;return f("plan",a("panel.render.plan"),o,`${C(r.source)};taskWorkflow.plan.availability / steps / forInstruction`,Hi(e,n))+f("verification",a("panel.render.verification"),p,a("panel.render.taskworkflowVerificationAgentStructuredPlanStep"),Vi(e,n))+f("recent",a("panel.render.recentSteps"),m,a("panel.render.transcriptHookToolEventThreeMost"),_i(u,e.project?.root))+g}function Bi(e){return e.flatMap(n=>n.nodes.flatMap(t=>t.steps)).filter(n=>n.ts!==void 0).sort((n,t)=>t.ts.localeCompare(n.ts)).slice(0,3)}function br(e,n){const t=e.detail,r=e.toolName.split(".").at(-1)??e.toolName;if(/^(?:Bash|shell|shell_command|exec|exec_command)$/u.test(r))return t;const s=/^(?:Read|Edit|Write|NotebookEdit|read_file|write)$/u.test(r);if(t.includes("://")||!t.startsWith("/")&&(!t.includes("/")||!s&&/\s/u.test(t)))return t;if(n===void 0)return t.split("/").filter(Boolean).at(-1)??t;if(!t.startsWith("/"))return t;const o=u=>u.split("/").reduce((m,f)=>(f===".."?m.pop():f!==""&&f!=="."&&m.push(f),m),[]),i=o(n),c=o(t);let p=0;for(;p<i.length&&i[p]===c[p];)p+=1;return[...i.slice(p).map(()=>".."),...c.slice(p)].join("/")||"."}function Nt(e){return(e.split(/[\r\n]/u)[0]??"").slice(0,80)}function yr(e,n){const t=br(e,n),r=t.length<=60?t:`${t.slice(0,59)}…`;return[e.toolName,r].filter(Boolean).join(" · ")}function _i(e,n){if(e.length===0)return"";const t=e.map(r=>{const s=r.endTs===void 0?Number.NaN:Date.parse(r.endTs)-Date.parse(r.ts),o=Number.isFinite(s)&&s>=0?` · ${wn(s)}`:"",i=r.isError?a("panel.render.failureSuffix"):"",c=yr(r,n),p=r.isError&&r.errorBrief!==void 0?` · ${l(Nt(r.errorBrief))}`:"";return`<span class="wfrecent-step" data-tip="${a("panel.render.sourceTranscriptHookToolEventOriginal")}${l(r.detail)}">${l(c)}${o}${i}${p}</span>`}).join("");return`<div class="wfrecent"><span class="wflabel">${a("panel.render.recentSteps")}</span>${t}</div>`}function Ot(e,n){return e.sessions.find(t=>t.harness===n.harness&&t.id===n.sessionId)?.projectPlan}function kr(e,n){const t=n??e;return(n?.availability??e.plan.availability)==="missing"?a("panel.render.noWingmanPlanMd"):t.currentPoints.length>0?t.currentPoints.map(r=>r.path.join(" → ")).join(" · "):t.currentPointEmptyText===void 0?void 0:tn(t.currentPointEmptyText,t.currentPointEmptyTextI18n)}function qi(e,n){const t=e.project?.root;if(t===void 0||n.projects===null)return"";const r=nn(n.projects.projects,e.harness,e.sessionId,t);if(r===void 0)return"";if("payloadUnavailable"in r)return`<div class="wfproject-details"><span class="muted">${a("panel.render.projectDataUnavailable")}</span><button class="wfproject-link" data-act="project-card-link" data-root="${l(t)}" type="button">${a("panel.render.openProject")}</button></div>`;const s=Ot(r,e),o=nr(e).length>0?kr(r,s):void 0,i=o===void 0?"":`<span>${a("panel.render.currentPointPrefix")}${l(o)}</span>`,c=r.sessions.find(m=>m.harness===e.harness&&m.id===e.sessionId),p=c?.attachedTo!==void 0?`<span>${a("panel.render.thisSessionAttachedTo")}</span><button class="project-crumb wfproject-node" data-tip="${l(c.attachedTo.replaceAll(" > "," → "))}" data-act="project-node-link" data-node-target="${An(r.root,c.attachedTo)}" type="button">${l(c.attachedTo.replaceAll(" > "," → "))}</button>`:c?.worktree!==void 0&&e.project?.attachedTo!==void 0?`<span data-tip="${l(c.unattachedReason??"")}">${l(a("panel.render.worktreePlan",{name:c.worktree,path:e.project.attachedTo.replaceAll(" > "," → ")}))}</span>`:c?.unattachedReason===void 0?"":`<span>${a("panel.render.thisSessionUnattached")}${l(c.unattachedReason)})</span>`;return`<div class="wfproject-details">${(s?.availability??r.plan.availability)==="missing"&&(he(e.harness,n)==="missing"||e.harness==="dsh")?Oe(e.harness,s===void 0?r.root:t,n,a("panel.render.copyInstallCommand")):""}${i}${p}<button class="wfproject-link" data-act="project-card-link" data-root="${l(r.root)}" type="button">${a("panel.render.openProject")}</button></div>`}function Vi(e,n){const t=e.taskWorkflow?.verification;if(t===void 0)return"";const r=e.taskWorkflow?.plan,s=r?.availability==="available"&&r.forInstruction==="previous",o=s&&r.steps.length>0&&r.steps.every(P=>P.status==="completed"),i=vr(e),c=a(o?"panel.render.markedCompleteByAgentNoThe":i?"panel.render.markedCompleteByAgent":"panel.render.agentCompletionStatus"),p=a(s?"panel.render.agentStructuredPlanStepStatesTaskWorkflow":"panel.render.agentStructuredPlanStepStates"),u=t.checks,m=u.runs===0?a("panel.render.noObservableChecks"):a("panel.render.checksRunsFailures",{p0:String(u.runs),p1:String(u.failures)}),f=s?void 0:t.currentStep,h=f===void 0?"":a("panel.render.currentStepFailuresRuns",{p0:String(f.failures),p1:String(f.runs)}),v=u.latestFailure,y=v===void 0?"":a("panel.render.latestFailure",{p0:String(l(Nt(v.brief??v.toolName))),p1:v.at===void 0?"":` <time data-tip="${l(v.at)}">${l(ve(v.at,Date.parse(n.now)))}</time>`}),$=t.acceptance,g=$.state==="accepted"?a("panel.render.markedByYouAt",{p0:`<time data-tip="${l($.at)}">${l(ve($.at,Date.parse(n.now)))}</time>`}):$.state==="none"?a("panel.render.notMarked"):a("panel.render.acceptanceUnavailable",{p0:l($.reason)}),k=e.sessionId===null?void 0:`${e.harness}:${e.sessionId}`,S=k===void 0||$.state==="unavailable"?"":`<button class="wfverify-action" data-act="task-accept" data-key="${l(k)}" data-value="${$.state!=="accepted"}" type="button">${$.state==="accepted"?a("panel.render.undoAcceptance"):a("panel.render.markAccepted")}</button>`,A=k!==void 0&&n.taskError?.key===k?`<div class="task-error wfverify-error">${l(n.taskError.message)}</div>`:"";return`<div class="wfverify"><span class="wflabel">${a("panel.render.verification")}</span><span data-tip="${a("panel.render.sourcePrefix")}${p}">${c}</span><span class="wfverify-sep">·</span><span data-tip="${a("panel.render.sourceHarnessToolResultIsError")}">${m}${h}${y}</span><span class="wfverify-sep">·</span><span data-tip="${a("panel.render.sourceLocalTaskOverlayJsonAccepted")}">${g}</span>${S}</div>${A}`}function Gi(e,n){const t=e.traces.map(r=>{const s=r.todoId===null?void 0:e.todos.find(c=>c.id===r.todoId),o=s===void 0?a("panel.render.other"):s.content,i={...r,nodes:r.nodes.map(c=>({...c,steps:c.steps.map(p=>({...p,detail:br(p,e.project?.root),...p.errorBrief===void 0?{}:{errorBrief:Nt(p.errorBrief)}}))}))};return`<div class="evidencegroup"><div class="cfgnote">${a("panel.render.executionAttributedTo")}${l(o)}</div>${Mt(i,r.todoId??"__other__",n.nodeOpen)}</div>`}).join("");return t===""?`<div class="livenone">${a("panel.render.noExecutionEvidenceYet")}</div>`:t}function Ki(e){const n=Wo(e.narrative),t=e.narrative?.turnUsages.length??0,r=(s,o,i)=>`<button class="vtab${e.view===s?" act":""}" data-act="view" data-view="${s}">${o}${i===null?"":` <span class="vcnt">${l(i)}</span>`}</button>`;return`<div class="vtabs">
282
285
  ${r("tasks",a("panel.render.tasks"),n)}
283
286
  ${r("control",a("panel.render.controls"),null)}
284
287
  ${r("billing",a("panel.render.billing"),t>0?a("panel.render.turns",{p0:String(t)}):null)}
285
- </div>`}function Hi(e){const n=e.ts!==void 0&&e.endTs!==void 0?$n(Date.parse(e.endTs)-Date.parse(e.ts)):e.endTs===void 0?"…":"",t=e.estTokens===void 0?"":a("panel.render.approx",{p0:String(U(e.estTokens))}),r=e.isError&&e.errorBrief!==void 0?`<span class="failchip">${l(e.errorBrief)}</span>`:"",s=e.agentId!==void 0?`<span class="ag">${a("panel.render.subagent")}</span>`:"";return`<div class="trs${e.isError?" bad":""}" data-tip="${l(a("panel.render.tool",{p0:String(e.toolName),p1:String(e.ts===void 0?"":a("panel.render.started",{p0:String(e.ts)})),p2:String(e.estTokens===void 0?"":a("panel.render.approximateTokensToolInputResultBytes"))}))}">
288
+ </div>`}function Yi(e){const n=e.ts!==void 0&&e.endTs!==void 0?wn(Date.parse(e.endTs)-Date.parse(e.ts)):e.endTs===void 0?"…":"",t=e.estTokens===void 0?"":a("panel.render.approx",{p0:String(B(e.estTokens))}),r=e.isError&&e.errorBrief!==void 0?`<span class="failchip">${l(e.errorBrief)}</span>`:"",s=e.agentId!==void 0?`<span class="ag">${a("panel.render.subagent")}</span>`:"";return`<div class="trs${e.isError?" bad":""}" data-tip="${l(a("panel.render.tool",{p0:String(e.toolName),p1:String(e.ts===void 0?"":a("panel.render.started",{p0:String(e.ts)})),p2:String(e.estTokens===void 0?"":a("panel.render.approximateTokensToolInputResultBytes"))}))}">
286
289
  <span class="cmd">${l(e.toolName)}</span>
287
290
  ${e.detail===""?"":`<span class="sdetail">${l(e.detail)}</span>`}
288
291
  ${r}${s}
289
292
  <span class="dur">${l(n)}${l(t)}</span>
290
- </div>`}function Ui(e){const n=e.wait?.resolvedBy!==void 0,t=e.durationMs===void 0?"":a("panel.render.waited",{p0:String($n(e.durationMs))}),r=n?` · ${t===""?"":`${t} → `}${Xa(e.wait?.resolvedBy??"")}`:a("panel.render.waiting"),s=[a("panel.render.eventStartEndObservedThroughHooks",{p0:e.wait?.kind==="permission"?"PermissionRequest":"Notification"}),e.startTs===void 0?"":a("panel.render.startedAt",{p0:String(e.startTs)}),n?a("panel.render.resolvedEvent",{p0:String(e.endTs??""),p1:String(e.wait?.resolvedBy??"")}):a("panel.render.notYetResolved")].filter(i=>i!=="").join(`
293
+ </div>`}function Ji(e){const n=e.wait?.resolvedBy!==void 0,t=e.durationMs===void 0?"":a("panel.render.waited",{p0:String(wn(e.durationMs))}),r=n?` · ${t===""?"":`${t} → `}${tr(e.wait?.resolvedBy??"")}`:a("panel.render.waiting"),s=[a("panel.render.eventStartEndObservedThroughHooks",{p0:e.wait?.kind==="permission"?"PermissionRequest":"Notification"}),e.startTs===void 0?"":a("panel.render.startedAt",{p0:String(e.startTs)}),n?a("panel.render.resolvedEvent",{p0:String(e.endTs??""),p1:String(e.wait?.resolvedBy??"")}):a("panel.render.notYetResolved")].filter(o=>o!=="").join(`
291
294
  `);return`<div class="tr waitrow" data-tip="${l(s)}">
292
295
  <span class="ic"></span>
293
296
  <span class="trlabel">⏸ ${l(a("panel.render.waitTrace",{label:e.label,message:e.wait?.message??"",outcome:r}))}</span>
294
- </div>`}function Bi(e,n,t){if(e.phase==="wait")return Ui(e);const r=e.steps.some(u=>u.endTs===void 0),s=e.durationMs===void 0?r?"…":"":$n(e.durationMs),i=e.estTokens===void 0?"":a("panel.render.approx",{p0:String(U(e.estTokens))}),o=e.steps.find(u=>u.isError&&u.errorBrief!==void 0),c=e.failed&&o!==void 0&&!t?`<span class="failchip">${l(o.errorBrief??"")}</span>`:"",p=t?e.steps.map(u=>Hi(u)).join(""):"";return`<div class="tr${e.failed?" bad":r?" run":""}" data-act="node" data-key="${l(n)}" data-tip="${l(a("panel.render.phaseGroupingToolTypeRulesDocumented",{p0:String(a(t?"panel.render.collapse":"panel.render.expand")),p1:String(e.estTokens===void 0?"":a("panel.render.approximateTokensSumOfStepByte"))}))}">
297
+ </div>`}function zi(e,n,t){if(e.phase==="wait")return Ji(e);const r=e.steps.some(u=>u.endTs===void 0),s=e.durationMs===void 0?r?"…":"":wn(e.durationMs),o=e.estTokens===void 0?"":a("panel.render.approx",{p0:String(B(e.estTokens))}),i=e.steps.find(u=>u.isError&&u.errorBrief!==void 0),c=e.failed&&i!==void 0&&!t?`<span class="failchip">${l(i.errorBrief??"")}</span>`:"",p=t?e.steps.map(u=>Yi(u)).join(""):"";return`<div class="tr${e.failed?" bad":r?" run":""}" data-act="node" data-key="${l(n)}" data-tip="${l(a("panel.render.phaseGroupingToolTypeRulesDocumented",{p0:String(a(t?"panel.render.collapse":"panel.render.expand")),p1:String(e.estTokens===void 0?"":a("panel.render.approximateTokensSumOfStepByte"))}))}">
295
298
  <span class="ic"></span>
296
299
  <span class="trlabel">${l(e.label)} · ${e.steps.length} ${a("panel.render.steps")}</span>
297
300
  ${c}
298
- <span class="dur">${l(s)}${l(i)}</span>
299
- </div>${p===""?"":`<div class="steps">${p}</div>`}`}function Rt(e,n,t){return`<div class="trace">${e.nodes.map((s,i)=>{const o=`${n}:${i}`;return Bi(s,o,t[o]===!0)}).join("")}</div>`}function _i(e,n){return""}function qi(e,n,t,r){const s=nr(e,t.todoOpen)&&n!==void 0&&n.nodes.length>0,i=n!==void 0&&n.nodes.length>0,o=e.status==="in_progress"&&i?s?"▾":"▸":za[e.status],c=Eo(e,n),p=c===null?"":`<span class="ag" data-tip="${l(c===a("panel.render.subagent")?a("panel.render.stepsIncludeASubagentAttributionIs",{p0:String(e.agents.join(", "))}):a("panel.render.stepsAttributedToTheMainAgent"))}">${l(c)}</span>`;return`<div class="td${e.status==="completed"?" done":e.status==="in_progress"?" doing":" todo"}">
300
- <div class="tdr"${i?` data-act="todo" data-id="${l(e.id)}"`:""}>
301
- <span class="mk${e.status==="in_progress"?" doing":""}">${o}</span>
301
+ <span class="dur">${l(s)}${l(o)}</span>
302
+ </div>${p===""?"":`<div class="steps">${p}</div>`}`}function Mt(e,n,t){return`<div class="trace">${e.nodes.map((s,o)=>{const i=`${n}:${o}`;return zi(s,i,t[i]===!0)}).join("")}</div>`}function Qi(e,n){return""}function Xi(e,n,t,r){const s=sr(e,t.todoOpen)&&n!==void 0&&n.nodes.length>0,o=n!==void 0&&n.nodes.length>0,i=e.status==="in_progress"&&o?s?"▾":"▸":er[e.status],c=Do(e,n),p=c===null?"":`<span class="ag" data-tip="${l(c===a("panel.render.subagent")?a("panel.render.stepsIncludeASubagentAttributionIs",{p0:String(e.agents.join(", "))}):a("panel.render.stepsAttributedToTheMainAgent"))}">${l(c)}</span>`;return`<div class="td${e.status==="completed"?" done":e.status==="in_progress"?" doing":" todo"}">
303
+ <div class="tdr"${o?` data-act="todo" data-id="${l(e.id)}"`:""}>
304
+ <span class="mk${e.status==="in_progress"?" doing":""}">${i}</span>
302
305
  <span class="tdc">${e.status==="in_progress"?`<b>${l(e.content)}</b>`:l(e.content)}</span>
303
306
  ${p}
304
- ${_i()}
307
+ ${Qi()}
305
308
  </div>
306
- ${s&&n?Rt(n,e.id,t.nodeOpen):""}
307
- </div>`}function nt(e,n){const t=n.traces.find(s=>s.todoId===null);if(!t||t.nodes.length===0)return"";const r=e.todoOpen.__other__!==!1;return`<div class="td doing other">
309
+ ${s&&n?Mt(n,e.id,t.nodeOpen):""}
310
+ </div>`}function ot(e,n){const t=n.traces.find(s=>s.todoId===null);if(!t||t.nodes.length===0)return"";const r=e.todoOpen.__other__!==!1;return`<div class="td doing other">
308
311
  <div class="tdr" data-act="todo" data-id="__other__" data-tip="${a("panel.render.stepsThatCannotBeAssignedTo")}">
309
312
  <span class="mk">${r?"▾":"▸"}</span>
310
313
  <span class="tdc">${a("panel.render.otherUnassignedSteps")}</span>
311
314
  </div>
312
- ${r?Rt(t,"__other__",e.nodeOpen):""}
313
- </div>`}function Vi(e,n){const t=(e.textTodos??[]).map(r=>`<div class="td${r.checked?" done":" todo"}">
315
+ ${r?Mt(t,"__other__",e.nodeOpen):""}
316
+ </div>`}function Zi(e,n){const t=(e.textTodos??[]).map(r=>`<div class="td${r.checked?" done":" todo"}">
314
317
  <div class="tdr"><span class="mk">${r.checked?"✓":"○"}</span><span class="tdc">${l(r.content)}</span></div>
315
318
  </div>`).join("");return`<div class="sec first todolist">
316
319
  <div class="cfgnote" data-tip="${a("panel.render.sourceMarkdownChecklistInAssistantText")}">${a("panel.render.textChecklistWrittenByAgent")}</div>
317
- ${t}${nt(n,e)}
318
- </div>`}function Gi(e,n){const t=n.narrative;let r="";return t?.taskWorkflow!==void 0?r="":t&&t.todos.length>0?r=`<div class="sec first todolist">${t.todos.map(i=>qi(i,t.traces.find(o=>o.todoId===i.id),n,e.harness)).join("")}${nt(n,t)}</div>`:t&&(t.textTodos?.length??0)>0?r=Vi(t,n):t&&Ja(t)?r=`<div class="sec first">
320
+ ${t}${ot(n,e)}
321
+ </div>`}function el(e,n){const t=n.narrative;let r="";return t?.taskWorkflow!==void 0?r="":t&&t.todos.length>0?r=`<div class="sec first todolist">${t.todos.map(o=>Xi(o,t.traces.find(i=>i.todoId===o.id),n,e.harness)).join("")}${ot(n,t)}</div>`:t&&(t.textTodos?.length??0)>0?r=Zi(t,n):t&&Za(t)?r=`<div class="sec first">
319
322
  <div class="cfgnote">${e.harness==="dsh"?a("panel.render.thisHarnessDoesNotProduceA"):a("panel.render.thisSessionDidNotUseA")}</div>
320
- ${nt(n,t)}
321
- </div>`:r=wi(e,n),r}function Ki(e,n,t){return`<div class="sec rawsec">
323
+ ${ot(n,t)}
324
+ </div>`:r=ji(e,n),r}function nl(e,n,t){return`<div class="sec rawsec">
322
325
  <button class="rawhead" data-act="raw" data-tip="${a("panel.render.rawHookEventStreamTheLive")}">${t.rawOpen?"▾":"▸"} ${a("panel.render.rawEvents")}</button>
323
- <div class="rawbody${t.rawOpen?" open":""}">${lr(e,n,t.wingmanVersion,t.sessions.length>=1)}</div>
324
- </div>`}function Yi(e,n,t){const r=n.narrative?.turnUsages??[],s=r.map(o=>Ji(o,e.harness)).join(""),i=r.length>0?`<div class="ubox">${s}</div>`:e.harness==="codex"&&n.narrative!==null?`<div class="livenone">${a("panel.render.eventsReceivedForThisSessionBut")}</div>`:e.harness==="codex"?`<div class="livenone">${a("panel.render.noCodexSessionUsageDataReceived")} <code>/hooks</code> ${a("panel.render.andConfirmWingmanIsTrustedAnd")}</div>`:`<div class="livenone">${a("panel.render.noReadableUsageDataReceivedFor")}</div>`;return`${Mt(a("panel.render.billing"),a("panel.render.usagePageHint"))}<div class="sec first usage-section">
326
+ <div class="rawbody${t.rawOpen?" open":""}">${mr(e,n,t.wingmanVersion,t.sessions.length>=1)}</div>
327
+ </div>`}function tl(e,n,t){const r=n.narrative?.turnUsages??[],s=r.map(i=>al(i,e.harness)).join(""),o=r.length>0?`<div class="ubox">${s}</div>`:e.harness==="codex"&&n.narrative!==null?`<div class="livenone">${a("panel.render.eventsReceivedForThisSessionBut")}</div>`:e.harness==="codex"?`<div class="livenone">${a("panel.render.noCodexSessionUsageDataReceived")} <code>/hooks</code> ${a("panel.render.andConfirmWingmanIsTrustedAnd")}</div>`:`<div class="livenone">${a("panel.render.noReadableUsageDataReceivedFor")}</div>`;return`${Wt(a("panel.render.billing"),a("panel.render.usagePageHint"))}<div class="sec first usage-section">
325
328
  <div class="label">${e.harness==="codex"?a("panel.render.usagePerTurnExactCodexToken"):a("panel.render.usagePerTurnThreeExactUsage")}</div>
326
- ${i}
329
+ ${o}
327
330
  </div>
328
- ${ri(e,n)}
329
- ${wn("context",`panel:${e.harness}:context`,a("panel.render.contextSources"),"",oi(e),n.expandedText)}${t?.tier==="free"?Vs(n.mobile):""}`}function Ji(e,n){const t=e.ts===void 0?"":e.ts.slice(11,19),r=e.costUsd===void 0?"":`<span class="ucost">≈ ${l(Za(e.costUsd))}</span>`,s=e.reasoningOutputTokens===void 0?"":a("panel.render.reasoningIncludedInOut",{p0:String(U(e.reasoningOutputTokens))}),i=er(e),o=[a("panel.render.originalUsageExactReportedByHarness"),n==="codex"?a("panel.render.cumulativeInputThisTurnDifferenceBetween",{p0:String(e.inputTotalTokens??"—"),p1:String(e.inputTokens),p2:String(e.cacheCreationInputTokens),p3:String(e.cacheReadInputTokens),p4:String(e.outputTokens),p5:String(s)}):a("panel.render.inputCachedWritesCachedReadsOutput",{p0:String(e.inputTokens),p1:String(e.cacheCreationInputTokens),p2:String(e.cacheReadInputTokens),p3:String(e.outputTokens),p4:String(s)}),e.contextTotal===void 0?"":a("panel.render.contextThisTurnSumOfThe",{p0:String(e.contextTotal.value)}),e.totalTokens===void 0?"":a("panel.render.totalTokensThisTurnReported",{p0:String(e.totalTokens)}),e.status==="aborted"?a("panel.render.turnStateInterruptedUsageReportedBefore"):"",e.status==="incomplete"?a("panel.render.turnStateOpenShowingUsageReported"):"",n==="codex"?a("panel.render.actualChatGPTCodexSubscriptionChargesAre"):e.costUsd===void 0?a("panel.render.thisModelIsAbsentFromThe"):a("panel.render.estimatedFromTheBuiltInPriceTable")].filter(c=>c!=="").join(`
330
- `);return`<div class="urow" data-tip="${l(o)}">
331
+ ${ci(e,n)}
332
+ ${Tn("context",`panel:${e.harness}:context`,a("panel.render.contextSources"),"",ui(e),n.expandedText)}${t?.tier==="free"?Qs(n.mobile):""}`}function al(e,n){const t=e.ts===void 0?"":e.ts.slice(11,19),r=e.costUsd===void 0?"":`<span class="ucost">≈ ${l(ar(e.costUsd))}</span>`,s=e.reasoningOutputTokens===void 0?"":a("panel.render.reasoningIncludedInOut",{p0:String(B(e.reasoningOutputTokens))}),o=rr(e),i=[a("panel.render.originalUsageExactReportedByHarness"),n==="codex"?a("panel.render.cumulativeInputThisTurnDifferenceBetween",{p0:String(e.inputTotalTokens??"—"),p1:String(e.inputTokens),p2:String(e.cacheCreationInputTokens),p3:String(e.cacheReadInputTokens),p4:String(e.outputTokens),p5:String(s)}):a("panel.render.inputCachedWritesCachedReadsOutput",{p0:String(e.inputTokens),p1:String(e.cacheCreationInputTokens),p2:String(e.cacheReadInputTokens),p3:String(e.outputTokens),p4:String(s)}),e.contextTotal===void 0?"":a("panel.render.contextThisTurnSumOfThe",{p0:String(e.contextTotal.value)}),e.totalTokens===void 0?"":a("panel.render.totalTokensThisTurnReported",{p0:String(e.totalTokens)}),e.status==="aborted"?a("panel.render.turnStateInterruptedUsageReportedBefore"):"",e.status==="incomplete"?a("panel.render.turnStateOpenShowingUsageReported"):"",n==="codex"?a("panel.render.actualChatGPTCodexSubscriptionChargesAre"):e.costUsd===void 0?a("panel.render.thisModelIsAbsentFromThe"):a("panel.render.estimatedFromTheBuiltInPriceTable")].filter(c=>c!=="").join(`
333
+ `);return`<div class="urow" data-tip="${l(i)}">
331
334
  <span class="utime">${l(t)}</span>
332
335
  ${e.model===void 0?"":`<span class="chip">${l(e.model)}</span>`}
333
336
  ${e.status==="aborted"?`<span class="chip">${a("panel.render.interrupted")}</span>`:""}
334
337
  ${e.status==="incomplete"?`<span class="chip">${a("panel.render.open")}</span>`:""}
335
- <span class="unums">${n==="codex"?a("panel.render.cumulativeInUncachedCacheWriteCached",{p0:String(e.inputTotalTokens===void 0?"—":l(U(e.inputTotalTokens))),p1:String(l(U(e.inputTokens))),p2:String(l(U(e.cacheCreationInputTokens))),p3:String(l(U(e.cacheReadInputTokens))),p4:String(l(U(e.outputTokens)))}):a("panel.render.inCachedWritesCachedReadsOut",{p0:String(l(U(e.inputTokens))),p1:String(l(U(e.cacheCreationInputTokens))),p2:String(l(U(e.cacheReadInputTokens))),p3:String(l(U(e.outputTokens)))})}${e.reasoningOutputTokens===void 0?"":` <small>(reasoning ${l(U(e.reasoningOutputTokens))})</small>`}</span>
336
- <span class="utot">${i===null?a("panel.render.turnTotal"):e.totalTokens!==void 0||e.contextTotal!==void 0?a("panel.render.turnTotalValue",{p0:String(l(U(i)))}):a("panel.render.cumulativeInputThisTurn",{p0:String(l(U(i)))})}</span>
338
+ <span class="unums">${n==="codex"?a("panel.render.cumulativeInUncachedCacheWriteCached",{p0:String(e.inputTotalTokens===void 0?"—":l(B(e.inputTotalTokens))),p1:String(l(B(e.inputTokens))),p2:String(l(B(e.cacheCreationInputTokens))),p3:String(l(B(e.cacheReadInputTokens))),p4:String(l(B(e.outputTokens)))}):a("panel.render.inCachedWritesCachedReadsOut",{p0:String(l(B(e.inputTokens))),p1:String(l(B(e.cacheCreationInputTokens))),p2:String(l(B(e.cacheReadInputTokens))),p3:String(l(B(e.outputTokens)))})}${e.reasoningOutputTokens===void 0?"":` <small>(reasoning ${l(B(e.reasoningOutputTokens))})</small>`}</span>
339
+ <span class="utot">${o===null?a("panel.render.turnTotal"):e.totalTokens!==void 0||e.contextTotal!==void 0?a("panel.render.turnTotalValue",{p0:String(l(B(o)))}):a("panel.render.cumulativeInputThisTurn",{p0:String(l(B(o)))})}</span>
337
340
  ${r}
338
- </div>`}function gr(e,n){const t=qo(e);return wn("help","panel:help",a("panel.render.helpAndFeedback"),"",`<div class="feedbackfoot">
341
+ </div>`}function $r(e,n){const t=zo(e);return Tn("help","panel:help",a("panel.render.helpAndFeedback"),"",`<div class="feedbackfoot">
339
342
  <a class="feedbacklink" data-act="feedback" href="${l(t)}" target="_blank" rel="noreferrer">${a("panel.render.reportProblem")}</a>
340
343
  <span>${a("panel.render.clickingSendsAllowlistedReproductionHintsTo")}</span>
341
- <a href="mailto:${Kt}" target="_blank" rel="noreferrer">${Kt}</a>
342
- </div>`,n)}function zt(e,n,t){return`<div class="empty-state">${ei(e,n)}${gr(void 0,t)}</div>`}const zi={pending:"○",in_progress:"●",completed:"✔",cancelled:"—",checkpoint:"?"},Qi={get pending(){return a("panel.render.pending")},get in_progress(){return a("panel.render.inProgress")},get completed(){return a("panel.render.markedCompleteByAgentUser")},get cancelled(){return a("panel.render.cancelled")},get checkpoint(){return a("panel.render.checkpoint")}},Xi={get not_installed(){return a("panel.render.protocolNotInstalled")},get installed(){return a("panel.render.protocolInstalled")},get installed_not_loaded(){return a("panel.render.installedButNotLoaded")},get plan_present(){return a("panel.render.planAlreadyExists")},get session_wrote_plan(){return a("panel.render.thisSessionHasWrittenAPlan")}};function ge(e,n){return n.anatomy?.find(t=>t.harness===e)?.planProtocol?.user}function Ie(e){const n=e==="cc"?"~/.claude/CLAUDE.md":e==="codex"?"~/.codex/AGENTS.md":a("panel.render.dshHasNoUserLevelInstruction");return a("panel.render.sourceGETApiAnatomyPlanProtocolUser",{p0:String(e),p1:String(n)})}function Zi(e,n){const t=e.planProtocol?.user;if(t===void 0)return"";if(t==="installed")return`<div class="protocol-foot" data-tip="${l(Ie(e.harness))}${a("panel.render.takesEffectInTheNextNew")}">${a("panel.render.planProtocolInstalledForYourAccount")}<button data-act="protocol-user" data-harness="${e.harness}" data-kind="protocol_user_uninstall" type="button">${a("panel.render.uninstall")}</button></div>`;const r={outdated:a("panel.render.protocolVUpdateAvailable"),missing:a("panel.render.notInstalled"),modified:a("panel.render.modified"),unsupported:a("panel.render.unsupported")};let s;if(e.harness==="dsh"||t==="unsupported"){const i=n.protocolBannerProjectRoot??n.narrative?.project?.root??a("panel.render.projectPlaceholder");s=`<small>${a("panel.render.dshHasNoUserLevelInstructionFile")}${i===a("panel.render.projectPlaceholder")?a("panel.render.replaceLtProjectGtWithThe"):""}。</small>${Oe("dsh",i,n,a("panel.render.copyProjectInstallCommand"))}`}else s=`<small>${a(t==="outdated"?"panel.render.backsUpBeforeUpdatingPreservesContent":t==="modified"?"panel.render.theProtocolBlockHasBeenModified":"panel.render.afterConfirmationInstallsInTheUser")}</small><button class="project-protocol-copy" data-act="protocol-user" data-harness="${e.harness}" data-kind="protocol_user_install" type="button">${a(t==="outdated"?"panel.render.update":t==="modified"?"panel.render.reinstall":"panel.render.installAction")}</button>`;return`<div class="feedbacksignal plan-protocol-status protocol-banner${n.protocolBannerHighlight===e.harness?" highlighted":""}" data-tip="${l(Ie(e.harness))}"><span>${t==="outdated"?r[t]:a("panel.render.planProtocol",{p0:String(r[t])})}</span>${s}</div>`}function Oe(e,n,t,r){if(e!=="dsh"&&ge(e,t)==="outdated")return`<span class="project-protocol-note" data-tip="${l(Ie(e))}">${R[e]} ${a("panel.render.protocolUpdateSuffix")}</span><button class="project-protocol-copy" data-act="protocol-user" data-harness="${e}" data-kind="protocol_user_install" type="button">${a("panel.render.update")}</button>`;if(e!=="dsh"&&ge(e,t)==="missing"){const o=Do(e,t.wingmanVersion),c=a("panel.render.scopeUserLevelProtocolCommandVersion",{p0:String(Ie(e))});return`<span class="project-protocol-note" data-tip="${l(I(c))}">${a("panel.render.installOnceToRequestPlansIn")}</span><button class="project-protocol-copy" data-act="protocol-copy" data-command="${l(o)}" data-tip="${l(`${o} · ${c}`)}" type="button">${l(r)}</button>${Ae(t.wingmanVersion)}`}const s=tr(e,n,t.wingmanVersion),i=ge(e,t)==="unsupported"?a("panel.render.projectCommandVersionGETApiVersion",{p0:String(s),p1:String(Ie(e)),p2:String(n===a("panel.render.projectPlaceholder")?a("panel.render.toBeFilledIn"):"GET /api/projects root")}):s;return`<button class="project-protocol-copy" data-act="protocol-copy" data-command="${l(s)}" data-tip="${l(i)}" type="button">${l(r)}</button>`}function Tn(e,n){return`project-node-${encodeURIComponent(`${e}:${n}`)}`}function vn(e){return`project-card-${encodeURIComponent(e)}`}function el(e,n){return`<div class="project-protocols">${["cc","codex","dsh"].map(s=>{const i=e.protocol[s],o=e.sessions.find(u=>u.harness===s&&u.compliance.level==="session_wrote_plan")?.compliance,c=[i.message,o?.writeSummary,o?.timing?.text,i.state==="not_installed"&&n.wingmanVersion===null?a("panel.render.wingmanVersionUnknownTheInstallCommand"):void 0].filter(u=>u!==void 0).join(" · "),p=`<span class="project-protocol-chip ${i.state}"${c===""?"":` data-tip="${l(c)}"`}>${l(R[s])} · ${l(Xi[i.state])}</span>`;if(i.state!=="not_installed"){const u=i.state==="installed_not_loaded"?`<span class="project-protocol-note">${l(i.message??a("panel.render.theDshInstructionLoadingPluginIs"))}</span>`:"",m=s!=="dsh"&&ge(s,n)==="outdated"?Oe(s,e.root,n,a("panel.render.update")):"";return`<div class="project-protocol-row">${p}${u}${m}</div>`}return`<div class="project-protocol-row">${p}${Oe(s,e.root,n,a("panel.render.copyInstallCommand"))}</div>`}).join("")}</div>`}function hr(e){return e?.length?`<span class="task-skills" data-tip="${a("panel.render.skillsUsedSource")}">${l(a("panel.render.skillsUsed",{skills:e.join(", ")}))}</span>`:""}function nl(e,n=Date.now(),t=Ct,r=""){const s=Qe(e),i=s.note?`<span class="note ${s.note.kind}" data-tip="${a("panel.render.sourcePrefix")}${l(e.waitOutcome?.source??"")}">${l(s.note.text)}</span>`:"",o=Ne(e),c=xt(e.harness,e.origin),p=`<span class="task-title"${V(`${e.harness}:${e.id}:title`,t,r)}>${l(o.text)}</span>`,u=[e.discovered?a("panel.render.discoveredOnStartup"):"",e.worktree?e.unattachedReason:""].filter(Boolean),m=u.length>0?` data-tip="${l(u.join(" · "))}"`:"",f=e.worktree===void 0?"":`<span class="session-worktree">${l(a("panel.render.projectWorktree",{name:e.worktree}))}</span>`;return`<button class="task-card" data-act="project-session" data-harness="${e.harness}" data-session="${l(e.id)}" type="button"${m}>
343
- <span class="task-card-head"><span class="task-badge">${l(R[e.harness])}</span>${c?`<span class="session-title-with-origin">${p}${c}</span>`:p}${f}</span>
344
- <span class="task-card-meta"><span class="task-status ${s.kind}">${s.label}${i}</span>${s.agentComplete?`<span class="task-status complete">${a("panel.render.markedCompleteByAgent")}</span>`:""}</span>
345
- </button>`}function Et(e){return`${e.harness}:${e.id}`}function vr(e){if(e===void 0)return"";const n=e.clipboard==="copied"?a("panel.render.commandCopied"):e.clipboard==="failed"?a("panel.render.couldNotCopyCommand"):a("panel.render.thisHarnessHasNoCommandTo"),t=e.activation.activated===null?a("panel.render.noReturnAppSelected"):e.activation.activated?a("panel.render.switchedTo",{p0:String(e.activation.name)}):a("panel.render.couldNotSwitch",{p0:String(e.activation.reason)}),r=e.clipboard==="unavailable"?a("panel.render.dshHasNoCommandToResume"):"",s=e.activationSource??(e.activation.activated===null?"GET /api/return-target":"POST /api/return"),i=a("panel.render.sourceClipboardWriteResultResponseOr",{p0:String(e.clipboard==="unavailable"?a("panel.render.thisHarnessHasNoResumeCommand"):""),p1:String(s)});return`<div class="task-return-result" role="status" data-tip="${l(i)}">${l(`${n} · ${t}${r}`)}</div>`}function tl(e,n){const t=Et(e),r=n.taskMenuOpen===t,s=`<button class="task-menu-button" data-act="task-menu" data-key="${l(t)}" type="button" aria-label="${a("panel.render.taskCardMenu")}" aria-expanded="${r}">⋯</button>`;if(!r)return s;const i=Ta(e),o=n.taskResumeOpen!==t?"":"unavailable"in i?`<div class="task-resume-unavailable">${l(i.unavailable)}</div>`:`<div class="task-resume-command"><code>${l(i.command)}</code><button data-act="task-copy" data-key="${l(t)}" data-command="${l(i.command)}" type="button">${a("panel.render.copy")}</button><div class="task-resume-note">${l(i.note)}</div></div>`,c=e.acceptance===void 0||e.acceptance.state==="unavailable"?"":`<button data-act="task-accept" data-key="${l(t)}" data-value="${e.acceptance.state!=="accepted"}" type="button">${e.acceptance.state==="accepted"?a("panel.render.undoAcceptance"):a("panel.render.markAccepted")}</button>`;return`${s}<div class="task-menu" data-task-menu="${l(t)}">
344
+ <a href="mailto:${Qt}" target="_blank" rel="noreferrer">${Qt}</a>
345
+ </div>`,n)}function ea(e,n,t){return`<div class="empty-state">${oi(e,n)}${$r(void 0,t)}</div>`}const rl={pending:"○",in_progress:"●",completed:"✔",cancelled:"—",checkpoint:"?"},sl={get pending(){return a("panel.render.pending")},get in_progress(){return a("panel.render.inProgress")},get completed(){return a("panel.render.markedCompleteByAgentUser")},get cancelled(){return a("panel.render.cancelled")},get checkpoint(){return a("panel.render.checkpoint")}},ol={get not_installed(){return a("panel.render.protocolNotInstalled")},get installed(){return a("panel.render.protocolInstalled")},get installed_not_loaded(){return a("panel.render.installedButNotLoaded")},get plan_present(){return a("panel.render.planAlreadyExists")},get session_wrote_plan(){return a("panel.render.thisSessionHasWrittenAPlan")}};function he(e,n){return n.anatomy?.find(t=>t.harness===e)?.planProtocol?.user}function Ie(e){const n=e==="cc"?"~/.claude/CLAUDE.md":e==="codex"?"~/.codex/AGENTS.md":a("panel.render.dshHasNoUserLevelInstruction");return a("panel.render.sourceGETApiAnatomyPlanProtocolUser",{p0:String(e),p1:String(n)})}function il(e,n){const t=e.planProtocol?.user;if(t===void 0)return"";if(t==="installed")return`<div class="protocol-foot" data-tip="${l(Ie(e.harness))}${a("panel.render.takesEffectInTheNextNew")}">${a("panel.render.planProtocolInstalledForYourAccount")}<button data-act="protocol-user" data-harness="${e.harness}" data-kind="protocol_user_uninstall" type="button">${a("panel.render.uninstall")}</button></div>`;const r={outdated:a("panel.render.protocolVUpdateAvailable"),missing:a("panel.render.notInstalled"),modified:a("panel.render.modified"),unsupported:a("panel.render.unsupported")};let s;if(e.harness==="dsh"||t==="unsupported"){const o=n.protocolBannerProjectRoot??n.narrative?.project?.root??a("panel.render.projectPlaceholder");s=`<small>${a("panel.render.dshHasNoUserLevelInstructionFile")}${o===a("panel.render.projectPlaceholder")?a("panel.render.replaceLtProjectGtWithThe"):""}。</small>${Oe("dsh",o,n,a("panel.render.copyProjectInstallCommand"))}`}else s=`<small>${a(t==="outdated"?"panel.render.backsUpBeforeUpdatingPreservesContent":t==="modified"?"panel.render.theProtocolBlockHasBeenModified":"panel.render.afterConfirmationInstallsInTheUser")}</small><button class="project-protocol-copy" data-act="protocol-user" data-harness="${e.harness}" data-kind="protocol_user_install" type="button">${a(t==="outdated"?"panel.render.update":t==="modified"?"panel.render.reinstall":"panel.render.installAction")}</button>`;return`<div class="feedbacksignal plan-protocol-status protocol-banner${n.protocolBannerHighlight===e.harness?" highlighted":""}" data-tip="${l(Ie(e.harness))}"><span>${t==="outdated"?r[t]:a("panel.render.planProtocol",{p0:String(r[t])})}</span>${s}</div>`}function Oe(e,n,t,r){if(e!=="dsh"&&he(e,t)==="outdated")return`<span class="project-protocol-note" data-tip="${l(Ie(e))}">${E[e]} ${a("panel.render.protocolUpdateSuffix")}</span><button class="project-protocol-copy" data-act="protocol-user" data-harness="${e}" data-kind="protocol_user_install" type="button">${a("panel.render.update")}</button>`;if(e!=="dsh"&&he(e,t)==="missing"){const i=qo(e,t.wingmanVersion),c=a("panel.render.scopeUserLevelProtocolCommandVersion",{p0:String(Ie(e))});return`<span class="project-protocol-note" data-tip="${l(C(c))}">${a("panel.render.installOnceToRequestPlansIn")}</span><button class="project-protocol-copy" data-act="protocol-copy" data-command="${l(i)}" data-tip="${l(`${i} · ${c}`)}" type="button">${l(r)}</button>${Ae(t.wingmanVersion)}`}const s=or(e,n,t.wingmanVersion),o=he(e,t)==="unsupported"?a("panel.render.projectCommandVersionGETApiVersion",{p0:String(s),p1:String(Ie(e)),p2:String(n===a("panel.render.projectPlaceholder")?a("panel.render.toBeFilledIn"):"GET /api/projects root")}):s;return`<button class="project-protocol-copy" data-act="protocol-copy" data-command="${l(s)}" data-tip="${l(o)}" type="button">${l(r)}</button>`}function An(e,n){return`project-node-${encodeURIComponent(`${e}:${n}`)}`}function vn(e){return`project-card-${encodeURIComponent(e)}`}function ll(e,n){return`<div class="project-protocols">${["cc","codex","dsh"].map(s=>{const o=e.protocol[s],i=e.sessions.find(u=>u.harness===s&&u.compliance.level==="session_wrote_plan")?.compliance,c=[o.message,i?.writeSummary,i?.timing?.text,o.state==="not_installed"&&n.wingmanVersion===null?a("panel.render.wingmanVersionUnknownTheInstallCommand"):void 0].filter(u=>u!==void 0).join(" · "),p=`<span class="project-protocol-chip ${o.state}"${c===""?"":` data-tip="${l(c)}"`}>${l(E[s])} · ${l(ol[o.state])}</span>`;if(o.state!=="not_installed"){const u=o.state==="installed_not_loaded"?`<span class="project-protocol-note">${l(o.message??a("panel.render.theDshInstructionLoadingPluginIs"))}</span>`:"",m=s!=="dsh"&&he(s,n)==="outdated"?Oe(s,e.root,n,a("panel.render.update")):"";return`<div class="project-protocol-row">${p}${u}${m}</div>`}return`<div class="project-protocol-row">${p}${Oe(s,e.root,n,a("panel.render.copyInstallCommand"))}</div>`}).join("")}</div>`}function wr(e){return e?.length?`<span class="task-skills" data-tip="${a("panel.render.skillsUsedSource")}">${l(a("panel.render.skillsUsed",{skills:e.join(", ")}))}</span>`:""}function dl(e,n=Date.now(),t=jt,r=""){const s=Qe(e),o=s.note?`<span class="note ${s.note.kind}" data-tip="${a("panel.render.sourcePrefix")}${l(e.waitOutcome?.source??"")}">${l(s.note.text)}</span>`:"",i=Ne(e),c=Et(e.harness,e.origin),p=`<span class="task-title"${V(`${e.harness}:${e.id}:title`,t,r)}>${l(i.text)}</span>`,u=[e.discovered?a("panel.render.discoveredOnStartup"):"",e.worktree?e.unattachedReason:""].filter(Boolean),m=u.length>0?` data-tip="${l(u.join(" · "))}"`:"",f=e.worktree===void 0?"":`<span class="session-worktree">${l(a("panel.render.projectWorktree",{name:e.worktree}))}</span>`;return`<button class="task-card" data-act="project-session" data-harness="${e.harness}" data-session="${l(e.id)}" type="button"${m}>
346
+ <span class="task-card-head"><span class="task-badge">${l(E[e.harness])}</span>${c?`<span class="session-title-with-origin">${p}${c}</span>`:p}${f}</span>
347
+ <span class="task-card-meta"><span class="task-status ${s.kind}">${s.label}${o}</span>${s.agentComplete?`<span class="task-status complete">${a("panel.render.markedCompleteByAgent")}</span>`:""}</span>
348
+ </button>`}function Ft(e){return`${e.harness}:${e.id}`}function Sr(e){if(e===void 0)return"";const n=e.clipboard==="copied"?a("panel.render.commandCopied"):e.clipboard==="failed"?a("panel.render.couldNotCopyCommand"):a("panel.render.thisHarnessHasNoCommandTo"),t=e.activation.activated===null?a("panel.render.noReturnAppSelected"):e.activation.activated?a("panel.render.switchedTo",{p0:String(e.activation.name)}):a("panel.render.couldNotSwitch",{p0:String(e.activation.reason)}),r=e.clipboard==="unavailable"?a("panel.render.dshHasNoCommandToResume"):"",s=e.activationSource??(e.activation.activated===null?"GET /api/return-target":"POST /api/return"),o=a("panel.render.sourceClipboardWriteResultResponseOr",{p0:String(e.clipboard==="unavailable"?a("panel.render.thisHarnessHasNoResumeCommand"):""),p1:String(s)});return`<div class="task-return-result" role="status" data-tip="${l(o)}">${l(`${n} · ${t}${r}`)}</div>`}function cl(e,n){const t=Ft(e),r=n.taskMenuOpen===t,s=`<button class="task-menu-button" data-act="task-menu" data-key="${l(t)}" type="button" aria-label="${a("panel.render.taskCardMenu")}" aria-expanded="${r}">⋯</button>`;if(!r)return s;const o=Ca(e),i=n.taskResumeOpen!==t?"":"unavailable"in o?`<div class="task-resume-unavailable">${l(o.unavailable)}</div>`:`<div class="task-resume-command"><code>${l(o.command)}</code><button data-act="task-copy" data-key="${l(t)}" data-command="${l(o.command)}" type="button">${a("panel.render.copy")}</button><div class="task-resume-note">${l(o.note)}</div></div>`,c=e.acceptance===void 0||e.acceptance.state==="unavailable"?"":`<button data-act="task-accept" data-key="${l(t)}" data-value="${e.acceptance.state!=="accepted"}" type="button">${e.acceptance.state==="accepted"?a("panel.render.undoAcceptance"):a("panel.render.markAccepted")}</button>`;return`${s}<div class="task-menu" data-task-menu="${l(t)}">
346
349
  <label>${a("panel.render.rename")}<input data-act="task-rename-input" data-key="${l(t)}" value="${l(e.user.title??"")}" placeholder="${a("panel.render.clearToRestoreTheAutomaticTitle")}"></label>
347
350
  <div class="task-menu-actions"><button data-act="task-pin" data-key="${l(t)}" data-value="${!e.user.pinned}" type="button">${e.user.pinned?a("panel.render.unpin"):a("panel.render.pin")}</button><button data-act="task-hide" data-key="${l(t)}" data-value="${!e.user.hidden}" type="button">${e.user.hidden?a("panel.render.unhide"):a("panel.render.hide")}</button>${c}<button data-act="task-archive" data-key="${l(t)}" data-value="true" type="button">${a("panel.render.archiveSession")}</button><button data-act="task-resume" data-key="${l(t)}" type="button">${a("panel.render.backToSession")}</button></div>
348
- ${vr(n.taskReturnResults?.[t])}${o}
349
- </div>`}function Nt(e,n,t,r,s=!1){const i=Et(e),o=s?`<button class="task-unhide" data-act="task-hide" data-key="${l(i)}" data-value="false" type="button">${a("panel.render.unhide")}</button>`:"",c=n.taskError?.key===i?`<div class="task-error">${l(n.taskError.message)}</div>`:"";return`<div class="${r}${s?" task-card-hidden":""}">${nl(e,t,n,r)}${G(`${e.harness}:${e.id}:title`,n,r)}${tl(e,n)}${o}${c}</div>`}function br(e,n,t,r,s){if(e.length===0)return"";const i=t.hiddenOpen[n]===!0,o=i?ft(e).map(c=>Nt(c,t,r,s,!0)).join(""):"";return`<div class="task-hidden-group"><button class="task-hidden-toggle" data-act="task-hidden-toggle" data-group="${l(n)}" type="button">${a("panel.render.hidden")} ${e.length} ${a("panel.render.cards")} ${a(i?"panel.render.collapse":"panel.render.show")}</button>${o}</div>`}function yr(e){return e.children.length===0?1:e.children.reduce((n,t)=>n+yr(t),0)}function kr(e){return e.status==="in_progress"||e.children.some(kr)}function Ot(e,n,t,r,s=!1,i=!1){const o=e.sessions.filter(E=>E.attachedTo===n.key),c=mt(o),p=ft(gt(c.visible,t.taskFilter)),u=c.visible.length-p.length,m=`${e.root}:${n.key}`,f=n.children.length>0&&(s||n.status==="completed"||n.status==="cancelled"||!kr(n)),h=n.verification?`<div class="project-verify">${a("panel.render.planAcceptance")}${l(n.verification)}</div>`:"",v=p.map(E=>Nt(E,t,r,"project-session-wrap task-card-wrap")).join(""),y=u===0?"":`<div class="task-hidden">${u} ${a("panel.render.cardsHiddenByFilters")}</div>`,w=br(c.hidden,m,t,r,"project-session-wrap task-card-wrap"),g=n.children.map(E=>Ot(e,E,t,r,s)).join(""),k=g===""?"":f?`<details class="project-node-children"><summary data-tip="${a("panel.render.sourceWingmanPlanMdNodesSubtree")}">${a("panel.render.expandChildSteps")}${yr(n)})</summary><ul>${g}</ul></details>`:`<ul>${g}</ul>`,S=i?n.text.indexOf(" — "):-1,A=S<0?n.text:n.text.slice(0,S),P=`<span class="project-node-text" data-tip="${l(n.text)}"${V(`${e.root}:node:${n.key}`,t)}>${l(A)}</span>`,F=S<0?P:`<span class="project-node-heading" data-tip="${l(n.text)}">${P}<span class="project-node-detail">${l(n.text.slice(S+3))}</span></span>`;return`<li class="project-node ${n.status}${f?" collapsed":""}" id="${Tn(e.root,n.key)}" data-project-node="${l(n.key)}">
350
- <div class="project-node-line"><span class="project-mark" data-tip="${l(Qi[n.status])}">${zi[n.status]}</span>${F}${G(`${e.root}:node:${n.key}`,t)}</div>
351
- ${h}${v}${y}${w}${k}
352
- </li>`}function al(e,n,t){if(e.plan.availability!=="available")return"";const r=`project:${e.root}:full`,s=`project:${e.root}:done`,i=n.expandedText?.[r]===!0,o=e.plan.nodes.filter(h=>h.status==="completed"||h.status==="cancelled"),c=i?e.plan.nodes:e.plan.nodes.filter(h=>h.status!=="completed"&&h.status!=="cancelled"),p=h=>`<ul class="project-tree">${h.map(v=>Ot(e,v,n,t,!i,!0)).join("")}</ul>`,u=o.at(-1),m=i||u===void 0?"":`<details class="fold"${n.expandedText?.[s]===!0?" open":""}><summary data-act="workflow-fold" data-key="${l(s)}" data-tip="${a("panel.render.completedMilestonesSource")}"><span class="fold-summary">${l(a("panel.render.completedMilestones",{count:o.length,name:u.text.split(" — ")[0]??u.text}))}</span></summary><div class="fold-body">${p(o)}</div></details>`,f=e.plan.nodes.length===0?`<div class="project-empty">${a("panel.render.thePlanHasNoSteps")}</div>`:`${p(c)}${m}`;return`<div class="project-plan-tree" data-plan-view="${i?"full":"milestones"}"><div class="project-plan-toolbar"><span class="project-label">${a("panel.render.planTree")}</span><button class="project-crumb" data-act="workflow-fold" data-key="${l(r)}" aria-pressed="${i}" type="button">${a("panel.render.fullRecord")}</button></div>${f}</div>`}function Qt(e,n,t,r){if(e.length===0)return`<div class="project-empty">${a("panel.render.noSessionObserved")}</div>`;const s=mt(e),i=ft(gt(s.visible,t.taskFilter)),o=s.visible.length-i.length,c=i.map(m=>Nt(m,t,r,"task-card-wrap")).join(""),p=o===0?"":`<div class="task-hidden">${o} ${a("panel.render.cardsHiddenByFilters")}</div>`,u=br(s.hidden,n,t,r,"task-card-wrap");return c===""&&u===""?`<div class="project-empty">${a("panel.render.noTaskCardsMatchTheFilters")}${o} ${a("panel.render.filteredOut")}</div>`:`${c===""?"":`<div class="task-card-list">${c}</div>`}${p}${u}`}function rl(e){const n=e.revision===void 0?"":`revision ${e.revision}`,t=e.mtime===void 0?"":a("panel.render.fileTimestamp",{p0:String(e.mtime)}),r=e.lastWriter?a("panel.render.lastWriter",{p0:String(R[e.lastWriter.harness]),p1:String(e.lastWriter.label),p2:String(e.lastWriter.at)}):a("panel.render.lastWriterExternalEditNotObserved");return[n,t,r].filter(s=>s!=="").map(l).join(" · ")}function sl(e,n){const t=e.facts.filter(i=>/步骤下当前没有观察到活跃会话$/u.test(i)),r=e.facts.filter(i=>!/步骤下当前没有观察到活跃会话$/u.test(i)),s=[{key:"contradictions",label:a("panel.render.parentChildConflicts",{p0:String(e.contradictions.length)}),items:e.contradictions.map(i=>i.text)},{key:"no-active-session",label:a("panel.render.inProgressStepsWithoutAnActive",{p0:String(t.length)}),items:t},{key:"other",label:a("panel.render.otherFacts",{p0:String(r.length)}),items:r}].filter(i=>i.items.length>0);return s.length===0?"":`<div class="project-facts">${s.map(i=>{const o=`${e.root}:${i.key}`,c=n.factsOpen[o]===!0,p=c?`<div class="project-facts-items">${i.items.map(u=>`<div class="project-facts-item">${l(u)}</div>`).join("")}</div>`:"";return`<div class="project-facts-group"><button class="project-facts-toggle" data-act="facts-toggle" data-group="${l(o)}" type="button" aria-expanded="${c}">${c?"▾":"▸"} ${i.label}</button>${p}</div>`}).join("")}</div>`}function tt(e,n=""){return`expand-${encodeURIComponent(n===""?e:`${e}:${n}`)}`}function V(e,n,t=""){return` id="${tt(e,t)}" data-expand-text="${l(e)}" data-expanded="${n.expandedText?.[e]===!0}"`}function G(e,n,t=""){const r=n.expandedText?.[e]===!0;return`<button class="expand" id="${tt(e,t)}-control" data-act="expand" data-key="${l(e)}" aria-controls="${tt(e,t)}" aria-expanded="${r}" type="button" hidden>${a(r?"panel.render.collapse":"panel.render.expand")}</button>`}function at(e,n,t,r){return n.map(s=>`<button class="project-crumb" data-tip="${l(a("panel.render.pathSource",{p0:String(s.path.join(" → ")),p1:String(I(s.source))}))}"${V(`${e.root}:${r}:${s.key}`,t)} data-act="project-node-link" data-node-target="${Tn(e.root,s.key)}" type="button">${l(s.text)}</button>${G(`${e.root}:${r}:${s.key}`,t)}`).join("")}const Xt=3;function ol(e,n){const t=e.firstScreen.currentPoints,r=t.slice(Xt),s=`project:${e.root}:points`,i=r.length===0?"":`<details class="fold"${n.expandedText?.[s]===!0?" open":""}><summary data-act="workflow-fold" data-key="${l(s)}">${a(r.length===1?"panel.render.oneMorePoint":"panel.render.morePoints",{count:r.length})}</summary><div class="fold-body">${at(e,r,n,"point")}</div></details>`;return`<div class="project-current-points">${at(e,t.slice(0,Xt),n,"point")}${i}</div>`}function il(e,n){const t=e.firstScreen.branch,r=new Set(e.currentPoints.map(m=>m.key)),s=m=>Number(r.has(m.key))+m.children.reduce((f,h)=>f+s(h),0),i=new Map(e.plan.availability==="available"?e.plan.nodes.map(m=>[m.key,s(m)]):[]),o=m=>{const f=i.get(m.key),h=f===void 0?"":`<span class="project-source" data-tip="${a("panel.render.branchCurrentPointsSource")}">${a(f===1?"panel.render.branchCurrentPoint":"panel.render.branchCurrentPoints",{count:f})}</span>`;return`<div class="project-branch">${at(e,[m],n,"branch")}${h}</div>`},c=t.slice(0,-1),p=`project:${e.root}:branches`,u=c.length===0?"":`<details class="fold"${n.expandedText?.[p]===!0?" open":""}><summary data-act="workflow-fold" data-key="${l(p)}">${a(c.length===1?"panel.render.oneMoreBranch":"panel.render.moreBranches",{count:c.length})}</summary><div class="fold-body">${c.map(o).join("")}</div></details>`;return`<div class="project-branches">${t.slice(-1).map(o).join("")}${u}</div>`}function ll(e,n){let t=e.firstScreen.action;if(t.kind==="decision"&&(t={...t,items:t.items.filter(s=>!be(s.harness,s.sessionId,n.projects))},t.items.length===0))return"";let r;if(t.kind==="decision")r=`<div class="project-action-title">${a("panel.render.waitingForYourDecision")} <span data-tip="${a("panel.render.sourcePrefix")}${l(I(t.source))} items.length">${t.items.length} ${a("panel.render.requests")}</span></div>${t.items.map(s=>`<div class="project-action-item" data-tip="${a("panel.render.sourcePrefix")}${l(I(s.source))} · ${l(a("panel.render.sessionIdentifier",{id:s.sessionId}))} · ${l(s.since)}"><span${V(`${e.root}:request:${s.harness}:${s.sessionId}`,n)}>${l(s.text??a("panel.render.explicitFeedbackRequestReceived"))}</span>${G(`${e.root}:request:${s.harness}:${s.sessionId}`,n)}<span class="project-source">${l(R[s.harness])} · ${l(s.label)}</span><button class="project-crumb" data-act="project-session" data-harness="${s.harness}" data-session="${l(s.sessionId)}" type="button">${a("panel.render.openSession")}</button></div>`).join("")}`;else if(t.kind==="checkpoint")r=`<div class="project-action-title">${a("panel.render.thePlanNeedsYourReview")}</div>${t.items.map(s=>`<div class="project-action-item" data-tip="${l(a("panel.render.pathSource",{p0:String(s.path.join(" → ")),p1:String(I(s.source))}))}"><span${V(`${e.root}:checkpoint-action:${s.key}:text`,n)}>${l(s.text)}</span>${G(`${e.root}:checkpoint-action:${s.key}:text`,n)}<button class="project-crumb" data-act="project-node-link" data-node-target="${Tn(e.root,s.key)}" type="button">${a("panel.render.goToNode")}</button></div>`).join("")}`;else if(t.kind==="in_progress")r=`<div class="project-action-title">${a("panel.render.projectInProgress")}</div>`;else if(t.kind==="ended")r=`<div class="project-action-title">${a("panel.render.projectEnded")}</div>`;else{const s={no_plan:a("panel.render.noPlanFile"),plan_unavailable:a("panel.render.planUnreadable"),feedback_unavailable:a("panel.render.cannotDetermineWhetherYouAreNeeded")};let i="";t.reason==="no_plan"?i=[...new Set(e.sessions.map(c=>c.harness))].map(c=>Oe(c,e.root,n,a("panel.render.copyInstallCommandTip",{p0:String(R[c])}))).join("")+`<details class="project-plan-help"><summary>${a("panel.render.howToProvideAPlan")}</summary><p>${a("panel.render.createAtTheProjectRoot")} <code>.wingman/plan.md</code>${a("panel.render.withTheProjectTitleGoalAnd")}</p><pre>${a("panel.render.projectName")}
351
+ ${Sr(n.taskReturnResults?.[t])}${i}
352
+ </div>`}function Lt(e,n,t,r,s=!1){const o=Ft(e),i=s?`<button class="task-unhide" data-act="task-hide" data-key="${l(o)}" data-value="false" type="button">${a("panel.render.unhide")}</button>`:"",c=n.taskError?.key===o?`<div class="task-error">${l(n.taskError.message)}</div>`:"";return`<div class="${r}${s?" task-card-hidden":""}">${dl(e,t,n,r)}${G(`${e.harness}:${e.id}:title`,n,r)}${cl(e,n)}${i}${c}</div>`}function Tr(e,n,t,r,s){if(e.length===0)return"";const o=t.hiddenOpen[n]===!0,i=o?bt(e).map(c=>Lt(c,t,r,s,!0)).join(""):"";return`<div class="task-hidden-group"><button class="task-hidden-toggle" data-act="task-hidden-toggle" data-group="${l(n)}" type="button">${a("panel.render.hidden")} ${e.length} ${a("panel.render.cards")} ${a(o?"panel.render.collapse":"panel.render.show")}</button>${i}</div>`}function Ar(e){return e.children.length===0?1:e.children.reduce((n,t)=>n+Ar(t),0)}function Pr(e){return e.status==="in_progress"||e.children.some(Pr)}function Dt(e,n,t,r,s=!1,o=!1){const i=e.sessions.filter(j=>j.attachedTo===n.key),c=yt(i),p=bt(kt(c.visible,t.taskFilter)),u=c.visible.length-p.length,m=`${e.root}:${n.key}`,f=n.children.length>0&&(s||n.status==="completed"||n.status==="cancelled"||!Pr(n)),h=n.verification?`<div class="project-verify">${a("panel.render.planAcceptance")}${l(n.verification)}</div>`:"",v=p.map(j=>Lt(j,t,r,"project-session-wrap task-card-wrap")).join(""),y=u===0?"":`<div class="task-hidden">${u} ${a("panel.render.cardsHiddenByFilters")}</div>`,$=Tr(c.hidden,m,t,r,"project-session-wrap task-card-wrap"),g=n.children.map(j=>Dt(e,j,t,r,s)).join(""),k=g===""?"":f?`<details class="project-node-children"><summary data-tip="${a("panel.render.sourceWingmanPlanMdNodesSubtree")}">${a("panel.render.expandChildSteps")}${Ar(n)})</summary><ul>${g}</ul></details>`:`<ul>${g}</ul>`,S=o?n.text.indexOf(" — "):-1,A=S<0?n.text:n.text.slice(0,S),P=`<span class="project-node-text" data-tip="${l(n.text)}"${V(`${e.root}:node:${n.key}`,t)}>${l(A)}</span>`,F=S<0?P:`<span class="project-node-heading" data-tip="${l(n.text)}">${P}<span class="project-node-detail">${l(n.text.slice(S+3))}</span></span>`;return`<li class="project-node ${n.status}${f?" collapsed":""}" id="${An(e.root,n.key)}" data-project-node="${l(n.key)}">
353
+ <div class="project-node-line"><span class="project-mark" data-tip="${l(sl[n.status])}">${rl[n.status]}</span>${F}${G(`${e.root}:node:${n.key}`,t)}</div>
354
+ ${h}${v}${y}${$}${k}
355
+ </li>`}function pl(e,n,t){if(e.plan.availability!=="available")return"";const r=`project:${e.root}:full`,s=`project:${e.root}:done`,o=n.expandedText?.[r]===!0,i=e.plan.nodes.filter(h=>h.status==="completed"||h.status==="cancelled"),c=o?e.plan.nodes:e.plan.nodes.filter(h=>h.status!=="completed"&&h.status!=="cancelled"),p=h=>`<ul class="project-tree">${h.map(v=>Dt(e,v,n,t,!o,!0)).join("")}</ul>`,u=i.at(-1),m=o||u===void 0?"":`<details class="fold"${n.expandedText?.[s]===!0?" open":""}><summary data-act="workflow-fold" data-key="${l(s)}" data-tip="${a("panel.render.completedMilestonesSource")}"><span class="fold-summary">${l(a("panel.render.completedMilestones",{count:i.length,name:u.text.split(" — ")[0]??u.text}))}</span></summary><div class="fold-body">${p(i)}</div></details>`,f=e.plan.nodes.length===0?`<div class="project-empty">${a("panel.render.thePlanHasNoSteps")}</div>`:`${p(c)}${m}`;return`<div class="project-plan-tree" data-plan-view="${o?"full":"milestones"}"><div class="project-plan-toolbar"><span class="project-label">${a("panel.render.planTree")}</span><button class="project-crumb" data-act="workflow-fold" data-key="${l(r)}" aria-pressed="${o}" type="button">${a("panel.render.fullRecord")}</button></div>${f}</div>`}function na(e,n,t,r){if(e.length===0)return`<div class="project-empty">${a("panel.render.noSessionObserved")}</div>`;const s=yt(e),o=bt(kt(s.visible,t.taskFilter)),i=s.visible.length-o.length,c=o.map(m=>Lt(m,t,r,"task-card-wrap")).join(""),p=i===0?"":`<div class="task-hidden">${i} ${a("panel.render.cardsHiddenByFilters")}</div>`,u=Tr(s.hidden,n,t,r,"task-card-wrap");return c===""&&u===""?`<div class="project-empty">${a("panel.render.noTaskCardsMatchTheFilters")}${i} ${a("panel.render.filteredOut")}</div>`:`${c===""?"":`<div class="task-card-list">${c}</div>`}${p}${u}`}function ul(e){const n=e.revision===void 0?"":`revision ${e.revision}`,t=e.mtime===void 0?"":a("panel.render.fileTimestamp",{p0:String(e.mtime)}),r=e.lastWriter?a("panel.render.lastWriter",{p0:String(E[e.lastWriter.harness]),p1:String(e.lastWriter.label),p2:String(e.lastWriter.at)}):a("panel.render.lastWriterExternalEditNotObserved");return[n,t,r].filter(s=>s!=="").map(l).join(" · ")}function fl(e,n){const t=e.facts.filter(o=>/步骤下当前没有观察到活跃会话$/u.test(o)),r=e.facts.filter(o=>!/步骤下当前没有观察到活跃会话$/u.test(o)),s=[{key:"contradictions",label:a("panel.render.parentChildConflicts",{p0:String(e.contradictions.length)}),items:e.contradictions.map(o=>o.text)},{key:"no-active-session",label:a("panel.render.inProgressStepsWithoutAnActive",{p0:String(t.length)}),items:t},{key:"other",label:a("panel.render.otherFacts",{p0:String(r.length)}),items:r}].filter(o=>o.items.length>0);return s.length===0?"":`<div class="project-facts">${s.map(o=>{const i=`${e.root}:${o.key}`,c=n.factsOpen[i]===!0,p=c?`<div class="project-facts-items">${o.items.map(u=>`<div class="project-facts-item">${l(u)}</div>`).join("")}</div>`:"";return`<div class="project-facts-group"><button class="project-facts-toggle" data-act="facts-toggle" data-group="${l(i)}" type="button" aria-expanded="${c}">${c?"▾":"▸"} ${o.label}</button>${p}</div>`}).join("")}</div>`}function it(e,n=""){return`expand-${encodeURIComponent(n===""?e:`${e}:${n}`)}`}function V(e,n,t=""){return` id="${it(e,t)}" data-expand-text="${l(e)}" data-expanded="${n.expandedText?.[e]===!0}"`}function G(e,n,t=""){const r=n.expandedText?.[e]===!0;return`<button class="expand" id="${it(e,t)}-control" data-act="expand" data-key="${l(e)}" aria-controls="${it(e,t)}" aria-expanded="${r}" type="button" hidden>${a(r?"panel.render.collapse":"panel.render.expand")}</button>`}function lt(e,n,t,r){return n.map(s=>`<button class="project-crumb" data-tip="${l(a("panel.render.pathSource",{p0:String(s.path.join(" → ")),p1:String(C(s.source))}))}"${V(`${e.root}:${r}:${s.key}`,t)} data-act="project-node-link" data-node-target="${An(e.root,s.key)}" type="button">${l(s.text)}</button>${G(`${e.root}:${r}:${s.key}`,t)}`).join("")}const ta=3;function ml(e,n){const t=e.firstScreen.currentPoints,r=t.slice(ta),s=`project:${e.root}:points`,o=r.length===0?"":`<details class="fold"${n.expandedText?.[s]===!0?" open":""}><summary data-act="workflow-fold" data-key="${l(s)}">${a(r.length===1?"panel.render.oneMorePoint":"panel.render.morePoints",{count:r.length})}</summary><div class="fold-body">${lt(e,r,n,"point")}</div></details>`;return`<div class="project-current-points">${lt(e,t.slice(0,ta),n,"point")}${o}</div>`}function gl(e,n){const t=e.firstScreen.branch,r=new Set(e.currentPoints.map(m=>m.key)),s=m=>Number(r.has(m.key))+m.children.reduce((f,h)=>f+s(h),0),o=new Map(e.plan.availability==="available"?e.plan.nodes.map(m=>[m.key,s(m)]):[]),i=m=>{const f=o.get(m.key),h=f===void 0?"":`<span class="project-source" data-tip="${a("panel.render.branchCurrentPointsSource")}">${a(f===1?"panel.render.branchCurrentPoint":"panel.render.branchCurrentPoints",{count:f})}</span>`;return`<div class="project-branch">${lt(e,[m],n,"branch")}${h}</div>`},c=t.slice(0,-1),p=`project:${e.root}:branches`,u=c.length===0?"":`<details class="fold"${n.expandedText?.[p]===!0?" open":""}><summary data-act="workflow-fold" data-key="${l(p)}">${a(c.length===1?"panel.render.oneMoreBranch":"panel.render.moreBranches",{count:c.length})}</summary><div class="fold-body">${c.map(i).join("")}</div></details>`;return`<div class="project-branches">${t.slice(-1).map(i).join("")}${u}</div>`}function hl(e,n){let t=e.firstScreen.action;if(t.kind==="decision"&&(t={...t,items:t.items.filter(s=>!ye(s.harness,s.sessionId,n.projects))},t.items.length===0))return"";let r;if(t.kind==="decision")r=`<div class="project-action-title">${a("panel.render.waitingForYourDecision")} <span data-tip="${a("panel.render.sourcePrefix")}${l(C(t.source))} items.length">${t.items.length} ${a("panel.render.requests")}</span></div>${t.items.map(s=>`<div class="project-action-item" data-tip="${a("panel.render.sourcePrefix")}${l(C(s.source))} · ${l(a("panel.render.sessionIdentifier",{id:s.sessionId}))} · ${l(s.since)}"><span${V(`${e.root}:request:${s.harness}:${s.sessionId}`,n)}>${l(s.text??a("panel.render.explicitFeedbackRequestReceived"))}</span>${G(`${e.root}:request:${s.harness}:${s.sessionId}`,n)}<span class="project-source">${l(E[s.harness])} · ${l(s.label)}</span><button class="project-crumb" data-act="project-session" data-harness="${s.harness}" data-session="${l(s.sessionId)}" type="button">${a("panel.render.openSession")}</button></div>`).join("")}`;else if(t.kind==="checkpoint")r=`<div class="project-action-title">${a("panel.render.thePlanNeedsYourReview")}</div>${t.items.map(s=>`<div class="project-action-item" data-tip="${l(a("panel.render.pathSource",{p0:String(s.path.join(" → ")),p1:String(C(s.source))}))}"><span${V(`${e.root}:checkpoint-action:${s.key}:text`,n)}>${l(s.text)}</span>${G(`${e.root}:checkpoint-action:${s.key}:text`,n)}<button class="project-crumb" data-act="project-node-link" data-node-target="${An(e.root,s.key)}" type="button">${a("panel.render.goToNode")}</button></div>`).join("")}`;else if(t.kind==="in_progress")r=`<div class="project-action-title">${a("panel.render.projectInProgress")}</div>`;else if(t.kind==="ended")r=`<div class="project-action-title">${a("panel.render.projectEnded")}</div>`;else{const s={no_plan:a("panel.render.noPlanFile"),plan_unavailable:a("panel.render.planUnreadable"),feedback_unavailable:a("panel.render.cannotDetermineWhetherYouAreNeeded")};let o="";t.reason==="no_plan"?o=[...new Set(e.sessions.map(c=>c.harness))].map(c=>Oe(c,e.root,n,a("panel.render.copyInstallCommandTip",{p0:String(E[c])}))).join("")+`<details class="project-plan-help"><summary>${a("panel.render.howToProvideAPlan")}</summary><p>${a("panel.render.createAtTheProjectRoot")} <code>.wingman/plan.md</code>${a("panel.render.withTheProjectTitleGoalAnd")}</p><pre>${a("panel.render.projectName")}
353
356
  ${a("panel.render.goalProjectGoal")}
354
357
  ${a("panel.render.currentTask")}
355
- ${a("panel.render.pendingTask")}</pre></details>`:t.reason==="feedback_unavailable"&&(i=[...new Set(e.sessions.map(c=>c.harness))].map(c=>{const p=Ze(c,n.wingmanVersion);return`<button class="project-protocol-copy" data-act="protocol-copy" data-command="${l(p)}" data-tip="${l(p)}" type="button">${a("panel.render.connectFeedbackSignals")} ${R[c]}</button>`}).join("")),r=`<div class="project-action-title">${a("panel.render.notEnoughInformation")}${s[t.reason]}</div>${i}`}return`<section class="project-action" data-kind="${t.kind}" data-tip="${a("panel.render.sourcePrefix")}${l(I(t.source))}">${r}</section>`}function $r(e,n){const t=e.sessions.filter(i=>be(i.harness,i.id,{projects:[e]}));if(t.length===0)return{toggle:"",rows:""};const r=n.archivedSessionsOpen?.includes(e.root)===!0,s=r?t.map(i=>{const o=Et(i),c=ae(e)?e:void 0,p=c!==void 0?`<button data-act="project-archive" data-key="project:${l(c.root)}" data-value="false" type="button">${a("panel.render.restoreProject")}</button>`:`<button data-act="task-archive" data-key="${l(o)}" data-value="false" type="button">${a("panel.render.restoreSession")}</button>`,u=i.archivedHasNewActivity||c!==void 0&&c.user?.archivedAt!==void 0&&i.lastActivity!==void 0&&Date.parse(i.lastActivity)>Date.parse(c.user.archivedAt);return`<div class="session-archived-row" data-session="${l(i.id)}"><span>${l(R[i.harness])} · ${l(Ne(i).text)}</span>${u?`<span class="project-source" data-tip="${a("panel.render.sessionArchiveActivitySource")}">${a("panel.render.projectArchiveNewActivity")}</span>`:""}${p}${n.taskError?.key===o?`<div class="task-error" role="status">${l(n.taskError.message)}</div>`:""}</div>`}).join(""):"";return{toggle:`<button class="task-hidden-toggle" data-act="session-archived-toggle" data-root="${l(e.root)}" type="button" aria-expanded="${r}" data-tip="${a("panel.render.sessionArchiveSource")}">${a("panel.render.archivedSessions",{count:t.length})}</button>`,rows:s}}function dl(e,n,t){const r=`project:${e.root}`,s=t.findIndex(f=>f.root===e.root),i=f=>{const h=t[s+f],v=h?.user?.order??s+f;return`<button data-act="project-move" data-root="${l(e.root)}" data-order="${v}" type="button" aria-label="${a(f===-1?"panel.render.moveProjectUp":"panel.render.moveProjectDown")}"${h===void 0?" disabled":""}>${f===-1?"▲":"▼"}</button>`},o=ae(e),c=n.taskMenuOpen===r,p=`<button data-act="project-archive" data-key="${l(r)}" data-value="${!o}" type="button">${a(o?"panel.render.restoreProject":"panel.render.archiveProject")}</button>`,u=e.presence==="remembered"&&e.sessions.length===0?`<button data-act="project-forget" data-root="${l(e.root)}" type="button">${a("panel.render.forgetProject")}</button>`:"",m=o?`${p}${u}`:`<button class="task-menu-button" data-act="task-menu" data-key="${l(r)}" type="button" aria-label="${a("panel.render.projectMenu")}" aria-expanded="${c}">⋯</button>${c?`<div class="task-menu-actions">${p}${u}</div>`:""}`;return`<div class="project-organization">${o?"":`<div data-tip="${a("panel.render.projectPinSource")}"><button data-act="task-pin" data-key="${l(r)}" data-value="${!e.user?.pinned}" aria-pressed="${e.user?.pinned===!0}" type="button">${e.user?.pinned?a("panel.render.unpin"):a("panel.render.pin")}</button>${e.user?.pinned?i(-1)+i(1):""}</div>`}${m}${o&&e.archivedHasNewActivity?`<span class="project-source" data-tip="${a("panel.render.projectArchiveActivitySource")}">${a("panel.render.projectArchiveNewActivity")}</span>`:""}</div>${n.taskError?.key===r?`<div class="task-error" role="status">${l(n.taskError.message)}</div>`:""}`}function Sr(e){return[I(e.title.source),...e.title.suffix===void 0?[]:[I(e.title.suffix.source)],...(e.codexProjectNames??[]).map(n=>a("panel.render.codexProjectHint",{name:n}))].join(`
356
- `)}function en(e){return e.title.text+(e.title.suffix===void 0?"":` · ${e.title.suffix.text}`)}function wr(e){return e.harnesses.length===0?a("panel.render.noSessionsYet"):e.harnesses.map(n=>`<b class="task-badge">${l(R[n])}</b>`).join(" ")}function Tr(e,n){const t=e.firstScreen.lastActivity??e.lastSeen,r=t===void 0?"—":`${a("panel.render.recentActivityLabel")} ${he(t.at,n)}`,s=t===void 0?`${a("panel.render.noSessionActivityTimestampObserved")} · sessions.lastActivity`:`${I(t.source)} · ${t.at}`;return`<span class="project-row-time" data-tip="${a("panel.render.sourcePrefix")}${l(s)}">${l(r)}</span>`}function Zt(e,n,t,r){if("payloadUnavailable"in e)return ea(e,n,t);const s=dl(e,n,r),i=$r(e,n);if(n.expandedProjects?.includes(e.root))return`<div class="project-shell"><div class="project-toolbar">${s}<button class="project-collapse" data-act="project-collapse" data-root="${l(e.root)}" aria-expanded="true" type="button">${a("panel.render.collapse")}</button></div>${ea(e,n,t)}</div>`;const o=n.projectRefreshFailed?`<div class="project-error" role="status" data-tip="${a("panel.render.sourceGETApiProjectsRequestOr")}">${a("panel.render.projectRefreshFailedShowingThePrevious")}</div>`:"",c=e.firstScreen,p=c.goal?.text??a("panel.render.noProjectGoalProvided"),u=c.currentPoints.length===0?tn(e.currentPointEmptyText??a("panel.render.thePlanHasNoStepMarked"),e.currentPointEmptyTextI18n):c.currentPoints.map(k=>k.text).join(" · "),m=c.currentPoints.length===0?I(c.source):c.currentPoints.map(k=>`${k.path.join(" → ")} · ${I(k.source)}`).join(`
357
- `),f={no_plan:a("panel.render.noPlanFile"),plan_unavailable:a("panel.render.cannotReadPlanFile"),feedback_unavailable:a("panel.render.cannotSeeRequests")},h={decision:a("panel.render.waitingForYourDecision"),checkpoint:a("panel.render.thePlanNeedsYourReview"),in_progress:a("panel.render.projectInProgress"),ended:a("panel.render.projectEnded"),insufficient:c.action.kind==="insufficient"?f[c.action.reason]:""},v=e.plan.availability==="unavailable"&&c.action.kind!=="decision"&&c.action.kind!=="checkpoint",y=!v&&e.sessions.every(k=>k.ended)&&c.action.kind!=="decision"&&c.action.kind!=="checkpoint"&&!(c.action.kind==="insufficient"&&c.action.reason==="plan_unavailable"),w=v?a("panel.render.cannotReadPlanFile"):y?a("panel.render.projectPaused"):h[c.action.kind],g=v&&e.plan.availability==="unavailable"?`${e.plan.reason} · ${a("panel.render.sourcePrefix")}plan.availability=unavailable; plan.reason`:`${y?`${h[c.action.kind]} · `:""}${a("panel.render.sourcePrefix")}${I(c.action.source)}`;return`<section class="project-card compact" id="${vn(e.root)}" data-project-root="${l(e.root)}"><div class="project-row-layout"><div class="project-row" data-act="project-expand" data-root="${l(e.root)}" role="button" tabindex="0" aria-expanded="false"><div class="project-row-identity"><span class="project-row-name" data-tip="${l(en(e))} · ${a("panel.render.sourcePrefix")}${l(Sr(e))}">${l(en(e))}</span><span class="project-row-harnesses" data-tip="${a("panel.render.sourcePrefix")}harnesses / sessions.harness">${wr(e)}</span></div><span class="project-row-goal" title="${l(p)}" data-tip="${l(p)} · ${a("panel.render.sourcePrefix")}${l(I(c.goal?.source??c.source))}">${l(p)}</span><span class="project-row-task" data-tip="${l(u)} · ${a("panel.render.sourcePrefix")}${l(m)}">${l(u)}</span><span class="project-row-action" data-kind="${c.action.kind}"${y?' data-paused="true"':""} data-tip="${l(g)}">${w}</span>${Tr(e,t)}</div><div class="project-row-actions">${s}${i.toggle}</div></div>${i.rows===""?"":`<div class="project-archived-sessions"><div class="session-archived">${i.rows}</div></div>`}${o}</section>`}function ea(e,n,t){const r=n.projectRefreshFailed?`<div class="project-error" role="status" data-tip="${a("panel.render.sourceGETApiProjectsRequestOr")}">${a("panel.render.projectRefreshFailedShowingThePrevious")}</div>`:"";if("payloadUnavailable"in e)return`<section class="project-card unavailable" id="${vn(e.root)}" data-project-root="${l(e.root)}"><div class="project-title">${l(en(e))}</div><div class="project-error">${a("panel.render.projectDataUnavailable")}</div></section>`;const s=$r(e,n);e={...e,sessions:e.sessions.filter(x=>!be(x.harness,x.id,{projects:[e]}))};const i=e.firstScreen,o=`<div class="project-card-head"><span class="project-title" data-tip="${a("panel.render.sourcePrefix")}${l(Sr(e))}">${l(en(e))}</span><span class="project-harnesses" data-tip="${a("panel.render.sourcePrefix")}harnesses / sessions.harness">${wr(e)}</span>${Tr(e,t)}</div>`,c=`<div class="project-goal" data-tip="${a("panel.render.sourcePrefix")}${l(I(i.goal?.source??i.source))}"><span class="project-label">${a("panel.render.goal")}</span>${i.goal===void 0?a("panel.render.noProjectGoalProvided"):`<span${V(`${e.root}:goal`,n)}>${l(i.goal.text)}</span>${G(`${e.root}:goal`,n)}`}</div>`,p=e.sessions.length>0?a("panel.render.noSessionActivityTimestampObserved"):e.seenSinceStart?a("panel.render.noActiveSessionThisProjectS"):a("panel.render.noActiveSessionWingmanHasReceived"),u=i.lastActivity??e.lastSeen,m=u===void 0?`<span class="project-presence" data-tip="${a("panel.render.sourcePrefix")}${l(I(i.source))}; sessions.lastActivity / seenSinceStart">${p}</span>`:"harness"in u?`<span data-tip="${a("panel.render.timestamp")}${l(u.at)} ${a("panel.render.sourceSeparator")}${l(I(u.source))} · ${l(a("panel.render.sessionIdentifier",{id:u.sessionId}))} ${a("panel.render.titleSource")}${l(I(u.labelSource))}">${l(he(u.at,t))} · ${R[u.harness]} · <span${V(`${e.root}:activity-label`,n)}>${l(u.label)}</span>${G(`${e.root}:activity-label`,n)}</span>`:`<span data-tip="${a("panel.render.sourcePrefix")}${l(I(u.source))} · ${l(u.at)} · ${l(p)}">${l(he(u.at,t))}</span>`,f=e.plan.availability==="unavailable"?`<div class="project-error" data-tip="${a("panel.render.sourcePlanAvailabilityReasonLine")}">${a("panel.render.planUnavailable")}${l(e.plan.reason)}${e.plan.line===void 0?"":a("panel.render.line",{p0:String(e.plan.line)})}</div>`:"",h=e.sessions.length>0&&e.sessions.every(x=>x.feedback?.state==="unavailable")?`<div class="project-error" data-tip="${a("panel.render.sourceSessionsFeedbackState")}">${a("panel.render.feedbackSignalsAreNotConnectedOr")}</div>`:"",v=e.plan.availability==="missing"?[...new Set(e.sessions.map(x=>x.harness))].filter(x=>ge(x,n)!==void 0).map(x=>x!=="dsh"&&ge(x,n)==="outdated"?Oe(x,e.root,n,a("panel.render.update")):`<button class="project-protocol-copy" data-act="goto-protocol-banner" data-harness="${x}" data-root="${l(e.root)}" data-tip="${l(Ie(x))}" type="button">${R[x]} ${a("panel.render.viewPlanProtocol")}</button>`).join(""):"",y=`<div class="project-progress"><div><span class="project-label">${a("panel.render.currentBranch")}</span>${i.branch.length===0?`<span data-tip="${a("panel.render.sourcePrefix")}${l(I(i.source))}">${a("panel.render.noCurrentBranchProvided")}</span>`:il(e,n)}</div><div><span class="project-label">${a("panel.render.currentTaskLabel")}</span>${i.currentPoints.length>1?`<span class="project-source" data-tip="${a("panel.render.sourceFirstScreenCurrentPointsLength")}">${a("panel.render.parallel")} ${i.currentPoints.length} ${a("panel.render.items")}</span>`:""}${i.currentPoints.length===0?`<span data-tip="${a("panel.render.sourcePrefix")}${l(I(i.source))}">${l(tn(e.currentPointEmptyText??a("panel.render.thePlanHasNoStepMarked"),e.currentPointEmptyTextI18n))}</span>${v}`:ol(e,n)}</div><div><span class="project-label">${a("panel.render.recentActivityLabel")}</span>${m}</div></div>`,w=e.sessions.filter(x=>x.attachedTo===void 0),g=e.plan.availability==="unavailable"?e.plan.lastGood:void 0;let k;e.plan.availability==="available"?k=`<div class="project-section">${al(e,n,t)}</div><div class="project-section"><div class="project-label">${a("panel.render.sessionsNotLinkedToAStep")}</div>${Qt(w,`${e.root}:__unassigned`,n,t)}</div>`:k=`${g===void 0?"":`<div class="project-last-good"><div class="project-label" data-tip="${a("panel.render.sourcePlanLastGood")}">${a("panel.render.lastReadableVersion")}</div><ul class="project-tree">${g.nodes.map(te=>Ot(e,te,n,t)).join("")}</ul></div>`}<div class="project-section"><div class="project-label">${a("panel.render.projectSessions")}</div>${Qt(e.sessions,`${e.root}:__all`,n,t)}</div>`;const S=e.counts,A=`<div class="project-counts" data-tip="${a("panel.render.sourceWingmanPlanMdLeafCounts")}">${a("panel.render.agentUserMarksPending")} ${S.pending} ${a("panel.render.inProgressCount")} ${S.inProgress} ${a("panel.render.complete")} ${S.completed} ${a("panel.render.cancelledCount")} ${S.cancelled} ${a("panel.render.checkpointCount")} ${S.checkpoint}</div>`,P=e.completionLabel?`<div class="project-complete" data-tip="${a("panel.render.sourceCompletionLabel")}">${l(e.completionLabel)}</div>`:"",F=e.plan.availability==="available"&&e.plan.ignoredLineCount>0?`<span class="muted" data-tip="${l(e.plan.ignoredLines.map(x=>a("panel.render.ignoredLine",{p0:String(x.line),p1:String(x.preview)})).join(`
358
- `))}"> ${a("panel.render.ignored")} ${e.plan.ignoredLineCount} ${a("panel.render.lineSuffix")}</span>`:"",E=e.plan.availability==="available"&&e.plan.higherPlanPaths.length>0?`<div class="project-facts" data-tip="${a("panel.render.sourcePlanHigherPlanPaths")}">${a("panel.render.planFilesAlsoExistAbove")}${e.plan.higherPlanPaths.map(l).join(" · ")}</div>`:"",K=e.checkpoints.length===0?"":`<div class="project-checkpoints">${e.checkpoints.map(x=>`<div class="project-checkpoint" data-tip="${l(x.path.join(" → "))}"${V(`${e.root}:checkpoint:${x.key}`,n)}>${l(x.path.join(" → "))}</div>${G(`${e.root}:checkpoint:${x.key}`,n)}`).join("")}</div>`,C=w.map(x=>{const te=x.worktreePlanDiffers===!0;return`<div class="project-facts" data-tip="${a("panel.render.sourceSessionsUnattachedReason")}${te?` · ${l(x.unattachedReason??"")}`:""}">${R[x.harness]} · ${l(x.title.text)} ${a("panel.render.notLinked")}${l(te?a("panel.render.notLinkedToAStep"):x.unattachedReason??a("panel.render.notLinkedToAStep"))}</div>`}).join(""),z=g===void 0?"":`<div class="project-meta" data-tip="${a("panel.render.sourcePlanLastGoodRevisionMtime")}">${a("panel.render.lastReadableVersionRevision")} ${g.revision} · ${l(g.mtime)}</div>`,re=`<details class="project-tech"><summary>${a("panel.render.connectionsAndProtocolPlanSourceAnd")}</summary><code class="project-root" data-tip="${a("panel.render.sourceProjectRoot")}">${l(e.root)}</code>${el(e,n)}<div class="project-meta" data-tip="${a("panel.render.sourceRevisionMtimeLastWriter")}">${rl(e)}</div>${z}${F}${K}${A}${P}${sl(e,n)}${E}${C}</details>`;return`<section class="project-card${e.plan.availability==="available"?"":` ${e.plan.availability}`}" id="${vn(e.root)}" data-project-root="${l(e.root)}">${o}${c}${r}${f}${h}${ll(e,n)}${y}${k}${re}${s.toggle===""?"":`<div class="project-archived-sessions"><div class="session-archived">${s.toggle}${s.rows}</div></div>`}</section>`}function cl(e){const n=[["all",a("panel.render.all")],["cc",R.cc],["codex",R.codex],["dsh",R.dsh]],t=[["all",a("panel.render.all")],["waiting",a("panel.render.waitingForYouLabel")],["turnEnded",a("panel.render.turnEnded")],["active",a("panel.render.inProgress")],["ended",a("panel.render.ended")]],r=(i,o,c)=>c.map(([p,u])=>`<button class="task-filter-chip${o===p?" act":""}" data-act="task-filter" data-kind="${i}" data-value="${p}"${i==="harness"?` data-tip="${a("panel.render.filterBySessionHarness")}"`:""} type="button" aria-pressed="${o===p}">${l(u)}</button>`).join(""),s=(i,o)=>`<div class="task-filter-group"><span class="task-filter-label">${i}</span><div class="task-filter-chips">${o}</div></div>`;return`<div class="task-filters">${s(a("panel.render.appFilter"),r("harness",e.harness,n))}${s(a("panel.render.status"),r("status",e.status,t))}</div>`}function Mt(e,n){return`<header class="page-heading"><h2>${l(e)}</h2><p>${l(n)}</p></header>`}function pl(e,n=ve,t=Date.now(),r={...Ct,taskFilter:n}){const s=qs(r.mobile);if(e===null)return`<div class="projects-empty"${r.projectRefreshFailed?a("panel.render.dataTipSourceGETApiProjects"):""}>${r.projectRefreshFailed?a("panel.render.projectRefreshFailedProjectDataIs"):a("panel.render.projectDataIsUnavailable")}</div>${s}`;const i=e.memory===void 0||r.projectMemoryDismissed?"":`<div class="project-memory-warning" role="status"><span>${l(e.memory.unavailable)}</span><button data-act="project-memory-dismiss" type="button" aria-label="${a("panel.render.dismissProjectMemoryNotice")}">${a("panel.render.close")}</button></div>`;if(e.projects.length===0)return`${i}<div class="projects-empty"${r.projectRefreshFailed?a("panel.render.dataTipSourceGETApiProjects"):""}>${r.projectRefreshFailed?a("panel.render.projectRefreshFailedShowingThePreviousResponse"):a("panel.render.noSessionWithAWorkingDirectory")}</div>${s}`;const o=e.projects.filter(ae),c=e.projects.filter(S=>!ae(S)),p=ht(c,n),u=c.length-p.length,m={...r,projects:e,taskFilter:n},f=u===0?"":`<div class="task-filter-summary" data-tip="${a("panel.render.projectFilterSource")}">${a("panel.render.projectsHiddenByFilters",{count:u})}</div>`,h=mn(p,m.projectOrder),v=mn(e.projects).filter(S=>!("payloadUnavailable"in S)&&S.user?.pinned===!0),y=h.filter(S=>!("payloadUnavailable"in S)),w=y.length>0&&y.every(S=>m.expandedProjects?.includes(S.root)),g=y.length===0?"":`<button class="projects-toggle" data-act="projects-toggle" type="button">${a(w?"panel.render.collapseAllProjects":"panel.render.expandAllProjects")}</button>`,k=o.length===0?"":`<div class="project-archived"><button class="task-hidden-toggle" data-act="project-archived-toggle" type="button" aria-expanded="${m.archivedProjectsOpen===!0}" data-tip="${a("panel.render.projectArchiveSource")}">${a("panel.render.archivedProjects",{count:o.length})}</button>${m.archivedProjectsOpen?o.map(S=>Zt(S,m,t,v)).join(""):""}</div>`;return`${Mt(a("panel.render.projectsPageTitle"),a("panel.render.projectsPageHint"))}${i}<div class="projects-tools">${cl(n)}${g}</div>${f}<div class="projects">${h.map(S=>Zt(S,m,t,v)).join("")}</div>${k}${s}`}function ul(e,n,t,r,s,i=n.harness,o=null,c=Date.parse(s.now),p=!1){r?.tier==="free"&&(t={...t,entries:t.entries.filter(A=>!ce(A.event.harness,r))}),s={...s,anatomy:e,projects:o??s.projects};const u=s.narrative;u&&(be(u.harness,u.sessionId??"",s.projects)||s.sessions.some(A=>A.id===u.sessionId&&A.archived))&&(s={...s,narrative:null,selectedSession:null});const m=i==="projects",f=n.__mock_note?`<span class="badge" data-tip="${l(n.__mock_note)}">${a("panel.render.mockDemoData")}</span>`:"",h=s.narrative,v=h&&Ja(h)?Ii(h,s):"",y=v==="",w=Ti(n,s),g=n.planProtocol?.user===void 0?"":`<div class="protocol-link"><button type="button" data-act="goto-protocol-banner" data-harness="${n.harness}">${a("panel.render.planDisplaySettings")}</button></div>`,k=Ia(r),S=k==="grace"||k==="expired"||k==="free"&&r?.freeHarnessSwitchableAt!==void 0;return{top:`<div class="head">
358
+ ${a("panel.render.pendingTask")}</pre></details>`:t.reason==="feedback_unavailable"&&(o=[...new Set(e.sessions.map(c=>c.harness))].map(c=>{const p=Ze(c,n.wingmanVersion);return`<button class="project-protocol-copy" data-act="protocol-copy" data-command="${l(p)}" data-tip="${l(p)}" type="button">${a("panel.render.connectFeedbackSignals")} ${E[c]}</button>`}).join("")),r=`<div class="project-action-title">${a("panel.render.notEnoughInformation")}${s[t.reason]}</div>${o}`}return`<section class="project-action" data-kind="${t.kind}" data-tip="${a("panel.render.sourcePrefix")}${l(C(t.source))}">${r}</section>`}function xr(e,n){const t=e.sessions.filter(o=>ye(o.harness,o.id,{projects:[e]}));if(t.length===0)return{toggle:"",rows:""};const r=n.archivedSessionsOpen?.includes(e.root)===!0,s=r?t.map(o=>{const i=Ft(o),c=re(e)?e:void 0,p=c!==void 0?`<button data-act="project-archive" data-key="project:${l(c.root)}" data-value="false" type="button">${a("panel.render.restoreProject")}</button>`:`<button data-act="task-archive" data-key="${l(i)}" data-value="false" type="button">${a("panel.render.restoreSession")}</button>`,u=o.archivedHasNewActivity||c!==void 0&&c.user?.archivedAt!==void 0&&o.lastActivity!==void 0&&Date.parse(o.lastActivity)>Date.parse(c.user.archivedAt);return`<div class="session-archived-row" data-session="${l(o.id)}"><span>${l(E[o.harness])} · ${l(Ne(o).text)}</span>${u?`<span class="project-source" data-tip="${a("panel.render.sessionArchiveActivitySource")}">${a("panel.render.projectArchiveNewActivity")}</span>`:""}${p}${n.taskError?.key===i?`<div class="task-error" role="status">${l(n.taskError.message)}</div>`:""}</div>`}).join(""):"";return{toggle:`<button class="task-hidden-toggle" data-act="session-archived-toggle" data-root="${l(e.root)}" type="button" aria-expanded="${r}" data-tip="${a("panel.render.sessionArchiveSource")}">${a("panel.render.archivedSessions",{count:t.length})}</button>`,rows:s}}function vl(e,n,t){const r=`project:${e.root}`,s=t.findIndex(f=>f.root===e.root),o=f=>{const h=t[s+f],v=h?.user?.order??s+f;return`<button data-act="project-move" data-root="${l(e.root)}" data-order="${v}" type="button" aria-label="${a(f===-1?"panel.render.moveProjectUp":"panel.render.moveProjectDown")}"${h===void 0?" disabled":""}>${f===-1?"▲":"▼"}</button>`},i=re(e),c=n.taskMenuOpen===r,p=`<button data-act="project-archive" data-key="${l(r)}" data-value="${!i}" type="button">${a(i?"panel.render.restoreProject":"panel.render.archiveProject")}</button>`,u=e.presence==="remembered"&&e.sessions.length===0?`<button data-act="project-forget" data-root="${l(e.root)}" type="button">${a("panel.render.forgetProject")}</button>`:"",m=i?`${p}${u}`:`<button class="task-menu-button" data-act="task-menu" data-key="${l(r)}" type="button" aria-label="${a("panel.render.projectMenu")}" aria-expanded="${c}">⋯</button>${c?`<div class="task-menu-actions">${p}${u}</div>`:""}`;return`<div class="project-organization">${i?"":`<div data-tip="${a("panel.render.projectPinSource")}"><button data-act="task-pin" data-key="${l(r)}" data-value="${!e.user?.pinned}" aria-pressed="${e.user?.pinned===!0}" type="button">${e.user?.pinned?a("panel.render.unpin"):a("panel.render.pin")}</button>${e.user?.pinned?o(-1)+o(1):""}</div>`}${m}${i&&e.archivedHasNewActivity?`<span class="project-source" data-tip="${a("panel.render.projectArchiveActivitySource")}">${a("panel.render.projectArchiveNewActivity")}</span>`:""}</div>${n.taskError?.key===r?`<div class="task-error" role="status">${l(n.taskError.message)}</div>`:""}`}function Cr(e){return[C(e.title.source),...e.title.suffix===void 0?[]:[C(e.title.suffix.source)],...(e.codexProjectNames??[]).map(n=>a("panel.render.codexProjectHint",{name:n}))].join(`
359
+ `)}function en(e){return e.title.text+(e.title.suffix===void 0?"":` · ${e.title.suffix.text}`)}function Ir(e){return e.harnesses.length===0?a("panel.render.noSessionsYet"):e.harnesses.map(n=>`<b class="task-badge">${l(E[n])}</b>`).join(" ")}function Rr(e,n){const t=e.firstScreen.lastActivity??e.lastSeen,r=t===void 0?"—":`${a("panel.render.recentActivityLabel")} ${ve(t.at,n)}`,s=t===void 0?`${a("panel.render.noSessionActivityTimestampObserved")} · sessions.lastActivity`:`${C(t.source)} · ${t.at}`;return`<span class="project-row-time" data-tip="${a("panel.render.sourcePrefix")}${l(s)}">${l(r)}</span>`}function aa(e,n,t,r){if("payloadUnavailable"in e)return ra(e,n,t);const s=vl(e,n,r),o=xr(e,n);if(n.expandedProjects?.includes(e.root))return`<div class="project-shell"><div class="project-toolbar">${s}<button class="project-collapse" data-act="project-collapse" data-root="${l(e.root)}" aria-expanded="true" type="button">${a("panel.render.collapse")}</button></div>${ra(e,n,t)}</div>`;const i=n.projectRefreshFailed?`<div class="project-error" role="status" data-tip="${a("panel.render.sourceGETApiProjectsRequestOr")}">${a("panel.render.projectRefreshFailedShowingThePrevious")}</div>`:"",c=e.firstScreen,p=c.goal?.text??a("panel.render.noProjectGoalProvided"),u=c.currentPoints.length===0?tn(e.currentPointEmptyText??a("panel.render.thePlanHasNoStepMarked"),e.currentPointEmptyTextI18n):c.currentPoints.map(k=>k.text).join(" · "),m=c.currentPoints.length===0?C(c.source):c.currentPoints.map(k=>`${k.path.join(" → ")} · ${C(k.source)}`).join(`
360
+ `),f={no_plan:a("panel.render.noPlanFile"),plan_unavailable:a("panel.render.cannotReadPlanFile"),feedback_unavailable:a("panel.render.cannotSeeRequests")},h={decision:a("panel.render.waitingForYourDecision"),checkpoint:a("panel.render.thePlanNeedsYourReview"),in_progress:a("panel.render.projectInProgress"),ended:a("panel.render.projectEnded"),insufficient:c.action.kind==="insufficient"?f[c.action.reason]:""},v=e.plan.availability==="unavailable"&&c.action.kind!=="decision"&&c.action.kind!=="checkpoint",y=!v&&e.sessions.every(k=>k.ended)&&c.action.kind!=="decision"&&c.action.kind!=="checkpoint"&&!(c.action.kind==="insufficient"&&c.action.reason==="plan_unavailable"),$=v?a("panel.render.cannotReadPlanFile"):y?a("panel.render.projectPaused"):h[c.action.kind],g=v&&e.plan.availability==="unavailable"?`${e.plan.reason} · ${a("panel.render.sourcePrefix")}plan.availability=unavailable; plan.reason`:`${y?`${h[c.action.kind]} · `:""}${a("panel.render.sourcePrefix")}${C(c.action.source)}`;return`<section class="project-card compact" id="${vn(e.root)}" data-project-root="${l(e.root)}"><div class="project-row-layout"><div class="project-row" data-act="project-expand" data-root="${l(e.root)}" role="button" tabindex="0" aria-expanded="false"><div class="project-row-identity"><span class="project-row-name" data-tip="${l(en(e))} · ${a("panel.render.sourcePrefix")}${l(Cr(e))}">${l(en(e))}</span><span class="project-row-harnesses" data-tip="${a("panel.render.sourcePrefix")}harnesses / sessions.harness">${Ir(e)}</span></div><span class="project-row-goal" title="${l(p)}" data-tip="${l(p)} · ${a("panel.render.sourcePrefix")}${l(C(c.goal?.source??c.source))}">${l(p)}</span><span class="project-row-task" data-tip="${l(u)} · ${a("panel.render.sourcePrefix")}${l(m)}">${l(u)}</span><span class="project-row-action" data-kind="${c.action.kind}"${y?' data-paused="true"':""} data-tip="${l(g)}">${$}</span>${Rr(e,t)}</div><div class="project-row-actions">${s}${o.toggle}</div></div>${o.rows===""?"":`<div class="project-archived-sessions"><div class="session-archived">${o.rows}</div></div>`}${i}</section>`}function ra(e,n,t){const r=n.projectRefreshFailed?`<div class="project-error" role="status" data-tip="${a("panel.render.sourceGETApiProjectsRequestOr")}">${a("panel.render.projectRefreshFailedShowingThePrevious")}</div>`:"";if("payloadUnavailable"in e)return`<section class="project-card unavailable" id="${vn(e.root)}" data-project-root="${l(e.root)}"><div class="project-title">${l(en(e))}</div><div class="project-error">${a("panel.render.projectDataUnavailable")}</div></section>`;const s=xr(e,n);e={...e,sessions:e.sessions.filter(I=>!ye(I.harness,I.id,{projects:[e]}))};const o=e.firstScreen,i=`<div class="project-card-head"><span class="project-title" data-tip="${a("panel.render.sourcePrefix")}${l(Cr(e))}">${l(en(e))}</span><span class="project-harnesses" data-tip="${a("panel.render.sourcePrefix")}harnesses / sessions.harness">${Ir(e)}</span>${Rr(e,t)}</div>`,c=`<div class="project-goal" data-tip="${a("panel.render.sourcePrefix")}${l(C(o.goal?.source??o.source))}"><span class="project-label">${a("panel.render.goal")}</span>${o.goal===void 0?a("panel.render.noProjectGoalProvided"):`<span${V(`${e.root}:goal`,n)}>${l(o.goal.text)}</span>${G(`${e.root}:goal`,n)}`}</div>`,p=e.sessions.length>0?a("panel.render.noSessionActivityTimestampObserved"):e.seenSinceStart?a("panel.render.noActiveSessionThisProjectS"):a("panel.render.noActiveSessionWingmanHasReceived"),u=o.lastActivity??e.lastSeen,m=u===void 0?`<span class="project-presence" data-tip="${a("panel.render.sourcePrefix")}${l(C(o.source))}; sessions.lastActivity / seenSinceStart">${p}</span>`:"harness"in u?`<span data-tip="${a("panel.render.timestamp")}${l(u.at)} ${a("panel.render.sourceSeparator")}${l(C(u.source))} · ${l(a("panel.render.sessionIdentifier",{id:u.sessionId}))} ${a("panel.render.titleSource")}${l(C(u.labelSource))}">${l(ve(u.at,t))} · ${E[u.harness]} · <span${V(`${e.root}:activity-label`,n)}>${l(u.label)}</span>${G(`${e.root}:activity-label`,n)}</span>`:`<span data-tip="${a("panel.render.sourcePrefix")}${l(C(u.source))} · ${l(u.at)} · ${l(p)}">${l(ve(u.at,t))}</span>`,f=e.plan.availability==="unavailable"?`<div class="project-error" data-tip="${a("panel.render.sourcePlanAvailabilityReasonLine")}">${a("panel.render.planUnavailable")}${l(e.plan.reason)}${e.plan.line===void 0?"":a("panel.render.line",{p0:String(e.plan.line)})}</div>`:"",h=e.sessions.length>0&&e.sessions.every(I=>I.feedback?.state==="unavailable")?`<div class="project-error" data-tip="${a("panel.render.sourceSessionsFeedbackState")}">${a("panel.render.feedbackSignalsAreNotConnectedOr")}</div>`:"",v=e.plan.availability==="missing"?[...new Set(e.sessions.map(I=>I.harness))].filter(I=>he(I,n)!==void 0).map(I=>I!=="dsh"&&he(I,n)==="outdated"?Oe(I,e.root,n,a("panel.render.update")):`<button class="project-protocol-copy" data-act="goto-protocol-banner" data-harness="${I}" data-root="${l(e.root)}" data-tip="${l(Ie(I))}" type="button">${E[I]} ${a("panel.render.viewPlanProtocol")}</button>`).join(""):"",y=`<div class="project-progress"><div><span class="project-label">${a("panel.render.currentBranch")}</span>${o.branch.length===0?`<span data-tip="${a("panel.render.sourcePrefix")}${l(C(o.source))}">${a("panel.render.noCurrentBranchProvided")}</span>`:gl(e,n)}</div><div><span class="project-label">${a("panel.render.currentTaskLabel")}</span>${o.currentPoints.length>1?`<span class="project-source" data-tip="${a("panel.render.sourceFirstScreenCurrentPointsLength")}">${a("panel.render.parallel")} ${o.currentPoints.length} ${a("panel.render.items")}</span>`:""}${o.currentPoints.length===0?`<span data-tip="${a("panel.render.sourcePrefix")}${l(C(o.source))}">${l(tn(e.currentPointEmptyText??a("panel.render.thePlanHasNoStepMarked"),e.currentPointEmptyTextI18n))}</span>${v}`:ml(e,n)}</div><div><span class="project-label">${a("panel.render.recentActivityLabel")}</span>${m}</div></div>`,$=e.sessions.filter(I=>I.attachedTo===void 0),g=e.plan.availability==="unavailable"?e.plan.lastGood:void 0;let k;e.plan.availability==="available"?k=`<div class="project-section">${pl(e,n,t)}</div><div class="project-section"><div class="project-label">${a("panel.render.sessionsNotLinkedToAStep")}</div>${na($,`${e.root}:__unassigned`,n,t)}</div>`:k=`${g===void 0?"":`<div class="project-last-good"><div class="project-label" data-tip="${a("panel.render.sourcePlanLastGood")}">${a("panel.render.lastReadableVersion")}</div><ul class="project-tree">${g.nodes.map(Y=>Dt(e,Y,n,t)).join("")}</ul></div>`}<div class="project-section"><div class="project-label">${a("panel.render.projectSessions")}</div>${na(e.sessions,`${e.root}:__all`,n,t)}</div>`;const S=e.counts,A=`<div class="project-counts" data-tip="${a("panel.render.sourceWingmanPlanMdLeafCounts")}">${a("panel.render.agentUserMarksPending")} ${S.pending} ${a("panel.render.inProgressCount")} ${S.inProgress} ${a("panel.render.complete")} ${S.completed} ${a("panel.render.cancelledCount")} ${S.cancelled} ${a("panel.render.checkpointCount")} ${S.checkpoint}</div>`,P=e.completionLabel?`<div class="project-complete" data-tip="${a("panel.render.sourceCompletionLabel")}">${l(e.completionLabel)}</div>`:"",F=e.plan.availability==="available"&&e.plan.ignoredLineCount>0?`<span class="muted" data-tip="${l(e.plan.ignoredLines.map(I=>a("panel.render.ignoredLine",{p0:String(I.line),p1:String(I.preview)})).join(`
361
+ `))}"> ${a("panel.render.ignored")} ${e.plan.ignoredLineCount} ${a("panel.render.lineSuffix")}</span>`:"",j=e.plan.availability==="available"&&e.plan.higherPlanPaths.length>0?`<div class="project-facts" data-tip="${a("panel.render.sourcePlanHigherPlanPaths")}">${a("panel.render.planFilesAlsoExistAbove")}${e.plan.higherPlanPaths.map(l).join(" · ")}</div>`:"",K=e.checkpoints.length===0?"":`<div class="project-checkpoints">${e.checkpoints.map(I=>`<div class="project-checkpoint" data-tip="${l(I.path.join(" → "))}"${V(`${e.root}:checkpoint:${I.key}`,n)}>${l(I.path.join(" → "))}</div>${G(`${e.root}:checkpoint:${I.key}`,n)}`).join("")}</div>`,x=$.map(I=>{const Y=I.worktreePlanDiffers===!0;return`<div class="project-facts" data-tip="${a("panel.render.sourceSessionsUnattachedReason")}${Y?` · ${l(I.unattachedReason??"")}`:""}">${E[I.harness]} · ${l(I.title.text)} ${a("panel.render.notLinked")}${l(Y?a("panel.render.notLinkedToAStep"):I.unattachedReason??a("panel.render.notLinkedToAStep"))}</div>`}).join(""),X=g===void 0?"":`<div class="project-meta" data-tip="${a("panel.render.sourcePlanLastGoodRevisionMtime")}">${a("panel.render.lastReadableVersionRevision")} ${g.revision} · ${l(g.mtime)}</div>`,le=`<details class="project-tech"><summary>${a("panel.render.connectionsAndProtocolPlanSourceAnd")}</summary><code class="project-root" data-tip="${a("panel.render.sourceProjectRoot")}">${l(e.root)}</code>${ll(e,n)}<div class="project-meta" data-tip="${a("panel.render.sourceRevisionMtimeLastWriter")}">${ul(e)}</div>${X}${F}${K}${A}${P}${fl(e,n)}${j}${x}</details>`;return`<section class="project-card${e.plan.availability==="available"?"":` ${e.plan.availability}`}" id="${vn(e.root)}" data-project-root="${l(e.root)}">${i}${c}${r}${f}${h}${hl(e,n)}${y}${k}${le}${s.toggle===""?"":`<div class="project-archived-sessions"><div class="session-archived">${s.toggle}${s.rows}</div></div>`}</section>`}function bl(e){const n=[["all",a("panel.render.all")],["cc",E.cc],["codex",E.codex],["dsh",E.dsh]],t=[["all",a("panel.render.all")],["waiting",a("panel.render.waitingForYouLabel")],["turnEnded",a("panel.render.turnEnded")],["active",a("panel.render.inProgress")],["ended",a("panel.render.ended")]],r=(o,i,c)=>c.map(([p,u])=>`<button class="task-filter-chip${i===p?" act":""}" data-act="task-filter" data-kind="${o}" data-value="${p}"${o==="harness"?` data-tip="${a("panel.render.filterBySessionHarness")}"`:""} type="button" aria-pressed="${i===p}">${l(u)}</button>`).join(""),s=(o,i)=>`<div class="task-filter-group"><span class="task-filter-label">${o}</span><div class="task-filter-chips">${i}</div></div>`;return`<div class="task-filters">${s(a("panel.render.appFilter"),r("harness",e.harness,n))}${s(a("panel.render.status"),r("status",e.status,t))}</div>`}function Wt(e,n){return`<header class="page-heading"><h2>${l(e)}</h2><p>${l(n)}</p></header>`}function yl(e,n=be,t=Date.now(),r={...jt,taskFilter:n}){const s=zs(r.mobile);if(e===null)return`<div class="projects-empty"${r.projectRefreshFailed?a("panel.render.dataTipSourceGETApiProjects"):""}>${r.projectRefreshFailed?a("panel.render.projectRefreshFailedProjectDataIs"):a("panel.render.projectDataIsUnavailable")}</div>${s}`;const o=e.memory===void 0||r.projectMemoryDismissed?"":`<div class="project-memory-warning" role="status"><span>${l(e.memory.unavailable)}</span><button data-act="project-memory-dismiss" type="button" aria-label="${a("panel.render.dismissProjectMemoryNotice")}">${a("panel.render.close")}</button></div>`;if(e.projects.length===0)return`${o}<div class="projects-empty"${r.projectRefreshFailed?a("panel.render.dataTipSourceGETApiProjects"):""}>${r.projectRefreshFailed?a("panel.render.projectRefreshFailedShowingThePreviousResponse"):a("panel.render.noSessionWithAWorkingDirectory")}</div>${s}`;const i=e.projects.filter(re),c=e.projects.filter(S=>!re(S)),p=$t(c,n),u=c.length-p.length,m={...r,projects:e,taskFilter:n},f=u===0?"":`<div class="task-filter-summary" data-tip="${a("panel.render.projectFilterSource")}">${a("panel.render.projectsHiddenByFilters",{count:u})}</div>`,h=mn(p,m.projectOrder),v=mn(e.projects).filter(S=>!("payloadUnavailable"in S)&&S.user?.pinned===!0),y=h.filter(S=>!("payloadUnavailable"in S)),$=y.length>0&&y.every(S=>m.expandedProjects?.includes(S.root)),g=y.length===0?"":`<button class="projects-toggle" data-act="projects-toggle" type="button">${a($?"panel.render.collapseAllProjects":"panel.render.expandAllProjects")}</button>`,k=i.length===0?"":`<div class="project-archived"><button class="task-hidden-toggle" data-act="project-archived-toggle" type="button" aria-expanded="${m.archivedProjectsOpen===!0}" data-tip="${a("panel.render.projectArchiveSource")}">${a("panel.render.archivedProjects",{count:i.length})}</button>${m.archivedProjectsOpen?i.map(S=>aa(S,m,t,v)).join(""):""}</div>`;return`${Wt(a("panel.render.projectsPageTitle"),a("panel.render.projectsPageHint"))}${o}<div class="projects-tools">${bl(n)}${g}</div>${f}<div class="projects">${h.map(S=>aa(S,m,t,v)).join("")}</div>${k}${s}`}function kl(e,n,t,r,s,o=n.harness,i=null,c=Date.parse(s.now),p=!1){r?.tier==="free"&&(t={...t,entries:t.entries.filter(A=>!pe(A.event.harness,r))}),s={...s,anatomy:e,projects:i??s.projects};const u=s.narrative;u&&(ye(u.harness,u.sessionId??"",s.projects)||s.sessions.some(A=>A.id===u.sessionId&&A.archived))&&(s={...s,narrative:null,selectedSession:null});const m=o==="projects",f=n.__mock_note?`<span class="badge" data-tip="${l(n.__mock_note)}">${a("panel.render.mockDemoData")}</span>`:"",h=s.narrative,v=h&&Za(h)?Li(h,s):"",y=v==="",$=Ei(n,s),g=n.planProtocol?.user===void 0?"":`<div class="protocol-link"><button type="button" data-act="goto-protocol-banner" data-harness="${n.harness}">${a("panel.render.planDisplaySettings")}</button></div>`,k=Na(r),S=k==="grace"||k==="expired"||k==="free"&&r?.freeHarnessSwitchableAt!==void 0;return{top:`<div class="head">
359
362
  <span class="dot"></span>
360
363
  <span class="title">Wingman</span>
361
364
  ${m?"":f}
362
365
  ${s.showLocaleSelector===!1?"":`<select class="lang" data-act="lang" aria-label="${a("panel.render.language")}">${(s.availableLocales??oe()).map(({tag:A,nativeName:P})=>`<option value="${l(A)}"${A===Me()?" selected":""}>${l(P)}</option>`).join("")}</select>`}
363
366
  <button class="collapse" data-act="toggle">${a("panel.render.collapseArrow")}</button>
364
367
  </div>
365
- ${ui(r,c,e,p)}${ai(e,i,r)}`,sessions:m?"":`${$i(s,n.harness)}${Ai(s,n.harness)}${!y&&h?.taskWorkflow===void 0?dr(s,n.harness):""}`,now:m?"":v,viewTabs:m?"":Wi(s),tasks:Gi(n,s),rawEvents:(y?Yt(n,t,s):Ki(n,t,s))+(y&&s.view==="tasks"?w:y?"":g),control:Mt(a("panel.render.controls"),a("panel.render.controlsPageHint"))+li(n,s)+Pi(s,n.harness)+di(s)+(y&&s.view==="tasks"?"":w)+(y?"":Yt(n,t,s,!1)),billing:Yi(n,s,r),projects:r?.tier!=="free"&&(m||h?.taskWorkflow===void 0)?pl(o,s.taskFilter,c,s):"",bottom:`<div class="panel-footer">${S?"":`<div class="licfoot">${et("licfootlink")}</div>`}
366
- ${gr(n,s.expandedText)}</div>`}}function Ar(e){let n;const t=e.islandPick,r=kn(e).some(({harness:s,session:i})=>t?.harness===s&&t.id===i.id);for(const{harness:s,session:i}of ja(e))i.lastInstruction!==void 0&&(!n||Date.parse(i.lastInstruction)>Date.parse(n.at))&&(n={harness:s,id:i.id,at:i.lastInstruction});return{followTarget:n,pickAvailable:r}}function Wn(e,n,t,r){e.island&&(e.islandPick={harness:n,id:t,at:Ar(e).followTarget?.at??r})}function fl(e){if(!e.island)return;const{followTarget:n,pickAvailable:t}=Ar(e),r=e.islandPick;let s=n;return r&&t&&(!n||Date.parse(n.at)<=Date.parse(r.at))?s=r:delete e.islandPick,s?(e.islandApplied?.harness!==s.harness||e.islandApplied.id!==s.id||e.islandApplied.at!==s.at)&&(e.active=s.harness,e.sessionSel={...e.sessionSel,[s.harness]:s.id},e.islandApplied=s):delete e.islandApplied,s}function na(e,n,t,r){const s=ye(e.narratives?.[n]??null,e.projects??null),i=r??Te(s,e.sessionSel?.[n]);return{now:t,...e.mobile===void 0?{}:{mobile:e.mobile},wingmanVersion:e.wingmanVersion,availableLocales:e.availableLocales??oe(),showLocaleSelector:!e.island||e.open,view:e.view??Ct.view,narrative:s!==null&&i!==null?s.states[i]??null:null,projects:e.projects??null,anatomyLoadedAt:e.anatomyLoadedAt??null,anatomyRefreshFailed:e.anatomyRefreshFailed??!1,projectMemoryDismissed:e.projectMemoryDismissed??!1,projectRefreshFailed:e.projectRefreshFailed??!1,projectOrder:e.projectOrder??[],expandedProjects:e.expandedProjects??[],archivedProjectsOpen:e.archivedProjectsOpen??!1,archivedSessionsOpen:e.archivedSessionsOpen??[],oldSessionsOpen:e.oldSessionsOpen??[],expandedText:e.expandedText??{},protocolBannerHighlight:e.protocolBannerHighlight,protocolBannerProjectRoot:e.protocolBannerProjectRoot,startedAt:s?.startedAt??null,...s?.hooks===void 0?{}:{hooks:s.hooks},notices:s?.notices??[],noticeDismissed:e.noticeDismissed??{},sessions:s?.sessions??[],selectedSession:i,sessionSeen:e.sessionSeen??{},suggHidden:e.suggHidden??{},island:e.island??!1,todoOpen:e.todoOpen??{},nodeOpen:e.nodeOpen??{},evidenceOpen:e.evidenceOpen??!1,rawOpen:e.rawOpen??!1,taskFilter:e.taskFilter??ve,taskMenuOpen:e.taskMenuOpen??null,taskResumeOpen:e.taskResumeOpen??null,returnTargets:e.returnTargets??null,returnSettingsDismissed:e.returnSettingsDismissed??!1,returnTargetSaving:e.returnTargetSaving??!1,returnTargetError:e.returnTargetError??null,taskReturnResults:e.taskReturnResults??{},hiddenOpen:e.hiddenOpen??{},factsOpen:e.factsOpen??{},taskError:e.taskError??null}}function ml(e){const n=e.license??null,t=e.flow?pi(e.flow):"",r=e.tierLock&&n?.tier==="free"?mi(n):"",s=e.licenseOpen&&n?hi(n,Ca,e.licenseRefreshing??!1,e.licenseRefreshResult??null,e.licenseCanSubscribe??!1):"",i=e.importResult?gi(e.importResult):"",o=e.share?vi(e.share):"",c=e.forgetProject,p=c===void 0?"":`<div class="overlay project-forget-overlay"><div class="scrim"${c.busy?"":' data-act="project-forget-close"'}></div><div class="modal" role="dialog" aria-modal="true" aria-labelledby="project-forget-title" aria-describedby="project-forget-description"><div class="mhead"><span class="mtitle" id="project-forget-title">${a("panel.render.forgetProject")}</span></div><p class="mtext" id="project-forget-description">${a("panel.render.forgetProjectConfirm")}</p><div class="mact"><button class="btn ghost" data-act="project-forget-close" type="button"${c.busy?" disabled":""}>${a("panel.render.cancel")}</button><button class="btn primary" data-act="project-forget-confirm" type="button"${c.busy?" disabled":""}>${a("panel.render.forget")}</button></div></div></div>`;return`${t}${r}${s}${i}${o}${Gs(e.mobile)}${p}`}function ta(e,n,t){const r=new Date(n).getTime(),s=e.configs.find(C=>C.harness===e.active)??e.configs[0];if(!s)return null;const i=na(e,s.harness,new Date(n).toISOString()),o=e.island?St(e):void 0,c=o??t,p={...e,narratives:Object.fromEntries(e.configs.filter(C=>!ce(C.harness,e.license)).map(C=>[C.harness,ye(e.narratives?.[C.harness]??null,e.projects??null)]))};let u=e.configs.find(C=>C.harness===c?.harness)??s;const m=e.narratives?.[s.harness],f=p.narratives[s.harness];!c&&m&&f&&m.sessions.length>f.sessions.length&&Te(f,void 0)===null&&(u=e.configs.find(C=>Te(p.narratives[C.harness]??null,void 0)!==null)??s);const h=na(p,u.harness,new Date(n).toISOString(),c?.id),v=Na(e.live.entries,u.harness,u.capabilities.live,r),y=h.sessions.find(C=>C.id===h.selectedSession),w=h.projects?.projects.find(C=>!("payloadUnavailable"in C)&&!ae(C)&&C.sessions.some(z=>z.harness===u.harness&&z.id===h.selectedSession)),g=w&&!("payloadUnavailable"in w)?w.sessions.find(C=>C.harness===u.harness&&C.id===h.selectedSession):void 0,k=g?Ne(g):void 0,S=h.narrative?.taskWorkflow?.plan??g?.sessionPlan,A=S?.availability==="available"&&S.forInstruction==="current"?S.steps.find(C=>C.status==="in_progress")?.text:void 0,P={projectTitle:w?.title.text,taskTitle:A??k?.text,sessionTitle:k?.text??y?.label,status:g?Qe(g).label:y?y.waiting?a("panel.render.waitingForYouLabel"):y.ended?a("panel.render.ended"):y.turnEnded?a("panel.render.turnEnded"):a("panel.render.inProgress"):void 0,source:[w?.title.source,w&&A?S?.source:k?.source,g?"GET /api/projects sessions.waiting/feedback/ended/turnEnded":"GET /api/narrative sessions.label/waiting/ended/turnEnded"].filter(C=>!!C).map(I).join(";"),feedback:g?.feedback,waitOutcome:g?.waitOutcome??y?.waitOutcome,turnEnded:o?.kind==="turnEnded"};e.island&&y&&(P.feedback=h.narrative?.taskWorkflow?.feedback,P.waitOutcome=y.waitOutcome,P.status=y.waiting||P.feedback?.state==="needs_user"?a("panel.render.waitingForYouLabel"):y.ended?a("panel.render.ended"):y.turnEnded?a("panel.render.turnEnded"):a("panel.render.inProgress")),o?.kind==="turnEnded"&&(P.source=`${a("panel.render.turnEndedSource",{harness:R[o.harness]})} · ${o.at}`);const F=e.island?o?.waiting??null:Ya(p.narratives?.[u.harness]??null),E=Mo(e.island?null:h.narrative,v,P,F,r);o&&(E.label=`${R[o.harness]} · ${E.label}`,E.attentionCount=o.extra,E.acknowledgeable=o.kind==="turnEnded"||o.others.some(C=>C.kind==="turnEnded"),E.attentionOthers=o.others.map(C=>{const z=nn(e.projects?.projects??[],C.harness,C.id,void 0),re=z&&!("payloadUnavailable"in z)?z.sessions.find(te=>te.harness===C.harness&&te.id===C.id):void 0,Se=re?Ne(re).text:C.label,x=C.kind==="turnEnded"?a("panel.render.turnEnded"):a("panel.render.waitingForYouLabel");return`${R[C.harness]} · ${Se} ${x}`}));const K=e.license??null;return{story:i,pill:e.island&&e.islandTab?hn(E.mode):ti(u,E,e.island?e.islandSize:"standard",y?.discovered===!0&&E.mode!=="waiting"),panel:ul(e.configs,s,e.live,K,i,e.active,e.projects??null,r,e.freeHarnessChoosing),overlays:ml(e)}}function He(e,n){return{layout:e,visibility:"",pill:"",top:n,sessions:"",now:"","view-tabs":"",tasks:"","raw-events":"",control:"",billing:"",projects:"",bottom:"",overlays:""}}function gl(e,n){const t=fl(e);if(e={...e,active:$t(e.active,e.license)},e.island&&e.islandTab)return He("tab",e.error?hn("idle"):ta(e,n,t)?.pill??hn("idle"));if(e.island&&e.islandSize==="compact"&&(e.error||!e.configs.length))return He("compact",ni(e.error));if(e.error)return He("error",`<div class="wrap">${zt(e.error,e.wingmanVersion,e.expandedText)}</div>`);const r=ta(e,n,t);return r?e.island&&e.islandSize==="compact"?He("compact",`<div class="wrap">${r.pill}</div>`):{layout:"panel",visibility:`${e.open?"open":"closed"}:${e.active==="projects"?"projects":r.story.view}`,pill:r.pill,top:r.panel.top,sessions:r.panel.sessions,now:r.panel.now,"view-tabs":r.panel.viewTabs,tasks:r.panel.tasks,"raw-events":r.panel.rawEvents,control:r.panel.control,billing:r.panel.billing,projects:r.panel.projects,bottom:r.panel.bottom,overlays:r.overlays}:He("empty",`<div class="wrap">${zt(void 0,e.wingmanVersion,e.expandedText)}</div>`)}function ee(e,n){return`<div class="panel-region" data-panel-region="${e}">${n}</div>`}function Hn(e){if(e.layout!=="panel")return e.top;const[n,t="tasks"]=e.visibility.split(":");return`<div class="wrap${n==="open"?" open":""}">
367
- ${ee("pill",e.pill)}
368
+ ${bi(r,c,e,p)}${di(e,o,r)}`,sessions:m?"":`${Ii(s,n.harness)}${Ni(s,n.harness)}${!y&&h?.taskWorkflow===void 0?gr(s,n.harness):""}`,now:m?"":v,viewTabs:m?"":Ki(s),tasks:el(n,s),rawEvents:(y?Xt(n,t,s):nl(n,t,s))+(y&&s.view==="tasks"?$:y?"":g),control:Wt(a("panel.render.controls"),a("panel.render.controlsPageHint"))+mi(n,s)+Oi(s,n.harness)+gi(s)+(y&&s.view==="tasks"?"":$)+(y?"":Xt(n,t,s,!1)),billing:tl(n,s,r),projects:r?.tier!=="free"&&(m||h?.taskWorkflow===void 0)?yl(i,s.taskFilter,c,s):"",bottom:`<div class="panel-footer">${S?"":`<div class="licfoot">${st("licfootlink")}</div>`}
369
+ ${$r(n,s.expandedText)}</div>`}}function jr(e){let n;const t=e.islandPick,r=$n(e).some(({harness:s,session:o})=>t?.harness===s&&t.id===o.id);for(const{harness:s,session:o}of Oa(e))o.lastInstruction!==void 0&&(!n||Date.parse(o.lastInstruction)>Date.parse(n.at))&&(n={harness:s,id:o.id,at:o.lastInstruction});return{followTarget:n,pickAvailable:r}}function Bn(e,n,t,r){e.island&&(e.islandPick={harness:n,id:t,at:jr(e).followTarget?.at??r})}function $l(e){if(!e.island)return;const{followTarget:n,pickAvailable:t}=jr(e),r=e.islandPick;let s=n;return r&&t&&(!n||Date.parse(n.at)<=Date.parse(r.at))?s=r:delete e.islandPick,s?(e.islandApplied?.harness!==s.harness||e.islandApplied.id!==s.id||e.islandApplied.at!==s.at)&&(e.active=s.harness,e.sessionSel={...e.sessionSel,[s.harness]:s.id},e.islandApplied=s):delete e.islandApplied,s}function sa(e,n,t,r){const s=ke(e.narratives?.[n]??null,e.projects??null),o=r??Te(s,e.sessionSel?.[n]);return{now:t,...e.mobile===void 0?{}:{mobile:e.mobile},wingmanVersion:e.wingmanVersion,availableLocales:e.availableLocales??oe(),showLocaleSelector:!e.island||e.open,view:e.view??jt.view,narrative:s!==null&&o!==null?s.states[o]??null:null,projects:e.projects??null,anatomyLoadedAt:e.anatomyLoadedAt??null,anatomyRefreshFailed:e.anatomyRefreshFailed??!1,projectMemoryDismissed:e.projectMemoryDismissed??!1,projectRefreshFailed:e.projectRefreshFailed??!1,projectOrder:e.projectOrder??[],expandedProjects:e.expandedProjects??[],archivedProjectsOpen:e.archivedProjectsOpen??!1,archivedSessionsOpen:e.archivedSessionsOpen??[],oldSessionsOpen:e.oldSessionsOpen??[],expandedText:e.expandedText??{},protocolBannerHighlight:e.protocolBannerHighlight,protocolBannerProjectRoot:e.protocolBannerProjectRoot,startedAt:s?.startedAt??null,...s?.hooks===void 0?{}:{hooks:s.hooks},notices:s?.notices??[],noticeDismissed:e.noticeDismissed??{},sessions:s?.sessions??[],selectedSession:o,sessionSeen:e.sessionSeen??{},suggHidden:e.suggHidden??{},island:e.island??!1,todoOpen:e.todoOpen??{},nodeOpen:e.nodeOpen??{},evidenceOpen:e.evidenceOpen??!1,rawOpen:e.rawOpen??!1,taskFilter:e.taskFilter??be,taskMenuOpen:e.taskMenuOpen??null,taskResumeOpen:e.taskResumeOpen??null,returnTargets:e.returnTargets??null,returnSettingsDismissed:e.returnSettingsDismissed??!1,returnTargetSaving:e.returnTargetSaving??!1,returnTargetError:e.returnTargetError??null,taskReturnResults:e.taskReturnResults??{},hiddenOpen:e.hiddenOpen??{},factsOpen:e.factsOpen??{},taskError:e.taskError??null}}function wl(e){const n=e.license??null,t=e.flow?vi(e.flow):"",r=e.tierLock&&n?.tier==="free"?wi(n):"",s=e.licenseOpen&&n?Ti(n,ja,e.licenseRefreshing??!1,e.licenseRefreshResult??null,e.licenseCanSubscribe??!1):"",o=e.importResult?Si(e.importResult):"",i=e.share?Ai(e.share):"",c=e.forgetProject,p=c===void 0?"":`<div class="overlay project-forget-overlay"><div class="scrim"${c.busy?"":' data-act="project-forget-close"'}></div><div class="modal" role="dialog" aria-modal="true" aria-labelledby="project-forget-title" aria-describedby="project-forget-description"><div class="mhead"><span class="mtitle" id="project-forget-title">${a("panel.render.forgetProject")}</span></div><p class="mtext" id="project-forget-description">${a("panel.render.forgetProjectConfirm")}</p><div class="mact"><button class="btn ghost" data-act="project-forget-close" type="button"${c.busy?" disabled":""}>${a("panel.render.cancel")}</button><button class="btn primary" data-act="project-forget-confirm" type="button"${c.busy?" disabled":""}>${a("panel.render.forget")}</button></div></div></div>`;return`${t}${r}${s}${o}${i}${Xs(e.mobile)}${p}`}function oa(e,n,t){const r=new Date(n).getTime(),s=e.configs.find(x=>x.harness===e.active)??e.configs[0];if(!s)return null;const o=sa(e,s.harness,new Date(n).toISOString()),i=e.island?Pt(e):void 0,c=i??t,p={...e,narratives:Object.fromEntries(e.configs.filter(x=>!pe(x.harness,e.license)).map(x=>[x.harness,ke(e.narratives?.[x.harness]??null,e.projects??null)]))};let u=e.configs.find(x=>x.harness===c?.harness)??s;const m=e.narratives?.[s.harness],f=p.narratives[s.harness];!c&&m&&f&&m.sessions.length>f.sessions.length&&Te(f,void 0)===null&&(u=e.configs.find(x=>Te(p.narratives[x.harness]??null,void 0)!==null)??s);const h=sa(p,u.harness,new Date(n).toISOString(),c?.id),v=La(e.live.entries,u.harness,u.capabilities.live,r),y=h.sessions.find(x=>x.id===h.selectedSession),$=h.projects?.projects.find(x=>!("payloadUnavailable"in x)&&!re(x)&&x.sessions.some(X=>X.harness===u.harness&&X.id===h.selectedSession)),g=$&&!("payloadUnavailable"in $)?$.sessions.find(x=>x.harness===u.harness&&x.id===h.selectedSession):void 0,k=g?Ne(g):void 0,S=h.narrative?.taskWorkflow?.plan??g?.sessionPlan,A=S?.availability==="available"&&S.forInstruction==="current"?S.steps.find(x=>x.status==="in_progress")?.text:void 0,P={projectTitle:$?.title.text,taskTitle:A??k?.text,sessionTitle:k?.text??y?.label,status:g?Qe(g).label:y?y.waiting?a("panel.render.waitingForYouLabel"):y.ended?a("panel.render.ended"):y.turnEnded?a("panel.render.turnEnded"):a("panel.render.inProgress"):void 0,source:[$?.title.source,$&&A?S?.source:k?.source,g?"GET /api/projects sessions.waiting/feedback/ended/turnEnded":"GET /api/narrative sessions.label/waiting/ended/turnEnded"].filter(x=>!!x).map(C).join(";"),feedback:g?.feedback,waitOutcome:g?.waitOutcome??y?.waitOutcome,turnEnded:i?.kind==="turnEnded"};e.island&&y&&(P.feedback=h.narrative?.taskWorkflow?.feedback,P.waitOutcome=y.waitOutcome,P.status=y.waiting||P.feedback?.state==="needs_user"?a("panel.render.waitingForYouLabel"):y.ended?a("panel.render.ended"):y.turnEnded?a("panel.render.turnEnded"):a("panel.render.inProgress")),i?.kind==="turnEnded"&&(P.source=`${a("panel.render.turnEndedSource",{harness:E[i.harness]})} · ${i.at}`);const F=e.island?i?.waiting??null:Xa(p.narratives?.[u.harness]??null),j=Uo(e.island?null:h.narrative,v,P,F,r);i&&(j.label=`${E[i.harness]} · ${j.label}`,j.attentionCount=i.extra,j.acknowledgeable=i.kind==="turnEnded"||i.others.some(x=>x.kind==="turnEnded"),j.attentionOthers=i.others.map(x=>{const X=nn(e.projects?.projects??[],x.harness,x.id,void 0),le=X&&!("payloadUnavailable"in X)?X.sessions.find(Y=>Y.harness===x.harness&&Y.id===x.id):void 0,ue=le?Ne(le).text:x.label,I=x.kind==="turnEnded"?a("panel.render.turnEnded"):a("panel.render.waitingForYouLabel");return`${E[x.harness]} · ${ue} ${I}`}));const K=e.license??null;return{story:o,pill:e.island&&e.islandTab?hn(j.mode):li(u,j,e.island?e.islandSize:"standard",y?.discovered===!0&&j.mode!=="waiting"),panel:kl(e.configs,s,e.live,K,o,e.active,e.projects??null,r,e.freeHarnessChoosing),overlays:wl(e)}}function He(e,n){return{layout:e,visibility:"",pill:"",top:n,sessions:"",now:"","view-tabs":"",tasks:"","raw-events":"",control:"",billing:"",projects:"",bottom:"",overlays:""}}function Sl(e,n){const t=$l(e);if(e={...e,active:At(e.active,e.license)},e.island&&e.islandTab)return He("tab",e.error?hn("idle"):oa(e,n,t)?.pill??hn("idle"));if(e.island&&e.islandSize==="compact"&&(e.error||!e.configs.length))return He("compact",ii(e.error));if(e.error)return He("error",`<div class="wrap">${ea(e.error,e.wingmanVersion,e.expandedText)}</div>`);const r=oa(e,n,t);return r?e.island&&e.islandSize==="compact"?He("compact",`<div class="wrap">${r.pill}</div>`):{layout:"panel",visibility:`${e.open?"open":"closed"}:${e.active==="projects"?"projects":r.story.view}`,pill:r.pill,top:r.panel.top,sessions:r.panel.sessions,now:r.panel.now,"view-tabs":r.panel.viewTabs,tasks:r.panel.tasks,"raw-events":r.panel.rawEvents,control:r.panel.control,billing:r.panel.billing,projects:r.panel.projects,bottom:r.panel.bottom,overlays:r.overlays}:He("empty",`<div class="wrap">${ea(void 0,e.wingmanVersion,e.expandedText)}</div>`)}function te(e,n){return`<div class="panel-region" data-panel-region="${e}">${n}</div>`}function _n(e){if(e.layout!=="panel")return e.top;const[n,t="tasks"]=e.visibility.split(":");return`<div class="wrap${n==="open"?" open":""}">
370
+ ${te("pill",e.pill)}
368
371
  <div class="panel">
369
- ${ee("top",e.top)}
370
- ${ee("sessions",e.sessions)}
371
- ${ee("view-tabs",e["view-tabs"])}
372
- <div class="pane${t==="projects"?" act":""}" data-panel-view="projects">${ee("projects",e.projects)}</div>
373
- <div class="pane${t==="tasks"?" act":""}" data-panel-view="tasks">${ee("now",e.now)}${ee("tasks",e.tasks)}${ee("raw-events",e["raw-events"])}</div>
374
- <div class="pane${t==="control"?" act":""}" data-panel-view="control">${ee("control",e.control)}</div>
375
- <div class="pane${t==="billing"?" act":""}" data-panel-view="billing">${ee("billing",e.billing)}</div>
376
- ${ee("bottom",e.bottom)}
372
+ ${te("top",e.top)}
373
+ ${te("sessions",e.sessions)}
374
+ ${te("view-tabs",e["view-tabs"])}
375
+ <div class="pane${t==="projects"?" act":""}" data-panel-view="projects">${te("projects",e.projects)}</div>
376
+ <div class="pane${t==="tasks"?" act":""}" data-panel-view="tasks">${te("now",e.now)}${te("tasks",e.tasks)}${te("raw-events",e["raw-events"])}</div>
377
+ <div class="pane${t==="control"?" act":""}" data-panel-view="control">${te("control",e.control)}</div>
378
+ <div class="pane${t==="billing"?" act":""}" data-panel-view="billing">${te("billing",e.billing)}</div>
379
+ ${te("bottom",e.bottom)}
377
380
  </div>
378
- </div>${ee("overlays",e.overlays)}`}const Pr=50;function hl(e,n,t=Pr){const r={};let s;const i=()=>{s!==void 0&&(clearTimeout(s),s=void 0);const o=e(),c=Object.keys(o).filter(p=>r[p]!==o[p]);if(c.length!==0){n({regions:c,html:o});for(const p of c)r[p]=o[p]}};return{request(){s!==void 0&&clearTimeout(s),s=setTimeout(i,t)},flush:i,cancel(){s!==void 0&&clearTimeout(s),s=void 0}}}const D=vt(window.location.search),rt=yt(window.location.search);let ue=Pa(window.location.search)&&(rt==="top"||rt==="bottom");D&&(document.documentElement.classList.add("island"),document.documentElement.dataset.islandEdge=rt,bt(window.location.search)&&document.documentElement.classList.add("island-tab-mode"),ue&&document.documentElement.classList.add("island-compact"));function vl(){try{const e=localStorage.getItem("wingman.activeTab");return e!==null&&["projects","cc","codex","dsh"].includes(e)?e:"projects"}catch{return"projects"}}function st(e){d.expandedProjects=[...new Set(e)],ut("wingman.projects.expanded",d.expandedProjects)}function Un(e){d.expandedText={...d.expandedText,[e]:d.expandedText?.[e]!==!0},ut("wingman.folds",Object.keys(d.expandedText).filter(n=>d.expandedText?.[n]===!0&&(n===Jn||n===ka||n===$a||n.startsWith(Sa)||/^panel:controls:(cc|codex|dsh):(base|rules|skills|tools|gates|history|features)$/.test(n)||/^panel:cc:(inbound|outbound)-help$/.test(n)||/^panel:(help|(?:cc|codex|dsh):(?:connection|protocol|context))$/.test(n)||/^project:.+:(branches|done|full|points)$/.test(n)||/:(plan|verification|recent|evidence|feedback)$/.test(n)))),b()}const X={entries:[],connection:"connecting",replaying:!1},d={wingmanVersion:void 0,availableLocales:oe(),configs:[],active:vl(),open:!D,error:null,anatomyLoadedAt:null,anatomyRefreshFailed:!1,live:X,flow:null,license:null,licenseOpen:!1,licenseRefreshing:!1,licenseRefreshResult:null,licenseCanSubscribe:!1,importResult:null,share:null,view:"tasks",narratives:{},projects:null,projectOrder:[],expandedProjects:En("wingman.projects.expanded"),oldSessionsOpen:En("wingman.sessions.older.expanded"),expandedText:Object.fromEntries(En("wingman.folds").map(e=>[e,!0])),projectMemoryDismissed:!1,projectRefreshFailed:!1,taskFilter:ve,taskMenuOpen:null,taskResumeOpen:null,hiddenOpen:{},factsOpen:{},taskError:null,sessionSel:{},sessionSeen:{},turnEndedAck:{},noticeDismissed:{},suggHidden:{},island:D,islandSize:ue?"compact":"standard",islandTab:bt(window.location.search),todoOpen:{},nodeOpen:{},rawOpen:!1};let cn=null,Bn=0,bl=0,Ft=null,aa=!1,bn=null,_=null;const pn=Ns((e,n)=>{e==="retract"?(bn=n,ie()):(_?.remove(),_=null)}),O=document.querySelector("#app");function an(){return O!==null&&typeof O.querySelector=="function"}function Lt(){if(!(!O||!an()))for(const e of O.querySelectorAll("button.expand")){const n=document.getElementById(e.getAttribute("aria-controls")??"");n&&(e.hidden=e.getAttribute("aria-expanded")!=="true"&&!(n.clientHeight>0&&n.scrollHeight>n.clientHeight+1))}}function yl(){if(!O||!an())return{panes:[],rawEvents:null,details:[]};const e=Array.from(O.querySelectorAll("[data-panel-view]")).map(r=>[r.dataset.panelView??"",r.scrollTop]),n=O.querySelector('[data-panel-region="raw-events"] .feed'),t=Array.from(O.querySelectorAll(".project-tech, .project-node-children")).map(r=>[`${r.closest("[id]")?.id??""}:${r.className}`,r.open]);return{panes:e,rawEvents:n?.scrollTop??null,details:t}}function kl(e){if(!O||!an())return;for(const[r,s]of e.panes){const i=O.querySelector(`[data-panel-view="${r}"]`);i&&(i.scrollTop=s)}const n=O.querySelector('[data-panel-region="raw-events"] .feed');n&&e.rawEvents!==null&&(n.scrollTop=e.rawEvents);const t=new Map(e.details);for(const r of O.querySelectorAll(".project-tech, .project-node-children")){const s=t.get(`${r.closest("[id]")?.id??""}:${r.className}`);s!==void 0&&(r.open=s)}}function $l(){if(!O||!an())return;O.querySelector(".wrap")?.classList.toggle("open",d.open);const e=d.active==="projects"?"projects":d.view??"tasks";for(const n of O.querySelectorAll("[data-panel-view]"))n.classList.toggle("act",n.dataset.panelView===e)}function Sl(e){return e!=="layout"&&e!=="visibility"}function wl(e){if(!O)return;if(!an()){O.innerHTML=Hn(e.html),D&&ie();return}const n=document.activeElement instanceof HTMLElement&&document.activeElement.dataset.act==="expand"?document.activeElement.id:void 0,t=document.activeElement instanceof HTMLElement&&document.activeElement.matches('.fold > summary, .feedback-reason > summary, .cc-feature-help > summary, [data-act="old-sessions-toggle"]')?{act:document.activeElement.dataset.act,key:document.activeElement.dataset.key??document.activeElement.dataset.group}:void 0,r=yl(),s=pn.element,i=e.html.layout;if(O.dataset.panelLayout!==i||i!=="panel")O.innerHTML=Hn(e.html),O.dataset.panelLayout=i;else{const p=e.regions.filter(Sl),u=p.map(m=>O.querySelector(`[data-panel-region="${m}"]`));if(u.some(m=>m===null))O.innerHTML=Hn(e.html);else for(let m=0;m<p.length;m+=1){const f=u[m];if(!f)continue;const h=e.html[p[m]];if(p[m]==="pill"&&s?.isConnected&&f.contains(s)&&!d.open&&!d.islandTab){const v=document.createElement("div");v.innerHTML=h;const y=v.querySelector(".pill");y&&Es(s,y)}else f.innerHTML=h}}if($l(),D){const p=O.querySelector(".island-tab.wait, .pill.waiting")!==null;d.islandTab&&p&&!aa&&O.querySelector(".island-tab")?.classList.add("pulse"),aa=p}if(kl(r),Lt(),n!==void 0&&document.getElementById(n)?.focus({preventScroll:!0}),t!==void 0)for(const p of O.querySelectorAll('.fold > summary, .feedback-reason > summary, .cc-feature-help > summary, [data-act="old-sessions-toggle"]'))p.dataset.act===t.act&&(p.dataset.key??p.dataset.group)===t.key&&p.focus({preventScroll:!0});D&&ie();const c=O.querySelector('.mobile-overlay [role="dialog"]');c&&!c.contains(document.activeElement)&&c.querySelector('[data-act="mobile-close"]')?.focus()}let Cr=new Date().toISOString();const rn=hl(()=>gl(d,Cr),wl,0),H=_s({list:async e=>{const n=e?`?pairing=${encodeURIComponent(e)}`:"",t=await fetch(`/api/mobile${n}`),r=await t.json(),s=Bs(r);if(!t.ok||!s)throw new Error("mobile.unavailable");return s},create:async()=>{const e=await fetch("/api/mobile/pair",{method:"POST",headers:{"Content-Type":"application/json"},body:"{}"}),n=await e.json();if(!e.ok)throw new Error(n?.code??n?.error??"mobile.unavailable");if(typeof n?.pairId!="string"||!/^[A-Za-z0-9_-]+$/.test(n.pairId)||typeof n.url!="string"||!n.url.startsWith("wingman-pair://v1?"))throw new Error("mobile.unavailable");return{pairId:n.pairId,url:n.url}},remove:async e=>{const n=encodeURIComponent(e),t=await fetch(`/api/mobile/pair/${n}`,{method:"DELETE"});if(!t.ok){const s=await t.json();throw new Error(s?.code??s?.error??"mobile.unavailable")}const r=await t.json();return r?.notice==="mobile.localRemoved"?{notice:r.notice}:void 0}},()=>{H.state.error==="cli.server.mobileRequiresLicense"&&(d.tierLock=!0,pe()),H.state.error==="cli.server.fixturesMobile"&&(d.flow={phase:"demo",title:a("panel.mobile.heading")},H.state.error=null,H.state.confirmPairId=null),d.mobile={...H.state},b()});d.mobile=H.state;window.addEventListener("pagehide",()=>H.dispose(),{once:!0});window.addEventListener("wingman-island-shape",e=>{if(!D)return;const{tab:n,edge:t,phase:r,seq:s}=e.detail,i=r!==void 0&&s!==void 0&&(t==="left"||t==="right");i?(_??=O?.querySelector(".island-tab")??null,_&&(_.classList.add("island-transition-tab"),document.body.append(_))):(pn.cancel(),_?.remove(),_=null);const o=new URL(window.location.href);o.searchParams.set("edge",t),n&&!i?o.searchParams.set("tab","1"):o.searchParams.delete("tab"),history.replaceState(null,"",o);const c=yt(o.search);ue=Pa(o.search)&&(c==="top"||c==="bottom");const p=ue?"compact":"standard",u=bt(o.search),m=d.islandSize!==p||d.islandTab!==u;if(d.islandSize=p,d.islandTab=u,(d.islandTab||ue)&&(d.open=!1),Ft=null,bn=null,document.documentElement.dataset.islandEdge=c,document.documentElement.classList.toggle("island-compact",ue),document.documentElement.classList.toggle("island-tab-mode",d.islandTab),(!i||m)&&(b(),(i||r==="prepare")&&rn.flush()),r==="prepare"&&!i&&ie(),i){const f=O?.querySelector(".pill");if(f){if(!_){const h=document.createElement("div");h.innerHTML=hn(f.classList.contains("waiting")?"waiting":f.classList.contains("turn-ended")?"turnEnded":f.querySelector(".dot.live")?"working":"idle"),_=h.firstElementChild,_.classList.add("island-transition-tab"),document.body.append(_)}_.style.left=`clamp(0px, ${t==="left"?f.offsetLeft-6:f.offsetLeft+f.offsetWidth}px, calc(100vw - 6px))`,_.style.top=`clamp(0px, ${f.offsetTop+(f.offsetHeight-64)/2}px, calc(100vh - 64px))`,pn.start(f,t,r,s,matchMedia("(prefers-reduced-motion: reduce)").matches)}else pn.cancel(),_?.remove(),_=null,r==="retract"&&(bn=s);ie()}});let Ke=!1,ke=0,L=0;function xr(){return document.visibilityState==="visible"&&d.active==="projects"&&d.open&&!D&&d.license?.tier!=="free"}function Dt(){H.setVisible(xr())}function Ir(e){d.view=e}function b(){d.active=$t(d.active,d.license),Dt(),Cr=new Date().toISOString(),Ke&&ke===0&&rn.request()}function ie(){let e=null;const n=d.open?document.querySelector(".panel"):d.islandTab?document.querySelector(".island-tab"):document.querySelector(".pill")??document.querySelector(".empty-state");n&&(e={x:n.offsetLeft,y:n.offsetTop,w:n.offsetWidth,h:n.offsetHeight});const t=As(d.open,e,cn,Tl(),Ft,bn);window.location.hash!==t&&history.replaceState(null,"",t)}function Tl(){let e=null;for(const n of J){if(ce(n,d.license))continue;const t=Ya(ye(d.narratives?.[n]??null,d.projects??null));if(!t)continue;const r=Date.parse(t.since);Number.isFinite(r)&&(e===null||r>e.sinceMs)&&(e={sinceMs:r,message:a("island.waitingForYou",{p0:R[n],p1:t.message})})}return e}function Al(e){Bn+=1,cn={target:e,seq:Bn},ie();const n=Bn;setTimeout(()=>{cn?.seq===n&&(cn=null,ie())},600)}let Wt=!1;async function jr(){try{const e=await fetch("/api/settings");if(!e.ok)return;const n=await e.json();return!oe().some(({tag:t})=>t===n.locale)||!["settings","arg","system","default"].includes(n.source??"")||!Array.isArray(n.available)||!n.available.every(t=>t&&typeof t.nativeName=="string"&&oe().some(({tag:r})=>r===t.tag))?void 0:(Wt=!0,n)}catch{return}}function ot(e){if(e===void 0&&Wt&&Ke)return Me();if(e?.source!=="settings")try{const n=localStorage.getItem("wingman.locale");if(oe().some(({tag:t})=>t===n))return n}catch{}return e?.locale??as(navigator.language)??"en"}let qe;function Ht(e){const n=++L,t=(qe??Promise.resolve()).then(()=>Pl(e,n));return qe=t,t.finally(()=>{qe===t&&(qe=void 0)})}async function Pl(e,n){if(n!==L)return!1;const t=Me(),r={configs:d.configs,anatomyLoadedAt:d.anatomyLoadedAt,anatomyRefreshFailed:d.anatomyRefreshFailed,error:d.error,active:d.active,projects:d.projects,projectOrder:d.projectOrder,projectMemoryDismissed:d.projectMemoryDismissed,projectRefreshFailed:d.projectRefreshFailed,narratives:{...d.narratives},sessionSel:{...d.sessionSel},sessionSeen:{...d.sessionSeen},turnEndedAck:{...d.turnEndedAck}};ke+=1,rn.cancel();for(const i of J){const o=Je[i];o!==void 0&&clearTimeout(o),delete Je[i]}je!==void 0&&clearTimeout(je),je=void 0,ze(e);let s=!1;try{return s=(await Promise.all([Le(!1),$e(!1,!0),...J.map(o=>Pe(o,!0))])).every(Boolean)&&n===L,s&&await Promise.all([pe(),Ut()]),s}finally{s||(ze(t),Object.assign(d,r,{turnEndedAck:{...r.turnEndedAck,...d.turnEndedAck}})),ke-=1,b()}}let Ye=!1;async function ra(e){const n=++L;if(await qe,n===L){ze(e);try{localStorage.setItem("wingman.locale",e)}catch{}b()}}async function Cl(e){if(!(Ye||!oe().some(({tag:n})=>n===e))){if(!Wt){await ra(e);return}Ye=!0,L+=1;try{const n=await fetch("/api/settings",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({locale:e})});n.status===403?await ra(e):n.ok?await Ht(e):(d.error=await ne(n),b())}catch(n){d.error=Z(n),b()}finally{Ye=!1}}}async function Le(e=!0){if(e&&ke>0)return!1;const n=L;let t=!1;const r=e?jr():void 0;try{const s=d.wingmanVersion===void 0?fetch("/api/version").then(async m=>{if(!m.ok)return null;const f=await m.json();if(typeof f!="object"||f===null||!("version"in f))return null;const h=f.version;return typeof h=="string"&&h!==""?h:null}).catch(()=>null):Promise.resolve(d.wingmanVersion),[i,o,c]=await Promise.all([fetch("/api/anatomy"),s,r]);if(n!==L)return!1;if(e){d.availableLocales=c?.available??oe();const m=ot(c);if(!Ke)ze(m);else if(m!==Me())return Ht(m)}if(d.wingmanVersion=o,!i.ok)throw new Error(`GET /api/anatomy → HTTP ${i.status}`);const p=await i.json();if(n!==L)return!1;const u=Ks(p);d.configs=u,d.anatomyLoadedAt=new Date().toISOString(),d.anatomyRefreshFailed=!1,d.active=d.active==="projects"||u.some(m=>m.harness===d.active)?d.active:"projects",d.error=null,t=!0}catch(s){if(n!==L)return!1;d.configs.length===0?d.error=s instanceof Error?s.message:String(s):(d.anatomyRefreshFailed=!0,d.error=null)}if(e){const s=await r;d.availableLocales=s?.available??oe();const i=ot(s);Ke||(ze(i),Ke=!0)}return t&&e&&await pe(),b(),t}async function Ut(){const e=L;try{const n=await fetch("/api/return-target");if(!n.ok)return!1;const t=Js(await n.json());return e!==L||t===null?!1:(d.returnTargets?.settings?.unavailable!==t.settings?.unavailable&&(d.returnSettingsDismissed=!1),d.returnTargets=t,b(),!0)}catch{return!1}}async function xl(e){if(!(d.returnTargetSaving||!d.returnTargets?.available.some(n=>n.bundlePath===e))){d.returnTargetSaving=!0,d.returnTargetError=null,b();try{const n=await fetch("/api/return-target",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({bundlePath:e})});if(!n.ok){d.returnTargetError=await ne(n);return}const t=zs(await n.json());if(t===null||t.selected.bundlePath!==e){d.returnTargetError=a("panel.main.backToSessionSettingsResponseUnavailable");return}d.returnTargets={available:d.returnTargets.available,selected:t.selected},d.returnSettingsDismissed=!1}catch{d.returnTargetError=a("panel.main.couldNotSaveBackToSession")}finally{d.returnTargetSaving=!1,b()}}}let Ue=0,_n=!1;async function $e(e=!1,n=!1){if(ke>0&&!n)return!1;const t=L;let r=!1;e&&(_n=!0);const s=++Ue;try{const i=await fetch("/api/projects");if(s!==Ue||t!==L)return!1;if(!i.ok)return d.projectRefreshFailed=!0,!1;const o=Xs(await i.json());if(s!==Ue||t!==L)return!1;if(d.projectRefreshFailed=o===null,o!==null){d.projects?.memory!==void 0&&o.memory===void 0&&(d.projectMemoryDismissed=!1);const c=mn(o.projects).map(m=>m.root),p=d.projectOrder??[],u=d.projects?.projects.filter(ae).some(m=>c.includes(m.root))??!1;d.projectOrder=_n||u||d.projects===null?c:[...p.filter(m=>c.includes(m)),...c.filter(m=>!p.includes(m))],_n=!1,d.projects=o,r=!0}}catch{s===Ue&&t===L&&(d.projectRefreshFailed=!0)}finally{s===Ue&&b()}return r}const qn=new Set;async function Il(e){if(qn.has(e))return;const n=d.projects?.projects.flatMap(o=>"payloadUnavailable"in o?[]:o.sessions).find(o=>`${o.harness}:${o.id}`===e);if(n===void 0)return;qn.add(e),d.taskResumeOpen=e;const t=Ta(n),r="unavailable"in t?"unavailable":await Qn(t.command)?"copied":"failed";let s,i="GET /api/return-target";if(d.returnTargets==null&&!await Ut())s={activated:!1,reason:a("panel.main.couldNotLoadBackToSession")};else if(d.returnTargets?.settings!==void 0)s={activated:!1,reason:d.returnTargets.settings.unavailable};else if(d.returnTargets?.selected===void 0)s={activated:null};else{i="POST /api/return";try{const o=await fetch("/api/return",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({bundlePath:d.returnTargets.selected.bundlePath})});s=o.ok?Ys(await o.json())??{activated:!1,reason:a("panel.main.activationResponseUnavailable")}:{activated:!1,reason:await ne(o)}}catch{s={activated:!1,reason:a("panel.main.activationRequestFailed")}}}d.taskReturnResults={...d.taskReturnResults,[e]:{clipboard:r,activation:s,activationSource:i}},qn.delete(e),b()}async function jl(){const e=d.forgetProject;if(e===void 0||e.busy)return;e.busy=!0,b();const n=`project:${e.root}`;try{const t=await fetch("/api/project-memory",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({root:e.root,forget:!0})});d.taskError=t.ok?null:{key:n,message:await ne(t)},t.ok&&await $e()}catch(t){d.taskError={key:n,message:a("panel.main.organizationRequestFailed",{p0:Z(t)})}}d.forgetProject=void 0,d.taskMenuOpen=null,b()}async function we(e,n){const t=e.indexOf(":");if(t<1||t===e.length-1)return;const r=e.slice(0,t),s=e.slice(t+1),i=r==="project"?[{root:s,patch:n}]:[{harness:r,sessionId:s,patch:n}];try{for(const o of i){const c=await fetch("/api/task-overlay",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(o)});if(!c.ok){d.taskError={key:e,message:await ne(c)},await $e(r==="project"),b();return}}}catch(o){d.taskError={key:e,message:a("panel.main.organizationRequestFailed",{p0:Z(o)})},b();return}d.taskError=null,d.taskMenuOpen=null,d.taskResumeOpen=null,await $e(r==="project"),(n.accepted!==void 0||n.archived!==void 0)&&J.includes(r)&&await Pe(r)}let it=0,Rr=0;function Bt(e){it+=1;const n=e.tier!==d.license?.tier;e.tier==="free"&&(d.license?.tier!=="free"||d.license.freeHarness!==e.freeHarness)&&(fe+=1,d.share=null),(e.tier!=="free"||d.license?.freeHarnessSwitchableAt!==e.freeHarnessSwitchableAt)&&(d.freeHarnessChoosing=!1),d.license=e,e.tier!=="free"&&(d.tierLock=!1);const t=$t(d.active,e);t!==d.active&&(W+=1,d.flow=null),d.active=t,n&&H.state.pairing&&!D&&(Dt(),H.load()),D&&ie()}async function pe(){const e=L,n=++it;Rr=Date.now();try{const t=await fetch("/api/license");if(!t.ok)return;const r=kt(await t.json());if(e!==L||n!==it)return;r&&(Bt(r),b())}catch{}}let Vn=!1;async function Rl(e){if(!(Vn||d.license?.tier!=="free")&&!(Date.parse(d.license.freeHarnessSwitchableAt??"")>Date.now())){Vn=!0;try{const n=await fetch("/api/settings",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({freeHarness:e})});if(!n.ok)throw new Error(await ne(n));d.tierLock=!1,d.freeHarnessChoosing=!1,await pe()}catch(n){d.licenseOpen=!0,d.licenseRefreshResult={ok:!1,message:Z(n)},b()}finally{Vn=!1}}}async function El(){if(d.licenseRefreshing)return;d.licenseRefreshing=!0,d.licenseRefreshResult=null,d.licenseCanSubscribe=!1,b();let e;try{e=await fetch("/api/license/refresh",{method:"POST",headers:{"x-wingman-panel-action":"refresh-license"}})}catch(r){d.licenseRefreshing=!1,d.licenseRefreshResult={ok:!1,message:a("panel.main.refreshFailed",{p0:Z(r)})},b();return}if(!e.ok){const r=await Kl(e);d.licenseRefreshing=!1,d.licenseCanSubscribe=r.canSubscribe,d.licenseRefreshResult={ok:!1,message:r.message},b();return}let n;try{n=await e.json()}catch{n=null}const t=kt(n);t&&Bt(t),d.licenseRefreshing=!1,d.licenseCanSubscribe=!1,d.licenseRefreshResult={ok:!0,message:t?a("panel.main.licenseRefreshed",{p0:t.detail}):a("panel.main.licenseRefreshedReopenThePanelTo")},b(),pe()}function Nl(){const e=document.createElement("input");e.type="file",e.accept=".json,application/json";const n=()=>{D&&!d.open&&(d.open=!0,b())};if(e.addEventListener("change",()=>{n();const t=e.files?.[0];t&&Er(t)}),e.addEventListener("cancel",n),D&&d.open){d.open=!1,b(),window.setTimeout(()=>e.click(),200);return}e.click()}async function Er(e){let n;try{n=await e.text()}catch(t){d.importResult={ok:!1,message:a("panel.main.couldNotReadFile",{p0:Z(t)})},b();return}await Ol(n)}async function Ol(e){let n;try{n=await fetch("/api/license/install",{method:"POST",headers:{"content-type":"application/json"},body:e})}catch(r){d.importResult={ok:!1,message:a("panel.main.importRequestFailed",{p0:Z(r)})},b();return}if(!n.ok){d.importResult={ok:!1,message:await ne(n)},b();return}let t=null;try{t=kt(await n.json())}catch{t=null}t&&(Bt(t),d.licenseCanSubscribe=!1),d.importResult={ok:!0,message:xs(t)},b(),pe()}if(D)document.addEventListener("dragover",e=>e.preventDefault()),document.addEventListener("drop",e=>e.preventDefault());else{const e=document.createElement("div");e.id="drop",e.textContent=a("panel.main.dropToImportLicense"),document.body.appendChild(e);let n=0;const t=r=>Array.from(r.dataTransfer?.types??[]).includes("Files");document.addEventListener("dragenter",r=>{t(r)&&(r.preventDefault(),n+=1,e.style.display="flex")}),document.addEventListener("dragover",r=>{t(r)&&r.preventDefault()}),document.addEventListener("dragleave",r=>{t(r)&&(n=Math.max(0,n-1),n===0&&(e.style.display="none"))}),document.addEventListener("drop",r=>{if(!t(r))return;r.preventDefault(),n=0,e.style.display="none";const s=Array.from(r.dataTransfer?.files??[]),i=Is(s.map(c=>c.name));if(i){d.importResult={ok:!1,message:i},b();return}const o=s[0];o&&Er(o)})}const _t=Pr,Je={},Be={};let je;async function Pe(e,n=!1){if(ke>0&&!n)return!1;const t=L;let r=!1;const s=(Be[e]??0)+1;Be[e]=s;try{const i=await fetch(`/api/narrative?harness=${e}`);if(Be[e]!==s||t!==L||!i.ok)return!1;const o=await i.json();if(Be[e]!==s||t!==L)return!1;const c=Zs(o);if(c){d.narratives||(d.narratives={}),d.narratives[e]=c,r=!0;const p=Te(ye(c,d.projects??null),d.sessionSel?.[e]);p!==null&&(d.sessionSel||(d.sessionSel={}),d.sessionSel[e]=p,lt(e,p))}}catch{}finally{Be[e]===s&&b()}return r}function lt(e,n){const t=d.narratives?.[e]?.sessions.find(r=>r.id===n);t&&(d.sessionSeen||(d.sessionSeen={}),d.sessionSeen[`${e}:${n}`]=t.lastActivity)}function Nr(e){Je[e]===void 0&&(Je[e]=window.setTimeout(()=>{delete Je[e],Pe(e)},_t))}function Ml(){je===void 0&&(je=window.setTimeout(()=>{je=void 0,$e()},_t))}const Gn=new Set;let Kn;function sa(e){Gn.add(e),Kn===void 0&&(Kn=window.setTimeout(async()=>{Kn=void 0;const n=[...Gn];if(Gn.clear(),ke>0||Ye)return;const t=L,r=await jr();if(t!==L||ke>0||Ye)return;const s=ot(r);if(d.availableLocales=r?.available??oe(),s!==Me())await Ht(s);else{for(const i of n)Nr(i);Ml()}},_t))}function Fl(){const e=new EventSource("/api/narrative/events");e.onopen=()=>{for(const n of J)sa(n)},e.onmessage=n=>{try{const t=JSON.parse(n.data);J.includes(t.harness)&&sa(t.harness)}catch{}}}function Ll(){const e=d.configs.find(r=>r.harness===d.active)??d.configs[0];if(!e)return null;const n=ye(d.narratives?.[e.harness]??null,d.projects??null),t=Te(n,d.sessionSel?.[e.harness]);return n===null||t===null?null:n.states[t]??null}function Re(e){if(ce(e,d.license)){d.tierLock=!0;return}d.tierLock=!1,d.protocolBannerProjectRoot=void 0;const n=e==="projects"&&d.active!=="projects";d.active=e;try{localStorage.setItem("wingman.activeTab",e)}catch{}n&&(d.projectOrder=mn(d.projects?.projects??[]).map(t=>t.root),$e(!0))}function Or(e){const n=d.projects?.projects.find(t=>t.root===e);n&&ae(n)&&(d.archivedProjectsOpen=!0),n&&ht([n],d.taskFilter??ve).length===0&&(d.taskFilter=ve),st([...d.expandedProjects??[],n?.root??e])}function Dl(e){Re("projects");const n=d.projects?.projects.find(t=>e.startsWith(`project-node-${encodeURIComponent(`${t.root}:`)}`));n&&Or(n.root),b(),window.setTimeout(()=>{const t=document.getElementById(e);let r=t?.parentElement;for(;r;)r instanceof HTMLDetailsElement&&(r.open=!0),r=r.parentElement;t?.scrollIntoView({block:"center"})},0)}function Wl(e){Re("projects"),Or(e),b(),window.setTimeout(()=>{document.getElementById(vn(e))?.scrollIntoView({block:"center"})},0)}function Hl(e){const n=d.todoOpen??{};let t;if(e==="__other__")t=n[e]!==!1;else{const r=Ll()?.todos.find(s=>s.id===e);t=r?nr(r,n):n[e]===!0}d.todoOpen={...n,[e]:!t},b()}const J=["cc","codex","dsh"],Ul=["all","waiting","turnEnded","active","ended"];function Bl(e){if(typeof e!="object"||e===null)return null;const n=e;if(!J.includes(n.harness)||typeof n.received_at!="string")return null;const t=n.payload;return typeof t!="object"||t===null||typeof t.hook_event_name!="string"?null:e}function Mr(e,n,t){const r={event:e,...n===void 0?{}:{mock:n},...t===void 0?{}:{sseId:t}};X.entries=Ls(X.entries,r),Nr(e.harness)}function _l(){const e=new EventSource("/api/events");e.onopen=()=>{X.connection!=="open"&&(X.connection="open",b())},e.onmessage=n=>{try{const t=Bl(JSON.parse(n.data));t&&Mr(t,void 0,n.lastEventId||void 0)}catch{}},e.onerror=()=>{X.connection!=="retrying"&&(X.connection="retrying",b())}}const ql=200;async function Vl(){if(!X.replaying){X.replaying=!0,b();try{const e=await fetch("/api/live-demo.json");if(!e.ok)throw new Error(`GET /api/live-demo.json → HTTP ${e.status}`);const n=await e.json();for(const t of n.events)Mr({harness:n.harness,received_at:new Date().toISOString(),payload:t},!0),await new Promise(r=>setTimeout(r,ql))}catch{}X.replaying=!1,b()}}let W=0;function Ee(){return d.configs.find(e=>e.harness===d.active)??d.configs[0]}function Gl(e,n){for(const t of Fe){const r=(e.slots[t]??[]).find(s=>s.id===n);if(r)return r}}function Fr(){W+=1,d.flow=null,b()}function Z(e){return e instanceof Error?e.message:String(e)}async function ne(e){const n=await e.text();try{const t=JSON.parse(n);if(typeof t.error=="string"&&t.error!=="")return t.error}catch{}return`HTTP ${e.status}${n?` — ${n}`:""}`}async function Kl(e){const n=await e.text();try{const t=JSON.parse(n);if(typeof t.error=="string"&&t.error!=="")return{message:t.error,canSubscribe:t.canSubscribe===!0}}catch{}return{message:`HTTP ${e.status}${n?` — ${n}`:""}`,canSubscribe:!1}}async function Yl(e,n){try{const t=await fetch("/api/action-plan-demo.json");if(!t.ok)throw new Error(`GET /api/action-plan-demo.json → HTTP ${t.status}`);const r=await t.json(),s=typeof r.__mock_note=="string"?r.__mock_note:"";if(!s.includes("MOCK"))throw new Error(a("panel.main.demoSampleIsMissingItsMock"));const i=ba(r.plan);if(e!==W)return;d.flow={phase:"confirm",title:ha(us(i),i.action.enable),plan:i,mockNote:s}}catch(t){if(e!==W)return;d.flow={phase:"error",title:n,message:a("panel.main.theServerHasNoActionEndpoint",{p0:Z(t)})}}b()}async function oa(e,n,t){const r=Ee();if(!r)return;const s=Gl(r,e);if(!s?.toggleable||s.ccFeature?.overriddenBy||s.ccFeature?.invalid||s.ccFeature?.key==="crossSessionInbound"&&t===void 0)return;const i=t===void 0?n??!s.enabled:!0,o=t===void 0?ha(s.ccFeature?ma(s.ccFeature.key):s.nativeName,i):a("panel.render.ccSetInbound",{value:Yn(t)}),c=++W;d.flow={phase:"planning",title:o},b();const p={kind:"toggle",itemId:e,enable:i,...t===void 0?{}:{value:t}};let u=null;try{u=await fetch("/api/action/plan",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({harness:r.harness,action:p})})}catch{u=null}if(c===W){if(u===null||u.status===404||u.status===405){await Yl(c,o);return}if(!u.ok){const m=await ne(u);if(c!==W)return;d.flow={phase:"error",title:o,message:m},b();return}try{const m=ba(await u.json());if(c!==W)return;d.flow={phase:"confirm",title:o,plan:m}}catch(m){if(c!==W)return;d.flow={phase:"error",title:o,message:Z(m)}}b()}}async function Jl(e,n){const t=a("panel.main.userPlanProtocol",{p0:a(n==="protocol_user_install"?"panel.main.install":"panel.main.uninstall"),p1:R[e]}),r=++W;d.flow={phase:"planning",title:t},b();try{const s=await fetch("/api/action/plan",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({kind:n,harness:e})});if(!s.ok)throw new Error(`HTTP ${s.status} — ${await ne(s)}`);const i=vs(await s.json());if(i.kind!==n||i.harness!==e)throw new Error(a("panel.main.thePlanDoesNotMatchThe"));if(r!==W)return;d.flow={phase:"confirm",title:t,plan:i}}catch(s){if(r!==W)return;d.flow={phase:"error",title:t,message:Z(s)}}b()}let ia;function zl(e,n){Re(e),Ir("control"),d.expandedText={...d.expandedText,[`panel:${e}:protocol`]:!0},d.protocolBannerProjectRoot=e==="dsh"?n:void 0,d.protocolBannerHighlight=e,clearTimeout(ia),b(),rn.flush();const t=document.querySelector(".pane.act .protocol-detail > summary");t?.scrollIntoView({block:"center"}),t?.focus({preventScroll:!0}),ia=setTimeout(()=>{d.protocolBannerHighlight=void 0,b()},2e3)}async function Ql(){if(d.flow?.phase!=="confirm")return;const{title:e,plan:n,mockNote:t}=d.flow;if(t){d.flow={phase:"demo",title:e},b();return}const r=++W;d.flow={phase:"applying",title:e},b();let s;try{s=await fetch("/api/action/apply",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify("kind"in n?{kind:n.kind,harness:n.harness}:{harness:n.harness,plan:n})})}catch(i){if(r!==W)return;d.flow={phase:"error",title:e,message:a("panel.main.applyRequestFailed",{p0:Z(i)})},b();return}if(r===W){if(s.status===403){const i=await ne(s);if(r!==W)return;d.flow="kind"in n?{phase:"error",title:e,message:`HTTP 403 — ${i}`}:ys(e,i),b();return}if(!s.ok){const i=await ne(s);if(r!==W)return;d.flow={phase:"error",title:e,message:i},b();return}try{const i=await s.json(),o="kind"in n?bs(i):ya(i);if(r!==W)return;o.ok?(d.flow={phase:"applied",title:e,...o.backupDir===void 0?{}:{backupDir:o.backupDir}},Le()):d.flow={phase:"error",title:e,message:o.error}}catch(i){if(r!==W)return;d.flow={phase:"error",title:e,message:Z(i)}}b()}}let fe=0;function Xl(){const e=Ee();e&&(fe+=1,d.share={kind:"config",title:a("panel.main.shareConfigurationSample",{p0:R[e.harness]}),lines:Yo(e),phase:"preview"},b())}function Zl(){fe+=1,d.share={kind:"events",title:a("panel.main.shareEventSample"),lines:Jo(X.entries.filter(e=>!ce(e.event.harness,d.license))),phase:"preview"},b()}function Lr(){fe+=1,d.share=null,b()}function ed(e){d.share?.phase==="preview"&&(d.share={...d.share,lines:zo(d.share.lines,e)},b())}async function nd(){const e=d.share;if(e?.phase!=="preview"||e.lines.length===0||sr(e.kind,e.lines))return;const n=++fe;d.share={...e,phase:"sending"},b();let t;try{t=await fetch(Go,{method:"POST",headers:{"content-type":"application/json"},body:ar(e.kind,e.lines)})}catch(r){if(n!==fe)return;d.share={...e,phase:"error",message:a("panel.main.couldNotSend",{p0:Z(r)})},b();return}if(n===fe){if(t.ok)d.share={...e,phase:"sent"};else{const r=await ne(t);if(n!==fe)return;d.share={...e,phase:"error",message:r}}b()}}document.addEventListener("change",e=>{const n=e.target;n instanceof HTMLElement&&n.dataset.act==="lang"&&Cl(n.value)});document.addEventListener("click",e=>{const n=e.target;if(!n)return;const t=n.closest('[data-act="expand"]');if(t instanceof HTMLElement&&t.dataset.key!==void 0){const $=t.dataset.key;d.expandedText={...d.expandedText,[$]:d.expandedText?.[$]!==!0},b();return}if(Ps({island:D,open:d.open,inPanel:n.closest(".panel")!==null||n.closest(".pill")!==null||n.closest(".empty-state")!==null||n.closest(".overlay")!==null,modalOpen:!!(d.flow||d.share||d.licenseOpen||d.importResult||d.forgetProject||d.mobile?.confirmPairId)})){d.open=!1,b();return}const r=n.closest('[data-act="locate"]');if(r instanceof HTMLElement&&r.dataset.target){Al(r.dataset.target);return}const s=n.closest('[data-act="view"]');if(s instanceof HTMLElement&&s.dataset.view){Ir(s.dataset.view),b();return}if(n.closest('[data-act="mobile-pair"]')){H.pair();return}if(n.closest('[data-act="mobile-cancel"]')){H.cancelPairing();return}const i=n.closest('[data-act="project-forget"]');if(i?.dataset.root){const $=d.projects?.projects.find(j=>j.root===i.dataset.root);$&&!("payloadUnavailable"in $)&&$.presence==="remembered"&&$.sessions.length===0&&(d.forgetProject={root:$.root,busy:!1},d.taskError=null,b());return}if(n.closest('[data-act="project-forget-close"]')){d.forgetProject?.busy||(d.forgetProject=void 0),b();return}if(n.closest('[data-act="project-forget-confirm"]')){jl();return}const o=n.closest('[data-act="mobile-unpair"]');if(o?.dataset.pair){H.confirmUnpair(o.dataset.pair);return}if(n.closest('[data-act="mobile-close"]')){H.closeConfirmation();return}if(n.closest('[data-act="mobile-confirm"]')){H.unpair();return}const c=n.closest('[data-act="panel-detail-open"]');if(c instanceof HTMLElement&&c.dataset.key!==void 0){const $=c.dataset.key;d.expandedText?.[$]!==!0&&Un($),rn.flush();for(const j of O?.querySelectorAll(".panel-detail > summary")??[])if(j.dataset.key===$){j.scrollIntoView({block:"nearest"}),j.focus({preventScroll:!0});break}return}const p=n.closest('[data-act="return-target-select"]');if(p instanceof HTMLElement&&p.dataset.bundlePath!==void 0){xl(p.dataset.bundlePath);return}if(n.closest('[data-act="return-settings-dismiss"]')){d.returnSettingsDismissed=!0,b();return}const u=n.closest('[data-act="protocol-user"]');if(u instanceof HTMLElement&&(u.dataset.harness==="cc"||u.dataset.harness==="codex")&&(u.dataset.kind==="protocol_user_install"||u.dataset.kind==="protocol_user_uninstall")){Jl(u.dataset.harness,u.dataset.kind);return}const m=n.closest('[data-act="goto-protocol-banner"]');if(m instanceof HTMLElement&&J.includes(m.dataset.harness)){zl(m.dataset.harness,m.dataset.root);return}const f=n.closest('[data-act="protocol-copy"]');if(f instanceof HTMLElement&&f.dataset.command!==void 0){Qn(f.dataset.command);return}const h=n.closest('[data-act="task-menu"]');if(h instanceof HTMLElement&&h.dataset.key!==void 0){e.stopPropagation();const $=h.dataset.key;d.taskMenuOpen=d.taskMenuOpen===$?null:$,d.taskMenuOpen===null&&(d.taskResumeOpen=null),b();return}if(n.closest('[data-act="task-rename-input"]')){e.stopPropagation();return}const y=n.closest('[data-act="task-accept"]');if(y instanceof HTMLElement&&y.dataset.key!==void 0&&y.dataset.value!==void 0){e.stopPropagation(),we(y.dataset.key,{accepted:y.dataset.value==="true"});return}if(n.closest('[data-act="project-archived-toggle"]')){d.archivedProjectsOpen=!d.archivedProjectsOpen,b();return}const w=n.closest('[data-act="old-sessions-toggle"]');if(w instanceof HTMLElement&&w.dataset.group!==void 0){const $=w.dataset.group,j=d.oldSessionsOpen??[];d.oldSessionsOpen=j.includes($)?j.filter(B=>B!==$):[...j,$],ut("wingman.sessions.older.expanded",d.oldSessionsOpen),b();return}const g=n.closest('[data-act="session-archived-toggle"]');if(g instanceof HTMLElement&&g.dataset.root!==void 0){const $=g.dataset.root,j=d.archivedSessionsOpen??[];d.archivedSessionsOpen=j.includes($)?j.filter(B=>B!==$):[...j,$],b();return}const k=n.closest('[data-act="task-archive"]');if(k instanceof HTMLElement&&k.dataset.key!==void 0){e.stopPropagation(),we(k.dataset.key,{archived:k.dataset.value==="true"});return}const S=n.closest('[data-act="project-archive"]');if(S instanceof HTMLElement&&S.dataset.key!==void 0){e.stopPropagation(),we(S.dataset.key,{archived:S.dataset.value==="true"});return}const A=n.closest('[data-act="project-move"]');if(A instanceof HTMLElement&&!A.hasAttribute("disabled")&&A.dataset.root!==void 0&&A.dataset.order!==void 0){e.stopPropagation(),we(`project:${A.dataset.root}`,{order:Number(A.dataset.order)});return}const P=n.closest('[data-act="task-pin"]');if(P instanceof HTMLElement&&P.dataset.key!==void 0&&P.dataset.value!==void 0){e.stopPropagation(),we(P.dataset.key,{pinned:P.dataset.value==="true"});return}const F=n.closest('[data-act="task-hide"]');if(F instanceof HTMLElement&&F.dataset.key!==void 0&&F.dataset.value!==void 0){e.stopPropagation(),we(F.dataset.key,{hidden:F.dataset.value==="true"});return}const E=n.closest('[data-act="task-resume"]');if(E instanceof HTMLElement&&E.dataset.key!==void 0){e.stopPropagation();const $=E.dataset.key;Il($);return}const K=n.closest('[data-act="task-copy"]');if(K instanceof HTMLElement&&K.dataset.command!==void 0){e.stopPropagation(),Qn(K.dataset.command);return}const C=n.closest('[data-act="task-hidden-toggle"]');if(C instanceof HTMLElement&&C.dataset.group!==void 0){e.stopPropagation();const $=d.hiddenOpen??{};d.hiddenOpen={...$,[C.dataset.group]:$[C.dataset.group]!==!0},b();return}const z=n.closest('[data-act="facts-toggle"]');if(z instanceof HTMLElement&&z.dataset.group!==void 0){e.stopPropagation();const $=d.factsOpen??{};d.factsOpen={...$,[z.dataset.group]:$[z.dataset.group]!==!0},b();return}const re=n.closest('[data-act="task-filter"]');if(re instanceof HTMLElement&&re.dataset.value!==void 0){const $=d.taskFilter??ve,j=re.dataset.value;if(re.dataset.kind==="harness"&&(j==="all"||J.includes(j))){d.taskFilter={...$,harness:j},b();return}if(re.dataset.kind==="status"&&Ul.includes(j)){d.taskFilter={...$,status:j},b();return}}const Se=n.closest('[data-act="project-expand"], [data-act="project-collapse"]');if(Se instanceof HTMLElement&&Se.dataset.root!==void 0){const $=d.expandedProjects??[],j=Se.dataset.root;st(Se.dataset.act==="project-expand"?[...$,j]:$.filter(B=>B!==j)),b();return}if(n.closest('[data-act="projects-toggle"]')){const $=ht(d.projects?.projects??[],d.taskFilter??ve).filter(B=>!("payloadUnavailable"in B)&&!ae(B)).map(B=>B.root)??[],j=d.expandedProjects??[];st($.every(B=>j.includes(B))?j.filter(B=>!$.includes(B)):[...j,...$]),b();return}const x=n.closest('[data-act="project-session"]');if(x instanceof HTMLElement&&J.includes(x.dataset.harness)&&x.dataset.session!==void 0){const $=x.dataset.harness;Re($),d.sessionSel||(d.sessionSel={}),d.sessionSel[$]=x.dataset.session,Wn(d,$,x.dataset.session,new Date().toISOString()),lt($,x.dataset.session),window.scrollTo(0,0),Pe($),b();return}const te=n.closest('[data-act="project-node-link"]');if(te instanceof HTMLElement&&te.dataset.nodeTarget!==void 0){Dl(te.dataset.nodeTarget);return}const An=n.closest('[data-act="project-card-link"]');if(An instanceof HTMLElement&&An.dataset.root!==void 0){Wl(An.dataset.root);return}const Pn=n.closest('[data-act="notice-dismiss"]');if(Pn instanceof HTMLElement&&Pn.dataset.key!==void 0){d.noticeDismissed||(d.noticeDismissed={}),d.noticeDismissed[Pn.dataset.key]=!0,b();return}if(n.closest('[data-act="project-memory-dismiss"]')){d.projectMemoryDismissed=!0,b();return}const De=n.closest('[data-act="session"]');if(De instanceof HTMLElement&&De.dataset.id!==void 0){const $=Ee();$&&(d.protocolBannerProjectRoot=void 0,d.sessionSel||(d.sessionSel={}),d.sessionSel[$.harness]=De.dataset.id,Wn(d,$.harness,De.dataset.id,new Date().toISOString()),lt($.harness,De.dataset.id),b());return}const sn=n.closest('[data-act="sugg-plan"]');if(sn instanceof HTMLElement&&sn.dataset.item!==void 0){oa(sn.dataset.item,sn.dataset.enable==="1");return}const Cn=n.closest('[data-act="sugg-dismiss"]');if(Cn instanceof HTMLElement&&Cn.dataset.sugg!==void 0){const $=Ee();if($){const j=ye(d.narratives?.[$.harness]??null,d.projects??null),B=Te(j,d.sessionSel?.[$.harness])??"";d.suggHidden||(d.suggHidden={}),d.suggHidden[`${$.harness}:${B}:${Cn.dataset.sugg}`]=!0,b()}return}const xn=n.closest('[data-act="todo"]');if(xn instanceof HTMLElement&&xn.dataset.id!==void 0){Hl(xn.dataset.id);return}const on=n.closest('[data-act="node"]');if(on instanceof HTMLElement&&on.dataset.key!==void 0){const $=d.nodeOpen??{};d.nodeOpen={...$,[on.dataset.key]:$[on.dataset.key]!==!0},b();return}const In=n.closest('[data-act="workflow-fold"]');if(In instanceof HTMLElement&&In.dataset.key!==void 0){e.preventDefault(),Un(In.dataset.key);return}if(n.closest('[data-act="evidence"]')){e.preventDefault();const $=Ee();if($){const j=Te(ye(d.narratives?.[$.harness]??null,d.projects??null),d.sessionSel?.[$.harness]);j!==null&&Un(`${$.harness}:${j}:evidence`)}return}if(n.closest('[data-act="raw"]')){d.rawOpen=!d.rawOpen,b();return}if(n.closest('[data-act="island-reveal"]')){Ft=++bl,ie();return}if(D&&ue&&n.closest('[data-act="ack-turn-ended"]')){da(),b();return}if(n.closest('[data-act="toggle"]')){if(ue)return;const $=!d.open;if(D&&$){const j=St(d);j&&(j.harness!==d.islandApplied?.harness||j.id!==d.islandApplied.id)&&Wn(d,j.harness,j.id,new Date().toISOString()),da()}d.open=$,D&&$&&Le(),b();return}if(n.closest('[data-act="demo"]')){Vl();return}if(n.closest('[data-act="lic-open"]')){d.licenseOpen=!0,d.licenseRefreshResult=null,b();return}if(n.closest('[data-act="lic-refresh"]')){d.tierLock=!1,d.licenseOpen=!0,El();return}if(n.closest('[data-act="lic-close"]')){d.licenseOpen=!1,d.licenseRefreshResult=null,b();return}if(n.closest('[data-act="lic-import"]')){d.tierLock=!1,b(),Nl();return}if(n.closest('[data-act="tier-lock-close"]')){d.tierLock=!1,b();return}if(n.closest('[data-act="free-harness-change"]')){d.license?.tier==="free"&&Date.parse(d.license.freeHarnessSwitchableAt??"")<=Date.now()&&(d.freeHarnessChoosing=!d.freeHarnessChoosing,b());return}const jn=n.closest('[data-act="free-harness"]');if(jn instanceof HTMLElement&&J.includes(jn.dataset.harness)){Rl(jn.dataset.harness);return}if(n.closest('[data-act="import-close"]')){d.importResult=null,b();return}if(n.closest('[data-act="share-config"]')){Xl();return}if(n.closest('[data-act="share-events"]')){Zl();return}const Rn=n.closest('[data-act="share-del"]');if(Rn instanceof HTMLElement&&Rn.dataset.i!==void 0){ed(Number(Rn.dataset.i));return}if(n.closest('[data-act="share-send"]')){nd();return}if(n.closest('[data-act="share-close"]')){Lr();return}const We=n.closest('[data-act="tgl"]');if(We instanceof HTMLElement&&We.dataset.id){const $=We.dataset.value;if($!==void 0&&$!=="accept"&&$!=="hold"&&$!=="refuse")return;oa(We.dataset.id,We.dataset.enable==="0"?!1:void 0,$);return}if(n.closest('[data-act="plan-confirm"]')){Ql();return}if(n.closest('[data-act="plan-cancel"]')){Fr();return}const le=n.closest("[data-tab]");if(le instanceof HTMLElement&&le.dataset.tab){if(ce(le.dataset.tab,d.license)){Re(le.dataset.tab),b();return}const $=le.dataset.tab==="projects"&&d.active!=="projects";Re(le.dataset.tab),le.dataset.tab==="projects"?$||$e():J.includes(le.dataset.tab)&&Pe(le.dataset.tab),b()}});document.addEventListener("keydown",e=>{if(d.mobile?.confirmPairId){if(e.key==="Escape"){e.preventDefault(),H.closeConfirmation();return}if(e.key==="Tab"){const t=Array.from(O?.querySelectorAll(".mobile-overlay button:not(:disabled)")??[]),r=t[0],s=t.at(-1);e.shiftKey&&document.activeElement===r&&(e.preventDefault(),s?.focus()),!e.shiftKey&&document.activeElement===s&&(e.preventDefault(),r?.focus())}}if((e.key==="Enter"||e.key===" ")&&e.target instanceof HTMLElement&&e.target.matches('.project-row[data-act="project-expand"]')){e.preventDefault(),e.target.click();return}const n=e.target;if(n instanceof HTMLElement&&n.dataset.act==="task-rename-input"&&n.dataset.key!==void 0){const t=n;if(e.key==="Enter"){e.preventDefault(),e.stopPropagation(),we(n.dataset.key,{title:t.value});return}if(e.key==="Escape"){e.preventDefault(),e.stopPropagation(),d.taskMenuOpen=null,d.taskResumeOpen=null,b();return}}if(e.key==="Escape"){if(d.forgetProject){d.forgetProject.busy||(d.forgetProject=void 0),b();return}if(d.share){Lr();return}if(d.importResult){d.importResult=null,b();return}if(d.licenseOpen){d.licenseOpen=!1,b();return}if(d.tierLock){d.tierLock=!1,b();return}if(d.flow){d.flow.phase!=="applying"&&Fr();return}D&&d.open&&(d.open=!1,b())}});const se=document.createElement("div");se.id="tip";document.body.appendChild(se);document.addEventListener("mousemove",e=>{const t=e.target?.closest("[data-tip]");if(!(t instanceof HTMLElement)||!t.dataset.tip){se.style.display="none";return}se.textContent=t.dataset.tip,se.style.display="block";const r=se.offsetWidth;let s=e.clientX+14;s+r>window.innerWidth-8&&(s=e.clientX-r-14),se.style.left=`${Math.max(8,s)}px`,se.style.top=`${e.clientY+14}px`});document.addEventListener("mousedown",()=>{se.style.display="none"});window.addEventListener("blur",()=>{se.style.display="none"});let la="";setInterval(()=>{document.visibilityState==="visible"&&Date.now()-Rr>=3e4&&pe();const e=d.configs.find(r=>r.harness===d.active)??d.configs[0];if(!e||X.entries.length===0)return;const n=Na(X.entries,e.harness,e.capabilities.live,Date.now()),t=`${n.active}:${n.label}`;t!==la&&(la=t,b())},1e3);setInterval(()=>{document.visibilityState==="visible"&&Le()},6e4);setInterval(()=>{xr()&&H.load()},15e3);document.addEventListener("visibilitychange",()=>{Dt(),document.visibilityState==="visible"&&pe(),document.visibilityState==="visible"&&(d.anatomyLoadedAt===null||d.anatomyLoadedAt===void 0||Date.now()-Date.parse(d.anatomyLoadedAt)>6e4)&&Le()});function da(){const e=St(d);e?.kind==="turnEnded"&&(d.turnEndedAck={...d.turnEndedAck,[`${e.harness}:${e.id}`]:e.at})}$s(()=>{if(!D)return d.narratives?.[Ee()?.harness??"cc"]??null;const e=kn(d).filter(({session:n,narrative:t})=>n.waiting||t?.taskWorkflow?.feedback.state==="needs_user"||n.lastInstruction!==void 0&&!n.ended&&n.turnEnded);return J.flatMap(n=>{const t=d.narratives?.[n];if(!t)return[];const r=e.filter(s=>s.harness===n).map(s=>s.session);return[{...t,sessions:r,states:Object.fromEntries(r.flatMap(s=>{const i=t.states[s.id];return i?[[s.id,i]]:[]}))}]})},b,e=>{Pe(e.harness)},1e4,D);pe().then(()=>Le()).then(()=>{D||H.load(),$e(),Ut();for(const e of J)Pe(e);_l(),Fl()});document.addEventListener("toggle",Lt,!0);window.addEventListener("resize",()=>{Lt(),D&&ie()});
381
+ </div>${te("overlays",e.overlays)}`}const Er=50;function Tl(e,n,t=Er){const r={};let s;const o=()=>{s!==void 0&&(clearTimeout(s),s=void 0);const i=e(),c=Object.keys(i).filter(p=>r[p]!==i[p]);if(c.length!==0){n({regions:c,html:i});for(const p of c)r[p]=i[p]}};return{request(){s!==void 0&&clearTimeout(s),s=setTimeout(o,t)},flush:o,cancel(){s!==void 0&&clearTimeout(s),s=void 0}}}const D=wt(window.location.search),dt=Tt(window.location.search);let fe=Ra(window.location.search)&&(dt==="top"||dt==="bottom");D&&(document.documentElement.classList.add("island"),document.documentElement.dataset.islandEdge=dt,St(window.location.search)&&document.documentElement.classList.add("island-tab-mode"),fe&&document.documentElement.classList.add("island-compact"));function Al(){try{const e=localStorage.getItem("wingman.activeTab");return e!==null&&["projects","cc","codex","dsh"].includes(e)?e:"projects"}catch{return"projects"}}function ct(e){d.expandedProjects=[...new Set(e)],vt("wingman.projects.expanded",d.expandedProjects)}function qn(e){d.expandedText={...d.expandedText,[e]:d.expandedText?.[e]!==!0},vt("wingman.folds",Object.keys(d.expandedText).filter(n=>d.expandedText?.[n]===!0&&(n===et||n===Ta||n===Aa||n.startsWith(Pa)||/^panel:controls:(cc|codex|dsh):(base|rules|skills|tools|gates|history|features)$/.test(n)||/^panel:cc:(inbound|outbound)-help$/.test(n)||/^panel:(help|(?:cc|codex|dsh):(?:connection|protocol|context))$/.test(n)||/^project:.+:(branches|done|full|points)$/.test(n)||/:(plan|verification|recent|evidence|feedback)$/.test(n)))),b()}const ee={entries:[],connection:"connecting",replaying:!1},d={wingmanVersion:void 0,availableLocales:oe(),configs:[],active:Al(),open:!D,error:null,anatomyLoadedAt:null,anatomyRefreshFailed:!1,live:ee,flow:null,license:null,licenseOpen:!1,licenseRefreshing:!1,licenseRefreshResult:null,licenseCanSubscribe:!1,importResult:null,share:null,view:"tasks",narratives:{},projects:null,projectOrder:[],expandedProjects:Mn("wingman.projects.expanded"),oldSessionsOpen:Mn("wingman.sessions.older.expanded"),expandedText:Object.fromEntries(Mn("wingman.folds").map(e=>[e,!0])),projectMemoryDismissed:!1,projectRefreshFailed:!1,taskFilter:be,taskMenuOpen:null,taskResumeOpen:null,hiddenOpen:{},factsOpen:{},taskError:null,sessionSel:{},sessionSeen:{},turnEndedAck:{},noticeDismissed:{},suggHidden:{},island:D,islandSize:fe?"compact":"standard",islandTab:St(window.location.search),todoOpen:{},nodeOpen:{},rawOpen:!1};let cn=null,Vn=0,Pl=0,Ht=null,ia=!1,bn=null,q=null;const pn=Ws((e,n)=>{e==="retract"?(bn=n,ie()):(q?.remove(),q=null)}),O=document.querySelector("#app");function an(){return O!==null&&typeof O.querySelector=="function"}function Ut(){if(!(!O||!an()))for(const e of O.querySelectorAll("button.expand")){const n=document.getElementById(e.getAttribute("aria-controls")??"");n&&(e.hidden=e.getAttribute("aria-expanded")!=="true"&&!(n.clientHeight>0&&n.scrollHeight>n.clientHeight+1))}}function xl(){if(!O||!an())return{panes:[],rawEvents:null,details:[]};const e=Array.from(O.querySelectorAll("[data-panel-view]")).map(r=>[r.dataset.panelView??"",r.scrollTop]),n=O.querySelector('[data-panel-region="raw-events"] .feed'),t=Array.from(O.querySelectorAll(".project-tech, .project-node-children")).map(r=>[`${r.closest("[id]")?.id??""}:${r.className}`,r.open]);return{panes:e,rawEvents:n?.scrollTop??null,details:t}}function Cl(e){if(!O||!an())return;for(const[r,s]of e.panes){const o=O.querySelector(`[data-panel-view="${r}"]`);o&&(o.scrollTop=s)}const n=O.querySelector('[data-panel-region="raw-events"] .feed');n&&e.rawEvents!==null&&(n.scrollTop=e.rawEvents);const t=new Map(e.details);for(const r of O.querySelectorAll(".project-tech, .project-node-children")){const s=t.get(`${r.closest("[id]")?.id??""}:${r.className}`);s!==void 0&&(r.open=s)}}function Il(){if(!O||!an())return;O.querySelector(".wrap")?.classList.toggle("open",d.open);const e=d.active==="projects"?"projects":d.view??"tasks";for(const n of O.querySelectorAll("[data-panel-view]"))n.classList.toggle("act",n.dataset.panelView===e)}function Rl(e){return e!=="layout"&&e!=="visibility"}function jl(e){if(!O)return;if(!an()){O.innerHTML=_n(e.html),D&&ie();return}const n=document.activeElement instanceof HTMLElement&&document.activeElement.dataset.act==="expand"?document.activeElement.id:void 0,t=document.activeElement instanceof HTMLElement&&document.activeElement.matches('.fold > summary, .feedback-reason > summary, .cc-feature-help > summary, [data-act="old-sessions-toggle"]')?{act:document.activeElement.dataset.act,key:document.activeElement.dataset.key??document.activeElement.dataset.group}:void 0,r=xl(),s=pn.element,o=e.html.layout;if(O.dataset.panelLayout!==o||o!=="panel")O.innerHTML=_n(e.html),O.dataset.panelLayout=o;else{const p=e.regions.filter(Rl),u=p.map(m=>O.querySelector(`[data-panel-region="${m}"]`));if(u.some(m=>m===null))O.innerHTML=_n(e.html);else for(let m=0;m<p.length;m+=1){const f=u[m];if(!f)continue;const h=e.html[p[m]];if(p[m]==="pill"&&s?.isConnected&&f.contains(s)&&!d.open&&!d.islandTab){const v=document.createElement("div");v.innerHTML=h;const y=v.querySelector(".pill");y&&Ds(s,y)}else f.innerHTML=h}}if(Il(),D){const p=O.querySelector(".island-tab.wait, .pill.waiting")!==null;d.islandTab&&p&&!ia&&O.querySelector(".island-tab")?.classList.add("pulse"),ia=p}if(Cl(r),Ut(),n!==void 0&&document.getElementById(n)?.focus({preventScroll:!0}),t!==void 0)for(const p of O.querySelectorAll('.fold > summary, .feedback-reason > summary, .cc-feature-help > summary, [data-act="old-sessions-toggle"]'))p.dataset.act===t.act&&(p.dataset.key??p.dataset.group)===t.key&&p.focus({preventScroll:!0});D&&ie();const c=O.querySelector('.mobile-overlay [role="dialog"]');c&&!c.contains(document.activeElement)&&c.querySelector('[data-act="mobile-close"]')?.focus()}let Nr=new Date().toISOString();const rn=Tl(()=>Sl(d,Nr),jl,0),H=Js({list:async e=>{const n=e?`?pairing=${encodeURIComponent(e)}`:"",t=await fetch(`/api/mobile${n}`),r=await t.json(),s=Ys(r);if(!t.ok||!s)throw new Error("mobile.unavailable");return s},create:async()=>{const e=await fetch("/api/mobile/pair",{method:"POST",headers:{"Content-Type":"application/json"},body:"{}"}),n=await e.json();if(!e.ok)throw new Error(n?.code??n?.error??"mobile.unavailable");if(typeof n?.pairId!="string"||!/^[A-Za-z0-9_-]+$/.test(n.pairId)||typeof n.url!="string"||!n.url.startsWith("wingman-pair://v1?"))throw new Error("mobile.unavailable");return{pairId:n.pairId,url:n.url}},remove:async e=>{const n=encodeURIComponent(e),t=await fetch(`/api/mobile/pair/${n}`,{method:"DELETE"});if(!t.ok){const s=await t.json();throw new Error(s?.code??s?.error??"mobile.unavailable")}const r=await t.json();return r?.notice==="mobile.localRemoved"?{notice:r.notice}:void 0}},()=>{H.state.error==="cli.server.mobileRequiresLicense"&&(d.tierLock=!0,ae()),H.state.error==="cli.server.fixturesMobile"&&(d.flow={phase:"demo",title:a("panel.mobile.heading")},H.state.error=null,H.state.confirmPairId=null),d.mobile={...H.state},b()});d.mobile=H.state;window.addEventListener("pagehide",()=>H.dispose(),{once:!0});window.addEventListener("wingman-island-shape",e=>{if(!D)return;const{tab:n,edge:t,phase:r,seq:s}=e.detail,o=r!==void 0&&s!==void 0&&(t==="left"||t==="right");o?(q??=O?.querySelector(".island-tab")??null,q&&(q.classList.add("island-transition-tab"),document.body.append(q))):(pn.cancel(),q?.remove(),q=null);const i=new URL(window.location.href);i.searchParams.set("edge",t),n&&!o?i.searchParams.set("tab","1"):i.searchParams.delete("tab"),history.replaceState(null,"",i);const c=Tt(i.search);fe=Ra(i.search)&&(c==="top"||c==="bottom");const p=fe?"compact":"standard",u=St(i.search),m=d.islandSize!==p||d.islandTab!==u;if(d.islandSize=p,d.islandTab=u,(d.islandTab||fe)&&(d.open=!1),Ht=null,bn=null,document.documentElement.dataset.islandEdge=c,document.documentElement.classList.toggle("island-compact",fe),document.documentElement.classList.toggle("island-tab-mode",d.islandTab),(!o||m)&&(b(),(o||r==="prepare")&&rn.flush()),r==="prepare"&&!o&&ie(),o){const f=O?.querySelector(".pill");if(f){if(!q){const h=document.createElement("div");h.innerHTML=hn(f.classList.contains("waiting")?"waiting":f.classList.contains("turn-ended")?"turnEnded":f.querySelector(".dot.live")?"working":"idle"),q=h.firstElementChild,q.classList.add("island-transition-tab"),document.body.append(q)}q.style.left=`clamp(0px, ${t==="left"?f.offsetLeft-6:f.offsetLeft+f.offsetWidth}px, calc(100vw - 6px))`,q.style.top=`clamp(0px, ${f.offsetTop+(f.offsetHeight-64)/2}px, calc(100vh - 64px))`,pn.start(f,t,r,s,matchMedia("(prefers-reduced-motion: reduce)").matches)}else pn.cancel(),q?.remove(),q=null,r==="retract"&&(bn=s);ie()}});let Ke=!1,$e=0,L=0;function Or(){return document.visibilityState==="visible"&&d.active==="projects"&&d.open&&!D&&d.license?.tier!=="free"}function Bt(){H.setVisible(Or())}function Mr(e){d.view=e}function b(){d.active=At(d.active,d.license),Bt(),Nr=new Date().toISOString(),Ke&&$e===0&&rn.request()}function ie(){let e=null;const n=d.open?document.querySelector(".panel"):d.islandTab?document.querySelector(".island-tab"):document.querySelector(".pill")??document.querySelector(".empty-state");n&&(e={x:n.offsetLeft,y:n.offsetTop,w:n.offsetWidth,h:n.offsetHeight});const t=js(d.open,e,cn,El(),Ht,bn);window.location.hash!==t&&history.replaceState(null,"",t)}function El(){let e=null;for(const n of z){if(pe(n,d.license))continue;const t=Xa(ke(d.narratives?.[n]??null,d.projects??null));if(!t)continue;const r=Date.parse(t.since);Number.isFinite(r)&&(e===null||r>e.sinceMs)&&(e={sinceMs:r,message:a("island.waitingForYou",{p0:E[n],p1:t.message})})}return e}function Nl(e){Vn+=1,cn={target:e,seq:Vn},ie();const n=Vn;setTimeout(()=>{cn?.seq===n&&(cn=null,ie())},600)}let _t=!1;async function Fr(){try{const e=await fetch("/api/settings");if(!e.ok)return;const n=await e.json();return!oe().some(({tag:t})=>t===n.locale)||!["settings","arg","system","default"].includes(n.source??"")||!Array.isArray(n.available)||!n.available.every(t=>t&&typeof t.nativeName=="string"&&oe().some(({tag:r})=>r===t.tag))?void 0:(_t=!0,n)}catch{return}}function pt(e){if(e===void 0&&_t&&Ke)return Me();if(e?.source!=="settings")try{const n=localStorage.getItem("wingman.locale");if(oe().some(({tag:t})=>t===n))return n}catch{}return e?.locale??ds(navigator.language)??"en"}let qe;function qt(e){const n=++L,t=(qe??Promise.resolve()).then(()=>Ol(e,n));return qe=t,t.finally(()=>{qe===t&&(qe=void 0)})}async function Ol(e,n){if(n!==L)return!1;const t=Me(),r={configs:d.configs,anatomyLoadedAt:d.anatomyLoadedAt,anatomyRefreshFailed:d.anatomyRefreshFailed,error:d.error,active:d.active,projects:d.projects,projectOrder:d.projectOrder,projectMemoryDismissed:d.projectMemoryDismissed,projectRefreshFailed:d.projectRefreshFailed,narratives:{...d.narratives},sessionSel:{...d.sessionSel},sessionSeen:{...d.sessionSeen},turnEndedAck:{...d.turnEndedAck}};$e+=1,rn.cancel();for(const o of z){const i=Je[o];i!==void 0&&clearTimeout(i),delete Je[o]}Re!==void 0&&clearTimeout(Re),Re=void 0,ze(e);let s=!1;try{return s=(await Promise.all([Le(!1),we(!1,!0),...z.map(i=>Pe(i,!0))])).every(Boolean)&&n===L,s&&await Promise.all([ae(),Vt()]),s}finally{s||(ze(t),Object.assign(d,r,{turnEndedAck:{...r.turnEndedAck,...d.turnEndedAck}})),$e-=1,b()}}let Ye=!1;async function la(e){const n=++L;if(await qe,n===L){ze(e);try{localStorage.setItem("wingman.locale",e)}catch{}b()}}async function Ml(e){if(!(Ye||!oe().some(({tag:n})=>n===e))){if(!_t){await la(e);return}Ye=!0,L+=1;try{const n=await fetch("/api/settings",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({locale:e})});n.status===403?await la(e):n.ok?await qt(e):(d.error=await ne(n),b())}catch(n){d.error=Q(n),b()}finally{Ye=!1}}}async function Le(e=!0){if(e&&$e>0)return!1;const n=L;let t=!1;const r=e?Fr():void 0;try{const s=d.wingmanVersion===void 0?fetch("/api/version").then(async m=>{if(!m.ok)return null;const f=await m.json();if(typeof f!="object"||f===null||!("version"in f))return null;const h=f.version;return typeof h=="string"&&h!==""?h:null}).catch(()=>null):Promise.resolve(d.wingmanVersion),[o,i,c]=await Promise.all([fetch("/api/anatomy"),s,r]);if(n!==L)return!1;if(e){d.availableLocales=c?.available??oe();const m=pt(c);if(!Ke)ze(m);else if(m!==Me())return qt(m)}if(d.wingmanVersion=i,!o.ok)throw new Error(`GET /api/anatomy → HTTP ${o.status}`);const p=await o.json();if(n!==L)return!1;const u=Zs(p);d.configs=u,d.anatomyLoadedAt=new Date().toISOString(),d.anatomyRefreshFailed=!1,d.active=d.active==="projects"||u.some(m=>m.harness===d.active)?d.active:"projects",d.error=null,t=!0}catch(s){if(n!==L)return!1;d.configs.length===0?d.error=s instanceof Error?s.message:String(s):(d.anatomyRefreshFailed=!0,d.error=null)}if(e){const s=await r;d.availableLocales=s?.available??oe();const o=pt(s);Ke||(ze(o),Ke=!0)}return t&&e&&await ae(),b(),t}async function Vt(){const e=L;try{const n=await fetch("/api/return-target");if(!n.ok)return!1;const t=no(await n.json());return e!==L||t===null?!1:(d.returnTargets?.settings?.unavailable!==t.settings?.unavailable&&(d.returnSettingsDismissed=!1),d.returnTargets=t,b(),!0)}catch{return!1}}async function Fl(e){if(!(d.returnTargetSaving||!d.returnTargets?.available.some(n=>n.bundlePath===e))){d.returnTargetSaving=!0,d.returnTargetError=null,b();try{const n=await fetch("/api/return-target",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({bundlePath:e})});if(!n.ok){d.returnTargetError=await ne(n);return}const t=to(await n.json());if(t===null||t.selected.bundlePath!==e){d.returnTargetError=a("panel.main.backToSessionSettingsResponseUnavailable");return}d.returnTargets={available:d.returnTargets.available,selected:t.selected},d.returnSettingsDismissed=!1}catch{d.returnTargetError=a("panel.main.couldNotSaveBackToSession")}finally{d.returnTargetSaving=!1,b()}}}let Ue=0,Gn=!1;async function we(e=!1,n=!1){if($e>0&&!n)return!1;const t=L;let r=!1;e&&(Gn=!0);const s=++Ue;try{const o=await fetch("/api/projects");if(s!==Ue||t!==L)return!1;if(!o.ok)return d.projectRefreshFailed=!0,!1;const i=ro(await o.json());if(s!==Ue||t!==L)return!1;if(d.projectRefreshFailed=i===null,i!==null){d.projects?.memory!==void 0&&i.memory===void 0&&(d.projectMemoryDismissed=!1);const c=mn(i.projects).map(m=>m.root),p=d.projectOrder??[],u=d.projects?.projects.filter(re).some(m=>c.includes(m.root))??!1;d.projectOrder=Gn||u||d.projects===null?c:[...p.filter(m=>c.includes(m)),...c.filter(m=>!p.includes(m))],Gn=!1,d.projects=i,r=!0}}catch{s===Ue&&t===L&&(d.projectRefreshFailed=!0)}finally{s===Ue&&b()}return r}const Kn=new Set;async function Ll(e){if(Kn.has(e))return;const n=d.projects?.projects.flatMap(i=>"payloadUnavailable"in i?[]:i.sessions).find(i=>`${i.harness}:${i.id}`===e);if(n===void 0)return;Kn.add(e),d.taskResumeOpen=e;const t=Ca(n),r="unavailable"in t?"unavailable":await tt(t.command)?"copied":"failed";let s,o="GET /api/return-target";if(d.returnTargets==null&&!await Vt())s={activated:!1,reason:a("panel.main.couldNotLoadBackToSession")};else if(d.returnTargets?.settings!==void 0)s={activated:!1,reason:d.returnTargets.settings.unavailable};else if(d.returnTargets?.selected===void 0)s={activated:null};else{o="POST /api/return";try{const i=await fetch("/api/return",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({bundlePath:d.returnTargets.selected.bundlePath})});s=i.ok?eo(await i.json())??{activated:!1,reason:a("panel.main.activationResponseUnavailable")}:{activated:!1,reason:await ne(i)}}catch{s={activated:!1,reason:a("panel.main.activationRequestFailed")}}}d.taskReturnResults={...d.taskReturnResults,[e]:{clipboard:r,activation:s,activationSource:o}},Kn.delete(e),b()}async function Dl(){const e=d.forgetProject;if(e===void 0||e.busy)return;e.busy=!0,b();const n=`project:${e.root}`;try{const t=await fetch("/api/project-memory",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({root:e.root,forget:!0})});d.taskError=t.ok?null:{key:n,message:await ne(t)},t.ok&&await we()}catch(t){d.taskError={key:n,message:a("panel.main.organizationRequestFailed",{p0:Q(t)})}}d.forgetProject=void 0,d.taskMenuOpen=null,b()}async function Se(e,n){const t=e.indexOf(":");if(t<1||t===e.length-1)return;const r=e.slice(0,t),s=e.slice(t+1),o=r==="project"?[{root:s,patch:n}]:[{harness:r,sessionId:s,patch:n}];try{for(const i of o){const c=await fetch("/api/task-overlay",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(i)});if(!c.ok){d.taskError={key:e,message:await ne(c)},await we(r==="project"),b();return}}}catch(i){d.taskError={key:e,message:a("panel.main.organizationRequestFailed",{p0:Q(i)})},b();return}d.taskError=null,d.taskMenuOpen=null,d.taskResumeOpen=null,await we(r==="project"),(n.accepted!==void 0||n.archived!==void 0)&&z.includes(r)&&await Pe(r)}let ut=0,Lr=0;function Pn(e){ut+=1;const n=e.tier!==d.license?.tier;e.tier==="free"&&(d.license?.tier!=="free"||d.license.freeHarness!==e.freeHarness)&&(me+=1,d.share=null),(e.tier!=="free"||d.license?.freeHarnessSwitchableAt!==e.freeHarnessSwitchableAt)&&(d.freeHarnessChoosing=!1),d.license=e,e.tier!=="free"&&(d.tierLock=!1);const t=At(d.active,e);t!==d.active&&(W+=1,d.flow=null),d.active=t,n&&H.state.pairing&&!D&&(Bt(),H.load()),D&&ie()}async function ae(){const e=L,n=++ut;Lr=Date.now();try{const t=await fetch("/api/license");if(!t.ok)return;const r=kn(await t.json());if(e!==L||n!==ut)return;r&&(Pn(r),b())}catch{}}let Yn=!1;async function Wl(e){if(!(Yn||d.license?.tier!=="free")&&!(Date.parse(d.license.freeHarnessSwitchableAt??"")>Date.now())){Yn=!0;try{const n=await fetch("/api/settings",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({freeHarness:e})});if(!n.ok)throw new Error(await ne(n));d.tierLock=!1,d.freeHarnessChoosing=!1,await ae()}catch(n){d.licenseOpen=!0,d.licenseRefreshResult={ok:!1,message:Q(n)},b()}finally{Yn=!1}}}async function Hl(){if(d.licenseRefreshing)return;d.licenseRefreshing=!0,d.licenseRefreshResult=null,d.licenseCanSubscribe=!1,b();let e;try{e=await fetch("/api/license/refresh",{method:"POST",headers:{"x-wingman-panel-action":"refresh-license"}})}catch(r){d.licenseRefreshing=!1,d.licenseRefreshResult={ok:!1,message:a("panel.main.refreshFailed",{p0:Q(r)})},b();return}if(!e.ok){const r=await nd(e);d.licenseRefreshing=!1,d.licenseCanSubscribe=r.canSubscribe,d.licenseRefreshResult={ok:!1,message:r.message},b(),ae();return}let n;try{n=await e.json()}catch{n=null}const t=kn(n);t&&Pn(t),d.licenseRefreshing=!1,d.licenseCanSubscribe=!1,d.licenseRefreshResult={ok:!0,message:t?a("panel.main.licenseRefreshed",{p0:t.detail}):a("panel.main.licenseRefreshedReopenThePanelTo")},b(),ae()}let Jn=!1;async function zn(e,n){if(!Jn){Jn=!0;try{const t=await fetch("/api/license/devices",{method:"POST",headers:{"content-type":"application/json","x-wingman-panel-action":"license-devices"},body:JSON.stringify({action:e,...n===void 0?{}:{id:n}})});if(!t.ok)throw new Error(await ne(t));const r=kn(await t.json());r&&Pn(r),d.licenseRefreshResult=null,b()}catch(t){d.licenseOpen=!0,d.licenseRefreshResult={ok:!1,message:Q(t)},b(),ae()}finally{Jn=!1}}}function Ul(){const e=document.createElement("input");e.type="file",e.accept=".json,application/json";const n=()=>{D&&!d.open&&(d.open=!0,b())};if(e.addEventListener("change",()=>{n();const t=e.files?.[0];t&&Dr(t)}),e.addEventListener("cancel",n),D&&d.open){d.open=!1,b(),window.setTimeout(()=>e.click(),200);return}e.click()}async function Dr(e){let n;try{n=await e.text()}catch(t){d.importResult={ok:!1,message:a("panel.main.couldNotReadFile",{p0:Q(t)})},b();return}await Bl(n)}async function Bl(e){let n;try{n=await fetch("/api/license/install",{method:"POST",headers:{"content-type":"application/json"},body:e})}catch(r){d.importResult={ok:!1,message:a("panel.main.importRequestFailed",{p0:Q(r)})},b();return}if(!n.ok){d.importResult={ok:!1,message:await ne(n)},b(),ae();return}let t=null;try{t=kn(await n.json())}catch{t=null}t&&(Pn(t),d.licenseCanSubscribe=!1),d.importResult={ok:!0,message:Os(t)},b(),ae()}if(D)document.addEventListener("dragover",e=>e.preventDefault()),document.addEventListener("drop",e=>e.preventDefault());else{const e=document.createElement("div");e.id="drop",e.textContent=a("panel.main.dropToImportLicense"),document.body.appendChild(e);let n=0;const t=r=>Array.from(r.dataTransfer?.types??[]).includes("Files");document.addEventListener("dragenter",r=>{t(r)&&(r.preventDefault(),n+=1,e.style.display="flex")}),document.addEventListener("dragover",r=>{t(r)&&r.preventDefault()}),document.addEventListener("dragleave",r=>{t(r)&&(n=Math.max(0,n-1),n===0&&(e.style.display="none"))}),document.addEventListener("drop",r=>{if(!t(r))return;r.preventDefault(),n=0,e.style.display="none";const s=Array.from(r.dataTransfer?.files??[]),o=Ms(s.map(c=>c.name));if(o){d.importResult={ok:!1,message:o},b();return}const i=s[0];i&&Dr(i)})}const Gt=Er,Je={},Be={};let Re;async function Pe(e,n=!1){if($e>0&&!n)return!1;const t=L;let r=!1;const s=(Be[e]??0)+1;Be[e]=s;try{const o=await fetch(`/api/narrative?harness=${e}`);if(Be[e]!==s||t!==L||!o.ok)return!1;const i=await o.json();if(Be[e]!==s||t!==L)return!1;const c=so(i);if(c){d.narratives||(d.narratives={}),d.narratives[e]=c,r=!0;const p=Te(ke(c,d.projects??null),d.sessionSel?.[e]);p!==null&&(d.sessionSel||(d.sessionSel={}),d.sessionSel[e]=p,ft(e,p))}}catch{}finally{Be[e]===s&&b()}return r}function ft(e,n){const t=d.narratives?.[e]?.sessions.find(r=>r.id===n);t&&(d.sessionSeen||(d.sessionSeen={}),d.sessionSeen[`${e}:${n}`]=t.lastActivity)}function Wr(e){Je[e]===void 0&&(Je[e]=window.setTimeout(()=>{delete Je[e],Pe(e)},Gt))}function _l(){Re===void 0&&(Re=window.setTimeout(()=>{Re=void 0,we()},Gt))}const Qn=new Set;let Xn;function da(e){Qn.add(e),Xn===void 0&&(Xn=window.setTimeout(async()=>{Xn=void 0;const n=[...Qn];if(Qn.clear(),$e>0||Ye)return;const t=L,r=await Fr();if(t!==L||$e>0||Ye)return;const s=pt(r);if(d.availableLocales=r?.available??oe(),s!==Me())await qt(s);else{for(const o of n)Wr(o);_l()}},Gt))}function ql(){const e=new EventSource("/api/narrative/events");e.onopen=()=>{for(const n of z)da(n)},e.onmessage=n=>{try{const t=JSON.parse(n.data);z.includes(t.harness)&&da(t.harness)}catch{}}}function Vl(){const e=d.configs.find(r=>r.harness===d.active)??d.configs[0];if(!e)return null;const n=ke(d.narratives?.[e.harness]??null,d.projects??null),t=Te(n,d.sessionSel?.[e.harness]);return n===null||t===null?null:n.states[t]??null}function je(e){if(pe(e,d.license)){d.tierLock=!0;return}d.tierLock=!1,d.protocolBannerProjectRoot=void 0;const n=e==="projects"&&d.active!=="projects";d.active=e;try{localStorage.setItem("wingman.activeTab",e)}catch{}n&&(d.projectOrder=mn(d.projects?.projects??[]).map(t=>t.root),we(!0))}function Hr(e){const n=d.projects?.projects.find(t=>t.root===e);n&&re(n)&&(d.archivedProjectsOpen=!0),n&&$t([n],d.taskFilter??be).length===0&&(d.taskFilter=be),ct([...d.expandedProjects??[],n?.root??e])}function Gl(e){je("projects");const n=d.projects?.projects.find(t=>e.startsWith(`project-node-${encodeURIComponent(`${t.root}:`)}`));n&&Hr(n.root),b(),window.setTimeout(()=>{const t=document.getElementById(e);let r=t?.parentElement;for(;r;)r instanceof HTMLDetailsElement&&(r.open=!0),r=r.parentElement;t?.scrollIntoView({block:"center"})},0)}function Kl(e){je("projects"),Hr(e),b(),window.setTimeout(()=>{document.getElementById(vn(e))?.scrollIntoView({block:"center"})},0)}function Yl(e){const n=d.todoOpen??{};let t;if(e==="__other__")t=n[e]!==!1;else{const r=Vl()?.todos.find(s=>s.id===e);t=r?sr(r,n):n[e]===!0}d.todoOpen={...n,[e]:!t},b()}const z=["cc","codex","dsh"],Jl=["all","waiting","turnEnded","active","ended"];function zl(e){if(typeof e!="object"||e===null)return null;const n=e;if(!z.includes(n.harness)||typeof n.received_at!="string")return null;const t=n.payload;return typeof t!="object"||t===null||typeof t.hook_event_name!="string"?null:e}function Ur(e,n,t){const r={event:e,...n===void 0?{}:{mock:n},...t===void 0?{}:{sseId:t}};ee.entries=_s(ee.entries,r),Wr(e.harness)}function Ql(){const e=new EventSource("/api/events");e.onopen=()=>{ee.connection!=="open"&&(ee.connection="open",b())},e.onmessage=n=>{try{const t=zl(JSON.parse(n.data));t&&Ur(t,void 0,n.lastEventId||void 0)}catch{}},e.onerror=()=>{ee.connection!=="retrying"&&(ee.connection="retrying",b())}}const Xl=200;async function Zl(){if(!ee.replaying){ee.replaying=!0,b();try{const e=await fetch("/api/live-demo.json");if(!e.ok)throw new Error(`GET /api/live-demo.json → HTTP ${e.status}`);const n=await e.json();for(const t of n.events)Ur({harness:n.harness,received_at:new Date().toISOString(),payload:t},!0),await new Promise(r=>setTimeout(r,Xl))}catch{}ee.replaying=!1,b()}}let W=0;function Ee(){return d.configs.find(e=>e.harness===d.active)??d.configs[0]}function ed(e,n){for(const t of Fe){const r=(e.slots[t]??[]).find(s=>s.id===n);if(r)return r}}function Br(){W+=1,d.flow=null,b()}function Q(e){return e instanceof Error?e.message:String(e)}async function ne(e){const n=await e.text();try{const t=JSON.parse(n);if(typeof t.error=="string"&&t.error!=="")return t.error}catch{}return`HTTP ${e.status}${n?` — ${n}`:""}`}async function nd(e){const n=await e.text();try{const t=JSON.parse(n);if(typeof t.error=="string"&&t.error!=="")return{message:t.error,canSubscribe:t.canSubscribe===!0}}catch{}return{message:`HTTP ${e.status}${n?` — ${n}`:""}`,canSubscribe:!1}}async function td(e,n){try{const t=await fetch("/api/action-plan-demo.json");if(!t.ok)throw new Error(`GET /api/action-plan-demo.json → HTTP ${t.status}`);const r=await t.json(),s=typeof r.__mock_note=="string"?r.__mock_note:"";if(!s.includes("MOCK"))throw new Error(a("panel.main.demoSampleIsMissingItsMock"));const o=wa(r.plan);if(e!==W)return;d.flow={phase:"confirm",title:ka(bs(o),o.action.enable),plan:o,mockNote:s}}catch(t){if(e!==W)return;d.flow={phase:"error",title:n,message:a("panel.main.theServerHasNoActionEndpoint",{p0:Q(t)})}}b()}async function ca(e,n,t){const r=Ee();if(!r)return;const s=ed(r,e);if(!s?.toggleable||s.ccFeature?.overriddenBy||s.ccFeature?.invalid||s.ccFeature?.key==="crossSessionInbound"&&t===void 0)return;const o=t===void 0?n??!s.enabled:!0,i=t===void 0?ka(s.ccFeature?ba(s.ccFeature.key):s.nativeName,o):a("panel.render.ccSetInbound",{value:Zn(t)}),c=++W;d.flow={phase:"planning",title:i},b();const p={kind:"toggle",itemId:e,enable:o,...t===void 0?{}:{value:t}};let u=null;try{u=await fetch("/api/action/plan",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({harness:r.harness,action:p})})}catch{u=null}if(c===W){if(u===null||u.status===404||u.status===405){await td(c,i);return}if(!u.ok){const m=await ne(u);if(c!==W)return;d.flow={phase:"error",title:i,message:m},b();return}try{const m=wa(await u.json());if(c!==W)return;d.flow={phase:"confirm",title:i,plan:m}}catch(m){if(c!==W)return;d.flow={phase:"error",title:i,message:Q(m)}}b()}}async function ad(e,n){const t=a("panel.main.userPlanProtocol",{p0:a(n==="protocol_user_install"?"panel.main.install":"panel.main.uninstall"),p1:E[e]}),r=++W;d.flow={phase:"planning",title:t},b();try{const s=await fetch("/api/action/plan",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({kind:n,harness:e})});if(!s.ok)throw new Error(`HTTP ${s.status} — ${await ne(s)}`);const o=Ss(await s.json());if(o.kind!==n||o.harness!==e)throw new Error(a("panel.main.thePlanDoesNotMatchThe"));if(r!==W)return;d.flow={phase:"confirm",title:t,plan:o}}catch(s){if(r!==W)return;d.flow={phase:"error",title:t,message:Q(s)}}b()}let pa;function rd(e,n){je(e),Mr("control"),d.expandedText={...d.expandedText,[`panel:${e}:protocol`]:!0},d.protocolBannerProjectRoot=e==="dsh"?n:void 0,d.protocolBannerHighlight=e,clearTimeout(pa),b(),rn.flush();const t=document.querySelector(".pane.act .protocol-detail > summary");t?.scrollIntoView({block:"center"}),t?.focus({preventScroll:!0}),pa=setTimeout(()=>{d.protocolBannerHighlight=void 0,b()},2e3)}async function sd(){if(d.flow?.phase!=="confirm")return;const{title:e,plan:n,mockNote:t}=d.flow;if(t){d.flow={phase:"demo",title:e},b();return}const r=++W;d.flow={phase:"applying",title:e},b();let s;try{s=await fetch("/api/action/apply",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify("kind"in n?{kind:n.kind,harness:n.harness}:{harness:n.harness,plan:n})})}catch(o){if(r!==W)return;d.flow={phase:"error",title:e,message:a("panel.main.applyRequestFailed",{p0:Q(o)})},b();return}if(r===W){if(s.status===403){const o=await ne(s);if(r!==W)return;d.flow="kind"in n?{phase:"error",title:e,message:`HTTP 403 — ${o}`}:As(e,o),b();return}if(!s.ok){const o=await ne(s);if(r!==W)return;d.flow={phase:"error",title:e,message:o},b();return}try{const o=await s.json(),i="kind"in n?Ts(o):Sa(o);if(r!==W)return;i.ok?(d.flow={phase:"applied",title:e,...i.backupDir===void 0?{}:{backupDir:i.backupDir}},Le()):d.flow={phase:"error",title:e,message:i.error}}catch(o){if(r!==W)return;d.flow={phase:"error",title:e,message:Q(o)}}b()}}let me=0;function od(){const e=Ee();e&&(me+=1,d.share={kind:"config",title:a("panel.main.shareConfigurationSample",{p0:E[e.harness]}),lines:ei(e),phase:"preview"},b())}function id(){me+=1,d.share={kind:"events",title:a("panel.main.shareEventSample"),lines:ni(ee.entries.filter(e=>!pe(e.event.harness,d.license))),phase:"preview"},b()}function _r(){me+=1,d.share=null,b()}function ld(e){d.share?.phase==="preview"&&(d.share={...d.share,lines:ti(d.share.lines,e)},b())}async function dd(){const e=d.share;if(e?.phase!=="preview"||e.lines.length===0||dr(e.kind,e.lines))return;const n=++me;d.share={...e,phase:"sending"},b();let t;try{t=await fetch(Xo,{method:"POST",headers:{"content-type":"application/json"},body:ir(e.kind,e.lines)})}catch(r){if(n!==me)return;d.share={...e,phase:"error",message:a("panel.main.couldNotSend",{p0:Q(r)})},b();return}if(n===me){if(t.ok)d.share={...e,phase:"sent"};else{const r=await ne(t);if(n!==me)return;d.share={...e,phase:"error",message:r}}b()}}document.addEventListener("change",e=>{const n=e.target;n instanceof HTMLElement&&n.dataset.act==="lang"&&Ml(n.value)});document.addEventListener("click",e=>{const n=e.target;if(!n)return;const t=n.closest('[data-act="expand"]');if(t instanceof HTMLElement&&t.dataset.key!==void 0){const w=t.dataset.key;d.expandedText={...d.expandedText,[w]:d.expandedText?.[w]!==!0},b();return}if(Es({island:D,open:d.open,inPanel:n.closest(".panel")!==null||n.closest(".pill")!==null||n.closest(".empty-state")!==null||n.closest(".overlay")!==null,modalOpen:!!(d.flow||d.share||d.licenseOpen||d.importResult||d.forgetProject||d.mobile?.confirmPairId)})){d.open=!1,b();return}const r=n.closest('[data-act="locate"]');if(r instanceof HTMLElement&&r.dataset.target){Nl(r.dataset.target);return}const s=n.closest('[data-act="view"]');if(s instanceof HTMLElement&&s.dataset.view){Mr(s.dataset.view),b();return}if(n.closest('[data-act="mobile-pair"]')){H.pair();return}const o=n.closest('[data-act="mobile-regenerate"]');if(o?.dataset.pair){H.regenerate(o.dataset.pair);return}if(n.closest('[data-act="mobile-cancel"]')){H.cancelPairing();return}const i=n.closest('[data-act="project-forget"]');if(i?.dataset.root){const w=d.projects?.projects.find(R=>R.root===i.dataset.root);w&&!("payloadUnavailable"in w)&&w.presence==="remembered"&&w.sessions.length===0&&(d.forgetProject={root:w.root,busy:!1},d.taskError=null,b());return}if(n.closest('[data-act="project-forget-close"]')){d.forgetProject?.busy||(d.forgetProject=void 0),b();return}if(n.closest('[data-act="project-forget-confirm"]')){Dl();return}const c=n.closest('[data-act="mobile-unpair"]');if(c?.dataset.pair){H.confirmUnpair(c.dataset.pair);return}if(n.closest('[data-act="mobile-close"]')){H.closeConfirmation();return}if(n.closest('[data-act="mobile-confirm"]')){H.unpair();return}const p=n.closest('[data-act="panel-detail-open"]');if(p instanceof HTMLElement&&p.dataset.key!==void 0){const w=p.dataset.key;d.expandedText?.[w]!==!0&&qn(w),rn.flush();for(const R of O?.querySelectorAll(".panel-detail > summary")??[])if(R.dataset.key===w){R.scrollIntoView({block:"nearest"}),R.focus({preventScroll:!0});break}return}const u=n.closest('[data-act="return-target-select"]');if(u instanceof HTMLElement&&u.dataset.bundlePath!==void 0){Fl(u.dataset.bundlePath);return}if(n.closest('[data-act="return-settings-dismiss"]')){d.returnSettingsDismissed=!0,b();return}const m=n.closest('[data-act="protocol-user"]');if(m instanceof HTMLElement&&(m.dataset.harness==="cc"||m.dataset.harness==="codex")&&(m.dataset.kind==="protocol_user_install"||m.dataset.kind==="protocol_user_uninstall")){ad(m.dataset.harness,m.dataset.kind);return}const f=n.closest('[data-act="goto-protocol-banner"]');if(f instanceof HTMLElement&&z.includes(f.dataset.harness)){rd(f.dataset.harness,f.dataset.root);return}const h=n.closest('[data-act="protocol-copy"]');if(h instanceof HTMLElement&&h.dataset.command!==void 0){tt(h.dataset.command);return}const v=n.closest('[data-act="task-menu"]');if(v instanceof HTMLElement&&v.dataset.key!==void 0){e.stopPropagation();const w=v.dataset.key;d.taskMenuOpen=d.taskMenuOpen===w?null:w,d.taskMenuOpen===null&&(d.taskResumeOpen=null),b();return}if(n.closest('[data-act="task-rename-input"]')){e.stopPropagation();return}const $=n.closest('[data-act="task-accept"]');if($ instanceof HTMLElement&&$.dataset.key!==void 0&&$.dataset.value!==void 0){e.stopPropagation(),Se($.dataset.key,{accepted:$.dataset.value==="true"});return}if(n.closest('[data-act="project-archived-toggle"]')){d.archivedProjectsOpen=!d.archivedProjectsOpen,b();return}const g=n.closest('[data-act="old-sessions-toggle"]');if(g instanceof HTMLElement&&g.dataset.group!==void 0){const w=g.dataset.group,R=d.oldSessionsOpen??[];d.oldSessionsOpen=R.includes(w)?R.filter(_=>_!==w):[...R,w],vt("wingman.sessions.older.expanded",d.oldSessionsOpen),b();return}const k=n.closest('[data-act="session-archived-toggle"]');if(k instanceof HTMLElement&&k.dataset.root!==void 0){const w=k.dataset.root,R=d.archivedSessionsOpen??[];d.archivedSessionsOpen=R.includes(w)?R.filter(_=>_!==w):[...R,w],b();return}const S=n.closest('[data-act="task-archive"]');if(S instanceof HTMLElement&&S.dataset.key!==void 0){e.stopPropagation(),Se(S.dataset.key,{archived:S.dataset.value==="true"});return}const A=n.closest('[data-act="project-archive"]');if(A instanceof HTMLElement&&A.dataset.key!==void 0){e.stopPropagation(),Se(A.dataset.key,{archived:A.dataset.value==="true"});return}const P=n.closest('[data-act="project-move"]');if(P instanceof HTMLElement&&!P.hasAttribute("disabled")&&P.dataset.root!==void 0&&P.dataset.order!==void 0){e.stopPropagation(),Se(`project:${P.dataset.root}`,{order:Number(P.dataset.order)});return}const F=n.closest('[data-act="task-pin"]');if(F instanceof HTMLElement&&F.dataset.key!==void 0&&F.dataset.value!==void 0){e.stopPropagation(),Se(F.dataset.key,{pinned:F.dataset.value==="true"});return}const j=n.closest('[data-act="task-hide"]');if(j instanceof HTMLElement&&j.dataset.key!==void 0&&j.dataset.value!==void 0){e.stopPropagation(),Se(j.dataset.key,{hidden:j.dataset.value==="true"});return}const K=n.closest('[data-act="task-resume"]');if(K instanceof HTMLElement&&K.dataset.key!==void 0){e.stopPropagation();const w=K.dataset.key;Ll(w);return}const x=n.closest('[data-act="task-copy"]');if(x instanceof HTMLElement&&x.dataset.command!==void 0){e.stopPropagation(),tt(x.dataset.command);return}const X=n.closest('[data-act="task-hidden-toggle"]');if(X instanceof HTMLElement&&X.dataset.group!==void 0){e.stopPropagation();const w=d.hiddenOpen??{};d.hiddenOpen={...w,[X.dataset.group]:w[X.dataset.group]!==!0},b();return}const le=n.closest('[data-act="facts-toggle"]');if(le instanceof HTMLElement&&le.dataset.group!==void 0){e.stopPropagation();const w=d.factsOpen??{};d.factsOpen={...w,[le.dataset.group]:w[le.dataset.group]!==!0},b();return}const ue=n.closest('[data-act="task-filter"]');if(ue instanceof HTMLElement&&ue.dataset.value!==void 0){const w=d.taskFilter??be,R=ue.dataset.value;if(ue.dataset.kind==="harness"&&(R==="all"||z.includes(R))){d.taskFilter={...w,harness:R},b();return}if(ue.dataset.kind==="status"&&Jl.includes(R)){d.taskFilter={...w,status:R},b();return}}const I=n.closest('[data-act="project-expand"], [data-act="project-collapse"]');if(I instanceof HTMLElement&&I.dataset.root!==void 0){const w=d.expandedProjects??[],R=I.dataset.root;ct(I.dataset.act==="project-expand"?[...w,R]:w.filter(_=>_!==R)),b();return}if(n.closest('[data-act="projects-toggle"]')){const w=$t(d.projects?.projects??[],d.taskFilter??be).filter(_=>!("payloadUnavailable"in _)&&!re(_)).map(_=>_.root)??[],R=d.expandedProjects??[];ct(w.every(_=>R.includes(_))?R.filter(_=>!w.includes(_)):[...R,...w]),b();return}const Y=n.closest('[data-act="project-session"]');if(Y instanceof HTMLElement&&z.includes(Y.dataset.harness)&&Y.dataset.session!==void 0){const w=Y.dataset.harness;je(w),d.sessionSel||(d.sessionSel={}),d.sessionSel[w]=Y.dataset.session,Bn(d,w,Y.dataset.session,new Date().toISOString()),ft(w,Y.dataset.session),window.scrollTo(0,0),Pe(w),b();return}const xn=n.closest('[data-act="project-node-link"]');if(xn instanceof HTMLElement&&xn.dataset.nodeTarget!==void 0){Gl(xn.dataset.nodeTarget);return}const Cn=n.closest('[data-act="project-card-link"]');if(Cn instanceof HTMLElement&&Cn.dataset.root!==void 0){Kl(Cn.dataset.root);return}const In=n.closest('[data-act="notice-dismiss"]');if(In instanceof HTMLElement&&In.dataset.key!==void 0){d.noticeDismissed||(d.noticeDismissed={}),d.noticeDismissed[In.dataset.key]=!0,b();return}if(n.closest('[data-act="project-memory-dismiss"]')){d.projectMemoryDismissed=!0,b();return}const De=n.closest('[data-act="session"]');if(De instanceof HTMLElement&&De.dataset.id!==void 0){const w=Ee();w&&(d.protocolBannerProjectRoot=void 0,d.sessionSel||(d.sessionSel={}),d.sessionSel[w.harness]=De.dataset.id,Bn(d,w.harness,De.dataset.id,new Date().toISOString()),ft(w.harness,De.dataset.id),b());return}const sn=n.closest('[data-act="sugg-plan"]');if(sn instanceof HTMLElement&&sn.dataset.item!==void 0){ca(sn.dataset.item,sn.dataset.enable==="1");return}const Rn=n.closest('[data-act="sugg-dismiss"]');if(Rn instanceof HTMLElement&&Rn.dataset.sugg!==void 0){const w=Ee();if(w){const R=ke(d.narratives?.[w.harness]??null,d.projects??null),_=Te(R,d.sessionSel?.[w.harness])??"";d.suggHidden||(d.suggHidden={}),d.suggHidden[`${w.harness}:${_}:${Rn.dataset.sugg}`]=!0,b()}return}const jn=n.closest('[data-act="todo"]');if(jn instanceof HTMLElement&&jn.dataset.id!==void 0){Yl(jn.dataset.id);return}const on=n.closest('[data-act="node"]');if(on instanceof HTMLElement&&on.dataset.key!==void 0){const w=d.nodeOpen??{};d.nodeOpen={...w,[on.dataset.key]:w[on.dataset.key]!==!0},b();return}const En=n.closest('[data-act="workflow-fold"]');if(En instanceof HTMLElement&&En.dataset.key!==void 0){e.preventDefault(),qn(En.dataset.key);return}if(n.closest('[data-act="evidence"]')){e.preventDefault();const w=Ee();if(w){const R=Te(ke(d.narratives?.[w.harness]??null,d.projects??null),d.sessionSel?.[w.harness]);R!==null&&qn(`${w.harness}:${R}:evidence`)}return}if(n.closest('[data-act="raw"]')){d.rawOpen=!d.rawOpen,b();return}if(n.closest('[data-act="island-reveal"]')){Ht=++Pl,ie();return}if(D&&fe&&n.closest('[data-act="ack-turn-ended"]')){fa(),b();return}if(n.closest('[data-act="toggle"]')){if(fe)return;const w=!d.open;if(D&&w){const R=Pt(d);R&&(R.harness!==d.islandApplied?.harness||R.id!==d.islandApplied.id)&&Bn(d,R.harness,R.id,new Date().toISOString()),fa()}d.open=w,D&&w&&Le(),b();return}if(n.closest('[data-act="demo"]')){Zl();return}if(n.closest('[data-act="lic-open"]')){d.licenseOpen=!0,d.licenseRefreshResult=null,b(),d.license?.activation&&zn("list");return}const Kt=n.closest('[data-act="lic-unbind"]');if(Kt?.dataset.deviceId){zn("unbind",Kt.dataset.deviceId);return}if(n.closest('[data-act="lic-activate"]')){zn("activate");return}if(n.closest('[data-act="lic-refresh"]')){d.tierLock=!1,d.licenseOpen=!0,Hl();return}if(n.closest('[data-act="lic-close"]')){d.licenseOpen=!1,d.licenseRefreshResult=null,b();return}if(n.closest('[data-act="lic-import"]')){d.tierLock=!1,b(),Ul();return}if(n.closest('[data-act="tier-lock-close"]')){d.tierLock=!1,b();return}if(n.closest('[data-act="free-harness-change"]')){d.license?.tier==="free"&&Date.parse(d.license.freeHarnessSwitchableAt??"")<=Date.now()&&(d.freeHarnessChoosing=!d.freeHarnessChoosing,b());return}const Nn=n.closest('[data-act="free-harness"]');if(Nn instanceof HTMLElement&&z.includes(Nn.dataset.harness)){Wl(Nn.dataset.harness);return}if(n.closest('[data-act="import-close"]')){d.importResult=null,b();return}if(n.closest('[data-act="share-config"]')){od();return}if(n.closest('[data-act="share-events"]')){id();return}const On=n.closest('[data-act="share-del"]');if(On instanceof HTMLElement&&On.dataset.i!==void 0){ld(Number(On.dataset.i));return}if(n.closest('[data-act="share-send"]')){dd();return}if(n.closest('[data-act="share-close"]')){_r();return}const We=n.closest('[data-act="tgl"]');if(We instanceof HTMLElement&&We.dataset.id){const w=We.dataset.value;if(w!==void 0&&w!=="accept"&&w!=="hold"&&w!=="refuse")return;ca(We.dataset.id,We.dataset.enable==="0"?!1:void 0,w);return}if(n.closest('[data-act="plan-confirm"]')){sd();return}if(n.closest('[data-act="plan-cancel"]')){Br();return}const de=n.closest("[data-tab]");if(de instanceof HTMLElement&&de.dataset.tab){if(pe(de.dataset.tab,d.license)){je(de.dataset.tab),b();return}const w=de.dataset.tab==="projects"&&d.active!=="projects";je(de.dataset.tab),de.dataset.tab==="projects"?w||we():z.includes(de.dataset.tab)&&Pe(de.dataset.tab),b()}});document.addEventListener("keydown",e=>{if(d.mobile?.confirmPairId){if(e.key==="Escape"){e.preventDefault(),H.closeConfirmation();return}if(e.key==="Tab"){const t=Array.from(O?.querySelectorAll(".mobile-overlay button:not(:disabled)")??[]),r=t[0],s=t.at(-1);e.shiftKey&&document.activeElement===r&&(e.preventDefault(),s?.focus()),!e.shiftKey&&document.activeElement===s&&(e.preventDefault(),r?.focus())}}if((e.key==="Enter"||e.key===" ")&&e.target instanceof HTMLElement&&e.target.matches('.project-row[data-act="project-expand"]')){e.preventDefault(),e.target.click();return}const n=e.target;if(n instanceof HTMLElement&&n.dataset.act==="task-rename-input"&&n.dataset.key!==void 0){const t=n;if(e.key==="Enter"){e.preventDefault(),e.stopPropagation(),Se(n.dataset.key,{title:t.value});return}if(e.key==="Escape"){e.preventDefault(),e.stopPropagation(),d.taskMenuOpen=null,d.taskResumeOpen=null,b();return}}if(e.key==="Escape"){if(d.forgetProject){d.forgetProject.busy||(d.forgetProject=void 0),b();return}if(d.share){_r();return}if(d.importResult){d.importResult=null,b();return}if(d.licenseOpen){d.licenseOpen=!1,b();return}if(d.tierLock){d.tierLock=!1,b();return}if(d.flow){d.flow.phase!=="applying"&&Br();return}D&&d.open&&(d.open=!1,b())}});const se=document.createElement("div");se.id="tip";document.body.appendChild(se);document.addEventListener("mousemove",e=>{const t=e.target?.closest("[data-tip]");if(!(t instanceof HTMLElement)||!t.dataset.tip){se.style.display="none";return}se.textContent=t.dataset.tip,se.style.display="block";const r=se.offsetWidth;let s=e.clientX+14;s+r>window.innerWidth-8&&(s=e.clientX-r-14),se.style.left=`${Math.max(8,s)}px`,se.style.top=`${e.clientY+14}px`});document.addEventListener("mousedown",()=>{se.style.display="none"});window.addEventListener("blur",()=>{se.style.display="none"});let ua="";setInterval(()=>{document.visibilityState==="visible"&&Date.now()-Lr>=3e4&&ae();const e=d.configs.find(r=>r.harness===d.active)??d.configs[0];if(!e||ee.entries.length===0)return;const n=La(ee.entries,e.harness,e.capabilities.live,Date.now()),t=`${n.active}:${n.label}`;t!==ua&&(ua=t,b())},1e3);setInterval(()=>{document.visibilityState==="visible"&&Le()},6e4);setInterval(()=>{Or()&&H.load()},15e3);document.addEventListener("visibilitychange",()=>{Bt(),document.visibilityState==="visible"&&ae(),document.visibilityState==="visible"&&(d.anatomyLoadedAt===null||d.anatomyLoadedAt===void 0||Date.now()-Date.parse(d.anatomyLoadedAt)>6e4)&&Le()});function fa(){const e=Pt(d);e?.kind==="turnEnded"&&(d.turnEndedAck={...d.turnEndedAck,[`${e.harness}:${e.id}`]:e.at})}xs(()=>{if(!D)return d.narratives?.[Ee()?.harness??"cc"]??null;const e=$n(d).filter(({session:n,narrative:t})=>n.waiting||t?.taskWorkflow?.feedback.state==="needs_user"||n.lastInstruction!==void 0&&!n.ended&&n.turnEnded);return z.flatMap(n=>{const t=d.narratives?.[n];if(!t)return[];const r=e.filter(s=>s.harness===n).map(s=>s.session);return[{...t,sessions:r,states:Object.fromEntries(r.flatMap(s=>{const o=t.states[s.id];return o?[[s.id,o]]:[]}))}]})},b,e=>{Pe(e.harness)},1e4,D);ae().then(()=>Le()).then(()=>{D||H.load(),we(),Vt();for(const e of z)Pe(e);Ql(),ql()});document.addEventListener("toggle",Ut,!0);window.addEventListener("resize",()=>{Ut(),D&&ie()});