harness-wingman 0.9.2 → 0.9.4

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,348 +0,0 @@
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 l of i.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&r(l)}).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 Vt={"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"},Gt={"cli.licenseStatusLine":`{state}: {detail}
2
- `,"cli.scanSummary":`harness: {harness}{version}
3
- scannedAt: {scannedAt}
4
- {counts}
5
- `,"cli.profileUninstallResult":`{profile}: {message}
6
- `,"cli.errorLine":`wingman: {message}
7
- `,"cli.adapterFactoryMissing":"adapter-{harness} does not export createAdapter (M1 parallel work not merged?)","cli.adapterFeedbackMissing":"adapter-{harness} does not export feedbackSignals","cli.fixturesUnavailable":"--fixtures requires packages/fixtures data from the repository; release packages and npx distributions do not include samples","cli.help":`wingman — Not your copilot. Your wingman.
8
-
9
- Usage:
10
- wingman [--locale <tag>] <command> Interface language (e.g. zh, en)
11
- wingman scan --harness <cc|codex|dsh> [--json] Scan a harness and print UnifiedConfig
12
- wingman serve [--port 7333] [--fixtures] Start the local panel (127.0.0.1 only)
13
- [--panel-dist <dir>] Panel files (default: apps/panel/dist)
14
- wingman hook install <harness> [--port 7333] Install live hooks (backup first, idempotent)
15
- [--profile <p>] dsh: process only this profile
16
- wingman hook uninstall <harness> [--profile <p>] Remove hooks and restore configuration
17
- wingman protocol install|uninstall|status <harness> Manage user / project Plan protocol
18
- [--project <dir> | --user] [--dry-run] [--yes]
19
- wingman license status Show subscription status for write actions
20
- wingman license refresh Renew the license online
21
- wingman --version | -v | version Show version
22
- wingman help Show this help
23
- `,"cli.licenseUsage":"License usage: wingman license status|refresh","cli.unknownCommand":"Unknown command: {command}","cli.scanNotDetected":`wingman: {harness} was not detected; nothing to scan.
24
- `,"cli.scanJsonHint":`Tip: --json prints the complete UnifiedConfig.
25
- `,"cli.retirementFailed":`[wingman] Could not remove legacy dsh home hooks automatically: {reason}
26
- `,"cli.adapterLoadFailed":`[wingman] Could not load the {id} adapter; skipped: {message}
27
- `,"cli.fixtureNotice":"MOCK — fixtures 演示:叙事数据来自 packages/fixtures 的 session-todos.jsonl 样例会话,非本机真实 transcript。","cli.fixtureLoadFailed":`[wingman] Could not load the fixtures narrative sample; skipped: {message}
28
- `,"cli.fixtureMode":" (fixtures mode: sample data from @wingman/fixtures, not local configuration)","cli.serveReady":`Wingman panel: http://127.0.0.1:{port}{mode}
29
- Bound to 127.0.0.1 only; the panel and data stay on this machine. No telemetry; only samples you explicitly share from the panel leave your machine. See getwingman.dev/data. Ctrl+C to quit.
30
- `,"cli.hookUsage":"Hook usage: wingman hook install|uninstall <cc|codex|dsh> [--port 7333]","cli.hookHarness":"hook requires a harness in {ids}; received {harness}","cli.hookPort":"--port requires an integer from 1 to 65535; received {value}","cli.profileRequired":"--profile requires a profile name; no argument provided","cli.hookUnknownArg":"hook does not recognize argument: {arg}","cli.profileDshOnly":"--profile only applies to dsh","cli.dshHookInstalled":`wingman: dsh profile hooks installed (POST http://127.0.0.1:{port}/hook?harness=dsh).
31
- Backed up before writing; safe to repeat. Remove with: wingman hook uninstall dsh
32
- `,"cli.codexHookInstalled":`wingman: codex configured. For the first setup, enter /hooks in Codex and set Wingman hooks to Trusted + Enabled. New events should then reach Wingman. If the current task still produces no events, fully quit and reopen Codex, then verify with a new task.
33
- Upgrades do not require renewed trust while the managed command is unchanged, unless the managed block is incomplete or modified.
34
- Backed up before writing; safe to repeat. Remove with: wingman hook uninstall codex
35
- `,"cli.hookInstalled":`wingman: {harness} live hooks installed (POST http://127.0.0.1:{port}/hook?harness={harness}).
36
- Backed up before writing; safe to repeat. Remove with: wingman hook uninstall {harness}
37
- `,"cli.unwired":"Hooks removed","cli.restored":"Restored","cli.blockRemoved":"Remaining block removed","cli.recordCleared":"Record cleared","cli.dshUninstalled":`wingman: dsh hook removal complete.
38
- `,"cli.hookUninstalled":`wingman: {harness} hooks removed; configuration restored.
39
- `,"cli.dshMigrated":`Migrated the legacy home-level live hooks block to profiles.
40
- `,"cli.noDshProfiles":`No dsh profiles with package.json found.
41
- `,"cli.profileWired":`{profile}: Hooks installed
42
- `,"cli.oldBlockRemoved":"Old hook block removed, ","cli.profileMissingPackages":`{profile}: Hooks not installed, {removed}missing {packages} → {command}
43
- `,"cli.profileUnwired":`{profile}: Hooks not installed
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
- `,"cli.protocolDone":`wingman: {harness} protocol {action} complete
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 (anatomy and live views are free; write actions require a subscription)","cli.licenseDevelopment":"Development build: no embedded public key; write actions are unlocked","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}; write actions are locked. Subscribe, then select Refresh license in the panel to restore access","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; write actions are locked","cli.licenseWriteFailed":"Could not write {path}: {message}","cli.refreshMissing":"Could not find {path}. Subscribe, then download license.json from the activation page after payment and save it there","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"},Kt={"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 current point ancestor path status / verification","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%"},Yt={"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"},Jt={"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.ended":"Ended","panel.taskboard.inProgress":"In progress","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"},zt={"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.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"},Qt={"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.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 features","panel.render.ccAutoMemory":"Auto memory","panel.render.ccInbound":"Receive messages from other sessions","panel.render.ccOutbound":"Send messages to other sessions","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":"Also disables messages to subagents and agent teams","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.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.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
- Source: {p3}; click to expand the panel`,"panel.render.compactPillSource":`{p0} · {p1}{p2}
49
- Source: {p3}`,"panel.render.project":"Project","panel.render.inTheLiveStream":"In the live stream","panel.render.events":"events","panel.render.entries":"entries","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 breakdown","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.dayFreeTrialActive":"30-day free trial active","panel.render.freeTrialEndedRefreshOrSubscribe":"Free trial ended · refresh or subscribe","panel.render.subscriptionExpiredInGracePeriodRenew":"Subscription expired, in grace period · renew","panel.render.subscriptionExpiredWriteActionsLocked":"Subscription expired; write actions locked","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":"Keep using write features","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 for 10 minutes after Stop)","panel.render.inProgress":"In progress","panel.render.waitingForYouAnOpenPermission":"Waiting for you: an open permission request or notification","panel.render.newActivitySinceLastViewed":"New activity since last viewed","panel.render.newActivity":"New activity","panel.render.sinceWingmanStarted":"Since Wingman started (","panel.render.noHookEventsReceivedFrom":"), no hook events received from","panel.render.sessionsAreCreatedFromEventsOnly":"; 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.loadingProjectData":"Loading project data","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":"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":"Billing","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
- Started: {p0}`,"panel.render.approximateTokensToolInputResultBytes":`
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.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.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.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 ▴"},Xt={"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":"An active subscription is required to write changes (anatomy and live activity are always free)","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 or a valid island position and size","cli.server.fixturesSettings":"Fixtures mode is read-only: language settings are not saved","cli.server.settingsHome":"Language settings require homeDir"},Zt={"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)"},er={tag:"en",nativeName:"English",messages:{...Qt,...Jt,...Kt,...zt,...Vt,...Gt,...Yt,...Xt,...Zt}},nr={"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 失败"},ar={"cli.licenseStatusLine":`{state}:{detail}
53
- `,"cli.scanSummary":`harness:{harness}{version}
54
- scannedAt:{scannedAt}
55
- {counts}
56
- `,"cli.profileUninstallResult":`{profile}:{message}
57
- `,"cli.errorLine":`wingman:{message}
58
- `,"cli.adapterFactoryMissing":"adapter-{harness} 尚未导出 createAdapter(M1 并行线未合并?)","cli.adapterFeedbackMissing":"adapter-{harness} 尚未导出 feedbackSignals","cli.fixturesUnavailable":"--fixtures 需要仓库内的 packages/fixtures 数据;发布安装包/npx 产物不包含样例","cli.help":`wingman — Not your copilot. Your wingman.
59
-
60
- 用法:
61
- wingman [--locale <tag>] <command> 界面语言(如 zh、en)
62
- wingman scan --harness <cc|codex|dsh> [--json] 扫描一个 harness,输出 UnifiedConfig
63
- wingman serve [--port 7333] [--fixtures] 启动本地面板(只绑 127.0.0.1)
64
- [--panel-dist <dir>] 面板静态产物目录(默认仓库布局 apps/panel/dist)
65
- wingman hook install <harness> [--port 7333] 实况接线(写前备份,幂等)
66
- [--profile <p>] dsh:只处理指定 profile
67
- wingman hook uninstall <harness> [--profile <p>] 解线(配置恢复,幂等)
68
- wingman protocol install|uninstall|status <harness> 管理用户级 / 项目级 Plan Protocol
69
- [--project <dir> | --user] [--dry-run] [--yes]
70
- wingman license status 查看订阅状态(写动作的闸)
71
- wingman license refresh 联网向签发端换新 license(续期)
72
- wingman --version | -v | version 显示版本
73
- wingman help 显示本帮助
74
- `,"cli.licenseUsage":"license 用法:wingman license status|refresh","cli.unknownCommand":"未知命令:{command}","cli.scanNotDetected":`wingman:未检测到 {harness},无从扫描。
75
- `,"cli.scanJsonHint":`提示:--json 输出完整 UnifiedConfig。
76
- `,"cli.retirementFailed":`[wingman] dsh 旧家目录层接线无法自动解除:{reason}
77
- `,"cli.adapterLoadFailed":`[wingman] {id} adapter 加载失败,已跳过:{message}
78
- `,"cli.fixtureNotice":"MOCK — fixtures 演示:叙事数据来自 packages/fixtures 的 session-todos.jsonl 样例会话,非本机真实 transcript。","cli.fixtureLoadFailed":`[wingman] fixtures 叙事样例加载失败,已跳过:{message}
79
- `,"cli.fixtureMode":"(fixtures 模式:数据来自 @wingman/fixtures 样例,非本机配置)","cli.serveReady":`Wingman 面板:http://127.0.0.1:{port}{mode}
80
- 只绑 127.0.0.1,面板与数据都在本机;零遥测——唯一出门的数据是你在面板逐次主动分享的样本,口径 getwingman.dev/data。Ctrl+C 退出。
81
- `,"cli.hookUsage":"hook 用法:wingman hook install|uninstall <cc|codex|dsh> [--port 7333]","cli.hookHarness":"hook 需要 harness ∈ {ids},得到 {harness}","cli.hookPort":"--port 需要 1-65535 的整数,得到 {value}","cli.profileRequired":"--profile 需要 profile 名,得到(缺参)","cli.hookUnknownArg":"hook 不认识参数:{arg}","cli.profileDshOnly":"--profile 只适用于 dsh","cli.dshHookInstalled":`wingman:dsh profile 接线处理完成(POST http://127.0.0.1:{port}/hook?harness=dsh)。
82
- 写前已备份;重复执行幂等;解线:wingman hook uninstall dsh
83
- `,"cli.codexHookInstalled":`wingman:codex 配置完成;首次接线请在 Codex 输入 /hooks,将 Wingman hooks 设为 Trusted + Enabled。授权后新事件应进入 Wingman;若当前任务仍无事件,请完整退出重开后用新任务验证。
84
- 升级时只要受管 command 保持不变,无需重复信任;command 变化或受管块残缺/被修改时例外。
85
- 写前已备份;重复执行幂等;解线:wingman hook uninstall codex
86
- `,"cli.hookInstalled":`wingman:{harness} 实况接线完成(POST http://127.0.0.1:{port}/hook?harness={harness})。
87
- 写前已备份;重复执行幂等;解线:wingman hook uninstall {harness}
88
- `,"cli.unwired":"已解线","cli.restored":"已恢复","cli.blockRemoved":"已移除残留块","cli.recordCleared":"已清理记录","cli.dshUninstalled":`wingman:dsh 解线处理完成。
89
- `,"cli.hookUninstalled":`wingman:{harness} 已解线,配置已恢复。
90
- `,"cli.dshMigrated":`已迁移旧版家目录层 live hooks 块到 profile 层。
91
- `,"cli.noDshProfiles":`未发现含 package.json 的 dsh profile。
92
- `,"cli.profileWired":`{profile}:已接线
93
- `,"cli.oldBlockRemoved":"已移除旧接线块,","cli.profileMissingPackages":`{profile}:未接线,{removed}缺 {packages} → {command}
94
- `,"cli.profileUnwired":`{profile}:未接线
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
- `,"cli.protocolDone":`wingman:{harness} protocol {action} 完成
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(anatomy 与实况免费可用;写动作需订阅)","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":"订阅"},tr={"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 当前点祖先路径 status / verification","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%"},rr={"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":",可关"},sr={"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.ended":"已结束","panel.taskboard.inProgress":"进行中","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"},or={"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.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":"压缩完成"},ir={"panel.render.olderSessions":"更早的 {count} 个会话","panel.render.olderSessionsSource":"来源:sessions.ended 且 lastActivity 早于当前时间 {days} 天;仅折叠显示","panel.render.archiveSession":"归档","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.ccAutoMemory":"Auto memory","panel.render.ccInbound":"接收其他会话的消息","panel.render.ccOutbound":"向其他会话发消息","panel.render.ccDefault":"默认","panel.render.ccByPermissionMode":"按权限模式决定","panel.render.ccAccept":"接收","panel.render.ccHold":"暂存","panel.render.ccRefuse":"拒绝","panel.render.ccOutboundWarning":"同时禁掉对子代理与 agent team 的消息","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.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.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
- 来源:{p3};点击展开面板`,"panel.render.compactPillSource":`{p0} · {p1}{p2}
100
- 来源:{p3}`,"panel.render.project":"项目","panel.render.inTheLiveStream":"实况流内","panel.render.events":"事件","panel.render.entries":"条","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":"CONTEXT 组成","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.dayFreeTrialActive":"30 天免费试用中","panel.render.freeTrialEndedRefreshOrSubscribe":"免费试用已结束 · 刷新或订阅","panel.render.subscriptionExpiredInGracePeriodRenew":"订阅已到期,宽限期内 · 点此续期","panel.render.subscriptionExpiredWriteActionsLocked":"订阅已到期,写动作已锁","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,或 Stop 后 10 分钟无事件)","panel.render.inProgress":"进行中","panel.render.waitingForYouAnOpenPermission":"等待:有未决的权限请求/通知","panel.render.newActivitySinceLastViewed":"有新活动(上次查看后)","panel.render.newActivity":"新活动","panel.render.sinceWingmanStarted":"Wingman 启动(","panel.render.noHookEventsReceivedFrom":")后尚未收到","panel.render.sessionsAreCreatedFromEventsOnly":"的 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.loadingProjectData":"项目载荷载入中","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
- 开始:{p0}`,"panel.render.approximateTokensToolInputResultBytes":`
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.sourceFirstScreenCurrentPointsLength":"来源:firstScreen.currentPoints.length","panel.render.parallel":"并行","panel.render.thePlanHasNoStepMarked":"计划未标记进行中步骤","panel.render.recentActivityLabel":"最近活动","panel.render.thePlanHasNoSteps":"计划没有步骤","panel.render.planTree":"计划树","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.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":"收起 ▴"},lr={"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":"需要有效订阅才能执行写动作(anatomy 与实况永久免费)","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 位置与大小","cli.server.fixturesSettings":"fixtures 模式只读:不保存语言设置","cli.server.settingsHome":"语言设置缺少 homeDir"},dr={"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(常驻估算)"},Fa={tag:"zh",nativeName:"中文",messages:{...ir,...sr,...tr,...or,...nr,...ar,...rr,...lr,...dr}},Un=[Fa,er],Dn=Un.map(({tag:e,nativeName:n})=>({tag:e,nativeName:n}));let Hn="zh";function X(){return Dn}function _e(){return Hn}function We(e){if(!Dn.some(n=>n.tag===e))throw new Error(`Unsupported locale: ${e}`);Hn=e}function a(e,n={}){const t=Un.find(({tag:r})=>r===Hn)?.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 Bn(e){return e===null||typeof e!="object"||Array.isArray(e)||!Object.hasOwn(e,"key")||!("key"in e)||typeof e.key!="string"||!Object.hasOwn(Fa.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 cr(e){const n=e?.toLowerCase().replaceAll("_","-");return Dn.find(({tag:t})=>n===t.toLowerCase()||n?.startsWith(`${t.toLowerCase()}-`))?.tag}const Pe=["base","rules","skills","tools","gates","history"],pr={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")}},Ue={base:"#3987e5",rules:"#d95926",skills:"#199e70",tools:"#c98500",gates:"#898781",history:"#d55181"},I={cc:"Claude Code",codex:"Codex",dsh:"dsh"},_n={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 L(e){return e<1e3?String(e):`${(Math.round(e/100)/10).toFixed(1)}k`}function re(e){if(!e)return"—";const n=L(e.value);return e.kind==="estimate"?a("panel.format.about",{p0:n}):n}function ur(e){return e.onTriggerTokens?a("panel.format.residentAfterTrigger",{p0:re(e.tokens),p1:re(e.onTriggerTokens)}):re(e.tokens)}function Ma(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 fr(e){let n=0,t=!1,r="exact";for(const s of Pe){const i=Ma(e.slots[s]??[]);i&&(n+=i.value,t=!0,i.kind==="estimate"&&(r="estimate"))}return t?{kind:r,value:n}:void 0}function gr(e){return a(e==="full"?"panel.format.fullPluginApi":e==="push"?"panel.format.pushHooks":"panel.format.notWired")}function mr(e){return`${e.slice(0,16).replace("T"," ")} UTC`}function La(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 Te(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 hr(e){const n=[],t=[],r=e.harness==="cc"?(e.slots.gates??[]).filter(s=>s.ccFeature!==void 0):[];for(const s of Pe){const i=(e.slots[s]??[]).filter(l=>l.toggleable&&!r.includes(l));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 Wa(e){return a(e==="autoMemoryEnabled"?"panel.render.ccAutoMemory":e==="crossSessionInbound"?"panel.render.ccInbound":"panel.render.ccOutbound")}function Cn(e){return a(e==="accept"?"panel.render.ccAccept":e==="hold"?"panel.render.ccHold":"panel.render.ccRefuse")}function Ua(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{P(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 vr(e){return e.tokens?e.enabled?a("panel.actions.disableToSave",{p0:re(e.tokens)}):a("panel.actions.enablingAdds",{p0:re(e.tokens)}):""}function Je(e){return e===""?0:e.split(`
105
- `).length-(e.endsWith(`
106
- `)?1:0)}function br(e){return a(e==="create"?"panel.actions.create":e==="delete"?"panel.actions.delete":"panel.actions.modify")}function kr(e){return e.kind==="create"?a("panel.actions.lines",{p0:Je(e.after??"")}):e.kind==="delete"?a("panel.actions.previouslyLines",{p0:Je(e.before??"")}):a("panel.actions.linesLines",{p0:Je(e.before??""),p1:Je(e.after??"")})}function yr(e){return a(e==="immediate"?"panel.actions.effectiveImmediatelyTheHarnessWatchesThis":e==="reconnect"?"panel.actions.effectiveAfterReconnectingRestartTheHarness":"panel.actions.effectiveNextSessionOngoingConversationsAre")}function Da(e,n){return`${a(n?"panel.actions.enable":"panel.actions.disable")} ${e}`}function Sr(e){const n=e.action.itemId.split(":");return n.length>=4?n.slice(3).join(":"):e.action.itemId}const $r=["cc","codex","dsh"],wr=["immediate","next_session","reconnect"],Tr=["create","modify","delete"];function P(e){throw new Error(a("panel.actions.planPayloadViolatesTheContractCannot",{p0:e}))}function Ar(e,n){(typeof e!="object"||e===null)&&P(a("panel.actions.writesIsNotAnObject",{p0:n}));const t=e;(typeof t.file!="string"||t.file==="")&&P(a("panel.actions.writesFileIsNotANonempty",{p0:n})),Tr.includes(t.kind)||P(a("panel.actions.writesKindHasUnknownValue",{p0:n,p1:JSON.stringify(t.kind)})),t.kind!=="create"&&typeof t.before!="string"&&P(a("panel.actions.writesBeforeIsMissingKindRequires",{p0:n,p1:String(t.kind)})),t.kind!=="delete"&&typeof t.after!="string"&&P(a("panel.actions.writesAfterIsMissingKindRequires",{p0:n,p1:String(t.kind)}))}function Pr(e,n){(typeof e!="object"||e===null)&&P(a("panel.actions.referencesIsNotAnObject",{p0:n}));const t=e;(typeof t.file!="string"||t.file==="")&&P(a("panel.actions.referencesFileIsNotANonempty",{p0:n})),(typeof t.line!="number"||!Number.isInteger(t.line)||t.line<1)&&P(a("panel.actions.referencesLineIsNotABased",{p0:n})),typeof t.matchedName!="string"&&P(a("panel.actions.referencesMatchednameIsNotAString",{p0:n})),typeof t.context!="string"&&P(a("panel.actions.referencesContextIsNotAString",{p0:n}))}function Ha(e){(typeof e!="object"||e===null)&&P(a("panel.actions.notAnObject"));const n=e;$r.includes(n.harness)||P(a("panel.actions.harnessHasUnknownValue",{p0:JSON.stringify(n.harness)})),(typeof n.action!="object"||n.action===null)&&P(a("panel.actions.actionIsNotAnObject"));const t=n.action;return t.kind!=="toggle"&&P(a("panel.actions.actionKindHasUnknownValueV",{p0:JSON.stringify(t.kind)})),(typeof t.itemId!="string"||t.itemId==="")&&P(a("panel.actions.actionItemidIsNotANonempty")),typeof t.enable!="boolean"&&P(a("panel.actions.actionEnableIsNotABoolean")),t.itemId==="cc:gates:user:crossSessionInbound"?(n.harness!=="cc"||t.enable!==!0||!["accept","hold","refuse"].includes(t.value))&&P(a("panel.render.ccInvalidPayload")):t.value!==void 0&&P(a("panel.render.ccInvalidPayload")),Array.isArray(n.writes)||P(a("panel.actions.writesIsNotAnArray")),n.writes.forEach(Ar),(typeof n.backupDir!="string"||n.backupDir==="")&&P(a("panel.actions.backupdirIsNotANonemptyString")),Array.isArray(n.references)||P(a("panel.actions.referencesIsNotAnArray")),n.references.forEach(Pr),wr.includes(n.effectiveAt)||P(a("panel.actions.effectiveatHasUnknownValue",{p0:JSON.stringify(n.effectiveAt)})),Ua(e),e}function Ba(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 Cr(e){(typeof e!="object"||e===null)&&P(a("panel.actions.notAnObject"));const n=e;n.kind!=="protocol_user_install"&&n.kind!=="protocol_user_uninstall"&&P(a("panel.actions.kindHasAnUnknownValue")),n.harness!=="cc"&&n.harness!=="codex"&&P(a("panel.actions.harnessDoesNotSupportUserPlan")),typeof n.hasBlock!="boolean"&&P(a("panel.actions.hasblockIsNotABoolean")),(typeof n.blockBytes!="number"||!Number.isSafeInteger(n.blockBytes)||n.blockBytes<0)&&P(a("panel.actions.blockbytesIsNotANonnegativeInteger"));for(const t of["targetPath","backupDir","hostname"])(typeof n[t]!="string"||n[t]==="")&&P(a("panel.actions.isNotANonemptyString",{p0:t}));return(!n.targetPath.startsWith("~/")||!n.backupDir.startsWith("~/"))&&P(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)&&P(a("panel.actions.updateVersionsMustBeIncreasingIntegers")),e}function xr(e){if(typeof e!="object"||e===null)throw new Error(a("panel.actions.applyResponseViolatesTheContractNot"));const n=e;if(n.ok!==!0)return Ba(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 Ir(e,n){return Un.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 Rr(e){return e===null?!1:e.sessions.some(n=>n.waiting)?!0:Object.values(e.states).some(n=>n.taskWorkflow?.feedback.state==="needs_user")}function jr(e,n,t,r=1e4){return setInterval(()=>{Rr(e())&&(n(),t())},r)}const xn="codex:plugins",_a="cc:skills",qa="cc:tools";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 qn(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",permissionEvents:"PermissionRequest/Notification 事件",liveEmptyState:"实况接线状态;尚无可显示的会话标题"},Er="用户命名",ga={"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 / verification":"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 S(e){const n=Object.hasOwn(ga,e)?ga[e]:void 0;if(n!==void 0)return a(n);if(e.includes(`
107
- `))return e.split(`
108
- `).map(S).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:S(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 oe={harness:"all",status:"all"};function sn(e){return e.user.title===void 0?e.title:{text:e.user.title,source:Er}}function De(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{...Va(e),agentComplete:n}}function Va(e){return e.waiting||e.feedback?.state==="needs_user"?{kind:"waiting",label:a("panel.taskboard.waitingForYou")}:e.ended?{kind:"ended",label:a("panel.taskboard.ended")}:{kind:"active",label:a("panel.taskboard.inProgress")}}function Ga(e){if(!(e?.availability!=="available"||e.forInstruction!=="current"))return{completed:e.steps.filter(n=>n.status==="completed").length,total:e.steps.length}}function Vn(e){const n={waiting:0,active:1,ended:2};return[...e].sort((t,r)=>{const s=Number(r.user.pinned)-Number(t.user.pinned);if(s!==0)return s;const i=De(t).kind,l=De(r).kind,c=n[i]-n[l];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 Gn(e){return{visible:e.filter(n=>!n.user.hidden),hidden:e.filter(n=>n.user.hidden)}}function Ka(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 "${Nr(e.cwd)}" && claude --resume ${e.id}`,note:a("panel.taskboard.sourceSessionIdAndWorkingDirectory")}}function Nr(e){return e.replace(/[\\"$`]/g,"\\$&")}function Kn(e,n){return e.filter(t=>(n.harness==="all"||t.harness===n.harness)&&(n.status==="all"||De(t).kind===n.status))}function Yn(e,n){return e.filter(t=>n.harness==="all"||"payloadUnavailable"in t||Kn(Gn(t.sessions.filter(r=>!ie(r.harness,r.id,{projects:e}))).visible,n).length>0)}function en(e,n=[]){return e.filter(t=>!Y(t)).sort((t,r)=>{const s="payloadUnavailable"in t?void 0:t.user,i="payloadUnavailable"in r?void 0:r.user,l=+(i?.pinned===!0)-+(s?.pinned===!0);if(l!==0)return l;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),u=(c<0?n.length:c)-(p<0?n.length:p);if(u!==0)return u;const g="payloadUnavailable"in t?"":t.firstScreen.lastActivity?.at??"";return("payloadUnavailable"in r?"":r.firstScreen.lastActivity?.at??"").localeCompare(g)})}function Y(e){return!("payloadUnavailable"in e)&&e.user?.archived===!0}function ie(e,n,t){return t?.projects.some(r=>!("payloadUnavailable"in r)&&r.sessions.some(s=>s.harness===e&&s.id===n&&(Y(r)||s.user.archived===!0)))??!1}const Ya=7;function hn(e,n){return e.ended&&Date.parse(e.lastActivity)<n-Ya*864e5}function he(e,n){if(e===null)return null;const t=n?.projects.filter(Y)??[],r=new Set(e.sessions.filter(s=>s.archived===!0||ie(e.harness,s.id,n)).map(s=>s.id));for(const[s,i]of Object.entries(e.states))(ie(e.harness,s,n)||t.some(l=>l.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 Jn(e){return new URLSearchParams(e).get("island")==="1"}function Ja(e){return Jn(e)&&new URLSearchParams(e).get("size")==="compact"}function zn(e){const n=Qn(e);return Jn(e)&&(n==="left"||n==="right")&&new URLSearchParams(e).get("tab")==="1"}function Qn(e){const n=new URLSearchParams(e).get("edge");return n==="bottom"||n==="left"||n==="right"?n:"top"}function Or(e,n,t=null,r=null,s=null,i=null){const l=e?`#island=open${n?`:${ma(n)}`:""}`:`#island=pill:${ma(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}`,g=i===null?"":`;transition:${i}`;return`${l}${c}${p}${u}${g}`}function ma(e){return`${Math.round(e.x)},${Math.round(e.y)},${Math.round(e.w)},${Math.round(e.h)}`}function Fr(e){return e.island&&e.open&&!e.inPanel&&!e.modalOpen}function Mr(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 Lr(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(l,c,p,u,g){if(c!=="left"&&c!=="right"){i();return}const f=p==="prepare"||p==="reveal"&&(n!==l||l.classList.contains("island-prepare"));if(r(),n=l,t=!0,l.classList.remove(...s),l.classList.add(p==="retract"?"island-retract":"island-reveal",`island-edge-${c}`),g&&l.classList.add("island-motion-reduced"),f&&l.classList.add("island-prepare"),p==="prepare")return;let h,v,$=!1;const w=()=>{$||(r(),t=!1,e(p,u))},T=R=>{R.target===l&&R.propertyName==="opacity"&&w()};r=()=>{$=!0,h!==void 0&&cancelAnimationFrame(h),v!==void 0&&clearTimeout(v),l.removeEventListener("transitionend",T)};const y=()=>{l.classList.remove("island-prepare"),l.addEventListener("transitionend",T),p==="reveal"&&(v=setTimeout(w,g?80:200))};f?(l.offsetWidth,h=requestAnimationFrame(y)):y()},cancel:i}}const za="https://billing.stripe.com/p/login/14AcMZ8Z147F4MmaTKcMM00",Wr="https://buy.stripe.com/6oUbIV5MPbA792C8LCcMM04",Ur=["none","invalid","active","grace","expired"];function Xn(e){if(typeof e!="object"||e===null)return null;const n=e;return!Ur.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"?null:{state:n.state,detail:n.detail,...n.plan===void 0?{}:{plan:n.plan},...n.exp===void 0?{}:{exp:n.exp}}}function Qa(e){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 Dr(e){return e?a("panel.license.licenseImported",{p0:e.detail}):a("panel.license.licenseImportedNewStatusUnknownRefresh")}function Hr(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})}const Br=50,_r=15e3,qr={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 Xa(e){return qr[e]??e}function Vr(e,n,t=Br){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 Za(e){return e.slice(11,19)}function Gr(e){const n={cc:0,codex:0,dsh:0};for(const{event:t}of e)n[t.harness]+=1;return n}function Kr(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:l}=r.payload,c=typeof i=="string"?i:"";if(s==="PreToolUse"&&typeof l=="string")t.push({session:c,tool:l});else if(s==="PostToolUse"&&typeof l=="string")for(let p=t.length-1;p>=0;p--){const u=t[p];if(u&&u.session===c&&u.tool===l){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 et(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 l=Date.parse(i.event.received_at);if(!Number.isFinite(l)||r-l>_r)return{active:!1,get label(){return a("panel.live.quiet")}};const c=Kr(e,n);return{active:!0,label:c?a("panel.live.running",{p0:c}):Xa(i.event.payload.hook_event_name)}}function Yr(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")}function Jr(e){if(!Array.isArray(e))throw new Error(a("panel.narrative.payloadNotArray"));for(const n of e){if(!k(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 Pe){if(!k(t)||!Array.isArray(t[s]))throw new Error(a("panel.narrative.missingSlot",{harness:n.harness,slot:s}));if(s==="skills"&&t[s].some(i=>k(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(!k(i)||i.ccFeature===void 0)continue;const l=i.ccFeature;if(!k(l)||Object.keys(l).some(c=>!["key","value","source","overriddenBy","invalid","partial"].includes(c))||n.harness!=="cc"||s!=="gates"||!["autoMemoryEnabled","crossSessionInbound","permissions.deny"].includes(l.key)||i.id!==`cc:gates:user:${l.key}`||!["user","default"].includes(l.source)||l.overriddenBy!==void 0&&!["project","local","managed"].includes(l.overriddenBy)||l.invalid!==void 0&&typeof l.invalid!="boolean"||l.partial!==void 0&&(typeof l.partial!="boolean"||l.key!=="permissions.deny"||l.value!==!1)||l.value!=="unknown"&&(l.key==="crossSessionInbound"?!["accept","hold","refuse","default"].includes(l.value):typeof l.value!="boolean")||l.value==="unknown"&&l.invalid!==!0||(l.overriddenBy!==void 0||l.invalid===!0)&&i.toggleable!==!1)throw new Error(a("panel.render.ccInvalidPayload"))}}const r=n.planProtocol;if(r!==void 0&&(!k(r)||typeof r.user!="string"||!["installed","outdated","missing","modified","unsupported"].includes(r.user)))throw new Error(a("panel.narrative.invalidUserProtocol",{harness:n.harness}));if(k(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 zr(e){return k(e)&&(e.activated===!0&&E(e,["activated","name"])&&typeof e.name=="string"&&e.name!==""||e.activated===!1&&E(e,["activated","reason"])&&typeof e.reason=="string"&&e.reason!=="")?e:null}function Qr(e){return!k(e)||!E(e,["available","selected","settings"])||!Array.isArray(e.available)||!e.available.every(n=>k(n)&&E(n,["name","bundlePath"])&&typeof n.name=="string"&&n.name!==""&&typeof n.bundlePath=="string"&&n.bundlePath!=="")||e.selected!==void 0&&!nt(e.selected)||e.settings!==void 0&&(!at(e.settings)||e.settings.unavailable==="")?null:e}function Xr(e){return!k(e)||!E(e,["selected"])||!nt(e.selected)?null:e}function nt(e){return k(e)&&E(e,["bundlePath"])&&typeof e.bundlePath=="string"&&e.bundlePath!==""}function Zr(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=>k(t)&&(t.textI18n===void 0||Bn(t.textI18n))))||n.taskWorkflow!==void 0&&!ws(n.taskWorkflow)||n.project!==void 0&&!ys(n.project)||n.skillsUsed!==void 0&&!ze(n.skillsUsed)||n.pluginsUsed!==void 0&&!ze(n.pluginsUsed)||n.mcpUsed!==void 0&&!ze(n.mcpUsed)?null:e}function ze(e){return Array.isArray(e)&&e.every(n=>typeof n=="string"&&n.trim()!=="")}function es(e){if(!k(e)||!Array.isArray(e.projects)||e.memory!==void 0&&!at(e.memory))return null;const n=e.projects.map((t,r)=>rs(t)?t:ts(t,r));return e.memory===void 0?{projects:n}:{projects:n,memory:e.memory}}function at(e){return k(e)&&E(e,["unavailable"])&&typeof e.unavailable=="string"}function ns(e){if(typeof e!="object"||e===null)return null;const n=e;if(typeof n.harness!="string"||typeof n.startedAt!="string"||!Array.isArray(n.notices)||!n.notices.every(as)||!Array.isArray(n.sessions))return null;const t=[];for(const i of n.sessions){if(typeof i!="object"||i===null)return null;const l=i;if(typeof l.id!="string"||typeof l.label!="string"||l.cwd!==void 0&&typeof l.cwd!="string"||typeof l.lastActivity!="string"||l.archived!==void 0&&typeof l.archived!="boolean"||l.archivedHasNewActivity!==void 0&&typeof l.archivedHasNewActivity!="boolean"||typeof l.waiting!="boolean"||typeof l.ended!="boolean")return null;if(l.feedback!==void 0&&l.feedback!=="available"&&l.feedback!=="not_wired"&&l.feedback!=="unavailable"){t.push({id:l.id,label:l.label,lastActivity:l.lastActivity,waiting:l.waiting,ended:l.ended,...l.archived===void 0?{}:{archived:l.archived},...l.archivedHasNewActivity===void 0?{}:{archivedHasNewActivity:l.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]=Zr(r[i.id])??$s(n.harness,i);return{harness:n.harness,startedAt:n.startedAt,notices:n.notices,sessions:t,states:s}}function as(e){return k(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 ts(e,n){const t=k(e)&&typeof e.root=="string"?e.root:a("panel.narrative.unavailableProject",{number:n+1}),r=k(e)&&k(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 rs(e){return!k(e)||typeof e.root!="string"||!ls(e.title)||e.isHome!==void 0&&typeof e.isHome!="boolean"||e.user!==void 0&&(!k(e.user)||!E(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||!_(e.user.order)))||e.archivedHasNewActivity!==void 0&&typeof e.archivedHasNewActivity!="boolean"||!os(e.firstScreen)||e.presence!=="active"&&e.presence!=="remembered"||typeof e.seenSinceStart!="boolean"||e.goal!==void 0&&typeof e.goal!="string"||!ds(e.plan)||e.revision!==void 0&&!ye(e.revision)||e.mtime!==void 0&&typeof e.mtime!="string"||e.lastWriter!==void 0&&!us(e.lastWriter)||typeof e.currentPointLabel!="string"||e.currentPointEmptyText!==void 0&&typeof e.currentPointEmptyText!="string"||e.currentPointEmptyTextI18n!==void 0&&!Bn(e.currentPointEmptyTextI18n)||!In(e.currentPoints)||!In(e.checkpoints)||!fs(e.counts)||typeof e.allLeavesDone!="boolean"||e.completionLabel!==void 0&&typeof e.completionLabel!="string"||!Array.isArray(e.contradictions)||!e.contradictions.every(gs)||!Array.isArray(e.facts)||!e.facts.every(n=>typeof n=="string")||!is(e.protocol)?!1:Array.isArray(e.sessions)&&e.sessions.every(ms)}function ss(e){return k(e)&&E(e,["text","source"])&&typeof e.text=="string"&&ue(e.source)}function ue(e){return typeof e=="string"&&e.trim()!==""}function vn(e){return k(e)&&E(e,["key","path","text","source","verification"])&&In([e])&&ue(e.source)&&(e.verification===void 0||typeof e.verification=="string")}function os(e){if(!k(e)||!E(e,["source","goal","branch","currentPoints","lastActivity","action"])||!ue(e.source)||e.goal!==void 0&&!ss(e.goal)||!Array.isArray(e.branch)||!e.branch.every(vn)||!Array.isArray(e.currentPoints)||!e.currentPoints.every(vn))return!1;const n=e.lastActivity;if(n!==void 0&&(!k(n)||!E(n,["at","harness","sessionId","label","source","labelSource"])||typeof n.at!="string"||!Number.isFinite(Date.parse(n.at))||!nn(n.harness)||typeof n.sessionId!="string"||typeof n.label!="string"||!ue(n.source)||!ue(n.labelSource)))return!1;const t=e.action;return!k(t)||!ue(t.source)?!1:t.kind==="in_progress"||t.kind==="ended"?E(t,["kind","source"]):t.kind==="insufficient"?E(t,["kind","source","reason"])&&["no_plan","plan_unavailable","feedback_unavailable"].includes(t.reason):!E(t,["kind","source","items"])||!Array.isArray(t.items)||t.items.length===0?!1:t.kind==="checkpoint"?t.items.every(vn):t.kind!=="decision"?!1:t.items.every(r=>k(r)&&E(r,["harness","sessionId","label","since","text","source"])&&nn(r.harness)&&typeof r.sessionId=="string"&&typeof r.label=="string"&&typeof r.since=="string"&&Number.isFinite(Date.parse(r.since))&&ue(r.source)&&(r.text===void 0||typeof r.text=="string"))}function is(e){return k(e)&&bn(e.cc)&&bn(e.codex)&&bn(e.dsh)}function bn(e){return k(e)&&tt(e.state)&&typeof e.targetPath=="string"&&(e.version===void 0||ye(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 ls(e){return k(e)&&typeof e.text=="string"&&(e.source===Q.planHeading||e.source===Q.workingDirectory||e.source===Q.homeDirectory)}function ds(e){return k(e)?e.availability==="available"?_(e.ignoredLineCount)&&cs(e.ignoredLines)&&e.ignoredLines.length===e.ignoredLineCount&&Array.isArray(e.nodes)&&e.nodes.every(Zn)&&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&&!ye(e.line)?!1:e.lastGood===void 0||ps(e.lastGood):!1}function cs(e){return Array.isArray(e)&&e.every(n=>k(n)&&ye(n.line)&&typeof n.preview=="string")}function Zn(e){return k(e)&&typeof e.key=="string"&&typeof e.text=="string"&&Ss(e.status)&&ye(e.line)&&(e.verification===void 0||typeof e.verification=="string")&&Array.isArray(e.children)&&e.children.every(Zn)}function ps(e){return k(e)&&ye(e.revision)&&typeof e.mtime=="string"&&(e.title===void 0||typeof e.title=="string")&&(e.goal===void 0||typeof e.goal=="string")&&_(e.ignoredLineCount)&&Array.isArray(e.nodes)&&e.nodes.every(Zn)}function us(e){return k(e)&&nn(e.harness)&&typeof e.id=="string"&&typeof e.label=="string"&&typeof e.at=="string"}function In(e){return Array.isArray(e)&&e.every(n=>k(n)&&typeof n.key=="string"&&typeof n.text=="string"&&Array.isArray(n.path)&&n.path.every(t=>typeof t=="string"))}function fs(e){return k(e)&&_(e.pending)&&_(e.inProgress)&&_(e.completed)&&_(e.cancelled)&&_(e.checkpoint)}function gs(e){return k(e)&&typeof e.key=="string"&&typeof e.text=="string"}function ms(e){return!k(e)||!nn(e.harness)||typeof e.id!="string"||typeof e.label!="string"||typeof e.ended!="boolean"||!vs(e.title)||!hs(e.user)||typeof e.waiting!="boolean"||e.archivedHasNewActivity!==void 0&&typeof e.archivedHasNewActivity!="boolean"||e.cwd!==void 0&&typeof e.cwd!="string"||e.lastActivity!==void 0&&typeof e.lastActivity!="string"||e.attachedTo!==void 0&&typeof e.attachedTo!="string"||e.attachedBy!==void 0&&!ks(e.attachedBy)||e.attachedTo===void 0!=(e.attachedBy===void 0)||e.unattachedReason!==void 0&&typeof e.unattachedReason!="string"||e.sessionPlan!==void 0&&!it(e.sessionPlan)||e.feedback!==void 0&&!lt(e.feedback)||e.skillsUsed!==void 0&&!ze(e.skillsUsed)||e.checks!==void 0&&!rt(e.checks)||e.acceptance!==void 0&&!ot(e.acceptance)?!1:bs(e.compliance)}function hs(e){return k(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 vs(e){return k(e)&&typeof e.text=="string"&&(e.source===Q.planStep||e.source===Q.planInstruction||e.source===Q.latestInstruction||e.source===Q.workingDirectory)}function bs(e){return!k(e)||!tt(e.level)||!_(e.writeCount)||e.latestWriteAt!==void 0&&typeof e.latestWriteAt!="string"||e.writeSummary!==void 0&&typeof e.writeSummary!="string"?!1:e.timing===void 0?!0:k(e.timing)&&(e.timing.relation==="before"||e.timing.relation==="after")&&ye(e.timing.nonPlanToolStep)&&typeof e.timing.text=="string"}function tt(e){return e==="not_installed"||e==="installed"||e==="installed_not_loaded"||e==="plan_present"||e==="session_wrote_plan"}function ks(e){return k(e)&&e.kind==="plan_file_write"&&typeof e.node=="string"&&typeof e.method=="string"&&(e.at===void 0||typeof e.at=="string")}function ys(e){return k(e)&&typeof e.root=="string"&&(e.attachedTo===void 0||typeof e.attachedTo=="string")}function Ss(e){return e==="pending"||e==="in_progress"||e==="completed"||e==="cancelled"||e==="checkpoint"}function nn(e){return e==="cc"||e==="codex"||e==="dsh"}function ye(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=1}function $s(e,n){return{harness:e,sessionId:n.id,transcriptPath:null,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 ws(e){return!k(e)||e.goal!==void 0&&!kn(e.goal)||e.latestInstruction!==void 0&&!kn(e.latestInstruction)||!it(e.plan)||!k(e.execution)||!_(e.execution.evidenceCount)||!_(e.execution.failureCount)||e.execution.failureCount>e.execution.evidenceCount||e.execution.currentAction!==void 0&&!kn(e.execution.currentAction)||!lt(e.feedback)?!1:e.verification===void 0||Ts(e.verification)}function Ts(e){return!k(e)||!E(e,["agentMarkedComplete","checks","currentStep","acceptance"])||typeof e.agentMarkedComplete!="boolean"||!rt(e.checks)||!ot(e.acceptance)?!1:e.currentStep===void 0?!0:k(e.currentStep)&&E(e.currentStep,["text","runs","failures"])&&typeof e.currentStep.text=="string"&&st(e.currentStep)}function rt(e){return!k(e)||!E(e,["runs","failures","latestFailure","source"])||e.source!=="Harness tool_result(is_error / exit_code)"||!st(e)?!1:e.latestFailure===void 0?!0:k(e.latestFailure)&&E(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 st(e){return _(e.runs)&&_(e.failures)&&e.failures<=e.runs}function ot(e){return!k(e)||typeof e.state!="string"?!1:e.state==="none"?E(e,["state"]):e.state==="accepted"?E(e,["state","at"])&&typeof e.at=="string":e.state==="unavailable"&&E(e,["state","reason"])&&typeof e.reason=="string"}function E(e,n){return Object.keys(e).every(t=>n.includes(t))}function it(e){return!k(e)||typeof e.source!="string"?!1:e.availability==="missing"?e.toolGate===void 0||As(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=>k(n)&&typeof n.id=="string"&&typeof n.text=="string"&&(n.description===void 0||typeof n.description=="string")&&Ps(n.status))}function As(e){return k(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 lt(e){return k(e)?e.state==="unavailable"?typeof e.reason=="string"&&(e.reasonI18n===void 0||Bn(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 kn(e){return k(e)&&typeof e.text=="string"&&typeof e.source=="string"&&(e.observedAt===void 0||typeof e.observedAt=="string")}function Ps(e){return e==="pending"||e==="in_progress"||e==="completed"}function _(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0}function k(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ve(e,n){return!e||e.sessions.length===0?null:n!==void 0&&e.states[n]!==void 0?n:e.sessions[0]?.id??null}function dt(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 ct(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 qe(e,n){return n===void 0?e:a(n.key,n.params)}const ea={completed:"✓",in_progress:"▶",pending:"○"};function Cs(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 xs(e){return e.availability==="available"?`${S(e.source)} · revision ${e.revision}`:S(e.source)}function Is(e){const n=e.todos.find(t=>t.status==="in_progress");return n?n.activeForm??n.content:e.lastPrompt}function Rs(e){return e?e.kind==="tool"?e.detail===""?e.toolName:`${e.toolName} · ${e.detail}`:pt(e.name):null}const ha={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"};function pt(e){const n=Object.hasOwn(ha,e)?ha[e]:void 0;return n===void 0?e:a(n)}function js(e){return e?e.turnUsages[e.turnUsages.length-1]??null:null}function ut(e){return e<.005?"<$0.01":`$${e.toFixed(2)}`}function ft(e){return e.totalTokens??e.contextTotal?.value??e.inputTotalTokens??null}function Es(e){const n=ft(e);if(n===null)return"—";const t=e.status==="aborted"?a("panel.narrative.aborted"):e.status==="incomplete"?a("panel.narrative.incomplete"):"",r=`${L(n)} ${e.totalTokens===void 0&&e.contextTotal===void 0?"input":"tok"}${t}`;return e.costUsd===void 0?r:`${r} ≈ ${ut(e.costUsd)}`}function on(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 Ns(e,n){return e.agents.length>0?a("panel.narrative.subagent"):n&&n.nodes.length>0?a("panel.narrative.mainAgent"):null}function Os(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 Fs=6e4;function Ms(e,n,t={},r,s){const i=t.feedback??e?.taskWorkflow?.feedback,l=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(l){const p=l.label===""?"":`(${l.label})`,u=Date.parse(l.since),g=s!==void 0&&Number.isFinite(u)?s-u:Number.NaN,f=Number.isFinite(g)&&g>Fs?a("panel.narrative.waitOverdue",{minutes:Math.floor(g/6e4)}):"";return{mode:"waiting",label:a("panel.narrative.waitLabel",{who:p,message:l.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?{mode:t.status===a("panel.narrative.waitingForYou")?"waiting":t.status===a("panel.narrative.inProgress")?"working":"idle",label:c,status:t.status,source:t.source}:{mode:"idle",label:n.label===a("panel.narrative.notWired")?a("panel.narrative.notWired"):a("panel.narrative.waitingEvents"),source:Q.liveEmptyState}}function gt(e,n){const t=n[e.id];return t!==void 0?t:e.status==="in_progress"}async function Rn(e,n=globalThis.navigator?.clipboard){if(n===void 0)return!1;try{return await n.writeText(e),!0}catch{return!1}}function ln(e){return`npx harness-wingman${e?`@${e}`:""}`}function He(e,n){return`${ln(n)} hook install ${e}`}function Ls(e){return`'${e.replaceAll("'",`'"'"'`)}'`}function mt(e,n,t){return`${ln(t)} protocol install ${e} --project ${Ls(n)}`}function Ws(e,n){return`${ln(n)} protocol install ${e} --user`}const Us=["tray","panel","site"],Ds=["codex","claude-code","dsh"];function Hs(e,n){const t=new URL(e);if(t.protocol!=="https:")throw new Error("反馈表单必须使用 HTTPS");if(!Us.includes(n.source))throw new Error("反馈入口来源不合法");return t.search="",t.hash="",t.searchParams.set("source",n.source),yn(t,"wingman_version",n.wingmanVersion),yn(t,"os",n.os),n.harness!==void 0&&Ds.includes(n.harness)&&t.searchParams.set("harness",n.harness),yn(t,"harness_version",n.harnessVersion),t.toString()}function yn(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 Bs="https://tally.so/r/aQMeVW",va="support@getwingman.dev",_s={cc:"claude-code",codex:"codex",dsh:"dsh"};function qs(e){const n=e?.harnessVersion;return Hs(Bs,{source:"panel",...e===void 0?{}:{harness:_s[e.harness]},...n===void 0?{}:{harnessVersion:n}})}const Vs="https://api.getwingman.dev/samples",Gs=256*1024;function Ks(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(`
110
- `)}function Ys(e){return e.filter(n=>!n.mock&&!jn(n.event)).map(n=>JSON.stringify(n.event))}function jn(e){if(typeof e=="string")return/(?:^|[\\/])\.wingman[\\/]plan\.md(?:$|\s)/u.test(e);if(Array.isArray(e))return e.some(jn);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)||jn(t))return!0;return!1}function Js(e,n){return!Number.isInteger(n)||n<0||n>=e.length?[...e]:e.filter((t,r)=>r!==n)}function zs(e){return e.join(`
111
- `)}function ht(e,n){return JSON.stringify({kind:e,sample:zs(n)})}function vt(e,n){return new TextEncoder().encode(ht(e,n)).length}function bt(e,n){return vt(e,n)>Gs}function Qs(e,n){const t=(vt(e,n)/1024).toFixed(1);return a("panel.share.linesAboutKbLimitKb",{p0:n.length,p1:t})}function Xs(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}const o=Xs;function Zs(e,n){const t=e?`<div class="empty-detail">${o(e)}</div>`:`<div class="empty-detail">${a("panel.render.apiAnatomyReturnedAnEmptyArray")}</div>`;return`<div class="empty-card">
112
- <div class="empty-title">${a("panel.render.noHarnessDetected")}</div>
113
- ${t}
114
- <div class="empty-hint">${a("panel.render.firstRun")} <code>${o(ln(n))} serve</code>${be(n)}${a("panel.render.thenThePanelReadsAnatomyData")}</div>
115
- </div>`}function be(e){return e===null?`<span class="muted">${a("panel.render.versionUnknownADifferentVersionMay")}</span>`:""}function eo(e){const n=e??a("panel.render.noHarnessDetected");return`<div class="wrap"><div class="pill" data-tip="${o(n)}">
116
- <span class="dot quiet"></span><span class="t2">${o(n)}</span>
117
- </div></div>`}function kt(e){return e==="waiting"?"wait":e==="working"?"live":"quiet"}function an(e){return`<button class="island-tab ${kt(e)}" type="button" data-act="island-reveal" aria-label="${a("panel.render.expand")}"></button>`}function no(e,n,t="standard"){const r=t==="compact",s=` ${kt(n.mode)}`,i=a(r?"panel.render.compactPillSource":"panel.render.sourceClickToExpandThePanel",{p0:String(I[e.harness]),p1:String(n.label),p2:n.status?` · ${n.status}`:"",p3:String(S(n.source??""))});return`<div class="pill${n.mode==="waiting"?" waiting":""}"${r?"":' data-act="toggle"'} data-tip="${o(i)}">
118
- <span class="dot${s}"></span>
119
- <span class="t2">${o(n.label)}</span>${n.status&&!r?`
120
- <span class="t1">${o(n.status)}</span>`:""}
121
- ${r?"":'<span class="chev">▾</span>'}
122
- </div>`}function ao(e,n,t){const r=`<button class="tab${n==="projects"?" act":""}" data-tab="projects">${a("panel.render.project")}</button>`,s=e.map(i=>{const l=i.harness===n,c=t[i.harness],p=!l&&c>0?`<span class="tabnum" data-tip="${a("panel.render.inTheLiveStream")} ${I[i.harness]} ${a("panel.render.events")} ${c} ${a("panel.render.entries")}">${c}</span>`:"";return`<button class="tab${l?" act":""}" data-tab="${i.harness}">${o(I[i.harness])}${p}</button>`}).join("");return`<div class="tabs">${r}${s}</div>`}function to(e,n){const t=Pe.map(f=>({slot:f,total:Ma(e.slots[f]??[])})),r=t.reduce((f,h)=>f+(h.total?.value??0),0),s=fr(e),i=s?a("panel.render.residentTok",{p0:String(re(s))}):null,l=s?`${a("panel.render.residentTotal")} <b data-tip="${a("panel.render.totalResidentTokensOfEnabledItems")}${s.kind==="estimate"?a("panel.render.includesEstimatesMarkedAsApproximate"):a("panel.render.allValuesAreExactAndReported")}">${o(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=`${te(e.harness,f.slot)} · ${re(f.total)}`;return`<div class="seg" style="width:${h.toFixed(1)}%;background:${Ue[f.slot]}" data-tip="${o(v)}"></div>`}).join(""):"",p=c?`<div class="stack">${c}</div>`:"",u=t.map(({slot:f,total:h})=>{const v=!h,$=e.slots[f]??[],w=v?a("panel.render.thisScanFoundNoEnabledItems",{p0:String(te(e.harness,f))}):a("panel.render.residentTotalForEnabledItemsIndividual",{p0:String(te(e.harness,f))});return`<div class="lrow${v?" na":""}" data-tip="${o(w)}">
123
- <span class="sw" style="background:${v?"var(--grid)":Ue[f]}"></span>${te(e.harness,f)}
124
- <span class="nat">${o(_n[e.harness][f])}</span>
125
- <span class="v">${o(re(h))}</span>
126
- <span class="cnt">${$.length} ${a("panel.render.items")}</span>
127
- </div>`}).join("");let g="";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")}`;g=`<div class="anatomy-refresh-warning" data-tip="${a("panel.render.sourcePanelTimeOfTheLast")} ${o(n.anatomyLoadedAt)}">${a("panel.render.refreshFailedShowingDataFrom")} ${o(h)} ${a("panel.render.dataSuffix")}</div>`}return`<div class="sec">
128
- <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>${g}
129
- <div class="headline">${l}</div>
130
- ${p}
131
- <div class="legend">${u}</div>
132
- </div>`}function yt(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="${o(s)}">${t}</span>`}function te(e,n){return e==="codex"&&n==="skills"?a("panel.render.plugins"):pr[n]}function Qe(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 ro(e){if(e.ccFeature)return St(e,!1);const n=yt(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="${o(La(e))}">
133
- <span class="cname">${o(e.nativeName)}</span>
134
- <span class="chip">${o(S(e.source))}</span>
135
- ${n}${t}
136
- <span class="ctok">${o(ur(e))}</span>
137
- </div>`}function so(e){const n=Pe.map(t=>{const r=e.slots[t]??[],s=r.length?r.map(i=>ro(i)).join(""):`<div class="crow emptyrow">${a("panel.render.noItemsInThisScanThis")}</div>`;return`<div class="grp">
138
- <div class="gtitle"><span class="gdot" style="background:${Ue[t]}"></span>${te(e.harness,t)}${Qe(t,e.harness)}
139
- <span class="nat">${o(_n[e.harness][t])}</span>
140
- </div>
141
- ${s}
142
- </div>`}).join("");return`<div class="sec">
143
- <div class="label">${a("panel.render.sixSlotDetailsHoverForSources")}</div>
144
- ${n}
145
- </div>`}function ba(e){if(e.ccFeature)return St(e);const n=vr(e),t=yt(e)||(e.enabled?"":`<span class="statechip off">${a("panel.render.currentlyDisabled")}</span>`);return`<div class="crow${e.enabled?"":" offrow"}" data-tip="${o(La(e))}">
146
- <span class="cname">${o(e.nativeName)}</span>
147
- <span class="chip">${o(S(e.source))}</span>
148
- ${t}
149
- <span class="ctok">${o(n)}</span>
150
- <span class="cright"><button class="toggle${e.enabled?" on":""}" data-act="tgl" data-id="${o(e.id)}" role="switch" aria-checked="${e.enabled}" aria-label="${o(`${e.enabled?a("panel.render.disable"):a("panel.render.enable")} ${e.nativeName}`)}" data-tip="${a("panel.render.previewChangesBeforeApplyingNoFiles")}"></button></span>
151
- </div>`}function St(e,n=!0){const t=e.ccFeature;if(!t)return"";const r=Wa(t.key),s=t.source==="default"?a("panel.render.ccDefault"):S("user"),i=`${s}
152
- ${e.nativePath} ${t.key}`,l=!e.toggleable||t.overriddenBy!==void 0||t.invalid===!0,c=t.overriddenBy==="managed"?a("panel.render.ccLayerManaged"):t.overriddenBy==="local"?a("panel.render.ccLayerLocal"):a("panel.render.ccLayerProject"),p=t.value===!0?a("panel.render.ccEnabled"):t.value==="accept"||t.value==="hold"||t.value==="refuse"?Cn(t.value):"",u=t.overriddenBy!==void 0?a("panel.render.ccOverridden",{layer:c}):t.invalid?a("panel.render.ccInvalid"):t.value==="default"?a("panel.render.ccByPermissionMode"):t.partial?a("panel.render.ccPartial"):t.value===!1?a("panel.render.currentlyDisabled"):n?"":p,g=t.key==="crossSessionInbound"?`<span class="cc-segments" role="group" aria-label="${o(r)}">${["accept","hold","refuse"].map(v=>`<button type="button" data-act="tgl" data-id="${o(e.id)}" data-value="${v}" aria-pressed="${t.value===v}"${l?" disabled":""}>${Cn(v)}</button>`).join("")}</span>`:`<button class="toggle${t.value===!0?" on":""}" data-act="tgl" data-id="${o(e.id)}"${typeof t.value=="boolean"?` role="switch" aria-checked="${t.value}"`:""} aria-label="${o(`${t.value===!0?a("panel.render.disable"):a("panel.render.enable")} ${r}`)}"${l?" disabled":""} data-tip="${a("panel.render.previewChangesBeforeApplyingNoFiles")}"></button>`,f=t.key==="permissions.deny"?`<span class="cc-warning" data-tip="${a("panel.render.ccOutboundWarning")}" aria-label="${a("panel.render.ccOutboundWarning")}">ⓘ</span>`:"",h=t.partial?`<button type="button" class="btn ghost cc-disable-all" data-act="tgl" data-id="${o(e.id)}" data-enable="0"${l?" disabled":""} data-tip="${a("panel.render.ccPartialWarning")}">${a("panel.render.ccDisableAll")}</button>`:"";return`<div class="crow cc-feature${t.value===!1&&!t.partial?" offrow":""}">
153
- <span class="cname">${o(r)}${f}</span>
154
- <span class="chip" data-tip="${o(i)}">${o(s)}</span>
155
- ${n?`<span class="cright">${g}${h}</span>`:""}
156
- ${u?`<span class="cc-status${l?" blocked":""}">${o(u)}</span>`:""}
157
- </div>`}function oo(e,n){const t=hr(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(c=>ba(c)).join("");if(e.harness==="codex"&&s.slot==="skills"){const c=e.slots.skills.filter(f=>f.enabled).length,p=n.narrative?.pluginsUsed?.length??0,u=a(p>0?"panel.render.pluginsSummary":"panel.render.pluginsUnobserved",{enabled:c,used:p});return`<details class="grp fold codex-plugins"${n.expandedText?.[xn]===!0?" open":""}><summary data-act="workflow-fold" data-key="${xn}"><span class="wflabel">${a("panel.render.plugins")}</span>${Qe("skills","codex")}<span class="fold-summary" data-tip="${a("panel.render.pluginsSummarySource")}">${o(u)}</span></summary><div class="fold-body">${i}</div></details>`}if(e.harness==="cc"&&(s.slot==="skills"||s.slot==="tools")){const c=s.slot==="skills",p=c?e.slots.skills.filter($=>$.enabled&&$.invocation!=="off").length:e.slots.tools.filter($=>$.enabled&&$.nativeName.startsWith("mcpServers.")).length,u=(c?n.narrative?.skillsUsed?.length:n.narrative?.mcpUsed?.length)??0,g=a(c?u>0?"panel.render.ccSkillsSummary":"panel.render.ccSkillsUnobserved":u>0?"panel.render.ccToolsSummary":"panel.render.ccToolsUnobserved",{enabled:p,used:u}),f=a(c?"panel.render.ccSkillsSummarySource":"panel.render.ccToolsSummarySource"),h=c?_a:qa,v=n.expandedText?.[h]===!0;return`<details class="grp fold cc-${s.slot}"${v?" open":""}><summary data-act="workflow-fold" data-key="${h}"><span class="wflabel">${te("cc",s.slot)}</span>${Qe(s.slot,"cc")}<span class="fold-summary" data-tip="${o(f)}">${o(g)}</span></summary><div class="fold-body">${i}</div></details>`}const l=e.harness==="codex"&&s.slot==="tools"?`<div class="cfgnote" data-tip="${a("panel.render.verifiedInPLANBConfigToml")}">${a("panel.render.codexSupportsIndividualToolsThroughEnabled")}</div>`:"";return`<div class="grp">
158
- <div class="gtitle"><span class="gdot" style="background:${Ue[s.slot]}"></span>${te(e.harness,s.slot)}${Qe(s.slot,e.harness)}
159
- <span class="nat">${o(_n[e.harness][s.slot])}</span>
160
- </div>
161
- ${i}${l}
162
- </div>`}).join(""),t.ccFeatures.length>0&&(r+=`<div class="grp cc-features"><div class="gtitle" data-tip="${a("panel.render.ccScope")}"><span class="gdot" style="background:${Ue.gates}"></span>${a("panel.render.ccFeatures")}<span class="nat">settings.json</span></div>${t.ccFeatures.map(ba).join("")}</div>`),t.slotsWithoutToggle.length>0){const s=t.slotsWithoutToggle.map(i=>te(e.harness,i)).join(" · ");r+=`<div class="cfgnote">${a("panel.render.otherSlots")}${s}${a("panel.render.haveNoToggleableItemsInThis")}</div>`}return`<div class="sec">
163
- <div class="label">CONFIGURE</div>
164
- ${r}
165
- </div>`}function io(e){const n=e.returnTargets;if(n==null)return"";const t=n.available.length===0?`<div class="cfgnote">${a("panel.render.noSupportedTerminalAppDetectedTerminal")}</div>`:n.available.map(i=>{const l=n.selected?.bundlePath===i.bundlePath;return`<button class="return-target-option${l?" act":""}" data-act="return-target-select" data-bundle-path="${o(i.bundlePath)}" type="button" aria-pressed="${l}"${e.returnTargetSaving?" disabled":""}>${o(i.name)}</button>`}).join(""),r=n.settings!==void 0&&!e.returnSettingsDismissed?`<div class="task-error">${o(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">${o(e.returnTargetError)}</div>`;return`<div class="sec return-targets" data-tip="${a("panel.render.sourceGETApiReturnTargetLocal")}">
166
- <div class="label">${a("panel.render.switchToThisAppWhenReturning")}</div>
167
- <div class="return-target-options">${t}</div>${r}${s}
168
- </div>`}function lo(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"),g=`<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">${o(e.hostname)} ${a("panel.render.operationOnHost",{verb:p})}</div></div>
169
- <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">${o(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>
170
- ${g}
171
- ${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>`:""}
172
- <div class="msec"><div class="mlabel">${a("panel.render.whenItTakesEffect")}</div><div class="mtext">${a("panel.render.appliesToTheNextNewSession")}</div></div>
173
- <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>${o(e.backupDir)}</code>${a("panel.render.uninstallingPreservesExistingContentAndSupports")}</div></div>
174
- <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}">${br(c.kind)}</span><code class="mpath">${o(c.file)}</code><span class="mlines">${o(kr(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">${o(`${c.file}:${c.line}`)}</code><span class="mctx">${o(c.context)}</span></div>`).join(""):`<div class="mtext muted">${a("panel.render.noOtherReferencesFoundInThe")}</div>`,s=n?`<div class="mnote">${o(n)}</div>`:"",i=Ua(e),l=i.length>0?`<div class="msec"><div class="mlabel">${a("panel.render.ccExactChanges")}</div>${i.map(c=>`<div class="mtext"><code>${o(c)}</code></div>`).join("")}</div>`:"";return`${s}
175
- <div class="msec"><div class="mlabel">${a("panel.render.filesToWriteNoBytesChange")}</div>${t}</div>${l}
176
- <div class="msec"><div class="mlabel">${a("panel.render.references")} ${e.references.length} ${a("panel.render.matchesThesePlacesMentionItReported")}</div>${r}</div>
177
- <div class="msec"><div class="mlabel">${a("panel.render.whenItTakesEffect")}</div><div class="mtext">${o(yr(e.effectiveAt))}</div></div>
178
- <div class="msec"><div class="mlabel">${a("panel.render.backup")}</div><div class="mtext">${a("panel.render.beforeWritingBackUpOriginalsTo")} <code>${o(e.backupDir)}</code>${a("panel.render.restoreByCopyingTheOriginalBytes")}</div></div>
179
- <div class="mact">
180
- <button class="btn ghost" data-act="plan-cancel">${a("panel.render.cancel")}</button>
181
- <button class="btn primary" data-act="plan-confirm">${a("panel.render.confirmWrite")}</button>
182
- </div>`}function co(e){const n=e.phase==="confirm"&&e.mockNote?`<span class="mockchip" data-tip="${o(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=lo(e.plan,e.mockNote):e.phase==="applied"?t=`<div class="mtext">${a("panel.render.changesWrittenPanelDataRefreshed")}</div>
183
- ${e.backupDir===void 0?`<div class="mtext">${a("panel.render.noNewBackupWasCreated")}</div>`:`<div class="mtext">${a("panel.render.backupPrefix")}<code>${o(e.backupDir)}</code>${a("panel.render.restoreByCopyingTheOriginalBytesBack")}</div>`}
184
- <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>
185
- <div class="mact"><button class="btn primary" data-act="plan-cancel">${a("panel.render.gotIt")}</button></div>`:t=`<div class="merror">${o(e.message)}</div>
186
- <div class="mtext muted">${a("panel.render.commonCausesFilesChangedAfterPlanning")}</div>
187
- <div class="mact"><button class="btn ghost" data-act="plan-cancel">${a("panel.render.close")}</button></div>`;const r=e.phase!=="applying";return`<div class="overlay">
188
- <div class="scrim"${r?' data-act="plan-cancel"':""}></div>
189
- <div class="modal" role="dialog" aria-modal="true" aria-label="${o(e.title)}">
190
- <div class="mhead"><span class="mtitle">${o(e.title)}</span>${n}${r?`<button class="mclose" data-act="plan-cancel" aria-label="${a("panel.render.closeDialog")}">✕</button>`:""}</div>
191
- ${t}
192
- </div>
193
- </div>`}function po(e){const n=Qa(e??null);if(!n||!e)return"";if(n==="trial-active"){const r=e.exp?.match(/^\d{4}-\d{2}-\d{2}/)?.[0],s=r?a("panel.render.dayFreeTrialUntil",{p0:String(r)}):a("panel.render.dayFreeTrialActive");return`<div class="lictrial"><button class="licfootlink" data-act="lic-open" data-tip="${o(e.detail)}">${s}</button></div>`}if(n==="trial-expired")return`<div class="licrow"><button class="licbar expired" data-act="lic-open" data-tip="${o(e.detail)}">${a("panel.render.freeTrialEndedRefreshOrSubscribe")}</button></div>`;const t=a(n==="grace"?"panel.render.subscriptionExpiredInGracePeriodRenew":"panel.render.subscriptionExpiredWriteActionsLocked");return`<div class="licrow"><button class="licbar ${n}" data-act="lic-open" data-tip="${o(e.detail)}">${o(t)}</button>${$t("licimport")}</div>`}function $t(e){return`<button class="${e}" data-act="lic-import" data-tip="${a("panel.render.importLicenseJsonFromTheActivation")}">${a("panel.render.importLicense")}</button>`}function uo(e){const n=e.ok?`<div class="mtext">${o(e.message)}</div>`:`<div class="merror">${o(e.message)}</div>`;return`<div class="overlay">
194
- <div class="scrim" data-act="import-close"></div>
195
- <div class="modal" role="dialog" aria-modal="true" aria-label="${a("panel.render.importLicense")}">
196
- <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>
197
- ${n}
198
- <div class="mact"><button class="btn primary" data-act="import-close">${a("panel.render.close")}</button></div>
199
- </div>
200
- </div>`}function fo(e,n=za,t=!1,r=null,s=!1){const i=e.plan==="trial",l=i&&e.state==="expired",c=n===""?a("panel.render.cancelSubscriptionsOrChangePaymentMethods"):`<a href="${o(n)}" target="_blank" rel="noreferrer">${a("panel.render.manageSubscriptionCancelPaymentMethodInvoices")}</a>`,p=i&&!l?"":`<div class="msec"><div class="mlabel">${a("panel.render.refreshLicense")}</div><div class="mtext">${a("panel.render.afterPaymentOrWhileYourSubscription")}</div></div>`,u=l&&s?`<div class="msec"><div class="mlabel">${a("panel.render.keepUsingWriteFeatures")}</div><div class="mtext"><a href="${o(Wr)}" target="_blank" rel="noreferrer">${a("panel.render.subscribeToWingman")}</a></div></div>`:"",g=r?`<div class="${r.ok?"mtext":"merror"}" aria-live="polite">${o(r.message)}</div>`:"",f=i&&!l?"":`<button class="btn primary" data-act="lic-refresh"${t?" disabled":""}>${a(t?"panel.render.refreshing":"panel.render.refreshLicense")}</button>`;return`<div class="overlay">
201
- <div class="scrim" data-act="lic-close"></div>
202
- <div class="modal" role="dialog" aria-modal="true" aria-label="${a(i?"panel.render.freeTrial":"panel.render.licenseStatus")}">
203
- <div class="mhead"><span class="mtitle">${a(l?"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>
204
- <div class="msec"><div class="mlabel">${a("panel.render.currentStatus")}</div><div class="mtext">${o(e.detail)}</div></div>${p}${u}
205
- <div class="msec"><div class="mlabel">${a("panel.render.subscriptionManagement")}</div><div class="mtext">${c}</div></div>
206
- ${g}<div class="mact"><button class="btn ghost" data-act="lic-close">${a("panel.render.close")}</button>${f}</div>
207
- </div>
208
- </div>`}function go(e){let n;if(e.phase==="preview"){const t=e.lines.length?e.lines.map((l,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">${o(l)}</span></div>`).join(""):`<div class="mtext muted">${a("panel.render.nothingToSendMOCKDemoData")}</div>`,r=bt(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>
209
- <div class="msec"><div class="mlabel">${a("panel.render.contentToSend")} ${o(Qs(e.kind,e.lines))}</div>
210
- <div class="sharebox">${t}</div>${s}</div>
211
- <div class="mact">
212
- <button class="btn ghost" data-act="share-close">${a("panel.render.closeWithoutSending")}</button>
213
- <button class="btn primary" data-act="share-send"${i}>${a("panel.render.send")}</button>
214
- </div>`}else e.phase==="sending"?n=`<div class="mtext muted">${a("panel.render.sendingPOST")} ${o("api.getwingman.dev/samples")})</div>`:e.phase==="sent"?n=`<div class="mtext">${a("panel.render.sentSamplesAreUsedOnlyTo")}</div>
215
- <div class="mact"><button class="btn primary" data-act="share-close">${a("panel.render.close")}</button></div>`:n=`<div class="merror">${o(e.message??a("panel.render.sendFailed"))}</div>
216
- <div class="mtext muted">${a("panel.render.nothingWasSentYouCanShare")}</div>
217
- <div class="mact"><button class="btn ghost" data-act="share-close">${a("panel.render.close")}</button></div>`;return`<div class="overlay">
218
- <div class="scrim" data-act="share-close"></div>
219
- <div class="modal" role="dialog" aria-modal="true" aria-label="${o(e.title)}">
220
- <div class="mhead"><span class="mtitle">${o(e.title)}</span><button class="mclose" data-act="share-close" aria-label="${a("panel.render.closeDialog")}">✕</button></div>
221
- ${n}
222
- </div>
223
- </div>`}function mo(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"),l=[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&&l.push(a("panel.render.mockInjectedDevDemoReplayNot")),`<div class="lvrow${t.harness===n?" own":" other"}" data-tip="${o(l.join(`
224
- `))}">
225
- <span class="lvtime">${o(Za(t.received_at))}</span>
226
- <span class="lvname">${o(Xa(r))}</span>
227
- ${s?`<span class="chip">${o(s)}</span>`:""}
228
- ${e.mock?'<span class="mockchip">MOCK</span>':""}
229
- <span class="lvharness">${o(t.harness)}</span>
230
- </div>`}function ho(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"))}):gr(s),l=n.entries.filter(u=>u.event.harness===e.harness);let c;n.entries.length>0?(c=`<div class="feed">${[...n.entries].reverse().map(g=>mo(g,e.harness)).join("")}</div>`,s==="none"&&l.length===0?c=`<div class="livenone">○ ${o(I[e.harness])} ${a("panel.render.notConnectedRun")} <code>${o(He(e.harness,t))}</code>${be(t)} ${a("panel.render.restartThisHarnessAfterConnectingIt")}</div>`+c:e.harness==="codex"&&l.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>${o(He(e.harness,t))}</code>${be(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">○ ${o(i)}${r?a("panel.render.theNarrativeOverviewAlreadyHasA"):a("panel.render.liveEventsWillAppearAfterProduces",{p0:String(o(I[e.harness]))})}</div>`:`<div class="livenone">${a("panel.render.pushWiringConfigurationDetectedButNo")} ${o(I[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">
231
- <div class="label">${a("panel.render.live")} <span class="tier${s==="none"?" none":""}">${o(i)}</span>
232
- <span class="conn ${n.replaying?"replay":n.connection}" data-tip="${a("panel.render.getApiEventsSSEConnectionStatus")}">${o(Yr(n))}</span>
233
- <span class="labr">${p}<button class="sharelink" data-act="share-events" data-tip="${a("panel.render.previewTheCompleteEventStreamBefore")}">${a("panel.render.shareEventSample")}</button></span>
234
- </div>
235
- ${c}
236
- </div>`}const na={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:oe,taskMenuOpen:null,taskResumeOpen:null,returnTargets:null,returnSettingsDismissed:!1,returnTargetSaving:!1,returnTargetError:null,taskReturnResults:{},hiddenOpen:{},factsOpen:{},taskError:null};function aa(e){return e.replace(/^session-/u,"").slice(0,8)}function vo(e,n){const t=e.sessions.filter(p=>!p.archived&&!ie(n,p.id,e.projects)),r=Date.parse(e.now),s=new Set(e.projects?.projects.flatMap(p=>!("payloadUnavailable"in p)&&p.isHome===!0?p.sessions.filter(u=>u.harness===n).map(u=>u.id):[])??[]);if(t.length<2&&!t.some(p=>hn(p,r)||s.has(p.id)))return"";const i=new Map;for(const p of t)i.set(p.label,(i.get(p.label)??0)+1);const l=p=>{const u=p.id===e.selectedSession,g=e.sessionSeen[`${n}:${p.id}`]??"",f=!u&&p.lastActivity>g,h=[a("panel.render.sessionIdentifier",{id:p.id}),a("panel.render.recentActivity",{p0:p.lastActivity?Te(p.lastActivity,Date.parse(e.now)):a("panel.render.notObserved")}),p.lastActivity,p.ended?a("panel.render.endedSessionEndOrNoEventsFor"):a("panel.render.inProgress"),p.waiting?a("panel.render.waitingForYouAnOpenPermission"):"",f?a("panel.render.newActivitySinceLastViewed"):""].filter(w=>w!=="").join(`
237
- `),v=p.waiting?'<span class="sdot wait"></span>':f?'<span class="sdot"></span>':"",$=(i.get(p.label)??0)>=2?`${p.label} ·${aa(p.id)}`:p.label;return`<button class="schip${u?" act":""}${p.ended?" ended":""}" data-act="session" data-id="${o(p.id)}" data-tip="${o(h)}">${v}${o($)}${f?`<span class="snew">${a("panel.render.newActivity")}</span>`:""}</button>`},c=(p,u)=>{if(p.length===0)return"";const g=p.filter(T=>hn(T,r)),f=p.filter(T=>!hn(T,r)),h=`${n}:${u?"home":"project"}`,v=e.oldSessionsOpen?.includes(h)===!0,$=f.length===0?"":`<div class="schips">${f.map(l).join("")}</div>`,w=g.length===0?"":`<div class="old-sessions"><button class="task-hidden-toggle" data-act="old-sessions-toggle" data-group="${h}" type="button" aria-expanded="${v}" data-tip="${a("panel.render.olderSessionsSource",{days:Ya})}">${a("panel.render.olderSessions",{count:g.length})}</button>${v?`<div class="schips">${g.map(l).join("")}</div>`:""}</div>`;return!u&&s.size===0&&g.length===0?$:`<div class="session-chip-group" data-session-group="${u?"home":"project"}">${u?`<div class="project-label">${a("narrative.homeDirectory")}</div>`:""}${$}${w}</div>`};return c(t.filter(p=>!s.has(p.id)),!1)+c(t.filter(p=>s.has(p.id)),!0)}function bo(e,n){return e.sessions.length!==0||e.startedAt===null?"":`<div class="sessions-empty">${a("panel.render.sinceWingmanStarted")}${o(e.startedAt)}${a("panel.render.noHookEventsReceivedFrom")} ${o(I[n])} ${a("panel.render.sessionsAreCreatedFromEventsOnly")}</div>`}function ka(e,n){return n.kind==="evicted"?`${e}:${n.sessionId}:${n.at}`:`${e}:${n.kind}:${n.at}`}function ko(e,n){return e.notices.filter(t=>!e.noticeDismissed[ka(n,t)]).map(t=>{const r=ka(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="${o(r)}">${o(s)}<code>${o(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="${o(r)}">${a("panel.render.evicted")} ${o(t.label)}(${o(aa(t.sessionId))}) · ${o(Za(t.at))} · ${o(t.reason)}<span class="session-notice-close">${a("panel.render.close")}</span></div>`}).join("")}function yo(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")}${o(He(n,e.wingmanVersion))}${be(e.wingmanVersion)}</div>`:t?.feedback==="unavailable"?`<div class="feedbacksignal">${a("panel.render.feedbackSignalsUnavailable")}</div>`:""}function So(e,n){const t=e.narrative?.suggestions??[];if(t.length===0)return"";const r=e.selectedSession??"";return t.filter(s=>e.suggHidden[`${n}:${r}:${s.id}`]!==!0).map(s=>{const i=s.action?`<button class="sugbtn" data-act="sugg-plan" data-item="${o(s.action.itemId)}" data-enable="${s.action.enable?"1":"0"}" data-tip="${a("panel.render.previewThePlanFilesTimingAnd")}">${a("panel.render.viewPlan")}</button>`:"";return`<div class="sugg r-${s.rule}" data-tip="${o(S(s.source))}">
238
- <span class="sugtext">${o(qe(s.text,s.textI18n))}</span>${i}<button class="sugdismiss" data-act="sugg-dismiss" data-sugg="${o(s.id)}" data-tip="${a("panel.render.dismissThisSuggestionForThisSession")}">${a("panel.render.dismiss")}</button>
239
- </div>`}).join("")}function $o(e){const n=Is(e),t=e.todos.some(f=>f.status==="in_progress"),r=a(t?"panel.render.firstInProgressTodoSourceTaskCreate":"panel.render.latestUserPromptSummaryNoIn"),s=Rs(e.currentAction),i=js(e),l=e.__mock_note?`<span class="mockchip" data-tip="${o(e.__mock_note)}">MOCK</span>`:"",c=e.waiting?`<div class="nwait" data-tip="${o(a("panel.render.openEventAt",{p0:e.waiting.kind==="permission"?"PermissionRequest":"Notification",p1:String(e.waiting.since)}))}">${a("panel.render.waitingForYou")}${o(e.waiting.message)}</div>`:"",p=i?`<span data-tip="${o([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(`
240
- `))}">${a("panel.render.thisTurn")} ${o(Es(i))}</span>`:"",u=s!==null?`<div class="ndoing">${a("panel.render.current")}<b>${o(s)}</b>${p===""?"":` · ${p}`}</div>`:p===""?"":`<div class="ndoing">${a("panel.render.usage")}${p}</div>`,g=e.agentQuote?`<div class="nquote" data-tip="${a("panel.render.agentSOwnWordsAssistantText")}">「${o(e.agentQuote)}」</div>`:"";return`<div class="now">
241
- ${c}
242
- <div class="ntask" data-tip="${o(r)}">${n===null?`<span class="muted">${a("panel.render.noTaskInformationInThisSession")}</span>`:o(n)}${l}</div>
243
- ${u}
244
- ${g}
245
- </div>`}function wt(e,n){const t=n.projects?.projects.find(l=>l.root===e.project?.root),r=t===void 0||"payloadUnavailable"in t?void 0:t.sessions.find(l=>l.harness===e.harness&&l.id===e.sessionId),s=n.sessions.find(l=>l.id===e.sessionId)?.label;return r!==void 0?sn(r):s!==void 0?{text:s,source:a("panel.render.sessionsLabelProjectDataNotReady")}:{text:e.sessionId??a("panel.render.noTaskTitleProvided"),source:"narrative.sessionId"}}function wo(e,n){const t=wt(e,n),r=`${e.harness}:${e.sessionId}:workflow-title`;return`<div class="wftitle" data-tip="${a("panel.render.sourcePrefix")}${o(S(t.source))}"><span${F(r,n)}>${o(t.text)}</span>${M(r,n)}</div>`}function To(e,n){if(e.taskWorkflow===void 0)return`${$o(e)}${sa(e.skillsUsed)}`;const t=e.__mock_note?`<span class="mockchip" data-tip="${o(e.__mock_note)}">MOCK</span>`:"";return`<div class="taskflow">${Ao(e,n)}${Po(e,n)}${t}${xo(e,n)}</div>`}function Ao(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")}"><span${F(i,n)}>${a("panel.render.requestsNotObservable")}${o(qe(t.reason,t.reasonI18n))}</span>${M(i,n)}</div>`}if(t.state!=="needs_user"){const i=t.source,l=t.state==="activity_resumed_unknown"?a("panel.render.activityResumed"):"";return`<div class="ask-line" data-tip="${a("panel.render.sourceTaskWorkflowFeedbackState")}${o(S(i))}${l}">${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")}">${o(t.message??"")}</div>`:`<div class="ask-text"><span${F(`${r}:feedback`,n)}>${o(t.message??a("panel.render.explicitFeedbackRequestReceived"))}</span>${M(`${r}:feedback`,n)}</div>`;return`<section class="box ask-box active" data-tip="${a("panel.render.sourcePrefix")}${o(S(t.source))}">
246
- <span class="wflabel">${a("panel.render.needYou")}</span>${s}
247
- <div class="ask-meta"><time data-tip="${a("panel.render.sourceTaskWorkflowFeedbackSince")} · ${o(t.since)}">${o(Te(t.since,Date.parse(n.now)))}</time><span>${a("panel.render.source")} ${o(I[e.harness])}</span><button class="wfverify-action" data-act="task-resume" data-key="${o(r)}" type="button">${a("panel.render.backToSession")}</button></div>
248
- ${It(n.taskReturnResults?.[r])}</section>`}function Po(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")}${o(S(s.source))}"><span class="wflabel">${a("panel.render.goal")}</span><span${F(`${e.harness}:${e.sessionId}:goal`,n)}>${o(s.text)}</span>${M(`${e.harness}:${e.sessionId}:goal`,n)}</div>`,l=`${e.harness}:${e.sessionId}:lead`,c=r===void 0||r.text===wt(e,n).text||r.text===s?.text?"":`<div class="wflead" data-tip="${a("panel.render.sourcePrefix")}${o(S(r.source))}"><span class="wflabel">${a("panel.render.latestInstruction")}</span><span${F(l,n)}>${o(r.text)}</span>${M(l,n)}</div>`,p=e.project?.root,u=n.projects?.projects.find(H=>H.root===p),g=u?.title,f=p===void 0?"":`<span data-tip="${a("panel.render.sourcePrefix")}${o(S(g?.source??"narrative.project.root"))}">${a("panel.render.project")} ${o(g?.text??p)}</span>`,h=Cs(e),v=u===void 0||"payloadUnavailable"in u?void 0:Ct(u),$=h.length>0?"taskWorkflow.plan.steps(status=in_progress);taskWorkflow.plan.forInstruction":"GET /api/projects currentPoints / currentPointEmptyText / plan.availability",w=`${e.harness}:${e.sessionId}:current`,T=h.length===0&&v===void 0?"":`<span class="wfcurrent" data-tip="${a("panel.render.sourcePrefix")}${$}"><span class="wflabel">${h.length>1?a("panel.render.parallelCurrentPoint"):a("panel.render.currentPoint")}</span><span${F(w,n)}>${h.length>0?h.map(o).join(" · "):o(v??"")}</span>${M(w,n)}</span>`,y=t.goal===void 0&&r===void 0?`<span class="muted" data-tip="${a("panel.render.sourceNeitherTaskWorkflowGoalNorLatestInstruction")}">${a("panel.render.goalUnavailable")}</span>`:"",R=n.sessions.find(H=>H.id===e.sessionId),D=Va({waiting:R?.waiting??e.waiting!==null,ended:R?.ended??!1,feedback:t.feedback});return`<section class="box"><div class="wfheading">${wo(e,n)}<span class="task-status ${D.kind}">${D.label}</span></div>${i}<div class="wfproject">${f}${f&&T?" · ":""}${T}${y}</div>${c}${sa(e.skillsUsed)}</section>`}function Co(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=n.projects?.projects.find(p=>p.root===e.project?.root),c=i!==void 0&&i.plan.availability!=="missing"?void 0:t.plan.toolGate;if(c===void 0)s=`<div class="wfplan"><span class="wflabel">${a("panel.render.agentSDeclaredPlan")}</span><div class="cfgnote">${a("panel.render.noStructuredPlan")}</div></div>`;else{const p=c.model??a("panel.render.notObservedValue"),u=c.affected==="known"?a("panel.render.sessionModel",{p0:String(p)}):a("panel.render.sessionModelImpactUnknown",{p0:String(p)}),g=se(e.harness,n)==="installed",f=g?"":a("panel.render.orInstallThePlanProtocol",{p0:String(mt("cc",a("panel.render.projectPlaceholder"),n.wingmanVersion))}),h=a("panel.render.sinceClaudeCodeDoesNotProvide",{p0:String(c.harnessVersion),p1:String(c.since),p2:String(u),p3:String(c.enable),p4:String(f)});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")}"${F(r,n)}>${o(h)}${g?"":be(n.wingmanVersion)}${a("panel.render.ifThisSettingIsAlreadyEnabled")}</div>${M(r,n)}</div>`}}else if(t.plan.availability==="unavailable")s=`<div class="wfplan"><span class="wflabel">${a("panel.render.agentSDeclaredPlan")}</span><div class="cfgnote"${F(r,n)}>${a("panel.render.planSourceUnavailable")} ${o(e.harness)} · ${o(t.plan.reason)}</div>${M(r,n)}</div>`;else{const i=t.plan.forInstruction==="previous",l=!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">${ea[u.status]}</span><span>${o(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")}${o(S(t.plan.source))};taskWorkflow.plan.forInstruction / revision">${a("panel.render.previousInstructionSPlanRevision")} ${t.plan.revision}</span>`:`<span class="wfsource">${o(xs(t.plan))}</span>`;s=`<div class="wfplan"><span class="wflabel">${a("panel.render.agentSDeclaredPlan")}</span>${p}${l?`<span class="statechip">${a("panel.render.markedCompleteByAgent")}</span>`:""}<div class="wfsteps"${F(r,n)}>${c}</div>${M(r,n)}</div>`}return`${jo(e,n)}${s}`}function Tt(e){const n=e.taskWorkflow?.plan;return n?.availability==="available"&&n.forInstruction==="current"&&e.taskWorkflow?.verification?.agentMarkedComplete===!0}function xo(e,n){const t=e.taskWorkflow;if(t===void 0)return"";const r=t.plan,s=Ga(r),i=r.availability==="available"?`${s?.completed??r.steps.filter(y=>y.status==="completed").length}/${s?.total??r.steps.length}${r.forInstruction==="previous"?a("panel.render.previousInstructionSPlan"):""}`:a("panel.render.notProvided"),l=t.verification,c=Tt(e),p=l===void 0?a("panel.render.verificationFactsNotProvided"):a("panel.render.agentCompleteChecksFailures",{p0:a(c?"panel.render.markedCompleteByAgent":"panel.render.agentCompletionStatus"),p1:String(l.checks.runs),p2:String(l.checks.failures),p3:String(l.acceptance.state==="accepted"?a("panel.render.acceptedByYou"):l.acceptance.state==="none"?a("panel.render.notAccepted"):a("panel.render.acceptanceUnavailable",{p0:String(l.acceptance.reason)}))}),u=Io(e.traces),g=u.length===0?a("panel.render.noRecentSteps"):u.map(y=>Pt(y,e.project?.root)).join(" · "),f=(y,R,D,H,C)=>{const V=`${e.harness}:${e.sessionId}:${y}`;return`<details class="fold"${n.expandedText?.[V]===!0?" open":""}><summary data-act="workflow-fold" data-key="${o(V)}"><span class="wflabel">${R}</span><span class="fold-summary" data-tip="${a("panel.render.sourcePrefix")}${o(S(H))}">${o(D)}</span></summary><div class="fold-body">${C}</div></details>`},h=t.execution,v=n.expandedText?.[`${e.harness}:${e.sessionId}:evidence`]??n.evidenceOpen,$=h.currentAction,w=$===void 0?"":`<div class="cfgnote" data-tip="${a("panel.render.sourcePrefix")}${o(S($.source))}">${a("panel.render.current")}${o($.text)}</div>`,T=`<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?No(e,n):""}</div></details>`;return f("plan",a("panel.render.plan"),i,`${S(r.source)};taskWorkflow.plan.availability / steps / forInstruction`,Co(e,n))+f("verification",a("panel.render.verification"),p,a("panel.render.taskworkflowVerificationAgentStructuredPlanStep"),Eo(e,n))+f("recent",a("panel.render.recentSteps"),g,a("panel.render.transcriptHookToolEventThreeMost"),Ro(u,e.project?.root))+T}function Io(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 At(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((g,f)=>(f===".."?g.pop():f!==""&&f!=="."&&g.push(f),g),[]),l=i(n),c=i(t);let p=0;for(;p<l.length&&l[p]===c[p];)p+=1;return[...l.slice(p).map(()=>".."),...c.slice(p)].join("/")||"."}function ta(e){return(e.split(/[\r\n]/u)[0]??"").slice(0,80)}function Pt(e,n){const t=At(e,n),r=t.length<=60?t:`${t.slice(0,59)}…`;return[e.toolName,r].filter(Boolean).join(" · ")}function Ro(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?` · ${on(s)}`:"",l=r.isError?a("panel.render.failureSuffix"):"",c=Pt(r,n),p=r.isError&&r.errorBrief!==void 0?` · ${o(ta(r.errorBrief))}`:"";return`<span class="wfrecent-step" data-tip="${a("panel.render.sourceTranscriptHookToolEventOriginal")}${o(r.detail)}">${o(c)}${i}${l}${p}</span>`}).join("");return`<div class="wfrecent"><span class="wflabel">${a("panel.render.recentSteps")}</span>${t}</div>`}function Ct(e){return e.plan.availability==="missing"?a("panel.render.noWingmanPlanMd"):e.currentPoints.length>0?e.currentPoints.map(n=>n.path.join(" → ")).join(" · "):e.currentPointEmptyText===void 0?void 0:qe(e.currentPointEmptyText,e.currentPointEmptyTextI18n)}function jo(e,n){const t=e.project?.root;if(t===void 0)return"";if(n.projects===null)return`<div class="wfproject-details"><span class="wflabel">${a("panel.render.project")}</span><code>${o(t)}</code><span class="muted">${a("panel.render.loadingProjectData")}</span></div>`;const r=n.projects.projects.find(p=>p.root===t);if(r===void 0)return`<div class="wfproject-details"><span class="wflabel">${a("panel.render.project")}</span><code>${o(t)}</code></div>`;if("payloadUnavailable"in r)return`<div class="wfproject-details"><span class="wflabel">${a("panel.render.project")}</span><span>${o(r.title.text)}</span><span class="wfsource">${o(S(r.title.source))}</span><span class="muted">${a("panel.render.projectDataUnavailable")}</span><button class="wfproject-link" data-act="project-card-link" data-root="${o(t)}" type="button">${a("panel.render.openProject")}</button></div>`;const s=Ct(r),i=r.sessions.find(p=>p.harness===e.harness&&p.id===e.sessionId),l=i?.attachedTo!==void 0?`<span>${a("panel.render.thisSessionAttachedTo")}</span><button class="project-crumb wfproject-node" data-tip="${o(i.attachedTo.replaceAll(" > "," → "))}" data-act="project-node-link" data-node-target="${dn(t,i.attachedTo)}" type="button">${o(i.attachedTo.replaceAll(" > "," → "))}</button>`:i?.unattachedReason===void 0?"":`<span>${a("panel.render.thisSessionUnattached")}${o(i.unattachedReason)})</span>`,c=r.plan.availability==="missing"&&(se(e.harness,n)==="missing"||e.harness==="dsh")?Ae(e.harness,t,n,a("panel.render.copyInstallCommand")):"";return`<div class="wfproject-details"><span class="wflabel">${a("panel.render.project")}</span><span>${o(r.title.text)}</span><span class="wfsource">${o(S(r.title.source))}</span>${s===void 0?"":`<span>${a("panel.render.currentPointPrefix")}${o(s)}</span>`}${c}${l}<button class="wfproject-link" data-act="project-card-link" data-root="${o(t)}" type="button">${a("panel.render.openProject")}</button></div>`}function Eo(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(H=>H.status==="completed"),l=Tt(e),c=a(i?"panel.render.markedCompleteByAgentNoThe":l?"panel.render.markedCompleteByAgent":"panel.render.agentCompletionStatus"),p=a(s?"panel.render.agentStructuredPlanStepStatesTaskWorkflow":"panel.render.agentStructuredPlanStepStates"),u=t.checks,g=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,$=v===void 0?"":a("panel.render.latestFailure",{p0:String(o(ta(v.brief??v.toolName))),p1:v.at===void 0?"":` <time data-tip="${o(v.at)}">${o(Te(v.at,Date.parse(n.now)))}</time>`}),w=t.acceptance,T=w.state==="accepted"?a("panel.render.markedByYouAt",{p0:`<time data-tip="${o(w.at)}">${o(Te(w.at,Date.parse(n.now)))}</time>`}):w.state==="none"?a("panel.render.notMarked"):a("panel.render.acceptanceUnavailable",{p0:o(w.reason)}),y=e.sessionId===null?void 0:`${e.harness}:${e.sessionId}`,R=y===void 0||w.state==="unavailable"?"":`<button class="wfverify-action" data-act="task-accept" data-key="${o(y)}" data-value="${w.state!=="accepted"}" type="button">${w.state==="accepted"?a("panel.render.undoAcceptance"):a("panel.render.markAccepted")}</button>`,D=y!==void 0&&n.taskError?.key===y?`<div class="task-error wfverify-error">${o(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")}">${g}${h}${$}</span><span class="wfverify-sep">·</span><span data-tip="${a("panel.render.sourceLocalTaskOverlayJsonAccepted")}">${T}</span>${R}</div>${D}`}function No(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,l={...r,nodes:r.nodes.map(c=>({...c,steps:c.steps.map(p=>({...p,detail:At(p,e.project?.root),...p.errorBrief===void 0?{}:{errorBrief:ta(p.errorBrief)}}))}))};return`<div class="evidencegroup"><div class="cfgnote">${a("panel.render.executionAttributedTo")}${o(i)}</div>${ra(l,r.todoId??"__other__",n.nodeOpen)}</div>`}).join("");return t===""?`<div class="livenone">${a("panel.render.noExecutionEvidenceYet")}</div>`:t}function Oo(e){const n=Os(e.narrative),t=e.narrative?.turnUsages.length??0,r=(s,i,l)=>`<button class="vtab${e.view===s?" act":""}" data-act="view" data-view="${s}">${i}${l===null?"":` <span class="vcnt">${o(l)}</span>`}</button>`;return`<div class="vtabs">
249
- ${r("tasks",a("panel.render.tasks"),n)}
250
- ${r("control",a("panel.render.controls"),null)}
251
- ${r("billing",a("panel.render.billing"),t>0?a("panel.render.turns",{p0:String(t)}):null)}
252
- </div>`}function Fo(e){const n=e.ts!==void 0&&e.endTs!==void 0?on(Date.parse(e.endTs)-Date.parse(e.ts)):e.endTs===void 0?"…":"",t=e.estTokens===void 0?"":a("panel.render.approx",{p0:String(L(e.estTokens))}),r=e.isError&&e.errorBrief!==void 0?`<span class="failchip">${o(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="${o(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"))}))}">
253
- <span class="cmd">${o(e.toolName)}</span>
254
- ${e.detail===""?"":`<span class="sdetail">${o(e.detail)}</span>`}
255
- ${r}${s}
256
- <span class="dur">${o(n)}${o(t)}</span>
257
- </div>`}function Mo(e){const n=e.wait?.resolvedBy!==void 0,t=e.durationMs===void 0?"":a("panel.render.waited",{p0:String(on(e.durationMs))}),r=n?` · ${t===""?"":`${t} → `}${pt(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(`
258
- `);return`<div class="tr waitrow" data-tip="${o(s)}">
259
- <span class="ic"></span>
260
- <span class="trlabel">⏸ ${o(a("panel.render.waitTrace",{label:e.label,message:e.wait?.message??"",outcome:r}))}</span>
261
- </div>`}function Lo(e,n,t){if(e.phase==="wait")return Mo(e);const r=e.steps.some(u=>u.endTs===void 0),s=e.durationMs===void 0?r?"…":"":on(e.durationMs),i=e.estTokens===void 0?"":a("panel.render.approx",{p0:String(L(e.estTokens))}),l=e.steps.find(u=>u.isError&&u.errorBrief!==void 0),c=e.failed&&l!==void 0&&!t?`<span class="failchip">${o(l.errorBrief??"")}</span>`:"",p=t?e.steps.map(u=>Fo(u)).join(""):"";return`<div class="tr${e.failed?" bad":r?" run":""}" data-act="node" data-key="${o(n)}" data-tip="${o(a("panel.render.phaseGroupingToolTypeRulesDocumented",{p0:String(a(t?"panel.render.collapse":"panel.render.expand")),p1:String(e.estTokens===void 0?"":a("panel.render.approximateTokensSumOfStepByte"))}))}">
262
- <span class="ic"></span>
263
- <span class="trlabel">${o(e.label)} · ${e.steps.length} ${a("panel.render.steps")}</span>
264
- ${c}
265
- <span class="dur">${o(s)}${o(i)}</span>
266
- </div>${p===""?"":`<div class="steps">${p}</div>`}`}function ra(e,n,t){return`<div class="trace">${e.nodes.map((s,i)=>{const l=`${n}:${i}`;return Lo(s,l,t[l]===!0)}).join("")}</div>`}function Wo(e,n){return""}function Uo(e,n,t,r){const s=gt(e,t.todoOpen)&&n!==void 0&&n.nodes.length>0,i=n!==void 0&&n.nodes.length>0,l=e.status==="in_progress"&&i?s?"▾":"▸":ea[e.status],c=Ns(e,n),p=c===null?"":`<span class="ag" data-tip="${o(c===a("panel.render.subagent")?a("panel.render.stepsIncludeASubagentAttributionIs",{p0:String(e.agents.join(", "))}):a("panel.render.stepsAttributedToTheMainAgent"))}">${o(c)}</span>`;return`<div class="td${e.status==="completed"?" done":e.status==="in_progress"?" doing":" todo"}">
267
- <div class="tdr"${i?` data-act="todo" data-id="${o(e.id)}"`:""}>
268
- <span class="mk${e.status==="in_progress"?" doing":""}">${l}</span>
269
- <span class="tdc">${e.status==="in_progress"?`<b>${o(e.content)}</b>`:o(e.content)}</span>
270
- ${p}
271
- ${Wo()}
272
- </div>
273
- ${s&&n?ra(n,e.id,t.nodeOpen):""}
274
- </div>`}function En(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">
275
- <div class="tdr" data-act="todo" data-id="__other__" data-tip="${a("panel.render.stepsThatCannotBeAssignedTo")}">
276
- <span class="mk">${r?"▾":"▸"}</span>
277
- <span class="tdc">${a("panel.render.otherUnassignedSteps")}</span>
278
- </div>
279
- ${r?ra(t,"__other__",e.nodeOpen):""}
280
- </div>`}function Do(e,n){const t=(e.textTodos??[]).map(r=>`<div class="td${r.checked?" done":" todo"}">
281
- <div class="tdr"><span class="mk">${r.checked?"✓":"○"}</span><span class="tdc">${o(r.content)}</span></div>
282
- </div>`).join("");return`<div class="sec first todolist">
283
- <div class="cfgnote" data-tip="${a("panel.render.sourceMarkdownChecklistInAssistantText")}">${a("panel.render.textChecklistWrittenByAgent")}</div>
284
- ${t}${En(n,e)}
285
- </div>`}function Ho(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=>Uo(i,t.traces.find(l=>l.todoId===i.id),n,e.harness)).join("")}${En(n,t)}</div>`:t&&(t.textTodos?.length??0)>0?r=Do(t,n):t&&ct(t)?r=`<div class="sec first">
286
- <div class="cfgnote">${e.harness==="dsh"?a("panel.render.thisHarnessDoesNotProduceA"):a("panel.render.thisSessionDidNotUseA")}</div>
287
- ${En(n,t)}
288
- </div>`:r=`<div class="sec first"><div class="livenone">${a("panel.render.noNarrativeDataYetConnect")}<code>${o(He(e.harness,n.wingmanVersion))}</code>${be(n.wingmanVersion)}${a("panel.render.thenRestartTheHarnessAndRun")}</div></div>`,r}function Bo(e,n,t){return`<div class="sec rawsec">
289
- <button class="rawhead" data-act="raw" data-tip="${a("panel.render.rawHookEventStreamTheLive")}">${t.rawOpen?"▾":"▸"} ${a("panel.render.rawEvents")}</button>
290
- <div class="rawbody${t.rawOpen?" open":""}">${ho(e,n,t.wingmanVersion,t.sessions.length>=1)}</div>
291
- </div>`}function _o(e,n){const t=n.narrative?.turnUsages??[],r=t.map(i=>qo(i,e.harness)).join(""),s=t.length>0?`<div class="ubox">${r}</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`<div class="sec first">
292
- <div class="label">${e.harness==="codex"?a("panel.render.usagePerTurnExactCodexToken"):a("panel.render.usagePerTurnThreeExactUsage")}</div>
293
- ${s}
294
- </div>
295
- ${to(e,n)}
296
- ${so(e)}`}function qo(e,n){const t=e.ts===void 0?"":e.ts.slice(11,19),r=e.costUsd===void 0?"":`<span class="ucost">≈ ${o(ut(e.costUsd))}</span>`,s=e.reasoningOutputTokens===void 0?"":a("panel.render.reasoningIncludedInOut",{p0:String(L(e.reasoningOutputTokens))}),i=ft(e),l=[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(`
297
- `);return`<div class="urow" data-tip="${o(l)}">
298
- <span class="utime">${o(t)}</span>
299
- ${e.model===void 0?"":`<span class="chip">${o(e.model)}</span>`}
300
- ${e.status==="aborted"?`<span class="chip">${a("panel.render.interrupted")}</span>`:""}
301
- ${e.status==="incomplete"?`<span class="chip">${a("panel.render.open")}</span>`:""}
302
- <span class="unums">${n==="codex"?a("panel.render.cumulativeInUncachedCacheWriteCached",{p0:String(e.inputTotalTokens===void 0?"—":o(L(e.inputTotalTokens))),p1:String(o(L(e.inputTokens))),p2:String(o(L(e.cacheCreationInputTokens))),p3:String(o(L(e.cacheReadInputTokens))),p4:String(o(L(e.outputTokens)))}):a("panel.render.inCachedWritesCachedReadsOut",{p0:String(o(L(e.inputTokens))),p1:String(o(L(e.cacheCreationInputTokens))),p2:String(o(L(e.cacheReadInputTokens))),p3:String(o(L(e.outputTokens)))})}${e.reasoningOutputTokens===void 0?"":` <small>(reasoning ${o(L(e.reasoningOutputTokens))})</small>`}</span>
303
- <span class="utot">${i===null?a("panel.render.turnTotal"):e.totalTokens!==void 0||e.contextTotal!==void 0?a("panel.render.turnTotalValue",{p0:String(o(L(i)))}):a("panel.render.cumulativeInputThisTurn",{p0:String(o(L(i)))})}</span>
304
- ${r}
305
- </div>`}function xt(e){const n=qs(e);return`<div class="feedbackfoot">
306
- <a class="feedbacklink" data-act="feedback" href="${o(n)}" target="_blank" rel="noreferrer">${a("panel.render.reportProblem")}</a>
307
- <span>${a("panel.render.clickingSendsAllowlistedReproductionHintsTo")}</span>
308
- <a href="mailto:${va}" target="_blank" rel="noreferrer">${va}</a>
309
- </div>`}function ya(e,n){return`<div class="empty-state">${Zs(e,n)}${xt()}</div>`}const Vo={pending:"○",in_progress:"●",completed:"✔",cancelled:"—",checkpoint:"?"},Go={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")}},Ko={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 se(e,n){return n.anatomy?.find(t=>t.harness===e)?.planProtocol?.user}function $e(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 Sa(e,n){const t=e.planProtocol?.user;if(t===void 0)return"";if(t==="installed")return`<div class="protocol-foot" data-tip="${o($e(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.projects?.projects.find(l=>l.root===n.narrative?.project?.root)?.root??a("panel.render.projectPlaceholder");s=`<small>${a("panel.render.dshHasNoUserLevelInstructionFile")}${i===a("panel.render.projectPlaceholder")?a("panel.render.replaceLtProjectGtWithThe"):""}。</small>${Ae("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="${o($e(e.harness))}"><span>${t==="outdated"?r[t]:a("panel.render.planProtocol",{p0:String(r[t])})}</span>${s}</div>`}function Ae(e,n,t,r){if(e!=="dsh"&&se(e,t)==="outdated")return`<span class="project-protocol-note" data-tip="${o($e(e))}">${I[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"&&se(e,t)==="missing"){const l=Ws(e,t.wingmanVersion),c=a("panel.render.scopeUserLevelProtocolCommandVersion",{p0:String($e(e))});return`<span class="project-protocol-note" data-tip="${o(S(c))}">${a("panel.render.installOnceToRequestPlansIn")}</span><button class="project-protocol-copy" data-act="protocol-copy" data-command="${o(l)}" data-tip="${o(`${l} · ${c}`)}" type="button">${o(r)}</button>${be(t.wingmanVersion)}`}const s=mt(e,n,t.wingmanVersion),i=se(e,t)==="unsupported"?a("panel.render.projectCommandVersionGETApiVersion",{p0:String(s),p1:String($e(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="${o(s)}" data-tip="${o(i)}" type="button">${o(r)}</button>`}function dn(e,n){return`project-node-${encodeURIComponent(`${e}:${n}`)}`}function tn(e){return`project-card-${encodeURIComponent(e)}`}function Yo(e,n){return`<div class="project-protocols">${["cc","codex","dsh"].map(s=>{const i=e.protocol[s],l=e.sessions.find(u=>u.harness===s&&u.compliance.level==="session_wrote_plan")?.compliance,c=[i.message,l?.writeSummary,l?.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="${o(c)}"`}>${o(I[s])} · ${o(Ko[i.state])}</span>`;if(i.state!=="not_installed"){const u=i.state==="installed_not_loaded"?`<span class="project-protocol-note">${o(i.message??a("panel.render.theDshInstructionLoadingPluginIs"))}</span>`:"",g=s!=="dsh"&&se(s,n)==="outdated"?Ae(s,e.root,n,a("panel.render.update")):"";return`<div class="project-protocol-row">${p}${u}${g}</div>`}return`<div class="project-protocol-row">${p}${Ae(s,e.root,n,a("panel.render.copyInstallCommand"))}</div>`}).join("")}</div>`}function Jo(e){const n=e.sessionPlan;if(n===void 0)return"";if(n.availability==="missing")return`<div class="project-session-plan"><span class="project-source">${a("panel.render.sessionPlan")} ${o(S(n.source))}</span><span class="muted">${a("panel.render.noStructuredPlanProvided")}</span></div>`;if(n.availability==="unavailable")return`<div class="project-session-plan"><span class="project-source">${a("panel.render.sessionPlan")} ${o(S(n.source))}</span><span class="muted">${a("panel.render.unavailablePrefix")}${o(n.reason)}</span></div>`;const t=n.steps.map(r=>`<li class="${r.status}"><span>${ea[r.status]}</span> ${o(r.text)}</li>`).join("");return n.forInstruction==="previous"?`<div class="project-session-plan"><div class="muted" data-tip="${a("panel.render.sourceSessionPlanForInstruction")}">${a("panel.render.noPlanDeclaredForThisInstruction")}</div><span class="project-source muted" data-tip="${a("panel.render.sourcePrefix")}${o(S(n.source))};sessionPlan.forInstruction / revision">${a("panel.render.previousInstructionSPlanRevision")} ${n.revision}</span><ul>${t}</ul></div>`:`<div class="project-session-plan"><span class="project-source">${a("panel.render.sessionPlan")} ${o(S(n.source))} · revision ${n.revision}</span><ul>${t}</ul></div>`}function sa(e){return e?.length?`<span class="task-skills" data-tip="${a("panel.render.skillsUsedSource")}">${o(a("panel.render.skillsUsed",{skills:e.join(", ")}))}</span>`:""}function zo(e,n=Date.now(),t=na,r=""){const s=De(e),i=sn(e),l=Ga(e.sessionPlan),c=e.sessionPlan?.availability==="available"?l===void 0?a("panel.render.noPlanDeclaredForThisInstruction"):a("panel.render.sessionPlanRevisionAgentMarkedComplete",{p0:String(e.sessionPlan.revision),p1:String(l.completed),p2:String(l.total)}):e.sessionPlan?.availability==="unavailable"?a("panel.render.sessionPlanUnavailable",{p0:String(e.sessionPlan.reason)}):a("panel.render.noStructuredPlanProvided"),p=e.sessionPlan?.availability==="available"&&e.sessionPlan.forInstruction==="previous"?a("panel.render.dataTipSourceSessionPlanForInstruction"):"",u=e.lastActivity===void 0?"":`<span class="task-activity" data-tip="${o(a("panel.render.timestampSourceHookEvent",{p0:String(e.lastActivity)}))}">${a("panel.render.recentActivityPrefix")}${o(Te(e.lastActivity,n))}</span>`,g=e.feedback?.state==="needs_user"?`<span class="task-feedback">${a("panel.render.needsYou")}${o(e.feedback.message??a("panel.render.explicitFeedbackRequestReceived"))} · ${o(e.feedback.since)}</span>`:"",f=e.checks===void 0?"":`<span class="task-checks" data-tip="${a("panel.render.sourceHarnessToolResultIsError")}">${e.checks.runs===0?a("panel.render.noObservableChecks"):a("panel.render.checksFailuresRuns",{p0:String(e.checks.failures),p1:String(e.checks.runs)})}</span>`,h=e.acceptance===void 0?"":`<span class="task-accept">${e.acceptance.state==="accepted"?a("panel.render.accepted",{p0:String(o(e.acceptance.at))}):e.acceptance.state==="none"?a("panel.render.notAccepted"):a("panel.render.acceptanceUnavailableReason",{p0:String(o(e.acceptance.reason))})}</span>`,v=e.attachedTo===void 0?a("panel.render.notLinkedToAStep"):a("panel.render.linkedTo",{p0:String(e.attachedTo.replaceAll(" > "," → "))});return`<button class="task-card" data-act="project-session" data-harness="${e.harness}" data-session="${o(e.id)}" data-tip="${o(a("panel.render.sessionIdentifier",{id:aa(e.id)}))}" type="button">
310
- <span class="task-card-head"><span class="task-badge">${o(I[e.harness])}</span>${e.user.pinned?`<span class="task-pin-mark">${a("panel.render.pin")}</span>`:""}<span class="task-title" data-tip="${a("panel.render.sourcePrefix")}${o(S(i.source))}"${F(`${e.harness}:${e.id}:title`,t,r)}>${o(i.text)}</span><span class="task-title-source">${a("panel.render.sourcePrefix")}${o(S(i.source))}</span></span>
311
- <span class="task-card-meta"><span class="task-status ${s.kind}">${s.label}</span>${s.agentComplete?`<span class="task-status complete">${a("panel.render.markedCompleteByAgent")}</span>`:""}<span class="task-progress"${p}>${o(c)}</span>${u}${f}${h}</span>
312
- ${g}${sa(e.skillsUsed)}<span class="task-context">${o(v)}</span>
313
- </button>`}function oa(e){return`${e.harness}:${e.id}`}function It(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="${o(i)}">${o(`${n} · ${t}${r}`)}</div>`}function Qo(e,n){const t=oa(e),r=n.taskMenuOpen===t,s=`<button class="task-menu-button" data-act="task-menu" data-key="${o(t)}" type="button" aria-label="${a("panel.render.taskCardMenu")}" aria-expanded="${r}">⋯</button>`;if(!r)return s;const i=Ka(e),l=n.taskResumeOpen!==t?"":"unavailable"in i?`<div class="task-resume-unavailable">${o(i.unavailable)}</div>`:`<div class="task-resume-command"><code>${o(i.command)}</code><button data-act="task-copy" data-key="${o(t)}" data-command="${o(i.command)}" type="button">${a("panel.render.copy")}</button><div class="task-resume-note">${o(i.note)}</div></div>`,c=e.acceptance===void 0||e.acceptance.state==="unavailable"?"":`<button data-act="task-accept" data-key="${o(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="${o(t)}">
314
- <label>${a("panel.render.rename")}<input data-act="task-rename-input" data-key="${o(t)}" value="${o(e.user.title??"")}" placeholder="${a("panel.render.clearToRestoreTheAutomaticTitle")}"></label>
315
- <div class="task-menu-actions"><button data-act="task-pin" data-key="${o(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="${o(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="${o(t)}" data-value="true" type="button">${a("panel.render.archiveSession")}</button><button data-act="task-resume" data-key="${o(t)}" type="button">${a("panel.render.backToSession")}</button></div>
316
- ${It(n.taskReturnResults?.[t])}${l}
317
- </div>`}function ia(e,n,t,r,s=!1){const i=oa(e),l=s?`<button class="task-unhide" data-act="task-hide" data-key="${o(i)}" data-value="false" type="button">${a("panel.render.unhide")}</button>`:"",c=n.taskError?.key===i?`<div class="task-error">${o(n.taskError.message)}</div>`:"";return`<div class="${r}${s?" task-card-hidden":""}">${zo(e,t,n,r)}${M(`${e.harness}:${e.id}:title`,n,r)}${Qo(e,n)}${l}${c}${Jo(e)}</div>`}function Rt(e,n,t,r,s){if(e.length===0)return"";const i=t.hiddenOpen[n]===!0,l=i?Vn(e).map(c=>ia(c,t,r,s,!0)).join(""):"";return`<div class="task-hidden-group"><button class="task-hidden-toggle" data-act="task-hidden-toggle" data-group="${o(n)}" type="button">${a("panel.render.hidden")} ${e.length} ${a("panel.render.cards")} ${a(i?"panel.render.collapse":"panel.render.show")}</button>${l}</div>`}function jt(e){return e.children.length===0?1:e.children.reduce((n,t)=>n+jt(t),0)}function Et(e){return e.status==="in_progress"||e.children.some(Et)}function Nn(e,n,t,r){const s=e.sessions.filter(T=>T.attachedTo===n.key),i=Gn(s),l=Vn(Kn(i.visible,t.taskFilter)),c=i.visible.length-l.length,p=`${e.root}:${n.key}`,u=n.children.length>0&&(n.status==="completed"||n.status==="cancelled"||!Et(n)),g=n.verification?`<div class="project-verify">${a("panel.render.planAcceptance")}${o(n.verification)}</div>`:"",f=l.map(T=>ia(T,t,r,"project-session-wrap task-card-wrap")).join(""),h=c===0?"":`<div class="task-hidden">${c} ${a("panel.render.cardsHiddenByFilters")}</div>`,v=Rt(i.hidden,p,t,r,"project-session-wrap task-card-wrap"),$=n.children.map(T=>Nn(e,T,t,r)).join(""),w=$===""?"":u?`<details class="project-node-children"><summary data-tip="${a("panel.render.sourceWingmanPlanMdNodesSubtree")}">${a("panel.render.expandChildSteps")}${jt(n)})</summary><ul>${$}</ul></details>`:`<ul>${$}</ul>`;return`<li class="project-node ${n.status}${u?" collapsed":""}" id="${dn(e.root,n.key)}" data-project-node="${o(n.key)}">
318
- <div class="project-node-line"><span class="project-mark" data-tip="${o(Go[n.status])}">${Vo[n.status]}</span><span class="project-node-text" data-tip="${o(n.text)}"${F(`${e.root}:node:${n.key}`,t)}>${o(n.text)}</span>${M(`${e.root}:node:${n.key}`,t)}</div>
319
- ${g}${f}${h}${v}${w}
320
- </li>`}function $a(e,n,t,r){if(e.length===0)return`<div class="project-empty">${a("panel.render.noSessionObserved")}</div>`;const s=Gn(e),i=Vn(Kn(s.visible,t.taskFilter)),l=s.visible.length-i.length,c=i.map(g=>ia(g,t,r,"task-card-wrap")).join(""),p=l===0?"":`<div class="task-hidden">${l} ${a("panel.render.cardsHiddenByFilters")}</div>`,u=Rt(s.hidden,n,t,r,"task-card-wrap");return c===""&&u===""?`<div class="project-empty">${a("panel.render.noTaskCardsMatchTheFilters")}${l} ${a("panel.render.filteredOut")}</div>`:`${c===""?"":`<div class="task-card-list">${c}</div>`}${p}${u}`}function Xo(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(I[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(o).join(" · ")}function Zo(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 l=`${e.root}:${i.key}`,c=n.factsOpen[l]===!0,p=c?`<div class="project-facts-items">${i.items.map(u=>`<div class="project-facts-item">${o(u)}</div>`).join("")}</div>`:"";return`<div class="project-facts-group"><button class="project-facts-toggle" data-act="facts-toggle" data-group="${o(l)}" type="button" aria-expanded="${c}">${c?"▾":"▸"} ${i.label}</button>${p}</div>`}).join("")}</div>`}function On(e,n=""){return`expand-${encodeURIComponent(n===""?e:`${e}:${n}`)}`}function F(e,n,t=""){return` id="${On(e,t)}" data-expand-text="${o(e)}" data-expanded="${n.expandedText?.[e]===!0}"`}function M(e,n,t=""){const r=n.expandedText?.[e]===!0;return`<button class="expand" id="${On(e,t)}-control" data-act="expand" data-key="${o(e)}" aria-controls="${On(e,t)}" aria-expanded="${r}" type="button" hidden>${a(r?"panel.render.collapse":"panel.render.expand")}</button>`}function Nt(e,n,t,r){return n.map(s=>`<button class="project-crumb" data-tip="${o(a("panel.render.pathSource",{p0:String(s.path.join(" → ")),p1:String(S(s.source))}))}"${F(`${e.root}:${r}:${s.key}`,t)} data-act="project-node-link" data-node-target="${dn(e.root,s.key)}" type="button">${o(s.text)}</button>${M(`${e.root}:${r}:${s.key}`,t)}`).join("")}const wa=3;function ei(e,n){const t=e.firstScreen.branch,r=new Set(e.currentPoints.map(g=>g.key)),s=g=>Number(r.has(g.key))+g.children.reduce((f,h)=>f+s(h),0),i=new Map(e.plan.availability==="available"?e.plan.nodes.map(g=>[g.key,s(g)]):[]),l=g=>{const f=i.get(g.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">${Nt(e,[g],n,"branch")}${h}</div>`},c=t.slice(wa),p=`project:${e.root}:branches`,u=c.length===0?"":`<details class="fold"${n.expandedText?.[p]===!0?" open":""}><summary data-act="workflow-fold" data-key="${o(p)}">${a(c.length===1?"panel.render.oneMoreBranch":"panel.render.moreBranches",{count:c.length})}</summary><div class="fold-body">${c.map(l).join("")}</div></details>`;return`<div class="project-branches">${t.slice(0,wa).map(l).join("")}${u}</div>`}function ni(e,n){let t=e.firstScreen.action;if(t.kind==="decision"&&(t={...t,items:t.items.filter(s=>!ie(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")}${o(S(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")}${o(S(s.source))} · ${o(a("panel.render.sessionIdentifier",{id:s.sessionId}))} · ${o(s.since)}"><span${F(`${e.root}:request:${s.harness}:${s.sessionId}`,n)}>${o(s.text??a("panel.render.explicitFeedbackRequestReceived"))}</span>${M(`${e.root}:request:${s.harness}:${s.sessionId}`,n)}<span class="project-source">${o(I[s.harness])} · ${o(s.label)}</span><button class="project-crumb" data-act="project-session" data-harness="${s.harness}" data-session="${o(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="${o(a("panel.render.pathSource",{p0:String(s.path.join(" → ")),p1:String(S(s.source))}))}"><span${F(`${e.root}:checkpoint-action:${s.key}:text`,n)}>${o(s.text)}</span>${M(`${e.root}:checkpoint-action:${s.key}:text`,n)}${s.verification===void 0?"":`<span class="project-verify"${F(`${e.root}:checkpoint-action:${s.key}:verification`,n)}>${a("panel.render.planAcceptance")}${o(s.verification)}</span>${M(`${e.root}:checkpoint-action:${s.key}:verification`,n)}`}<button class="project-crumb" data-act="project-node-link" data-node-target="${dn(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=>Ae(c,e.root,n,a("panel.render.copyInstallCommandTip",{p0:String(I[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")}
321
- ${a("panel.render.goalProjectGoal")}
322
- ${a("panel.render.currentTask")}
323
- ${a("panel.render.pendingTask")}</pre></details>`:t.reason==="feedback_unavailable"&&(i=[...new Set(e.sessions.map(c=>c.harness))].map(c=>{const p=He(c,n.wingmanVersion);return`<button class="project-protocol-copy" data-act="protocol-copy" data-command="${o(p)}" data-tip="${o(p)}" type="button">${a("panel.render.connectFeedbackSignals")} ${I[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")}${o(S(t.source))}">${r}</section>`}function Ot(e,n){const t=e.sessions.filter(l=>ie(l.harness,l.id,{projects:[e]}));if(t.length===0)return{toggle:"",rows:""};const r=n.archivedSessionsOpen?.includes(e.root)===!0,s=Y(e),i=r?t.map(l=>{const c=oa(l),p=s?`<button data-act="project-archive" data-key="project:${o(e.root)}" data-value="false" type="button">${a("panel.render.restoreProject")}</button>`:`<button data-act="task-archive" data-key="${o(c)}" data-value="false" type="button">${a("panel.render.restoreSession")}</button>`,u=l.archivedHasNewActivity||s&&e.user?.archivedAt!==void 0&&l.lastActivity!==void 0&&Date.parse(l.lastActivity)>Date.parse(e.user.archivedAt);return`<div class="session-archived-row" data-session="${o(l.id)}"><span>${o(I[l.harness])} · ${o(sn(l).text)}</span>${u?`<span class="project-source" data-tip="${a("panel.render.sessionArchiveActivitySource")}">${a("panel.render.projectArchiveNewActivity")}</span>`:""}${p}${n.taskError?.key===c?`<div class="task-error" role="status">${o(n.taskError.message)}</div>`:""}</div>`}).join(""):"";return{toggle:`<button class="task-hidden-toggle" data-act="session-archived-toggle" data-root="${o(e.root)}" type="button" aria-expanded="${r}" data-tip="${a("panel.render.sessionArchiveSource")}">${a("panel.render.archivedSessions",{count:t.length})}</button>`,rows:i}}function ai(e,n,t){const r=`project:${e.root}`,s=t.findIndex(g=>g.root===e.root),i=g=>{const f=t[s+g],h=f?.user?.order??s+g;return`<button data-act="project-move" data-root="${o(e.root)}" data-order="${h}" type="button" aria-label="${a(g===-1?"panel.render.moveProjectUp":"panel.render.moveProjectDown")}"${f===void 0?" disabled":""}>${g===-1?"▲":"▼"}</button>`},l=Y(e),c=n.taskMenuOpen===r,p=`<button data-act="project-archive" data-key="${o(r)}" data-value="${!l}" type="button">${a(l?"panel.render.restoreProject":"panel.render.archiveProject")}</button>`,u=l?p:`<button class="task-menu-button" data-act="task-menu" data-key="${o(r)}" type="button" aria-label="${a("panel.render.projectMenu")}" aria-expanded="${c}">⋯</button>${c?`<div class="task-menu-actions">${p}</div>`:""}`;return`<div class="project-organization">${l?"":`<div data-tip="${a("panel.render.projectPinSource")}"><button data-act="task-pin" data-key="${o(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>`}${u}${l&&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">${o(n.taskError.message)}</div>`:""}`}function Ta(e,n,t,r){if("payloadUnavailable"in e)return Aa(e,n,t);const s=ai(e,n,r),i=Ot(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="${o(e.root)}" aria-expanded="true" type="button">${a("panel.render.collapse")}</button></div>${Aa(e,n,t)}</div>`;const l=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?qe(e.currentPointEmptyText??a("panel.render.thePlanHasNoStepMarked"),e.currentPointEmptyTextI18n):c.currentPoints.map(v=>v.text).join(" · "),g=c.currentPoints.length===0?S(c.source):c.currentPoints.map(v=>`${v.path.join(" → ")} · ${S(v.source)}`).join(`
324
- `),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]:""};return`<section class="project-card compact" id="${tn(e.root)}" data-project-root="${o(e.root)}"><div class="project-row-layout"><div class="project-row" data-act="project-expand" data-root="${o(e.root)}" role="button" tabindex="0" aria-expanded="false"><span class="project-row-name" data-tip="${o(e.title.text)} · ${a("panel.render.sourcePrefix")}${o(S(e.title.source))}">${o(e.title.text)}</span><span class="project-row-goal" title="${o(p)}" data-tip="${o(p)} · ${a("panel.render.sourcePrefix")}${o(S(c.goal?.source??c.source))}">${o(p)}</span><span class="project-row-task" data-tip="${o(u)} · ${a("panel.render.sourcePrefix")}${o(g)}">${o(u)}</span><span class="project-row-action" data-kind="${c.action.kind}" data-tip="${a("panel.render.sourcePrefix")}${o(S(c.action.source))}">${h[c.action.kind]}</span></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>`}${l}</section>`}function Aa(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="${tn(e.root)}" data-project-root="${o(e.root)}"><div class="project-title">${o(e.title.text)}</div><div class="project-error">${a("panel.render.projectDataUnavailable")}</div></section>`;const s=Ot(e,n);e={...e,sessions:e.sessions.filter(A=>!ie(A.harness,A.id,{projects:[e]}))};const i=e.firstScreen,l=`<div class="project-card-head"><span class="project-title" data-tip="${a("panel.render.sourcePrefix")}${o(S(e.title.source))}">${o(e.title.text)}</span></div>`,c=`<div class="project-goal" data-tip="${a("panel.render.sourcePrefix")}${o(S(i.goal?.source??i.source))}"><span class="project-label">${a("panel.render.goal")}</span>${i.goal===void 0?a("panel.render.noProjectGoalProvided"):`<span${F(`${e.root}:goal`,n)}>${o(i.goal.text)}</span>${M(`${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,g=u===void 0?`<span class="project-presence" data-tip="${a("panel.render.sourcePrefix")}${o(S(i.source))}; sessions.lastActivity / seenSinceStart">${p}</span>`:`<span data-tip="${a("panel.render.timestamp")}${o(u.at)} ${a("panel.render.sourceSeparator")}${o(S(u.source))} · ${o(a("panel.render.sessionIdentifier",{id:u.sessionId}))} ${a("panel.render.titleSource")}${o(S(u.labelSource))}">${o(Te(u.at,t))} · ${I[u.harness]} · <span${F(`${e.root}:activity-label`,n)}>${o(u.label)}</span>${M(`${e.root}:activity-label`,n)}</span>`,f=e.plan.availability==="unavailable"?`<div class="project-error" data-tip="${a("panel.render.sourcePlanAvailabilityReasonLine")}">${a("panel.render.planUnavailable")}${o(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(A=>A.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(A=>A.harness))].filter(A=>se(A,n)!==void 0).map(A=>A!=="dsh"&&se(A,n)==="outdated"?Ae(A,e.root,n,a("panel.render.update")):`<button class="project-protocol-copy" data-act="goto-protocol-banner" data-harness="${A}" data-root="${o(e.root)}" data-tip="${o($e(A))}" type="button">${I[A]} ${a("panel.render.viewPlanProtocol")}</button>`).join(""):"",$=`<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")}${o(S(i.source))}">${a("panel.render.noCurrentBranchProvided")}</span>`:ei(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")}${o(S(i.source))}">${o(qe(e.currentPointEmptyText??a("panel.render.thePlanHasNoStepMarked"),e.currentPointEmptyTextI18n))}</span>${v}`:Nt(e,i.currentPoints,n,"point")}</div><div><span class="project-label">${a("panel.render.recentActivityLabel")}</span>${g}</div>${f}${h}</div>`,w=e.sessions.filter(A=>A.attachedTo===void 0),T=e.plan.availability==="unavailable"?e.plan.lastGood:void 0;let y;if(e.plan.availability==="available"){const A=e.plan.nodes.length===0?`<div class="project-empty">${a("panel.render.thePlanHasNoSteps")}</div>`:`<ul class="project-tree">${e.plan.nodes.map(ae=>Nn(e,ae,n,t)).join("")}</ul>`;y=`<div class="project-section"><div class="project-label">${a("panel.render.planTree")}</div>${A}</div><div class="project-section"><div class="project-label">${a("panel.render.sessionsNotLinkedToAStep")}</div>${$a(w,`${e.root}:__unassigned`,n,t)}</div>`}else y=`${T===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">${T.nodes.map(ae=>Nn(e,ae,n,t)).join("")}</ul></div>`}<div class="project-section"><div class="project-label">${a("panel.render.projectSessions")}</div>${$a(e.sessions,`${e.root}:__all`,n,t)}</div>`;const R=e.counts,D=`<div class="project-counts" data-tip="${a("panel.render.sourceWingmanPlanMdLeafCounts")}">${a("panel.render.agentUserMarksPending")} ${R.pending} ${a("panel.render.inProgressCount")} ${R.inProgress} ${a("panel.render.complete")} ${R.completed} ${a("panel.render.cancelledCount")} ${R.cancelled} ${a("panel.render.checkpointCount")} ${R.checkpoint}</div>`,H=e.completionLabel?`<div class="project-complete" data-tip="${a("panel.render.sourceCompletionLabel")}">${o(e.completionLabel)}</div>`:"",C=e.plan.availability==="available"&&e.plan.ignoredLineCount>0?`<span class="muted" data-tip="${o(e.plan.ignoredLines.map(A=>a("panel.render.ignoredLine",{p0:String(A.line),p1:String(A.preview)})).join(`
325
- `))}"> ${a("panel.render.ignored")} ${e.plan.ignoredLineCount} ${a("panel.render.lineSuffix")}</span>`:"",V=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(o).join(" · ")}</div>`:"",ee=e.checkpoints.length===0?"":`<div class="project-checkpoints">${e.checkpoints.map(A=>`<div class="project-checkpoint" data-tip="${o(A.path.join(" → "))}"${F(`${e.root}:checkpoint:${A.key}`,n)}>${o(A.path.join(" → "))}</div>${M(`${e.root}:checkpoint:${A.key}`,n)}`).join("")}</div>`,Se=w.map(A=>`<div class="project-facts" data-tip="${a("panel.render.sourceSessionsUnattachedReason")}">${I[A.harness]} · ${o(A.title.text)} ${a("panel.render.notLinked")}${o(A.unattachedReason??a("panel.render.notLinkedToAStep"))}</div>`).join(""),ne=T===void 0?"":`<div class="project-meta" data-tip="${a("panel.render.sourcePlanLastGoodRevisionMtime")}">${a("panel.render.lastReadableVersionRevision")} ${T.revision} · ${o(T.mtime)}</div>`,Ie=`<details class="project-tech"><summary>${a("panel.render.connectionsAndProtocolPlanSourceAnd")}</summary><code class="project-root" data-tip="${a("panel.render.sourceProjectRoot")}">${o(e.root)}</code>${Yo(e,n)}<div class="project-meta" data-tip="${a("panel.render.sourceRevisionMtimeLastWriter")}">${Xo(e)}</div>${ne}${C}${ee}${D}${H}${Zo(e,n)}${V}${Se}</details>`;return`<section class="project-card${e.plan.availability==="available"?"":` ${e.plan.availability}`}" id="${tn(e.root)}" data-project-root="${o(e.root)}">${l}${c}${$}${r}${ni(e,n)}${y}${Ie}${s.toggle===""?"":`<div class="project-archived-sessions"><div class="session-archived">${s.toggle}${s.rows}</div></div>`}</section>`}function ti(e){const n=[["all",a("panel.render.all")],["cc",I.cc],["codex",I.codex],["dsh",I.dsh]],t=[["all",a("panel.render.all")],["waiting",a("panel.render.waitingForYouLabel")],["active",a("panel.render.inProgress")],["ended",a("panel.render.ended")]],r=(s,i,l)=>l.map(([c,p])=>`<button class="task-filter-chip${i===c?" act":""}" data-act="task-filter" data-kind="${s}" data-value="${c}"${s==="harness"?` data-tip="${a("panel.render.filterBySessionHarness")}"`:""} type="button" aria-pressed="${i===c}">${o(p)}</button>`).join("");return`<div class="task-filters"><div class="task-filter-group"><span>Harness</span>${r("harness",e.harness,n)}</div><div class="task-filter-group"><span>${a("panel.render.status")}</span>${r("status",e.status,t)}</div></div>`}function ri(e,n=oe,t=Date.now(),r={...na,taskFilter:n}){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>`;const s=e.memory===void 0||r.projectMemoryDismissed?"":`<div class="project-memory-warning" role="status"><span>${o(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`${s}<div class="projects-empty"${r.projectRefreshFailed?a("panel.render.dataTipSourceGETApiProjects"):""}>${r.projectRefreshFailed?a("panel.render.projectRefreshFailedShowingThePreviousResponse"):a("panel.render.noSessionWithAWorkingDirectory")}</div>`;const i=e.projects.filter(Y),l=e.projects.filter(y=>!Y(y)),c=Yn(l,n),p=l.length-c.length,u={...r,projects:e,taskFilter:n},g=p===0?"":`<div class="task-filter-summary" data-tip="${a("panel.render.projectFilterSource")}">${a("panel.render.projectsHiddenByFilters",{count:p})}</div>`,f=en(c,u.projectOrder),h=en(e.projects).filter(y=>!("payloadUnavailable"in y)&&y.user?.pinned===!0),v=f.filter(y=>!("payloadUnavailable"in y)),$=v.length>0&&v.every(y=>u.expandedProjects?.includes(y.root)),w=v.length===0?"":`<button class="projects-toggle" data-act="projects-toggle" type="button">${a($?"panel.render.collapseAllProjects":"panel.render.expandAllProjects")}</button>`,T=i.length===0?"":`<div class="project-archived"><button class="task-hidden-toggle" data-act="project-archived-toggle" type="button" aria-expanded="${u.archivedProjectsOpen===!0}" data-tip="${a("panel.render.projectArchiveSource")}">${a("panel.render.archivedProjects",{count:i.length})}</button>${u.archivedProjectsOpen?i.map(y=>Ta(y,u,t,h)).join(""):""}</div>`;return`${s}${ti(n)}${w}${g}<div class="projects">${f.map(y=>Ta(y,u,t,h)).join("")}</div>${T}`}function si(e,n,t,r,s,i=n.harness,l=null,c=Date.parse(s.now)){s={...s,anatomy:e,projects:l??s.projects};const p=s.narrative;p&&(ie(p.harness,p.sessionId??"",s.projects)||s.sessions.some(y=>y.id===p.sessionId&&y.archived))&&(s={...s,narrative:null,selectedSession:null});const u=i==="projects",g=n.__mock_note?`<span class="badge" data-tip="${o(n.__mock_note)}">${a("panel.render.mockDemoData")}</span>`:"",f=n.harnessVersion?` ${n.harnessVersion}`:"",h=u?a("panel.render.projectPlansAcrossHarnessesLocalAnd"):a("panel.render.scannedAt",{p0:String(I[n.harness]),p1:String(f),p2:String(mr(n.scannedAt))}),v=s.narrative,$=v&&ct(v)?To(v,s):"",w=Qa(r),T=w==="grace"||w==="expired";return{top:`<div class="head">
326
- <span class="dot"></span>
327
- <span class="title">Wingman</span>
328
- <span class="meta">${o(h)}</span>
329
- ${u?"":g}
330
- ${s.showLocaleSelector===!1?"":`<select class="lang" data-act="lang" aria-label="${a("panel.render.language")}">${(s.availableLocales??X()).map(({tag:y,nativeName:R})=>`<option value="${o(y)}"${y===_e()?" selected":""}>${o(R)}</option>`).join("")}</select>`}
331
- <button class="collapse" data-act="toggle">${a("panel.render.collapseArrow")}</button>
332
- </div>
333
- ${po(r)}${ao(e,i,Gr(t.entries))}`,sessions:u?"":`${bo(s,n.harness)}${vo(s,n.harness)}${ko(s,n.harness)}${v?.taskWorkflow===void 0?yo(s,n.harness):""}${n.planProtocol?.user==="installed"?"":Sa(n,s)}`,now:u?"":$+(n.planProtocol?.user==="installed"?Sa(n,s):""),viewTabs:u?"":Oo(s),tasks:Ho(n,s),rawEvents:Bo(n,t,s),control:oo(n,s)+io(s),billing:_o(n,s),projects:u||v?.taskWorkflow===void 0?ri(l,s.taskFilter,c,s):"",bottom:`<div class="suggslot">${So(s,n.harness)}</div>
334
- ${T?"":`<div class="licfoot">${$t("licfootlink")}</div>`}
335
- ${xt(n)}`}}function Pa(e,n,t){const r=he(e.narratives?.[n]??null,e.projects??null),s=ve(r,e.sessionSel?.[n]);return{now:t,wingmanVersion:e.wingmanVersion,availableLocales:e.availableLocales??X(),showLocaleSelector:!e.island||e.open,view:e.view??na.view,narrative:r!==null&&s!==null?r.states[s]??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:r?.startedAt??null,notices:r?.notices??[],noticeDismissed:e.noticeDismissed??{},sessions:r?.sessions??[],selectedSession:s,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??oe,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 oi(e){const n=e.license??null,t=e.flow?co(e.flow):"",r=e.licenseOpen&&n?fo(n,za,e.licenseRefreshing??!1,e.licenseRefreshResult??null,e.licenseCanSubscribe??!1):"",s=e.importResult?uo(e.importResult):"",i=e.share?go(e.share):"";return`${t}${r}${s}${i}`}function Ca(e,n){const t=new Date(n).getTime(),r=e.configs.find(C=>C.harness===e.active)??e.configs[0];if(!r)return null;const s=Pa(e,r.harness,new Date(n).toISOString()),i={...e,narratives:Object.fromEntries(e.configs.map(C=>[C.harness,he(e.narratives?.[C.harness]??null,e.projects??null)]))};let l=r;const c=e.narratives?.[r.harness],p=i.narratives[r.harness];c&&p&&c.sessions.length>p.sessions.length&&ve(p,void 0)===null&&(l=e.configs.find(C=>ve(i.narratives[C.harness]??null,void 0)!==null)??r);const u=Pa(i,l.harness,new Date(n).toISOString()),g=et(e.live.entries,l.harness,l.capabilities.live,t),f=u.sessions.find(C=>C.id===u.selectedSession),h=u.projects?.projects.find(C=>!("payloadUnavailable"in C)&&!Y(C)&&C.sessions.some(V=>V.harness===l.harness&&V.id===u.selectedSession)),v=h&&!("payloadUnavailable"in h)?h.sessions.find(C=>C.harness===l.harness&&C.id===u.selectedSession):void 0,$=v?sn(v):void 0,w=u.narrative?.taskWorkflow?.plan??v?.sessionPlan,T=w?.availability==="available"&&w.forInstruction==="current"?w.steps.find(C=>C.status==="in_progress")?.text:void 0,y={projectTitle:h?.title.text,taskTitle:T??$?.text,sessionTitle:$?.text??f?.label,status:v?De(v).label:f?f.waiting?a("panel.render.waitingForYouLabel"):f.ended?a("panel.render.ended"):a("panel.render.inProgress"):void 0,source:[h?.title.source,h&&T?w?.source:$?.source,v?"GET /api/projects sessions.waiting/feedback/ended":"GET /api/narrative sessions.label/waiting/ended"].filter(C=>!!C).map(S).join(";"),feedback:v?.feedback},R=dt(i.narratives?.[l.harness]??null),D=Ms(u.narrative,g,y,R,t),H=e.license??null;return{story:s,pill:e.island&&e.islandTab?an(D.mode):no(l,D,e.island?e.islandSize:"standard"),panel:si(e.configs,r,e.live,H,s,e.active,e.projects??null,t),overlays:oi(e)}}function je(e,n){return{layout:e,visibility:"",pill:"",top:n,sessions:"",now:"","view-tabs":"",tasks:"","raw-events":"",control:"",billing:"",projects:"",bottom:"",overlays:""}}function ii(e,n){if(e.island&&e.islandTab)return je("tab",e.error?an("idle"):Ca(e,n)?.pill??an("idle"));if(e.island&&e.islandSize==="compact"&&(e.error||!e.configs.length))return je("compact",eo(e.error));if(e.error)return je("error",`<div class="wrap">${ya(e.error,e.wingmanVersion)}</div>`);const t=Ca(e,n);return t?e.island&&e.islandSize==="compact"?je("compact",`<div class="wrap">${t.pill}</div>`):{layout:"panel",visibility:`${e.open?"open":"closed"}:${e.active==="projects"?"projects":t.story.view}`,pill:t.pill,top:t.panel.top,sessions:t.panel.sessions,now:t.panel.now,"view-tabs":t.panel.viewTabs,tasks:t.panel.tasks,"raw-events":t.panel.rawEvents,control:t.panel.control,billing:t.panel.billing,projects:t.panel.projects,bottom:t.panel.bottom,overlays:t.overlays}:je("empty",`<div class="wrap">${ya(void 0,e.wingmanVersion)}</div>`)}function G(e,n){return`<div class="panel-region" data-panel-region="${e}">${n}</div>`}function Sn(e){if(e.layout!=="panel")return e.top;const[n,t="tasks"]=e.visibility.split(":");return`<div class="wrap${n==="open"?" open":""}">
336
- ${G("pill",e.pill)}
337
- <div class="panel">
338
- ${G("top",e.top)}
339
- ${G("sessions",e.sessions)}
340
- ${G("now",e.now)}
341
- ${G("view-tabs",e["view-tabs"])}
342
- <div class="pane${t==="projects"?" act":""}" data-panel-view="projects">${G("projects",e.projects)}</div>
343
- <div class="pane${t==="tasks"?" act":""}" data-panel-view="tasks">${G("tasks",e.tasks)}${G("raw-events",e["raw-events"])}</div>
344
- <div class="pane${t==="control"?" act":""}" data-panel-view="control">${G("control",e.control)}</div>
345
- <div class="pane${t==="billing"?" act":""}" data-panel-view="billing">${G("billing",e.billing)}</div>
346
- ${G("bottom",e.bottom)}
347
- </div>
348
- </div>${G("overlays",e.overlays)}`}const Ft=50;function li(e,n,t=Ft){const r={};let s;const i=()=>{s!==void 0&&(clearTimeout(s),s=void 0);const l=e(),c=Object.keys(l).filter(p=>r[p]!==l[p]);if(c.length!==0){n({regions:c,html:l});for(const p of c)r[p]=l[p]}};return{request(){s!==void 0&&clearTimeout(s),s=setTimeout(i,t)},flush:i,cancel(){s!==void 0&&clearTimeout(s),s=void 0}}}const B=Jn(window.location.search),Fn=Qn(window.location.search);let fe=Ja(window.location.search)&&(Fn==="top"||Fn==="bottom");B&&(document.documentElement.classList.add("island"),document.documentElement.dataset.islandEdge=Fn,zn(window.location.search)&&document.documentElement.classList.add("island-tab-mode"),fe&&document.documentElement.classList.add("island-compact"));function di(){try{const e=localStorage.getItem("wingman.activeTab");return e!==null&&["projects","cc","codex","dsh"].includes(e)?e:"projects"}catch{return"projects"}}function Mn(e){d.expandedProjects=[...new Set(e)],qn("wingman.projects.expanded",d.expandedProjects)}function xa(e){d.expandedText={...d.expandedText,[e]:d.expandedText?.[e]!==!0},qn("wingman.folds",Object.keys(d.expandedText).filter(n=>d.expandedText?.[n]===!0&&(n===xn||n===_a||n===qa||/^project:.+:branches$/.test(n)||/:(plan|verification|recent|evidence)$/.test(n)))),m()}const q={entries:[],connection:"connecting",replaying:!1},d={wingmanVersion:void 0,availableLocales:X(),configs:[],active:di(),open:!B,error:null,anatomyLoadedAt:null,anatomyRefreshFailed:!1,live:q,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:oe,taskMenuOpen:null,taskResumeOpen:null,hiddenOpen:{},factsOpen:{},taskError:null,sessionSel:{},sessionSeen:{},noticeDismissed:{},suggHidden:{},island:B,islandSize:fe?"compact":"standard",islandTab:zn(window.location.search),todoOpen:{},nodeOpen:{},rawOpen:!1};let Xe=null,$n=0,ci=0,la=null,Ia=!1,rn=null,U=null;const Ze=Lr((e,n)=>{e==="retract"?(rn=n,de()):(U?.remove(),U=null)}),x=document.querySelector("#app");function Ve(){return x!==null&&typeof x.querySelector=="function"}function da(){if(!(!x||!Ve()))for(const e of x.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 pi(){if(!x||!Ve())return{panes:[],rawEvents:null,details:[]};const e=Array.from(x.querySelectorAll("[data-panel-view]")).map(r=>[r.dataset.panelView??"",r.scrollTop]),n=x.querySelector('[data-panel-region="raw-events"] .feed'),t=Array.from(x.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 ui(e){if(!x||!Ve())return;for(const[r,s]of e.panes){const i=x.querySelector(`[data-panel-view="${r}"]`);i&&(i.scrollTop=s)}const n=x.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 x.querySelectorAll(".project-tech, .project-node-children")){const s=t.get(`${r.closest("[id]")?.id??""}:${r.className}`);s!==void 0&&(r.open=s)}}function fi(){if(!x||!Ve())return;x.querySelector(".wrap")?.classList.toggle("open",d.open);const e=d.active==="projects"?"projects":d.view??"tasks";for(const n of x.querySelectorAll("[data-panel-view]"))n.classList.toggle("act",n.dataset.panelView===e)}function gi(e){return e!=="layout"&&e!=="visibility"}function mi(e){if(!x)return;if(!Ve()){x.innerHTML=Sn(e.html),B&&de();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, [data-act="old-sessions-toggle"]')?{act:document.activeElement.dataset.act,key:document.activeElement.dataset.key??document.activeElement.dataset.group}:void 0,r=pi(),s=Ze.element,i=e.html.layout;if(x.dataset.panelLayout!==i||i!=="panel")x.innerHTML=Sn(e.html),x.dataset.panelLayout=i;else{const c=e.regions.filter(gi),p=c.map(u=>x.querySelector(`[data-panel-region="${u}"]`));if(p.some(u=>u===null))x.innerHTML=Sn(e.html);else for(let u=0;u<c.length;u+=1){const g=p[u];if(!g)continue;const f=e.html[c[u]];if(c[u]==="pill"&&s?.isConnected&&g.contains(s)&&!d.open&&!d.islandTab){const h=document.createElement("div");h.innerHTML=f;const v=h.querySelector(".pill");v&&Mr(s,v)}else g.innerHTML=f}}if(fi(),B){const c=x.querySelector(".island-tab.wait, .pill.waiting")!==null;d.islandTab&&c&&!Ia&&x.querySelector(".island-tab")?.classList.add("pulse"),Ia=c}if(ui(r),da(),n!==void 0&&document.getElementById(n)?.focus({preventScroll:!0}),t!==void 0)for(const c of x.querySelectorAll('.fold > summary, [data-act="old-sessions-toggle"]'))c.dataset.act===t.act&&(c.dataset.key??c.dataset.group)===t.key&&c.focus({preventScroll:!0});B&&de()}let Mt=new Date().toISOString();const cn=li(()=>ii(d,Mt),mi,0);window.addEventListener("wingman-island-shape",e=>{if(!B)return;const{tab:n,edge:t,phase:r,seq:s}=e.detail,i=r!==void 0&&s!==void 0&&(t==="left"||t==="right");i?(U??=x?.querySelector(".island-tab")??null,U&&(U.classList.add("island-transition-tab"),document.body.append(U))):(Ze.cancel(),U?.remove(),U=null);const l=new URL(window.location.href);l.searchParams.set("edge",t),n&&!i?l.searchParams.set("tab","1"):l.searchParams.delete("tab"),history.replaceState(null,"",l);const c=Qn(l.search);fe=Ja(l.search)&&(c==="top"||c==="bottom");const p=fe?"compact":"standard",u=zn(l.search),g=d.islandSize!==p||d.islandTab!==u;if(d.islandSize=p,d.islandTab=u,(d.islandTab||fe)&&(d.open=!1),la=null,rn=null,document.documentElement.dataset.islandEdge=c,document.documentElement.classList.toggle("island-compact",fe),document.documentElement.classList.toggle("island-tab-mode",d.islandTab),(!i||g)&&(m(),i&&cn.flush()),i){const f=x?.querySelector(".pill");if(f){if(!U){const h=document.createElement("div");h.innerHTML=an(f.classList.contains("waiting")?"waiting":f.querySelector(".dot.live")?"working":"idle"),U=h.firstElementChild,U.classList.add("island-transition-tab"),document.body.append(U)}U.style.left=`clamp(0px, ${t==="left"?f.offsetLeft-6:f.offsetLeft+f.offsetWidth}px, calc(100vw - 6px))`,U.style.top=`clamp(0px, ${f.offsetTop+(f.offsetHeight-64)/2}px, calc(100vh - 64px))`,Ze.start(f,t,r,s,matchMedia("(prefers-reduced-motion: reduce)").matches)}else Ze.cancel(),U?.remove(),U=null,r==="retract"&&(rn=s);de()}});let Fe=!1,le=0,N=0;function m(){Mt=new Date().toISOString(),Fe&&le===0&&cn.request()}function de(){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=Or(d.open,e,Xe,hi(),la,rn);window.location.hash!==t&&history.replaceState(null,"",t)}function hi(){let e=null;for(const n of K){const t=dt(he(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:I[n],p1:t.message})})}return e}function vi(e){$n+=1,Xe={target:e,seq:$n},de();const n=$n;setTimeout(()=>{Xe?.seq===n&&(Xe=null,de())},600)}let ca=!1;async function Lt(){try{const e=await fetch("/api/settings");if(!e.ok)return;const n=await e.json();return!X().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"&&X().some(({tag:r})=>r===t.tag))?void 0:(ca=!0,n)}catch{return}}function Ln(e){if(e===void 0&&ca&&Fe)return _e();if(e?.source!=="settings")try{const n=localStorage.getItem("wingman.locale");if(X().some(({tag:t})=>t===n))return n}catch{}return e?.locale??cr(navigator.language)??"en"}let Oe;function pa(e){const n=++N,t=(Oe??Promise.resolve()).then(()=>bi(e,n));return Oe=t,t.finally(()=>{Oe===t&&(Oe=void 0)})}async function bi(e,n){if(n!==N)return!1;const t=_e(),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}};le+=1,cn.cancel();for(const i of K){const l=Le[i];l!==void 0&&clearTimeout(l),delete Le[i]}we!==void 0&&clearTimeout(we),we=void 0,We(e);let s=!1;try{return s=(await Promise.all([Ce(!1),xe(!1,!0),...K.map(l=>ke(l,!0))])).every(Boolean)&&n===N,s&&await Promise.all([Wt(),ua()]),s}finally{s||(We(t),Object.assign(d,r)),le-=1,m()}}let Me=!1;async function Ra(e){const n=++N;if(await Oe,n===N){We(e);try{localStorage.setItem("wingman.locale",e)}catch{}m()}}async function ki(e){if(!(Me||!X().some(({tag:n})=>n===e))){if(!ca){await Ra(e);return}Me=!0,N+=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 pa(e):(d.error=await Z(n),m())}catch(n){d.error=J(n),m()}finally{Me=!1}}}async function Ce(e=!0){if(e&&le>0)return!1;const n=N;let t=!1;const r=e?Lt():void 0;try{const s=d.wingmanVersion===void 0?fetch("/api/version").then(async g=>{if(!g.ok)return null;const f=await g.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,l,c]=await Promise.all([fetch("/api/anatomy"),s,r]);if(n!==N)return!1;if(e){d.availableLocales=c?.available??X();const g=Ln(c);if(!Fe)We(g);else if(g!==_e())return pa(g)}if(d.wingmanVersion=l,!i.ok)throw new Error(`GET /api/anatomy → HTTP ${i.status}`);const p=await i.json();if(n!==N)return!1;const u=Jr(p);d.configs=u,d.anatomyLoadedAt=new Date().toISOString(),d.anatomyRefreshFailed=!1,d.active=d.active==="projects"||u.some(g=>g.harness===d.active)?d.active:"projects",d.error=null,t=!0}catch(s){if(n!==N)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??X();const i=Ln(s);Fe||(We(i),Fe=!0)}return m(),t}async function ua(){const e=N;try{const n=await fetch("/api/return-target");if(!n.ok)return!1;const t=Qr(await n.json());return e!==N||t===null?!1:(d.returnTargets?.settings?.unavailable!==t.settings?.unavailable&&(d.returnSettingsDismissed=!1),d.returnTargets=t,m(),!0)}catch{return!1}}async function yi(e){if(!(d.returnTargetSaving||!d.returnTargets?.available.some(n=>n.bundlePath===e))){d.returnTargetSaving=!0,d.returnTargetError=null,m();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 Z(n);return}const t=Xr(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,m()}}}let Ee=0,wn=!1;async function xe(e=!1,n=!1){if(le>0&&!n)return!1;const t=N;let r=!1;e&&(wn=!0);const s=++Ee;try{const i=await fetch("/api/projects");if(s!==Ee||t!==N)return!1;if(!i.ok)return d.projectRefreshFailed=!0,!1;const l=es(await i.json());if(s!==Ee||t!==N)return!1;if(d.projectRefreshFailed=l===null,l!==null){d.projects?.memory!==void 0&&l.memory===void 0&&(d.projectMemoryDismissed=!1);const c=en(l.projects).map(g=>g.root),p=d.projectOrder??[],u=d.projects?.projects.filter(Y).some(g=>c.includes(g.root))??!1;d.projectOrder=wn||u||d.projects===null?c:[...p.filter(g=>c.includes(g)),...c.filter(g=>!p.includes(g))],wn=!1,d.projects=l,r=!0}}catch{s===Ee&&t===N&&(d.projectRefreshFailed=!0)}finally{s===Ee&&m()}return r}const Tn=new Set;async function Si(e){if(Tn.has(e))return;const n=d.projects?.projects.flatMap(l=>"payloadUnavailable"in l?[]:l.sessions).find(l=>`${l.harness}:${l.id}`===e);if(n===void 0)return;Tn.add(e),d.taskResumeOpen=e;const t=Ka(n),r="unavailable"in t?"unavailable":await Rn(t.command)?"copied":"failed";let s,i="GET /api/return-target";if(d.returnTargets==null&&!await ua())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 l=await fetch("/api/return",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({bundlePath:d.returnTargets.selected.bundlePath})});s=l.ok?zr(await l.json())??{activated:!1,reason:a("panel.main.activationResponseUnavailable")}:{activated:!1,reason:await Z(l)}}catch{s={activated:!1,reason:a("panel.main.activationRequestFailed")}}}d.taskReturnResults={...d.taskReturnResults,[e]:{clipboard:r,activation:s,activationSource:i}},Tn.delete(e),m()}async function pe(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);let i;try{i=await fetch("/api/task-overlay",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(r==="project"?{root:s,patch:n}:{harness:r,sessionId:s,patch:n})})}catch(l){d.taskError={key:e,message:a("panel.main.organizationRequestFailed",{p0:J(l)})},m();return}if(!i.ok){d.taskError={key:e,message:await Z(i)},m();return}d.taskError=null,d.taskMenuOpen=null,d.taskResumeOpen=null,await xe(r==="project"),(n.accepted!==void 0||n.archived!==void 0)&&K.includes(r)&&await ke(r)}async function Wt(){const e=N;try{const n=await fetch("/api/license");if(!n.ok)return;const t=Xn(await n.json());if(e!==N)return;t&&(d.license=t,m())}catch{}}async function $i(){if(d.licenseRefreshing)return;d.licenseRefreshing=!0,d.licenseRefreshResult=null,d.licenseCanSubscribe=!1,m();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:J(r)})},m();return}if(!e.ok){const r=await Li(e);d.licenseRefreshing=!1,d.licenseCanSubscribe=r.canSubscribe,d.licenseRefreshResult={ok:!1,message:r.message},m();return}let n;try{n=await e.json()}catch{n=null}const t=Xn(n);t&&(d.license=t),d.licenseRefreshing=!1,d.licenseCanSubscribe=!1,d.licenseRefreshResult={ok:!0,message:t?a("panel.main.licenseRefreshed",{p0:t.detail}):a("panel.main.licenseRefreshedReopenThePanelTo")},m()}function wi(){const e=document.createElement("input");e.type="file",e.accept=".json,application/json";const n=()=>{B&&!d.open&&(d.open=!0,m())};if(e.addEventListener("change",()=>{n();const t=e.files?.[0];t&&Ut(t)}),e.addEventListener("cancel",n),B&&d.open){d.open=!1,m(),window.setTimeout(()=>e.click(),200);return}e.click()}async function Ut(e){let n;try{n=await e.text()}catch(t){d.importResult={ok:!1,message:a("panel.main.couldNotReadFile",{p0:J(t)})},m();return}await Ti(n)}async function Ti(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:J(r)})},m();return}if(!n.ok){d.importResult={ok:!1,message:await Z(n)},m();return}let t=null;try{t=Xn(await n.json())}catch{t=null}t&&(d.license=t,d.licenseCanSubscribe=!1),d.importResult={ok:!0,message:Dr(t)},m()}if(B)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=Hr(s.map(c=>c.name));if(i){d.importResult={ok:!1,message:i},m();return}const l=s[0];l&&Ut(l)})}const fa=Ft,Le={},Ne={};let we;async function ke(e,n=!1){if(le>0&&!n)return!1;const t=N;let r=!1;const s=(Ne[e]??0)+1;Ne[e]=s;try{const i=await fetch(`/api/narrative?harness=${e}`);if(Ne[e]!==s||t!==N||!i.ok)return!1;const l=await i.json();if(Ne[e]!==s||t!==N)return!1;const c=ns(l);if(c){d.narratives||(d.narratives={}),d.narratives[e]=c,r=!0;const p=ve(he(c,d.projects??null),d.sessionSel?.[e]);p!==null&&(d.sessionSel||(d.sessionSel={}),d.sessionSel[e]=p,Wn(e,p))}}catch{}finally{Ne[e]===s&&m()}return r}function Wn(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 Dt(e){Le[e]===void 0&&(Le[e]=window.setTimeout(()=>{delete Le[e],ke(e)},fa))}function Ai(){we===void 0&&(we=window.setTimeout(()=>{we=void 0,xe()},fa))}const An=new Set;let Pn;function ja(e){An.add(e),Pn===void 0&&(Pn=window.setTimeout(async()=>{Pn=void 0;const n=[...An];if(An.clear(),le>0||Me)return;const t=N,r=await Lt();if(t!==N||le>0||Me)return;const s=Ln(r);if(d.availableLocales=r?.available??X(),s!==_e())await pa(s);else{for(const i of n)Dt(i);Ai()}},fa))}function Pi(){const e=new EventSource("/api/narrative/events");e.onopen=()=>{for(const n of K)ja(n)},e.onmessage=n=>{try{const t=JSON.parse(n.data);K.includes(t.harness)&&ja(t.harness)}catch{}}}function Ci(){const e=d.configs.find(r=>r.harness===d.active)??d.configs[0];if(!e)return null;const n=he(d.narratives?.[e.harness]??null,d.projects??null),t=ve(n,d.sessionSel?.[e.harness]);return n===null||t===null?null:n.states[t]??null}function Be(e){d.protocolBannerProjectRoot=void 0;const n=e==="projects"&&d.active!=="projects";d.active=e;try{localStorage.setItem("wingman.activeTab",e)}catch{}n&&(d.projectOrder=en(d.projects?.projects??[]).map(t=>t.root),xe(!0))}function Ht(e){const n=d.projects?.projects.find(t=>t.root===e);n&&Y(n)&&(d.archivedProjectsOpen=!0),n&&Yn([n],d.taskFilter??oe).length===0&&(d.taskFilter=oe),Mn([...d.expandedProjects??[],e])}function xi(e){Be("projects");const n=d.projects?.projects.find(t=>e.startsWith(`project-node-${encodeURIComponent(`${t.root}:`)}`));n&&Ht(n.root),m(),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 Ii(e){Be("projects"),Ht(e),m(),window.setTimeout(()=>{document.getElementById(tn(e))?.scrollIntoView({block:"center"})},0)}function Ri(e){const n=d.todoOpen??{};let t;if(e==="__other__")t=n[e]!==!1;else{const r=Ci()?.todos.find(s=>s.id===e);t=r?gt(r,n):n[e]===!0}d.todoOpen={...n,[e]:!t},m()}const K=["cc","codex","dsh"],ji=["all","waiting","active","ended"];function Ei(e){if(typeof e!="object"||e===null)return null;const n=e;if(!K.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 Bt(e,n,t){const r={event:e,...n===void 0?{}:{mock:n},...t===void 0?{}:{sseId:t}};q.entries=Vr(q.entries,r),Dt(e.harness)}function Ni(){const e=new EventSource("/api/events");e.onopen=()=>{q.connection!=="open"&&(q.connection="open",m())},e.onmessage=n=>{try{const t=Ei(JSON.parse(n.data));t&&Bt(t,void 0,n.lastEventId||void 0)}catch{}},e.onerror=()=>{q.connection!=="retrying"&&(q.connection="retrying",m())}}const Oi=200;async function Fi(){if(!q.replaying){q.replaying=!0,m();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)Bt({harness:n.harness,received_at:new Date().toISOString(),payload:t},!0),await new Promise(r=>setTimeout(r,Oi))}catch{}q.replaying=!1,m()}}let O=0;function me(){return d.configs.find(e=>e.harness===d.active)??d.configs[0]}function Mi(e,n){for(const t of Pe){const r=(e.slots[t]??[]).find(s=>s.id===n);if(r)return r}}function _t(){O+=1,d.flow=null,m()}function J(e){return e instanceof Error?e.message:String(e)}async function Z(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 Li(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 Wi(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=Ha(r.plan);if(e!==O)return;d.flow={phase:"confirm",title:Da(Sr(i),i.action.enable),plan:i,mockNote:s}}catch(t){if(e!==O)return;d.flow={phase:"error",title:n,message:a("panel.main.theServerHasNoActionEndpoint",{p0:J(t)})}}m()}async function Ea(e,n,t){const r=me();if(!r)return;const s=Mi(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,l=t===void 0?Da(s.ccFeature?Wa(s.ccFeature.key):s.nativeName,i):a("panel.render.ccSetInbound",{value:Cn(t)}),c=++O;d.flow={phase:"planning",title:l},m();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===O){if(u===null||u.status===404||u.status===405){await Wi(c,l);return}if(!u.ok){const g=await Z(u);if(c!==O)return;d.flow={phase:"error",title:l,message:g},m();return}try{const g=Ha(await u.json());if(c!==O)return;d.flow={phase:"confirm",title:l,plan:g}}catch(g){if(c!==O)return;d.flow={phase:"error",title:l,message:J(g)}}m()}}async function Ui(e,n){const t=a("panel.main.userPlanProtocol",{p0:a(n==="protocol_user_install"?"panel.main.install":"panel.main.uninstall"),p1:I[e]}),r=++O;d.flow={phase:"planning",title:t},m();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 Z(s)}`);const i=Cr(await s.json());if(i.kind!==n||i.harness!==e)throw new Error(a("panel.main.thePlanDoesNotMatchThe"));if(r!==O)return;d.flow={phase:"confirm",title:t,plan:i}}catch(s){if(r!==O)return;d.flow={phase:"error",title:t,message:J(s)}}m()}let Na;function Di(e,n){Be(e),d.protocolBannerProjectRoot=e==="dsh"?n:void 0,d.protocolBannerHighlight=e,clearTimeout(Na),cn.flush(),document.querySelector(".protocol-banner")?.scrollIntoView({block:"center"}),Na=setTimeout(()=>{d.protocolBannerHighlight=void 0,m()},2e3)}async function Hi(){if(d.flow?.phase!=="confirm")return;const{title:e,plan:n,mockNote:t}=d.flow;if(t){d.flow={phase:"demo",title:e},m();return}const r=++O;d.flow={phase:"applying",title:e},m();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!==O)return;d.flow={phase:"error",title:e,message:a("panel.main.applyRequestFailed",{p0:J(i)})},m();return}if(r===O){if(s.status===403){const i=await Z(s);if(r!==O)return;d.flow="kind"in n?{phase:"error",title:e,message:`HTTP 403 — ${i}`}:Ir(e,i),m();return}if(!s.ok){const i=await Z(s);if(r!==O)return;d.flow={phase:"error",title:e,message:i},m();return}try{const i=await s.json(),l="kind"in n?xr(i):Ba(i);if(r!==O)return;l.ok?(d.flow={phase:"applied",title:e,...l.backupDir===void 0?{}:{backupDir:l.backupDir}},Ce()):d.flow={phase:"error",title:e,message:l.error}}catch(i){if(r!==O)return;d.flow={phase:"error",title:e,message:J(i)}}m()}}let ge=0;function Bi(){const e=me();e&&(ge+=1,d.share={kind:"config",title:a("panel.main.shareConfigurationSample",{p0:I[e.harness]}),lines:Ks(e),phase:"preview"},m())}function _i(){ge+=1,d.share={kind:"events",title:a("panel.main.shareEventSample"),lines:Ys(q.entries),phase:"preview"},m()}function qt(){ge+=1,d.share=null,m()}function qi(e){d.share?.phase==="preview"&&(d.share={...d.share,lines:Js(d.share.lines,e)},m())}async function Vi(){const e=d.share;if(e?.phase!=="preview"||e.lines.length===0||bt(e.kind,e.lines))return;const n=++ge;d.share={...e,phase:"sending"},m();let t;try{t=await fetch(Vs,{method:"POST",headers:{"content-type":"application/json"},body:ht(e.kind,e.lines)})}catch(r){if(n!==ge)return;d.share={...e,phase:"error",message:a("panel.main.couldNotSend",{p0:J(r)})},m();return}if(n===ge){if(t.ok)d.share={...e,phase:"sent"};else{const r=await Z(t);if(n!==ge)return;d.share={...e,phase:"error",message:r}}m()}}document.addEventListener("change",e=>{const n=e.target;n instanceof HTMLElement&&n.dataset.act==="lang"&&ki(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 b=t.dataset.key;d.expandedText={...d.expandedText,[b]:d.expandedText?.[b]!==!0},m();return}if(Fr({island:B,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.open=!1,m();return}const r=n.closest('[data-act="locate"]');if(r instanceof HTMLElement&&r.dataset.target){vi(r.dataset.target);return}const s=n.closest('[data-act="view"]');if(s instanceof HTMLElement&&s.dataset.view){d.view=s.dataset.view,m();return}const i=n.closest('[data-act="return-target-select"]');if(i instanceof HTMLElement&&i.dataset.bundlePath!==void 0){yi(i.dataset.bundlePath);return}if(n.closest('[data-act="return-settings-dismiss"]')){d.returnSettingsDismissed=!0,m();return}const l=n.closest('[data-act="protocol-user"]');if(l instanceof HTMLElement&&(l.dataset.harness==="cc"||l.dataset.harness==="codex")&&(l.dataset.kind==="protocol_user_install"||l.dataset.kind==="protocol_user_uninstall")){Ui(l.dataset.harness,l.dataset.kind);return}const c=n.closest('[data-act="goto-protocol-banner"]');if(c instanceof HTMLElement&&K.includes(c.dataset.harness)){Di(c.dataset.harness,c.dataset.root);return}const p=n.closest('[data-act="protocol-copy"]');if(p instanceof HTMLElement&&p.dataset.command!==void 0){Rn(p.dataset.command);return}const u=n.closest('[data-act="task-menu"]');if(u instanceof HTMLElement&&u.dataset.key!==void 0){e.stopPropagation();const b=u.dataset.key;d.taskMenuOpen=d.taskMenuOpen===b?null:b,d.taskMenuOpen===null&&(d.taskResumeOpen=null),m();return}if(n.closest('[data-act="task-rename-input"]')){e.stopPropagation();return}const f=n.closest('[data-act="task-accept"]');if(f instanceof HTMLElement&&f.dataset.key!==void 0&&f.dataset.value!==void 0){e.stopPropagation(),pe(f.dataset.key,{accepted:f.dataset.value==="true"});return}if(n.closest('[data-act="project-archived-toggle"]')){d.archivedProjectsOpen=!d.archivedProjectsOpen,m();return}const h=n.closest('[data-act="old-sessions-toggle"]');if(h instanceof HTMLElement&&h.dataset.group!==void 0){const b=h.dataset.group,j=d.oldSessionsOpen??[];d.oldSessionsOpen=j.includes(b)?j.filter(W=>W!==b):[...j,b],qn("wingman.sessions.older.expanded",d.oldSessionsOpen),m();return}const v=n.closest('[data-act="session-archived-toggle"]');if(v instanceof HTMLElement&&v.dataset.root!==void 0){const b=v.dataset.root,j=d.archivedSessionsOpen??[];d.archivedSessionsOpen=j.includes(b)?j.filter(W=>W!==b):[...j,b],m();return}const $=n.closest('[data-act="task-archive"]');if($ instanceof HTMLElement&&$.dataset.key!==void 0){e.stopPropagation(),pe($.dataset.key,{archived:$.dataset.value==="true"});return}const w=n.closest('[data-act="project-archive"]');if(w instanceof HTMLElement&&w.dataset.key!==void 0){e.stopPropagation(),pe(w.dataset.key,{archived:w.dataset.value==="true"});return}const T=n.closest('[data-act="project-move"]');if(T instanceof HTMLElement&&!T.hasAttribute("disabled")&&T.dataset.root!==void 0&&T.dataset.order!==void 0){e.stopPropagation(),pe(`project:${T.dataset.root}`,{order:Number(T.dataset.order)});return}const y=n.closest('[data-act="task-pin"]');if(y instanceof HTMLElement&&y.dataset.key!==void 0&&y.dataset.value!==void 0){e.stopPropagation(),pe(y.dataset.key,{pinned:y.dataset.value==="true"});return}const R=n.closest('[data-act="task-hide"]');if(R instanceof HTMLElement&&R.dataset.key!==void 0&&R.dataset.value!==void 0){e.stopPropagation(),pe(R.dataset.key,{hidden:R.dataset.value==="true"});return}const D=n.closest('[data-act="task-resume"]');if(D instanceof HTMLElement&&D.dataset.key!==void 0){e.stopPropagation();const b=D.dataset.key;Si(b);return}const H=n.closest('[data-act="task-copy"]');if(H instanceof HTMLElement&&H.dataset.command!==void 0){e.stopPropagation(),Rn(H.dataset.command);return}const C=n.closest('[data-act="task-hidden-toggle"]');if(C instanceof HTMLElement&&C.dataset.group!==void 0){e.stopPropagation();const b=d.hiddenOpen??{};d.hiddenOpen={...b,[C.dataset.group]:b[C.dataset.group]!==!0},m();return}const V=n.closest('[data-act="facts-toggle"]');if(V instanceof HTMLElement&&V.dataset.group!==void 0){e.stopPropagation();const b=d.factsOpen??{};d.factsOpen={...b,[V.dataset.group]:b[V.dataset.group]!==!0},m();return}const ee=n.closest('[data-act="task-filter"]');if(ee instanceof HTMLElement&&ee.dataset.value!==void 0){const b=d.taskFilter??oe,j=ee.dataset.value;if(ee.dataset.kind==="harness"&&(j==="all"||K.includes(j))){d.taskFilter={...b,harness:j},m();return}if(ee.dataset.kind==="status"&&ji.includes(j)){d.taskFilter={...b,status:j},m();return}}const Se=n.closest('[data-act="project-expand"], [data-act="project-collapse"]');if(Se instanceof HTMLElement&&Se.dataset.root!==void 0){const b=d.expandedProjects??[],j=Se.dataset.root;Mn(Se.dataset.act==="project-expand"?[...b,j]:b.filter(W=>W!==j)),m();return}if(n.closest('[data-act="projects-toggle"]')){const b=Yn(d.projects?.projects??[],d.taskFilter??oe).filter(W=>!("payloadUnavailable"in W)&&!Y(W)).map(W=>W.root)??[],j=d.expandedProjects??[];Mn(b.every(W=>j.includes(W))?j.filter(W=>!b.includes(W)):[...j,...b]),m();return}const ne=n.closest('[data-act="project-session"]');if(ne instanceof HTMLElement&&K.includes(ne.dataset.harness)&&ne.dataset.session!==void 0){const b=ne.dataset.harness;Be(b),d.sessionSel||(d.sessionSel={}),d.sessionSel[b]=ne.dataset.session,Wn(b,ne.dataset.session),window.scrollTo(0,0),ke(b),m();return}const Ie=n.closest('[data-act="project-node-link"]');if(Ie instanceof HTMLElement&&Ie.dataset.nodeTarget!==void 0){xi(Ie.dataset.nodeTarget);return}const Ge=n.closest('[data-act="project-card-link"]');if(Ge instanceof HTMLElement&&Ge.dataset.root!==void 0){Ii(Ge.dataset.root);return}const A=n.closest('[data-act="notice-dismiss"]');if(A instanceof HTMLElement&&A.dataset.key!==void 0){d.noticeDismissed||(d.noticeDismissed={}),d.noticeDismissed[A.dataset.key]=!0,m();return}if(n.closest('[data-act="project-memory-dismiss"]')){d.projectMemoryDismissed=!0,m();return}const ae=n.closest('[data-act="session"]');if(ae instanceof HTMLElement&&ae.dataset.id!==void 0){const b=me();b&&(d.protocolBannerProjectRoot=void 0,d.sessionSel||(d.sessionSel={}),d.sessionSel[b.harness]=ae.dataset.id,Wn(b.harness,ae.dataset.id),m());return}const Ke=n.closest('[data-act="sugg-plan"]');if(Ke instanceof HTMLElement&&Ke.dataset.item!==void 0){Ea(Ke.dataset.item,Ke.dataset.enable==="1");return}const pn=n.closest('[data-act="sugg-dismiss"]');if(pn instanceof HTMLElement&&pn.dataset.sugg!==void 0){const b=me();if(b){const j=he(d.narratives?.[b.harness]??null,d.projects??null),W=ve(j,d.sessionSel?.[b.harness])??"";d.suggHidden||(d.suggHidden={}),d.suggHidden[`${b.harness}:${W}:${pn.dataset.sugg}`]=!0,m()}return}const un=n.closest('[data-act="todo"]');if(un instanceof HTMLElement&&un.dataset.id!==void 0){Ri(un.dataset.id);return}const Ye=n.closest('[data-act="node"]');if(Ye instanceof HTMLElement&&Ye.dataset.key!==void 0){const b=d.nodeOpen??{};d.nodeOpen={...b,[Ye.dataset.key]:b[Ye.dataset.key]!==!0},m();return}const fn=n.closest('[data-act="workflow-fold"]');if(fn instanceof HTMLElement&&fn.dataset.key!==void 0){e.preventDefault(),xa(fn.dataset.key);return}if(n.closest('[data-act="evidence"]')){e.preventDefault();const b=me();if(b){const j=ve(he(d.narratives?.[b.harness]??null,d.projects??null),d.sessionSel?.[b.harness]);j!==null&&xa(`${b.harness}:${j}:evidence`)}return}if(n.closest('[data-act="raw"]')){d.rawOpen=!d.rawOpen,m();return}if(n.closest('[data-act="island-reveal"]')){la=++ci,de();return}if(n.closest('[data-act="toggle"]')){if(fe)return;const b=!d.open;d.open=b,B&&b&&Ce(),m();return}if(n.closest('[data-act="demo"]')){Fi();return}if(n.closest('[data-act="lic-open"]')){d.licenseOpen=!0,d.licenseRefreshResult=null,m();return}if(n.closest('[data-act="lic-refresh"]')){$i();return}if(n.closest('[data-act="lic-close"]')){d.licenseOpen=!1,d.licenseRefreshResult=null,m();return}if(n.closest('[data-act="lic-import"]')){wi();return}if(n.closest('[data-act="import-close"]')){d.importResult=null,m();return}if(n.closest('[data-act="share-config"]')){Bi();return}if(n.closest('[data-act="share-events"]')){_i();return}const gn=n.closest('[data-act="share-del"]');if(gn instanceof HTMLElement&&gn.dataset.i!==void 0){qi(Number(gn.dataset.i));return}if(n.closest('[data-act="share-send"]')){Vi();return}if(n.closest('[data-act="share-close"]')){qt();return}const Re=n.closest('[data-act="tgl"]');if(Re instanceof HTMLElement&&Re.dataset.id){const b=Re.dataset.value;if(b!==void 0&&b!=="accept"&&b!=="hold"&&b!=="refuse")return;Ea(Re.dataset.id,Re.dataset.enable==="0"?!1:void 0,b);return}if(n.closest('[data-act="plan-confirm"]')){Hi();return}if(n.closest('[data-act="plan-cancel"]')){_t();return}const ce=n.closest("[data-tab]");if(ce instanceof HTMLElement&&ce.dataset.tab){const b=ce.dataset.tab==="projects"&&d.active!=="projects";Be(ce.dataset.tab),ce.dataset.tab==="projects"?b||xe():K.includes(ce.dataset.tab)&&ke(ce.dataset.tab),m()}});document.addEventListener("keydown",e=>{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(),pe(n.dataset.key,{title:t.value});return}if(e.key==="Escape"){e.preventDefault(),e.stopPropagation(),d.taskMenuOpen=null,d.taskResumeOpen=null,m();return}}if(e.key==="Escape"){if(d.share){qt();return}if(d.importResult){d.importResult=null,m();return}if(d.licenseOpen){d.licenseOpen=!1,m();return}if(d.flow){d.flow.phase!=="applying"&&_t();return}B&&d.open&&(d.open=!1,m())}});const z=document.createElement("div");z.id="tip";document.body.appendChild(z);document.addEventListener("mousemove",e=>{const t=e.target?.closest("[data-tip]");if(!(t instanceof HTMLElement)||!t.dataset.tip){z.style.display="none";return}z.textContent=t.dataset.tip,z.style.display="block";const r=z.offsetWidth;let s=e.clientX+14;s+r>window.innerWidth-8&&(s=e.clientX-r-14),z.style.left=`${s}px`,z.style.top=`${e.clientY+14}px`});document.addEventListener("mousedown",()=>{z.style.display="none"});window.addEventListener("blur",()=>{z.style.display="none"});let Oa="";setInterval(()=>{const e=d.configs.find(r=>r.harness===d.active)??d.configs[0];if(!e||q.entries.length===0)return;const n=et(q.entries,e.harness,e.capabilities.live,Date.now()),t=`${n.active}:${n.label}`;t!==Oa&&(Oa=t,m())},1e3);setInterval(()=>{document.visibilityState==="visible"&&Ce()},6e4);document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&(d.anatomyLoadedAt===null||d.anatomyLoadedAt===void 0||Date.now()-Date.parse(d.anatomyLoadedAt)>6e4)&&Ce()});jr(()=>d.narratives?.[me()?.harness??"cc"]??null,m,()=>{const e=me();e&&ke(e.harness)});Ce().then(()=>{Wt(),xe(),ua();for(const e of K)ke(e);Ni(),Pi()});document.addEventListener("toggle",da,!0);window.addEventListener("resize",()=>{da(),B&&de()});