harness-wingman 0.9.2 → 0.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -313,6 +313,8 @@ var init_labels = __esm({
313
313
  "packages/i18n/dist/catalog/en/labels.js"() {
314
314
  "use strict";
315
315
  labels_default = {
316
+ "panel.source.codexProject": "Codex project",
317
+ "panel.source.codexUngrouped": "Codex ungrouped",
316
318
  "panel.source.planStep": "plan.md step",
317
319
  "panel.source.planInstruction": "Instruction for the plan",
318
320
  "panel.source.latestInstruction": "Latest instruction",
@@ -350,6 +352,7 @@ var init_narrative = __esm({
350
352
  "packages/i18n/dist/catalog/en/narrative.js"() {
351
353
  "use strict";
352
354
  narrative_default = {
355
+ "narrative.codexUngrouped": "Ungrouped",
353
356
  "narrative.noStateDirectory": "No local state directory is configured",
354
357
  "narrative.acceptanceUnreadable": "Local acceptance state could not be read",
355
358
  "narrative.homeDirectory": "No project directory (home)",
@@ -615,6 +618,29 @@ var init_render = __esm({
615
618
  "packages/i18n/dist/catalog/en/render.js"() {
616
619
  "use strict";
617
620
  render_default = {
621
+ "panel.render.originExec": "Codex CLI \xB7 exec",
622
+ "panel.render.originCli": "Codex CLI",
623
+ "panel.render.originDesktop": "Codex Desktop",
624
+ "panel.render.originSource": "Source: session_meta.originator / source",
625
+ "panel.render.projectsPageTitle": "Project overview",
626
+ "panel.render.projectsPageHint": "Goals, progress and decisions across your coding apps.",
627
+ "panel.render.controlsPageHint": "Manage tools, preferences and how you return to a session.",
628
+ "panel.render.optionalSuggestions": "Optional suggestions",
629
+ "panel.render.suggestionsHint": "Based on observed session activity, for reference only. Review changes before applying.",
630
+ "panel.render.usagePageHint": "Reported usage and estimated context, kept separate.",
631
+ "panel.render.toolsAndPreferences": "Tools & preferences",
632
+ "panel.render.controlSkills": "Skills & plugins",
633
+ "panel.render.controlTools": "Tools & connections",
634
+ "panel.render.controlBehavior": "Behavior & permissions",
635
+ "panel.render.controlSummary": "{count} items \xB7 {enabled} enabled",
636
+ "panel.render.controlSummarySource": "Source: total toggleable entries and enabled entries in scanned slots.{slot}[]; this does not prove session use",
637
+ "panel.render.controlSettingsCount": "{count} settings",
638
+ "panel.render.codexPluginControlHint": "Codex plugins: controls the whole plugin package, not an individual skill.",
639
+ "panel.render.contextSources": "Explore context sources",
640
+ "panel.render.requestsUnavailable": "Requests unavailable \xB7 view details",
641
+ "panel.render.localFeedStatus": "Local feed \xB7 {status}",
642
+ "panel.render.appFilter": "App",
643
+ "panel.render.codexSessionsInProject": "Codex sessions are in project {name}",
618
644
  "panel.render.olderSessions": "{count} older sessions",
619
645
  "panel.render.olderSessionsSource": "Source: sessions.ended and lastActivity more than {days} days ago; display only",
620
646
  "panel.render.archiveSession": "Archive",
@@ -626,16 +652,21 @@ var init_render = __esm({
626
652
  "panel.render.ccPartial": "Partly restricted",
627
653
  "panel.render.ccDisableAll": "Disable all",
628
654
  "panel.render.ccPartialWarning": "Only some messaging tools are denied. Disable all denies both SendMessage and ListAgents.",
629
- "panel.render.ccFeatures": "Claude Code features",
655
+ "panel.render.ccFeatures": "Claude Code settings",
656
+ "panel.render.ccSettingsHint": "Changes local user settings, not just the selected session. Review changes before confirming.",
657
+ "panel.render.ccMessageHelp": "What this changes",
658
+ "panel.render.ccInboundHelp": "Controls messages from other Claude Code sessions. Accept delivers messages to Claude. Hold shows a notice without delivery, until an effective setting allows acceptance. Refuse discards them.",
659
+ "panel.render.ccInboundImpact": "This does not control your chat input. Delivered messages can start a new turn in an idle session and incur usage. They do not automatically include the sender\u2019s full history or files; the recipient\u2019s own permissions still apply.",
660
+ "panel.render.ccOutboundHelp": "Lets Claude find and message other sessions, for example to share a task result. Enabling only removes these send and discovery tool denials; other permission rules still apply.",
630
661
  "panel.render.ccAutoMemory": "Auto memory",
631
- "panel.render.ccInbound": "Receive messages from other sessions",
632
- "panel.render.ccOutbound": "Send messages to other sessions",
662
+ "panel.render.ccInbound": "Messages from other Claude sessions",
663
+ "panel.render.ccOutbound": "Allow Claude to send messages",
633
664
  "panel.render.ccDefault": "Default",
634
665
  "panel.render.ccByPermissionMode": "Determined by permission mode",
635
666
  "panel.render.ccAccept": "Accept",
636
667
  "panel.render.ccHold": "Hold",
637
668
  "panel.render.ccRefuse": "Refuse",
638
- "panel.render.ccOutboundWarning": "Also disables messages to subagents and agent teams",
669
+ "panel.render.ccOutboundWarning": "Disabling denies both SendMessage and ListAgents. It stops cross-session sending and also restricts communication with subagents (assistants Claude delegates to) and agent-team members. Receiving is controlled separately above.",
639
670
  "panel.render.ccOverridden": "Overridden by {layer}; changes here have no effect",
640
671
  "panel.render.ccLayerProject": "project settings",
641
672
  "panel.render.ccLayerLocal": "project-local settings",
@@ -657,6 +688,8 @@ var init_render = __esm({
657
688
  "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",
658
689
  "panel.render.skillOverridesSource": "Source: settings skillOverrides; disabled in configuration",
659
690
  "panel.render.skillConfiguration": "Configuration",
691
+ "panel.render.dshControlsSummary": "{count} items \xB7 {enabled} enabled",
692
+ "panel.render.dshControlsSummarySource": "Source: total toggleable entries and enabled entries in slots.{slot}[] scanned from dsh --dump-config; configuration enablement does not prove session use",
660
693
  "panel.render.plugins": "Plugins",
661
694
  "panel.render.pluginConfigurationTip": "Configuration enablement does not prove session use; usage comes from the Codex transcript",
662
695
  "panel.render.pluginsSummary": "{enabled} plugins enabled \xB7 {used} used this session",
@@ -697,6 +730,18 @@ var init_render = __esm({
697
730
  "panel.render.deleteLineNumber": "Delete line {line}",
698
731
  "panel.render.close": "Close",
699
732
  "panel.render.language": "Language",
733
+ "panel.render.noConversationObserved": "No conversation observed yet",
734
+ "panel.render.conversationDetailsPending": "Waiting for conversation details",
735
+ "panel.render.conversationDetailsPendingHint": "A conversation was observed. Its details will appear here when available. If nothing updates, check the connection details.",
736
+ "panel.render.checkConnection": "Check your connection",
737
+ "panel.render.startConversationHint": "Start or continue a conversation in {harness}. Your tasks and progress will appear here.",
738
+ "panel.render.checkConnectionHint": "Activity from {harness} is not yet confirmed. Check the connection settings, then start a conversation in the app.",
739
+ "panel.render.conversationNotShowing": "Already started, but nothing here?",
740
+ "panel.render.viewConnectionSettings": "View connection settings",
741
+ "panel.render.connectionDetails": "Connection details",
742
+ "panel.render.connectionInstallCommand": "If you need to reconnect, use this command",
743
+ "panel.render.planDisplaySettings": "Plan display settings",
744
+ "panel.render.helpAndFeedback": "Help & feedback",
700
745
  "panel.render.apiAnatomyReturnedAnEmptyArray": "/api/anatomy returned an empty array",
701
746
  "panel.render.noHarnessDetected": "No harness detected",
702
747
  "panel.render.firstRun": "First run",
@@ -705,9 +750,6 @@ var init_render = __esm({
705
750
  "panel.render.sourceClickToExpandThePanel": "{p0} \xB7 {p1}{p2}\nSource: {p3}; click to expand the panel",
706
751
  "panel.render.compactPillSource": "{p0} \xB7 {p1}{p2}\nSource: {p3}",
707
752
  "panel.render.project": "Project",
708
- "panel.render.inTheLiveStream": "In the live stream",
709
- "panel.render.events": "events",
710
- "panel.render.entries": "entries",
711
753
  "panel.render.residentTok": "Resident {p0} tok",
712
754
  "panel.render.residentTotal": "Resident total",
713
755
  "panel.render.totalResidentTokensOfEnabledItems": "Total = resident tokens of enabled items across all slots; ",
@@ -720,7 +762,7 @@ var init_render = __esm({
720
762
  "panel.render.sourcePanelTimeOfTheLast": "Source: panel time of the last successful GET /api/anatomy",
721
763
  "panel.render.refreshFailedShowingDataFrom": "Refresh failed; showing data from",
722
764
  "panel.render.dataSuffix": "",
723
- "panel.render.contextBreakdown": "CONTEXT breakdown",
765
+ "panel.render.contextBreakdown": "Context estimate",
724
766
  "panel.render.previewTheCompleteContentBeforeSending": "Preview the complete content before sending; remove individual lines and select Send to submit; closing sends nothing",
725
767
  "panel.render.shareConfigurationSample": "Share configuration sample",
726
768
  "panel.render.thisItemIsDisabledToggleableItems": "This item is disabled; toggleable items can be enabled in CONFIGURE below",
@@ -952,7 +994,7 @@ var init_render = __esm({
952
994
  "panel.render.noExecutionEvidenceYet": "\u25CB No execution evidence yet",
953
995
  "panel.render.tasks": "Tasks",
954
996
  "panel.render.controls": "Controls",
955
- "panel.render.billing": "Billing",
997
+ "panel.render.billing": "Usage",
956
998
  "panel.render.turns": "{p0} turns",
957
999
  "panel.render.approx": " \xB7 Approx. {p0}",
958
1000
  "panel.render.subagent": "Subagent",
@@ -1135,12 +1177,17 @@ var init_render = __esm({
1135
1177
  "panel.render.branchCurrentPointsSource": "Source: currentPoints within this top-level node subtree",
1136
1178
  "panel.render.noCurrentBranchProvided": "No current branch provided",
1137
1179
  "panel.render.currentTaskLabel": "Current task",
1180
+ "panel.render.morePoints": "{count} more items",
1181
+ "panel.render.oneMorePoint": "{count} more item",
1138
1182
  "panel.render.sourceFirstScreenCurrentPointsLength": "Source: firstScreen.currentPoints.length",
1139
1183
  "panel.render.parallel": "Parallel",
1140
1184
  "panel.render.thePlanHasNoStepMarked": "The plan has no step marked in progress",
1141
1185
  "panel.render.recentActivityLabel": "Recent activity",
1142
1186
  "panel.render.thePlanHasNoSteps": "The plan has no steps",
1143
1187
  "panel.render.planTree": "Plan tree",
1188
+ "panel.render.fullRecord": "Full record",
1189
+ "panel.render.completedMilestones": "{count} completed \xB7 Latest: {name}",
1190
+ "panel.render.completedMilestonesSource": "Source: completed or cancelled top-level plan.nodes; latest in document order",
1144
1191
  "panel.render.sessionsNotLinkedToAStep": "Sessions not linked to a step",
1145
1192
  "panel.render.sourcePlanLastGood": "Source: plan.lastGood",
1146
1193
  "panel.render.lastReadableVersion": "Last readable version",
@@ -1541,6 +1588,8 @@ var init_labels2 = __esm({
1541
1588
  "packages/i18n/dist/catalog/zh/labels.js"() {
1542
1589
  "use strict";
1543
1590
  labels_default2 = {
1591
+ "panel.source.codexProject": "Codex \u9879\u76EE",
1592
+ "panel.source.codexUngrouped": "Codex \u672A\u5206\u7EC4",
1544
1593
  "panel.source.planStep": "plan.md \u6B65\u9AA4",
1545
1594
  "panel.source.planInstruction": "\u8BA1\u5212\u6240\u5C5E\u6307\u4EE4",
1546
1595
  "panel.source.latestInstruction": "\u6700\u65B0\u6307\u4EE4",
@@ -1578,6 +1627,7 @@ var init_narrative2 = __esm({
1578
1627
  "packages/i18n/dist/catalog/zh/narrative.js"() {
1579
1628
  "use strict";
1580
1629
  narrative_default2 = {
1630
+ "narrative.codexUngrouped": "\u672A\u5206\u7EC4",
1581
1631
  "narrative.noStateDirectory": "\u672A\u914D\u7F6E\u672C\u673A\u72B6\u6001\u76EE\u5F55",
1582
1632
  "narrative.acceptanceUnreadable": "\u672C\u673A\u9A8C\u6536\u72B6\u6001\u4E0D\u53EF\u8BFB",
1583
1633
  "narrative.homeDirectory": "\u65E0\u9879\u76EE\u76EE\u5F55(\u5BB6\u76EE\u5F55)",
@@ -1843,6 +1893,29 @@ var init_render2 = __esm({
1843
1893
  "packages/i18n/dist/catalog/zh/render.js"() {
1844
1894
  "use strict";
1845
1895
  render_default2 = {
1896
+ "panel.render.originExec": "Codex CLI \xB7 exec",
1897
+ "panel.render.originCli": "Codex CLI",
1898
+ "panel.render.originDesktop": "Codex \u684C\u9762\u7248",
1899
+ "panel.render.originSource": "\u6765\u6E90:session_meta.originator / source",
1900
+ "panel.render.projectsPageTitle": "\u9879\u76EE\u603B\u89C8",
1901
+ "panel.render.projectsPageHint": "\u96C6\u4E2D\u67E5\u770B\u5404\u4E2A\u7F16\u7A0B\u5DE5\u5177\u4E2D\u7684\u76EE\u6807\u3001\u8FDB\u5EA6\u548C\u5F85\u51B3\u4E8B\u9879\u3002",
1902
+ "panel.render.controlsPageHint": "\u7BA1\u7406\u5DE5\u5177\u3001\u504F\u597D\u8BBE\u7F6E\uFF0C\u4EE5\u53CA\u8FD4\u56DE\u4F1A\u8BDD\u7684\u65B9\u5F0F\u3002",
1903
+ "panel.render.optionalSuggestions": "\u53EF\u9009\u4F18\u5316\u5EFA\u8BAE",
1904
+ "panel.render.suggestionsHint": "\u6839\u636E\u5F53\u524D\u4F1A\u8BDD\u8BB0\u5F55\u751F\u6210\uFF0C\u4EC5\u4F9B\u53C2\u8003\u3002\u5E94\u7528\u524D\u8BF7\u67E5\u770B\u65B9\u6848\u3002",
1905
+ "panel.render.usagePageHint": "\u5B9E\u9645\u62A5\u544A\u7684\u7528\u91CF\u4E0E\u4E0A\u4E0B\u6587\u4F30\u7B97\uFF0C\u5206\u5F00\u5C55\u793A\u3002",
1906
+ "panel.render.toolsAndPreferences": "\u5DE5\u5177\u4E0E\u504F\u597D",
1907
+ "panel.render.controlSkills": "\u6280\u80FD\u4E0E\u63D2\u4EF6",
1908
+ "panel.render.controlTools": "\u5DE5\u5177\u4E0E\u8FDE\u63A5",
1909
+ "panel.render.controlBehavior": "\u884C\u4E3A\u4E0E\u6743\u9650",
1910
+ "panel.render.controlSummary": "\u5171 {count} \u9879 \xB7 \u5DF2\u542F\u7528 {enabled} \u9879",
1911
+ "panel.render.controlSummarySource": "\u6765\u6E90:\u626B\u63CF\u7684 slots.{slot}[] \u4E2D\u53EF\u5F00\u5173\u6761\u76EE\u7684\u603B\u6570\u4E0E enabled \u6570\uFF1B\u4E0D\u4EE3\u8868\u5F53\u524D\u4F1A\u8BDD\u5B9E\u9645\u4F7F\u7528",
1912
+ "panel.render.controlSettingsCount": "{count} \u9879\u8BBE\u7F6E",
1913
+ "panel.render.codexPluginControlHint": "Codex \u63D2\u4EF6\uFF1A\u8FD9\u91CC\u63A7\u5236\u6574\u4E2A\u63D2\u4EF6\u5305\uFF0C\u4E0D\u662F\u5355\u4E2A\u6280\u80FD\u3002",
1914
+ "panel.render.contextSources": "\u67E5\u770B\u4E0A\u4E0B\u6587\u6765\u6E90",
1915
+ "panel.render.requestsUnavailable": "\u6682\u65F6\u65E0\u6CD5\u89C2\u5BDF\u8BF7\u6C42 \xB7 \u67E5\u770B\u8BE6\u60C5",
1916
+ "panel.render.localFeedStatus": "\u672C\u5730\u6570\u636E\u6D41 \xB7 {status}",
1917
+ "panel.render.appFilter": "\u5E94\u7528",
1918
+ "panel.render.codexSessionsInProject": "Codex \u4F1A\u8BDD\u5728\u9879\u76EE {name} \u4E0B",
1846
1919
  "panel.render.olderSessions": "\u66F4\u65E9\u7684 {count} \u4E2A\u4F1A\u8BDD",
1847
1920
  "panel.render.olderSessionsSource": "\u6765\u6E90:sessions.ended \u4E14 lastActivity \u65E9\u4E8E\u5F53\u524D\u65F6\u95F4 {days} \u5929;\u4EC5\u6298\u53E0\u663E\u793A",
1848
1921
  "panel.render.archiveSession": "\u5F52\u6863",
@@ -1854,16 +1927,21 @@ var init_render2 = __esm({
1854
1927
  "panel.render.ccPartial": "\u90E8\u5206\u53D7\u9650",
1855
1928
  "panel.render.ccDisableAll": "\u5168\u90E8\u5173\u95ED",
1856
1929
  "panel.render.ccPartialWarning": "\u4EC5\u7981\u7528\u4E86\u90E8\u5206\u6D88\u606F\u5DE5\u5177\uFF1B\u5168\u90E8\u5173\u95ED\u4F1A\u540C\u65F6\u62D2\u7EDD SendMessage \u4E0E ListAgents\u3002",
1857
- "panel.render.ccFeatures": "Claude Code \u529F\u80FD",
1930
+ "panel.render.ccFeatures": "Claude Code \u8BBE\u7F6E",
1931
+ "panel.render.ccSettingsHint": "\u4FEE\u6539\u672C\u673A\u7528\u6237\u7EA7\u914D\u7F6E\uFF0C\u4E0D\u53EA\u5F71\u54CD\u5F53\u524D\u4F1A\u8BDD\u3002\u786E\u8BA4\u524D\u53EF\u67E5\u770B\u6539\u52A8\u3002",
1932
+ "panel.render.ccMessageHelp": "\u4E86\u89E3\u5F71\u54CD",
1933
+ "panel.render.ccInboundHelp": "\u5904\u7406\u5176\u4ED6 Claude Code \u4F1A\u8BDD\u53D1\u6765\u7684\u6D88\u606F\u3002\u63A5\u6536\uFF1A\u4EA4\u7ED9 Claude\uFF1B\u6682\u5B58\uFF1A\u5148\u663E\u793A\u6536\u5230\u63D0\u793A\uFF0C\u4E0D\u4EA4\u7ED9 Claude\uFF0C\u4E4B\u540E\u6709\u6548\u8BBE\u7F6E\u5141\u8BB8\u63A5\u6536\u65F6\u518D\u4EA4\u4ED8\uFF1B\u62D2\u7EDD\uFF1A\u4E22\u5F03\u6D88\u606F\u3002",
1934
+ "panel.render.ccInboundImpact": "\u8FD9\u4E0D\u662F\u4F60\u7684\u804A\u5929\u8F93\u5165\u5F00\u5173\u3002\u6536\u5230\u5E76\u4EA4\u4ED8\u7684\u6D88\u606F\u53EF\u80FD\u8BA9\u7A7A\u95F2\u7684 Claude \u5F00\u59CB\u65B0\u4E00\u8F6E\u5904\u7406\uFF0C\u4EA7\u751F\u7528\u91CF\uFF1B\u4E0D\u4F1A\u81EA\u52A8\u9644\u5E26\u53D1\u9001\u65B9\u7684\u5B8C\u6574\u5BF9\u8BDD\u6216\u6587\u4EF6\uFF0C\u63A5\u6536\u65B9\u4ECD\u9075\u5B88\u81EA\u8EAB\u6743\u9650\u3002",
1935
+ "panel.render.ccOutboundHelp": "\u5141\u8BB8 Claude \u67E5\u627E\u5176\u4ED6\u4F1A\u8BDD\u5E76\u53D1\u9001\u6D88\u606F\uFF0C\u4F8B\u5982\u628A\u5B8C\u6210\u60C5\u51B5\u544A\u8BC9\u53E6\u4E00\u4E2A\u4EFB\u52A1\u3002\u5F00\u542F\u53EA\u79FB\u9664\u8FD9\u91CC\u5BF9\u53D1\u9001\u548C\u67E5\u627E\u5DE5\u5177\u7684\u7981\u7528\uFF0C\u4ECD\u53D7\u5176\u4ED6\u6743\u9650\u8BBE\u7F6E\u9650\u5236\u3002",
1858
1936
  "panel.render.ccAutoMemory": "Auto memory",
1859
- "panel.render.ccInbound": "\u63A5\u6536\u5176\u4ED6\u4F1A\u8BDD\u7684\u6D88\u606F",
1860
- "panel.render.ccOutbound": "\u5411\u5176\u4ED6\u4F1A\u8BDD\u53D1\u6D88\u606F",
1937
+ "panel.render.ccInbound": "\u63A5\u6536\u5176\u4ED6 Claude \u4F1A\u8BDD\u7684\u6D88\u606F",
1938
+ "panel.render.ccOutbound": "\u5141\u8BB8 Claude \u53D1\u9001\u6D88\u606F",
1861
1939
  "panel.render.ccDefault": "\u9ED8\u8BA4",
1862
1940
  "panel.render.ccByPermissionMode": "\u6309\u6743\u9650\u6A21\u5F0F\u51B3\u5B9A",
1863
1941
  "panel.render.ccAccept": "\u63A5\u6536",
1864
1942
  "panel.render.ccHold": "\u6682\u5B58",
1865
1943
  "panel.render.ccRefuse": "\u62D2\u7EDD",
1866
- "panel.render.ccOutboundWarning": "\u540C\u65F6\u7981\u6389\u5BF9\u5B50\u4EE3\u7406\u4E0E agent team \u7684\u6D88\u606F",
1944
+ "panel.render.ccOutboundWarning": "\u5173\u95ED\u4F1A\u540C\u65F6\u7981\u7528 SendMessage \u548C ListAgents\uFF1B\u4E0D\u4EC5\u505C\u6B62\u8DE8\u4F1A\u8BDD\u53D1\u6D88\u606F\uFF0C\u4E5F\u4F1A\u9650\u5236 Claude \u4E0E\u5B50\u4EE3\u7406\uFF08\u5B83\u5206\u6D3E\u51FA\u53BB\u7684\u52A9\u624B\uFF09\u548C Agent \u56E2\u961F\u6210\u5458\u7684\u901A\u4FE1\u3002\u63A5\u6536\u6D88\u606F\u7531\u4E0A\u9762\u7684\u8BBE\u7F6E\u5355\u72EC\u63A7\u5236\u3002",
1867
1945
  "panel.render.ccOverridden": "\u88AB {layer} \u8986\u76D6\uFF0C\u6B64\u5904\u6539\u52A8\u4E0D\u751F\u6548",
1868
1946
  "panel.render.ccLayerProject": "\u9879\u76EE\u5C42",
1869
1947
  "panel.render.ccLayerLocal": "\u9879\u76EE\u672C\u5730\u5C42",
@@ -1885,6 +1963,8 @@ var init_render2 = __esm({
1885
1963
  "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",
1886
1964
  "panel.render.skillOverridesSource": "\u6765\u6E90:settings skillOverrides;\u914D\u7F6E\u5DF2\u7981\u7528",
1887
1965
  "panel.render.skillConfiguration": "\u914D\u7F6E\u7EA7",
1966
+ "panel.render.dshControlsSummary": "\u5171 {count} \u9879 \xB7 \u5DF2\u542F\u7528 {enabled} \u9879",
1967
+ "panel.render.dshControlsSummarySource": "\u6765\u6E90:dsh --dump-config \u626B\u63CF slots.{slot}[] \u4E2D toggleable \u6761\u76EE\u7684\u603B\u6570\u4E0E enabled \u6570\uFF1B\u914D\u7F6E\u542F\u7528\u4E0D\u7B49\u4E8E\u4F1A\u8BDD\u4F7F\u7528",
1888
1968
  "panel.render.plugins": "\u63D2\u4EF6",
1889
1969
  "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
1970
  "panel.render.pluginsSummary": "{enabled} \u4E2A\u63D2\u4EF6\u5DF2\u542F\u7528 \xB7 \u672C\u4F1A\u8BDD\u7528\u5230 {used} \u4E2A",
@@ -1925,6 +2005,18 @@ var init_render2 = __esm({
1925
2005
  "panel.render.deleteLineNumber": "\u5220\u9664\u7B2C {line} \u884C",
1926
2006
  "panel.render.close": "\u5173\u95ED",
1927
2007
  "panel.render.language": "\u8BED\u8A00",
2008
+ "panel.render.noConversationObserved": "\u8FD8\u6CA1\u6709\u89C2\u5BDF\u5230\u4F1A\u8BDD",
2009
+ "panel.render.conversationDetailsPending": "\u6B63\u5728\u7B49\u5F85\u4F1A\u8BDD\u8BE6\u60C5",
2010
+ "panel.render.conversationDetailsPendingHint": "\u5DF2\u6536\u5230\u4F1A\u8BDD\u4FE1\u606F\u3002\u8BE6\u60C5\u53EF\u7528\u540E\u4F1A\u663E\u793A\u5728\u8FD9\u91CC\uFF1B\u5982\u679C\u4E00\u76F4\u6CA1\u6709\u66F4\u65B0\uFF0C\u8BF7\u67E5\u770B\u8FDE\u63A5\u8BE6\u60C5\u3002",
2011
+ "panel.render.checkConnection": "\u5148\u68C0\u67E5\u8FDE\u63A5\u8BBE\u7F6E",
2012
+ "panel.render.startConversationHint": "\u5728 {harness} \u4E2D\u5F00\u59CB\u6216\u7EE7\u7EED\u5BF9\u8BDD\uFF0C\u4EFB\u52A1\u548C\u8FDB\u5C55\u4F1A\u51FA\u73B0\u5728\u8FD9\u91CC\u3002",
2013
+ "panel.render.checkConnectionHint": "\u5C1A\u672A\u786E\u8BA4 {harness} \u7684\u6D3B\u52A8\u63A5\u5165\u3002\u67E5\u770B\u8FDE\u63A5\u8BBE\u7F6E\u540E\uFF0C\u5728\u539F\u5E94\u7528\u4E2D\u5F00\u59CB\u5BF9\u8BDD\u3002",
2014
+ "panel.render.conversationNotShowing": "\u5DF2\u7ECF\u5F00\u59CB\u5BF9\u8BDD\uFF0C\u4F46\u6CA1\u6709\u663E\u793A\uFF1F",
2015
+ "panel.render.viewConnectionSettings": "\u67E5\u770B\u8FDE\u63A5\u8BBE\u7F6E",
2016
+ "panel.render.connectionDetails": "\u8FDE\u63A5\u8BE6\u60C5",
2017
+ "panel.render.connectionInstallCommand": "\u9700\u8981\u91CD\u65B0\u63A5\u5165\u65F6\uFF0C\u53EF\u4F7F\u7528\u6B64\u547D\u4EE4\uFF1A",
2018
+ "panel.render.planDisplaySettings": "\u8BA1\u5212\u663E\u793A\u8BBE\u7F6E",
2019
+ "panel.render.helpAndFeedback": "\u5E2E\u52A9\u4E0E\u53CD\u9988",
1928
2020
  "panel.render.apiAnatomyReturnedAnEmptyArray": "/api/anatomy \u8FD4\u56DE\u4E86\u7A7A\u6570\u7EC4",
1929
2021
  "panel.render.noHarnessDetected": "\u672A\u68C0\u6D4B\u5230 harness",
1930
2022
  "panel.render.firstRun": "\u5148\u8FD0\u884C",
@@ -1933,9 +2025,6 @@ var init_render2 = __esm({
1933
2025
  "panel.render.sourceClickToExpandThePanel": "{p0} \xB7 {p1}{p2}\n\u6765\u6E90:{p3};\u70B9\u51FB\u5C55\u5F00\u9762\u677F",
1934
2026
  "panel.render.compactPillSource": "{p0} \xB7 {p1}{p2}\n\u6765\u6E90:{p3}",
1935
2027
  "panel.render.project": "\u9879\u76EE",
1936
- "panel.render.inTheLiveStream": "\u5B9E\u51B5\u6D41\u5185",
1937
- "panel.render.events": "\u4E8B\u4EF6",
1938
- "panel.render.entries": "\u6761",
1939
2028
  "panel.render.residentTok": "\u5E38\u9A7B {p0} tok",
1940
2029
  "panel.render.residentTotal": "\u5E38\u9A7B\u5408\u8BA1",
1941
2030
  "panel.render.totalResidentTokensOfEnabledItems": "\u5408\u8BA1 = \u5404\u69FD\u4F4D\u542F\u7528\u6761\u76EE\u7684\u5E38\u9A7B token \u4E4B\u548C;",
@@ -1948,7 +2037,7 @@ var init_render2 = __esm({
1948
2037
  "panel.render.sourcePanelTimeOfTheLast": "\u6765\u6E90:\u4E0A\u6B21\u6210\u529F GET /api/anatomy \u7684\u9762\u677F\u65F6\u95F4",
1949
2038
  "panel.render.refreshFailedShowingDataFrom": "\u5237\u65B0\u5931\u8D25,\u663E\u793A\u7684\u662F",
1950
2039
  "panel.render.dataSuffix": "\u7684\u6570\u636E",
1951
- "panel.render.contextBreakdown": "CONTEXT \u7EC4\u6210",
2040
+ "panel.render.contextBreakdown": "\u4E0A\u4E0B\u6587\u4F30\u7B97",
1952
2041
  "panel.render.previewTheCompleteContentBeforeSending": "\u6253\u5F00\u9884\u89C8\u5F39\u5C42:\u5148\u770B\u5230\u5C06\u53D1\u9001\u7684\u5B8C\u6574\u5185\u5BB9,\u53EF\u9010\u884C\u5220,\u70B9\u300C\u53D1\u9001\u300D\u624D\u4F1A\u53D1\u51FA;\u5173\u95ED = \u4EC0\u4E48\u90FD\u4E0D\u53D1",
1953
2042
  "panel.render.shareConfigurationSample": "\u5206\u4EAB\u914D\u7F6E\u6837\u672C",
1954
2043
  "panel.render.thisItemIsDisabledToggleableItems": "\u8BE5\u6761\u76EE\u5F53\u524D\u88AB\u5173\u95ED;\u53EF\u5F00\u5173\u6761\u76EE\u5728\u4E0B\u65B9 CONFIGURE \u533A\u4E00\u952E\u6253\u5F00",
@@ -2180,7 +2269,7 @@ var init_render2 = __esm({
2180
2269
  "panel.render.noExecutionEvidenceYet": "\u25CB \u5C1A\u65E0\u6267\u884C\u8BC1\u636E",
2181
2270
  "panel.render.tasks": "\u4EFB\u52A1",
2182
2271
  "panel.render.controls": "\u63A7\u5236",
2183
- "panel.render.billing": "\u8D26\u5355",
2272
+ "panel.render.billing": "\u7528\u91CF",
2184
2273
  "panel.render.turns": "{p0} \u8F6E",
2185
2274
  "panel.render.approx": " \xB7 \u7EA6 {p0}",
2186
2275
  "panel.render.subagent": "\u5B50 agent",
@@ -2363,12 +2452,17 @@ var init_render2 = __esm({
2363
2452
  "panel.render.branchCurrentPointsSource": "\u6765\u6E90:currentPoints \u4E2D\u5C5E\u4E8E\u8BE5\u9876\u5C42\u8282\u70B9\u5B50\u6811\u7684\u5F53\u524D\u70B9",
2364
2453
  "panel.render.noCurrentBranchProvided": "\u5C1A\u672A\u63D0\u4F9B\u6240\u5728\u5206\u652F",
2365
2454
  "panel.render.currentTaskLabel": "\u5F53\u524D\u4EFB\u52A1",
2455
+ "panel.render.morePoints": "\u8FD8\u6709 {count} \u9879",
2456
+ "panel.render.oneMorePoint": "\u8FD8\u6709 {count} \u9879",
2366
2457
  "panel.render.sourceFirstScreenCurrentPointsLength": "\u6765\u6E90:firstScreen.currentPoints.length",
2367
2458
  "panel.render.parallel": "\u5E76\u884C",
2368
2459
  "panel.render.thePlanHasNoStepMarked": "\u8BA1\u5212\u672A\u6807\u8BB0\u8FDB\u884C\u4E2D\u6B65\u9AA4",
2369
2460
  "panel.render.recentActivityLabel": "\u6700\u8FD1\u6D3B\u52A8",
2370
2461
  "panel.render.thePlanHasNoSteps": "\u8BA1\u5212\u6CA1\u6709\u6B65\u9AA4",
2371
2462
  "panel.render.planTree": "\u8BA1\u5212\u6811",
2463
+ "panel.render.fullRecord": "\u5B8C\u6574\u8BB0\u5F55",
2464
+ "panel.render.completedMilestones": "\u5DF2\u5B8C\u6210 {count} \u9879 \xB7 \u6700\u8FD1:{name}",
2465
+ "panel.render.completedMilestonesSource": "\u6765\u6E90:plan.nodes \u4E2D\u5DF2\u5B8C\u6210\u6216\u5DF2\u53D6\u6D88\u7684\u9876\u5C42\u8282\u70B9;\u6700\u8FD1\u9879\u6309\u6587\u6863\u987A\u5E8F",
2372
2466
  "panel.render.sessionsNotLinkedToAStep": "\u672A\u5173\u8054\u5230\u6B65\u9AA4\u7684\u4F1A\u8BDD",
2373
2467
  "panel.render.sourcePlanLastGood": "\u6765\u6E90:plan.lastGood",
2374
2468
  "panel.render.lastReadableVersion": "\u4E0A\u6B21\u53EF\u89E3\u6790\u7248\u672C",
@@ -16097,8 +16191,48 @@ process.stdin.on('end', async () => {
16097
16191
  });
16098
16192
 
16099
16193
  // packages/adapter-codex/dist/scan.js
16100
- import { existsSync as existsSync13, readdirSync as readdirSync5, readFileSync as readFileSync13, statSync as statSync4 } from "node:fs";
16194
+ import { existsSync as existsSync13, readdirSync as readdirSync5, readFileSync as readFileSync13, realpathSync as realpathSync2, statSync as statSync4 } from "node:fs";
16101
16195
  import { dirname as dirname13, isAbsolute as isAbsolute3, join as join20, resolve as resolve8 } from "node:path";
16196
+ function readCodexProjects(homeDir) {
16197
+ try {
16198
+ const state = JSON.parse(readFileSync13(join20(homeDir, ".codex", ".codex-global-state.json"), "utf8"));
16199
+ if (!isTable(state))
16200
+ return void 0;
16201
+ const localProjects = state["local-projects"];
16202
+ const threadAssignments = state["thread-project-assignments"];
16203
+ const order = state["project-order"];
16204
+ if (!isTable(localProjects) || !isTable(threadAssignments) || !Array.isArray(order) || !order.every((id) => typeof id === "string")) {
16205
+ return void 0;
16206
+ }
16207
+ const projects = /* @__PURE__ */ Object.create(null);
16208
+ for (const [key, project] of Object.entries(localProjects)) {
16209
+ if (!isTable(project) || typeof project.id !== "string" || project.id !== key || typeof project.name !== "string" || !Array.isArray(project.rootPaths) || !project.rootPaths.every((root) => typeof root === "string" && isAbsolute3(root))) {
16210
+ return void 0;
16211
+ }
16212
+ projects[key] = {
16213
+ id: project.id,
16214
+ name: project.name,
16215
+ rootPaths: project.rootPaths.map((root) => {
16216
+ try {
16217
+ return realpathSync2(root);
16218
+ } catch {
16219
+ return root;
16220
+ }
16221
+ })
16222
+ };
16223
+ }
16224
+ const assignments = /* @__PURE__ */ Object.create(null);
16225
+ for (const [threadId, assignment] of Object.entries(threadAssignments)) {
16226
+ if (!isTable(assignment) || assignment.projectKind !== "local" || typeof assignment.projectId !== "string") {
16227
+ return void 0;
16228
+ }
16229
+ assignments[threadId] = assignment.projectId;
16230
+ }
16231
+ return { projects, assignments, order };
16232
+ } catch {
16233
+ return void 0;
16234
+ }
16235
+ }
16102
16236
  async function detect(options) {
16103
16237
  const { codexHome } = resolvePaths(options);
16104
16238
  return { installed: existsSync13(codexHome) };
@@ -16619,6 +16753,25 @@ var init_protocol3 = __esm({
16619
16753
  }
16620
16754
  });
16621
16755
 
16756
+ // packages/adapter-codex/dist/session-origin.js
16757
+ function describeSessionOrigin(originator, source) {
16758
+ if (!originator)
16759
+ return void 0;
16760
+ const raw = source ? `${originator} / ${source}` : originator;
16761
+ let key = "other";
16762
+ if (originator === "codex_exec") {
16763
+ key = source === "exec" ? "exec" : "cli";
16764
+ } else if (originator === "codex_work_desktop" || originator === "Codex Desktop") {
16765
+ key = "desktop";
16766
+ }
16767
+ return { key, raw };
16768
+ }
16769
+ var init_session_origin = __esm({
16770
+ "packages/adapter-codex/dist/session-origin.js"() {
16771
+ "use strict";
16772
+ }
16773
+ });
16774
+
16622
16775
  // packages/adapter-codex/dist/protocol-user.js
16623
16776
  import { homedir as homedir13 } from "node:os";
16624
16777
  import { join as join22, resolve as resolve10 } from "node:path";
@@ -16651,11 +16804,13 @@ var dist_exports3 = {};
16651
16804
  __export(dist_exports3, {
16652
16805
  HOOK_EVENTS: () => HOOK_EVENTS,
16653
16806
  createAdapter: () => createAdapter3,
16807
+ describeSessionOrigin: () => describeSessionOrigin,
16654
16808
  feedbackSignals: () => feedbackSignalsCodex,
16655
16809
  installProtocolCodex: () => installProtocolCodex,
16656
16810
  installProtocolCodexUser: () => installProtocolCodexUser,
16657
16811
  protocolStatusCodex: () => protocolStatusCodex,
16658
16812
  protocolStatusCodexUser: () => protocolStatusCodexUser,
16813
+ readCodexProjects: () => readCodexProjects,
16659
16814
  recognizePluginTool: () => recognizePluginTool,
16660
16815
  resolveNodeExecutable: () => resolveNodeExecutable,
16661
16816
  uninstallProtocolCodex: () => uninstallProtocolCodex,
@@ -16681,6 +16836,8 @@ var init_dist6 = __esm({
16681
16836
  init_hooks3();
16682
16837
  init_plugin_tools();
16683
16838
  init_protocol3();
16839
+ init_scan2();
16840
+ init_session_origin();
16684
16841
  init_protocol_user2();
16685
16842
  }
16686
16843
  });
@@ -17106,8 +17263,9 @@ init_dist6();
17106
17263
  init_dist3();
17107
17264
  init_dist2();
17108
17265
  init_dist();
17266
+ import { realpathSync as realpathSync3, statSync as statSync6 } from "node:fs";
17109
17267
  import { readdir as readdir2 } from "node:fs/promises";
17110
- import { isAbsolute as isAbsolute6, join as join26, resolve as resolve12 } from "node:path";
17268
+ import { isAbsolute as isAbsolute6, join as join26, relative as relative4, resolve as resolve12 } from "node:path";
17111
17269
 
17112
17270
  // packages/narrative/dist/attribute.js
17113
17271
  function extractSteps(lines2) {
@@ -17236,6 +17394,8 @@ function parseSessionMeta(payload, timestamp) {
17236
17394
  assignString(line, "cwd", optionalString(payload?.cwd));
17237
17395
  assignString(line, "cliVersion", optionalString(payload?.cli_version));
17238
17396
  assignString(line, "modelProvider", optionalString(payload?.model_provider));
17397
+ assignString(line, "originator", optionalString(payload?.originator));
17398
+ assignString(line, "source", optionalString(payload?.source));
17239
17399
  return line;
17240
17400
  }
17241
17401
  function parseTurnContext(payload, timestamp) {
@@ -17244,6 +17404,9 @@ function parseTurnContext(payload, timestamp) {
17244
17404
  assignString(line, "turnId", optionalString(payload?.turn_id));
17245
17405
  assignString(line, "model", optionalString(payload?.model));
17246
17406
  assignString(line, "cwd", optionalString(payload?.cwd));
17407
+ if (payload?.approvals_reviewer === "user" || payload?.approvals_reviewer === "auto_review") {
17408
+ line.approvalsReviewer = payload.approvals_reviewer;
17409
+ }
17247
17410
  return line;
17248
17411
  }
17249
17412
  function parseEventMessage(payload, timestamp) {
@@ -17440,7 +17603,31 @@ function isRecord2(value) {
17440
17603
  }
17441
17604
 
17442
17605
  // packages/narrative/dist/parse.js
17606
+ function userRequestText(text) {
17607
+ let body = text.trim();
17608
+ if (/^<(task-notification|system-reminder)\b/u.test(body))
17609
+ return "";
17610
+ let browserEnvelope = false;
17611
+ if (/^<in-app-browser-context\b/u.test(body)) {
17612
+ const end = body.indexOf("</in-app-browser-context>");
17613
+ if (end < 0)
17614
+ return "";
17615
+ body = body.slice(end + "</in-app-browser-context>".length).trim();
17616
+ browserEnvelope = true;
17617
+ }
17618
+ if (/^# Files mentioned by the user:[ \t]*(?:\r?\n|$)/u.test(body)) {
17619
+ const boundary = /^## My request:[ \t]*(?:\r?\n|$)/mu.exec(body);
17620
+ return boundary === null ? "" : body.slice(boundary.index + boundary[0].length).trim();
17621
+ }
17622
+ if (browserEnvelope) {
17623
+ const boundary = /^## My request:[ \t]*(?:\r?\n|$)/u.exec(body);
17624
+ return boundary === null ? "" : body.slice(boundary[0].length).trim();
17625
+ }
17626
+ return body;
17627
+ }
17443
17628
  function isHarnessSystemNotice(text) {
17629
+ if (/^\s*<in-app-browser-context\b/u.test(text))
17630
+ return userRequestText(text) === "";
17444
17631
  return /^\s*<(task-notification|system-reminder|in-app-browser-context)\b/u.test(text);
17445
17632
  }
17446
17633
  function parseTranscriptLine(line) {
@@ -19183,7 +19370,7 @@ function resolveWingmanVersion({ defined, moduleUrl = import.meta.url, readPacka
19183
19370
  return void 0;
19184
19371
  }
19185
19372
  function wingmanVersion() {
19186
- const defined = false ? void 0 : "0.9.2";
19373
+ const defined = false ? void 0 : "0.9.4";
19187
19374
  return resolveWingmanVersion({
19188
19375
  defined,
19189
19376
  readPackage: (url) => JSON.parse(readFileSync17(url, "utf8"))
@@ -19231,9 +19418,46 @@ function createNarrativeService(options = {}) {
19231
19418
  const projectFiles = /* @__PURE__ */ new Map();
19232
19419
  const rememberedProjectRoots = /* @__PURE__ */ new Map();
19233
19420
  const seenProjectRoots = /* @__PURE__ */ new Set();
19421
+ let codexProjects;
19422
+ let codexProjectsSignature;
19423
+ const codexRootResolutions = /* @__PURE__ */ new Map();
19234
19424
  let projectMemoryUnavailable;
19235
19425
  let notificationQueued = false;
19236
19426
  let closed = false;
19427
+ function refreshCodexProjects() {
19428
+ if (options.homeDir === void 0 || closed)
19429
+ return;
19430
+ let signature = "missing";
19431
+ try {
19432
+ const info = statSync6(join26(options.homeDir, ".codex", ".codex-global-state.json"));
19433
+ signature = `${info.mtimeMs}:${info.ctimeMs}:${info.size}:${info.mode}`;
19434
+ } catch {
19435
+ }
19436
+ const unchanged = signature === codexProjectsSignature;
19437
+ if (unchanged && codexProjects !== void 0)
19438
+ return;
19439
+ codexProjectsSignature = signature;
19440
+ codexProjects = readCodexProjects(options.homeDir);
19441
+ if (unchanged && codexProjects === void 0)
19442
+ return;
19443
+ codexRootResolutions.clear();
19444
+ for (const project of Object.values(codexProjects?.projects ?? {})) {
19445
+ for (const root of project.rootPaths) {
19446
+ void resolveProjectRoot(root, {
19447
+ homeDir: options.homeDir,
19448
+ maxDirectories: 1,
19449
+ ...options.projectBoundaryDir === void 0 ? {} : { boundaryDir: options.projectBoundaryDir }
19450
+ }).then((resolution) => {
19451
+ if (closed || signature !== codexProjectsSignature)
19452
+ return;
19453
+ codexRootResolutions.set(root, resolution);
19454
+ watchResolution(resolution);
19455
+ notify("codex");
19456
+ });
19457
+ }
19458
+ }
19459
+ notify("codex");
19460
+ }
19237
19461
  function notify(harness) {
19238
19462
  pendingNotifications.add(harness);
19239
19463
  if (notificationQueued)
@@ -19294,7 +19518,7 @@ function createNarrativeService(options = {}) {
19294
19518
  session.subagentTimer = void 0;
19295
19519
  }
19296
19520
  function anchorCwd(harness, session, cwd) {
19297
- if (session.cwd !== void 0)
19521
+ if (session.cwd !== void 0 || cwd.trim() === "")
19298
19522
  return;
19299
19523
  session.cwd = cwd;
19300
19524
  if (options.homeDir === void 0)
@@ -19609,6 +19833,9 @@ function createNarrativeService(options = {}) {
19609
19833
  if (harness === "codex") {
19610
19834
  const parsed = parseCodexRolloutLine(line);
19611
19835
  session.codexLines.push(parsed);
19836
+ if ((parsed.kind === "session_meta" && parsed.parentThreadId === void 0 || parsed.kind === "turn_context") && parsed.cwd !== void 0) {
19837
+ anchorCwd(harness, session, parsed.cwd);
19838
+ }
19612
19839
  if (parsed.kind !== "unknown")
19613
19840
  timestamp = parsed.timestamp;
19614
19841
  } else {
@@ -19679,13 +19906,14 @@ function createNarrativeService(options = {}) {
19679
19906
  }
19680
19907
  if (name === "UserPromptSubmit") {
19681
19908
  const prompt = typeof payload.prompt === "string" ? payload.prompt.trim() : void 0;
19909
+ const displayPrompt = prompt === void 0 ? void 0 : userRequestText(prompt);
19682
19910
  if (prompt === void 0 || prompt !== "" && !isHarnessSystemNotice(prompt)) {
19683
19911
  session.hookInstructions.push({
19684
19912
  at: event.received_at,
19685
19913
  ...prompt === void 0 ? {} : { text: prompt }
19686
19914
  });
19687
- if (prompt !== void 0) {
19688
- session.hookPrompt = truncate(prompt, DETAIL_LIMIT);
19915
+ if (displayPrompt !== void 0 && displayPrompt !== "") {
19916
+ session.hookPrompt = truncate(displayPrompt, DETAIL_LIMIT);
19689
19917
  session.hookPromptAt = event.received_at;
19690
19918
  }
19691
19919
  }
@@ -19715,6 +19943,7 @@ function createNarrativeService(options = {}) {
19715
19943
  const signal = waitingSignal(payload);
19716
19944
  if (signal !== null) {
19717
19945
  const { kind } = signal;
19946
+ session.feedbackRequestAt = event.received_at;
19718
19947
  if (session.waiting === null) {
19719
19948
  session.waiting = {
19720
19949
  kind,
@@ -19751,7 +19980,8 @@ function createNarrativeService(options = {}) {
19751
19980
  return waiting.message;
19752
19981
  },
19753
19982
  until: event.received_at,
19754
- resolvedBy: name
19983
+ resolvedBy: name,
19984
+ ...session.feedbackRequestAt === void 0 ? {} : { requestAt: session.feedbackRequestAt }
19755
19985
  });
19756
19986
  session.waiting = null;
19757
19987
  }
@@ -19872,12 +20102,14 @@ function createNarrativeService(options = {}) {
19872
20102
  const infos = [...sessions.values()].map((session) => {
19873
20103
  const user = overlayEntries[`${harness}:${session.id}`];
19874
20104
  const lastActivity = lastActivityOf(session);
20105
+ const state = deriveCached(harness, session, configuredPlugins, configuredMcpServers);
19875
20106
  return {
19876
20107
  id: session.id,
20108
+ ...state.origin === void 0 ? {} : { origin: state.origin },
19877
20109
  label: session.projectResolution?.isHome ? t("narrative.homeDirectory") : session.label ?? shortSessionId(session.id),
19878
20110
  ...session.cwd === void 0 ? {} : { cwd: session.cwd },
19879
20111
  lastActivity,
19880
- waiting: session.waiting !== null,
20112
+ waiting: state.waiting !== null,
19881
20113
  ended: isEnded(session, nowIso),
19882
20114
  archived: user?.archived === true,
19883
20115
  archivedHasNewActivity: user?.archived === true && user.archivedAt !== void 0 && Date.parse(lastActivity) > Date.parse(user.archivedAt),
@@ -19892,7 +20124,7 @@ function createNarrativeService(options = {}) {
19892
20124
  ...state,
19893
20125
  taskWorkflow: {
19894
20126
  ...state.taskWorkflow,
19895
- feedback: feedbackView(harness, feedback, session.feedbackState),
20127
+ feedback: feedbackView(harness, feedback, humanFeedbackState(harness, session)),
19896
20128
  ...verification === void 0 ? {} : {
19897
20129
  verification: {
19898
20130
  ...verification,
@@ -19982,37 +20214,94 @@ function createNarrativeService(options = {}) {
19982
20214
  };
19983
20215
  }
19984
20216
  function getProjects() {
20217
+ refreshCodexProjects();
19985
20218
  const overlay = options.homeDir === void 0 ? void 0 : readTaskOverlay(options.homeDir);
19986
20219
  const overlayEntries = overlay === void 0 || "unavailable" in overlay ? {} : overlay.entries;
19987
20220
  const grouped = /* @__PURE__ */ new Map();
20221
+ const cards = /* @__PURE__ */ new Map();
20222
+ const codexNamesByRoot = /* @__PURE__ */ new Map();
19988
20223
  for (const [rootIdentity, resolution] of rememberedProjectRoots) {
19989
- grouped.set(rootIdentity, { resolution, members: [] });
20224
+ grouped.set(rootIdentity, { rootIdentity, resolution, members: [] });
19990
20225
  }
19991
20226
  for (const [harness, sessions] of harnesses) {
19992
20227
  for (const session of sessions.values()) {
19993
20228
  if (session.cwd === void 0)
19994
20229
  continue;
19995
- const rootIdentity = session.projectResolution?.rootIdentity ?? resolve12(session.cwd);
19996
- const group = grouped.get(rootIdentity);
20230
+ let rootIdentity = session.projectResolution?.rootIdentity ?? resolve12(session.cwd);
20231
+ let resolution = session.projectResolution;
20232
+ let cardId;
20233
+ if (harness === "codex" && codexProjects !== void 0) {
20234
+ const meta = session.codexLines.find((line) => line.kind === "session_meta" && line.parentThreadId === void 0);
20235
+ const threadId = meta?.kind === "session_meta" ? meta.threadId : void 0;
20236
+ const assignment = codexProjects.assignments[threadId ?? session.id];
20237
+ const cwd = codexPathIdentity(session.cwd);
20238
+ const matching = Object.values(codexProjects.projects).flatMap((project2) => project2.rootPaths.map((root) => ({ project: project2, root }))).filter(({ root }) => isPathWithin(root, cwd)).sort((left, right) => right.root.length - left.root.length)[0];
20239
+ const project = assignment === void 0 ? matching?.project : codexProjects.projects[assignment];
20240
+ if (assignment === void 0 || project !== void 0) {
20241
+ cardId = project === void 0 ? "codex-ungrouped" : `codex-project:${project.id}`;
20242
+ let card = cards.get(cardId);
20243
+ if (card === void 0) {
20244
+ card = {
20245
+ kind: project === void 0 ? "codex-ungrouped" : "codex-project",
20246
+ id: project?.id ?? "codex-ungrouped",
20247
+ name: project?.name ?? t("narrative.codexUngrouped"),
20248
+ roots: [...new Set(project?.rootPaths ?? [])]
20249
+ };
20250
+ cards.set(cardId, card);
20251
+ for (const root of card.roots) {
20252
+ grouped.set(JSON.stringify([cardId, root]), {
20253
+ rootIdentity: root,
20254
+ resolution: codexRootResolutions.get(root),
20255
+ members: [],
20256
+ cardId
20257
+ });
20258
+ }
20259
+ }
20260
+ const configuredRoot = project?.rootPaths.filter((root) => isPathWithin(root, cwd)).sort((left, right) => right.length - left.length)[0];
20261
+ if (configuredRoot !== void 0 && !(resolution?.planPath !== void 0 && resolution.rootIdentity !== configuredRoot)) {
20262
+ rootIdentity = configuredRoot;
20263
+ resolution = codexRootResolutions.get(configuredRoot) ?? (session.projectResolution?.rootIdentity === configuredRoot ? session.projectResolution : void 0);
20264
+ }
20265
+ if (!card.roots.includes(rootIdentity))
20266
+ card.roots.push(rootIdentity);
20267
+ }
20268
+ }
20269
+ const key = cardId === void 0 ? rootIdentity : JSON.stringify([cardId, rootIdentity]);
20270
+ const group = grouped.get(key);
19997
20271
  if (group === void 0) {
19998
- grouped.set(rootIdentity, {
19999
- resolution: session.projectResolution,
20000
- members: [{ harness, session }]
20272
+ grouped.set(key, {
20273
+ rootIdentity,
20274
+ resolution,
20275
+ members: [{ harness, session }],
20276
+ ...cardId === void 0 ? {} : { cardId }
20001
20277
  });
20002
20278
  } else {
20003
- group.resolution ??= session.projectResolution;
20279
+ group.resolution ??= resolution;
20004
20280
  group.members.push({ harness, session });
20005
20281
  }
20006
20282
  }
20007
20283
  }
20284
+ for (const card of cards.values()) {
20285
+ if (card.kind !== "codex-project")
20286
+ continue;
20287
+ for (const root of card.roots) {
20288
+ const names = codexNamesByRoot.get(root) ?? /* @__PURE__ */ new Set();
20289
+ names.add(card.name);
20290
+ codexNamesByRoot.set(root, names);
20291
+ }
20292
+ }
20008
20293
  const overviews = /* @__PURE__ */ new Map();
20009
20294
  for (const harness of harnesses.keys())
20010
20295
  overviews.set(harness, getOverview(harness));
20011
20296
  const projects = [];
20012
- for (const [rootIdentity, group] of grouped) {
20297
+ const cardRoots = /* @__PURE__ */ new Map();
20298
+ for (const group of grouped.values()) {
20299
+ const { rootIdentity } = group;
20013
20300
  const { members } = group;
20014
- const resolution = members.find((member) => member.session.projectResolution !== void 0)?.session.projectResolution ?? group.resolution;
20015
- const root = resolution?.root ?? resolve12(members[0]?.session.cwd ?? "");
20301
+ if (group.cardId === void 0 && members.length === 0 && [...cards.values()].some((card) => card.roots.includes(rootIdentity)))
20302
+ continue;
20303
+ const resolution = group.resolution;
20304
+ const root = resolution?.root ?? (group.cardId === void 0 ? resolve12(members[0]?.session.cwd ?? rootIdentity) : rootIdentity);
20016
20305
  const planPath = resolution?.planPath ?? join26(root, ".wingman", "plan.md");
20017
20306
  const runtime = projectFiles.get(resolution?.planPathIdentity ?? planPath);
20018
20307
  if (runtime?.current !== void 0 && runtime.readFailureKey === void 0 && runtime.parsedLocale !== getLocale()) {
@@ -20044,6 +20333,7 @@ function createNarrativeService(options = {}) {
20044
20333
  id: session.id,
20045
20334
  label,
20046
20335
  ended: info?.ended ?? false,
20336
+ ...state?.origin === void 0 ? {} : { origin: state.origin },
20047
20337
  ...state?.skillsUsed === void 0 ? {} : { skillsUsed: state.skillsUsed },
20048
20338
  title: attachedTitle !== void 0 ? { text: attachedTitle, source: "plan.md \u6B65\u9AA4" } : planInstruction !== void 0 ? { text: truncate(planInstruction, DETAIL_LIMIT), source: "\u8BA1\u5212\u6240\u5C5E\u6307\u4EE4" } : instructionTitle !== void 0 ? { text: truncate(instructionTitle, DETAIL_LIMIT), source: "\u6700\u65B0\u6307\u4EE4" } : { text: label, source: "\u5DE5\u4F5C\u76EE\u5F55" },
20049
20339
  user: {
@@ -20126,7 +20416,7 @@ function createNarrativeService(options = {}) {
20126
20416
  const projectUser = overlayEntries[`project:${root}`];
20127
20417
  const firstScreen = deriveProjectFirstScreen(plan, parsed?.availability === "available" ? parsed.goal : void 0, summary.currentPoints, sessionViews);
20128
20418
  const archivedHasNewActivity = projectUser?.archived === true && projectUser.archivedAt !== void 0 && firstScreen.lastActivity !== void 0 && Date.parse(firstScreen.lastActivity.at) > Date.parse(projectUser.archivedAt);
20129
- projects.push({
20419
+ const projectView = {
20130
20420
  firstScreen,
20131
20421
  root,
20132
20422
  ...resolution === void 0 ? {} : { isHome: resolution.isHome === true },
@@ -20159,6 +20449,48 @@ function createNarrativeService(options = {}) {
20159
20449
  facts: reconciliation,
20160
20450
  protocol,
20161
20451
  sessions: sessionViews
20452
+ };
20453
+ if (group.cardId === void 0) {
20454
+ const names = codexNamesByRoot.get(rootIdentity);
20455
+ if (names !== void 0)
20456
+ projectView.codexProjectNames = [...names];
20457
+ projects.push(projectView);
20458
+ } else {
20459
+ const roots = cardRoots.get(group.cardId) ?? [];
20460
+ roots.push(projectView);
20461
+ cardRoots.set(group.cardId, roots);
20462
+ }
20463
+ }
20464
+ for (const [cardId, group] of cards) {
20465
+ const rootProjects = cardRoots.get(cardId) ?? [];
20466
+ const selected = [...rootProjects].sort((left, right) => Number(left.user?.archived === true) - Number(right.user?.archived === true) || projectAttention(right) - projectAttention(left))[0];
20467
+ if (selected === void 0)
20468
+ continue;
20469
+ const order = codexProjects?.order.indexOf(group.id) ?? -1;
20470
+ const users = rootProjects.map((project) => project.user);
20471
+ const archivedAt = users.map((user) => user?.archivedAt).filter((at) => at !== void 0).sort()[0];
20472
+ const orders = users.map((user) => user?.order).filter((value) => value !== void 0);
20473
+ projects.push({
20474
+ ...selected,
20475
+ root: cardId,
20476
+ group: { ...group, roots: rootProjects.map((project) => project.root) },
20477
+ rootProjects,
20478
+ ...order < 0 ? {} : { codexOrder: order },
20479
+ title: {
20480
+ text: group.name,
20481
+ source: group.kind === "codex-project" ? "codexProject" : "codexUngrouped"
20482
+ },
20483
+ sessions: rootProjects.flatMap((project) => project.sessions),
20484
+ presence: rootProjects.some((project) => project.presence === "active") ? "active" : "remembered",
20485
+ seenSinceStart: rootProjects.some((project) => project.seenSinceStart),
20486
+ archivedHasNewActivity: rootProjects.some((project) => project.archivedHasNewActivity),
20487
+ user: {
20488
+ pinned: users.every((user) => user?.pinned === true),
20489
+ hidden: users.every((user) => user?.hidden === true),
20490
+ archived: users.every((user) => user?.archived === true),
20491
+ ...archivedAt === void 0 ? {} : { archivedAt },
20492
+ ...orders.length === 0 ? {} : { order: Math.min(...orders) }
20493
+ }
20162
20494
  });
20163
20495
  }
20164
20496
  projects.sort((left, right) => {
@@ -20169,6 +20501,15 @@ function createNarrativeService(options = {}) {
20169
20501
  const activityOrder = (right.firstScreen.lastActivity === void 0 ? 0 : Date.parse(right.firstScreen.lastActivity.at)) - (left.firstScreen.lastActivity === void 0 ? 0 : Date.parse(left.firstScreen.lastActivity.at));
20170
20502
  return decisionOrder || activityOrder || left.root.localeCompare(right.root);
20171
20503
  });
20504
+ for (const archived of [false, true]) {
20505
+ const positions = projects.flatMap((project, index) => project.group?.kind === "codex-project" && project.user?.archived === true === archived ? [index] : []);
20506
+ const ordered = positions.map((index) => projects[index]).filter((project) => project !== void 0).sort((left, right) => (left.codexOrder ?? Number.MAX_SAFE_INTEGER) - (right.codexOrder ?? Number.MAX_SAFE_INTEGER));
20507
+ positions.forEach((index, position) => {
20508
+ const project = ordered[position];
20509
+ if (project !== void 0)
20510
+ projects[index] = project;
20511
+ });
20512
+ }
20172
20513
  return {
20173
20514
  projects,
20174
20515
  ...projectMemoryUnavailable === void 0 ? {} : { memory: { unavailable: projectMemoryUnavailable() } }
@@ -20217,9 +20558,39 @@ function createNarrativeService(options = {}) {
20217
20558
  subscribe,
20218
20559
  refreshLocale,
20219
20560
  refreshOverlay,
20561
+ refreshCodexProjects,
20220
20562
  close
20221
20563
  };
20222
20564
  }
20565
+ function codexPathIdentity(path) {
20566
+ try {
20567
+ return realpathSync3(path);
20568
+ } catch {
20569
+ return resolve12(path);
20570
+ }
20571
+ }
20572
+ function isPathWithin(root, cwd) {
20573
+ const path = relative4(root, cwd);
20574
+ return path === "" || path !== ".." && !path.startsWith(`..${process.platform === "win32" ? "\\" : "/"}`) && !isAbsolute6(path);
20575
+ }
20576
+ function projectAttention(project) {
20577
+ if (project.sessions.some((session) => session.waiting))
20578
+ return 4;
20579
+ if (project.firstScreen.action.kind === "insufficient" && project.sessions.some((session) => !session.ended))
20580
+ return 2;
20581
+ switch (project.firstScreen.action.kind) {
20582
+ case "decision":
20583
+ return 4;
20584
+ case "checkpoint":
20585
+ return 3;
20586
+ case "in_progress":
20587
+ return 2;
20588
+ case "ended":
20589
+ return 1;
20590
+ case "insufficient":
20591
+ return 0;
20592
+ }
20593
+ }
20223
20594
  function deriveProjectFirstScreen(plan, goal, points, sessions) {
20224
20595
  const source = ".wingman/plan.md nodes(status, children)";
20225
20596
  const currentPoints = points.map((point) => ({ ...point, source }));
@@ -20450,6 +20821,54 @@ function feedbackView(harness, capability, state) {
20450
20821
  }
20451
20822
  return state ?? { state: "no_open_request", source: `${harness} explicit feedback signals` };
20452
20823
  }
20824
+ function codexAutomaticReviewAt(lines2, at) {
20825
+ const requestTime = Date.parse(at);
20826
+ if (!Number.isFinite(requestTime))
20827
+ return false;
20828
+ let reviewer;
20829
+ let turnId;
20830
+ for (const line of sortedCodexByTimestamp(lines2)) {
20831
+ if (line.kind === "unknown")
20832
+ continue;
20833
+ const time = Date.parse(line.timestamp ?? "");
20834
+ if (!Number.isFinite(time)) {
20835
+ if (line.kind === "turn_context" || line.kind === "task_started")
20836
+ reviewer = void 0;
20837
+ continue;
20838
+ }
20839
+ if (time > requestTime)
20840
+ continue;
20841
+ if (line.kind === "task_started") {
20842
+ reviewer = void 0;
20843
+ turnId = line.turnId;
20844
+ } else if (line.kind === "task_complete" || line.kind === "turn_aborted") {
20845
+ reviewer = void 0;
20846
+ turnId = void 0;
20847
+ } else if (line.kind === "turn_context") {
20848
+ reviewer = turnId !== void 0 && line.turnId !== turnId ? void 0 : line.approvalsReviewer;
20849
+ }
20850
+ }
20851
+ return reviewer === "auto_review";
20852
+ }
20853
+ function humanFeedbackState(harness, session) {
20854
+ const state = session.feedbackState;
20855
+ if (harness !== "codex" || state?.source !== "codex PermissionRequest signal")
20856
+ return state;
20857
+ const since = state.state === "needs_user" ? state.since : state.requestSince;
20858
+ const at = session.feedbackRequestAt ?? since;
20859
+ if (codexAutomaticReviewAt(session.codexLines, at))
20860
+ return void 0;
20861
+ if (!codexAutomaticReviewAt(session.codexLines, since))
20862
+ return state;
20863
+ return state.state === "needs_user" ? { ...state, since: at } : { ...state, requestSince: at };
20864
+ }
20865
+ function humanWaiting(harness, lines2, wait, at = wait.since) {
20866
+ if (harness !== "codex" || wait.kind !== "permission")
20867
+ return wait;
20868
+ if (codexAutomaticReviewAt(lines2, at))
20869
+ return null;
20870
+ return codexAutomaticReviewAt(lines2, wait.since) ? { ...wait, since: at } : wait;
20871
+ }
20453
20872
  function observedMcpServers(lines2, configuredServers) {
20454
20873
  const names = /* @__PURE__ */ new Set();
20455
20874
  for (const line of lines2) {
@@ -20513,6 +20932,8 @@ function observedSkills(lines2) {
20513
20932
  }
20514
20933
  function derive(harness, session, nowIso, configuredPlugins, configuredMcpServers) {
20515
20934
  const codexLines = sortedCodexByTimestamp(session.codexLines);
20935
+ const waiting = session.waiting === null ? null : humanWaiting(harness, codexLines, session.waiting, session.feedbackRequestAt);
20936
+ const waitEpisodes = session.waitEpisodes.map((wait) => humanWaiting(harness, codexLines, wait, wait.requestAt)).filter((wait) => wait !== null);
20516
20937
  const lines2 = harness === "codex" ? adaptCodexNarrativeLines(codexLines) : sortedByTimestamp(session.lines);
20517
20938
  const timeline = deriveTodoTimeline(extractTodoSnapshots(lines2));
20518
20939
  const allSteps = extractSteps(lines2);
@@ -20562,10 +20983,10 @@ function derive(harness, session, nowIso, configuredPlugins, configuredMcpServer
20562
20983
  else
20563
20984
  waitNodes.set(key, [node]);
20564
20985
  };
20565
- for (const episode of session.waitEpisodes)
20986
+ for (const episode of waitEpisodes)
20566
20987
  pushWait(episode, false);
20567
- if (session.waiting !== null)
20568
- pushWait(session.waiting, true);
20988
+ if (waiting !== null)
20989
+ pushWait(waiting, true);
20569
20990
  const traces = [];
20570
20991
  const agentsByTodo = /* @__PURE__ */ new Map();
20571
20992
  const orderedKeys = timeline.map((entry) => entry.id).filter((id) => buckets.has(id) || waitNodes.has(id));
@@ -20624,7 +21045,7 @@ function derive(harness, session, nowIso, configuredPlugins, configuredMcpServer
20624
21045
  },
20625
21046
  execution: {
20626
21047
  ...workflowAction === void 0 ? {} : { currentAction: workflowAction },
20627
- evidenceCount: steps.length + session.waitEpisodes.length + (session.waiting === null ? 0 : 1),
21048
+ evidenceCount: steps.length + waitEpisodes.length + (waiting === null ? 0 : 1),
20628
21049
  failureCount: steps.filter((step) => step.isError).length
20629
21050
  },
20630
21051
  feedback: unavailableFeedback({ key: "narrative.feedbackUnmapped" })
@@ -20657,9 +21078,16 @@ function derive(harness, session, nowIso, configuredPlugins, configuredMcpServer
20657
21078
  const skillsUsed = harness === "cc" ? observedSkills(lines2) : [];
20658
21079
  const mcpUsed = harness === "cc" ? observedMcpServers(lines2, configuredMcpServers) : [];
20659
21080
  const pluginsUsed = harness === "codex" ? observedPlugins(codexLines, configuredPlugins) : [];
21081
+ const meta = session.codexLines.find((line) => line.kind === "session_meta");
20660
21082
  return {
20661
21083
  harness,
20662
21084
  sessionId: session.id,
21085
+ ...harness !== "codex" || !meta?.originator ? {} : {
21086
+ origin: {
21087
+ originator: meta.originator,
21088
+ ...meta.source === void 0 ? {} : { source: meta.source }
21089
+ }
21090
+ },
20663
21091
  transcriptPath: session.transcriptPath ?? null,
20664
21092
  ...skillsUsed.length === 0 ? {} : { skillsUsed },
20665
21093
  ...mcpUsed.length === 0 ? {} : { mcpUsed },
@@ -20677,7 +21105,7 @@ function derive(harness, session, nowIso, configuredPlugins, configuredMcpServer
20677
21105
  traces,
20678
21106
  turnUsages: harness === "codex" ? deriveCodexTurnUsages(codexLines) : deriveTurnUsages(lines2),
20679
21107
  currentAction,
20680
- waiting: session.waiting,
21108
+ waiting,
20681
21109
  agentQuote: deriveAgentQuote(lines2),
20682
21110
  // transcript 是会话事实源;hook prompt 只在 tail 尚未读到/格式暂不可读时兜底。
20683
21111
  lastPrompt,
@@ -21204,15 +21632,15 @@ function deriveAgentQuote(lines2) {
21204
21632
  return null;
21205
21633
  }
21206
21634
  function deriveLastPrompt(lines2, hookPrompt, hookPromptAt) {
21207
- const usableHookPrompt = hookPrompt === void 0 || isHarnessSystemNotice(hookPrompt) ? void 0 : hookPrompt;
21635
+ const usableHookPrompt = hookPrompt;
21208
21636
  for (let i = lines2.length - 1; i >= 0; i--) {
21209
21637
  const line = lines2[i];
21210
21638
  if (line === void 0 || line.kind !== "user" || line.agentId !== void 0)
21211
21639
  continue;
21212
21640
  if (line.toolResults.length > 0)
21213
21641
  continue;
21214
- const text = line.text?.trim();
21215
- if (text === void 0 || text === "" || isHarnessSystemNotice(text))
21642
+ const text = line.text === void 0 ? void 0 : userRequestText(line.text);
21643
+ if (text === void 0 || text === "")
21216
21644
  continue;
21217
21645
  if (usableHookPrompt !== void 0 && hookPromptAt !== void 0 && line.timestamp !== void 0 && hookPromptAt > line.timestamp) {
21218
21646
  return usableHookPrompt;
@@ -21465,7 +21893,7 @@ async function loadHarness(harness, mode) {
21465
21893
  // apps/cli/dist/return-target.js
21466
21894
  init_dist();
21467
21895
  import { randomBytes as randomBytes4 } from "node:crypto";
21468
- import { closeSync as closeSync3, copyFileSync as copyFileSync3, mkdirSync as mkdirSync12, openSync as openSync3, readFileSync as readFileSync18, renameSync as renameSync5, rmSync as rmSync10, statSync as statSync6, writeFileSync as writeFileSync13 } from "node:fs";
21896
+ import { closeSync as closeSync3, copyFileSync as copyFileSync3, mkdirSync as mkdirSync12, openSync as openSync3, readFileSync as readFileSync18, renameSync as renameSync5, rmSync as rmSync10, statSync as statSync7, writeFileSync as writeFileSync13 } from "node:fs";
21469
21897
  import { dirname as dirname18, join as join27, resolve as resolve13 } from "node:path";
21470
21898
  function isIslandSetting(value) {
21471
21899
  return isRecord8(value) && Object.keys(value).every((key) => ["edge", "offset", "screen", "size"].includes(key)) && ["top", "bottom", "left", "right"].includes(value.edge) && typeof value.offset === "number" && Number.isFinite(value.offset) && value.offset >= 0 && value.offset <= 1 && (value.screen === void 0 || typeof value.screen === "string") && (value.size === "compact" || value.size === "standard");
@@ -21486,7 +21914,7 @@ function detectReturnTargets(homeDir, roots = ["/Applications", join27(homeDir,
21486
21914
  for (const root of new Set(roots.map((root2) => resolve13(root2)))) {
21487
21915
  const bundlePath = join27(root, bundle);
21488
21916
  try {
21489
- if (statSync6(bundlePath).isDirectory())
21917
+ if (statSync7(bundlePath).isDirectory())
21490
21918
  available.push({ name, bundlePath });
21491
21919
  } catch {
21492
21920
  }
@@ -21691,7 +22119,7 @@ import { createHmac, timingSafeEqual } from "node:crypto";
21691
22119
  import { readFile as readFile4 } from "node:fs/promises";
21692
22120
  import { createServer } from "node:http";
21693
22121
  import { hostname } from "node:os";
21694
- import { extname, relative as relative4, resolve as resolve14, sep as sep2 } from "node:path";
22122
+ import { extname, relative as relative5, resolve as resolve14, sep as sep2 } from "node:path";
21695
22123
 
21696
22124
  // apps/cli/dist/suggest.js
21697
22125
  init_dist2();
@@ -22036,6 +22464,7 @@ async function handle(req, res, options, warn, runtime) {
22036
22464
  }
22037
22465
  if (url.pathname === "/api/anatomy") {
22038
22466
  const configs = await scanAll(options.harnesses, warn);
22467
+ options.narrative?.refreshCodexProjects();
22039
22468
  runtime.anatomy = { at: Date.now(), configs };
22040
22469
  const anatomy = configs.map((config) => {
22041
22470
  const scanOptions = options.harnesses.find((entry) => entry.harness === config.harness)?.scanOptions;
@@ -22282,7 +22711,7 @@ function handleProtocolUserAction(body, res, options, runtime) {
22282
22711
  sendJson2(res, 200, {
22283
22712
  ok: true,
22284
22713
  planProtocol: { user },
22285
- ...result5.backupDir === void 0 ? {} : { backupDir: `~/${relative4(homeDir, result5.backupDir).split(sep2).join("/")}` }
22714
+ ...result5.backupDir === void 0 ? {} : { backupDir: `~/${relative5(homeDir, result5.backupDir).split(sep2).join("/")}` }
22286
22715
  });
22287
22716
  }
22288
22717
  } catch (error) {