harness-wingman 0.9.0 → 0.9.1

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,6 +657,11 @@ 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",
654
666
  "panel.render.skillsUsed": "Used this session: {skills}",
655
667
  "panel.render.skillsUsedSource": "Source: observed Skill tool calls / skill command triggers in the transcript",
@@ -657,8 +669,9 @@ var init_render = __esm({
657
669
  "panel.render.archiveProject": "Archive",
658
670
  "panel.render.restoreProject": "Restore",
659
671
  "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",
672
+ "panel.render.projectArchiveNewActivity": "New activity",
673
+ "panel.render.projectArchiveActivitySource": "Source: firstScreen.lastActivity.at > user.archivedAt",
674
+ "panel.render.projectArchiveSource": "Source: local task-overlay.json archived / archivedAt; hidden in all tabs until you restore it, even after new activity",
662
675
  "panel.render.moveProjectUp": "Move pinned project up",
663
676
  "panel.render.moveProjectDown": "Move pinned project down",
664
677
  "panel.render.projectPinSource": "Source: local task-overlay.json pinned / order",
@@ -670,7 +683,11 @@ var init_render = __esm({
670
683
  "panel.render.waitTrace": "{label}: {message}{outcome}",
671
684
  "panel.render.sessionIdentifier": "Session: {id}",
672
685
  "panel.render.operationOnHost": "\xB7 {verb} will happen on this machine",
673
- "panel.render.protocolFileOperation": "File for protocol {verb} \u2014 no bytes change before confirmation",
686
+ "panel.render.protocolFileOperation": "File for protocol {verb}",
687
+ "panel.render.protocolImpactLabel": "Effect on harness and projects",
688
+ "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.",
689
+ "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.",
690
+ "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
691
  "panel.render.deleteLineNumber": "Delete line {line}",
675
692
  "panel.render.close": "Close",
676
693
  "panel.render.language": "Language",
@@ -740,7 +757,7 @@ var init_render = __esm({
740
757
  "panel.render.confirmWrite": "Confirm write",
741
758
  "panel.render.thePlanContainsNoFileChanges": "The plan contains no file changes",
742
759
  "panel.render.noOtherReferencesFoundInThe": "No other references found in the scanned content",
743
- "panel.render.filesToWriteNoBytesChange": "Files to write \u2014 no bytes change before confirmation",
760
+ "panel.render.filesToWriteNoBytesChange": "Files to write",
744
761
  "panel.render.references": "References",
745
762
  "panel.render.matchesThesePlacesMentionItReported": "matches \u2014 these places mention it; reported without edits",
746
763
  "panel.render.backup": "Backup",
@@ -1005,7 +1022,7 @@ var init_render = __esm({
1005
1022
  "panel.render.dshHasNoUserLevelInstructionFile": "dsh has no user-level instruction file; install the project-level protocol per project",
1006
1023
  "panel.render.replaceLtProjectGtWithThe": "; replace <project> with the project path before running",
1007
1024
  "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.",
1025
+ "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
1026
  "panel.render.theProtocolBlockHasBeenModified": "The protocol block has been modified. Existing content is preserved; resolve the changes before reinstalling.",
1010
1027
  "panel.render.afterConfirmationInstallsInTheUser": "The plan only gives Wingman something to display. It never rewrites harness behavior or any code.",
1011
1028
  "panel.render.reinstall": "Reinstall",
@@ -1076,7 +1093,6 @@ var init_render = __esm({
1076
1093
  "panel.render.noPlanFile": "No plan file",
1077
1094
  "panel.render.planUnreadable": "Plan unreadable",
1078
1095
  "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
1096
  "panel.render.copyInstallCommandTip": "{p0} \xB7 Copy install command",
1081
1097
  "panel.render.howToProvideAPlan": "How to provide a plan",
1082
1098
  "panel.render.createAtTheProjectRoot": "Create at the project root: ",
@@ -1087,7 +1103,9 @@ var init_render = __esm({
1087
1103
  "panel.render.pendingTask": "- [ ] Pending task",
1088
1104
  "panel.render.connectFeedbackSignals": "Connect feedback signals \xB7",
1089
1105
  "panel.render.notEnoughInformation": "Not enough information: ",
1090
- "panel.render.actionNotEnoughInformation": "Not enough information",
1106
+ "panel.render.cannotReadPlanFile": "Cannot read plan file",
1107
+ "panel.render.cannotSeeRequests": "Requests not observable",
1108
+ "panel.render.projectEnded": "Ended",
1091
1109
  "panel.render.sourceGETApiProjectsRequestOr": "Source: GET /api/projects request or payload validation failed",
1092
1110
  "panel.render.projectRefreshFailedShowingThePrevious": "Project refresh failed. Showing the previous response; action status may have changed",
1093
1111
  "panel.render.noProjectGoalProvided": "No project goal provided",
@@ -1183,7 +1201,7 @@ var init_server = __esm({
1183
1201
  "cli.server.openTimeout": "App activation timed out",
1184
1202
  "cli.server.openFailed": "App activation failed",
1185
1203
  "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",
1204
+ "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
1205
  "cli.server.overlayHome": "Task card overlays require homeDir",
1188
1206
  "cli.server.licenseRead": "The license file exceeds the 64KB limit or could not be read",
1189
1207
  "cli.server.panelBuild": "The panel has not been built: run pnpm --filter @wingman/panel build, then refresh this page.",
@@ -1628,7 +1646,7 @@ var init_panel2 = __esm({
1628
1646
  "packages/i18n/dist/catalog/zh/panel.js"() {
1629
1647
  "use strict";
1630
1648
  panel_default2 = {
1631
- "island.waitingForYou": "{p0} \u5728\u7B49\u4F60:{p1}",
1649
+ "island.waitingForYou": "{p0} \u5728\u7B49\u5F85:{p1}",
1632
1650
  "panel.main.backToSessionSettingsResponseUnavailable": "\u56DE\u8DF3\u8BBE\u7F6E\u54CD\u5E94\u4E0D\u53EF\u7528",
1633
1651
  "panel.main.couldNotSaveBackToSession": "\u56DE\u8DF3\u8BBE\u7F6E\u4FDD\u5B58\u5931\u8D25",
1634
1652
  "panel.main.couldNotLoadBackToSession": "\u56DE\u8DF3\u8BBE\u7F6E\u8BFB\u53D6\u5931\u8D25",
@@ -1748,7 +1766,7 @@ var init_panel2 = __esm({
1748
1766
  "panel.live.liveConnectionEstablished": "\u5B9E\u51B5\u5DF2\u8FDE\u63A5",
1749
1767
  "panel.live.disconnectedReconnectingAutomatically": "\u8FDE\u63A5\u65AD\u5F00 \xB7 \u81EA\u52A8\u91CD\u8FDE\u4E2D",
1750
1768
  "panel.live.connecting": "\u8FDE\u63A5\u4E2D\u2026",
1751
- "panel.taskboard.waitingForYou": "\u7B49\u4F60",
1769
+ "panel.taskboard.waitingForYou": "\u7B49\u5F85",
1752
1770
  "panel.taskboard.ended": "\u5DF2\u7ED3\u675F",
1753
1771
  "panel.taskboard.inProgress": "\u8FDB\u884C\u4E2D",
1754
1772
  "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 +1800,7 @@ var init_panel_narrative2 = __esm({
1782
1800
  "panel.narrative.subagent": "\u5B50 agent",
1783
1801
  "panel.narrative.mainAgent": "\u4E3B agent",
1784
1802
  "panel.narrative.openRequest": "\u6709\u5F85\u5904\u7406\u8BF7\u6C42",
1785
- "panel.narrative.waitingForYou": "\u7B49\u4F60",
1803
+ "panel.narrative.waitingForYou": "\u7B49\u5F85",
1786
1804
  "panel.narrative.inProgress": "\u8FDB\u884C\u4E2D",
1787
1805
  "panel.narrative.notWired": "\u672A\u63A5\u7EBF",
1788
1806
  "panel.narrative.waitingEvents": "\u7B49\u5F85\u4E8B\u4EF6",
@@ -1791,7 +1809,7 @@ var init_panel_narrative2 = __esm({
1791
1809
  "panel.narrative.invalidProjectProtocol": "harness {harness} \u7684 planProtocol.project \u65E0\u6548",
1792
1810
  "panel.narrative.unavailableProject": "\u4E0D\u53EF\u7528\u9879\u76EE {number}",
1793
1811
  "panel.narrative.waitOverdue": " \xB7 \u5DF2\u7B49 {minutes}m+",
1794
- "panel.narrative.waitLabel": "\u7B49\u4F60{who}:{message}{overdue}",
1812
+ "panel.narrative.waitLabel": "\u7B49\u5F85{who}:{message}{overdue}",
1795
1813
  "panel.narrative.event.SessionStart": "\u4F1A\u8BDD\u5F00\u59CB",
1796
1814
  "panel.narrative.event.SessionEnd": "\u4F1A\u8BDD\u7ED3\u675F",
1797
1815
  "panel.narrative.event.UserPromptSubmit": "\u6536\u5230\u65B0\u63D0\u793A",
@@ -1814,6 +1832,13 @@ var init_render2 = __esm({
1814
1832
  "packages/i18n/dist/catalog/zh/render.js"() {
1815
1833
  "use strict";
1816
1834
  render_default2 = {
1835
+ "panel.render.olderSessions": "\u66F4\u65E9\u7684 {count} \u4E2A\u4F1A\u8BDD",
1836
+ "panel.render.olderSessionsSource": "\u6765\u6E90:sessions.ended \u4E14 lastActivity \u65E9\u4E8E\u5F53\u524D\u65F6\u95F4 {days} \u5929;\u4EC5\u6298\u53E0\u663E\u793A",
1837
+ "panel.render.archiveSession": "\u5F52\u6863",
1838
+ "panel.render.restoreSession": "\u6062\u590D",
1839
+ "panel.render.archivedSessions": "\u5DF2\u5F52\u6863 {count} \u4E2A\u4F1A\u8BDD",
1840
+ "panel.render.sessionArchiveSource": "\u6765\u6E90:\u672C\u673A task-overlay.json \u4F1A\u8BDD / \u9879\u76EE archived;\u4E0D\u5220\u9664 harness \u6570\u636E",
1841
+ "panel.render.sessionArchiveActivitySource": "\u6765\u6E90:\u4F1A\u8BDD\u4E8B\u4EF6\u65F6\u95F4 > \u4F1A\u8BDD\u6216\u9879\u76EE archivedAt",
1817
1842
  "panel.render.ccEnabled": "\u5DF2\u5F00\u542F",
1818
1843
  "panel.render.ccPartial": "\u90E8\u5206\u53D7\u9650",
1819
1844
  "panel.render.ccDisableAll": "\u5168\u90E8\u5173\u95ED",
@@ -1849,6 +1874,11 @@ var init_render2 = __esm({
1849
1874
  "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
1875
  "panel.render.skillOverridesSource": "\u6765\u6E90:settings skillOverrides;\u914D\u7F6E\u5DF2\u7981\u7528",
1851
1876
  "panel.render.skillConfiguration": "\u914D\u7F6E\u7EA7",
1877
+ "panel.render.plugins": "\u63D2\u4EF6",
1878
+ "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",
1879
+ "panel.render.pluginsSummary": "{enabled} \u4E2A\u63D2\u4EF6\u5DF2\u542F\u7528 \xB7 \u672C\u4F1A\u8BDD\u7528\u5230 {used} \u4E2A",
1880
+ "panel.render.pluginsUnobserved": "{enabled} \u4E2A\u63D2\u4EF6\u5DF2\u542F\u7528 \xB7 \u672C\u4F1A\u8BDD\u672A\u89C2\u5BDF\u5230\u63D2\u4EF6\u8C03\u7528",
1881
+ "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
1882
  "panel.render.skillConfigurationTip": "\u672C\u4F1A\u8BDD\u662F\u5426\u771F\u7684\u52A0\u8F7D\u4EE5 transcript \u4E3A\u51C6",
1853
1883
  "panel.render.skillsUsed": "\u672C\u4F1A\u8BDD\u5DF2\u7528:{skills}",
1854
1884
  "panel.render.skillsUsedSource": "\u6765\u6E90:transcript \u4E2D\u89C2\u5BDF\u5230\u7684 Skill \u5DE5\u5177\u8C03\u7528 / \u6280\u80FD\u547D\u4EE4\u89E6\u53D1\u8BB0\u5F55",
@@ -1856,8 +1886,9 @@ var init_render2 = __esm({
1856
1886
  "panel.render.archiveProject": "\u5F52\u6863",
1857
1887
  "panel.render.restoreProject": "\u6062\u590D",
1858
1888
  "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",
1889
+ "panel.render.projectArchiveNewActivity": "\u6709\u65B0\u6D3B\u52A8",
1890
+ "panel.render.projectArchiveActivitySource": "\u6765\u6E90:firstScreen.lastActivity.at > user.archivedAt",
1891
+ "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
1892
  "panel.render.moveProjectUp": "\u4E0A\u79FB\u7F6E\u9876\u9879\u76EE",
1862
1893
  "panel.render.moveProjectDown": "\u4E0B\u79FB\u7F6E\u9876\u9879\u76EE",
1863
1894
  "panel.render.projectPinSource": "\u6765\u6E90:\u672C\u673A task-overlay.json pinned / order",
@@ -1869,7 +1900,11 @@ var init_render2 = __esm({
1869
1900
  "panel.render.waitTrace": "{label}:{message}{outcome}",
1870
1901
  "panel.render.sessionIdentifier": "session:{id}",
1871
1902
  "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",
1903
+ "panel.render.protocolFileOperation": "\u5C06{verb}\u534F\u8BAE\u7684\u6587\u4EF6",
1904
+ "panel.render.protocolImpactLabel": "\u5BF9 harness \u4E0E\u9879\u76EE\u7684\u5F71\u54CD",
1905
+ "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",
1906
+ "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",
1907
+ "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
1908
  "panel.render.deleteLineNumber": "\u5220\u9664\u7B2C {line} \u884C",
1874
1909
  "panel.render.close": "\u5173\u95ED",
1875
1910
  "panel.render.language": "\u8BED\u8A00",
@@ -1939,7 +1974,7 @@ var init_render2 = __esm({
1939
1974
  "panel.render.confirmWrite": "\u786E\u8BA4\u5199\u5165",
1940
1975
  "panel.render.thePlanContainsNoFileChanges": "plan \u672A\u5305\u542B\u4EFB\u4F55\u6587\u4EF6\u53D8\u66F4",
1941
1976
  "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",
1977
+ "panel.render.filesToWriteNoBytesChange": "\u5C06\u5199\u5165\u7684\u6587\u4EF6",
1943
1978
  "panel.render.references": "\u5F15\u7528\u547D\u4E2D",
1944
1979
  "panel.render.matchesThesePlacesMentionItReported": "\u5904 \u2014 \u8FD9\u4E9B\u5730\u65B9\u63D0\u5230\u4E86\u5B83;\u53EA\u63D0\u9192,\u4E0D\u4FEE\u590D",
1945
1980
  "panel.render.backup": "\u5907\u4EFD",
@@ -2015,7 +2050,7 @@ var init_render2 = __esm({
2015
2050
  "panel.render.notObserved": "(\u672A\u89C2\u5BDF\u5230)",
2016
2051
  "panel.render.endedSessionEndOrNoEventsFor": "\u5DF2\u7ED3\u675F(SessionEnd,\u6216 Stop \u540E 10 \u5206\u949F\u65E0\u4E8B\u4EF6)",
2017
2052
  "panel.render.inProgress": "\u8FDB\u884C\u4E2D",
2018
- "panel.render.waitingForYouAnOpenPermission": "\u7B49\u4F60:\u6709\u672A\u51B3\u7684\u6743\u9650\u8BF7\u6C42/\u901A\u77E5",
2053
+ "panel.render.waitingForYouAnOpenPermission": "\u7B49\u5F85:\u6709\u672A\u51B3\u7684\u6743\u9650\u8BF7\u6C42/\u901A\u77E5",
2019
2054
  "panel.render.newActivitySinceLastViewed": "\u6709\u65B0\u6D3B\u52A8(\u4E0A\u6B21\u67E5\u770B\u540E)",
2020
2055
  "panel.render.newActivity": "\u65B0\u6D3B\u52A8",
2021
2056
  "panel.render.sinceWingmanStarted": "Wingman \u542F\u52A8(",
@@ -2033,7 +2068,7 @@ var init_render2 = __esm({
2033
2068
  "panel.render.firstInProgressTodoSourceTaskCreate": "\u7B2C\u4E00\u6761\u8FDB\u884C\u4E2D todo(\u6765\u6E90:transcript \u7684 TaskCreate/TaskUpdate \u4E8B\u4EF6)",
2034
2069
  "panel.render.latestUserPromptSummaryNoIn": "\u6700\u65B0\u7528\u6237\u63D0\u793A\u6458\u8981(\u672C\u4F1A\u8BDD\u6682\u65E0\u8FDB\u884C\u4E2D todo)",
2035
2070
  "panel.render.openEventAt": "\u672A\u51B3 {p0} \u4E8B\u4EF6,\u53D1\u751F\u4E8E {p1}",
2036
- "panel.render.waitingForYou": "\u7B49\u4F60:",
2071
+ "panel.render.waitingForYou": "\u7B49\u5F85:",
2037
2072
  "panel.render.totalTokensThisTurnReportedBy": "\u672C\u8F6E\u603B token(harness \u81EA\u62A5) = {p0}",
2038
2073
  "panel.render.contextThisTurnReportedByHarness": "\u672C\u8F6E context(harness \u81EA\u62A5) = {p0}",
2039
2074
  "panel.render.cumulativeInputThisTurnDifferenceIn": "\u672C\u8F6E\u7D2F\u8BA1 input(harness \u7D2F\u8BA1\u503C\u5DEE\u5206) = {p0}",
@@ -2204,7 +2239,7 @@ var init_render2 = __esm({
2204
2239
  "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
2240
  "panel.render.replaceLtProjectGtWithThe": "\uFF0C\u8FD0\u884C\u524D\u5C06 <\u9879\u76EE> \u66FF\u6362\u4E3A\u9879\u76EE\u8DEF\u5F84",
2206
2241
  "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",
2242
+ "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
2243
  "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
2244
  "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
2245
  "panel.render.reinstall": "\u91CD\u65B0\u5B89\u88C5",
@@ -2275,7 +2310,6 @@ var init_render2 = __esm({
2275
2310
  "panel.render.noPlanFile": "\u6CA1\u6709\u8BA1\u5212\u6587\u4EF6",
2276
2311
  "panel.render.planUnreadable": "\u8BA1\u5212\u4E0D\u53EF\u8BFB",
2277
2312
  "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
2313
  "panel.render.copyInstallCommandTip": "{p0} \xB7 \u590D\u5236\u5B89\u88C5\u547D\u4EE4",
2280
2314
  "panel.render.howToProvideAPlan": "\u5982\u4F55\u63D0\u4F9B\u8BA1\u5212",
2281
2315
  "panel.render.createAtTheProjectRoot": "\u5728\u9879\u76EE\u6839\u521B\u5EFA",
@@ -2286,7 +2320,9 @@ var init_render2 = __esm({
2286
2320
  "panel.render.pendingTask": "- [ ] \u5F85\u505A\u4EFB\u52A1",
2287
2321
  "panel.render.connectFeedbackSignals": "\u8FDE\u63A5\u53CD\u9988\u4FE1\u53F7 \xB7",
2288
2322
  "panel.render.notEnoughInformation": "\u4FE1\u606F\u4E0D\u8DB3:",
2289
- "panel.render.actionNotEnoughInformation": "\u4FE1\u606F\u4E0D\u8DB3",
2323
+ "panel.render.cannotReadPlanFile": "\u8BA1\u5212\u6587\u4EF6\u8BFB\u4E0D\u4E86",
2324
+ "panel.render.cannotSeeRequests": "\u770B\u4E0D\u5230\u8BF7\u6C42",
2325
+ "panel.render.projectEnded": "\u5DF2\u7ED3\u675F",
2290
2326
  "panel.render.sourceGETApiProjectsRequestOr": "\u6765\u6E90:GET /api/projects \u8BF7\u6C42\u6216\u8F7D\u8377\u6821\u9A8C\u5931\u8D25",
2291
2327
  "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
2328
  "panel.render.noProjectGoalProvided": "\u5C1A\u672A\u63D0\u4F9B\u9879\u76EE\u76EE\u6807",
@@ -2334,7 +2370,7 @@ var init_render2 = __esm({
2334
2370
  "panel.render.sourceProjectRoot": "\u6765\u6E90:project.root",
2335
2371
  "panel.render.sourceRevisionMtimeLastWriter": "\u6765\u6E90:revision / mtime / lastWriter",
2336
2372
  "panel.render.all": "\u5168\u90E8",
2337
- "panel.render.waitingForYouLabel": "\u7B49\u4F60",
2373
+ "panel.render.waitingForYouLabel": "\u7B49\u5F85",
2338
2374
  "panel.render.ended": "\u5DF2\u7ED3\u675F",
2339
2375
  "panel.render.status": "\u72B6\u6001",
2340
2376
  "panel.render.dataTipSourceGETApiProjects": ' data-tip="\u6765\u6E90:GET /api/projects \u8BF7\u6C42\u4E0E\u8F7D\u8377\u6821\u9A8C"',
@@ -2382,7 +2418,7 @@ var init_server2 = __esm({
2382
2418
  "cli.server.openTimeout": "\u5E94\u7528\u6FC0\u6D3B\u8D85\u65F6",
2383
2419
  "cli.server.openFailed": "\u5E94\u7528\u6FC0\u6D3B\u5931\u8D25",
2384
2420
  "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",
2421
+ "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
2422
  "cli.server.overlayHome": "\u4EFB\u52A1\u5361 overlay \u7F3A\u5C11 homeDir",
2387
2423
  "cli.server.licenseRead": "license \u6587\u4EF6\u8D85\u8FC7 64KB \u4E0A\u9650\u6216\u8BFB\u53D6\u5931\u8D25",
2388
2424
  "cli.server.panelBuild": "\u9762\u677F\u672A\u6784\u5EFA:\u8BF7\u5148\u8FD0\u884C pnpm --filter @wingman/panel build,\u518D\u5237\u65B0\u672C\u9875\u3002",
@@ -16302,6 +16338,39 @@ var init_scan2 = __esm({
16302
16338
  }
16303
16339
  });
16304
16340
 
16341
+ // packages/adapter-codex/dist/plugin-tools.js
16342
+ function recognizePluginTool(name, namespace, configuredPlugins) {
16343
+ const fullName = name.startsWith("mcp__") ? name : namespace?.startsWith("mcp__") ? `${namespace}__${name}` : void 0;
16344
+ if (!fullName)
16345
+ return void 0;
16346
+ const [prefix, segment, ...rest] = fullName.split("__");
16347
+ if (prefix !== "mcp" || !segment || ![segment, ...rest].every((part) => /^[a-zA-Z][a-zA-Z0-9_-]*$/.test(part))) {
16348
+ return void 0;
16349
+ }
16350
+ const plugins = configuredPlugins.map((configured2) => {
16351
+ const [plugin = ""] = configured2.split("@");
16352
+ return { plugin, normalized: plugin.replaceAll("-", "_") };
16353
+ });
16354
+ if (segment === "codex_apps") {
16355
+ const appTool = rest.join("__").replaceAll("-", "_");
16356
+ return plugins.filter(({ normalized }) => normalized && (appTool === normalized || appTool.startsWith(`${normalized}_`))).sort((a, b) => b.normalized.length - a.normalized.length)[0]?.plugin;
16357
+ }
16358
+ const configured = plugins.find(({ normalized }) => normalized === segment.replaceAll("-", "_"));
16359
+ if (configured)
16360
+ return configured.plugin;
16361
+ const alias = PLUGIN_TOOL_ALIASES.get(segment);
16362
+ if (!alias)
16363
+ return void 0;
16364
+ return plugins.find(({ normalized }) => normalized === alias.replaceAll("-", "_"))?.plugin ?? alias;
16365
+ }
16366
+ var PLUGIN_TOOL_ALIASES;
16367
+ var init_plugin_tools = __esm({
16368
+ "packages/adapter-codex/dist/plugin-tools.js"() {
16369
+ "use strict";
16370
+ PLUGIN_TOOL_ALIASES = /* @__PURE__ */ new Map([["cua_repl", "unified-computer-use"]]);
16371
+ }
16372
+ });
16373
+
16305
16374
  // packages/adapter-codex/dist/protocol.js
16306
16375
  import { existsSync as existsSync14, mkdirSync as mkdirSync9, readFileSync as readFileSync14, rmSync as rmSync7, writeFileSync as writeFileSync10 } from "node:fs";
16307
16376
  import { basename as basename10, dirname as dirname14, join as join21, resolve as resolve9 } from "node:path";
@@ -16549,6 +16618,7 @@ __export(dist_exports3, {
16549
16618
  installProtocolCodexUser: () => installProtocolCodexUser,
16550
16619
  protocolStatusCodex: () => protocolStatusCodex,
16551
16620
  protocolStatusCodexUser: () => protocolStatusCodexUser,
16621
+ recognizePluginTool: () => recognizePluginTool,
16552
16622
  resolveNodeExecutable: () => resolveNodeExecutable,
16553
16623
  uninstallProtocolCodex: () => uninstallProtocolCodex,
16554
16624
  uninstallProtocolCodexUser: () => uninstallProtocolCodexUser
@@ -16571,6 +16641,7 @@ var init_dist6 = __esm({
16571
16641
  init_hooks3();
16572
16642
  init_scan2();
16573
16643
  init_hooks3();
16644
+ init_plugin_tools();
16574
16645
  init_protocol3();
16575
16646
  init_protocol_user2();
16576
16647
  }
@@ -18913,11 +18984,19 @@ function patchTaskOverlay(homeDir, key, patch, now) {
18913
18984
  entry.pinned = patch.pinned;
18914
18985
  if (patch.hidden !== void 0)
18915
18986
  entry.hidden = patch.hidden;
18987
+ if (patch.archived === true) {
18988
+ entry.archived = true;
18989
+ entry.archivedAt = now.toISOString();
18990
+ } else if (patch.archived === false) {
18991
+ delete entry.archived;
18992
+ delete entry.archivedAt;
18993
+ entry.hidden = false;
18994
+ }
18916
18995
  if (patch.accepted === true)
18917
18996
  entry.accepted = { at: now.toISOString() };
18918
18997
  else if (patch.accepted === false)
18919
18998
  delete entry.accepted;
18920
- const empty = entry.title === void 0 && entry.pinned !== true && entry.hidden !== true && entry.accepted === void 0;
18999
+ const empty = entry.title === void 0 && entry.pinned !== true && entry.hidden !== true && entry.archived !== true && entry.accepted === void 0;
18921
19000
  const entries = { ...current.entries };
18922
19001
  if (empty)
18923
19002
  delete entries[key];
@@ -19028,10 +19107,10 @@ function isTaskOverlayEntry(value, key) {
19028
19107
  if (key.startsWith("project:")) {
19029
19108
  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
19109
  }
19031
- if (Object.keys(value).some((key2) => !["title", "pinned", "hidden", "accepted", "updatedAt"].includes(key2))) {
19110
+ if (Object.keys(value).some((key2) => !["title", "pinned", "hidden", "archived", "archivedAt", "accepted", "updatedAt"].includes(key2))) {
19032
19111
  return false;
19033
19112
  }
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";
19113
+ 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
19114
  }
19036
19115
  function isTaskAcceptance(value) {
19037
19116
  return isRecord7(value) && Object.keys(value).every((key) => key === "at") && typeof value.at === "string";
@@ -19066,7 +19145,7 @@ function resolveWingmanVersion({ defined, moduleUrl = import.meta.url, readPacka
19066
19145
  return void 0;
19067
19146
  }
19068
19147
  function wingmanVersion() {
19069
- const defined = false ? void 0 : "0.9.0";
19148
+ const defined = false ? void 0 : "0.9.1";
19070
19149
  return resolveWingmanVersion({
19071
19150
  defined,
19072
19151
  readPackage: (url) => JSON.parse(readFileSync17(url, "utf8"))
@@ -19095,6 +19174,7 @@ function acceptanceView(homeDir, overlay, key) {
19095
19174
  return accepted === void 0 ? { state: "none" } : { state: "accepted", at: accepted.at };
19096
19175
  }
19097
19176
  function createNarrativeService(options = {}) {
19177
+ let codexPluginsProvider = options.codexPlugins;
19098
19178
  const follow = options.followTranscripts ?? true;
19099
19179
  const intervalMs = options.intervalMs ?? 500;
19100
19180
  const now = options.now ?? (() => /* @__PURE__ */ new Date());
@@ -19712,37 +19792,53 @@ function createNarrativeService(options = {}) {
19712
19792
  session.dirty = true;
19713
19793
  notify(harness);
19714
19794
  }
19715
- function deriveCached(harness, session) {
19716
- if (!session.dirty && session.cached !== void 0 && session.cachedLocale === getLocale()) {
19795
+ function deriveCached(harness, session, configuredPlugins) {
19796
+ const pluginKey = JSON.stringify(configuredPlugins);
19797
+ if (!session.dirty && session.cached !== void 0 && session.cachedLocale === getLocale() && session.cachedCodexPlugins === pluginKey) {
19717
19798
  return session.cached;
19718
19799
  }
19719
- session.cached = derive(harness, session, now().toISOString());
19800
+ session.cached = derive(harness, session, now().toISOString(), configuredPlugins);
19720
19801
  session.dirty = false;
19721
19802
  session.cachedLocale = getLocale();
19803
+ session.cachedCodexPlugins = pluginKey;
19722
19804
  return session.cached;
19723
19805
  }
19724
19806
  function getOverview(harness) {
19725
19807
  const nowIso = now().toISOString();
19726
19808
  const sessions = sessionsOf(harness);
19809
+ let configuredPlugins = [];
19810
+ try {
19811
+ if (harness === "codex")
19812
+ configuredPlugins = codexPluginsProvider?.() ?? [];
19813
+ } catch {
19814
+ configuredPlugins = [];
19815
+ }
19727
19816
  const overlay = options.homeDir === void 0 ? void 0 : readTaskOverlay(options.homeDir);
19817
+ const overlayEntries = overlay === void 0 || "unavailable" in overlay ? {} : overlay.entries;
19728
19818
  let feedback;
19729
19819
  try {
19730
19820
  feedback = options.feedbackSignals?.(harness);
19731
19821
  } catch {
19732
19822
  feedback = void 0;
19733
19823
  }
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);
19824
+ const infos = [...sessions.values()].map((session) => {
19825
+ const user = overlayEntries[`${harness}:${session.id}`];
19826
+ const lastActivity = lastActivityOf(session);
19827
+ return {
19828
+ id: session.id,
19829
+ label: session.projectResolution?.isHome ? t("narrative.homeDirectory") : session.label ?? shortSessionId(session.id),
19830
+ ...session.cwd === void 0 ? {} : { cwd: session.cwd },
19831
+ lastActivity,
19832
+ waiting: session.waiting !== null,
19833
+ ended: isEnded(session, nowIso),
19834
+ archived: user?.archived === true,
19835
+ archivedHasNewActivity: user?.archived === true && user.archivedAt !== void 0 && Date.parse(lastActivity) > Date.parse(user.archivedAt),
19836
+ ...feedback === void 0 ? {} : { feedback }
19837
+ };
19838
+ }).sort((a, b) => a.lastActivity < b.lastActivity ? 1 : a.lastActivity > b.lastActivity ? -1 : 0);
19743
19839
  const states = {};
19744
19840
  for (const [id, session] of sessions) {
19745
- const state = deriveCached(harness, session);
19841
+ const state = deriveCached(harness, session, configuredPlugins);
19746
19842
  const verification = state.taskWorkflow?.verification;
19747
19843
  states[id] = state.taskWorkflow === void 0 ? state : {
19748
19844
  ...state,
@@ -19905,8 +20001,11 @@ function createNarrativeService(options = {}) {
19905
20001
  user: {
19906
20002
  ...userEntry?.title === void 0 ? {} : { title: userEntry.title },
19907
20003
  pinned: userEntry?.pinned ?? false,
19908
- hidden: userEntry?.hidden ?? false
20004
+ hidden: userEntry?.hidden ?? false,
20005
+ ...userEntry?.archived === void 0 ? {} : { archived: userEntry.archived },
20006
+ ...userEntry?.archivedAt === void 0 ? {} : { archivedAt: userEntry.archivedAt }
19909
20007
  },
20008
+ archivedHasNewActivity: info?.archivedHasNewActivity ?? false,
19910
20009
  ...session.cwd === void 0 ? {} : { cwd: session.cwd },
19911
20010
  ...info?.lastActivity === void 0 ? {} : { lastActivity: info.lastActivity },
19912
20011
  waiting: info?.waiting ?? false,
@@ -19976,19 +20075,14 @@ function createNarrativeService(options = {}) {
19976
20075
  lookedUp: resolution?.lookedUp ?? [planPath]
19977
20076
  };
19978
20077
  }
19979
- let projectUser = overlayEntries[`project:${root}`];
20078
+ const projectUser = overlayEntries[`project:${root}`];
19980
20079
  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
- }
20080
+ const archivedHasNewActivity = projectUser?.archived === true && projectUser.archivedAt !== void 0 && firstScreen.lastActivity !== void 0 && Date.parse(firstScreen.lastActivity.at) > Date.parse(projectUser.archivedAt);
19989
20081
  projects.push({
19990
20082
  firstScreen,
19991
20083
  root,
20084
+ ...resolution === void 0 ? {} : { isHome: resolution.isHome === true },
20085
+ archivedHasNewActivity,
19992
20086
  ...projectUser === void 0 ? {} : {
19993
20087
  user: {
19994
20088
  pinned: projectUser.pinned ?? false,
@@ -20055,8 +20149,15 @@ function createNarrativeService(options = {}) {
20055
20149
  for (const harness of HARNESS_IDS)
20056
20150
  notify(harness);
20057
20151
  }
20152
+ function refreshOverlay(harness) {
20153
+ for (const changed of harness === void 0 ? HARNESS_IDS : [harness])
20154
+ notify(changed);
20155
+ }
20058
20156
  loadRememberedProjectRoots();
20059
20157
  return {
20158
+ setCodexPluginsProvider(provider) {
20159
+ codexPluginsProvider = provider;
20160
+ },
20060
20161
  handleEvent,
20061
20162
  getState,
20062
20163
  getOverview,
@@ -20064,6 +20165,7 @@ function createNarrativeService(options = {}) {
20064
20165
  seedFixture,
20065
20166
  subscribe,
20066
20167
  refreshLocale,
20168
+ refreshOverlay,
20067
20169
  close
20068
20170
  };
20069
20171
  }
@@ -20111,6 +20213,7 @@ function deriveProjectFirstScreen(plan, goal, points, sessions) {
20111
20213
  ...session.feedback.message === void 0 ? {} : { text: session.feedback.message }
20112
20214
  });
20113
20215
  }
20216
+ const feedbackUnavailable = sessions.length > 0 && sessions.every((session) => session.feedback === void 0 || session.feedback.state === "unavailable");
20114
20217
  let action;
20115
20218
  if (requests.length > 0)
20116
20219
  action = { kind: "decision", items: requests, source: "sessions.feedback(state=needs_user)" };
@@ -20120,6 +20223,16 @@ function deriveProjectFirstScreen(plan, goal, points, sessions) {
20120
20223
  items: checkpoints,
20121
20224
  source: ".wingman/plan.md \u5F53\u524D\u70B9\u7956\u5148\u8DEF\u5F84 status / verification"
20122
20225
  };
20226
+ else if (plan.availability === "available" && currentPoints.length > 0 && sessions.some((session) => !session.ended) && !feedbackUnavailable)
20227
+ action = {
20228
+ kind: "in_progress",
20229
+ source: ".wingman/plan.md currentPoints; sessions.ended=false"
20230
+ };
20231
+ else if (sessions.length > 0 && sessions.every((session) => session.ended))
20232
+ action = {
20233
+ kind: "ended",
20234
+ source: "sessions.length>0; sessions.every(ended=true)"
20235
+ };
20123
20236
  else if (plan.availability === "missing")
20124
20237
  action = {
20125
20238
  kind: "insufficient",
@@ -20132,21 +20245,16 @@ function deriveProjectFirstScreen(plan, goal, points, sessions) {
20132
20245
  reason: "plan_unavailable",
20133
20246
  source: `plan.availability=unavailable; plan.reason: ${plan.reason}`
20134
20247
  };
20135
- else if (sessions.length > 0 && sessions.every((session) => session.feedback === void 0 || session.feedback.state === "unavailable"))
20248
+ else if (feedbackUnavailable)
20136
20249
  action = {
20137
20250
  kind: "insufficient",
20138
20251
  reason: "feedback_unavailable",
20139
20252
  source: "sessions.feedback.state=unavailable / feedback \u672A\u63D0\u4F9B"
20140
20253
  };
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
20254
  else
20147
20255
  action = {
20148
20256
  kind: "insufficient",
20149
- reason: "no_session",
20257
+ reason: "feedback_unavailable",
20150
20258
  source: `currentPoints.length=${currentPoints.length}; sessions(ended=false).length=${sessions.filter((session) => !session.ended).length}`
20151
20259
  };
20152
20260
  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 +20399,17 @@ function feedbackView(harness, capability, state) {
20291
20399
  }
20292
20400
  return state ?? { state: "no_open_request", source: `${harness} explicit feedback signals` };
20293
20401
  }
20402
+ function observedPlugins(lines2, configuredPlugins) {
20403
+ const names = /* @__PURE__ */ new Set();
20404
+ for (const line of lines2) {
20405
+ if (line.kind !== "tool_call" || line.name === void 0)
20406
+ continue;
20407
+ const plugin = recognizePluginTool(line.name, line.namespace, configuredPlugins);
20408
+ if (plugin !== void 0)
20409
+ names.add(plugin);
20410
+ }
20411
+ return [...names];
20412
+ }
20294
20413
  function observedSkills(lines2) {
20295
20414
  const names = /* @__PURE__ */ new Set();
20296
20415
  const validName = (value) => typeof value === "string" && /^[a-zA-Z0-9_.:-]+(?:\/[a-zA-Z0-9_.:-]+)*$/.test(value);
@@ -20326,7 +20445,7 @@ function observedSkills(lines2) {
20326
20445
  }
20327
20446
  return [...names];
20328
20447
  }
20329
- function derive(harness, session, nowIso) {
20448
+ function derive(harness, session, nowIso, configuredPlugins) {
20330
20449
  const codexLines = sortedCodexByTimestamp(session.codexLines);
20331
20450
  const lines2 = harness === "codex" ? adaptCodexNarrativeLines(codexLines) : sortedByTimestamp(session.lines);
20332
20451
  const timeline = deriveTodoTimeline(extractTodoSnapshots(lines2));
@@ -20470,11 +20589,13 @@ function derive(harness, session, nowIso) {
20470
20589
  }
20471
20590
  };
20472
20591
  const skillsUsed = harness === "cc" ? observedSkills(lines2) : [];
20592
+ const pluginsUsed = harness === "codex" ? observedPlugins(codexLines, configuredPlugins) : [];
20473
20593
  return {
20474
20594
  harness,
20475
20595
  sessionId: session.id,
20476
20596
  transcriptPath: session.transcriptPath ?? null,
20477
20597
  ...skillsUsed.length === 0 ? {} : { skillsUsed },
20598
+ ...pluginsUsed.length === 0 ? {} : { pluginsUsed },
20478
20599
  ...session.cwd === void 0 ? {} : { cwd: session.cwd },
20479
20600
  ...session.cwd === void 0 ? {} : {
20480
20601
  project: {
@@ -21691,6 +21812,7 @@ var LOCAL_HOST = /^(?:127\.0\.0\.1|localhost)(?::\d+)?$|^\[::1\](?::\d+)?$/i;
21691
21812
  function createWingmanServer(options) {
21692
21813
  const warn = options.warn ?? ((message) => console.error(message));
21693
21814
  const runtime = { anatomy: null };
21815
+ 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)) ?? []);
21694
21816
  return createServer({ requireHostHeader: false }, (req, res) => {
21695
21817
  handle(req, res, options, warn, runtime).catch((error) => {
21696
21818
  warn(t("cli.server.requestFailed", { error: errorMessage3(error) }));
@@ -21827,6 +21949,8 @@ async function handle(req, res, options, warn, runtime) {
21827
21949
  });
21828
21950
  return;
21829
21951
  }
21952
+ if (harness === "codex")
21953
+ await cachedAnatomy(options, warn, runtime);
21830
21954
  const overview = options.narrative.getOverview(harness);
21831
21955
  if (overview.sessions.length > 0) {
21832
21956
  const config = (await cachedAnatomy(options, warn, runtime)).find((c) => c.harness === harness);
@@ -21843,6 +21967,7 @@ async function handle(req, res, options, warn, runtime) {
21843
21967
  }
21844
21968
  if (url.pathname === "/api/anatomy") {
21845
21969
  const configs = await scanAll(options.harnesses, warn);
21970
+ runtime.anatomy = { at: Date.now(), configs };
21846
21971
  const anatomy = configs.map((config) => {
21847
21972
  const scanOptions = options.harnesses.find((entry) => entry.harness === config.harness)?.scanOptions;
21848
21973
  const homeDir = scanOptions?.homeDir ?? options.homeDir;
@@ -22223,6 +22348,7 @@ async function handleTaskOverlay(req, res, options) {
22223
22348
  sendJson2(res, 409, { error: result5.unavailable });
22224
22349
  return;
22225
22350
  }
22351
+ options.narrative?.refreshOverlay("root" in body ? void 0 : body.harness);
22226
22352
  sendJson2(res, 200, { key, entry: result5.entry });
22227
22353
  }
22228
22354
  var LICENSE_BODY_LIMIT = 64 * 1024;
@@ -22315,10 +22441,10 @@ function isTaskOverlayRequest(value) {
22315
22441
  if (!isRecord9(value.patch))
22316
22442
  return false;
22317
22443
  const keys = Object.keys(value.patch);
22318
- if (keys.length === 0 || keys.some((key) => !["title", "pinned", "hidden", "accepted"].includes(key))) {
22444
+ if (keys.length === 0 || keys.some((key) => !["title", "pinned", "hidden", "archived", "accepted"].includes(key))) {
22319
22445
  return false;
22320
22446
  }
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");
22447
+ 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
22448
  }
22323
22449
  function isProjectOverlayRequest(value) {
22324
22450
  if (!isRecord9(value) || typeof value.root !== "string" || value.root.trim() === "")