harness-wingman 0.9.0 → 0.9.2

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.
@@ -615,6 +615,13 @@ var init_render = __esm({
615
615
  "packages/i18n/dist/catalog/en/render.js"() {
616
616
  "use strict";
617
617
  render_default = {
618
+ "panel.render.olderSessions": "{count} older sessions",
619
+ "panel.render.olderSessionsSource": "Source: sessions.ended and lastActivity more than {days} days ago; display only",
620
+ "panel.render.archiveSession": "Archive",
621
+ "panel.render.restoreSession": "Restore",
622
+ "panel.render.archivedSessions": "Archived sessions ({count})",
623
+ "panel.render.sessionArchiveSource": "Source: local task-overlay.json session / project archived; harness data is retained",
624
+ "panel.render.sessionArchiveActivitySource": "Source: session event timestamp > session or project archivedAt",
618
625
  "panel.render.ccEnabled": "Enabled",
619
626
  "panel.render.ccPartial": "Partly restricted",
620
627
  "panel.render.ccDisableAll": "Disable all",
@@ -650,15 +657,27 @@ var init_render = __esm({
650
657
  "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",
651
658
  "panel.render.skillOverridesSource": "Source: settings skillOverrides; disabled in configuration",
652
659
  "panel.render.skillConfiguration": "Configuration",
660
+ "panel.render.plugins": "Plugins",
661
+ "panel.render.pluginConfigurationTip": "Configuration enablement does not prove session use; usage comes from the Codex transcript",
662
+ "panel.render.pluginsSummary": "{enabled} plugins enabled \xB7 {used} used this session",
663
+ "panel.render.pluginsUnobserved": "{enabled} plugins enabled \xB7 No plugin calls observed this session",
664
+ "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",
653
665
  "panel.render.skillConfigurationTip": "Whether this session actually loaded a skill is determined by the transcript",
666
+ "panel.render.ccSkillsSummary": "{enabled} skills enabled \xB7 {used} used this session",
667
+ "panel.render.ccSkillsUnobserved": "{enabled} skills enabled \xB7 No skill calls observed this session",
668
+ "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",
669
+ "panel.render.ccToolsSummary": "{enabled} MCP servers enabled \xB7 {used} used this session",
670
+ "panel.render.ccToolsUnobserved": "{enabled} MCP servers enabled \xB7 No MCP calls observed this session",
671
+ "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",
654
672
  "panel.render.skillsUsed": "Used this session: {skills}",
655
673
  "panel.render.skillsUsedSource": "Source: observed Skill tool calls / skill command triggers in the transcript",
656
674
  "panel.render.projectMenu": "Project menu",
657
675
  "panel.render.archiveProject": "Archive",
658
676
  "panel.render.restoreProject": "Restore",
659
677
  "panel.render.archivedProjects": "{count} archived projects",
660
- "panel.render.hiddenProjects": "{count} hidden projects",
661
- "panel.render.projectArchiveSource": "Source: local task-overlay.json archived / archivedAt; new activity restores the project",
678
+ "panel.render.projectArchiveNewActivity": "New activity",
679
+ "panel.render.projectArchiveActivitySource": "Source: firstScreen.lastActivity.at > user.archivedAt",
680
+ "panel.render.projectArchiveSource": "Source: local task-overlay.json archived / archivedAt; hidden in all tabs until you restore it, even after new activity",
662
681
  "panel.render.moveProjectUp": "Move pinned project up",
663
682
  "panel.render.moveProjectDown": "Move pinned project down",
664
683
  "panel.render.projectPinSource": "Source: local task-overlay.json pinned / order",
@@ -670,7 +689,11 @@ var init_render = __esm({
670
689
  "panel.render.waitTrace": "{label}: {message}{outcome}",
671
690
  "panel.render.sessionIdentifier": "Session: {id}",
672
691
  "panel.render.operationOnHost": "\xB7 {verb} will happen on this machine",
673
- "panel.render.protocolFileOperation": "File for protocol {verb} \u2014 no bytes change before confirmation",
692
+ "panel.render.protocolFileOperation": "File for protocol {verb}",
693
+ "panel.render.protocolImpactLabel": "Effect on harness and projects",
694
+ "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.",
695
+ "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.",
696
+ "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.",
674
697
  "panel.render.deleteLineNumber": "Delete line {line}",
675
698
  "panel.render.close": "Close",
676
699
  "panel.render.language": "Language",
@@ -740,7 +763,7 @@ var init_render = __esm({
740
763
  "panel.render.confirmWrite": "Confirm write",
741
764
  "panel.render.thePlanContainsNoFileChanges": "The plan contains no file changes",
742
765
  "panel.render.noOtherReferencesFoundInThe": "No other references found in the scanned content",
743
- "panel.render.filesToWriteNoBytesChange": "Files to write \u2014 no bytes change before confirmation",
766
+ "panel.render.filesToWriteNoBytesChange": "Files to write",
744
767
  "panel.render.references": "References",
745
768
  "panel.render.matchesThesePlacesMentionItReported": "matches \u2014 these places mention it; reported without edits",
746
769
  "panel.render.backup": "Backup",
@@ -1005,7 +1028,7 @@ var init_render = __esm({
1005
1028
  "panel.render.dshHasNoUserLevelInstructionFile": "dsh has no user-level instruction file; install the project-level protocol per project",
1006
1029
  "panel.render.replaceLtProjectGtWithThe": "; replace &lt;project&gt; with the project path before running",
1007
1030
  "panel.render.copyProjectInstallCommand": "Copy project install command",
1008
- "panel.render.backsUpBeforeUpdatingPreservesContent": "Backs up before updating, preserves content outside the block, and takes effect in the next new session.",
1031
+ "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.",
1009
1032
  "panel.render.theProtocolBlockHasBeenModified": "The protocol block has been modified. Existing content is preserved; resolve the changes before reinstalling.",
1010
1033
  "panel.render.afterConfirmationInstallsInTheUser": "The plan only gives Wingman something to display. It never rewrites harness behavior or any code.",
1011
1034
  "panel.render.reinstall": "Reinstall",
@@ -1076,7 +1099,6 @@ var init_render = __esm({
1076
1099
  "panel.render.noPlanFile": "No plan file",
1077
1100
  "panel.render.planUnreadable": "Plan unreadable",
1078
1101
  "panel.render.cannotDetermineWhetherYouAreNeeded": "Cannot determine whether you are needed",
1079
- "panel.render.aCurrentPointAndAnOngoing": "A current point and an ongoing session have not both been observed",
1080
1102
  "panel.render.copyInstallCommandTip": "{p0} \xB7 Copy install command",
1081
1103
  "panel.render.howToProvideAPlan": "How to provide a plan",
1082
1104
  "panel.render.createAtTheProjectRoot": "Create at the project root: ",
@@ -1087,7 +1109,9 @@ var init_render = __esm({
1087
1109
  "panel.render.pendingTask": "- [ ] Pending task",
1088
1110
  "panel.render.connectFeedbackSignals": "Connect feedback signals \xB7",
1089
1111
  "panel.render.notEnoughInformation": "Not enough information: ",
1090
- "panel.render.actionNotEnoughInformation": "Not enough information",
1112
+ "panel.render.cannotReadPlanFile": "Cannot read plan file",
1113
+ "panel.render.cannotSeeRequests": "Requests not observable",
1114
+ "panel.render.projectEnded": "Ended",
1091
1115
  "panel.render.sourceGETApiProjectsRequestOr": "Source: GET /api/projects request or payload validation failed",
1092
1116
  "panel.render.projectRefreshFailedShowingThePrevious": "Project refresh failed. Showing the previous response; action status may have changed",
1093
1117
  "panel.render.noProjectGoalProvided": "No project goal provided",
@@ -1104,6 +1128,11 @@ var init_render = __esm({
1104
1128
  "panel.render.feedbackSignalsAreNotConnectedOr": "Feedback signals are not connected or unavailable; cannot determine whether you are needed",
1105
1129
  "panel.render.viewPlanProtocol": "\xB7 View plan protocol",
1106
1130
  "panel.render.currentBranch": "Current branch",
1131
+ "panel.render.moreBranches": "{count} more branches",
1132
+ "panel.render.oneMoreBranch": "{count} more branch",
1133
+ "panel.render.branchCurrentPoints": "{count} current points",
1134
+ "panel.render.branchCurrentPoint": "{count} current point",
1135
+ "panel.render.branchCurrentPointsSource": "Source: currentPoints within this top-level node subtree",
1107
1136
  "panel.render.noCurrentBranchProvided": "No current branch provided",
1108
1137
  "panel.render.currentTaskLabel": "Current task",
1109
1138
  "panel.render.sourceFirstScreenCurrentPointsLength": "Source: firstScreen.currentPoints.length",
@@ -1183,7 +1212,7 @@ var init_server = __esm({
1183
1212
  "cli.server.openTimeout": "App activation timed out",
1184
1213
  "cli.server.openFailed": "App activation failed",
1185
1214
  "cli.server.fixturesOverlay": "Fixtures mode is read-only: task card overlays are not written",
1186
- "cli.server.overlayShape": "Session requests require a valid harness, a nonempty sessionId and a title/pinned/hidden/accepted patch; project requests require a nonempty root and a pinned/order/hidden/archived patch, with a nonnegative integer order",
1215
+ "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",
1187
1216
  "cli.server.overlayHome": "Task card overlays require homeDir",
1188
1217
  "cli.server.licenseRead": "The license file exceeds the 64KB limit or could not be read",
1189
1218
  "cli.server.panelBuild": "The panel has not been built: run pnpm --filter @wingman/panel build, then refresh this page.",
@@ -1628,7 +1657,7 @@ var init_panel2 = __esm({
1628
1657
  "packages/i18n/dist/catalog/zh/panel.js"() {
1629
1658
  "use strict";
1630
1659
  panel_default2 = {
1631
- "island.waitingForYou": "{p0} \u5728\u7B49\u4F60:{p1}",
1660
+ "island.waitingForYou": "{p0} \u5728\u7B49\u5F85:{p1}",
1632
1661
  "panel.main.backToSessionSettingsResponseUnavailable": "\u56DE\u8DF3\u8BBE\u7F6E\u54CD\u5E94\u4E0D\u53EF\u7528",
1633
1662
  "panel.main.couldNotSaveBackToSession": "\u56DE\u8DF3\u8BBE\u7F6E\u4FDD\u5B58\u5931\u8D25",
1634
1663
  "panel.main.couldNotLoadBackToSession": "\u56DE\u8DF3\u8BBE\u7F6E\u8BFB\u53D6\u5931\u8D25",
@@ -1748,7 +1777,7 @@ var init_panel2 = __esm({
1748
1777
  "panel.live.liveConnectionEstablished": "\u5B9E\u51B5\u5DF2\u8FDE\u63A5",
1749
1778
  "panel.live.disconnectedReconnectingAutomatically": "\u8FDE\u63A5\u65AD\u5F00 \xB7 \u81EA\u52A8\u91CD\u8FDE\u4E2D",
1750
1779
  "panel.live.connecting": "\u8FDE\u63A5\u4E2D\u2026",
1751
- "panel.taskboard.waitingForYou": "\u7B49\u4F60",
1780
+ "panel.taskboard.waitingForYou": "\u7B49\u5F85",
1752
1781
  "panel.taskboard.ended": "\u5DF2\u7ED3\u675F",
1753
1782
  "panel.taskboard.inProgress": "\u8FDB\u884C\u4E2D",
1754
1783
  "panel.taskboard.dshHasNoObservedCommandTo": "dsh \u672A\u63D0\u4F9B\u6309\u4F1A\u8BDD\u6062\u590D\u7684\u547D\u4EE4(\u672A\u89C2\u5BDF\u5230),\u8BF7\u5728\u539F\u7EC8\u7AEF\u7EE7\u7EED",
@@ -1782,7 +1811,7 @@ var init_panel_narrative2 = __esm({
1782
1811
  "panel.narrative.subagent": "\u5B50 agent",
1783
1812
  "panel.narrative.mainAgent": "\u4E3B agent",
1784
1813
  "panel.narrative.openRequest": "\u6709\u5F85\u5904\u7406\u8BF7\u6C42",
1785
- "panel.narrative.waitingForYou": "\u7B49\u4F60",
1814
+ "panel.narrative.waitingForYou": "\u7B49\u5F85",
1786
1815
  "panel.narrative.inProgress": "\u8FDB\u884C\u4E2D",
1787
1816
  "panel.narrative.notWired": "\u672A\u63A5\u7EBF",
1788
1817
  "panel.narrative.waitingEvents": "\u7B49\u5F85\u4E8B\u4EF6",
@@ -1791,7 +1820,7 @@ var init_panel_narrative2 = __esm({
1791
1820
  "panel.narrative.invalidProjectProtocol": "harness {harness} \u7684 planProtocol.project \u65E0\u6548",
1792
1821
  "panel.narrative.unavailableProject": "\u4E0D\u53EF\u7528\u9879\u76EE {number}",
1793
1822
  "panel.narrative.waitOverdue": " \xB7 \u5DF2\u7B49 {minutes}m+",
1794
- "panel.narrative.waitLabel": "\u7B49\u4F60{who}:{message}{overdue}",
1823
+ "panel.narrative.waitLabel": "\u7B49\u5F85{who}:{message}{overdue}",
1795
1824
  "panel.narrative.event.SessionStart": "\u4F1A\u8BDD\u5F00\u59CB",
1796
1825
  "panel.narrative.event.SessionEnd": "\u4F1A\u8BDD\u7ED3\u675F",
1797
1826
  "panel.narrative.event.UserPromptSubmit": "\u6536\u5230\u65B0\u63D0\u793A",
@@ -1814,6 +1843,13 @@ var init_render2 = __esm({
1814
1843
  "packages/i18n/dist/catalog/zh/render.js"() {
1815
1844
  "use strict";
1816
1845
  render_default2 = {
1846
+ "panel.render.olderSessions": "\u66F4\u65E9\u7684 {count} \u4E2A\u4F1A\u8BDD",
1847
+ "panel.render.olderSessionsSource": "\u6765\u6E90:sessions.ended \u4E14 lastActivity \u65E9\u4E8E\u5F53\u524D\u65F6\u95F4 {days} \u5929;\u4EC5\u6298\u53E0\u663E\u793A",
1848
+ "panel.render.archiveSession": "\u5F52\u6863",
1849
+ "panel.render.restoreSession": "\u6062\u590D",
1850
+ "panel.render.archivedSessions": "\u5DF2\u5F52\u6863 {count} \u4E2A\u4F1A\u8BDD",
1851
+ "panel.render.sessionArchiveSource": "\u6765\u6E90:\u672C\u673A task-overlay.json \u4F1A\u8BDD / \u9879\u76EE archived;\u4E0D\u5220\u9664 harness \u6570\u636E",
1852
+ "panel.render.sessionArchiveActivitySource": "\u6765\u6E90:\u4F1A\u8BDD\u4E8B\u4EF6\u65F6\u95F4 > \u4F1A\u8BDD\u6216\u9879\u76EE archivedAt",
1817
1853
  "panel.render.ccEnabled": "\u5DF2\u5F00\u542F",
1818
1854
  "panel.render.ccPartial": "\u90E8\u5206\u53D7\u9650",
1819
1855
  "panel.render.ccDisableAll": "\u5168\u90E8\u5173\u95ED",
@@ -1849,15 +1885,27 @@ var init_render2 = __esm({
1849
1885
  "panel.render.skillFrontmatterSource": "\u6765\u6E90:SKILL.md frontmatter disable-model-invocation / user-invocable;\u8C03\u7528\u6A21\u5F0F\u7531 SKILL.md \u51B3\u5B9A\uFF0C\u5F00\u5173\u53EA\u63A7\u5236\u914D\u7F6E\u542F\u7528\u72B6\u6001",
1850
1886
  "panel.render.skillOverridesSource": "\u6765\u6E90:settings skillOverrides;\u914D\u7F6E\u5DF2\u7981\u7528",
1851
1887
  "panel.render.skillConfiguration": "\u914D\u7F6E\u7EA7",
1888
+ "panel.render.plugins": "\u63D2\u4EF6",
1889
+ "panel.render.pluginConfigurationTip": "\u914D\u7F6E\u542F\u7528\u4E0D\u4EE3\u8868\u672C\u4F1A\u8BDD\u8C03\u7528\uFF1B\u4F1A\u8BDD\u4F7F\u7528\u4EE5 Codex transcript \u4E3A\u51C6",
1890
+ "panel.render.pluginsSummary": "{enabled} \u4E2A\u63D2\u4EF6\u5DF2\u542F\u7528 \xB7 \u672C\u4F1A\u8BDD\u7528\u5230 {used} \u4E2A",
1891
+ "panel.render.pluginsUnobserved": "{enabled} \u4E2A\u63D2\u4EF6\u5DF2\u542F\u7528 \xB7 \u672C\u4F1A\u8BDD\u672A\u89C2\u5BDF\u5230\u63D2\u4EF6\u8C03\u7528",
1892
+ "panel.render.pluginsSummarySource": "\u6765\u6E90:config.toml \u63D2\u4EF6\u914D\u7F6E\u626B\u63CF slots.skills[].enabled \u7684\u542F\u7528\u6761\u76EE\u6570\uFF1B\u672C\u4F1A\u8BDD\u7528\u5230\u6570\u6765\u81EA\u6309\u914D\u7F6E\u63D2\u4EF6\u540D\u5339\u914D Codex transcript \u91CC\u7684 MCP \u5DE5\u5177\u8C03\u7528\uFF08\u5C11\u91CF\u522B\u540D\uFF09\u540E\u53BB\u91CD\u7684 pluginsUsed\uFF0C\u914D\u7F6E\u542F\u7528\u4E0D\u7B49\u4E8E\u4F1A\u8BDD\u4F7F\u7528",
1852
1893
  "panel.render.skillConfigurationTip": "\u672C\u4F1A\u8BDD\u662F\u5426\u771F\u7684\u52A0\u8F7D\u4EE5 transcript \u4E3A\u51C6",
1894
+ "panel.render.ccSkillsSummary": "{enabled} \u4E2A\u6280\u80FD\u5DF2\u542F\u7528 \xB7 \u672C\u4F1A\u8BDD\u7528\u5230 {used} \u4E2A",
1895
+ "panel.render.ccSkillsUnobserved": "{enabled} \u4E2A\u6280\u80FD\u5DF2\u542F\u7528 \xB7 \u672C\u4F1A\u8BDD\u672A\u89C2\u5BDF\u5230\u6280\u80FD\u8C03\u7528",
1896
+ "panel.render.ccSkillsSummarySource": "\u6765\u6E90:\u914D\u7F6E\u626B\u63CF slots.skills[].enabled \u4E0E invocation\uFF08SKILL.md frontmatter\uFF09\u7684\u975E\u5173\u95ED\u6761\u76EE\u6570\uFF1B\u672C\u4F1A\u8BDD\u7528\u5230\u6570\u6765\u81EA Claude Code transcript \u4E2D Skill \u5DE5\u5177\u8C03\u7528\u6216\u660E\u786E\u6280\u80FD\u547D\u4EE4\u52A0\u8F7D\u8BB0\u5F55\uFF0C\u53BB\u91CD\u540E\u4E3A skillsUsed\uFF0C\u914D\u7F6E\u542F\u7528\u4E0D\u7B49\u4E8E\u4F1A\u8BDD\u4F7F\u7528",
1897
+ "panel.render.ccToolsSummary": "{enabled} \u4E2A MCP \u670D\u52A1\u5DF2\u542F\u7528 \xB7 \u672C\u4F1A\u8BDD\u7528\u5230 {used} \u4E2A",
1898
+ "panel.render.ccToolsUnobserved": "{enabled} \u4E2A MCP \u670D\u52A1\u5DF2\u542F\u7528 \xB7 \u672C\u4F1A\u8BDD\u672A\u89C2\u5BDF\u5230 MCP \u8C03\u7528",
1899
+ "panel.render.ccToolsSummarySource": "\u6765\u6E90:\u914D\u7F6E\u626B\u63CF slots.tools[] \u4E2D mcpServers.* \u6761\u76EE\u7684 enabled \u542F\u7528\u6570\uFF1B\u672C\u4F1A\u8BDD\u7528\u5230\u6570\u6765\u81EA Claude Code transcript \u4E2D mcp__<server>__<tool> \u8C03\u7528\u4E0E\u914D\u7F6E\u670D\u52A1\u540D\u5339\u914D\uFF08- / _ \u7B49\u4EF7\uFF09\uFF0C\u53BB\u91CD\u540E\u4E3A mcpUsed\uFF0C\u914D\u7F6E\u542F\u7528\u4E0D\u7B49\u4E8E\u4F1A\u8BDD\u4F7F\u7528",
1853
1900
  "panel.render.skillsUsed": "\u672C\u4F1A\u8BDD\u5DF2\u7528:{skills}",
1854
1901
  "panel.render.skillsUsedSource": "\u6765\u6E90:transcript \u4E2D\u89C2\u5BDF\u5230\u7684 Skill \u5DE5\u5177\u8C03\u7528 / \u6280\u80FD\u547D\u4EE4\u89E6\u53D1\u8BB0\u5F55",
1855
1902
  "panel.render.projectMenu": "\u9879\u76EE\u83DC\u5355",
1856
1903
  "panel.render.archiveProject": "\u5F52\u6863",
1857
1904
  "panel.render.restoreProject": "\u6062\u590D",
1858
1905
  "panel.render.archivedProjects": "\u5DF2\u5F52\u6863 {count} \u4E2A",
1859
- "panel.render.hiddenProjects": "\u5DF2\u9690\u85CF {count} \u4E2A\u9879\u76EE",
1860
- "panel.render.projectArchiveSource": "\u6765\u6E90:\u672C\u673A task-overlay.json archived / archivedAt;\u6709\u65B0\u6D3B\u52A8\u81EA\u52A8\u6062\u590D",
1906
+ "panel.render.projectArchiveNewActivity": "\u6709\u65B0\u6D3B\u52A8",
1907
+ "panel.render.projectArchiveActivitySource": "\u6765\u6E90:firstScreen.lastActivity.at > user.archivedAt",
1908
+ "panel.render.projectArchiveSource": "\u6765\u6E90:\u672C\u673A task-overlay.json archived / archivedAt;\u5728\u6240\u6709 tab \u90FD\u4E0D\u663E\u793A\uFF0C\u6709\u65B0\u6D3B\u52A8\u4E5F\u9700\u624B\u52A8\u6062\u590D",
1861
1909
  "panel.render.moveProjectUp": "\u4E0A\u79FB\u7F6E\u9876\u9879\u76EE",
1862
1910
  "panel.render.moveProjectDown": "\u4E0B\u79FB\u7F6E\u9876\u9879\u76EE",
1863
1911
  "panel.render.projectPinSource": "\u6765\u6E90:\u672C\u673A task-overlay.json pinned / order",
@@ -1869,7 +1917,11 @@ var init_render2 = __esm({
1869
1917
  "panel.render.waitTrace": "{label}:{message}{outcome}",
1870
1918
  "panel.render.sessionIdentifier": "session:{id}",
1871
1919
  "panel.render.operationOnHost": "\xB7 \u672C\u6B21{verb}\u53D1\u751F\u5728\u8FD9\u53F0\u673A\u5668",
1872
- "panel.render.protocolFileOperation": "\u5C06{verb}\u534F\u8BAE\u7684\u6587\u4EF6 \u2014 \u786E\u8BA4\u524D\u4E00\u4E2A\u5B57\u8282\u90FD\u4E0D\u52A8",
1920
+ "panel.render.protocolFileOperation": "\u5C06{verb}\u534F\u8BAE\u7684\u6587\u4EF6",
1921
+ "panel.render.protocolImpactLabel": "\u5BF9 harness \u4E0E\u9879\u76EE\u7684\u5F71\u54CD",
1922
+ "panel.render.protocolImpactInstall": "\u53EA\u5728\u8FD9\u4E2A\u6587\u4EF6\u91CC\u52A0\u4E00\u4E2A\u53D7\u7BA1\u5757,\u8BA9 agent \u628A\u8FDB\u5EA6\u5199\u6210\u8BA1\u5212\u6587\u4EF6;\u4E0D\u6539\u5199 harness \u884C\u4E3A,\u4E0D\u6539\u4EFB\u4F55\u9879\u76EE\u4EE3\u7801\u3002",
1923
+ "panel.render.protocolImpactUpdate": "\u53EA\u628A\u8FD9\u4E2A\u6587\u4EF6\u91CC\u7684\u53D7\u7BA1\u5757\u66F4\u65B0\u5230\u65B0\u7248,\u8BA9 agent \u628A\u8FDB\u5EA6\u5199\u6210\u8BA1\u5212\u6587\u4EF6;\u4E0D\u6539\u5199 harness \u884C\u4E3A,\u4E0D\u6539\u4EFB\u4F55\u9879\u76EE\u4EE3\u7801\u3002",
1924
+ "panel.render.protocolImpactUninstall": "\u53EA\u79FB\u9664\u8FD9\u4E2A\u6587\u4EF6\u91CC\u7684\u53D7\u7BA1\u5757,\u5176\u4F59\u5185\u5BB9\u539F\u6837\u4FDD\u7559;\u4E0D\u6539\u5199 harness \u884C\u4E3A,\u4E0D\u6539\u4EFB\u4F55\u9879\u76EE\u4EE3\u7801\u3002",
1873
1925
  "panel.render.deleteLineNumber": "\u5220\u9664\u7B2C {line} \u884C",
1874
1926
  "panel.render.close": "\u5173\u95ED",
1875
1927
  "panel.render.language": "\u8BED\u8A00",
@@ -1939,7 +1991,7 @@ var init_render2 = __esm({
1939
1991
  "panel.render.confirmWrite": "\u786E\u8BA4\u5199\u5165",
1940
1992
  "panel.render.thePlanContainsNoFileChanges": "plan \u672A\u5305\u542B\u4EFB\u4F55\u6587\u4EF6\u53D8\u66F4",
1941
1993
  "panel.render.noOtherReferencesFoundInThe": "\u5F15\u7528\u8BED\u6599\u91CC\u6CA1\u6709\u522B\u5904\u63D0\u5230\u5B83",
1942
- "panel.render.filesToWriteNoBytesChange": "\u5C06\u5199\u5165\u7684\u6587\u4EF6 \u2014 \u786E\u8BA4\u524D\u4E00\u4E2A\u5B57\u8282\u90FD\u4E0D\u52A8",
1994
+ "panel.render.filesToWriteNoBytesChange": "\u5C06\u5199\u5165\u7684\u6587\u4EF6",
1943
1995
  "panel.render.references": "\u5F15\u7528\u547D\u4E2D",
1944
1996
  "panel.render.matchesThesePlacesMentionItReported": "\u5904 \u2014 \u8FD9\u4E9B\u5730\u65B9\u63D0\u5230\u4E86\u5B83;\u53EA\u63D0\u9192,\u4E0D\u4FEE\u590D",
1945
1997
  "panel.render.backup": "\u5907\u4EFD",
@@ -2015,7 +2067,7 @@ var init_render2 = __esm({
2015
2067
  "panel.render.notObserved": "(\u672A\u89C2\u5BDF\u5230)",
2016
2068
  "panel.render.endedSessionEndOrNoEventsFor": "\u5DF2\u7ED3\u675F(SessionEnd,\u6216 Stop \u540E 10 \u5206\u949F\u65E0\u4E8B\u4EF6)",
2017
2069
  "panel.render.inProgress": "\u8FDB\u884C\u4E2D",
2018
- "panel.render.waitingForYouAnOpenPermission": "\u7B49\u4F60:\u6709\u672A\u51B3\u7684\u6743\u9650\u8BF7\u6C42/\u901A\u77E5",
2070
+ "panel.render.waitingForYouAnOpenPermission": "\u7B49\u5F85:\u6709\u672A\u51B3\u7684\u6743\u9650\u8BF7\u6C42/\u901A\u77E5",
2019
2071
  "panel.render.newActivitySinceLastViewed": "\u6709\u65B0\u6D3B\u52A8(\u4E0A\u6B21\u67E5\u770B\u540E)",
2020
2072
  "panel.render.newActivity": "\u65B0\u6D3B\u52A8",
2021
2073
  "panel.render.sinceWingmanStarted": "Wingman \u542F\u52A8(",
@@ -2033,7 +2085,7 @@ var init_render2 = __esm({
2033
2085
  "panel.render.firstInProgressTodoSourceTaskCreate": "\u7B2C\u4E00\u6761\u8FDB\u884C\u4E2D todo(\u6765\u6E90:transcript \u7684 TaskCreate/TaskUpdate \u4E8B\u4EF6)",
2034
2086
  "panel.render.latestUserPromptSummaryNoIn": "\u6700\u65B0\u7528\u6237\u63D0\u793A\u6458\u8981(\u672C\u4F1A\u8BDD\u6682\u65E0\u8FDB\u884C\u4E2D todo)",
2035
2087
  "panel.render.openEventAt": "\u672A\u51B3 {p0} \u4E8B\u4EF6,\u53D1\u751F\u4E8E {p1}",
2036
- "panel.render.waitingForYou": "\u7B49\u4F60:",
2088
+ "panel.render.waitingForYou": "\u7B49\u5F85:",
2037
2089
  "panel.render.totalTokensThisTurnReportedBy": "\u672C\u8F6E\u603B token(harness \u81EA\u62A5) = {p0}",
2038
2090
  "panel.render.contextThisTurnReportedByHarness": "\u672C\u8F6E context(harness \u81EA\u62A5) = {p0}",
2039
2091
  "panel.render.cumulativeInputThisTurnDifferenceIn": "\u672C\u8F6E\u7D2F\u8BA1 input(harness \u7D2F\u8BA1\u503C\u5DEE\u5206) = {p0}",
@@ -2204,7 +2256,7 @@ var init_render2 = __esm({
2204
2256
  "panel.render.dshHasNoUserLevelInstructionFile": "dsh \u6CA1\u6709\u7528\u6237\u7EA7\u6307\u4EE4\u6587\u4EF6\uFF0C\u8BF7\u6309\u9879\u76EE\u5B89\u88C5\u9879\u76EE\u7EA7\u534F\u8BAE",
2205
2257
  "panel.render.replaceLtProjectGtWithThe": "\uFF0C\u8FD0\u884C\u524D\u5C06 &lt;\u9879\u76EE&gt; \u66FF\u6362\u4E3A\u9879\u76EE\u8DEF\u5F84",
2206
2258
  "panel.render.copyProjectInstallCommand": "\u590D\u5236\u9879\u76EE\u7EA7\u5B89\u88C5\u547D\u4EE4",
2207
- "panel.render.backsUpBeforeUpdatingPreservesContent": "\u66F4\u65B0\u524D\u5148\u5907\u4EFD\uFF0C\u4FDD\u7559\u5757\u5916\u5185\u5BB9\uFF0C\u4E0B\u4E00\u4E2A\u65B0\u4F1A\u8BDD\u751F\u6548\u3002",
2259
+ "panel.render.backsUpBeforeUpdatingPreservesContent": "\u8BA1\u5212\u53EA\u4E3A Wingman \u63D0\u4F9B\u8BA1\u5212\u5C55\u793A\u529F\u80FD,\u4E0D\u6539\u5199 harness \u884C\u4E3A\u6216\u4EFB\u4F55\u4EE3\u7801\u3002\u66F4\u65B0\u524D\u5148\u5907\u4EFD,\u4E0B\u4E00\u4E2A\u65B0\u4F1A\u8BDD\u751F\u6548\u3002",
2208
2260
  "panel.render.theProtocolBlockHasBeenModified": "\u534F\u8BAE\u5757\u5DF2\u88AB\u4FEE\u6539\uFF1B\u4FDD\u7559\u73B0\u6709\u5185\u5BB9\uFF0C\u8BF7\u5148\u5904\u7406\u4FEE\u6539\u540E\u518D\u91CD\u65B0\u5B89\u88C5\u3002",
2209
2261
  "panel.render.afterConfirmationInstallsInTheUser": "\u8BA1\u5212\u53EA\u4E3A Wingman \u63D0\u4F9B\u8BA1\u5212\u5C55\u793A\u529F\u80FD,\u4E0D\u6539\u5199 harness \u884C\u4E3A\u6216\u4EFB\u4F55\u4EE3\u7801\u3002",
2210
2262
  "panel.render.reinstall": "\u91CD\u65B0\u5B89\u88C5",
@@ -2275,7 +2327,6 @@ var init_render2 = __esm({
2275
2327
  "panel.render.noPlanFile": "\u6CA1\u6709\u8BA1\u5212\u6587\u4EF6",
2276
2328
  "panel.render.planUnreadable": "\u8BA1\u5212\u4E0D\u53EF\u8BFB",
2277
2329
  "panel.render.cannotDetermineWhetherYouAreNeeded": "\u65E0\u6CD5\u786E\u8BA4\u662F\u5426\u9700\u8981\u4F60",
2278
- "panel.render.aCurrentPointAndAnOngoing": "\u5C1A\u672A\u540C\u65F6\u89C2\u5BDF\u5230\u8BA1\u5212\u5F53\u524D\u70B9\u4E0E\u672A\u7ED3\u675F\u4F1A\u8BDD",
2279
2330
  "panel.render.copyInstallCommandTip": "{p0} \xB7 \u590D\u5236\u5B89\u88C5\u547D\u4EE4",
2280
2331
  "panel.render.howToProvideAPlan": "\u5982\u4F55\u63D0\u4F9B\u8BA1\u5212",
2281
2332
  "panel.render.createAtTheProjectRoot": "\u5728\u9879\u76EE\u6839\u521B\u5EFA",
@@ -2286,7 +2337,9 @@ var init_render2 = __esm({
2286
2337
  "panel.render.pendingTask": "- [ ] \u5F85\u505A\u4EFB\u52A1",
2287
2338
  "panel.render.connectFeedbackSignals": "\u8FDE\u63A5\u53CD\u9988\u4FE1\u53F7 \xB7",
2288
2339
  "panel.render.notEnoughInformation": "\u4FE1\u606F\u4E0D\u8DB3:",
2289
- "panel.render.actionNotEnoughInformation": "\u4FE1\u606F\u4E0D\u8DB3",
2340
+ "panel.render.cannotReadPlanFile": "\u8BA1\u5212\u6587\u4EF6\u8BFB\u4E0D\u4E86",
2341
+ "panel.render.cannotSeeRequests": "\u770B\u4E0D\u5230\u8BF7\u6C42",
2342
+ "panel.render.projectEnded": "\u5DF2\u7ED3\u675F",
2290
2343
  "panel.render.sourceGETApiProjectsRequestOr": "\u6765\u6E90:GET /api/projects \u8BF7\u6C42\u6216\u8F7D\u8377\u6821\u9A8C\u5931\u8D25",
2291
2344
  "panel.render.projectRefreshFailedShowingThePrevious": "\u9879\u76EE\u5237\u65B0\u5931\u8D25\uFF0C\u5F53\u524D\u663E\u793A\u4E0A\u6B21\u8F7D\u8377\uFF1B\u884C\u52A8\u72B6\u6001\u53EF\u80FD\u5DF2\u53D8\u5316",
2292
2345
  "panel.render.noProjectGoalProvided": "\u5C1A\u672A\u63D0\u4F9B\u9879\u76EE\u76EE\u6807",
@@ -2303,6 +2356,11 @@ var init_render2 = __esm({
2303
2356
  "panel.render.feedbackSignalsAreNotConnectedOr": "\u53CD\u9988\u4FE1\u53F7\u672A\u63A5\u7EBF\u6216\u4E0D\u53EF\u7528\uFF0C\u65E0\u6CD5\u786E\u8BA4\u662F\u5426\u9700\u8981\u4F60",
2304
2357
  "panel.render.viewPlanProtocol": "\xB7 \u67E5\u770B\u8BA1\u5212\u534F\u8BAE",
2305
2358
  "panel.render.currentBranch": "\u6240\u5728\u5206\u652F",
2359
+ "panel.render.moreBranches": "\u8FD8\u6709 {count} \u6761\u5206\u652F",
2360
+ "panel.render.oneMoreBranch": "\u8FD8\u6709 {count} \u6761\u5206\u652F",
2361
+ "panel.render.branchCurrentPoints": "{count} \u4E2A\u5F53\u524D\u70B9",
2362
+ "panel.render.branchCurrentPoint": "{count} \u4E2A\u5F53\u524D\u70B9",
2363
+ "panel.render.branchCurrentPointsSource": "\u6765\u6E90:currentPoints \u4E2D\u5C5E\u4E8E\u8BE5\u9876\u5C42\u8282\u70B9\u5B50\u6811\u7684\u5F53\u524D\u70B9",
2306
2364
  "panel.render.noCurrentBranchProvided": "\u5C1A\u672A\u63D0\u4F9B\u6240\u5728\u5206\u652F",
2307
2365
  "panel.render.currentTaskLabel": "\u5F53\u524D\u4EFB\u52A1",
2308
2366
  "panel.render.sourceFirstScreenCurrentPointsLength": "\u6765\u6E90:firstScreen.currentPoints.length",
@@ -2334,7 +2392,7 @@ var init_render2 = __esm({
2334
2392
  "panel.render.sourceProjectRoot": "\u6765\u6E90:project.root",
2335
2393
  "panel.render.sourceRevisionMtimeLastWriter": "\u6765\u6E90:revision / mtime / lastWriter",
2336
2394
  "panel.render.all": "\u5168\u90E8",
2337
- "panel.render.waitingForYouLabel": "\u7B49\u4F60",
2395
+ "panel.render.waitingForYouLabel": "\u7B49\u5F85",
2338
2396
  "panel.render.ended": "\u5DF2\u7ED3\u675F",
2339
2397
  "panel.render.status": "\u72B6\u6001",
2340
2398
  "panel.render.dataTipSourceGETApiProjects": ' data-tip="\u6765\u6E90:GET /api/projects \u8BF7\u6C42\u4E0E\u8F7D\u8377\u6821\u9A8C"',
@@ -2382,7 +2440,7 @@ var init_server2 = __esm({
2382
2440
  "cli.server.openTimeout": "\u5E94\u7528\u6FC0\u6D3B\u8D85\u65F6",
2383
2441
  "cli.server.openFailed": "\u5E94\u7528\u6FC0\u6D3B\u5931\u8D25",
2384
2442
  "cli.server.fixturesOverlay": "fixtures \u6A21\u5F0F\u53EA\u8BFB:\u4E0D\u5199\u4EFB\u52A1\u5361 overlay",
2385
- "cli.server.overlayShape": "\u4F1A\u8BDD\u8BF7\u6C42\u9700\u8981\u5408\u6CD5 harness\u3001\u975E\u7A7A sessionId \u4E0E title/pinned/hidden/accepted \u8865\u4E01\uFF1B\u9879\u76EE\u8BF7\u6C42\u9700\u8981\u975E\u7A7A root \u4E0E pinned/order/hidden/archived \u8865\u4E01\uFF0Corder \u4E3A\u975E\u8D1F\u6574\u6570",
2443
+ "cli.server.overlayShape": "\u4F1A\u8BDD\u8BF7\u6C42\u9700\u8981\u5408\u6CD5 harness\u3001\u975E\u7A7A sessionId \u4E0E title/pinned/hidden/accepted/archived \u8865\u4E01\uFF1B\u9879\u76EE\u8BF7\u6C42\u9700\u8981\u975E\u7A7A root \u4E0E pinned/order/hidden/archived \u8865\u4E01\uFF0Corder \u4E3A\u975E\u8D1F\u6574\u6570",
2386
2444
  "cli.server.overlayHome": "\u4EFB\u52A1\u5361 overlay \u7F3A\u5C11 homeDir",
2387
2445
  "cli.server.licenseRead": "license \u6587\u4EF6\u8D85\u8FC7 64KB \u4E0A\u9650\u6216\u8BFB\u53D6\u5931\u8D25",
2388
2446
  "cli.server.panelBuild": "\u9762\u677F\u672A\u6784\u5EFA:\u8BF7\u5148\u8FD0\u884C pnpm --filter @wingman/panel build,\u518D\u5237\u65B0\u672C\u9875\u3002",
@@ -13688,6 +13746,20 @@ var init_generic_waiting = __esm({
13688
13746
  }
13689
13747
  });
13690
13748
 
13749
+ // packages/adapter-cc/dist/mcp-tools.js
13750
+ function recognizeMcpTool(name, configuredServers) {
13751
+ const [prefix, server, ...tool] = name.split("__");
13752
+ if (prefix !== "mcp" || !server || tool.length === 0 || ![server, ...tool].every((part) => /^[a-zA-Z][a-zA-Z0-9_-]*$/.test(part))) {
13753
+ return void 0;
13754
+ }
13755
+ return configuredServers.find((configured) => configured.replaceAll("-", "_") === server.replaceAll("-", "_"));
13756
+ }
13757
+ var init_mcp_tools = __esm({
13758
+ "packages/adapter-cc/dist/mcp-tools.js"() {
13759
+ "use strict";
13760
+ }
13761
+ });
13762
+
13691
13763
  // packages/adapter-cc/dist/protocol.js
13692
13764
  import { existsSync as existsSync10, mkdirSync as mkdirSync6, readdirSync as readdirSync3, readFileSync as readFileSync10, rmdirSync, rmSync as rmSync5, writeFileSync as writeFileSync7 } from "node:fs";
13693
13765
  import { homedir as homedir10 } from "node:os";
@@ -13932,6 +14004,7 @@ __export(dist_exports2, {
13932
14004
  installProtocolCcUser: () => installProtocolCcUser,
13933
14005
  protocolStatusCc: () => protocolStatusCc,
13934
14006
  protocolStatusCcUser: () => protocolStatusCcUser,
14007
+ recognizeMcpTool: () => recognizeMcpTool,
13935
14008
  uninstallProtocolCc: () => uninstallProtocolCc,
13936
14009
  uninstallProtocolCcUser: () => uninstallProtocolCcUser
13937
14010
  });
@@ -13955,6 +14028,7 @@ var init_dist4 = __esm({
13955
14028
  init_scan();
13956
14029
  init_generic_waiting();
13957
14030
  init_hooks2();
14031
+ init_mcp_tools();
13958
14032
  init_protocol2();
13959
14033
  init_scan();
13960
14034
  init_protocol_user();
@@ -16302,6 +16376,39 @@ var init_scan2 = __esm({
16302
16376
  }
16303
16377
  });
16304
16378
 
16379
+ // packages/adapter-codex/dist/plugin-tools.js
16380
+ function recognizePluginTool(name, namespace, configuredPlugins) {
16381
+ const fullName = name.startsWith("mcp__") ? name : namespace?.startsWith("mcp__") ? `${namespace}__${name}` : void 0;
16382
+ if (!fullName)
16383
+ return void 0;
16384
+ const [prefix, segment, ...rest] = fullName.split("__");
16385
+ if (prefix !== "mcp" || !segment || ![segment, ...rest].every((part) => /^[a-zA-Z][a-zA-Z0-9_-]*$/.test(part))) {
16386
+ return void 0;
16387
+ }
16388
+ const plugins = configuredPlugins.map((configured2) => {
16389
+ const [plugin = ""] = configured2.split("@");
16390
+ return { plugin, normalized: plugin.replaceAll("-", "_") };
16391
+ });
16392
+ if (segment === "codex_apps") {
16393
+ const appTool = rest.join("__").replaceAll("-", "_");
16394
+ return plugins.filter(({ normalized }) => normalized && (appTool === normalized || appTool.startsWith(`${normalized}_`))).sort((a, b) => b.normalized.length - a.normalized.length)[0]?.plugin;
16395
+ }
16396
+ const configured = plugins.find(({ normalized }) => normalized === segment.replaceAll("-", "_"));
16397
+ if (configured)
16398
+ return configured.plugin;
16399
+ const alias = PLUGIN_TOOL_ALIASES.get(segment);
16400
+ if (!alias)
16401
+ return void 0;
16402
+ return plugins.find(({ normalized }) => normalized === alias.replaceAll("-", "_"))?.plugin ?? alias;
16403
+ }
16404
+ var PLUGIN_TOOL_ALIASES;
16405
+ var init_plugin_tools = __esm({
16406
+ "packages/adapter-codex/dist/plugin-tools.js"() {
16407
+ "use strict";
16408
+ PLUGIN_TOOL_ALIASES = /* @__PURE__ */ new Map([["cua_repl", "unified-computer-use"]]);
16409
+ }
16410
+ });
16411
+
16305
16412
  // packages/adapter-codex/dist/protocol.js
16306
16413
  import { existsSync as existsSync14, mkdirSync as mkdirSync9, readFileSync as readFileSync14, rmSync as rmSync7, writeFileSync as writeFileSync10 } from "node:fs";
16307
16414
  import { basename as basename10, dirname as dirname14, join as join21, resolve as resolve9 } from "node:path";
@@ -16549,6 +16656,7 @@ __export(dist_exports3, {
16549
16656
  installProtocolCodexUser: () => installProtocolCodexUser,
16550
16657
  protocolStatusCodex: () => protocolStatusCodex,
16551
16658
  protocolStatusCodexUser: () => protocolStatusCodexUser,
16659
+ recognizePluginTool: () => recognizePluginTool,
16552
16660
  resolveNodeExecutable: () => resolveNodeExecutable,
16553
16661
  uninstallProtocolCodex: () => uninstallProtocolCodex,
16554
16662
  uninstallProtocolCodexUser: () => uninstallProtocolCodexUser
@@ -16571,6 +16679,7 @@ var init_dist6 = __esm({
16571
16679
  init_hooks3();
16572
16680
  init_scan2();
16573
16681
  init_hooks3();
16682
+ init_plugin_tools();
16574
16683
  init_protocol3();
16575
16684
  init_protocol_user2();
16576
16685
  }
@@ -18913,11 +19022,19 @@ function patchTaskOverlay(homeDir, key, patch, now) {
18913
19022
  entry.pinned = patch.pinned;
18914
19023
  if (patch.hidden !== void 0)
18915
19024
  entry.hidden = patch.hidden;
19025
+ if (patch.archived === true) {
19026
+ entry.archived = true;
19027
+ entry.archivedAt = now.toISOString();
19028
+ } else if (patch.archived === false) {
19029
+ delete entry.archived;
19030
+ delete entry.archivedAt;
19031
+ entry.hidden = false;
19032
+ }
18916
19033
  if (patch.accepted === true)
18917
19034
  entry.accepted = { at: now.toISOString() };
18918
19035
  else if (patch.accepted === false)
18919
19036
  delete entry.accepted;
18920
- const empty = entry.title === void 0 && entry.pinned !== true && entry.hidden !== true && entry.accepted === void 0;
19037
+ const empty = entry.title === void 0 && entry.pinned !== true && entry.hidden !== true && entry.archived !== true && entry.accepted === void 0;
18921
19038
  const entries = { ...current.entries };
18922
19039
  if (empty)
18923
19040
  delete entries[key];
@@ -19028,10 +19145,10 @@ function isTaskOverlayEntry(value, key) {
19028
19145
  if (key.startsWith("project:")) {
19029
19146
  return Object.keys(value).every((field) => ["pinned", "order", "hidden", "archived", "archivedAt", "updatedAt"].includes(field)) && (value.pinned === void 0 || typeof value.pinned === "boolean") && (value.hidden === void 0 || typeof value.hidden === "boolean") && (value.archived === void 0 || typeof value.archived === "boolean") && (value.archived === true ? typeof value.archivedAt === "string" && Number.isFinite(Date.parse(value.archivedAt)) : value.archivedAt === void 0) && (value.order === void 0 || value.pinned === true && typeof value.order === "number" && Number.isSafeInteger(value.order) && value.order >= 0) && typeof value.updatedAt === "string";
19030
19147
  }
19031
- if (Object.keys(value).some((key2) => !["title", "pinned", "hidden", "accepted", "updatedAt"].includes(key2))) {
19148
+ if (Object.keys(value).some((key2) => !["title", "pinned", "hidden", "archived", "archivedAt", "accepted", "updatedAt"].includes(key2))) {
19032
19149
  return false;
19033
19150
  }
19034
- return (value.title === void 0 || typeof value.title === "string") && (value.pinned === void 0 || typeof value.pinned === "boolean") && (value.hidden === void 0 || typeof value.hidden === "boolean") && (value.accepted === void 0 || isTaskAcceptance(value.accepted)) && typeof value.updatedAt === "string";
19151
+ return (value.title === void 0 || typeof value.title === "string") && (value.pinned === void 0 || typeof value.pinned === "boolean") && (value.hidden === void 0 || typeof value.hidden === "boolean") && (value.archived === void 0 || typeof value.archived === "boolean") && (value.archived === true ? typeof value.archivedAt === "string" && Number.isFinite(Date.parse(value.archivedAt)) : value.archivedAt === void 0) && (value.accepted === void 0 || isTaskAcceptance(value.accepted)) && typeof value.updatedAt === "string";
19035
19152
  }
19036
19153
  function isTaskAcceptance(value) {
19037
19154
  return isRecord7(value) && Object.keys(value).every((key) => key === "at") && typeof value.at === "string";
@@ -19066,7 +19183,7 @@ function resolveWingmanVersion({ defined, moduleUrl = import.meta.url, readPacka
19066
19183
  return void 0;
19067
19184
  }
19068
19185
  function wingmanVersion() {
19069
- const defined = false ? void 0 : "0.9.0";
19186
+ const defined = false ? void 0 : "0.9.2";
19070
19187
  return resolveWingmanVersion({
19071
19188
  defined,
19072
19189
  readPackage: (url) => JSON.parse(readFileSync17(url, "utf8"))
@@ -19095,6 +19212,8 @@ function acceptanceView(homeDir, overlay, key) {
19095
19212
  return accepted === void 0 ? { state: "none" } : { state: "accepted", at: accepted.at };
19096
19213
  }
19097
19214
  function createNarrativeService(options = {}) {
19215
+ let codexPluginsProvider = options.codexPlugins;
19216
+ let ccMcpServersProvider = options.ccMcpServers;
19098
19217
  const follow = options.followTranscripts ?? true;
19099
19218
  const intervalMs = options.intervalMs ?? 500;
19100
19219
  const now = options.now ?? (() => /* @__PURE__ */ new Date());
@@ -19712,37 +19831,62 @@ function createNarrativeService(options = {}) {
19712
19831
  session.dirty = true;
19713
19832
  notify(harness);
19714
19833
  }
19715
- function deriveCached(harness, session) {
19716
- if (!session.dirty && session.cached !== void 0 && session.cachedLocale === getLocale()) {
19834
+ function deriveCached(harness, session, configuredPlugins, configuredMcpServers) {
19835
+ const pluginKey = JSON.stringify(configuredPlugins);
19836
+ const mcpKey = JSON.stringify(configuredMcpServers);
19837
+ if (!session.dirty && session.cached !== void 0 && session.cachedLocale === getLocale() && session.cachedCodexPlugins === pluginKey && session.cachedCcMcpServers === mcpKey) {
19717
19838
  return session.cached;
19718
19839
  }
19719
- session.cached = derive(harness, session, now().toISOString());
19840
+ session.cached = derive(harness, session, now().toISOString(), configuredPlugins, configuredMcpServers);
19720
19841
  session.dirty = false;
19721
19842
  session.cachedLocale = getLocale();
19843
+ session.cachedCodexPlugins = pluginKey;
19844
+ session.cachedCcMcpServers = mcpKey;
19722
19845
  return session.cached;
19723
19846
  }
19724
19847
  function getOverview(harness) {
19725
19848
  const nowIso = now().toISOString();
19726
19849
  const sessions = sessionsOf(harness);
19850
+ let configuredPlugins = [];
19851
+ try {
19852
+ if (harness === "codex")
19853
+ configuredPlugins = codexPluginsProvider?.() ?? [];
19854
+ } catch {
19855
+ configuredPlugins = [];
19856
+ }
19857
+ let configuredMcpServers = [];
19858
+ try {
19859
+ if (harness === "cc")
19860
+ configuredMcpServers = ccMcpServersProvider?.() ?? [];
19861
+ } catch {
19862
+ configuredMcpServers = [];
19863
+ }
19727
19864
  const overlay = options.homeDir === void 0 ? void 0 : readTaskOverlay(options.homeDir);
19865
+ const overlayEntries = overlay === void 0 || "unavailable" in overlay ? {} : overlay.entries;
19728
19866
  let feedback;
19729
19867
  try {
19730
19868
  feedback = options.feedbackSignals?.(harness);
19731
19869
  } catch {
19732
19870
  feedback = void 0;
19733
19871
  }
19734
- const infos = [...sessions.values()].map((session) => ({
19735
- id: session.id,
19736
- label: session.projectResolution?.isHome ? t("narrative.homeDirectory") : session.label ?? shortSessionId(session.id),
19737
- ...session.cwd === void 0 ? {} : { cwd: session.cwd },
19738
- lastActivity: lastActivityOf(session),
19739
- waiting: session.waiting !== null,
19740
- ended: isEnded(session, nowIso),
19741
- ...feedback === void 0 ? {} : { feedback }
19742
- })).sort((a, b) => a.lastActivity < b.lastActivity ? 1 : a.lastActivity > b.lastActivity ? -1 : 0);
19872
+ const infos = [...sessions.values()].map((session) => {
19873
+ const user = overlayEntries[`${harness}:${session.id}`];
19874
+ const lastActivity = lastActivityOf(session);
19875
+ return {
19876
+ id: session.id,
19877
+ label: session.projectResolution?.isHome ? t("narrative.homeDirectory") : session.label ?? shortSessionId(session.id),
19878
+ ...session.cwd === void 0 ? {} : { cwd: session.cwd },
19879
+ lastActivity,
19880
+ waiting: session.waiting !== null,
19881
+ ended: isEnded(session, nowIso),
19882
+ archived: user?.archived === true,
19883
+ archivedHasNewActivity: user?.archived === true && user.archivedAt !== void 0 && Date.parse(lastActivity) > Date.parse(user.archivedAt),
19884
+ ...feedback === void 0 ? {} : { feedback }
19885
+ };
19886
+ }).sort((a, b) => a.lastActivity < b.lastActivity ? 1 : a.lastActivity > b.lastActivity ? -1 : 0);
19743
19887
  const states = {};
19744
19888
  for (const [id, session] of sessions) {
19745
- const state = deriveCached(harness, session);
19889
+ const state = deriveCached(harness, session, configuredPlugins, configuredMcpServers);
19746
19890
  const verification = state.taskWorkflow?.verification;
19747
19891
  states[id] = state.taskWorkflow === void 0 ? state : {
19748
19892
  ...state,
@@ -19905,8 +20049,11 @@ function createNarrativeService(options = {}) {
19905
20049
  user: {
19906
20050
  ...userEntry?.title === void 0 ? {} : { title: userEntry.title },
19907
20051
  pinned: userEntry?.pinned ?? false,
19908
- hidden: userEntry?.hidden ?? false
20052
+ hidden: userEntry?.hidden ?? false,
20053
+ ...userEntry?.archived === void 0 ? {} : { archived: userEntry.archived },
20054
+ ...userEntry?.archivedAt === void 0 ? {} : { archivedAt: userEntry.archivedAt }
19909
20055
  },
20056
+ archivedHasNewActivity: info?.archivedHasNewActivity ?? false,
19910
20057
  ...session.cwd === void 0 ? {} : { cwd: session.cwd },
19911
20058
  ...info?.lastActivity === void 0 ? {} : { lastActivity: info.lastActivity },
19912
20059
  waiting: info?.waiting ?? false,
@@ -19976,19 +20123,14 @@ function createNarrativeService(options = {}) {
19976
20123
  lookedUp: resolution?.lookedUp ?? [planPath]
19977
20124
  };
19978
20125
  }
19979
- let projectUser = overlayEntries[`project:${root}`];
20126
+ const projectUser = overlayEntries[`project:${root}`];
19980
20127
  const firstScreen = deriveProjectFirstScreen(plan, parsed?.availability === "available" ? parsed.goal : void 0, summary.currentPoints, sessionViews);
19981
- if (projectUser?.archived === true && projectUser.archivedAt !== void 0 && firstScreen.lastActivity !== void 0 && Date.parse(firstScreen.lastActivity.at) > Date.parse(projectUser.archivedAt) && options.homeDir !== void 0 && options.projectBoundaryDir === void 0) {
19982
- try {
19983
- const restored = patchProjectOverlay(options.homeDir, root, { archived: false }, now());
19984
- if (!("unavailable" in restored))
19985
- projectUser = restored.entry ?? void 0;
19986
- } catch {
19987
- }
19988
- }
20128
+ const archivedHasNewActivity = projectUser?.archived === true && projectUser.archivedAt !== void 0 && firstScreen.lastActivity !== void 0 && Date.parse(firstScreen.lastActivity.at) > Date.parse(projectUser.archivedAt);
19989
20129
  projects.push({
19990
20130
  firstScreen,
19991
20131
  root,
20132
+ ...resolution === void 0 ? {} : { isHome: resolution.isHome === true },
20133
+ archivedHasNewActivity,
19992
20134
  ...projectUser === void 0 ? {} : {
19993
20135
  user: {
19994
20136
  pinned: projectUser.pinned ?? false,
@@ -20055,8 +20197,18 @@ function createNarrativeService(options = {}) {
20055
20197
  for (const harness of HARNESS_IDS)
20056
20198
  notify(harness);
20057
20199
  }
20200
+ function refreshOverlay(harness) {
20201
+ for (const changed of harness === void 0 ? HARNESS_IDS : [harness])
20202
+ notify(changed);
20203
+ }
20058
20204
  loadRememberedProjectRoots();
20059
20205
  return {
20206
+ setCodexPluginsProvider(provider) {
20207
+ codexPluginsProvider = provider;
20208
+ },
20209
+ setCcMcpServersProvider(provider) {
20210
+ ccMcpServersProvider = provider;
20211
+ },
20060
20212
  handleEvent,
20061
20213
  getState,
20062
20214
  getOverview,
@@ -20064,6 +20216,7 @@ function createNarrativeService(options = {}) {
20064
20216
  seedFixture,
20065
20217
  subscribe,
20066
20218
  refreshLocale,
20219
+ refreshOverlay,
20067
20220
  close
20068
20221
  };
20069
20222
  }
@@ -20111,6 +20264,7 @@ function deriveProjectFirstScreen(plan, goal, points, sessions) {
20111
20264
  ...session.feedback.message === void 0 ? {} : { text: session.feedback.message }
20112
20265
  });
20113
20266
  }
20267
+ const feedbackUnavailable = sessions.length > 0 && sessions.every((session) => session.feedback === void 0 || session.feedback.state === "unavailable");
20114
20268
  let action;
20115
20269
  if (requests.length > 0)
20116
20270
  action = { kind: "decision", items: requests, source: "sessions.feedback(state=needs_user)" };
@@ -20120,6 +20274,16 @@ function deriveProjectFirstScreen(plan, goal, points, sessions) {
20120
20274
  items: checkpoints,
20121
20275
  source: ".wingman/plan.md \u5F53\u524D\u70B9\u7956\u5148\u8DEF\u5F84 status / verification"
20122
20276
  };
20277
+ else if (plan.availability === "available" && currentPoints.length > 0 && sessions.some((session) => !session.ended) && !feedbackUnavailable)
20278
+ action = {
20279
+ kind: "in_progress",
20280
+ source: ".wingman/plan.md currentPoints; sessions.ended=false"
20281
+ };
20282
+ else if (sessions.length > 0 && sessions.every((session) => session.ended))
20283
+ action = {
20284
+ kind: "ended",
20285
+ source: "sessions.length>0; sessions.every(ended=true)"
20286
+ };
20123
20287
  else if (plan.availability === "missing")
20124
20288
  action = {
20125
20289
  kind: "insufficient",
@@ -20132,21 +20296,16 @@ function deriveProjectFirstScreen(plan, goal, points, sessions) {
20132
20296
  reason: "plan_unavailable",
20133
20297
  source: `plan.availability=unavailable; plan.reason: ${plan.reason}`
20134
20298
  };
20135
- else if (sessions.length > 0 && sessions.every((session) => session.feedback === void 0 || session.feedback.state === "unavailable"))
20299
+ else if (feedbackUnavailable)
20136
20300
  action = {
20137
20301
  kind: "insufficient",
20138
20302
  reason: "feedback_unavailable",
20139
20303
  source: "sessions.feedback.state=unavailable / feedback \u672A\u63D0\u4F9B"
20140
20304
  };
20141
- else if (currentPoints.length > 0 && sessions.some((session) => !session.ended))
20142
- action = {
20143
- kind: "in_progress",
20144
- source: ".wingman/plan.md currentPoints; sessions.ended=false"
20145
- };
20146
20305
  else
20147
20306
  action = {
20148
20307
  kind: "insufficient",
20149
- reason: "no_session",
20308
+ reason: "feedback_unavailable",
20150
20309
  source: `currentPoints.length=${currentPoints.length}; sessions(ended=false).length=${sessions.filter((session) => !session.ended).length}`
20151
20310
  };
20152
20311
  const latest = sessions.filter((session) => session.lastActivity !== void 0 && Number.isFinite(Date.parse(session.lastActivity))).sort((left, right) => Date.parse(right.lastActivity) - Date.parse(left.lastActivity))[0];
@@ -20291,6 +20450,32 @@ function feedbackView(harness, capability, state) {
20291
20450
  }
20292
20451
  return state ?? { state: "no_open_request", source: `${harness} explicit feedback signals` };
20293
20452
  }
20453
+ function observedMcpServers(lines2, configuredServers) {
20454
+ const names = /* @__PURE__ */ new Set();
20455
+ for (const line of lines2) {
20456
+ if (line.kind !== "assistant")
20457
+ continue;
20458
+ for (const block of line.blocks) {
20459
+ if (block.kind !== "tool_use")
20460
+ continue;
20461
+ const server = recognizeMcpTool(block.name, configuredServers);
20462
+ if (server !== void 0)
20463
+ names.add(server);
20464
+ }
20465
+ }
20466
+ return [...names];
20467
+ }
20468
+ function observedPlugins(lines2, configuredPlugins) {
20469
+ const names = /* @__PURE__ */ new Set();
20470
+ for (const line of lines2) {
20471
+ if (line.kind !== "tool_call" || line.name === void 0)
20472
+ continue;
20473
+ const plugin = recognizePluginTool(line.name, line.namespace, configuredPlugins);
20474
+ if (plugin !== void 0)
20475
+ names.add(plugin);
20476
+ }
20477
+ return [...names];
20478
+ }
20294
20479
  function observedSkills(lines2) {
20295
20480
  const names = /* @__PURE__ */ new Set();
20296
20481
  const validName = (value) => typeof value === "string" && /^[a-zA-Z0-9_.:-]+(?:\/[a-zA-Z0-9_.:-]+)*$/.test(value);
@@ -20326,7 +20511,7 @@ function observedSkills(lines2) {
20326
20511
  }
20327
20512
  return [...names];
20328
20513
  }
20329
- function derive(harness, session, nowIso) {
20514
+ function derive(harness, session, nowIso, configuredPlugins, configuredMcpServers) {
20330
20515
  const codexLines = sortedCodexByTimestamp(session.codexLines);
20331
20516
  const lines2 = harness === "codex" ? adaptCodexNarrativeLines(codexLines) : sortedByTimestamp(session.lines);
20332
20517
  const timeline = deriveTodoTimeline(extractTodoSnapshots(lines2));
@@ -20470,11 +20655,15 @@ function derive(harness, session, nowIso) {
20470
20655
  }
20471
20656
  };
20472
20657
  const skillsUsed = harness === "cc" ? observedSkills(lines2) : [];
20658
+ const mcpUsed = harness === "cc" ? observedMcpServers(lines2, configuredMcpServers) : [];
20659
+ const pluginsUsed = harness === "codex" ? observedPlugins(codexLines, configuredPlugins) : [];
20473
20660
  return {
20474
20661
  harness,
20475
20662
  sessionId: session.id,
20476
20663
  transcriptPath: session.transcriptPath ?? null,
20477
20664
  ...skillsUsed.length === 0 ? {} : { skillsUsed },
20665
+ ...mcpUsed.length === 0 ? {} : { mcpUsed },
20666
+ ...pluginsUsed.length === 0 ? {} : { pluginsUsed },
20478
20667
  ...session.cwd === void 0 ? {} : { cwd: session.cwd },
20479
20668
  ...session.cwd === void 0 ? {} : {
20480
20669
  project: {
@@ -21691,6 +21880,8 @@ var LOCAL_HOST = /^(?:127\.0\.0\.1|localhost)(?::\d+)?$|^\[::1\](?::\d+)?$/i;
21691
21880
  function createWingmanServer(options) {
21692
21881
  const warn = options.warn ?? ((message) => console.error(message));
21693
21882
  const runtime = { anatomy: null };
21883
+ options.narrative?.setCodexPluginsProvider(() => runtime.anatomy?.configs.find((config) => config.harness === "codex")?.slots.skills.filter((item) => item.nativeName.startsWith("plugins.")).map((item) => item.nativeName.slice("plugins.".length)) ?? []);
21884
+ options.narrative?.setCcMcpServersProvider(() => runtime.anatomy?.configs.find((config) => config.harness === "cc")?.slots.tools.filter((item) => item.nativeName.startsWith("mcpServers.")).map((item) => item.nativeName.slice("mcpServers.".length)) ?? []);
21694
21885
  return createServer({ requireHostHeader: false }, (req, res) => {
21695
21886
  handle(req, res, options, warn, runtime).catch((error) => {
21696
21887
  warn(t("cli.server.requestFailed", { error: errorMessage3(error) }));
@@ -21827,6 +22018,8 @@ async function handle(req, res, options, warn, runtime) {
21827
22018
  });
21828
22019
  return;
21829
22020
  }
22021
+ if (harness === "codex" || harness === "cc")
22022
+ await cachedAnatomy(options, warn, runtime);
21830
22023
  const overview = options.narrative.getOverview(harness);
21831
22024
  if (overview.sessions.length > 0) {
21832
22025
  const config = (await cachedAnatomy(options, warn, runtime)).find((c) => c.harness === harness);
@@ -21843,6 +22036,7 @@ async function handle(req, res, options, warn, runtime) {
21843
22036
  }
21844
22037
  if (url.pathname === "/api/anatomy") {
21845
22038
  const configs = await scanAll(options.harnesses, warn);
22039
+ runtime.anatomy = { at: Date.now(), configs };
21846
22040
  const anatomy = configs.map((config) => {
21847
22041
  const scanOptions = options.harnesses.find((entry) => entry.harness === config.harness)?.scanOptions;
21848
22042
  const homeDir = scanOptions?.homeDir ?? options.homeDir;
@@ -22223,6 +22417,7 @@ async function handleTaskOverlay(req, res, options) {
22223
22417
  sendJson2(res, 409, { error: result5.unavailable });
22224
22418
  return;
22225
22419
  }
22420
+ options.narrative?.refreshOverlay("root" in body ? void 0 : body.harness);
22226
22421
  sendJson2(res, 200, { key, entry: result5.entry });
22227
22422
  }
22228
22423
  var LICENSE_BODY_LIMIT = 64 * 1024;
@@ -22315,10 +22510,10 @@ function isTaskOverlayRequest(value) {
22315
22510
  if (!isRecord9(value.patch))
22316
22511
  return false;
22317
22512
  const keys = Object.keys(value.patch);
22318
- if (keys.length === 0 || keys.some((key) => !["title", "pinned", "hidden", "accepted"].includes(key))) {
22513
+ if (keys.length === 0 || keys.some((key) => !["title", "pinned", "hidden", "archived", "accepted"].includes(key))) {
22319
22514
  return false;
22320
22515
  }
22321
- return (value.patch.title === void 0 || value.patch.title === null || typeof value.patch.title === "string") && (value.patch.pinned === void 0 || typeof value.patch.pinned === "boolean") && (value.patch.hidden === void 0 || typeof value.patch.hidden === "boolean") && (value.patch.accepted === void 0 || typeof value.patch.accepted === "boolean");
22516
+ return (value.patch.title === void 0 || value.patch.title === null || typeof value.patch.title === "string") && (value.patch.pinned === void 0 || typeof value.patch.pinned === "boolean") && (value.patch.hidden === void 0 || typeof value.patch.hidden === "boolean") && (value.patch.archived === void 0 || typeof value.patch.archived === "boolean") && (value.patch.accepted === void 0 || typeof value.patch.accepted === "boolean");
22322
22517
  }
22323
22518
  function isProjectOverlayRequest(value) {
22324
22519
  if (!isRecord9(value) || typeof value.root !== "string" || value.root.trim() === "")