@withgraphite/graphite-cli 1.0.6 → 1.0.8

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/.CHANGELOG.md CHANGED
@@ -1,15 +1,38 @@
1
1
  # Graphite CLI Changelog
2
2
 
3
+ # 1.0.8 2023-10-16
4
+
5
+ - Added a `--update` option for `create` and `modify` that stages changes to all already-tracked files.
6
+ - Added support for `gt get <pr-number>`.
7
+ - Added a `--comment` flag to `submit` which will add a comment with the provided text to the submitted PR.
8
+ - Added additional debugging information to the output file of the `--debug` flag.
9
+
10
+ - Fixed a bug where the incorrect version number was displayed after running `gt get` for a remote branch.
11
+
12
+ # 1.0.7 2023-10-04
13
+
14
+ - Added `gt aliases --legacy` command to automatically add all of the old shortcuts to your aliases configuration.
15
+ - Added ability to navigate through prompts using ctrl+n and ctrl+p.
16
+ - Updated `submit` description behavior to include commit messages if no default template exists.
17
+ - Updated how we detect if there are remote changes to a PR that need to be resolved.
18
+
19
+ - Fixed a bug where local state could become corrupt after switching trunk branch.
20
+ - Fixed a bug where we were syncing information for untracked branches.
21
+ - Fixed incorrect `restack` deprecation warning.
22
+
3
23
  # 1.0.6 2023-09-29
24
+
4
25
  - Updated the default behavior on `gt submit` to not restack branches.
5
26
  - Added an optional `--restack` flag to `gt submit`.
6
27
  - Always prompt on `gt submit` if the branch will have conflicts with main.
7
28
 
8
29
  ## 1.0.5 2023-09-18
30
+
9
31
  - Fixed a stray line of output in `gt create`.
10
32
  - Fixed an issue where syncing PR data from remote could set the wrong parent.
11
33
 
12
34
  ## 1.0.4 2023-09-18
35
+
13
36
  - Updated `--help` output to be more consistent and more helpful.
14
37
  - Added a new command `gt aliases` to open up the alias file in your editor.
15
38
  - Now removes `~/.graphite_user_config` once your configuration has been moved to the new location to reduce confusion.
@@ -38,11 +61,13 @@
38
61
  - Fixed the error messge when running a deprecated command to print the correct alias file location.
39
62
 
40
63
  ## 1.0.1 2023-09-14
64
+
41
65
  - Fixed a bug where `gt submit --stack` did not work from the trunk branch.
42
66
 
43
67
  ## 1.0.0 2023-09-13
44
68
 
45
69
  **Renaming and configuration**
70
+
46
71
  - All commands that fell under `branch`, `stack`, `upstack`, `downstack`, `repo`, and `user` have been renamed to drop the noun. Old command names still work, but will be removed in an upcoming version.
47
72
  - The full list of commands is available in `gt --help` or at https://graphite.dev/docs/graphite-cli-v1-command-names.
48
73
  - Graphite now supports custom aliasing for any command via `~/.config/graphite/aliases` (or `$XDG_CONFIG_HOME/graphite/aliases`).
@@ -52,11 +77,13 @@
52
77
  - Graphite's user-level configuration files are now XDG Base Directory Specification compliant, or stored in `~/.config/graphite` by default.
53
78
 
54
79
  **gt create**
80
+
55
81
  - `gt create` is the new command to create a Graphite branch (formerly `branch create`)
56
82
  - `gt create` now supports inferring a branch name from the commit editor, which means it is now possible to run it with no arguments.
57
83
  - If you have unstaged changes and no staged changes when running `gt create`, you are now asked whether you'd like to stage and commit them as part of the new branch.
58
84
 
59
85
  **gt modify**
86
+
60
87
  - `gt modify` is the new command to modify a Graphite branch (formerly `gt commit amend`/`gt commit create`).
61
88
  - The default behavior is to amend the current commit on the branch, unless the branch has no commits or `--commit` is passed.
62
89
  - When amending a commit, the editor is not opened by default unless `-e`/`--edit` is passed.
@@ -64,11 +91,13 @@
64
91
  - `gt branch edit` has been moved to `gt modify --interactive-rebase`
65
92
 
66
93
  **gt sync**
94
+
67
95
  - `gt sync` is the new command to update your trunk branch, clean up merged branches, and restack most branches in your repo.
68
96
  - `gt sync` now restacks all branches by default (no longer need `-r`).
69
97
  - If any branch has conflicts with its parent branch, instead of launching you into a conflict resolution, `sync` will print out the list of conflicting branches so that you can run `gt restack` on them.
70
98
 
71
99
  **gt submit**
100
+
72
101
  - `gt submit` is the new command to push branches to GitHub and create stacked PRs for them.
73
102
  - `gt submit` submits the currently checked out branch and its ancestors (dependent branches) by default.
74
103
  - `gt ss` is included in the alias file by default as an alias for `gt submit --stack`, which replicates the behavior of the old `gt stack submit`
@@ -76,6 +105,7 @@
76
105
  - `gt submit` now ensures that your branches are restacked instead of failing when they aren't.
77
106
 
78
107
  **Entirely new commands**
108
+
79
109
  - `gt pop` to delete the current branch and check out its parent without modifying the working tree. Can't be run if the current branch has children.
80
110
  - `gt trunk` to navigate directly to your trunk branch.
81
111
  - `gt parent` to print out the raw parent of the branch (for scripting).
@@ -83,11 +113,13 @@
83
113
  - `gt revert` (experimental) to create a branch that reverts a commit in your trunk branch.
84
114
 
85
115
  **Other changes**
116
+
86
117
  - Added a new `--stat` flag to `gt info` that prints out a diffstat instead of a full diff. Compatible with either `--diff` or `--patch`.
87
118
  - `gt create --insert` now asks which siblings should be moved onto the new branch if there are more than one of them.
88
119
  - Performance improvements.
89
120
 
90
121
  **Bug fixes**
122
+
91
123
  - Fixed a bug where stray output was printed while completing command names.
92
124
  - Fixed an issue where a single optional PR template was interpreted as required PR template.
93
125
  - Fixed a bug where branch prefixes could not end with a slash.
@@ -96,18 +128,21 @@
96
128
  - Fixed a bug where the `--patch` flag to `create` and `modify` did not include new files.
97
129
 
98
130
  **Notes**
131
+
99
132
  - The `test` command has been temporarily removed due to persistent bugginess, but will be added back when we have time to dedicate to making it work well. For now, one option is to script using the new `gt children` and `gt parent` commands, which should handle most use cases.
100
133
  - We are still working on further improvements to `sync` and would love your feedback in this area!
101
134
  - We'd also love to ehar about how we can make `revert` work best for you!
102
135
  - As of the release of this version, certain parts of the web app and docs may still reference the old command names. We're updating those places as you read this!
103
136
 
104
137
  ## 0.22.16 2023-09-08
138
+
105
139
  - Added autocomplete support for the renamed commands.
106
140
 
107
141
  - Fixed a bug in `get` when the PR does not exist locally.
108
142
 
109
143
  ## 0.22.15 2023-09-07
110
- - Introduced an environment variable to preview the command rename and custom aliasing system that will be released next week as Graphite CLI v1. For more details, see https://graphite.dev/docs/graphite-cli-v1-command-names.
144
+
145
+ - Introduced an environment variable to preview the command rename and custom aliasing system that will be released next week as Graphite CLI v1. For more details, see https://graphite.dev/docs/graphite-cli-v1-command-names.
111
146
  - Introduced a new interactive command `gt config` which covers all user- and repo-level configurations. The `gt user` and `gt repo` top-level commands will be deprecated in an upcoming release.
112
147
 
113
148
  - `checkout` now prompts to `sync` when the branch's PR has been merged.
@@ -118,6 +153,7 @@
118
153
  - Fixed a bug where an `git range-diff` failure could block submit.
119
154
 
120
155
  ## 0.22.14 2023-09-06
156
+
121
157
  - Fixed a bug where users with a Yubikey-protected SSH key were unable to `sync`.
122
158
  - Fixed a bug where an uncaught IPC exception would appear after running a command.
123
159
 
@@ -144,10 +180,9 @@
144
180
  - Fixed an issue where `downstack get` failed with an incorrect error message.
145
181
  - Fixed some issues with incosistent failures in `get`
146
182
 
147
-
148
183
  - Added an experimental `.graphite_aliases` file (see below)
149
184
 
150
- We are currently in the process of renaming all Graphite commands. This version is the first one with the full set of renamed commands implemented. If you'd like to try out this new command surface, you can add "export GT_RENAME=1" to your shell configuration file (e.g. ~/.zshrc) to be warned when you run a renamed command and what the new name is. It may be unstable and is primarily meant for employee testing purposes until further notice. There is no overlap between the old set of commands and the new set. For more information, see https://www.notion.so/withgraphite/Proposal-for-Graphite-CLI-changes-400d068c7c8546fcbc90b5573e6f27e9?pvs=4.
185
+ We are currently in the process of renaming all Graphite commands. This version is the first one with the full set of renamed commands implemented. If you'd like to try out this new command surface, you can add "export GT_RENAME=1" to your shell configuration file (e.g. ~/.zshrc) to be warned when you run a renamed command and what the new name is. It may be unstable and is primarily meant for employee testing purposes until further notice. There is no overlap between the old set of commands and the new set. For more information, see https://www.notion.so/withgraphite/Proposal-for-Graphite-CLI-changes-400d068c7c8546fcbc90b5573e6f27e9?pvs=4.
151
186
 
152
187
  The cool part is that turning this configuration on allows you to set custom aliases via the `~/.graphite_aliases` file, which we know some of you have been asking us about for quite a while!
153
188
 
@@ -183,7 +218,7 @@ The cool part is that turning this configuration on allows you to set custom ali
183
218
  - `downstack get` now automatically pulls in changes from GitHub if the local state of the branch matches a submitted version of the branch's open pull request.
184
219
  - `submit` commands now suggest running `downstack get` when the above situation is detected.
185
220
 
186
- - YubiKey prompting for SSH is now moved behind a config, in order to address some bugs that passing through the YubiKey prompt introduced. If you are using a YubiKey to authenticate with GitHub, you can enable this config with `gt user yubikey --enable`.
221
+ - YubiKey prompting for SSH is now moved behind a config, in order to address some bugs that passing through the YubiKey prompt introduced. If you are using a YubiKey to authenticate with GitHub, you can enable this config with `gt user yubikey --enable`.
187
222
 
188
223
  - Added a global `--cwd` flag to run any Graphite command in a directory other than the one it is initiated from.
189
224
 
