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.
- package/apps/cli/dist/main.js +479 -50
- package/apps/panel/dist/assets/index-2n853qZ8.css +1 -0
- package/apps/panel/dist/assets/index-AK2vZUEt.js +344 -0
- package/apps/panel/dist/index.html +2 -2
- package/package.json +2 -2
- package/apps/panel/dist/assets/index-CW76iTMY.css +0 -1
- package/apps/panel/dist/assets/index-rzWRf5aS.js +0 -348
package/apps/cli/dist/main.js
CHANGED
|
@@ -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
|
|
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": "
|
|
632
|
-
"panel.render.ccOutbound": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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 \
|
|
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": "\
|
|
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\
|
|
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": "
|
|
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": "\
|
|
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.
|
|
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 (
|
|
19688
|
-
session.hookPrompt = truncate(
|
|
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:
|
|
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
|
|
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
|
-
|
|
19996
|
-
|
|
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(
|
|
19999
|
-
|
|
20000
|
-
|
|
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 ??=
|
|
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
|
-
|
|
20297
|
+
const cardRoots = /* @__PURE__ */ new Map();
|
|
20298
|
+
for (const group of grouped.values()) {
|
|
20299
|
+
const { rootIdentity } = group;
|
|
20013
20300
|
const { members } = group;
|
|
20014
|
-
|
|
20015
|
-
|
|
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
|
-
|
|
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
|
|
20986
|
+
for (const episode of waitEpisodes)
|
|
20566
20987
|
pushWait(episode, false);
|
|
20567
|
-
if (
|
|
20568
|
-
pushWait(
|
|
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 +
|
|
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
|
|
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
|
|
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
|
|
21215
|
-
if (text === void 0 || 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
|
|
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 (
|
|
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
|
|
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: `~/${
|
|
22714
|
+
...result5.backupDir === void 0 ? {} : { backupDir: `~/${relative5(homeDir, result5.backupDir).split(sep2).join("/")}` }
|
|
22286
22715
|
});
|
|
22287
22716
|
}
|
|
22288
22717
|
} catch (error) {
|