package/325.js CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- "use strict";exports.id=325,exports.ids=[325],exports.modules={33800:(e,t)=>{var s;Object.defineProperty(t,"__esModule",{value:!0}),t.comparisonIsAgainstHead=t.labelForComparison=t.revsetArgsForComparison=t.ComparisonType=void 0,function(e){e.UncommittedChanges="UNCOMMITTED",e.HeadChanges="HEAD",e.StackChanges="STACK",e.Committed="InCommit"}(s=t.ComparisonType||(t.ComparisonType={})),t.revsetArgsForComparison=function(e){switch(e.type){case s.UncommittedChanges:return["uncommitted"];case s.HeadChanges:return["head"];case s.StackChanges:return["stack"];case s.Committed:return["stack","--ref",e.hash]}},t.labelForComparison=function(e){switch(e.type){case s.UncommittedChanges:return"Uncommitted Changes";case s.HeadChanges:return"Head Changes";case s.StackChanges:return"Stack Changes";case s.Committed:return`In ${e.hash}`}},t.comparisonIsAgainstHead=function(e){switch(e.type){case s.UncommittedChanges:case s.HeadChanges:case s.StackChanges:return!0;case s.Committed:return!1}}},52060:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},2982:(e,t,s)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.cached=t.LRU=void 0;const n=s(30826);class i{constructor(e,t=3){this.maxItems=e,this.maxHashCollision=t,this.cache=new Map}get(e){let t;const s=r(e),i=this.cache.get(s);if(void 0!==i){const r=i.get(e);if(void 0!==r)t=r;else for(const[s,r]of i)if((0,n.is)(e,s)){t=r;break}this.cache.delete(s),this.cache.set(s,i)}return t}set(e,t){const s=r(e);let n=this.cache.get(s);if(void 0===n||n.size>=this.maxHashCollision?n=new Map([[e,t]]):n.set(e,t),this.cache.delete(s),void 0!==t&&(this.cache.set(s,n),this.cache.size>this.maxItems)){const e=this.cache.keys().next();e.done||this.cache.delete(e.value)}}delete(e){const t=r(e);this.cache.delete(t)}clear(){this.cache.clear()}}function r(e){const t=null==e?void 0:e.hashCode;return void 0!==t?t.apply(e):e}function o(e,t){var s,r;const o=null!==(s=null==t?void 0:t.cache)&&void 0!==s?s:new i(null!==(r=null==t?void 0:t.cacheSize)&&void 0!==r?r:10),a=null==t?void 0:t.getExtraKeys,l=function(...t){var s,i,r;const l=o.stats;if(!t.every(c))return null!=l&&(l.skip=(null!==(s=l.skip)&&void 0!==s?s:0)+1),e.apply(this,t);const h=(0,n.List)(a?[...a.apply(this),...t]:t),u=o.get(h);if(void 0!==u)return null!=l&&(l.hit=(null!==(i=l.hit)&&void 0!==i?i:0)+1),u;null!=l&&(l.miss=(null!==(r=l.miss)&&void 0!==r?r:0)+1);const d=e.apply(this,t);return o.set(h,d),d};return l.cache=o,l}t.LRU=i,t.cached=function(e,t){return"function"==typeof e?o(e,t):function(e){var t;const s=null!==(t=null==e?void 0:e.getExtraKeys)&&void 0!==t?t:function(){return(0,n.isValueObject)(this)?[this]:null!=this&&"object"==typeof this?Object.values(this).filter(c):[]};return function(t,n,i){const r=i.value;i.value=o(r,Object.assign(Object.assign({},e),{getExtraKeys:s}))}}(e)};const a=new Set(["number","string","boolean","symbol","bigint","undefined","null"]);function c(e){if(null==e)return!0;const t=typeof e;return!!a.has(t)||!("object"!==t||!(0,n.isValueObject)(e))}},61110:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},5693:function(e,t,s){var n=this&&this.__createBinding||(Object.create?function(e,t,s,n){void 0===n&&(n=s);var i=Object.getOwnPropertyDescriptor(t,s);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[s]}}),Object.defineProperty(e,n,i)}:function(e,t,s,n){void 0===n&&(n=s),e[n]=t[s]}),i=this&&this.__exportStar||function(e,t){for(var s in e)"default"===s||Object.prototype.hasOwnProperty.call(t,s)||n(t,e,s)};Object.defineProperty(t,"__esModule",{value:!0}),i(s(61110),t),i(s(52568),t),i(s(11268),t),i(s(66877),t)},52568:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},11268:(e,t,s)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Tracker=void 0;const n=s(48427);class i{constructor(e,t){this.sendData=e,this.context=t}error(e,t,s,n){const i=s instanceof Error?s.message||String(s):s;return this.track(e,Object.assign(Object.assign({},null!=n?n:{}),{errorMessage:i,errorName:t}))}operation(e,t,s,i){var r;const o=Date.now(),a=null!==(r=null==s?void 0:s.id)&&void 0!==r?r:(0,n.randomId)();try{const r=i({parentId:a});if((0,n.isPromise)(r))return r.then((t=>{const n=Date.now()-o;return this.track(e,Object.assign(Object.assign({},null!=s?s:{}),{duration:n,id:a})),t})).catch((n=>{const i=Date.now()-o;return this.error(e,t,n,Object.assign(Object.assign({},null!=s?s:{}),{duration:i,id:a})),Promise.reject(n)}));{const t=Date.now()-o;return this.track(e,Object.assign(Object.assign({},null!=s?s:{}),{duration:t,id:a})),r}}catch(n){const i=Date.now()-o;throw this.error(e,t,n,Object.assign(Object.assign({},null!=s?s:{}),{duration:i,id:a})),n}}trackAsParent(e,t){var s;const r=null!==(s=null==t?void 0:t.id)&&void 0!==s?s:(0,n.randomId)();return this.trackData(Object.assign(Object.assign({},t),{eventName:e,id:r})),new i(((e,t)=>this.trackData(Object.assign(Object.assign({},e),t))),{parentId:r})}track(e,t){return this.trackData(Object.assign(Object.assign({},t),{eventName:e}))}trackData(e){var t,s;const i=null!==(t=null==e?void 0:e.id)&&void 0!==t?t:(0,n.randomId)(),r=null!==(s=null==e?void 0:e.timestamp)&&void 0!==s?s:Date.now(),o=Object.assign({timestamp:r,id:i},null!=e?e:{});this.sendData(o,this.context)}}t.Tracker=i},66877:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},33905:(e,t,s)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.newAbortController=void 0;const n=s(53811);t.newAbortController=function(){return"function"==typeof AbortController?new AbortController:new n.AbortController}},66960:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.debounce=void 0,t.debounce=function(e,t,s=void 0,n=!1){let i,r=!0;function o(...a){let c;if(n){if(c=function(){r=!0,i=void 0},!r)return clearTimeout(i),void(i=setTimeout(c,t));r=!1,e.apply(s,a)}else o.reset(),c=function(){i=void 0,e.apply(s,a)};i=setTimeout(c,t)}return o.reset=function(){clearTimeout(i),i=void 0,r=!0},o.isPending=function(){return null!=i},o}},90828:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SelfUpdate=void 0;class s{constructor(e){this.inner=e}hashCode(){return this.inner.hashCode()+1}equals(e){if(!(e instanceof s))return!1;if(this===e)return!0;const t=e.inner,n=this.inner.equals(t);return n&&this.inner!==t&&(this.inner=t),n}}t.SelfUpdate=s},98696:function(e,t,s){var n=this&&this.__createBinding||(Object.create?function(e,t,s,n){void 0===n&&(n=s);var i=Object.getOwnPropertyDescriptor(t,s);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[s]}}),Object.defineProperty(e,n,i)}:function(e,t,s,n){void 0===n&&(n=s),e[n]=t[s]}),i=this&&this.__exportStar||function(e,t){for(var s in e)"default"===s||Object.prototype.hasOwnProperty.call(t,s)||n(t,e,s)};Object.defineProperty(t,"__esModule",{value:!0}),i(s(5693),t),i(s(33800),t),i(s(86099),t),i(s(40256),t),i(s(85249),t),i(s(48427),t),i(s(66224),t),i(s(2982),t),i(s(13035),t),i(s(90828),t),i(s(52060),t),i(s(66960),t),i(s(33905),t),i(s(75905),t)},13035:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.minimalDisambiguousPaths=void 0,t.minimalDisambiguousPaths=function(e,t={}){const s=e.map((e=>{const t=function(e){return e.replace(/[^\\]/g,"").length>e.replace(/[^/]/g,"").length?"\\":"/"}(e),s=/^(\w:).*/.exec(e),n=null!=s?s[1]:"";return{depth:null,parts:e.split(t).reverse().filter((e=>""!==e&&e!==n)),rootPrefix:n,separator:t,hadLeadingSeparator:e.startsWith(t)||n.length>0&&e.startsWith(n)}})),n=null==t.maxDepth?Math.max(...s.map((e=>e.parts.length))):t.maxDepth,i=new Set(s),r=new Map;for(let e=1;e<=n;e++){r.clear();for(const t of i){const s=t.parts.slice(0,e).join(t.separator);r.has(s)||r.set(s,new Set),r.get(s).add(t)}for(const t of r.values())if(1===t.size){const s=Array.from(t)[0];s.depth=e,i.delete(s)}}return s.map((({depth:e,parts:s,rootPrefix:i,separator:r,hadLeadingSeparator:o})=>{var a;let c=s.slice(0,null==e?n:e).reverse();return 0===c.length?`${i}${r}`:((1===c.length&&""===c[0]||c.length>1&&""!==c[0])&&(c=c.length===s.length?o?[i,...c]:c:(null!==(a=t.alwaysShowLeadingSeparator)&&void 0!==a?a:o)?["",...c]:c),c.join(r))}))}},75905:(e,t)=>{var s;Object.defineProperty(t,"__esModule",{value:!0}),t.parsePatch=t.DiffType=void 0,function(e){e.Modified="Modified",e.Added="Added",e.Removed="Removed",e.Renamed="Renamed",e.Copied="Copied"}(s=t.DiffType||(t.DiffType={}));const n=/^diff --git (.*) (.*)$/,i=/^rename from (.*)$/,r=/^rename to (.*)$/,o=/^copy from (.*)$/,a=/^copy to (.*)$/,c=/^new file mode (\d{6})$/,l=/^deleted file mode (\d{6})$/,h=/^old mode (\d{6})$/,u=/^new mode (\d{6})$/,d=/@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/,m=/^--- (.*)$/,p=/^\+\+\+ (.*)$/,g=/\r\n|[\n\v\f\r\x85]/g;function f(e,t){if(!1===e)throw new Error(t)}t.parsePatch=function(e){const t=e.split(g),v=e.match(g)||[],b=[];let y=0;function w(){const e={hunks:[]};for(b.push(e),function(e){for(;y<t.length;){const s=t[y],i=n.exec(s);if(i){e.oldFileName=i[1],e.newFileName=i[2],y++;break}y++}}(e);y<t.length;){const s=t[y];if(/^old mode/.test(s))C(e);else if(/^new mode/.test(s))S(e);else if(/^deleted file mode/.test(s))O(e);else if(/^new file mode/.test(s))E(e);else if(/^copy /.test(s))R(e);else if(/^rename /.test(s))k(e);else{if(/^--- /.test(s)){_(e);break}if(/^diff --git/.test(s))break;y++}}!function(e){for(;y<t.length;){const s=t[y];if(n.test(s))break;/^@@/.test(s)?e.hunks.push(M()):y++}}(e)}function C(e){const n=h.exec(t[y]);f(null!==n,`invalid format '${t[y]}'`),e.oldMode=n[1],e.type=s.Modified,y++}function S(e){const n=u.exec(t[y]);f(null!==n,`invalid format '${t[y]}'`),e.newMode=n[1],e.type=s.Modified,y++}function O(e){const n=l.exec(t[y]);f(null!==n,`invalid format '${t[y]}'`),e.newMode=n[1],e.type=s.Removed,y++}function E(e){const n=c.exec(t[y]);f(null!==n,`invalid format '${t[y]}'`),e.newMode=n[1],e.type=s.Added,y++}function R(e){f(o.test(t[y]),`invalid format '${t[y]}'`),f(a.test(t[y+1]),`invalid format '${t[y+1]}'`),e.type=s.Copied,y+=2}function k(e){f(i.test(t[y]),`invalid format '${t[y]}'`),f(r.test(t[y+1]),`invalid format '${t[y+1]}'`),e.type=s.Renamed,y+=2}function _(e){f(m.test(t[y]),`invalid format '${t[y]}'`),f(p.test(t[y+1]),`invalid format '${t[y+1]}'`),void 0===e.type&&(e.type=s.Modified),y+=2}function M(){const e=t[y++].split(d),s={oldStart:+e[1],oldLines:void 0===e[2]?1:+e[2],newStart:+e[3],newLines:void 0===e[4]?1:+e[4],lines:[],linedelimiters:[]};0===s.oldLines&&(s.oldStart+=1),0===s.newLines&&(s.newStart+=1);let n=0,i=0;for(;y<t.length&&!(0===t[y].indexOf("--- ")&&y+2<t.length&&0===t[y+1].indexOf("+++ ")&&0===t[y+2].indexOf("@@"));y++){const e=0==t[y].length&&y!=t.length-1?" ":t[y][0];if("+"!==e&&"-"!==e&&" "!==e&&"\\"!==e)break;s.lines.push(t[y]),s.linedelimiters.push(v[y]||"\n"),"+"===e?n++:"-"===e?i++:" "===e&&(n++,i++)}return n||1!==s.newLines||(s.newLines=0),i||1!==s.oldLines||(s.oldLines=0),s}for(;y<t.length;)w();return b}},85249:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.deserializeFromString=t.deserialize=t.serializeToString=t.serialize=void 0;const s={__rpcType:"undefined"};function n(e){if(void 0===e)return s;if("number"==typeof e||"boolean"==typeof e||"string"==typeof e||null===e)return e;if(e instanceof Map)return{__rpcType:"Map",data:Array.from(e.entries()).map((([e,t])=>[n(e),n(t)]))};if(e instanceof Set)return{__rpcType:"Set",data:Array.from(e.values()).map(n)};if(e instanceof Error)return{__rpcType:"Error",data:{message:e.message,stack:e.stack}};if(e instanceof Date)return{__rpcType:"Date",data:e.valueOf()};if(Array.isArray(e))return e.map((e=>n(e)));if("object"==typeof e){const t={__rpcType:"object"};for(const[s,i]of Object.entries(e))t[s]=n(i);return t}throw new Error(`cannot serialize argument ${e}`)}function i(e){if("object"!=typeof e||null==e)return e;if(Array.isArray(e))return e.map((e=>i(e)));const t=e;switch(t.__rpcType){case"undefined":return;case"Map":return new Map(t.data.map((([e,t])=>[i(e),i(t)])));case"Set":return new Set(t.data.map(i));case"Error":{const e=new Error;return e.stack=t.data.stack,e.message=t.data.message,e}case"Date":return new Date(t.data);case"object":{const t=e,s={};for(const[e,n]of Object.entries(t))"__rpcType"!==e&&(s[e]=i(n));return s}default:throw new Error(`cannot deserialize unknown type ${t}`)}}t.serialize=n,t.serializeToString=function(e){return JSON.stringify(n(e))},t.deserialize=i,t.deserializeFromString=function(e){return i(JSON.parse(e))}},40256:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},66224:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},50209:(e,t)=>{var s;Object.defineProperty(t,"__esModule",{value:!0}),t.SucceedableRevset=t.CommandRunner=void 0,(s=t.CommandRunner||(t.CommandRunner={})).Graphite="gt",s.CodeReviewProvider="codeReviewProvider",t.SucceedableRevset=function(e){return{type:"succeedable-revset",revset:e}}},74259:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},45852:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},1018:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ErrorShortMessages=t.DEFAULT_DAYS_OF_COMMITS_TO_LOAD=t.ONE_MINUTE_MS=t.CLOSED_AND_SHOULD_NOT_RECONNECT_CODE=void 0,t.CLOSED_AND_SHOULD_NOT_RECONNECT_CODE=4100,t.ONE_MINUTE_MS=6e4,t.DEFAULT_DAYS_OF_COMMITS_TO_LOAD=void 0,(t.ErrorShortMessages||(t.ErrorShortMessages={})).NoCommitsFetched="No commits found"},29641:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},86099:function(e,t,s){var n=this&&this.__createBinding||(Object.create?function(e,t,s,n){void 0===n&&(n=s);var i=Object.getOwnPropertyDescriptor(t,s);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[s]}}),Object.defineProperty(e,n,i)}:function(e,t,s,n){void 0===n&&(n=s),e[n]=t[s]}),i=this&&this.__exportStar||function(e,t){for(var s in e)"default"===s||Object.prototype.hasOwnProperty.call(t,s)||n(t,e,s)};Object.defineProperty(t,"__esModule",{value:!0}),i(s(50209),t),i(s(85119),t),i(s(45852),t),i(s(74259),t),i(s(1018),t),i(s(29641),t)},85119:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},48427:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isPromise=t.truncate=t.zip=t.generatorContains=t.mapObject=t.findParentWithClassName=t.basename=t.defer=t.randomId=t.unwrap=t.notEmpty=void 0,t.notEmpty=function(e){return null!=e},t.unwrap=function(e){if(null==e)throw new Error(`expected value not to be ${e}`);return e},t.randomId=function(){return Date.now().toString(36)+Math.random().toString(36)},t.defer=function(){const e={promise:void 0,resolve:void 0,reject:void 0};return e.promise=new Promise(((t,s)=>{e.resolve=t,e.reject=s})),e},t.basename=function(e,t="/"){const s=e.lastIndexOf(t);return-1===s?e:e.slice(s+1)},t.findParentWithClassName=function(e,t){var s;let n=e;for(;n;){if(null===(s=n.classList)||void 0===s?void 0:s.contains(t))return n;n=n.parentElement}},t.mapObject=function(e,t){return Object.fromEntries(Object.entries(e).map(t))},t.generatorContains=function(e,t){const s="function"==typeof t?t:e=>e===t;for(const t of e)if(s(t))return!0;return!1},t.zip=function*(e,t){const s=e[Symbol.iterator](),n=t[Symbol.iterator]();for(;;){const e=s.next(),t=n.next();if(e.done||t.done)break;yield[e.value,t.value]}},t.truncate=function(e,t=100){return e.length>t?e.substring(0,Math.max(0,t-1))+"…":e},t.isPromise=function(e){return"function"==typeof(null==e?void 0:e.then)}},20325:(e,t,s)=>{s.r(t),s.d(t,{startServer:()=>ne});var n=s(98696),i=s(57147),r=s.n(i),o=s(13685),a=s.n(o),c=s(71017),l=s.n(c),h=s(57310),u=s.n(h),d=s(95352),m=s.n(d),p=s(22037),g=s.n(p);function f(){try{return g().userInfo().username}catch(e){try{const{env:e}=process;return(0,n.unwrap)(e.LOGNAME||e.USER||e.LNAME||e.USERNAME)}catch(t){throw new Error(String(t)+String(e))}}}class v{logger;data;constructor(e,t){this.logger=e,this.data=t}setRepo(e){this.data.repo=e?.codeReviewProvider?.getSummaryName()}}const b=e=>{};var y=s(73837),w=s.n(y);const C=console;var S=s(60492),O=s.n(S),E=s(80909),R=s.n(E),k=s(82361);class _ extends k.EventEmitter{}class M{codeReviewSystem;runCommand;constructor(e,t){this.codeReviewSystem=e,this.runCommand=t}diffSummaries=new _;onChangeDiffSummaries(e){const t=t=>e({value:t}),s=t=>e({error:t});return this.diffSummaries.on("data",t),this.diffSummaries.on("error",s),{dispose:()=>{this.diffSummaries.off("data",t),this.diffSummaries.off("error",s)}}}async triggerDiffSummariesFetch(e){const t=await this.runCommand(["internal-only","prs"]),s=JSON.parse(t.stdout);this.diffSummaries.emit("data",s)}dispose(){this.diffSummaries.removeAllListeners()}getSummaryName(){return`github:${this.codeReviewSystem.hostname}/${this.codeReviewSystem.owner}/${this.codeReviewSystem.repo}`}runExternalCommand(e,t,s,n){throw new Error("GitHub code review provider does not support running external commands")}async typeahead(e,t){return Promise.resolve([])}}class D{logger;runCallback;constructor(e,t){this.logger=e,this.runCallback=t}queuedOperations=[];runningOperation=void 0;abortController=void 0;async runOrQueueOperation(e,t,s,i){if(null!=this.runningOperation)return this.queuedOperations.push({...e,tracker:s}),void t({id:e.id,kind:"queue",queue:this.queuedOperations.map((e=>e.id))});this.runningOperation=e;const r=(...s)=>{switch(s[0]){case"spawn":t({id:e.id,kind:"spawn",queue:this.queuedOperations.map((e=>e.id))});break;case"stdout":t({id:e.id,kind:"stdout",message:s[1]});break;case"stderr":t({id:e.id,kind:"stderr",message:s[1]});break;case"exit":t({id:e.id,kind:"exit",exitCode:s[1],timestamp:Date.now()})}};try{const o=(0,n.newAbortController)();if(this.abortController=o,await s.operation(e.trackEventName,"RunOperationError",{extras:{args:e.args,runner:e.runner}},(t=>this.runCallback(e,i,r,o.signal))),this.runningOperation=void 0,this.queuedOperations.length>0){const e=this.queuedOperations.shift();null!=e&&this.runOrQueueOperation(e,t,e.tracker,i)}}catch(s){const n=s.toString();this.logger.log("error running operation: ",e.args[0],n),t({id:e.id,kind:"error",error:n}),this.queuedOperations=[],this.runningOperation=void 0}}abortRunningOperation(e){this.runningOperation?.id==e&&this.abortController?.abort()}}class T{focusedPages=new Set;visiblePages=new Set;onChangeHandlers=new Set;setState(e,t){switch(t){case"focused":this.focusedPages.add(e),this.visiblePages.add(e);break;case"visible":this.focusedPages.delete(e),this.visiblePages.add(e);break;case"hidden":this.focusedPages.delete(e),this.visiblePages.delete(e)}for(const e of this.onChangeHandlers)e(t)}disposePage(e){this.focusedPages.delete(e),this.visiblePages.delete(e)}hasPageWithFocus(){return this.focusedPages.size>0}hasVisiblePage(){return this.visiblePages.size>0}onChange(e){return this.onChangeHandlers.add(e),()=>this.onChangeHandlers.delete(e)}}class P{maxSimultaneousRunning;log;queued=[];running=[];runs=new _;constructor(e,t){this.maxSimultaneousRunning=e,this.log=t}nextId=1;generateId(){return this.nextId++}async enqueueRun(e){const t=this.generateId();this.queued.push(t),this.tryDequeueNext(),this.running.includes(t)||(this.log?.(`${this.running.length} tasks are already running, enqueuing ID:${t}`),await new Promise((e=>{this.runs.on("run",(s=>{s===t&&(this.log?.(`now allowing ID:${t} to run`),e(void 0))}))})));try{return await e()}finally{this.notifyFinished(t)}}notifyFinished(e){this.running=this.running.filter((t=>t!==e)),this.tryDequeueNext()}tryDequeueNext(){if(this.running.length<this.maxSimultaneousRunning){const e=this.queued.shift();null!=e&&this.run(e)}}run(e){this.running.push(e),this.runs.emit("run",e)}}function N(e){return new Promise((t=>setTimeout(t,e)))}function j(e){let t,s;const n=()=>{const t=e();return s=t.then((()=>s=void 0),(()=>s=void 0)),t},i=()=>(t=void 0,n());return()=>null==s?n():(()=>{if(null==t){if(null==s)throw new Error("pendingCall must not be null!");t=s.then(i,i)}return t})()}var F=s(24678);class I{logger;client;serializedReconnect;reconnectDelayMs=100;subscriptions=new Map;lastKnownClockTimes=new Map;status="initializing";constructor(e){this.logger=e,this.client=new F.Client({watchmanBinaryPath:void 0}),this.initWatchmanClient(),this.serializedReconnect=j((async()=>{let e=0;for(;;)try{return void await this.reconnectClient()}catch(t){this.logger.warn(`reconnectClient failed (try #${e}):`,t instanceof Error?t.message:t),e++,this.reconnectDelayMs*=2,this.reconnectDelayMs>6e4&&(this.reconnectDelayMs=6e4),this.logger.info("Calling reconnectClient from _serializedReconnect in %dms",this.reconnectDelayMs),await N(this.reconnectDelayMs)}}))}setStatus(e){this.logger.log("Watchman status: ",e),this.status=e}async watchDirectoryRecursive(e,t,s){const n=this.fixupName(e,t),i=this.getSubscription(n);if(i)return i.subscriptionCount++,i;{const{watch:t,relative_path:i}=await this.watchProject(e),r=await this.clock(t),o={...s,fields:null!=s&&null!=s.fields?s.fields:["name","new","exists"],since:r};i&&(o.relative_root=i),o.empty_on_fresh_instance=!0;const a={root:t,pathFromSubscriptionRootToSubscriptionPath:i,path:e,name:n,subscriptionCount:1,options:o,emitter:new k.EventEmitter};return this.setSubscription(n,a),await this.subscribe(t,n,o),this.logger.log("watchman subscription %s established",n),this.setStatus("healthy"),a}}async unwatch(e,t){const s=this.fixupName(e,t),n=this.getSubscription(s);null!=n?0==--n.subscriptionCount&&(await this.unsubscribe(n.path,n.name),this.deleteSubscription(s),this.logger.log("watchman subscription %s destroyed",s)):this.logger.error(`No watcher entity found with path [${e}] name [${t}]`)}initWatchmanClient(){this.client.on("end",(()=>{this.setStatus("ended"),this.logger.info("Watchman client ended"),this.client.removeAllListeners(),this.serializedReconnect()})),this.client.on("error",(e=>{const t=this.status;this.logger.error("Error while talking to watchman: ",e),this.setStatus("errored"),this.client.removeAllListeners(),this.client.end(),"initializing"!==t&&this.serializedReconnect()})),this.client.on("subscription",this.onSubscriptionResult.bind(this))}async reconnectClient(){this.logger.info("Ending existing watchman client to reconnect a new one"),this.setStatus("reconnecting"),this.client.removeAllListeners(),this.client.end(),this.client=new F.Client({watchmanBinaryPath:void 0}),this.logger.error("Watchman client disconnected, reconnecting a new client!"),this.initWatchmanClient(),this.logger.info("Watchman client re-initialized, restoring subscriptions"),await this.restoreSubscriptions()}async restoreSubscriptions(){const e=Array.from(this.subscriptions.values()),t=e.length;this.logger.info(`Attempting to restore ${t} Watchman subscriptions.`);let s=0;await Promise.all(e.map((async(e,n)=>{await this.watchProject(e.path),await N(2500);const{name:i,options:r,root:o}=e;e.options.since=this.lastKnownClockTimes.get(o)||await this.clock(o),this.logger.info(`Subscribing to ${i}: (${n+1}/${t})`),await this.subscribe(o,i,r),++s,this.logger.info(`Subscribed to ${i}: (${s}/${t}) complete.`)}))),s>0&&s===t&&(this.logger.info("Successfully reconnected all %d subscriptions.",s),this.reconnectDelayMs=100,this.setStatus("healthy"))}getSubscription(e){return this.subscriptions.get(l().normalize(e))}setSubscription(e,t){const s=l().normalize(e);this.subscriptions.set(s,t)}deleteSubscription(e){const t=l().normalize(e);this.subscriptions.delete(t)}onSubscriptionResult(e){const t=this.getSubscription(e.subscription);if(null!=t){if(null!=e&&null!=e.root&&null!=e.clock&&this.lastKnownClockTimes.set(e.root,e.clock),!0===e.is_fresh_instance)this.logger.warn(`Watch for ${e.root} (${e.subscription}) returned an empty fresh instance.`),t.emitter.emit("fresh-instance");else if(Array.isArray(e.files))t.emitter.emit("change",e.files);else if(!0===e.canceled)this.logger.info(`Watch for ${e.root} was deleted: triggering a reconnect.`),this.client.end();else if(this.subscriptions.values().next().value===t){const t=e["state-enter"],s=e["state-leave"],n=null!=t?`Entering ${t}`:`Leaving ${s}`,i=this.subscriptions.size;this.logger.info(`Subscription state: ${n} (${i})`)}}else this.logger.error("Subscription not found for response:!",e)}fixupName(e,t){return`${e.replace(/\\/g,"-").replace(/\//g,"-")}-${t}`}unsubscribe(e,t){return this.command("unsubscribe",e,t)}async watchProject(e){const t=await this.command("watch-project",e);return t.warning&&this.logger.error("watchman warning: ",t.warning),t}async clock(e){const{clock:t}=await this.command("clock",e);return t}subscribe(e,t,s){return this.logger.info(`Creating Watchman subscription ${String(t)} under ${e}`,JSON.stringify(s)),this.command("subscribe",e,t,s)}async command(...e){try{return await new Promise(((t,s)=>{this.client.command(e,((e,n)=>e?s(e):t(n)))}))}catch(t){throw this.logger.error("Watchman command error: ",e,t),t}}}const x=5*n.ONE_MINUTE_MS,A=1*n.ONE_MINUTE_MS,$=.25*n.ONE_MINUTE_MS;class L{repoInfo;logger;pageFocusTracker;changeCallback;static WATCHMAN_DEFER="hg.update";watchman;disposables=[];constructor(e,t,s,n,i){this.repoInfo=e,this.logger=t,this.pageFocusTracker=s,this.changeCallback=n,this.watchman=i??new I(t),this.setupWatchmanSubscriptions(),this.setupPolling(),this.pageFocusTracker.onChange(this.poll.bind(this))}timeout;lastFetch=(new Date).valueOf();setupPolling(){this.timeout=setTimeout(this.poll,x)}poll=e=>{let t=x;"healthy"!==this.watchman.status&&(this.pageFocusTracker.hasPageWithFocus()?t=$:this.pageFocusTracker.hasVisiblePage()&&(t=A));const s=Date.now()-this.lastFetch;"force"===e||s>=t||"focused"===e&&s>=1e4||"visible"===e&&s>=2e4?(this.changeCallback("everything"),this.lastFetch=Date.now(),clearTimeout(this.timeout),this.timeout=setTimeout(this.poll,t)):(clearTimeout(this.timeout),this.timeout=setTimeout(this.poll,t-s))};async setupWatchmanSubscriptions(){if("success"!==this.repoInfo.type)return;const{repoRoot:e,dotdir:t}=this.repoInfo;if(null==e||null==t)return void this.logger.error(`skipping watchman subscription since ${e} is not a repository`);const s=l().relative(e,t),i="graphite-smartlog-file-change",r="graphite-smartlog-dirstate-change";try{const t=(0,n.debounce)((()=>{this.changeCallback("everything"),this.lastFetch=(new Date).valueOf()}),100),o=await this.watchman.watchDirectoryRecursive(e,r,{fields:["name"],expression:["name",[`${s}/refs/heads`,`${s}/refs/branch-metadata`,`${s}/rebase-merge`,`${s}/index`,`${s}/HEAD`],"wholename"],defer:[L.WATCHMAN_DEFER],empty_on_fresh_instance:!0});o.emitter.on("change",(e=>{e.includes(`${s}/rebase-merge`)&&this.changeCallback("merge conflicts"),e.includes(`${s}/index`)&&this.changeCallback("uncommitted changes"),(e.includes(`${s}/refs/heads`)||e.includes(`${s}/refs/branch-metadata`)||e.includes(`${s}/HEAD`))&&this.changeCallback("branches")})),o.emitter.on("fresh-instance",t);const a=()=>{this.changeCallback("uncommitted changes"),this.lastFetch=(new Date).valueOf()},c=await this.watchman.watchDirectoryRecursive(e,i,{fields:["name"],expression:["allof",["type","f"],["not",["dirname",s]],["not",["match",s,"basename"]]],defer:[L.WATCHMAN_DEFER],empty_on_fresh_instance:!0});c.emitter.on("change",a),c.emitter.on("fresh-instance",a),this.disposables.push((()=>{this.watchman.unwatch(e,r),this.watchman.unwatch(e,i)}))}catch(e){this.logger.error("failed to setup watchman subscriptions",e)}}dispose(){this.disposables.forEach((e=>e())),this.timeout&&(clearTimeout(this.timeout),this.timeout=void 0)}}const U="0.1.4";class q{info;logger;IGNORE_COMMIT_MESSAGE_LINES_REGEX=/^((?:HG|SL):.*)/gm;mergeConflicts=void 0;uncommittedChanges=null;smartlogCommits=null;mergeConflictsEmitter=new _;uncommittedChangesEmitter=new _;smartlogCommitsChangesEmitter=new _;smartlogCommitsBeginFetchingEmitter=new _;uncommittedChangesBeginFetchingEmitter=new _;disposables=[()=>this.mergeConflictsEmitter.removeAllListeners(),()=>this.uncommittedChangesEmitter.removeAllListeners(),()=>this.smartlogCommitsChangesEmitter.removeAllListeners(),()=>this.smartlogCommitsBeginFetchingEmitter.removeAllListeners(),()=>this.uncommittedChangesBeginFetchingEmitter.removeAllListeners()];onDidDispose(e){this.disposables.push(e)}operationQueue;watchForChanges;pageFocusTracker=new T;codeReviewProvider;currentVisibleCommitRangeIndex=0;visibleCommitRanges=[n.DEFAULT_DAYS_OF_COMMITS_TO_LOAD,60,void 0];constructor(e,t){this.info=e,this.logger=t;const s=e.codeReviewSystem;"github"===s.type&&(this.codeReviewProvider=new M(s,this.runCommand.bind(this))),this.watchForChanges=new L(e,t,this.pageFocusTracker,(e=>{"uncommitted changes"===e?this.fetchUncommittedChanges():"branches"===e?this.fetchSmartlogCommits():"merge conflicts"===e?this.checkForMergeConflicts():"everything"===e&&(this.fetchUncommittedChanges(),this.fetchSmartlogCommits(),this.checkForMergeConflicts())})),this.operationQueue=new D(this.logger,((e,t,s,i)=>{if(e.runner===n.CommandRunner.Graphite)return this.runOperation(e,s,t,i);if(e.runner===n.CommandRunner.CodeReviewProvider){const n=this.normalizeOperationArgs(t,e.args);return null==this.codeReviewProvider?.runExternalCommand?Promise.reject(Error("CodeReviewProvider does not support running external commands")):this.codeReviewProvider?.runExternalCommand(t,n,s,i)??Promise.resolve()}return Promise.resolve()}));const i=new Set,r=this.subscribeToSmartlogCommitsChanges((e=>{if(e.commits.value){const t=[],s=e.commits.value.filter((e=>e.pr)).map((e=>e.pr?.number));for(const e of s)i.has(e)||(t.push(e),i.add(e));t.length>0&&this.codeReviewProvider?.triggerDiffSummariesFetch(this.getAllDiffIds())}}));this.checkForMergeConflicts(),this.disposables.push((()=>r.dispose()))}nextVisibleCommitRangeInDays(){return this.currentVisibleCommitRangeIndex+1<this.visibleCommitRanges.length&&this.currentVisibleCommitRangeIndex++,this.visibleCommitRanges[this.currentVisibleCommitRangeIndex]}dispose(){this.disposables.forEach((e=>e())),this.codeReviewProvider?.dispose(),this.watchForChanges.dispose()}onChangeConflictState(e){return this.mergeConflictsEmitter.on("change",e),this.mergeConflicts&&e(this.mergeConflicts),{dispose:()=>this.mergeConflictsEmitter.off("change",e)}}checkForMergeConflicts=j((async()=>{this.logger.info("checking for merge conflicts");const e=null!=this.mergeConflicts;if(!e&&!await(t=l().join(this.info.dotdir,"rebase-merge"),r().promises.stat(t).then((()=>!0)).catch((e=>{if("ENOENT"===e.code)return!1;throw e}))))return void this.logger.info(`conflict state still the same (${e?"IN merge conflict":"NOT in conflict"})`);var t;null==this.mergeConflicts&&(this.mergeConflicts={state:"loading"},this.mergeConflictsEmitter.emit("change",this.mergeConflicts));const s=Date.now();let n;try{const e=await this.runCommand(["internal-only","status"]);n=JSON.parse(e.stdout)}catch(e){return this.logger.error(`failed to check for merge conflicts: ${e}`),this.mergeConflicts=void 0,void this.mergeConflictsEmitter.emit("change",this.mergeConflicts)}if(this.mergeConflicts=function(e,t,s){const n=t;if(!n?.conflicts)return;const i=n.files.filter((e=>"UNRESOLVED"===e.status)),r={state:"loaded",files:[],fetchStartTimestamp:s,fetchCompletedTimestamp:Date.now()};if(null!=e?.files&&e.files.length>0){const t=new Set(i.map((e=>e.path)));r.files=e.files.map((e=>t.has(e.path)?{path:e.path,status:"UNRESOLVED"}:{path:e.path,status:"RESOLVED"}))}else r.files=i.map((e=>({path:e.path,status:"UNRESOLVED"})));return r}(this.mergeConflicts,n,s),this.logger.info(`repo ${this.mergeConflicts?"IS":"IS NOT"} in merge conflicts`),this.mergeConflicts){const e=20,t=(this.mergeConflicts.files??[]).filter((e=>"UNRESOLVED"===e.status)).map((e=>e.path)).slice(0,e);this.logger.info("remaining files with conflicts: ",t)}this.mergeConflictsEmitter.emit("change",this.mergeConflicts)}));getMergeConflicts(){return this.mergeConflicts}static async getRepoInfo(e,t,s){const n=await async function(e,t,s){try{return(await H({command:e,args:["--version"],logger:t,cwd:s})).stdout}catch(e){throw t.error(`Failed to find gt version in ${s}`,e),e}}(e,t,s).catch((e=>e));if(n instanceof Error)return{type:"invalidCommand",command:e??"gt"};if("local"!==n&&R().lt(n,U))return{type:"invalidVersion",command:e??"gt",versionFound:n,versionRequired:U};const[i,r,o,a]=await Promise.all([W(e,t,s),z(e,t,s),B(e,t,s,"graphite.branch_edit").then((e=>e??"amend")),B(e,t,s,"graphite.create_prs_as").then((e=>e??"draft"))]);if(null==r)return{type:"cwdNotARepository",cwd:s};let c;if(void 0===r.remote)c={type:"none"};else{const{owner:e,name:t,hostname:s}=r.remote;c={type:"github",owner:e,repo:t,hostname:s}}const l={type:"success",command:e,dotdir:r.dotDir,repoRoot:r.rootDir,codeReviewSystem:c,preferredBranchEdit:o,createPrsAs:a,profile:i,trunkBranch:r.trunkBranch};return t.info("repo info: ",l),l}async runOrQueueOperation(e,t,s,n){await this.operationQueue.runOrQueueOperation(e,t,s,n),this.watchForChanges.poll("force")}abortRunningOpeation(e){this.operationQueue.abortRunningOperation(e)}normalizeOperationArgs(e,t){const s=(0,n.unwrap)(this.info.repoRoot);return t.map((t=>{if("object"==typeof t)switch(t.type){case"repo-relative-file":return l().normalize(l().relative(e,l().join(s,t.path)));case"succeedable-revset":return`max(successors(${t.revset}))`}return t}))}async runOperation(e,t,s,n){const i=this.normalizeOperationArgs(s,e.args),{stdin:r}=e,{command:o,args:a,options:c}=V(this.info.command,i,s,r?{input:r}:void 0);this.logger.log("run operation: ",o,i.join(" "));const l=O()(o,a,{...c,stdout:"pipe",stderr:"pipe"});t("spawn"),l.stdout?.on("data",(e=>{t("stdout",e.toString())})),l.stderr?.on("data",(e=>{t("stderr",e.toString())})),l.on("exit",(e=>{t("exit",e||0)})),n.addEventListener("abort",(()=>{this.logger.log("kill operation: ",o,i.join(" "))})),function(e,t){t.addEventListener("abort",(()=>{"win32"==g().platform()?e.kill("SIGKILL",{forceKillAfterTimeout:!1}):(e.kill("SIGCONT"),e.kill("SIGTERM",{forceKillAfterTimeout:5e3}))}))}(l,n),await l}setPageFocus(e,t){this.pageFocusTracker.setState(e,t)}getUncommittedChanges(){return this.uncommittedChanges}subscribeToUncommittedChanges(e){return this.uncommittedChangesEmitter.on("change",e),{dispose:()=>{this.uncommittedChangesEmitter.off("change",e)}}}fetchUncommittedChanges=j((async()=>{const e=Date.now();try{this.uncommittedChangesBeginFetchingEmitter.emit("start");const t=await this.runCommand(["internal-only","status"]),s=JSON.parse(t.stdout).files.map((e=>{return{...e,path:(t=e.path,t.startsWith(l().sep)?t.slice(1):t)};var t}));this.uncommittedChanges={fetchStartTimestamp:e,fetchCompletedTimestamp:Date.now(),files:{value:s}},this.uncommittedChangesEmitter.emit("change",this.uncommittedChanges)}catch(s){if(this.logger.error("Error fetching files: ",s),null!=(t=s)&&"object"==typeof t&&"stderr"in t&&s.stderr.includes("checkout is currently in progress"))return void this.logger.info("Ignoring `hg status` error caused by in-progress checkout");this.uncommittedChangesEmitter.emit("change",{fetchStartTimestamp:e,fetchCompletedTimestamp:Date.now(),files:{error:s instanceof Error?s:new Error(s)}})}var t}));getSmartlogCommits(){return this.smartlogCommits}subscribeToSmartlogCommitsChanges(e){return this.smartlogCommitsChangesEmitter.on("change",e),{dispose:()=>{this.smartlogCommitsChangesEmitter.off("change",e)}}}subscribeToSmartlogCommitsBeginFetching(e){const t=()=>e(!0);return this.smartlogCommitsBeginFetchingEmitter.on("start",t),{dispose:()=>{this.smartlogCommitsBeginFetchingEmitter.off("start",t)}}}subscribeToUncommittedChangesBeginFetching(e){const t=()=>e(!0);return this.uncommittedChangesBeginFetchingEmitter.on("start",t),{dispose:()=>{this.uncommittedChangesBeginFetchingEmitter.off("start",t)}}}fetchSmartlogCommits=j((async()=>{const e=Date.now();try{this.smartlogCommitsBeginFetchingEmitter.emit("start");const t=await this.runCommand(["internal-only","log"]),s=function(e,t){let s=[];try{s=JSON.parse(t)}catch(t){e.error("failed to parse branch info",t)}return s}(this.logger,t.stdout.trim());if(0===s.length)throw new Error(n.ErrorShortMessages.NoCommitsFetched);this.smartlogCommits={fetchStartTimestamp:e,fetchCompletedTimestamp:Date.now(),commits:{value:s}},this.smartlogCommitsChangesEmitter.emit("change",this.smartlogCommits)}catch(t){this.logger.error("Error fetching commits: ",t),this.smartlogCommitsChangesEmitter.emit("change",{fetchStartTimestamp:e,fetchCompletedTimestamp:Date.now(),commits:{error:t instanceof Error?t:new Error(t)}})}}));subscribeToHeadCommit(e){let t=this.smartlogCommits?.commits.value?.find((e=>e.isHead));null!=t&&e(t);const s=s=>{const n=s?.commits.value?.find((e=>e.isHead));null!=n&&n.branch!==t?.branch&&(e(n),t=n)};return this.smartlogCommitsChangesEmitter.on("change",s),{dispose:()=>{this.smartlogCommitsChangesEmitter.off("change",s)}}}catLimiter=new P(4,(e=>this.logger.info("[cat]",e)));cat(e,t){const s=l().relative(this.info.repoRoot,e);return this.catLimiter.enqueueRun((async()=>(await this.runCommand(["internal-only","relative-cat",...this.catArgs(t,s)],void 0,{stripFinalNewline:!1})).stdout))}catArgs(e,t){switch(e.type){case n.ComparisonType.UncommittedChanges:return["uncommitted",t];case n.ComparisonType.HeadChanges:return["head",t];case n.ComparisonType.StackChanges:return["stack",t];case n.ComparisonType.Committed:return["stack",t,"--ref",e.hash]}}getAllDiffIds(){return this.getSmartlogCommits()?.commits.value?.map((e=>e.pr?.number)).filter(n.notEmpty)??[]}runCommand(e,t,s){return H({command:this.info.command,args:e,logger:this.logger,cwd:(0,n.unwrap)(t??this.info.repoRoot),options:s})}getConfig(e){return B(this.info.command,this.logger,this.info.repoRoot,e)}setConfig(e,t,s){return async function({command:e,logger:t,cwd:s,level:n,configName:i,configValue:r}){await H({command:e,args:["internal-only","set-config","--level",n,i,r],logger:t,cwd:s})}({command:this.info.command,logger:this.logger,cwd:this.info.repoRoot,level:e,configName:t,configValue:s})}}function H({command:e,args:t,logger:s,cwd:n,options:i}){const{command:r,args:o,options:a}=V(e,t,n,i);return s&&s.log("run command: ",r,...o,a),O()(r,o,a)}async function z(e,t,s){try{return JSON.parse((await H({command:e,args:["internal-only","repo-info"],logger:t,cwd:s})).stdout)}catch(e){return void t.error(`Failed to find repository info in ${s}`,e)}}async function W(e,t,s){try{return JSON.parse((await H({command:e,args:["internal-only","profile"],logger:t,cwd:s})).stdout)}catch(e){return t.error(`Failed to find repository profile in ${s}`,e),{appUrl:"https://app.graphite.dev/"}}}async function B(e,t,s,n){try{return(await H({command:e,args:["internal-only","config",n],logger:t,cwd:s})).stdout.trim()}catch{return}}function V(e,t,s,n){let i=[...t];"win32"!==process.platform&&(i=i.map((e=>e.replace(/\\\\/g,"\\"))));const r={...n,env:{LANG:"en_US.utf-8",EDITOR:void 0,GRAPHITE_INTERACTIVE:"true"},cwd:s};return!e&&process.argv[1].startsWith("/snapshot/")?(e=process.argv[0],i=["/snapshot/monologue/apps/public/cli/dist/graphite.js",...i]):e||(e="gt"),{command:e,args:i,options:r}}var G=s(32081);const J={platformName:"browser",handleMessageFromClient:(e,t)=>{switch(t.type){case"platform/openFile":{const s=l().join((0,n.unwrap)(e?.info.repoRoot),t.path);let i;if(null==i)switch(process.platform){case"darwin":i="/usr/bin/open";break;case"win32":i="notepad.exe";break;case"linux":i="xdg-open"}if(i){e?.logger.log("open file",s);const t=(0,G.spawn)(i,[s],{detached:!0,stdio:"ignore",windowsHide:!1,windowsVerbatimArguments:!0});t.on("error",(t=>{e?.logger.log("failed to open",s,t)})),t.unref()}break}}}};class Q{promise;disposeFunc;constructor(e,t){this.promise=e,this.disposeFunc=t}unref(){this.disposed||(this.disposed=!0,this.disposeFunc())}internalReference;disposed=!1}class K{value;constructor(e){this.value=e}references=0;isDisposed=!1;ref(){this.references++}getNumberOfReferences(){return this.references}dispose(){this.references--,this.isDisposed||0!==this.references||(this.isDisposed=!0,this.value.dispose())}}const X=new class{RepositoryType;constructor(e=q){this.RepositoryType=e}reposByRoot=new Map;activeReposEmitter=new _;lookup(e){for(const s of this.reposByRoot.values())if((e===s.value.info.repoRoot||e.startsWith((t=s.value.info.repoRoot).endsWith(l().sep)?t:t+l().sep))&&!s.isDisposed)return s;var t}getOrCreate(e,t,s){const n=this.lookup(s);if(n)return n.ref(),new Q(Promise.resolve(n.value),(()=>n.dispose()));let i;return i=new Q((async()=>{const n=await this.RepositoryType.getRepoInfo(e,t,s);if("success"!==n.type)return n;if(i.disposed)return{type:"unknownError",error:new Error("Repository already disposed")};const r=this.lookup(n.repoRoot);if(r)return r.ref(),i.internalReference=r,r.value;const o=new this.RepositoryType(n,t),a=new K(o);return a.ref(),i.internalReference=a,this.reposByRoot.set(n.repoRoot,a),this.activeReposEmitter.emit("change"),o})(),(()=>{i.internalReference&&i.internalReference.dispose(),i.unref()})),i}cachedRepositoryForPath(e){const t=this.lookup(e);return t?.value}onChangeActiveRepos(e){const t=()=>{e([...this.reposByRoot.values()].map((e=>e.value)))};return this.activeReposEmitter.on("change",t),t(),()=>this.activeReposEmitter.off("change",t)}clearCache(){this.reposByRoot.forEach((e=>e.dispose())),this.reposByRoot=new Map,this.activeReposEmitter.removeAllListeners()}numberOfActiveServers(){let e=0;for(const t of this.reposByRoot.values())e+=t.getNumberOfReferences();return e}};class Y{platform;connection;tracker;logger;listenersByType=new Map;incomingListener;repoDisposables=[];subscriptions=new Map;activeRepoRef;queuedMessages=[];currentState={type:"loading"};pageId=(0,n.randomId)();constructor(e,t,s,i){this.platform=e,this.connection=t,this.tracker=s,this.logger=i;let r=null;this.incomingListener=this.connection.onDidReceiveMessage(((e,s)=>{if(s)return null==r?void t.logger?.error("Error: got a binary message when not expecting one"):(this.handleIncomingMessageWithPayload(r,e),void(r=null));if(null!=r)return t.logger?.error("Error: didnt get binary payload after a message that requires one"),void(r=null);const i=e.toString("utf-8"),o=(0,n.deserializeFromString)(i);if(function(e){return null!=e&&"object"==typeof e&&!0===e.hasBinaryPayload}(o))r=o;else if("loading"===this.currentState.type)this.queuedMessages.push(o);else try{this.handleIncomingMessage(o)}catch(e){t.logger?.error("error handling incoming message: ",o,e)}}))}setRepoError(e){this.disposeRepoDisposables(),this.currentState={type:"error",error:e},this.tracker.context.setRepo(void 0),this.processQueuedMessages()}setCurrentRepo(e,t){this.disposeRepoDisposables(),this.currentState={type:"repo",repo:e,cwd:t},this.tracker.context.setRepo(e),null!=e.codeReviewProvider&&this.repoDisposables.push(e.codeReviewProvider.onChangeDiffSummaries((e=>{this.postMessage({type:"fetchedDiffSummaries",summaries:e})}))),this.repoDisposables.push(e.subscribeToHeadCommit((t=>{const s=e.getSmartlogCommits(),n=function(e,t){let s;if(null!=e){const n=new Map(e.map((e=>[e.branch,e])));let i=t;for(;null!=i;){if(i.partOfTrunk){s=i;break}if(null==i.parents[0])break;i=n.get(i.parents[0])}}return s}(s?.commits.value,t);this.tracker.track("HeadCommitChanged",{extras:{hash:t.branch,public:n?.branch}})}))),this.processQueuedMessages()}postMessage(e){this.connection.postMessage((0,n.serializeToString)(e)).catch((()=>{console.warn("Failed to post message to client")}))}setActiveRepoForCwd(e){void 0!==this.activeRepoRef&&this.activeRepoRef.unref(),this.logger.info(`Setting active repo cwd to ${e}`),this.currentState={type:"loading"};const t=this.connection.command;this.activeRepoRef=X.getOrCreate(t,this.logger,e),this.activeRepoRef.promise.then((t=>{t instanceof q?this.setCurrentRepo(t,e):this.setRepoError(t)}))}dispose(){this.incomingListener.dispose(),this.disposeRepoDisposables(),void 0!==this.activeRepoRef&&this.activeRepoRef.unref()}disposeRepoDisposables(){this.repoDisposables.forEach((e=>e.dispose())),this.repoDisposables=[],this.subscriptions.forEach((e=>e.dispose())),this.subscriptions.clear()}processQueuedMessages(){for(const e of this.queuedMessages)try{this.handleIncomingMessage(e)}catch(t){this.connection.logger?.error("error handling queued message: ",e,t)}this.queuedMessages=[]}handleIncomingMessageWithPayload(e,t){switch(e.type){case"uploadFile":{const{id:s,filename:i}=e,r=null;if(null==r)return;this.tracker.operation("UploadImage","UploadImageError",{},(()=>r((0,n.unwrap)(this.connection.logger),{filename:i,data:t}))).then((e=>{this.connection.logger?.info("sucessfully uploaded file",i,e),this.postMessage({type:"uploadFileResult",id:s,result:{value:e}})})).catch((e=>{this.connection.logger?.info("error uploading file",i,e),this.postMessage({type:"uploadFileResult",id:s,result:{error:e}})}));break}}}handleIncomingMessage(e){this.handleIncomingGeneralMessage(e);const{currentState:t}=this;switch(t.type){case"repo":{const{repo:s,cwd:n}=t;this.handleIncomingMessageWithRepo(e,s,n);break}case"loading":case"error":e.type.startsWith("platform/")&&(this.platform.handleMessageFromClient(void 0,e,(e=>this.postMessage(e)),(e=>{this.repoDisposables.push({dispose:e})})),this.notifyListeners(e))}}handleIncomingGeneralMessage(e){switch(e.type){case"track":this.tracker.trackData(e.data);break;case"changeCwd":this.setActiveRepoForCwd(e.cwd);break;case"requestRepoInfo":switch(this.currentState.type){case"repo":this.postMessage({type:"repoInfo",info:this.currentState.repo.info,cwd:this.currentState.cwd});break;case"error":this.postMessage({type:"repoInfo",info:this.currentState.error})}break;case"requestApplicationInfo":this.postMessage({type:"applicationInfo",platformName:this.platform.platformName,version:this.connection.version})}}handleIncomingMessageWithRepo(e,t,s){const{logger:i}=t;switch(e.type){case"subscribe":{const{subscriptionID:s,kind:n}=e;switch(n){case"uncommittedChanges":{const e=e=>{this.postMessage({type:"subscriptionResult",kind:"uncommittedChanges",subscriptionID:s,data:e})},n=t.getUncommittedChanges();null!=n&&e(n);const i=[];i.push(t.subscribeToUncommittedChanges(e)),t.fetchUncommittedChanges(),i.push(t.subscribeToUncommittedChangesBeginFetching((()=>this.postMessage({type:"beganFetchingUncommittedChangesEvent"})))),this.subscriptions.set(s,{dispose:()=>{i.forEach((e=>e.dispose()))}});break}case"smartlogCommits":{const e=e=>{this.postMessage({type:"subscriptionResult",kind:"smartlogCommits",subscriptionID:s,data:e})},n=t.getSmartlogCommits();null!=n&&e(n);const i=[];i.push(t.subscribeToSmartlogCommitsChanges(e)),t.fetchSmartlogCommits(),i.push(t.subscribeToSmartlogCommitsBeginFetching((()=>this.postMessage({type:"beganFetchingSmartlogCommitsEvent"})))),this.subscriptions.set(s,{dispose:()=>{i.forEach((e=>e.dispose()))}});break}case"mergeConflicts":{const e=e=>{this.postMessage({type:"subscriptionResult",kind:"mergeConflicts",subscriptionID:s,data:e})},n=t.getMergeConflicts();null!=n&&e(n),this.subscriptions.set(s,t.onChangeConflictState(e));break}}break}case"unsubscribe":{const t=this.subscriptions.get(e.subscriptionID);t?.dispose(),this.subscriptions.delete(e.subscriptionID);break}case"runOperation":{const{operation:n}=e;t.runOrQueueOperation(n,(e=>{this.postMessage({type:"operationProgress",...e}),"queue"===e.kind&&this.tracker.track("QueueOperation",{extras:{operation:n.trackEventName}})}),this.tracker,s);break}case"abortRunningOperation":{const{operationId:s}=e;t.abortRunningOpeation(s);break}case"getConfig":t.getConfig(e.name).catch((()=>{})).then((t=>{i.info("got config",e.name,t),this.postMessage({type:"gotConfig",name:e.name,value:t})}));break;case"fetchRepoMessage":t.runCommand(["internal-only","repo-message"]).then((e=>({value:e.stdout}))).catch((e=>(i?.error("error fetching repo message",e.toString()),{error:e}))).then((e=>this.postMessage({type:"fetchedRepoMessage",message:e.value||""})));break;case"fetchUpgradePrompt":t.runCommand(["internal-only","upgrade-prompt"]).then((e=>({value:e.stdout}))).catch((e=>(i?.error("error fetching upgrade prompt",e.toString()),{error:e}))).then((e=>this.postMessage({type:"fetchedUpgradePrompt",message:e.value||""})));break;case"setConfig":i.info("set config",e.name,e.value),t.setConfig("user",e.name,e.value).catch((t=>{i.error("error setting config",e.name,e.value,t)}));break;case"deleteFile":{const{filePath:s}=e,n=function(e,t,s=l()){const n=s.resolve(t.info.repoRoot,e);return n.startsWith(t.info.repoRoot+s.sep)?n:null}(s,t);if(null==n)return void i.warn("can't delete file outside of the repo",s);r().promises.rm(n).then((()=>{i.info("deleted file from filesystem",n)})).catch((e=>{i.error("unable to delete file",n,e)}));break}case"requestComparison":{const{comparison:s}=e;t.runCommand(["internal-only","diff",...(0,n.revsetArgsForComparison)(s)]).then((e=>({value:e.stdout}))).catch((e=>(i?.error("error running diff",e.toString()),{error:e}))).then((e=>this.postMessage({type:"comparison",comparison:s,data:{diff:e}})));break}case"requestChangedFiles":{const{branch:s}=e;t.runCommand(["internal-only","changed-files",s]).then((e=>JSON.parse(e.stdout))).catch((e=>(i?.error("error running diff",e.toString()),{error:e}))).then((e=>this.postMessage({type:"changedFiles",branch:s,data:e})));break}case"requestComparisonContextLines":{const{id:{path:s,comparison:n},start:i,numLines:r}=e;t.cat(s,n).catch((()=>"")).then((e=>this.postMessage({type:"comparisonContextLines",lines:e.split("\n").slice(i-1,i-1+r),path:s})));break}case"refresh":i?.log("refresh requested"),t.fetchSmartlogCommits(),t.fetchUncommittedChanges(),t.codeReviewProvider?.triggerDiffSummariesFetch(t.getAllDiffIds());break;case"pageVisibility":t.setPageFocus(this.pageId,e.state);break;case"fetchCommitMessageTemplate":t.runCommand(["internal-only","templates"]).then((e=>{const s=JSON.parse(e.stdout);this.postMessage({type:"fetchedCommitMessageTemplate",templates:Object.fromEntries(Object.entries(s).map((([e,s])=>[e,s.replace(t.IGNORE_COMMIT_MESSAGE_LINES_REGEX,"")])))})})).catch((e=>{i?.error("Could not fetch commit message template",e)}));break;case"typeahead":t.codeReviewProvider?.typeahead?.(e.kind,e.query)?.then((t=>this.postMessage({type:"typeaheadResult",id:e.id,result:t})));break;case"fetchDiffSummaries":t.codeReviewProvider?.triggerDiffSummariesFetch(t.getAllDiffIds());break;case"loadMoreCommits":{const e=t.nextVisibleCommitRangeInDays();return this.postMessage({type:"commitsShownRange",rangeInDays:e}),this.postMessage({type:"beganLoadingMoreCommits"}),t.fetchSmartlogCommits(),void this.tracker.track("LoadMoreCommits",{extras:{daysToFetch:e??"Infinity"}})}default:this.platform.handleMessageFromClient(t,e,(e=>this.postMessage(e)),(e=>{this.repoDisposables.push({dispose:e})}))}this.notifyListeners(e)}notifyListeners(e){const t=this.listenersByType.get(e.type);t&&t.forEach((t=>t(e)))}}var Z=s(6113);const ee="win32"==process.platform?l().join((0,n.unwrap)(process.env.LOCALAPPDATA),"cache"):"darwin"==process.platform?l().join(g().homedir(),"Library/Caches"):process.env.XDG_CACHE_HOME||l().join(g().homedir(),".cache");function te(e,t){const s=Buffer.from(e),n=Buffer.from(t);return s.length===n.length&&(0,Z.timingSafeEqual)(s,n)}function se(e){const t=e.logger??(e.logFileLocation?function(e){const t=(...t)=>{const s=w().format(...t)+"\n";r().promises.appendFile(e,s)};return{info:t,log:t,warn:t,error:t,getLogFileContents:()=>r().promises.readFile(e,"utf-8")}}(e.logFileLocation):C);e.logger=t;const s=e?.platform??J,i=e?.version??"unknown";t.log(`establish client connection for ${e.cwd}`),t.log(`platform '${s.platformName}', version '${i}'`);const o=function(e,t,s,i=b){return new n.Tracker(((e,t)=>{const{logger:s}=t;s.log("[track]",e.eventName,e.errorName??"",e.errorMessage??"",null!=e.extras?JSON.stringify(e.extras):"");try{Promise.resolve(i({...e,...t.data})).catch((e=>{}))}catch{}}),new v(e,function(e,t){return{platform:e,version:t,repo:void 0,sessionId:(0,n.randomId)(),unixname:f(),osArch:g().arch(),osType:g().platform(),osRelease:g().release(),hostname:g().hostname()}}(t.platformName,s)))}(t,s,i,(t=>H({command:e.command||"gt",args:["internal-only","log-action",t.eventName||t.errorName||"UNKNOWN_CLI_EVENT",(t.timestamp?new Date(t.timestamp):new Date).toISOString(),JSON.stringify(t)],cwd:e.cwd})));o.track("ClientConnection",{extras:{cwd:e.cwd}});let a=new Y(s,e,o,t);return a.setActiveRepoForCwd(e.cwd),()=>{a?.dispose(),a=null}}function ne({port:e,sensitiveToken:t,challengeToken:s,logFileLocation:i,logInfo:o,command:c,gtVersion:h,foreground:d,frontendDir:p}){return new Promise((g=>{try{const e=JSON.parse(r().readFileSync(l().join(p,"build/asset-manifest.json"),"utf-8"));for(const t of Object.values(e.files))t.startsWith("/")||g({type:"error",error:`expected entry to start with / but was: \`${t}\``}),oe[t]=t.slice(1)}catch(e){}oe["/favicon.ico"]="favicon.ico";const f=a().createServer((async(e,n)=>{if(e.url){const{pathname:o}=u().parse(e.url);if(null!=o&&oe.hasOwnProperty(o)){const e=oe[o];let t;try{t=await r().promises.readFile(l().join(p,"build",e))}catch(e){return n.writeHead(500,{"Content-Type":"text/plain"}),void n.end((i=e.toString(),i.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#27;")))}const s=e.lastIndexOf("."),a=e.slice(s+1),c=re[a]??"text/plain";return n.writeHead(200,{"Content-Type":c}),void n.end(t)}if("/challenge_authenticity"===o){const i=ie(e.url).get("token");if(i&&te(i,t)){n.writeHead(200,{"Content-Type":"text/json"});const e={challengeToken:s,pid:process.pid};n.end(JSON.stringify(e))}else n.writeHead(401,{"Content-Type":"text/json"}),n.end(JSON.stringify({error:"invalid token"}));return}}var i;n.writeHead(404,{"Content-Type":"text/html"}),n.end("<html><body>Not Found!</body></html>")})),v=f.listen(e),b=new(m().Server)({noServer:!0,path:"/ws"});b.on("connection",((e,s)=>{let r,a,l;if(s.url){const e=ie(s.url);r=e.get("token");const t=e.get("cwd");l=e.get("platform"),t&&(a=decodeURIComponent(t))}if(!r){const t="No token provided in websocket request";return o("closing ws:",t),void e.close(n.CLOSED_AND_SHOULD_NOT_RECONNECT_CODE,t)}if(!te(r,t)){const t="Invalid token";return o("closing ws:",t),void e.close(n.CLOSED_AND_SHOULD_NOT_RECONNECT_CODE,t)}const u=se({postMessage:t=>(e.send(t),Promise.resolve(!0)),onDidReceiveMessage(t){const s=e.on("message",t);return{dispose:()=>s.off("message",t)}},cwd:a??process.cwd(),logFileLocation:"stdout"===i?void 0:i,command:c,version:h,platform:void 0});e.on("close",(()=>{u(),d||setTimeout((()=>{0===X.numberOfActiveServers()&&process.exit(0)}),6e4)}))})),v.on("upgrade",((e,t,s)=>{b.handleUpgrade(e,t,s,(t=>{b.emit("connection",t,e)}))})),f.on("error",(function(t){if("listen"!==t.syscall)throw g({type:"error",error:t.toString()}),t;switch(t.code){case"EACCES":throw g({type:"error",error:`Port ${e} requires elevated privileges`}),t;case"EADDRINUSE":return void g({type:"addressInUse"});default:throw g({type:"error",error:t.toString()}),t}})),f.on("listening",(()=>g({type:"success",port:f.address().port,pid:process.pid})))}))}function ie(e){const t=u().parse(e).search?.replace(/^\?/,"").split("&").map((e=>e.split("=")));return new Map(t)}l().join(ee,"graphite-gti");const re={css:"text/css",html:"text/html",js:"text/javascript",ttf:"font/ttf"},oe={"/":"index.html"}}};
2
+ "use strict";exports.id=325,exports.ids=[325],exports.modules={33800:(e,t)=>{var s;Object.defineProperty(t,"__esModule",{value:!0}),t.comparisonIsAgainstHead=t.labelForComparison=t.revsetArgsForComparison=t.ComparisonType=void 0,function(e){e.UncommittedChanges="UNCOMMITTED",e.HeadChanges="HEAD",e.StackChanges="STACK",e.Committed="InCommit"}(s=t.ComparisonType||(t.ComparisonType={})),t.revsetArgsForComparison=function(e){switch(e.type){case s.UncommittedChanges:return["uncommitted"];case s.HeadChanges:return["head"];case s.StackChanges:return["stack"];case s.Committed:return["stack","--ref",e.hash]}},t.labelForComparison=function(e){switch(e.type){case s.UncommittedChanges:return"Uncommitted Changes";case s.HeadChanges:return"Head Changes";case s.StackChanges:return"Stack Changes";case s.Committed:return`In ${e.hash}`}},t.comparisonIsAgainstHead=function(e){switch(e.type){case s.UncommittedChanges:case s.HeadChanges:case s.StackChanges:return!0;case s.Committed:return!1}}},52060:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},2982:(e,t,s)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.cached=t.LRU=void 0;const n=s(30826);class i{constructor(e,t=3){this.maxItems=e,this.maxHashCollision=t,this.cache=new Map}get(e){let t;const s=r(e),i=this.cache.get(s);if(void 0!==i){const r=i.get(e);if(void 0!==r)t=r;else for(const[s,r]of i)if((0,n.is)(e,s)){t=r;break}this.cache.delete(s),this.cache.set(s,i)}return t}set(e,t){const s=r(e);let n=this.cache.get(s);if(void 0===n||n.size>=this.maxHashCollision?n=new Map([[e,t]]):n.set(e,t),this.cache.delete(s),void 0!==t&&(this.cache.set(s,n),this.cache.size>this.maxItems)){const e=this.cache.keys().next();e.done||this.cache.delete(e.value)}}delete(e){const t=r(e);this.cache.delete(t)}clear(){this.cache.clear()}}function r(e){const t=null==e?void 0:e.hashCode;return void 0!==t?t.apply(e):e}function o(e,t){var s,r;const o=null!==(s=null==t?void 0:t.cache)&&void 0!==s?s:new i(null!==(r=null==t?void 0:t.cacheSize)&&void 0!==r?r:10),a=null==t?void 0:t.getExtraKeys,l=function(...t){var s,i,r;const l=o.stats;if(!t.every(c))return null!=l&&(l.skip=(null!==(s=l.skip)&&void 0!==s?s:0)+1),e.apply(this,t);const h=(0,n.List)(a?[...a.apply(this),...t]:t),u=o.get(h);if(void 0!==u)return null!=l&&(l.hit=(null!==(i=l.hit)&&void 0!==i?i:0)+1),u;null!=l&&(l.miss=(null!==(r=l.miss)&&void 0!==r?r:0)+1);const d=e.apply(this,t);return o.set(h,d),d};return l.cache=o,l}t.LRU=i,t.cached=function(e,t){return"function"==typeof e?o(e,t):function(e){var t;const s=null!==(t=null==e?void 0:e.getExtraKeys)&&void 0!==t?t:function(){return(0,n.isValueObject)(this)?[this]:null!=this&&"object"==typeof this?Object.values(this).filter(c):[]};return function(t,n,i){const r=i.value;i.value=o(r,Object.assign(Object.assign({},e),{getExtraKeys:s}))}}(e)};const a=new Set(["number","string","boolean","symbol","bigint","undefined","null"]);function c(e){if(null==e)return!0;const t=typeof e;return!!a.has(t)||!("object"!==t||!(0,n.isValueObject)(e))}},61110:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},5693:function(e,t,s){var n=this&&this.__createBinding||(Object.create?function(e,t,s,n){void 0===n&&(n=s);var i=Object.getOwnPropertyDescriptor(t,s);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[s]}}),Object.defineProperty(e,n,i)}:function(e,t,s,n){void 0===n&&(n=s),e[n]=t[s]}),i=this&&this.__exportStar||function(e,t){for(var s in e)"default"===s||Object.prototype.hasOwnProperty.call(t,s)||n(t,e,s)};Object.defineProperty(t,"__esModule",{value:!0}),i(s(61110),t),i(s(52568),t),i(s(11268),t),i(s(66877),t)},52568:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},11268:(e,t,s)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Tracker=void 0;const n=s(48427);class i{constructor(e,t){this.sendData=e,this.context=t}error(e,t,s,n){const i=s instanceof Error?s.message||String(s):s;return this.track(e,Object.assign(Object.assign({},null!=n?n:{}),{errorMessage:i,errorName:t}))}operation(e,t,s,i){var r;const o=Date.now(),a=null!==(r=null==s?void 0:s.id)&&void 0!==r?r:(0,n.randomId)();try{const r=i({parentId:a});if((0,n.isPromise)(r))return r.then((t=>{const n=Date.now()-o;return this.track(e,Object.assign(Object.assign({},null!=s?s:{}),{duration:n,id:a})),t})).catch((n=>{const i=Date.now()-o;return this.error(e,t,n,Object.assign(Object.assign({},null!=s?s:{}),{duration:i,id:a})),Promise.reject(n)}));{const t=Date.now()-o;return this.track(e,Object.assign(Object.assign({},null!=s?s:{}),{duration:t,id:a})),r}}catch(n){const i=Date.now()-o;throw this.error(e,t,n,Object.assign(Object.assign({},null!=s?s:{}),{duration:i,id:a})),n}}trackAsParent(e,t){var s;const r=null!==(s=null==t?void 0:t.id)&&void 0!==s?s:(0,n.randomId)();return this.trackData(Object.assign(Object.assign({},t),{eventName:e,id:r})),new i(((e,t)=>this.trackData(Object.assign(Object.assign({},e),t))),{parentId:r})}track(e,t){return this.trackData(Object.assign(Object.assign({},t),{eventName:e}))}trackData(e){var t,s;const i=null!==(t=null==e?void 0:e.id)&&void 0!==t?t:(0,n.randomId)(),r=null!==(s=null==e?void 0:e.timestamp)&&void 0!==s?s:Date.now(),o=Object.assign({timestamp:r,id:i},null!=e?e:{});this.sendData(o,this.context)}}t.Tracker=i},66877:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},33905:(e,t,s)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.newAbortController=void 0;const n=s(53811);t.newAbortController=function(){return"function"==typeof AbortController?new AbortController:new n.AbortController}},66960:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.debounce=void 0,t.debounce=function(e,t,s=void 0,n=!1){let i,r=!0;function o(...a){let c;if(n){if(c=function(){r=!0,i=void 0},!r)return clearTimeout(i),void(i=setTimeout(c,t));r=!1,e.apply(s,a)}else o.reset(),c=function(){i=void 0,e.apply(s,a)};i=setTimeout(c,t)}return o.reset=function(){clearTimeout(i),i=void 0,r=!0},o.isPending=function(){return null!=i},o}},90828:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SelfUpdate=void 0;class s{constructor(e){this.inner=e}hashCode(){return this.inner.hashCode()+1}equals(e){if(!(e instanceof s))return!1;if(this===e)return!0;const t=e.inner,n=this.inner.equals(t);return n&&this.inner!==t&&(this.inner=t),n}}t.SelfUpdate=s},98696:function(e,t,s){var n=this&&this.__createBinding||(Object.create?function(e,t,s,n){void 0===n&&(n=s);var i=Object.getOwnPropertyDescriptor(t,s);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[s]}}),Object.defineProperty(e,n,i)}:function(e,t,s,n){void 0===n&&(n=s),e[n]=t[s]}),i=this&&this.__exportStar||function(e,t){for(var s in e)"default"===s||Object.prototype.hasOwnProperty.call(t,s)||n(t,e,s)};Object.defineProperty(t,"__esModule",{value:!0}),i(s(5693),t),i(s(33800),t),i(s(86099),t),i(s(40256),t),i(s(85249),t),i(s(48427),t),i(s(66224),t),i(s(2982),t),i(s(13035),t),i(s(90828),t),i(s(52060),t),i(s(66960),t),i(s(33905),t),i(s(75905),t)},13035:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.minimalDisambiguousPaths=void 0,t.minimalDisambiguousPaths=function(e,t={}){const s=e.map((e=>{const t=function(e){return e.replace(/[^\\]/g,"").length>e.replace(/[^/]/g,"").length?"\\":"/"}(e),s=/^(\w:).*/.exec(e),n=null!=s?s[1]:"";return{depth:null,parts:e.split(t).reverse().filter((e=>""!==e&&e!==n)),rootPrefix:n,separator:t,hadLeadingSeparator:e.startsWith(t)||n.length>0&&e.startsWith(n)}})),n=null==t.maxDepth?Math.max(...s.map((e=>e.parts.length))):t.maxDepth,i=new Set(s),r=new Map;for(let e=1;e<=n;e++){r.clear();for(const t of i){const s=t.parts.slice(0,e).join(t.separator);r.has(s)||r.set(s,new Set),r.get(s).add(t)}for(const t of r.values())if(1===t.size){const s=Array.from(t)[0];s.depth=e,i.delete(s)}}return s.map((({depth:e,parts:s,rootPrefix:i,separator:r,hadLeadingSeparator:o})=>{var a;let c=s.slice(0,null==e?n:e).reverse();return 0===c.length?`${i}${r}`:((1===c.length&&""===c[0]||c.length>1&&""!==c[0])&&(c=c.length===s.length?o?[i,...c]:c:(null!==(a=t.alwaysShowLeadingSeparator)&&void 0!==a?a:o)?["",...c]:c),c.join(r))}))}},75905:(e,t)=>{var s;Object.defineProperty(t,"__esModule",{value:!0}),t.parsePatch=t.DiffType=void 0,function(e){e.Modified="Modified",e.Added="Added",e.Removed="Removed",e.Renamed="Renamed",e.Copied="Copied"}(s=t.DiffType||(t.DiffType={}));const n=/^diff --git (.*) (.*)$/,i=/^rename from (.*)$/,r=/^rename to (.*)$/,o=/^copy from (.*)$/,a=/^copy to (.*)$/,c=/^new file mode (\d{6})$/,l=/^deleted file mode (\d{6})$/,h=/^old mode (\d{6})$/,u=/^new mode (\d{6})$/,d=/@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/,m=/^--- (.*)$/,p=/^\+\+\+ (.*)$/,g=/\r\n|[\n\v\f\r\x85]/g;function f(e,t){if(!1===e)throw new Error(t)}t.parsePatch=function(e){const t=e.split(g),v=e.match(g)||[],b=[];let y=0;function w(){const e={hunks:[]};for(b.push(e),function(e){for(;y<t.length;){const s=t[y],i=n.exec(s);if(i){e.oldFileName=i[1],e.newFileName=i[2],y++;break}y++}}(e);y<t.length;){const s=t[y];if(/^old mode/.test(s))C(e);else if(/^new mode/.test(s))S(e);else if(/^deleted file mode/.test(s))O(e);else if(/^new file mode/.test(s))E(e);else if(/^copy /.test(s))R(e);else if(/^rename /.test(s))k(e);else{if(/^--- /.test(s)){_(e);break}if(/^diff --git/.test(s))break;y++}}!function(e){for(;y<t.length;){const s=t[y];if(n.test(s))break;/^@@/.test(s)?e.hunks.push(M()):y++}}(e)}function C(e){const n=h.exec(t[y]);f(null!==n,`invalid format '${t[y]}'`),e.oldMode=n[1],e.type=s.Modified,y++}function S(e){const n=u.exec(t[y]);f(null!==n,`invalid format '${t[y]}'`),e.newMode=n[1],e.type=s.Modified,y++}function O(e){const n=l.exec(t[y]);f(null!==n,`invalid format '${t[y]}'`),e.newMode=n[1],e.type=s.Removed,y++}function E(e){const n=c.exec(t[y]);f(null!==n,`invalid format '${t[y]}'`),e.newMode=n[1],e.type=s.Added,y++}function R(e){f(o.test(t[y]),`invalid format '${t[y]}'`),f(a.test(t[y+1]),`invalid format '${t[y+1]}'`),e.type=s.Copied,y+=2}function k(e){f(i.test(t[y]),`invalid format '${t[y]}'`),f(r.test(t[y+1]),`invalid format '${t[y+1]}'`),e.type=s.Renamed,y+=2}function _(e){f(m.test(t[y]),`invalid format '${t[y]}'`),f(p.test(t[y+1]),`invalid format '${t[y+1]}'`),void 0===e.type&&(e.type=s.Modified),y+=2}function M(){const e=t[y++].split(d),s={oldStart:+e[1],oldLines:void 0===e[2]?1:+e[2],newStart:+e[3],newLines:void 0===e[4]?1:+e[4],lines:[],linedelimiters:[]};0===s.oldLines&&(s.oldStart+=1),0===s.newLines&&(s.newStart+=1);let n=0,i=0;for(;y<t.length&&!(0===t[y].indexOf("--- ")&&y+2<t.length&&0===t[y+1].indexOf("+++ ")&&0===t[y+2].indexOf("@@"));y++){const e=0==t[y].length&&y!=t.length-1?" ":t[y][0];if("+"!==e&&"-"!==e&&" "!==e&&"\\"!==e)break;s.lines.push(t[y]),s.linedelimiters.push(v[y]||"\n"),"+"===e?n++:"-"===e?i++:" "===e&&(n++,i++)}return n||1!==s.newLines||(s.newLines=0),i||1!==s.oldLines||(s.oldLines=0),s}for(;y<t.length;)w();return b}},85249:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.deserializeFromString=t.deserialize=t.serializeToString=t.serialize=void 0;const s={__rpcType:"undefined"};function n(e){if(void 0===e)return s;if("number"==typeof e||"boolean"==typeof e||"string"==typeof e||null===e)return e;if(e instanceof Map)return{__rpcType:"Map",data:Array.from(e.entries()).map((([e,t])=>[n(e),n(t)]))};if(e instanceof Set)return{__rpcType:"Set",data:Array.from(e.values()).map(n)};if(e instanceof Error)return{__rpcType:"Error",data:{message:e.message,stack:e.stack}};if(e instanceof Date)return{__rpcType:"Date",data:e.valueOf()};if(Array.isArray(e))return e.map((e=>n(e)));if("object"==typeof e){const t={__rpcType:"object"};for(const[s,i]of Object.entries(e))t[s]=n(i);return t}throw new Error(`cannot serialize argument ${e}`)}function i(e){if("object"!=typeof e||null==e)return e;if(Array.isArray(e))return e.map((e=>i(e)));const t=e;switch(t.__rpcType){case"undefined":return;case"Map":return new Map(t.data.map((([e,t])=>[i(e),i(t)])));case"Set":return new Set(t.data.map(i));case"Error":{const e=new Error;return e.stack=t.data.stack,e.message=t.data.message,e}case"Date":return new Date(t.data);case"object":{const t=e,s={};for(const[e,n]of Object.entries(t))"__rpcType"!==e&&(s[e]=i(n));return s}default:throw new Error(`cannot deserialize unknown type ${t}`)}}t.serialize=n,t.serializeToString=function(e){return JSON.stringify(n(e))},t.deserialize=i,t.deserializeFromString=function(e){return i(JSON.parse(e))}},40256:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},66224:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},50209:(e,t)=>{var s;Object.defineProperty(t,"__esModule",{value:!0}),t.SucceedableRevset=t.CommandRunner=void 0,(s=t.CommandRunner||(t.CommandRunner={})).Graphite="gt",s.CodeReviewProvider="codeReviewProvider",t.SucceedableRevset=function(e){return{type:"succeedable-revset",revset:e}}},74259:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},45852:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},1018:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ErrorShortMessages=t.DEFAULT_DAYS_OF_COMMITS_TO_LOAD=t.ONE_MINUTE_MS=t.CLOSED_AND_SHOULD_NOT_RECONNECT_CODE=void 0,t.CLOSED_AND_SHOULD_NOT_RECONNECT_CODE=4100,t.ONE_MINUTE_MS=6e4,t.DEFAULT_DAYS_OF_COMMITS_TO_LOAD=void 0,(t.ErrorShortMessages||(t.ErrorShortMessages={})).NoCommitsFetched="No commits found"},29641:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},86099:function(e,t,s){var n=this&&this.__createBinding||(Object.create?function(e,t,s,n){void 0===n&&(n=s);var i=Object.getOwnPropertyDescriptor(t,s);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[s]}}),Object.defineProperty(e,n,i)}:function(e,t,s,n){void 0===n&&(n=s),e[n]=t[s]}),i=this&&this.__exportStar||function(e,t){for(var s in e)"default"===s||Object.prototype.hasOwnProperty.call(t,s)||n(t,e,s)};Object.defineProperty(t,"__esModule",{value:!0}),i(s(50209),t),i(s(85119),t),i(s(45852),t),i(s(74259),t),i(s(1018),t),i(s(29641),t)},85119:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0})},48427:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isPromise=t.truncate=t.zip=t.generatorContains=t.mapObject=t.findParentWithClassName=t.basename=t.defer=t.randomId=t.unwrap=t.notEmpty=void 0,t.notEmpty=function(e){return null!=e},t.unwrap=function(e){if(null==e)throw new Error(`expected value not to be ${e}`);return e},t.randomId=function(){return Date.now().toString(36)+Math.random().toString(36)},t.defer=function(){const e={promise:void 0,resolve:void 0,reject:void 0};return e.promise=new Promise(((t,s)=>{e.resolve=t,e.reject=s})),e},t.basename=function(e,t="/"){const s=e.lastIndexOf(t);return-1===s?e:e.slice(s+1)},t.findParentWithClassName=function(e,t){var s;let n=e;for(;n;){if(null===(s=n.classList)||void 0===s?void 0:s.contains(t))return n;n=n.parentElement}},t.mapObject=function(e,t){return Object.fromEntries(Object.entries(e).map(t))},t.generatorContains=function(e,t){const s="function"==typeof t?t:e=>e===t;for(const t of e)if(s(t))return!0;return!1},t.zip=function*(e,t){const s=e[Symbol.iterator](),n=t[Symbol.iterator]();for(;;){const e=s.next(),t=n.next();if(e.done||t.done)break;yield[e.value,t.value]}},t.truncate=function(e,t=100){return e.length>t?e.substring(0,Math.max(0,t-1))+"…":e},t.isPromise=function(e){return"function"==typeof(null==e?void 0:e.then)}},20325:(e,t,s)=>{s.r(t),s.d(t,{startServer:()=>ne});var n=s(98696),i=s(57147),r=s.n(i),o=s(13685),a=s.n(o),c=s(71017),l=s.n(c),h=s(57310),u=s.n(h),d=s(95352),m=s.n(d),p=s(22037),g=s.n(p);function f(){try{return g().userInfo().username}catch(e){try{const{env:e}=process;return(0,n.unwrap)(e.LOGNAME||e.USER||e.LNAME||e.USERNAME)}catch(t){throw new Error(String(t)+String(e))}}}class v{logger;data;constructor(e,t){this.logger=e,this.data=t}setRepo(e){this.data.repo=e?.codeReviewProvider?.getSummaryName()}}const b=e=>{};var y=s(73837),w=s.n(y);const C=console;var S=s(60492),O=s.n(S),E=s(80909),R=s.n(E),k=s(82361);class _ extends k.EventEmitter{}class M{codeReviewSystem;runCommand;constructor(e,t){this.codeReviewSystem=e,this.runCommand=t}diffSummaries=new _;onChangeDiffSummaries(e){const t=t=>e({value:t}),s=t=>e({error:t});return this.diffSummaries.on("data",t),this.diffSummaries.on("error",s),{dispose:()=>{this.diffSummaries.off("data",t),this.diffSummaries.off("error",s)}}}async triggerDiffSummariesFetch(e){const t=await this.runCommand(["internal-only","prs"]),s=JSON.parse(t.stdout);this.diffSummaries.emit("data",s)}dispose(){this.diffSummaries.removeAllListeners()}getSummaryName(){return`github:${this.codeReviewSystem.hostname}/${this.codeReviewSystem.owner}/${this.codeReviewSystem.repo}`}runExternalCommand(e,t,s,n){throw new Error("GitHub code review provider does not support running external commands")}async typeahead(e,t){return Promise.resolve([])}}class D{logger;runCallback;constructor(e,t){this.logger=e,this.runCallback=t}queuedOperations=[];runningOperation=void 0;abortController=void 0;async runOrQueueOperation(e,t,s,i){if(null!=this.runningOperation)return this.queuedOperations.push({...e,tracker:s}),void t({id:e.id,kind:"queue",queue:this.queuedOperations.map((e=>e.id))});this.runningOperation=e;const r=(...s)=>{switch(s[0]){case"spawn":t({id:e.id,kind:"spawn",queue:this.queuedOperations.map((e=>e.id))});break;case"stdout":t({id:e.id,kind:"stdout",message:s[1]});break;case"stderr":t({id:e.id,kind:"stderr",message:s[1]});break;case"exit":t({id:e.id,kind:"exit",exitCode:s[1],timestamp:Date.now()})}};try{const o=(0,n.newAbortController)();if(this.abortController=o,await s.operation(e.trackEventName,"RunOperationError",{extras:{args:e.args,runner:e.runner}},(t=>this.runCallback(e,i,r,o.signal))),this.runningOperation=void 0,this.queuedOperations.length>0){const e=this.queuedOperations.shift();null!=e&&this.runOrQueueOperation(e,t,e.tracker,i)}}catch(s){const n=s.toString();this.logger.log("error running operation: ",e.args[0],n),t({id:e.id,kind:"error",error:n}),this.queuedOperations=[],this.runningOperation=void 0}}abortRunningOperation(e){this.runningOperation?.id==e&&this.abortController?.abort()}}class T{focusedPages=new Set;visiblePages=new Set;onChangeHandlers=new Set;setState(e,t){switch(t){case"focused":this.focusedPages.add(e),this.visiblePages.add(e);break;case"visible":this.focusedPages.delete(e),this.visiblePages.add(e);break;case"hidden":this.focusedPages.delete(e),this.visiblePages.delete(e)}for(const e of this.onChangeHandlers)e(t)}disposePage(e){this.focusedPages.delete(e),this.visiblePages.delete(e)}hasPageWithFocus(){return this.focusedPages.size>0}hasVisiblePage(){return this.visiblePages.size>0}onChange(e){return this.onChangeHandlers.add(e),()=>this.onChangeHandlers.delete(e)}}class P{maxSimultaneousRunning;log;queued=[];running=[];runs=new _;constructor(e,t){this.maxSimultaneousRunning=e,this.log=t}nextId=1;generateId(){return this.nextId++}async enqueueRun(e){const t=this.generateId();this.queued.push(t),this.tryDequeueNext(),this.running.includes(t)||(this.log?.(`${this.running.length} tasks are already running, enqueuing ID:${t}`),await new Promise((e=>{this.runs.on("run",(s=>{s===t&&(this.log?.(`now allowing ID:${t} to run`),e(void 0))}))})));try{return await e()}finally{this.notifyFinished(t)}}notifyFinished(e){this.running=this.running.filter((t=>t!==e)),this.tryDequeueNext()}tryDequeueNext(){if(this.running.length<this.maxSimultaneousRunning){const e=this.queued.shift();null!=e&&this.run(e)}}run(e){this.running.push(e),this.runs.emit("run",e)}}function N(e){return new Promise((t=>setTimeout(t,e)))}function j(e){let t,s;const n=()=>{const t=e();return s=t.then((()=>s=void 0),(()=>s=void 0)),t},i=()=>(t=void 0,n());return()=>null==s?n():(()=>{if(null==t){if(null==s)throw new Error("pendingCall must not be null!");t=s.then(i,i)}return t})()}var F=s(24678);class I{logger;client;serializedReconnect;reconnectDelayMs=100;subscriptions=new Map;lastKnownClockTimes=new Map;status="initializing";constructor(e){this.logger=e,this.client=new F.Client({watchmanBinaryPath:void 0}),this.initWatchmanClient(),this.serializedReconnect=j((async()=>{let e=0;for(;;)try{return void await this.reconnectClient()}catch(t){this.logger.warn(`reconnectClient failed (try #${e}):`,t instanceof Error?t.message:t),e++,this.reconnectDelayMs*=2,this.reconnectDelayMs>6e4&&(this.reconnectDelayMs=6e4),this.logger.info("Calling reconnectClient from _serializedReconnect in %dms",this.reconnectDelayMs),await N(this.reconnectDelayMs)}}))}setStatus(e){this.logger.log("Watchman status: ",e),this.status=e}async watchDirectoryRecursive(e,t,s){const n=this.fixupName(e,t),i=this.getSubscription(n);if(i)return i.subscriptionCount++,i;{const{watch:t,relative_path:i}=await this.watchProject(e),r=await this.clock(t),o={...s,fields:null!=s&&null!=s.fields?s.fields:["name","new","exists"],since:r};i&&(o.relative_root=i),o.empty_on_fresh_instance=!0;const a={root:t,pathFromSubscriptionRootToSubscriptionPath:i,path:e,name:n,subscriptionCount:1,options:o,emitter:new k.EventEmitter};return this.setSubscription(n,a),await this.subscribe(t,n,o),this.logger.log("watchman subscription %s established",n),this.setStatus("healthy"),a}}async unwatch(e,t){const s=this.fixupName(e,t),n=this.getSubscription(s);null!=n?0==--n.subscriptionCount&&(await this.unsubscribe(n.path,n.name),this.deleteSubscription(s),this.logger.log("watchman subscription %s destroyed",s)):this.logger.error(`No watcher entity found with path [${e}] name [${t}]`)}initWatchmanClient(){this.client.on("end",(()=>{this.setStatus("ended"),this.logger.info("Watchman client ended"),this.client.removeAllListeners(),this.serializedReconnect()})),this.client.on("error",(e=>{const t=this.status;this.logger.error("Error while talking to watchman: ",e),this.setStatus("errored"),this.client.removeAllListeners(),this.client.end(),"initializing"!==t&&this.serializedReconnect()})),this.client.on("subscription",this.onSubscriptionResult.bind(this))}async reconnectClient(){this.logger.info("Ending existing watchman client to reconnect a new one"),this.setStatus("reconnecting"),this.client.removeAllListeners(),this.client.end(),this.client=new F.Client({watchmanBinaryPath:void 0}),this.logger.error("Watchman client disconnected, reconnecting a new client!"),this.initWatchmanClient(),this.logger.info("Watchman client re-initialized, restoring subscriptions"),await this.restoreSubscriptions()}async restoreSubscriptions(){const e=Array.from(this.subscriptions.values()),t=e.length;this.logger.info(`Attempting to restore ${t} Watchman subscriptions.`);let s=0;await Promise.all(e.map((async(e,n)=>{await this.watchProject(e.path),await N(2500);const{name:i,options:r,root:o}=e;e.options.since=this.lastKnownClockTimes.get(o)||await this.clock(o),this.logger.info(`Subscribing to ${i}: (${n+1}/${t})`),await this.subscribe(o,i,r),++s,this.logger.info(`Subscribed to ${i}: (${s}/${t}) complete.`)}))),s>0&&s===t&&(this.logger.info("Successfully reconnected all %d subscriptions.",s),this.reconnectDelayMs=100,this.setStatus("healthy"))}getSubscription(e){return this.subscriptions.get(l().normalize(e))}setSubscription(e,t){const s=l().normalize(e);this.subscriptions.set(s,t)}deleteSubscription(e){const t=l().normalize(e);this.subscriptions.delete(t)}onSubscriptionResult(e){const t=this.getSubscription(e.subscription);if(null!=t){if(null!=e&&null!=e.root&&null!=e.clock&&this.lastKnownClockTimes.set(e.root,e.clock),!0===e.is_fresh_instance)this.logger.warn(`Watch for ${e.root} (${e.subscription}) returned an empty fresh instance.`),t.emitter.emit("fresh-instance");else if(Array.isArray(e.files))t.emitter.emit("change",e.files);else if(!0===e.canceled)this.logger.info(`Watch for ${e.root} was deleted: triggering a reconnect.`),this.client.end();else if(this.subscriptions.values().next().value===t){const t=e["state-enter"],s=e["state-leave"],n=null!=t?`Entering ${t}`:`Leaving ${s}`,i=this.subscriptions.size;this.logger.info(`Subscription state: ${n} (${i})`)}}else this.logger.error("Subscription not found for response:!",e)}fixupName(e,t){return`${e.replace(/\\/g,"-").replace(/\//g,"-")}-${t}`}unsubscribe(e,t){return this.command("unsubscribe",e,t)}async watchProject(e){const t=await this.command("watch-project",e);return t.warning&&this.logger.error("watchman warning: ",t.warning),t}async clock(e){const{clock:t}=await this.command("clock",e);return t}subscribe(e,t,s){return this.logger.info(`Creating Watchman subscription ${String(t)} under ${e}`,JSON.stringify(s)),this.command("subscribe",e,t,s)}async command(...e){try{return await new Promise(((t,s)=>{this.client.command(e,((e,n)=>e?s(e):t(n)))}))}catch(t){throw this.logger.error("Watchman command error: ",e,t),t}}}const x=5*n.ONE_MINUTE_MS,A=1*n.ONE_MINUTE_MS,$=.25*n.ONE_MINUTE_MS;class L{repoInfo;logger;pageFocusTracker;changeCallback;static WATCHMAN_DEFER="hg.update";watchman;disposables=[];constructor(e,t,s,n,i){this.repoInfo=e,this.logger=t,this.pageFocusTracker=s,this.changeCallback=n,this.watchman=i??new I(t),this.setupWatchmanSubscriptions(),this.setupPolling(),this.pageFocusTracker.onChange(this.poll.bind(this))}timeout;lastFetch=(new Date).valueOf();setupPolling(){this.timeout=setTimeout(this.poll,x)}poll=e=>{let t=x;"healthy"!==this.watchman.status&&(this.pageFocusTracker.hasPageWithFocus()?t=$:this.pageFocusTracker.hasVisiblePage()&&(t=A));const s=Date.now()-this.lastFetch;"force"===e||s>=t||"focused"===e&&s>=1e4||"visible"===e&&s>=2e4?(this.changeCallback("everything"),this.lastFetch=Date.now(),clearTimeout(this.timeout),this.timeout=setTimeout(this.poll,t)):(clearTimeout(this.timeout),this.timeout=setTimeout(this.poll,t-s))};async setupWatchmanSubscriptions(){if("success"!==this.repoInfo.type)return;const{repoRoot:e,dotdir:t}=this.repoInfo;if(null==e||null==t)return void this.logger.error(`skipping watchman subscription since ${e} is not a repository`);const s=l().relative(e,t),i="graphite-smartlog-file-change",r="graphite-smartlog-dirstate-change";try{const t=(0,n.debounce)((()=>{this.changeCallback("everything"),this.lastFetch=(new Date).valueOf()}),100),o=await this.watchman.watchDirectoryRecursive(e,r,{fields:["name"],expression:["name",[`${s}/refs/heads`,`${s}/refs/branch-metadata`,`${s}/rebase-merge`,`${s}/index`,`${s}/HEAD`],"wholename"],defer:[L.WATCHMAN_DEFER],empty_on_fresh_instance:!0});o.emitter.on("change",(e=>{e.includes(`${s}/rebase-merge`)&&this.changeCallback("merge conflicts"),e.includes(`${s}/index`)&&this.changeCallback("uncommitted changes"),(e.includes(`${s}/refs/heads`)||e.includes(`${s}/refs/branch-metadata`)||e.includes(`${s}/HEAD`))&&this.changeCallback("branches")})),o.emitter.on("fresh-instance",t);const a=()=>{this.changeCallback("uncommitted changes"),this.lastFetch=(new Date).valueOf()},c=await this.watchman.watchDirectoryRecursive(e,i,{fields:["name"],expression:["allof",["type","f"],["not",["dirname",s]],["not",["match",s,"basename"]]],defer:[L.WATCHMAN_DEFER],empty_on_fresh_instance:!0});c.emitter.on("change",a),c.emitter.on("fresh-instance",a),this.disposables.push((()=>{this.watchman.unwatch(e,r),this.watchman.unwatch(e,i)}))}catch(e){this.logger.error("failed to setup watchman subscriptions",e)}}dispose(){this.disposables.forEach((e=>e())),this.timeout&&(clearTimeout(this.timeout),this.timeout=void 0)}}const U="0.1.4";class q{info;logger;IGNORE_COMMIT_MESSAGE_LINES_REGEX=/^((?:HG|SL):.*)/gm;mergeConflicts=void 0;uncommittedChanges=null;smartlogCommits=null;mergeConflictsEmitter=new _;uncommittedChangesEmitter=new _;smartlogCommitsChangesEmitter=new _;smartlogCommitsBeginFetchingEmitter=new _;uncommittedChangesBeginFetchingEmitter=new _;disposables=[()=>this.mergeConflictsEmitter.removeAllListeners(),()=>this.uncommittedChangesEmitter.removeAllListeners(),()=>this.smartlogCommitsChangesEmitter.removeAllListeners(),()=>this.smartlogCommitsBeginFetchingEmitter.removeAllListeners(),()=>this.uncommittedChangesBeginFetchingEmitter.removeAllListeners()];onDidDispose(e){this.disposables.push(e)}operationQueue;watchForChanges;pageFocusTracker=new T;codeReviewProvider;currentVisibleCommitRangeIndex=0;visibleCommitRanges=[n.DEFAULT_DAYS_OF_COMMITS_TO_LOAD,60,void 0];constructor(e,t){this.info=e,this.logger=t;const s=e.codeReviewSystem;"github"===s.type&&(this.codeReviewProvider=new M(s,this.runCommand.bind(this))),this.watchForChanges=new L(e,t,this.pageFocusTracker,(e=>{"uncommitted changes"===e?this.fetchUncommittedChanges():"branches"===e?this.fetchSmartlogCommits():"merge conflicts"===e?this.checkForMergeConflicts():"everything"===e&&(this.fetchUncommittedChanges(),this.fetchSmartlogCommits(),this.checkForMergeConflicts())})),this.operationQueue=new D(this.logger,((e,t,s,i)=>{if(e.runner===n.CommandRunner.Graphite)return this.runOperation(e,s,t,i);if(e.runner===n.CommandRunner.CodeReviewProvider){const n=this.normalizeOperationArgs(t,e.args);return null==this.codeReviewProvider?.runExternalCommand?Promise.reject(Error("CodeReviewProvider does not support running external commands")):this.codeReviewProvider?.runExternalCommand(t,n,s,i)??Promise.resolve()}return Promise.resolve()}));const i=new Set,r=this.subscribeToSmartlogCommitsChanges((e=>{if(e.commits.value){const t=[],s=e.commits.value.filter((e=>e.pr)).map((e=>e.pr?.number));for(const e of s)i.has(e)||(t.push(e),i.add(e));t.length>0&&this.codeReviewProvider?.triggerDiffSummariesFetch(this.getAllDiffIds())}}));this.checkForMergeConflicts(),this.disposables.push((()=>r.dispose()))}nextVisibleCommitRangeInDays(){return this.currentVisibleCommitRangeIndex+1<this.visibleCommitRanges.length&&this.currentVisibleCommitRangeIndex++,this.visibleCommitRanges[this.currentVisibleCommitRangeIndex]}dispose(){this.disposables.forEach((e=>e())),this.codeReviewProvider?.dispose(),this.watchForChanges.dispose()}onChangeConflictState(e){return this.mergeConflictsEmitter.on("change",e),this.mergeConflicts&&e(this.mergeConflicts),{dispose:()=>this.mergeConflictsEmitter.off("change",e)}}checkForMergeConflicts=j((async()=>{this.logger.info("checking for merge conflicts");const e=null!=this.mergeConflicts;if(!e&&!await(t=l().join(this.info.dotdir,"rebase-merge"),r().promises.stat(t).then((()=>!0)).catch((e=>{if("ENOENT"===e.code)return!1;throw e}))))return void this.logger.info(`conflict state still the same (${e?"IN merge conflict":"NOT in conflict"})`);var t;null==this.mergeConflicts&&(this.mergeConflicts={state:"loading"},this.mergeConflictsEmitter.emit("change",this.mergeConflicts));const s=Date.now();let n;try{const e=await this.runCommand(["internal-only","status"]);n=JSON.parse(e.stdout)}catch(e){return this.logger.error(`failed to check for merge conflicts: ${e}`),this.mergeConflicts=void 0,void this.mergeConflictsEmitter.emit("change",this.mergeConflicts)}if(this.mergeConflicts=function(e,t,s){const n=t;if(!n?.conflicts)return;const i=n.files.filter((e=>"UNRESOLVED"===e.status)),r={state:"loaded",files:[],fetchStartTimestamp:s,fetchCompletedTimestamp:Date.now()};if(null!=e?.files&&e.files.length>0){const t=new Set(i.map((e=>e.path)));r.files=e.files.map((e=>t.has(e.path)?{path:e.path,status:"UNRESOLVED"}:{path:e.path,status:"RESOLVED"}))}else r.files=i.map((e=>({path:e.path,status:"UNRESOLVED"})));return r}(this.mergeConflicts,n,s),this.logger.info(`repo ${this.mergeConflicts?"IS":"IS NOT"} in merge conflicts`),this.mergeConflicts){const e=20,t=(this.mergeConflicts.files??[]).filter((e=>"UNRESOLVED"===e.status)).map((e=>e.path)).slice(0,e);this.logger.info("remaining files with conflicts: ",t)}this.mergeConflictsEmitter.emit("change",this.mergeConflicts)}));getMergeConflicts(){return this.mergeConflicts}static async getRepoInfo(e,t,s){const n=await async function(e,t,s){try{return(await H({command:e,args:["--version"],logger:t,cwd:s})).stdout}catch(e){throw t.error(`Failed to find gt version in ${s}`,e),e}}(e,t,s).catch((e=>e));if(n instanceof Error)return{type:"invalidCommand",command:e??"gt"};if("local"!==n&&"dev"!==n&&R().lt(n,U))return{type:"invalidVersion",command:e??"gt",versionFound:n,versionRequired:U};const[i,r,o,a]=await Promise.all([W(e,t,s),z(e,t,s),B(e,t,s,"graphite.branch_edit").then((e=>e??"amend")),B(e,t,s,"graphite.create_prs_as").then((e=>e??"draft"))]);if(null==r)return{type:"cwdNotARepository",cwd:s};let c;if(void 0===r.remote)c={type:"none"};else{const{owner:e,name:t,hostname:s}=r.remote;c={type:"github",owner:e,repo:t,hostname:s}}const l={type:"success",command:e,dotdir:r.dotDir,repoRoot:r.rootDir,codeReviewSystem:c,preferredBranchEdit:o,createPrsAs:a,profile:i,trunkBranch:r.trunkBranch};return t.info("repo info: ",l),l}async runOrQueueOperation(e,t,s,n){await this.operationQueue.runOrQueueOperation(e,t,s,n),this.watchForChanges.poll("force")}abortRunningOpeation(e){this.operationQueue.abortRunningOperation(e)}normalizeOperationArgs(e,t){const s=(0,n.unwrap)(this.info.repoRoot);return t.map((t=>{if("object"==typeof t)switch(t.type){case"repo-relative-file":return l().normalize(l().relative(e,l().join(s,t.path)));case"succeedable-revset":return`max(successors(${t.revset}))`}return t}))}async runOperation(e,t,s,n){const i=this.normalizeOperationArgs(s,e.args),{stdin:r}=e,{command:o,args:a,options:c}=V(this.info.command,i,s,r?{input:r}:void 0);this.logger.log("run operation: ",o,i.join(" "));const l=O()(o,a,{...c,stdout:"pipe",stderr:"pipe"});t("spawn"),l.stdout?.on("data",(e=>{t("stdout",e.toString())})),l.stderr?.on("data",(e=>{t("stderr",e.toString())})),l.on("exit",(e=>{t("exit",e||0)})),n.addEventListener("abort",(()=>{this.logger.log("kill operation: ",o,i.join(" "))})),function(e,t){t.addEventListener("abort",(()=>{"win32"==g().platform()?e.kill("SIGKILL",{forceKillAfterTimeout:!1}):(e.kill("SIGCONT"),e.kill("SIGTERM",{forceKillAfterTimeout:5e3}))}))}(l,n),await l}setPageFocus(e,t){this.pageFocusTracker.setState(e,t)}getUncommittedChanges(){return this.uncommittedChanges}subscribeToUncommittedChanges(e){return this.uncommittedChangesEmitter.on("change",e),{dispose:()=>{this.uncommittedChangesEmitter.off("change",e)}}}fetchUncommittedChanges=j((async()=>{const e=Date.now();try{this.uncommittedChangesBeginFetchingEmitter.emit("start");const t=await this.runCommand(["internal-only","status"]),s=JSON.parse(t.stdout).files.map((e=>{return{...e,path:(t=e.path,t.startsWith(l().sep)?t.slice(1):t)};var t}));this.uncommittedChanges={fetchStartTimestamp:e,fetchCompletedTimestamp:Date.now(),files:{value:s}},this.uncommittedChangesEmitter.emit("change",this.uncommittedChanges)}catch(s){if(this.logger.error("Error fetching files: ",s),null!=(t=s)&&"object"==typeof t&&"stderr"in t&&s.stderr.includes("checkout is currently in progress"))return void this.logger.info("Ignoring `hg status` error caused by in-progress checkout");this.uncommittedChangesEmitter.emit("change",{fetchStartTimestamp:e,fetchCompletedTimestamp:Date.now(),files:{error:s instanceof Error?s:new Error(s)}})}var t}));getSmartlogCommits(){return this.smartlogCommits}subscribeToSmartlogCommitsChanges(e){return this.smartlogCommitsChangesEmitter.on("change",e),{dispose:()=>{this.smartlogCommitsChangesEmitter.off("change",e)}}}subscribeToSmartlogCommitsBeginFetching(e){const t=()=>e(!0);return this.smartlogCommitsBeginFetchingEmitter.on("start",t),{dispose:()=>{this.smartlogCommitsBeginFetchingEmitter.off("start",t)}}}subscribeToUncommittedChangesBeginFetching(e){const t=()=>e(!0);return this.uncommittedChangesBeginFetchingEmitter.on("start",t),{dispose:()=>{this.uncommittedChangesBeginFetchingEmitter.off("start",t)}}}fetchSmartlogCommits=j((async()=>{const e=Date.now();try{this.smartlogCommitsBeginFetchingEmitter.emit("start");const t=await this.runCommand(["internal-only","log"]),s=function(e,t){let s=[];try{s=JSON.parse(t)}catch(t){e.error("failed to parse branch info",t)}return s}(this.logger,t.stdout.trim());if(0===s.length)throw new Error(n.ErrorShortMessages.NoCommitsFetched);this.smartlogCommits={fetchStartTimestamp:e,fetchCompletedTimestamp:Date.now(),commits:{value:s}},this.smartlogCommitsChangesEmitter.emit("change",this.smartlogCommits)}catch(t){this.logger.error("Error fetching commits: ",t),this.smartlogCommitsChangesEmitter.emit("change",{fetchStartTimestamp:e,fetchCompletedTimestamp:Date.now(),commits:{error:t instanceof Error?t:new Error(t)}})}}));subscribeToHeadCommit(e){let t=this.smartlogCommits?.commits.value?.find((e=>e.isHead));null!=t&&e(t);const s=s=>{const n=s?.commits.value?.find((e=>e.isHead));null!=n&&n.branch!==t?.branch&&(e(n),t=n)};return this.smartlogCommitsChangesEmitter.on("change",s),{dispose:()=>{this.smartlogCommitsChangesEmitter.off("change",s)}}}catLimiter=new P(4,(e=>this.logger.info("[cat]",e)));cat(e,t){const s=l().relative(this.info.repoRoot,e);return this.catLimiter.enqueueRun((async()=>(await this.runCommand(["internal-only","relative-cat",...this.catArgs(t,s)],void 0,{stripFinalNewline:!1})).stdout))}catArgs(e,t){switch(e.type){case n.ComparisonType.UncommittedChanges:return["uncommitted",t];case n.ComparisonType.HeadChanges:return["head",t];case n.ComparisonType.StackChanges:return["stack",t];case n.ComparisonType.Committed:return["stack",t,"--ref",e.hash]}}getAllDiffIds(){return this.getSmartlogCommits()?.commits.value?.map((e=>e.pr?.number)).filter(n.notEmpty)??[]}runCommand(e,t,s){return H({command:this.info.command,args:e,logger:this.logger,cwd:(0,n.unwrap)(t??this.info.repoRoot),options:s})}getConfig(e){return B(this.info.command,this.logger,this.info.repoRoot,e)}setConfig(e,t,s){return async function({command:e,logger:t,cwd:s,level:n,configName:i,configValue:r}){await H({command:e,args:["internal-only","set-config","--level",n,i,r],logger:t,cwd:s})}({command:this.info.command,logger:this.logger,cwd:this.info.repoRoot,level:e,configName:t,configValue:s})}}function H({command:e,args:t,logger:s,cwd:n,options:i}){const{command:r,args:o,options:a}=V(e,t,n,i);return s&&s.log("run command: ",r,...o,a),O()(r,o,a)}async function z(e,t,s){try{return JSON.parse((await H({command:e,args:["internal-only","repo-info"],logger:t,cwd:s})).stdout)}catch(e){return void t.error(`Failed to find repository info in ${s}`,e)}}async function W(e,t,s){try{return JSON.parse((await H({command:e,args:["internal-only","profile"],logger:t,cwd:s})).stdout)}catch(e){return t.error(`Failed to find repository profile in ${s}`,e),{appUrl:"https://app.graphite.dev/"}}}async function B(e,t,s,n){try{return(await H({command:e,args:["internal-only","config",n],logger:t,cwd:s})).stdout.trim()}catch{return}}function V(e,t,s,n){let i=[...t];"win32"!==process.platform&&(i=i.map((e=>e.replace(/\\\\/g,"\\"))));const r={...n,env:{LANG:"en_US.utf-8",EDITOR:void 0,GRAPHITE_INTERACTIVE:"true"},cwd:s};return!e&&process.argv[1].startsWith("/snapshot/")?(e=process.argv[0],i=["/snapshot/monologue/apps/public/cli/dist/graphite.js",...i]):e||(e="gt"),{command:e,args:i,options:r}}var G=s(32081);const J={platformName:"browser",handleMessageFromClient:(e,t)=>{switch(t.type){case"platform/openFile":{const s=l().join((0,n.unwrap)(e?.info.repoRoot),t.path);let i;if(null==i)switch(process.platform){case"darwin":i="/usr/bin/open";break;case"win32":i="notepad.exe";break;case"linux":i="xdg-open"}if(i){e?.logger.log("open file",s);const t=(0,G.spawn)(i,[s],{detached:!0,stdio:"ignore",windowsHide:!1,windowsVerbatimArguments:!0});t.on("error",(t=>{e?.logger.log("failed to open",s,t)})),t.unref()}break}}}};class Q{promise;disposeFunc;constructor(e,t){this.promise=e,this.disposeFunc=t}unref(){this.disposed||(this.disposed=!0,this.disposeFunc())}internalReference;disposed=!1}class K{value;constructor(e){this.value=e}references=0;isDisposed=!1;ref(){this.references++}getNumberOfReferences(){return this.references}dispose(){this.references--,this.isDisposed||0!==this.references||(this.isDisposed=!0,this.value.dispose())}}const X=new class{RepositoryType;constructor(e=q){this.RepositoryType=e}reposByRoot=new Map;activeReposEmitter=new _;lookup(e){for(const s of this.reposByRoot.values())if((e===s.value.info.repoRoot||e.startsWith((t=s.value.info.repoRoot).endsWith(l().sep)?t:t+l().sep))&&!s.isDisposed)return s;var t}getOrCreate(e,t,s){const n=this.lookup(s);if(n)return n.ref(),new Q(Promise.resolve(n.value),(()=>n.dispose()));let i;return i=new Q((async()=>{const n=await this.RepositoryType.getRepoInfo(e,t,s);if("success"!==n.type)return n;if(i.disposed)return{type:"unknownError",error:new Error("Repository already disposed")};const r=this.lookup(n.repoRoot);if(r)return r.ref(),i.internalReference=r,r.value;const o=new this.RepositoryType(n,t),a=new K(o);return a.ref(),i.internalReference=a,this.reposByRoot.set(n.repoRoot,a),this.activeReposEmitter.emit("change"),o})(),(()=>{i.internalReference&&i.internalReference.dispose(),i.unref()})),i}cachedRepositoryForPath(e){const t=this.lookup(e);return t?.value}onChangeActiveRepos(e){const t=()=>{e([...this.reposByRoot.values()].map((e=>e.value)))};return this.activeReposEmitter.on("change",t),t(),()=>this.activeReposEmitter.off("change",t)}clearCache(){this.reposByRoot.forEach((e=>e.dispose())),this.reposByRoot=new Map,this.activeReposEmitter.removeAllListeners()}numberOfActiveServers(){let e=0;for(const t of this.reposByRoot.values())e+=t.getNumberOfReferences();return e}};class Y{platform;connection;tracker;logger;listenersByType=new Map;incomingListener;repoDisposables=[];subscriptions=new Map;activeRepoRef;queuedMessages=[];currentState={type:"loading"};pageId=(0,n.randomId)();constructor(e,t,s,i){this.platform=e,this.connection=t,this.tracker=s,this.logger=i;let r=null;this.incomingListener=this.connection.onDidReceiveMessage(((e,s)=>{if(s)return null==r?void t.logger?.error("Error: got a binary message when not expecting one"):(this.handleIncomingMessageWithPayload(r,e),void(r=null));if(null!=r)return t.logger?.error("Error: didnt get binary payload after a message that requires one"),void(r=null);const i=e.toString("utf-8"),o=(0,n.deserializeFromString)(i);if(function(e){return null!=e&&"object"==typeof e&&!0===e.hasBinaryPayload}(o))r=o;else if("loading"===this.currentState.type)this.queuedMessages.push(o);else try{this.handleIncomingMessage(o)}catch(e){t.logger?.error("error handling incoming message: ",o,e)}}))}setRepoError(e){this.disposeRepoDisposables(),this.currentState={type:"error",error:e},this.tracker.context.setRepo(void 0),this.processQueuedMessages()}setCurrentRepo(e,t){this.disposeRepoDisposables(),this.currentState={type:"repo",repo:e,cwd:t},this.tracker.context.setRepo(e),null!=e.codeReviewProvider&&this.repoDisposables.push(e.codeReviewProvider.onChangeDiffSummaries((e=>{this.postMessage({type:"fetchedDiffSummaries",summaries:e})}))),this.repoDisposables.push(e.subscribeToHeadCommit((t=>{const s=e.getSmartlogCommits(),n=function(e,t){let s;if(null!=e){const n=new Map(e.map((e=>[e.branch,e])));let i=t;for(;null!=i;){if(i.partOfTrunk){s=i;break}if(null==i.parents[0])break;i=n.get(i.parents[0])}}return s}(s?.commits.value,t);this.tracker.track("HeadCommitChanged",{extras:{hash:t.branch,public:n?.branch}})}))),this.processQueuedMessages()}postMessage(e){this.connection.postMessage((0,n.serializeToString)(e)).catch((()=>{console.warn("Failed to post message to client")}))}setActiveRepoForCwd(e){void 0!==this.activeRepoRef&&this.activeRepoRef.unref(),this.logger.info(`Setting active repo cwd to ${e}`),this.currentState={type:"loading"};const t=this.connection.command;this.activeRepoRef=X.getOrCreate(t,this.logger,e),this.activeRepoRef.promise.then((t=>{t instanceof q?this.setCurrentRepo(t,e):this.setRepoError(t)}))}dispose(){this.incomingListener.dispose(),this.disposeRepoDisposables(),void 0!==this.activeRepoRef&&this.activeRepoRef.unref()}disposeRepoDisposables(){this.repoDisposables.forEach((e=>e.dispose())),this.repoDisposables=[],this.subscriptions.forEach((e=>e.dispose())),this.subscriptions.clear()}processQueuedMessages(){for(const e of this.queuedMessages)try{this.handleIncomingMessage(e)}catch(t){this.connection.logger?.error("error handling queued message: ",e,t)}this.queuedMessages=[]}handleIncomingMessageWithPayload(e,t){switch(e.type){case"uploadFile":{const{id:s,filename:i}=e,r=null;if(null==r)return;this.tracker.operation("UploadImage","UploadImageError",{},(()=>r((0,n.unwrap)(this.connection.logger),{filename:i,data:t}))).then((e=>{this.connection.logger?.info("sucessfully uploaded file",i,e),this.postMessage({type:"uploadFileResult",id:s,result:{value:e}})})).catch((e=>{this.connection.logger?.info("error uploading file",i,e),this.postMessage({type:"uploadFileResult",id:s,result:{error:e}})}));break}}}handleIncomingMessage(e){this.handleIncomingGeneralMessage(e);const{currentState:t}=this;switch(t.type){case"repo":{const{repo:s,cwd:n}=t;this.handleIncomingMessageWithRepo(e,s,n);break}case"loading":case"error":e.type.startsWith("platform/")&&(this.platform.handleMessageFromClient(void 0,e,(e=>this.postMessage(e)),(e=>{this.repoDisposables.push({dispose:e})})),this.notifyListeners(e))}}handleIncomingGeneralMessage(e){switch(e.type){case"track":this.tracker.trackData(e.data);break;case"changeCwd":this.setActiveRepoForCwd(e.cwd);break;case"requestRepoInfo":switch(this.currentState.type){case"repo":this.postMessage({type:"repoInfo",info:this.currentState.repo.info,cwd:this.currentState.cwd});break;case"error":this.postMessage({type:"repoInfo",info:this.currentState.error})}break;case"requestApplicationInfo":this.postMessage({type:"applicationInfo",platformName:this.platform.platformName,version:this.connection.version})}}handleIncomingMessageWithRepo(e,t,s){const{logger:i}=t;switch(e.type){case"subscribe":{const{subscriptionID:s,kind:n}=e;switch(n){case"uncommittedChanges":{const e=e=>{this.postMessage({type:"subscriptionResult",kind:"uncommittedChanges",subscriptionID:s,data:e})},n=t.getUncommittedChanges();null!=n&&e(n);const i=[];i.push(t.subscribeToUncommittedChanges(e)),t.fetchUncommittedChanges(),i.push(t.subscribeToUncommittedChangesBeginFetching((()=>this.postMessage({type:"beganFetchingUncommittedChangesEvent"})))),this.subscriptions.set(s,{dispose:()=>{i.forEach((e=>e.dispose()))}});break}case"smartlogCommits":{const e=e=>{this.postMessage({type:"subscriptionResult",kind:"smartlogCommits",subscriptionID:s,data:e})},n=t.getSmartlogCommits();null!=n&&e(n);const i=[];i.push(t.subscribeToSmartlogCommitsChanges(e)),t.fetchSmartlogCommits(),i.push(t.subscribeToSmartlogCommitsBeginFetching((()=>this.postMessage({type:"beganFetchingSmartlogCommitsEvent"})))),this.subscriptions.set(s,{dispose:()=>{i.forEach((e=>e.dispose()))}});break}case"mergeConflicts":{const e=e=>{this.postMessage({type:"subscriptionResult",kind:"mergeConflicts",subscriptionID:s,data:e})},n=t.getMergeConflicts();null!=n&&e(n),this.subscriptions.set(s,t.onChangeConflictState(e));break}}break}case"unsubscribe":{const t=this.subscriptions.get(e.subscriptionID);t?.dispose(),this.subscriptions.delete(e.subscriptionID);break}case"runOperation":{const{operation:n}=e;t.runOrQueueOperation(n,(e=>{this.postMessage({type:"operationProgress",...e}),"queue"===e.kind&&this.tracker.track("QueueOperation",{extras:{operation:n.trackEventName}})}),this.tracker,s);break}case"abortRunningOperation":{const{operationId:s}=e;t.abortRunningOpeation(s);break}case"getConfig":t.getConfig(e.name).catch((()=>{})).then((t=>{i.info("got config",e.name,t),this.postMessage({type:"gotConfig",name:e.name,value:t})}));break;case"fetchRepoMessage":t.runCommand(["internal-only","repo-message"]).then((e=>({value:e.stdout}))).catch((e=>(i?.error("error fetching repo message",e.toString()),{error:e}))).then((e=>this.postMessage({type:"fetchedRepoMessage",message:e.value||""})));break;case"fetchUpgradePrompt":t.runCommand(["internal-only","upgrade-prompt"]).then((e=>({value:e.stdout}))).catch((e=>(i?.error("error fetching upgrade prompt",e.toString()),{error:e}))).then((e=>this.postMessage({type:"fetchedUpgradePrompt",message:e.value||""})));break;case"setConfig":i.info("set config",e.name,e.value),t.setConfig("user",e.name,e.value).catch((t=>{i.error("error setting config",e.name,e.value,t)}));break;case"deleteFile":{const{filePath:s}=e,n=function(e,t,s=l()){const n=s.resolve(t.info.repoRoot,e);return n.startsWith(t.info.repoRoot+s.sep)?n:null}(s,t);if(null==n)return void i.warn("can't delete file outside of the repo",s);r().promises.rm(n).then((()=>{i.info("deleted file from filesystem",n)})).catch((e=>{i.error("unable to delete file",n,e)}));break}case"requestComparison":{const{comparison:s}=e;t.runCommand(["internal-only","diff",...(0,n.revsetArgsForComparison)(s)]).then((e=>({value:e.stdout}))).catch((e=>(i?.error("error running diff",e.toString()),{error:e}))).then((e=>this.postMessage({type:"comparison",comparison:s,data:{diff:e}})));break}case"requestChangedFiles":{const{branch:s}=e;t.runCommand(["internal-only","changed-files",s]).then((e=>JSON.parse(e.stdout))).catch((e=>(i?.error("error running diff",e.toString()),{error:e}))).then((e=>this.postMessage({type:"changedFiles",branch:s,data:e})));break}case"requestComparisonContextLines":{const{id:{path:s,comparison:n},start:i,numLines:r}=e;t.cat(s,n).catch((()=>"")).then((e=>this.postMessage({type:"comparisonContextLines",lines:e.split("\n").slice(i-1,i-1+r),path:s})));break}case"refresh":i?.log("refresh requested"),t.fetchSmartlogCommits(),t.fetchUncommittedChanges(),t.codeReviewProvider?.triggerDiffSummariesFetch(t.getAllDiffIds());break;case"pageVisibility":t.setPageFocus(this.pageId,e.state);break;case"fetchCommitMessageTemplate":t.runCommand(["internal-only","templates"]).then((e=>{const s=JSON.parse(e.stdout);this.postMessage({type:"fetchedCommitMessageTemplate",templates:Object.fromEntries(Object.entries(s).map((([e,s])=>[e,s.replace(t.IGNORE_COMMIT_MESSAGE_LINES_REGEX,"")])))})})).catch((e=>{i?.error("Could not fetch commit message template",e)}));break;case"typeahead":t.codeReviewProvider?.typeahead?.(e.kind,e.query)?.then((t=>this.postMessage({type:"typeaheadResult",id:e.id,result:t})));break;case"fetchDiffSummaries":t.codeReviewProvider?.triggerDiffSummariesFetch(t.getAllDiffIds());break;case"loadMoreCommits":{const e=t.nextVisibleCommitRangeInDays();return this.postMessage({type:"commitsShownRange",rangeInDays:e}),this.postMessage({type:"beganLoadingMoreCommits"}),t.fetchSmartlogCommits(),void this.tracker.track("LoadMoreCommits",{extras:{daysToFetch:e??"Infinity"}})}default:this.platform.handleMessageFromClient(t,e,(e=>this.postMessage(e)),(e=>{this.repoDisposables.push({dispose:e})}))}this.notifyListeners(e)}notifyListeners(e){const t=this.listenersByType.get(e.type);t&&t.forEach((t=>t(e)))}}var Z=s(6113);const ee="win32"==process.platform?l().join((0,n.unwrap)(process.env.LOCALAPPDATA),"cache"):"darwin"==process.platform?l().join(g().homedir(),"Library/Caches"):process.env.XDG_CACHE_HOME||l().join(g().homedir(),".cache");function te(e,t){const s=Buffer.from(e),n=Buffer.from(t);return s.length===n.length&&(0,Z.timingSafeEqual)(s,n)}function se(e){const t=e.logger??(e.logFileLocation?function(e){const t=(...t)=>{const s=w().format(...t)+"\n";r().promises.appendFile(e,s)};return{info:t,log:t,warn:t,error:t,getLogFileContents:()=>r().promises.readFile(e,"utf-8")}}(e.logFileLocation):C);e.logger=t;const s=e?.platform??J,i=e?.version??"unknown";t.log(`establish client connection for ${e.cwd}`),t.log(`platform '${s.platformName}', version '${i}', command '${e.command}'`);const o=function(e,t,s,i=b){return new n.Tracker(((e,t)=>{const{logger:s}=t;s.log("[track]",e.eventName,e.errorName??"",e.errorMessage??"",null!=e.extras?JSON.stringify(e.extras):"");try{Promise.resolve(i({...e,...t.data})).catch((e=>{}))}catch{}}),new v(e,function(e,t){return{platform:e,version:t,repo:void 0,sessionId:(0,n.randomId)(),unixname:f(),osArch:g().arch(),osType:g().platform(),osRelease:g().release(),hostname:g().hostname()}}(t.platformName,s)))}(t,s,i,(t=>H({command:e.command||"gt",args:["internal-only","log-action",t.eventName||t.errorName||"UNKNOWN_CLI_EVENT",(t.timestamp?new Date(t.timestamp):new Date).toISOString(),JSON.stringify(t)],cwd:e.cwd})));o.track("ClientConnection",{extras:{cwd:e.cwd}});let a=new Y(s,e,o,t);return a.setActiveRepoForCwd(e.cwd),()=>{a?.dispose(),a=null}}function ne({port:e,sensitiveToken:t,challengeToken:s,logFileLocation:i,logInfo:o,command:c,gtVersion:h,foreground:d,frontendDir:p}){return new Promise((g=>{try{const e=JSON.parse(r().readFileSync(l().join(p,"build/asset-manifest.json"),"utf-8"));for(const t of Object.values(e.files))t.startsWith("/")||g({type:"error",error:`expected entry to start with / but was: \`${t}\``}),oe[t]=t.slice(1)}catch(e){}oe["/favicon.ico"]="favicon.ico";const f=a().createServer((async(e,n)=>{if(e.url){const{pathname:o}=u().parse(e.url);if(null!=o&&oe.hasOwnProperty(o)){const e=oe[o];let t;try{t=await r().promises.readFile(l().join(p,"build",e))}catch(e){return n.writeHead(500,{"Content-Type":"text/plain"}),void n.end((i=e.toString(),i.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#27;")))}const s=e.lastIndexOf("."),a=e.slice(s+1),c=re[a]??"text/plain";return n.writeHead(200,{"Content-Type":c}),void n.end(t)}if("/challenge_authenticity"===o){const i=ie(e.url).get("token");if(i&&te(i,t)){n.writeHead(200,{"Content-Type":"text/json"});const e={challengeToken:s,pid:process.pid};n.end(JSON.stringify(e))}else n.writeHead(401,{"Content-Type":"text/json"}),n.end(JSON.stringify({error:"invalid token"}));return}}var i;n.writeHead(404,{"Content-Type":"text/html"}),n.end("<html><body>Not Found!</body></html>")})),v=f.listen(e),b=new(m().Server)({noServer:!0,path:"/ws"});b.on("connection",((e,s)=>{let r,a,l;if(s.url){const e=ie(s.url);r=e.get("token");const t=e.get("cwd");l=e.get("platform"),t&&(a=decodeURIComponent(t))}if(!r){const t="No token provided in websocket request";return o("closing ws:",t),void e.close(n.CLOSED_AND_SHOULD_NOT_RECONNECT_CODE,t)}if(!te(r,t)){const t="Invalid token";return o("closing ws:",t),void e.close(n.CLOSED_AND_SHOULD_NOT_RECONNECT_CODE,t)}const u=se({postMessage:t=>(e.send(t),Promise.resolve(!0)),onDidReceiveMessage(t){const s=e.on("message",t);return{dispose:()=>s.off("message",t)}},cwd:a??process.cwd(),logFileLocation:"stdout"===i?void 0:i,command:c,version:h,platform:void 0});e.on("close",(()=>{u(),d||setTimeout((()=>{0===X.numberOfActiveServers()&&process.exit(0)}),6e4)}))})),v.on("upgrade",((e,t,s)=>{b.handleUpgrade(e,t,s,(t=>{b.emit("connection",t,e)}))})),f.on("error",(function(t){if("listen"!==t.syscall)throw g({type:"error",error:t.toString()}),t;switch(t.code){case"EACCES":throw g({type:"error",error:`Port ${e} requires elevated privileges`}),t;case"EADDRINUSE":return void g({type:"addressInUse"});default:throw g({type:"error",error:t.toString()}),t}})),f.on("listening",(()=>g({type:"success",port:f.address().port,pid:process.pid})))}))}function ie(e){const t=u().parse(e).search?.replace(/^\?/,"").split("&").map((e=>e.split("=")));return new Map(t)}l().join(ee,"graphite-gti");const re={css:"text/css",html:"text/html",js:"text/javascript",ttf:"font/ttf"},oe={"/":"index.html"}}};
3
3
  //# sourceMappingURL=325.js.map