runspur 0.1.2 → 0.1.3
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/README.md +3 -1
- package/THIRD_PARTY_NOTICES.txt +133 -133
- package/native/runspur.exe +0 -0
- package/native/scheduler-mcp.exe +0 -0
- package/native/schedulerd.exe +0 -0
- package/package.json +22 -22
- package/web/assets/{index-WDh3hQ5S.css → index-B-DC_Iqf.css} +1 -1
- package/web/assets/index-CqsPCOTj.js +1 -0
- package/web/index.html +25 -2
- package/web/assets/index-BOjpYd69.js +0 -1
package/README.md
CHANGED
|
@@ -29,10 +29,12 @@ For headless use, run `runspur start` to start the scheduler in the background a
|
|
|
29
29
|
|
|
30
30
|
## Manage projects and dispatches
|
|
31
31
|
|
|
32
|
-
Use **Projects** to edit the Agents or permissions of a connected project.
|
|
32
|
+
Use **Projects** to edit the Agents or permissions of a connected project. New projects start read-only. Use Claude Code **2.1.319** for isolated workspace edits. To refresh an existing project's Runspur Skill, preview and save **Edit configuration**, then open a new conversation.
|
|
33
33
|
|
|
34
34
|
Use **Dispatch history** to find tasks by project and conversation, then inspect their results and delivery status.
|
|
35
35
|
|
|
36
|
+
Use **Settings** to set the global concurrency limit and child Agent access. Project permissions are the default. **Full access** enables native shell and file tools in the live project. **Follow main Agent** uses verified full or read-only access and falls back to project permissions for other or unavailable modes.
|
|
37
|
+
|
|
36
38
|
Before uninstalling, finish active tasks and close connected Agent conversations. Stop the scheduler from **Overview** or run `runspur stop`. If the panel is open, press Ctrl+C in the `runspur tui` terminal to close it. Then run `npm uninstall --global runspur`. Project settings and the Runspur state directory are stored separately.
|
|
37
39
|
|
|
38
40
|
[Full usage and source](https://github.com/ohmacemace/runspur) · [简体中文](https://github.com/ohmacemace/runspur/blob/main/docs/README.zh-CN.md)
|
package/THIRD_PARTY_NOTICES.txt
CHANGED
|
@@ -12694,6 +12694,101 @@ IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
|
12694
12694
|
DEALINGS IN THE SOFTWARE.
|
|
12695
12695
|
|
|
12696
12696
|
|
|
12697
|
+
========================================================================
|
|
12698
|
+
http-body 1.1.0
|
|
12699
|
+
Declared license: MIT
|
|
12700
|
+
Source: https://github.com/hyperium/http-body
|
|
12701
|
+
|
|
12702
|
+
--- LICENSE ---
|
|
12703
|
+
Copyright (c) 2019-2026 Sean McArthur & Hyper Contributors
|
|
12704
|
+
|
|
12705
|
+
Permission is hereby granted, free of charge, to any
|
|
12706
|
+
person obtaining a copy of this software and associated
|
|
12707
|
+
documentation files (the "Software"), to deal in the
|
|
12708
|
+
Software without restriction, including without
|
|
12709
|
+
limitation the rights to use, copy, modify, merge,
|
|
12710
|
+
publish, distribute, sublicense, and/or sell copies of
|
|
12711
|
+
the Software, and to permit persons to whom the Software
|
|
12712
|
+
is furnished to do so, subject to the following
|
|
12713
|
+
conditions:
|
|
12714
|
+
|
|
12715
|
+
The above copyright notice and this permission notice
|
|
12716
|
+
shall be included in all copies or substantial portions
|
|
12717
|
+
of the Software.
|
|
12718
|
+
|
|
12719
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
|
|
12720
|
+
ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
|
12721
|
+
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
|
12722
|
+
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
|
12723
|
+
SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
12724
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
12725
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
|
|
12726
|
+
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
12727
|
+
DEALINGS IN THE SOFTWARE.
|
|
12728
|
+
|
|
12729
|
+
|
|
12730
|
+
========================================================================
|
|
12731
|
+
http-body-util 0.1.5
|
|
12732
|
+
Declared license: MIT
|
|
12733
|
+
Source: https://github.com/hyperium/http-body
|
|
12734
|
+
|
|
12735
|
+
--- LICENSE ---
|
|
12736
|
+
Copyright (c) 2019-2026 Sean McArthur & Hyper Contributors
|
|
12737
|
+
|
|
12738
|
+
Permission is hereby granted, free of charge, to any
|
|
12739
|
+
person obtaining a copy of this software and associated
|
|
12740
|
+
documentation files (the "Software"), to deal in the
|
|
12741
|
+
Software without restriction, including without
|
|
12742
|
+
limitation the rights to use, copy, modify, merge,
|
|
12743
|
+
publish, distribute, sublicense, and/or sell copies of
|
|
12744
|
+
the Software, and to permit persons to whom the Software
|
|
12745
|
+
is furnished to do so, subject to the following
|
|
12746
|
+
conditions:
|
|
12747
|
+
|
|
12748
|
+
The above copyright notice and this permission notice
|
|
12749
|
+
shall be included in all copies or substantial portions
|
|
12750
|
+
of the Software.
|
|
12751
|
+
|
|
12752
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
|
|
12753
|
+
ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
|
12754
|
+
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
|
12755
|
+
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
|
12756
|
+
SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
12757
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
12758
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
|
|
12759
|
+
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
12760
|
+
DEALINGS IN THE SOFTWARE.
|
|
12761
|
+
|
|
12762
|
+
|
|
12763
|
+
========================================================================
|
|
12764
|
+
http-range-header 0.4.2
|
|
12765
|
+
Declared license: MIT
|
|
12766
|
+
Source: https://github.com/MarcusGrass/parse-range-headers
|
|
12767
|
+
|
|
12768
|
+
--- LICENSE ---
|
|
12769
|
+
MIT License
|
|
12770
|
+
|
|
12771
|
+
Copyright (c) 2021 MarcusGrass
|
|
12772
|
+
|
|
12773
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
12774
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
12775
|
+
in the Software without restriction, including without limitation the rights
|
|
12776
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
12777
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
12778
|
+
furnished to do so, subject to the following conditions:
|
|
12779
|
+
|
|
12780
|
+
The above copyright notice and this permission notice shall be included in all
|
|
12781
|
+
copies or substantial portions of the Software.
|
|
12782
|
+
|
|
12783
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
12784
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
12785
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
12786
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
12787
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
12788
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
12789
|
+
SOFTWARE.
|
|
12790
|
+
|
|
12791
|
+
|
|
12697
12792
|
========================================================================
|
|
12698
12793
|
httparse 1.10.1
|
|
12699
12794
|
Declared license: MIT OR Apache-2.0
|
|
@@ -12926,72 +13021,6 @@ THE SOFTWARE.
|
|
|
12926
13021
|
|
|
12927
13022
|
|
|
12928
13023
|
|
|
12929
|
-
========================================================================
|
|
12930
|
-
http-body 1.1.0
|
|
12931
|
-
Declared license: MIT
|
|
12932
|
-
Source: https://github.com/hyperium/http-body
|
|
12933
|
-
|
|
12934
|
-
--- LICENSE ---
|
|
12935
|
-
Copyright (c) 2019-2026 Sean McArthur & Hyper Contributors
|
|
12936
|
-
|
|
12937
|
-
Permission is hereby granted, free of charge, to any
|
|
12938
|
-
person obtaining a copy of this software and associated
|
|
12939
|
-
documentation files (the "Software"), to deal in the
|
|
12940
|
-
Software without restriction, including without
|
|
12941
|
-
limitation the rights to use, copy, modify, merge,
|
|
12942
|
-
publish, distribute, sublicense, and/or sell copies of
|
|
12943
|
-
the Software, and to permit persons to whom the Software
|
|
12944
|
-
is furnished to do so, subject to the following
|
|
12945
|
-
conditions:
|
|
12946
|
-
|
|
12947
|
-
The above copyright notice and this permission notice
|
|
12948
|
-
shall be included in all copies or substantial portions
|
|
12949
|
-
of the Software.
|
|
12950
|
-
|
|
12951
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
|
|
12952
|
-
ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
|
12953
|
-
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
|
12954
|
-
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
|
12955
|
-
SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
12956
|
-
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
12957
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
|
|
12958
|
-
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
12959
|
-
DEALINGS IN THE SOFTWARE.
|
|
12960
|
-
|
|
12961
|
-
|
|
12962
|
-
========================================================================
|
|
12963
|
-
http-body-util 0.1.5
|
|
12964
|
-
Declared license: MIT
|
|
12965
|
-
Source: https://github.com/hyperium/http-body
|
|
12966
|
-
|
|
12967
|
-
--- LICENSE ---
|
|
12968
|
-
Copyright (c) 2019-2026 Sean McArthur & Hyper Contributors
|
|
12969
|
-
|
|
12970
|
-
Permission is hereby granted, free of charge, to any
|
|
12971
|
-
person obtaining a copy of this software and associated
|
|
12972
|
-
documentation files (the "Software"), to deal in the
|
|
12973
|
-
Software without restriction, including without
|
|
12974
|
-
limitation the rights to use, copy, modify, merge,
|
|
12975
|
-
publish, distribute, sublicense, and/or sell copies of
|
|
12976
|
-
the Software, and to permit persons to whom the Software
|
|
12977
|
-
is furnished to do so, subject to the following
|
|
12978
|
-
conditions:
|
|
12979
|
-
|
|
12980
|
-
The above copyright notice and this permission notice
|
|
12981
|
-
shall be included in all copies or substantial portions
|
|
12982
|
-
of the Software.
|
|
12983
|
-
|
|
12984
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
|
|
12985
|
-
ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
|
12986
|
-
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
|
12987
|
-
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
|
12988
|
-
SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
12989
|
-
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
12990
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
|
|
12991
|
-
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
12992
|
-
DEALINGS IN THE SOFTWARE.
|
|
12993
|
-
|
|
12994
|
-
|
|
12995
13024
|
========================================================================
|
|
12996
13025
|
httpdate 1.0.3
|
|
12997
13026
|
Declared license: MIT OR Apache-2.0
|
|
@@ -13223,35 +13252,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
13223
13252
|
THE SOFTWARE.
|
|
13224
13253
|
|
|
13225
13254
|
|
|
13226
|
-
========================================================================
|
|
13227
|
-
http-range-header 0.4.2
|
|
13228
|
-
Declared license: MIT
|
|
13229
|
-
Source: https://github.com/MarcusGrass/parse-range-headers
|
|
13230
|
-
|
|
13231
|
-
--- LICENSE ---
|
|
13232
|
-
MIT License
|
|
13233
|
-
|
|
13234
|
-
Copyright (c) 2021 MarcusGrass
|
|
13235
|
-
|
|
13236
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
13237
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
13238
|
-
in the Software without restriction, including without limitation the rights
|
|
13239
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
13240
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
13241
|
-
furnished to do so, subject to the following conditions:
|
|
13242
|
-
|
|
13243
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13244
|
-
copies or substantial portions of the Software.
|
|
13245
|
-
|
|
13246
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
13247
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
13248
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
13249
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
13250
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
13251
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
13252
|
-
SOFTWARE.
|
|
13253
|
-
|
|
13254
|
-
|
|
13255
13255
|
========================================================================
|
|
13256
13256
|
hybrid-array 0.4.15
|
|
13257
13257
|
Declared license: MIT OR Apache-2.0
|
|
@@ -17882,41 +17882,9 @@ DEALINGS IN THE SOFTWARE.
|
|
|
17882
17882
|
|
|
17883
17883
|
|
|
17884
17884
|
========================================================================
|
|
17885
|
-
|
|
17886
|
-
Declared license: Apache-2.0
|
|
17887
|
-
Source: https://github.com/
|
|
17888
|
-
|
|
17889
|
-
--- COPYRIGHT ---
|
|
17890
|
-
Short version for non-lawyers:
|
|
17891
|
-
|
|
17892
|
-
This project is dual-licensed under Apache 2.0 and MIT terms.
|
|
17893
|
-
|
|
17894
|
-
|
|
17895
|
-
Longer version:
|
|
17896
|
-
|
|
17897
|
-
Copyrights in this project are retained by their contributors. No copyright
|
|
17898
|
-
assignment is required to contribute.
|
|
17899
|
-
|
|
17900
|
-
Some files include explicit copyright notices and/or license notices.
|
|
17901
|
-
For full authorship information, see the version control history.
|
|
17902
|
-
|
|
17903
|
-
Except as otherwise noted (below and/or in individual files), the project is
|
|
17904
|
-
licensed under the Apache License, Version 2.0 <LICENSE-APACHE> or
|
|
17905
|
-
<http://www.apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT>
|
|
17906
|
-
or <http://opensource.org/licenses/MIT>, at your option.
|
|
17907
|
-
|
|
17908
|
-
|
|
17909
|
-
The read2() method in src/std/core.rs is adapted from the read2()
|
|
17910
|
-
function in the Rust stdlib at sys/unix/pipe.rs, copyright the Rust Contributors,
|
|
17911
|
-
licensed under Apache 2.0 and MIT.
|
|
17912
|
-
<https://github.com/rust-lang/rust/blob/c9aa2595d9ba2313bbfcc8e0244231baa9c5d9e0/library/std/src/sys/unix/pipe.rs#L76-L122>
|
|
17913
|
-
|
|
17914
|
-
|
|
17915
|
-
The job_object() and resume_threads() methods in src/windows.rs are
|
|
17916
|
-
adapted from the Windows™ version of the new() method in watchexec at
|
|
17917
|
-
src/process.rs, copyright Matt Green, licensed under Apache 2.0 only.
|
|
17918
|
-
<https://github.com/watchexec/watchexec/blob/07974e0d1411e79e653a5a5f610f923834628038/lib/src/process.rs#L305-L393>
|
|
17919
|
-
|
|
17885
|
+
proc-macro2 1.0.107
|
|
17886
|
+
Declared license: MIT OR Apache-2.0
|
|
17887
|
+
Source: https://github.com/dtolnay/proc-macro2
|
|
17920
17888
|
|
|
17921
17889
|
--- LICENSE-APACHE ---
|
|
17922
17890
|
Apache License
|
|
@@ -18124,9 +18092,41 @@ DEALINGS IN THE SOFTWARE.
|
|
|
18124
18092
|
|
|
18125
18093
|
|
|
18126
18094
|
========================================================================
|
|
18127
|
-
|
|
18128
|
-
Declared license:
|
|
18129
|
-
Source: https://github.com/
|
|
18095
|
+
process-wrap 10.0.1
|
|
18096
|
+
Declared license: Apache-2.0 OR MIT
|
|
18097
|
+
Source: https://github.com/watchexec/process-wrap
|
|
18098
|
+
|
|
18099
|
+
--- COPYRIGHT ---
|
|
18100
|
+
Short version for non-lawyers:
|
|
18101
|
+
|
|
18102
|
+
This project is dual-licensed under Apache 2.0 and MIT terms.
|
|
18103
|
+
|
|
18104
|
+
|
|
18105
|
+
Longer version:
|
|
18106
|
+
|
|
18107
|
+
Copyrights in this project are retained by their contributors. No copyright
|
|
18108
|
+
assignment is required to contribute.
|
|
18109
|
+
|
|
18110
|
+
Some files include explicit copyright notices and/or license notices.
|
|
18111
|
+
For full authorship information, see the version control history.
|
|
18112
|
+
|
|
18113
|
+
Except as otherwise noted (below and/or in individual files), the project is
|
|
18114
|
+
licensed under the Apache License, Version 2.0 <LICENSE-APACHE> or
|
|
18115
|
+
<http://www.apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT>
|
|
18116
|
+
or <http://opensource.org/licenses/MIT>, at your option.
|
|
18117
|
+
|
|
18118
|
+
|
|
18119
|
+
The read2() method in src/std/core.rs is adapted from the read2()
|
|
18120
|
+
function in the Rust stdlib at sys/unix/pipe.rs, copyright the Rust Contributors,
|
|
18121
|
+
licensed under Apache 2.0 and MIT.
|
|
18122
|
+
<https://github.com/rust-lang/rust/blob/c9aa2595d9ba2313bbfcc8e0244231baa9c5d9e0/library/std/src/sys/unix/pipe.rs#L76-L122>
|
|
18123
|
+
|
|
18124
|
+
|
|
18125
|
+
The job_object() and resume_threads() methods in src/windows.rs are
|
|
18126
|
+
adapted from the Windows™ version of the new() method in watchexec at
|
|
18127
|
+
src/process.rs, copyright Matt Green, licensed under Apache 2.0 only.
|
|
18128
|
+
<https://github.com/watchexec/watchexec/blob/07974e0d1411e79e653a5a5f610f923834628038/lib/src/process.rs#L305-L393>
|
|
18129
|
+
|
|
18130
18130
|
|
|
18131
18131
|
--- LICENSE-APACHE ---
|
|
18132
18132
|
Apache License
|
package/native/runspur.exe
CHANGED
|
Binary file
|
package/native/scheduler-mcp.exe
CHANGED
|
Binary file
|
package/native/schedulerd.exe
CHANGED
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
2
|
+
"name": "runspur",
|
|
3
|
+
"version": "0.1.3",
|
|
4
|
+
"description": "Runspur Agent scheduler and local browser panel for Windows x64",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/ohmacemace/runspur.git"
|
|
9
|
+
},
|
|
10
|
+
"os": [
|
|
11
|
+
"win32"
|
|
12
|
+
],
|
|
13
|
+
"cpu": [
|
|
14
|
+
"x64"
|
|
15
|
+
],
|
|
16
|
+
"bin": {
|
|
17
|
+
"runspur": "native/runspur.exe"
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"native/*.exe",
|
|
21
|
+
"web/",
|
|
22
|
+
"THIRD_PARTY_NOTICES.txt"
|
|
23
|
+
]
|
|
24
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;color:#25283a;--canvas:#fdfcfa;--rail:#efedf3;--surface:#f5f4f8;--quiet:#646879;--line:#dedde5;--accent:#4945a9;--accent-hover:#38358e;--accent-wash:#e8e5f7;--error:#a43236;background:#fdfcfa;height:100%;font:14px/1.5 Segoe UI,system-ui,sans-serif}*{box-sizing:border-box}body{height:100%;margin:0;overflow:hidden}.app-shell{grid-template:minmax(0,1fr)/188px minmax(0,1fr);height:100%;display:grid}[hidden]{display:none!important}.app-header{border-right:1px solid var(--line);background:var(--rail);flex-direction:column;grid-area:1/1;gap:25px;min-height:0;padding:25px 14px 16px;display:flex;overflow-y:auto}.wordmark{letter-spacing:-.025em;align-items:center;gap:9px;padding:0 6px;font-size:17px;font-weight:670;display:flex}.brand-icon{background:var(--accent);border-radius:8px;flex:none;width:30px;height:30px}.brand-icon path{fill:none;stroke:#fff;stroke-width:2px;stroke-linecap:square;stroke-linejoin:round}.app-header nav{gap:3px;display:grid}.app-header .nav-button{min-height:40px;color:var(--quiet);text-align:left;background:0 0;align-items:center;gap:9px;padding:7px 9px;font-weight:600;display:flex}.app-header .nav-button:not([aria-current=page]):hover:not(:disabled){color:#25283a;background:#e5e3ec}.app-header .nav-button[aria-current=page]{background:var(--accent-wash);color:var(--accent)}.nav-button svg,.add-button svg,.text-button svg,.empty-icon svg{fill:none;stroke:currentColor;stroke-width:1.6px;stroke-linecap:round;stroke-linejoin:round;flex:none;width:18px;height:18px}.header-status{border-top:1px solid var(--line);align-items:flex-start;gap:9px;margin-top:auto;padding:13px 6px 0;display:flex}.rail-status,.channel{font-size:12px;display:block}.rail-status{font-weight:600}.channel{color:var(--quiet)}.indicator{background:#85889a;border-radius:50%;flex:none;width:7px;height:7px;margin-top:6px;transition:background-color .16s}.indicator[data-status=ready]{background:var(--accent);box-shadow:0 0 0 3px var(--accent-wash)}.indicator[data-status=error]{background:var(--error)}.indicator[data-status=pending]{animation:1s infinite alternate pulse}main{scrollbar-gutter:stable;grid-area:1/2;min-width:0;min-height:0;padding:36px 37px 32px;overflow-y:auto}main>section{max-width:950px;margin-inline:auto;animation:.18s ease-out both enter}.section-heading{justify-content:space-between;align-items:center;gap:16px;margin-bottom:24px;display:flex}.section-heading>div{min-width:0}h1{letter-spacing:-.045em;margin:0;font-size:33px;font-weight:680;line-height:1.16}h2{margin:0 0 8px;font-size:16px;font-weight:650}h3{margin:0;font-size:14px;font-weight:650}p{color:var(--quiet);margin:5px 0 0}strong{font-weight:650}button{background:var(--accent);color:#fff;cursor:pointer;white-space:nowrap;border:1px solid #0000;border-radius:6px;min-height:35px;padding:6px 12px;font:600 13px/1.4 Segoe UI,system-ui,sans-serif;transition:background-color .15s,border-color .15s,color .15s}button:hover:not(:disabled){background:var(--accent-hover)}button.secondary{color:inherit;background:var(--canvas);border-color:var(--line)}button.secondary:hover:not(:disabled){background:var(--surface);border-color:#c9c7d7}button:disabled{opacity:.5;cursor:default}button:focus-visible,input:focus-visible,select:focus-visible,summary:focus-visible,pre:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.add-button,.text-button{align-items:center;gap:6px;display:inline-flex}button.text-button{color:var(--accent);background:0 0}button.text-button:hover:not(:disabled){background:var(--accent-wash)}#close-project-setup{min-height:29px;color:var(--quiet);margin:-5px 0 5px -7px;padding-inline:7px}#close-project-setup:hover:not(:disabled){color:var(--accent)}#close-project-setup svg{width:16px;height:16px}.list-heading{border-bottom:1px solid var(--line);color:var(--quiet);margin:0;padding:10px 0;font-size:13px}.entry-list{display:grid}.dispatch-entry{border:0;border-bottom:1px solid var(--line);text-align:left;white-space:normal;overflow-wrap:anywhere;min-width:0;color:inherit;background:0 0;border-radius:0;gap:3px;padding:10px 25px 10px 9px;display:grid;position:relative}.dispatch-entry:after{border:solid var(--quiet);content:"";border-width:1px 1px 0 0;width:5px;height:5px;position:absolute;top:50%;right:8px;transform:translateY(-50%)rotate(45deg)}.dispatch-entry:hover:not(:disabled),.dispatch-entry[aria-pressed=true]{color:inherit;background:var(--accent-wash)}.dispatch-entry span{color:var(--quiet);font-size:12px;font-weight:400}.project-row{border-bottom:1px solid var(--line);grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;display:grid}.project-row .dispatch-entry{border-bottom:0;padding:12px 30px 12px 9px}.project-empty{text-align:center;border-bottom:1px solid var(--line);align-content:center;justify-items:center;min-height:208px;padding:28px 18px;display:grid}.project-empty h3{margin-top:11px;font-size:16px}.project-empty p{max-width:36ch}.empty-icon{width:43px;height:43px;color:var(--accent);background:var(--accent-wash);border-radius:11px;place-items:center;display:grid}.empty-icon svg{width:23px;height:23px}.notice,.settings-message{min-height:1.5em;font-size:13px}.notice:empty,.settings-message:empty{display:none}.notice[data-error=true]{color:var(--error);overflow-wrap:anywhere}#projects-notice{margin:-10px 0 11px}#project-feedback{margin-top:14px}#project-feedback[data-complete=true]{border-left:2px solid var(--accent);background:var(--accent-wash);color:var(--accent-hover);padding:9px 12px}.setup-feedback{border-left:2px solid var(--accent);background:var(--surface);margin-bottom:16px;padding:9px 13px}.setup-feedback[data-error=true]{border-color:var(--error);background:#f9efef}.setup-feedback p{color:inherit;margin:0;font-weight:600}.setup-feedback summary{color:var(--quiet);cursor:pointer;margin-top:5px;font-size:13px}.setup-feedback code{color:var(--quiet);overflow-wrap:anywhere;margin-top:4px;display:block}.project-setup-header{margin-bottom:20px}.setup-titlebar{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:6px 15px;display:flex}.setup-steps{align-items:center;gap:11px;margin:0;padding:0;list-style:none;display:flex}.setup-steps li{color:var(--quiet);align-items:center;gap:5px;font-size:12px;display:inline-flex}.setup-steps li+li:before{content:"";border-top:1px solid var(--line);width:13px;margin-right:4px}.setup-steps li b{font-weight:600}.setup-steps li span{background:var(--surface);border-radius:50%;place-items:center;width:20px;height:20px;transition:background-color .15s;display:inline-grid}.setup-steps li[aria-current=step]{color:var(--accent)}.setup-steps li[aria-current=step] span{background:var(--accent);color:#fff}.project-location{background:var(--surface);border-radius:7px;grid-template-columns:22px minmax(0,1fr);align-items:center;gap:9px;margin-top:11px;padding:8px 11px;display:grid}.project-location svg{width:18px;height:18px;color:var(--accent);fill:none;stroke:currentColor;stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round}.project-location span{color:var(--quiet);font-size:11px;font-weight:650;display:block}.project-location code{overflow-wrap:anywhere;font:12px/1.45 Consolas,monospace;display:block}.project-fields{grid-template-columns:minmax(0,1.25fr) minmax(0,1fr);gap:13px;display:grid}#project-form .field{gap:4px;min-width:0;display:grid}#project-form .field label,.history-filter>span{color:var(--quiet);font-size:13px;font-weight:600}#project-form .field input,select{background:var(--canvas);min-width:0;min-height:34px;color:inherit;font:inherit;border:1px solid #c9c7d7;border-radius:6px;padding:5px 9px}#project-form .field input,#project-form .field select{min-height:40px}.project-workers{grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:8px;margin:16px 0 18px;display:grid}.project-workers .text-button{min-height:27px;margin-right:-7px;padding:3px 7px;font-size:12px}.worker-picker,.permission-group{border:0;min-width:0;margin:0;padding:0}.worker-picker legend,.permission-group legend{padding:0;font-weight:650}#worker-agents{flex-wrap:wrap;gap:2px 15px;display:flex}.worker-option{overflow-wrap:anywhere;cursor:pointer;align-items:center;gap:6px;min-width:0;padding:4px 0;display:flex}.worker-option input,.permission-option input{width:16px;height:16px;accent-color:var(--accent);flex:none;margin:0}#worker-hint{font-size:12px}.permission-group>p{margin:1px 0 7px;font-size:12px}.permission-options{border:1px solid var(--line);border-radius:7px}.permission-option{cursor:pointer;grid-template-columns:auto minmax(0,1fr);align-items:center;gap:11px;padding:10px 13px;transition:background-color .15s;display:grid}.permission-option:first-child{border-radius:6px 6px 0 0}.permission-option:last-child{border-radius:0 0 6px 6px}.permission-option+.permission-option{border-top:1px solid var(--line)}.permission-option:hover:not(:has(input:disabled)){background:var(--surface)}.permission-option:has(input:disabled){cursor:default}.permission-option:has(input:checked){background:var(--accent-wash)}.permission-option strong,.permission-option small{display:block}.permission-option small{color:var(--quiet);font-size:12px}.setup-actions{border-top:1px solid var(--line);flex-wrap:wrap;justify-content:flex-end;gap:8px;margin-top:12px;padding:10px 0 2px;display:flex}.actions{margin-top:12px}.actions:not(:has(>:not([hidden]))){display:none}#project-form,#project-preview{animation:.16s ease-out both enter}#project-preview h2{margin-bottom:2px}#project-preview h2:focus{outline:none}#project-preview>p{margin-top:2px}.review-summary{background:var(--surface);border-radius:7px;grid-template-columns:repeat(2,minmax(0,1fr));gap:9px 14px;margin:10px 0;padding:9px 11px;display:grid}.review-summary dd{margin-top:1px;font-family:inherit;font-weight:650}.review-summary dd small{color:var(--quiet);font-size:12px;font-weight:400;display:block}.preview-files{border-top:1px solid var(--line);margin-top:12px}.preview-cleanup{margin-top:12px}.preview-cleanup .preview-files{margin-top:4px}.preview-file,.preview-files details{border-bottom:1px solid var(--line)}.preview-file,.preview-files summary{padding:7px 0}.preview-files summary{cursor:pointer;padding-right:19px;list-style:none;position:relative}.preview-files summary::-webkit-details-marker{display:none}.preview-files summary:after{content:"";border:solid var(--quiet);border-width:0 1px 1px 0;width:5px;height:5px;transition:transform .15s;position:absolute;top:15px;right:5px;transform:rotate(45deg)}.preview-files details[open] summary:after{transform:rotate(225deg)}.preview-files summary:hover{color:var(--accent)}.preview-files strong,.preview-files code{display:block}.preview-files code{overflow-wrap:anywhere;color:var(--quiet);font:12px/1.4 Consolas,monospace}#project-preview .task-text{max-height:175px;margin-bottom:8px}.preview-files details[open] .task-text{animation:.15s ease-out both enter}.history-tools{border-bottom:1px solid var(--line);grid-template-columns:minmax(0,1fr) minmax(0,1.6fr) auto;align-items:end;gap:9px;padding-bottom:14px;display:grid}.history-filter{gap:3px;min-width:0;display:grid}.history-filter select{width:100%;font-size:13px}#resume-claude-session{grid-column:2;justify-self:start;min-height:25px;margin:-4px 0 0 -7px;padding:3px 7px;font-size:12px}.workspace-grid{grid-template-columns:minmax(150px,1fr) minmax(0,1.8fr);gap:21px;margin-top:16px;display:grid}.workspace-grid:has(.detail-pane[hidden]){grid-template-columns:1fr}.detail-pane{border-left:1px solid var(--line);min-width:0;padding-left:20px}.empty-state{padding:10px 0}.load-more{margin-top:9px}.task-heading{margin-bottom:0}.task-readout{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 15px;margin:7px 0 15px;display:grid}dt{color:var(--quiet);font-size:12px}dd{overflow-wrap:anywhere;margin:3px 0 0;font-family:Consolas,monospace}#task-content h3{margin:12px 0 4px}.task-text{background:var(--surface);border:1px solid var(--line);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:5px;max-height:360px;margin:0;padding:8px 10px;font:12px/1.5 Consolas,monospace;overflow:auto}.task-result-list{overflow-wrap:anywhere;margin:0;padding-left:20px}.connection{border-bottom:1px solid var(--line);padding:10px 0 17px}.connection-status{font-size:16px}.readout{grid-template-columns:repeat(3,minmax(0,1fr));margin:0;display:grid}.readout>div{border-bottom:1px solid var(--line);padding:12px 10px 12px 0}.setting-row{border-block:1px solid var(--line);justify-content:space-between;align-items:center;gap:18px;padding:12px 0;display:flex}.setting-row label{font-weight:600}.setting-row p{font-size:13px}.setting-row select{min-width:144px;max-width:50%}.setting-row+h2{margin-top:25px}.settings-message{margin-top:10px}@keyframes enter{0%{opacity:0;transform:translateY(3px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%{opacity:.4}to{opacity:1}}@media (width<=740px){.app-shell{grid-template-columns:148px minmax(0,1fr)}.app-header{gap:19px;padding-inline:8px}.app-header .nav-button{gap:6px;padding-inline:6px}.nav-button svg{width:16px;height:16px}main{padding:23px 21px 25px}h1{font-size:29px}.section-heading{gap:10px}.history-tools{grid-template-columns:repeat(2,minmax(0,1fr))}.history-tools>button{justify-self:start}.workspace-grid{grid-template-columns:1fr;gap:14px}.detail-pane{border-left:0;border-top:1px solid var(--line);padding:12px 0 0}}@media (width<=680px){.project-setup-header{margin-bottom:13px}.project-fields,.review-summary{column-gap:9px}.setup-steps{gap:7px}.setup-steps li+li:before{width:8px;margin-right:2px}}@media (height<=560px){main:has(>#projects:not([hidden]) #project-setup:not([hidden])){padding-block:15px 12px}#close-project-setup{min-height:24px;margin-bottom:3px}.project-setup-header{margin-bottom:10px}.setup-titlebar h1{font-size:26px}.project-location{margin-top:8px;padding-block:6px}#project-form .field input,#project-form .field select{min-height:34px}.project-workers{margin:9px 0 11px}.permission-option{padding-block:4px}.review-summary{row-gap:5px;padding-block:7px}.preview-files{margin-top:8px}.preview-file,.preview-files summary{padding-block:5px}.preview-files code{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.setup-actions{margin-top:8px;padding-top:8px}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}}
|
|
1
|
+
:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;color:#25283a;--canvas:#fdfcfa;--rail:#efedf3;--surface:#f5f4f8;--quiet:#646879;--line:#dedde5;--accent:#4945a9;--accent-hover:#38358e;--accent-wash:#e8e5f7;--error:#a43236;background:#fdfcfa;height:100%;font:14px/1.5 Segoe UI,system-ui,sans-serif}*{box-sizing:border-box}body{height:100%;margin:0;overflow:hidden}.app-shell{grid-template:minmax(0,1fr)/188px minmax(0,1fr);height:100%;display:grid}[hidden]{display:none!important}.app-header{border-right:1px solid var(--line);background:var(--rail);flex-direction:column;grid-area:1/1;gap:25px;min-height:0;padding:25px 14px 16px;display:flex;overflow-y:auto}.wordmark{letter-spacing:-.025em;align-items:center;gap:9px;padding:0 6px;font-size:17px;font-weight:670;display:flex}.brand-icon{background:var(--accent);border-radius:8px;flex:none;width:30px;height:30px}.brand-icon path{fill:none;stroke:#fff;stroke-width:2px;stroke-linecap:square;stroke-linejoin:round}.app-header nav{gap:3px;display:grid}.app-header .nav-button{min-height:40px;color:var(--quiet);text-align:left;background:0 0;align-items:center;gap:9px;padding:7px 9px;font-weight:600;display:flex}.app-header .nav-button:not([aria-current=page]):hover:not(:disabled){color:#25283a;background:#e5e3ec}.app-header .nav-button[aria-current=page]{background:var(--accent-wash);color:var(--accent)}.nav-button svg,.add-button svg,.text-button svg,.empty-icon svg{fill:none;stroke:currentColor;stroke-width:1.6px;stroke-linecap:round;stroke-linejoin:round;flex:none;width:18px;height:18px}.header-status{border-top:1px solid var(--line);align-items:flex-start;gap:9px;margin-top:auto;padding:13px 6px 0;display:flex}.rail-status,.channel{font-size:12px;display:block}.rail-status{font-weight:600}.channel{color:var(--quiet)}.indicator{background:#85889a;border-radius:50%;flex:none;width:7px;height:7px;margin-top:6px;transition:background-color .16s}.indicator[data-status=ready]{background:var(--accent);box-shadow:0 0 0 3px var(--accent-wash)}.indicator[data-status=error]{background:var(--error)}.indicator[data-status=pending]{animation:1s infinite alternate pulse}main{scrollbar-gutter:stable;grid-area:1/2;min-width:0;min-height:0;padding:36px 37px 32px;overflow-y:auto}main>section{max-width:950px;margin-inline:auto;animation:.18s ease-out both enter}.section-heading{justify-content:space-between;align-items:center;gap:16px;margin-bottom:24px;display:flex}.section-heading>div{min-width:0}h1{letter-spacing:-.045em;margin:0;font-size:33px;font-weight:680;line-height:1.16}h2{margin:0 0 8px;font-size:16px;font-weight:650}h3{margin:0;font-size:14px;font-weight:650}p{color:var(--quiet);margin:5px 0 0}strong{font-weight:650}button{background:var(--accent);color:#fff;cursor:pointer;white-space:nowrap;border:1px solid #0000;border-radius:6px;min-height:35px;padding:6px 12px;font:600 13px/1.4 Segoe UI,system-ui,sans-serif;transition:background-color .15s,border-color .15s,color .15s}button:hover:not(:disabled){background:var(--accent-hover)}button.secondary{color:inherit;background:var(--canvas);border-color:var(--line)}button.secondary:hover:not(:disabled){background:var(--surface);border-color:#c9c7d7}button:disabled{opacity:.5;cursor:default}button:focus-visible,input:focus-visible,select:focus-visible,summary:focus-visible,pre:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.add-button,.text-button{align-items:center;gap:6px;display:inline-flex}button.text-button{color:var(--accent);background:0 0}button.text-button:hover:not(:disabled){background:var(--accent-wash)}#close-project-setup{min-height:29px;color:var(--quiet);margin:-5px 0 5px -7px;padding-inline:7px}#close-project-setup:hover:not(:disabled){color:var(--accent)}#close-project-setup svg{width:16px;height:16px}.list-heading{border-bottom:1px solid var(--line);color:var(--quiet);margin:0;padding:10px 0;font-size:13px}.entry-list{display:grid}.dispatch-entry{border:0;border-bottom:1px solid var(--line);text-align:left;white-space:normal;overflow-wrap:anywhere;min-width:0;color:inherit;background:0 0;border-radius:0;gap:3px;padding:10px 25px 10px 9px;display:grid;position:relative}.dispatch-entry:after{border:solid var(--quiet);content:"";border-width:1px 1px 0 0;width:5px;height:5px;position:absolute;top:50%;right:8px;transform:translateY(-50%)rotate(45deg)}.dispatch-entry:hover:not(:disabled),.dispatch-entry[aria-pressed=true]{color:inherit;background:var(--accent-wash)}.dispatch-entry span{color:var(--quiet);font-size:12px;font-weight:400}.project-row{border-bottom:1px solid var(--line);grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;display:grid}.project-row .dispatch-entry{border-bottom:0;padding:12px 30px 12px 9px}.project-empty{text-align:center;border-bottom:1px solid var(--line);align-content:center;justify-items:center;min-height:208px;padding:28px 18px;display:grid}.project-empty h3{margin-top:11px;font-size:16px}.project-empty p{max-width:36ch}.empty-icon{width:43px;height:43px;color:var(--accent);background:var(--accent-wash);border-radius:11px;place-items:center;display:grid}.empty-icon svg{width:23px;height:23px}.notice,.settings-message{min-height:1.5em;font-size:13px}.notice:empty,.settings-message:empty{display:none}.notice[data-error=true]{color:var(--error);overflow-wrap:anywhere}#projects-notice{margin:-10px 0 11px}#project-feedback{margin-top:14px}#project-feedback[data-complete=true]{border-left:2px solid var(--accent);background:var(--accent-wash);color:var(--accent-hover);padding:9px 12px}.setup-feedback{border-left:2px solid var(--accent);background:var(--surface);margin-bottom:16px;padding:9px 13px}.setup-feedback[data-error=true]{border-color:var(--error);background:#f9efef}.setup-feedback p{color:inherit;margin:0;font-weight:600}.setup-feedback summary{color:var(--quiet);cursor:pointer;margin-top:5px;font-size:13px}.setup-feedback code{color:var(--quiet);overflow-wrap:anywhere;margin-top:4px;display:block}.project-setup-header{margin-bottom:20px}.setup-titlebar{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:6px 15px;display:flex}.setup-steps{align-items:center;gap:11px;margin:0;padding:0;list-style:none;display:flex}.setup-steps li{color:var(--quiet);align-items:center;gap:5px;font-size:12px;display:inline-flex}.setup-steps li+li:before{content:"";border-top:1px solid var(--line);width:13px;margin-right:4px}.setup-steps li b{font-weight:600}.setup-steps li span{background:var(--surface);border-radius:50%;place-items:center;width:20px;height:20px;transition:background-color .15s;display:inline-grid}.setup-steps li[aria-current=step]{color:var(--accent)}.setup-steps li[aria-current=step] span{background:var(--accent);color:#fff}.project-location{background:var(--surface);border-radius:7px;grid-template-columns:22px minmax(0,1fr);align-items:center;gap:9px;margin-top:11px;padding:8px 11px;display:grid}.project-location svg{width:18px;height:18px;color:var(--accent);fill:none;stroke:currentColor;stroke-width:1.5px;stroke-linecap:round;stroke-linejoin:round}.project-location span{color:var(--quiet);font-size:11px;font-weight:650;display:block}.project-location code{overflow-wrap:anywhere;font:12px/1.45 Consolas,monospace;display:block}.project-fields{grid-template-columns:minmax(0,1.25fr) minmax(0,1fr);gap:13px;display:grid}#project-form .field{gap:4px;min-width:0;display:grid}#project-form .field label,.history-filter>span{color:var(--quiet);font-size:13px;font-weight:600}#project-form .field input,#scheduler-limit,select{background:var(--canvas);min-width:0;min-height:34px;color:inherit;font:inherit;border:1px solid #c9c7d7;border-radius:6px;padding:5px 9px}#project-form .field input,#project-form .field select{min-height:40px}.project-workers{grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:8px;margin:16px 0 18px;display:grid}.project-workers .text-button{min-height:27px;margin-right:-7px;padding:3px 7px;font-size:12px}.worker-picker,.permission-group{border:0;min-width:0;margin:0;padding:0}.worker-picker legend,.permission-group legend{padding:0;font-weight:650}#worker-agents{flex-wrap:wrap;gap:2px 15px;display:flex}.worker-option{overflow-wrap:anywhere;cursor:pointer;align-items:center;gap:6px;min-width:0;padding:4px 0;display:flex}.worker-option input,.permission-option input{width:16px;height:16px;accent-color:var(--accent);flex:none;margin:0}#worker-hint{font-size:12px}.permission-group>p{margin:1px 0 7px;font-size:12px}.permission-options{border:1px solid var(--line);border-radius:7px}.permission-option{cursor:pointer;grid-template-columns:auto minmax(0,1fr);align-items:center;gap:11px;padding:10px 13px;transition:background-color .15s;display:grid}.permission-option:first-child{border-radius:6px 6px 0 0}.permission-option:last-child{border-radius:0 0 6px 6px}.permission-option+.permission-option{border-top:1px solid var(--line)}.permission-option:hover:not(:has(input:disabled)){background:var(--surface)}.permission-option:has(input:disabled){cursor:default}.permission-option:has(input:checked){background:var(--accent-wash)}.permission-option strong,.permission-option small{display:block}.permission-option small{color:var(--quiet);font-size:12px}.setup-actions{border-top:1px solid var(--line);flex-wrap:wrap;justify-content:flex-end;gap:8px;margin-top:12px;padding:10px 0 2px;display:flex}.actions{margin-top:12px}.actions:not(:has(>:not([hidden]))){display:none}#project-form,#project-preview{animation:.16s ease-out both enter}#project-preview h2{margin-bottom:2px}#project-preview h2:focus{outline:none}#project-preview>p{margin-top:2px}.review-summary{background:var(--surface);border-radius:7px;grid-template-columns:repeat(2,minmax(0,1fr));gap:9px 14px;margin:10px 0;padding:9px 11px;display:grid}.review-summary dd{margin-top:1px;font-family:inherit;font-weight:650}.review-summary dd small{color:var(--quiet);font-size:12px;font-weight:400;display:block}.preview-files{border-top:1px solid var(--line);margin-top:12px}.preview-cleanup{margin-top:12px}.preview-cleanup .preview-files{margin-top:4px}.preview-file,.preview-files details{border-bottom:1px solid var(--line)}.preview-file,.preview-files summary{padding:7px 0}.preview-files summary{cursor:pointer;padding-right:19px;list-style:none;position:relative}.preview-files summary::-webkit-details-marker{display:none}.preview-files summary:after{content:"";border:solid var(--quiet);border-width:0 1px 1px 0;width:5px;height:5px;transition:transform .15s;position:absolute;top:15px;right:5px;transform:rotate(45deg)}.preview-files details[open] summary:after{transform:rotate(225deg)}.preview-files summary:hover{color:var(--accent)}.preview-files strong,.preview-files code{display:block}.preview-files code{overflow-wrap:anywhere;color:var(--quiet);font:12px/1.4 Consolas,monospace}#project-preview .task-text{max-height:175px;margin-bottom:8px}.preview-files details[open] .task-text{animation:.15s ease-out both enter}.history-tools{border-bottom:1px solid var(--line);grid-template-columns:minmax(0,1fr) minmax(0,1.6fr) auto;align-items:end;gap:9px;padding-bottom:14px;display:grid}.history-filter{gap:3px;min-width:0;display:grid}.history-filter select{width:100%;font-size:13px}#resume-claude-session{grid-column:2;justify-self:start;min-height:25px;margin:-4px 0 0 -7px;padding:3px 7px;font-size:12px}.workspace-grid{grid-template-columns:minmax(150px,1fr) minmax(0,1.8fr);gap:21px;margin-top:16px;display:grid}.workspace-grid:has(.detail-pane[hidden]){grid-template-columns:1fr}.detail-pane{border-left:1px solid var(--line);min-width:0;padding-left:20px}.empty-state{padding:10px 0}.load-more{margin-top:9px}.task-heading{margin-bottom:0}.task-readout{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 15px;margin:7px 0 15px;display:grid}dt{color:var(--quiet);font-size:12px}dd{overflow-wrap:anywhere;margin:3px 0 0;font-family:Consolas,monospace}#task-content h3{margin:12px 0 4px}.task-text{background:var(--surface);border:1px solid var(--line);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:5px;max-height:360px;margin:0;padding:8px 10px;font:12px/1.5 Consolas,monospace;overflow:auto}.task-result-list{overflow-wrap:anywhere;margin:0;padding-left:20px}.connection{border-bottom:1px solid var(--line);padding:10px 0 17px}.connection-status{font-size:16px}.readout{grid-template-columns:repeat(3,minmax(0,1fr));margin:0;display:grid}.readout>div{border-bottom:1px solid var(--line);padding:12px 10px 12px 0}.setting-row{border-block:1px solid var(--line);justify-content:space-between;align-items:center;gap:18px;padding:12px 0;display:flex}.setting-row+.setting-row{border-top:0}.setting-row label{font-weight:600}.setting-row p{font-size:13px}.setting-row select{min-width:144px;max-width:50%}.settings-message+h2{margin-top:25px}.scheduler-setting{flex-wrap:wrap}.scheduler-setting>div:first-child{flex:18rem}.setting-controls{align-items:center;gap:8px;display:flex}#scheduler-limit{width:5rem}.settings-message{margin-top:10px}@keyframes enter{0%{opacity:0;transform:translateY(3px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%{opacity:.4}to{opacity:1}}@media (width<=740px){.app-shell{grid-template-columns:148px minmax(0,1fr)}.app-header{gap:19px;padding-inline:8px}.app-header .nav-button{gap:6px;padding-inline:6px}.nav-button svg{width:16px;height:16px}main{padding:23px 21px 25px}h1{font-size:29px}.section-heading{gap:10px}.history-tools{grid-template-columns:repeat(2,minmax(0,1fr))}.history-tools>button{justify-self:start}.workspace-grid{grid-template-columns:1fr;gap:14px}.detail-pane{border-left:0;border-top:1px solid var(--line);padding:12px 0 0}}@media (width<=680px){.project-setup-header{margin-bottom:13px}.project-fields,.review-summary{column-gap:9px}.setup-steps{gap:7px}.setup-steps li+li:before{width:8px;margin-right:2px}}@media (height<=560px){main:has(>#projects:not([hidden]) #project-setup:not([hidden])){padding-block:15px 12px}#close-project-setup{min-height:24px;margin-bottom:3px}.project-setup-header{margin-bottom:10px}.setup-titlebar h1{font-size:26px}.project-location{margin-top:8px;padding-block:6px}#project-form .field input,#project-form .field select{min-height:34px}.project-workers{margin:9px 0 11px}.permission-option{padding-block:4px}.review-summary{row-gap:5px;padding-block:7px}.preview-files{margin-top:8px}.preview-file,.preview-files summary{padding-block:5px}.preview-files code{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.setup-actions{margin-top:8px;padding-top:8px}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e=`modulepreload`,t=function(e){return`/`+e},n={},r=function(e){return e.pathname.endsWith(`.css`)},i=function(e,t,n){if(t in e)return e[t];let r=n();if(!r){e[t]=void 0;return}let i=r.then(()=>{e[t]=void 0},n=>{throw e[t]=void 0,n});return e[t]=i,i},a=function(a,o,s){let c=Promise.resolve();if(o&&o.length>0){let a,l=document.querySelector(`meta[property=csp-nonce]`),u=l?.nonce||l?.getAttribute(`nonce`);function d(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function f(e){return import.meta.resolve?new URL(import.meta.resolve(e)):new URL(e,import.meta.url)}c=d(o.map(o=>{o=t(o,s);let c=f(o),l=r(c);return i(n,c.href,()=>{if(a===void 0){a={all:new Set,styles:new Set};let e=document.getElementsByTagName(`link`);for(let t=e.length-1;t>=0;t--){let n=e[t];a.all.add(n.href),n.rel===`stylesheet`&&a.styles.add(n.href)}}if((l?a.styles:a.all).has(c.href))return;let t=document.createElement(`link`);if(t.rel=l?`stylesheet`:e,l||(t.as=`script`),t.crossOrigin=``,t.href=c.href,u&&t.setAttribute(`nonce`,u),document.head.appendChild(t),l)return new Promise((e,n)=>{let r=i=>{t.removeEventListener(`load`,r),t.removeEventListener(`error`,r),i.type===`error`?n(Error(`Unable to preload CSS for ${c}`)):e(i)};t.addEventListener(`load`,r),t.addEventListener(`error`,r)})})}).filter(e=>e!==void 0))}function l(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return c.then(e=>{for(let t of e||[])t.status===`rejected`&&l(t.reason);return a().catch(l)})},o=`runspur.tui.token`,s=/^[0-9a-f]{64}$/i,c=`__TAURI_INTERNALS__`in window;function l(){let{hash:e,pathname:t,search:n}=window.location,r=new URLSearchParams(e.slice(1)).get(`token`);if(e&&window.history.replaceState(window.history.state,``,t+n),r!==null&&!s.test(r))return null;try{if(r!==null)window.sessionStorage.setItem(o,r);else{let e=window.sessionStorage.getItem(o);return e!==null&&s.test(e)?e:null}}catch{}return r}var u=c?null:l();async function d(e,t={}){if(c){let{invoke:n}=await a(async()=>{let{invoke:e}=await import(`./core-CwxXejkd.js`);return{invoke:e}},[]);return n(e,t)}if(u===null)throw Error("Open the Runspur browser panel with `runspur tui`.");let n=await fetch(`/api/${encodeURIComponent(e)}`,{method:`POST`,credentials:`omit`,redirect:`error`,headers:{Authorization:`Bearer ${u}`,"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok){let e=await n.json().catch(()=>null);throw Error(typeof e?.error==`string`?e.error:`Runspur returned HTTP ${n.status}.`)}return n.json()}function f(e){let t=document.getElementById(e);if(!t)throw Error(`Missing element: ${e}`);return t}function p(e,t,n){let r=document.createElement(e);return r.textContent=t,n&&(r.className=n),r}function m(e){return e.startsWith(`\\\\?\\UNC\\`)?`\\\\${e.slice(8)}`:e.startsWith(`\\\\?\\`)?e.slice(4):e}function ee(e,t,n){e.textContent=n?[t(n.message),n.detail].filter(Boolean).join(` `):``,e.dataset.error=String(!!n?.detail)}var h={queued:`queued`,starting:`startingTask`,running:`runningTask`,waiting_approval:`waitingApproval`,succeeded:`succeeded`,failed:`failed`,canceled:`canceled`,timed_out:`timedOut`},te={not_ready:`notReady`,pending:`pending`,sending:`sending`,accepted_by_transport:`acceptedByTransport`,acknowledged_by_parent:`acknowledgedByParent`,held:`held`,refused:`refused`,retry_wait:`retryWait`,orphaned:`orphaned`,uncertain:`uncertain`};function g(e){let t=f(`history`),n=f(`history-project`),r=f(`history-session`),i=f(`refresh-history`),a=f(`load-sessions`),o=f(`resume-claude-session`),s=f(`load-history`),l=f(`history-list`),u=f(`task-detail`),m=f(`task-content`),g=!1,_=!1,v=!1,y=!1,b=0,x=0,S=[],C=[],w=[],T=``,E=``,D=null,O=null,k=``,A,j,M;function N(){if(!c||!T||!E)return;let e=S.find(({config:e})=>e.project_id===T);if(e?.main_agent_kind!==`claude_print`)return;let t=C.find(({origin_id:e})=>e===E);if(t?.adapter_id===`claude_code_managed`&&t.transport!==`native_inbox`&&t.session_id)return{root:e.root,resume:t.session_id}}function P(e){return new Intl.DateTimeFormat(document.documentElement.lang,{dateStyle:`medium`,timeStyle:`short`}).format(e)}function F(){if(f(`history-inspector`).hidden=w.length===0&&!k,f(`task-empty`).hidden=!!k,u.hidden=!k,ee(f(`task-notice`),e,M),m.replaceChildren(),!A)return;let{task:t,prompt:n,origin_id:r,session_id:i,timeout_seconds:a}=A,o=p(`dl`,``,`task-readout`),s=(t,n)=>{if(n==null||n===``)return;let r=document.createElement(`div`);r.append(p(`dt`,e(t)),p(`dd`,String(n))),o.append(r)};if(s(`filterProject`,S.find(({config:e})=>e.project_id===t.project_id)?.config.name??t.project_id),s(`sessionId`,i),s(`originId`,r),s(`taskId`,t.task_id),s(`worker`,t.worker_profile_id),s(`execution`,e(h[t.execution_state])),s(`delivery`,e(te[t.delivery_state])),s(`queuedAt`,P(t.created_at_ms)),s(`startedAt`,t.started_at_ms==null?null:P(t.started_at_ms)),s(`finishedAt`,t.finished_at_ms==null?null:P(t.finished_at_ms)),s(`timeout`,new Intl.NumberFormat(document.documentElement.lang,{style:`unit`,unit:`second`}).format(a)),s(`deliveryId`,t.delivery_id),s(`parentTurnId`,t.parent_turn_id),s(`deliveryError`,t.delivery_error),t.result&&(s(`exitCode`,t.result.exit_code),s(`errorClass`,t.result.error_class)),m.append(o,p(`h3`,e(`prompt`)),p(`pre`,n,`task-text`)),m.append(p(`h3`,e(`result`))),!t.result)m.append(p(`p`,e(`noResult`)));else{m.append(p(`pre`,t.result.summary,`task-text`));for(let[n,r]of[[`verification`,t.result.verification.map(({description:e,outcome:t})=>`${e} · ${t}`)],[`artifacts`,t.result.artifact_refs]]){if(r.length===0)continue;let t=p(`ul`,``,`task-result-list`);t.append(...r.map(e=>p(`li`,e))),m.append(p(`h3`,e(n)),t)}}}function I(){n.replaceChildren(new Option(e(`allProjects`),``),...S.map(({config:e})=>new Option(e.name,e.project_id))),n.value=T;let t=T?C.length||E?`allSessions`:`noSessions`:`chooseProjectForSessions`;r.replaceChildren(new Option(e(t),``),...C.map(({origin_id:e,adapter_id:t,session_id:n,task_count:r,transport:i})=>new Option(`${n} · ${i===`native_inbox`?`Claude Code`:t} · ${r}`,e))),E&&!C.some(({origin_id:e})=>e===E)&&r.add(new Option(E,E)),r.value=E,n.disabled=i.disabled=!g||_,r.disabled=!g||_||!T||r.options.length<2,a.hidden=D==null,s.hidden=O==null,a.disabled=s.disabled=!g||_,o.hidden=!N(),o.disabled=!g||_||v,ee(f(`history-notice`),e,g?j:{message:`schedulerNeeded`}),l.replaceChildren(...w.map(t=>{let n=p(`button`,``,`entry-button dispatch-entry`);return n.type=`button`,n.disabled=_,n.dataset.taskId=t.task_id,n.setAttribute(`aria-pressed`,String(t.task_id===k)),n.append(p(`strong`,t.worker_profile_id),p(`span`,`${e(h[t.execution_state])} · ${e(te[t.delivery_state])}`),p(`span`,P(t.created_at_ms))),n.addEventListener(`click`,()=>{L(t.task_id)}),n})),g&&!_&&!j&&w.length===0&&l.append(p(`p`,e(`noDispatches`),`empty-state`)),F()}async function L(e){let t=++x;k=e,A=void 0,M={message:`loading`};for(let t of l.querySelectorAll(`button`))t.setAttribute(`aria-pressed`,String(t.dataset.taskId===e));F();try{let n=await d(`query_task_detail`,{taskId:e});if(t!==x)return;A=n,M=void 0}catch(e){if(t!==x)return;M={message:`taskError`,detail:String(e)}}F()}function R(){x++,k=``,A=void 0,M=void 0}async function z(t){if(!g||_&&t!==`project`)return;let n=++b;_=!0,j={message:`loading`},(t===`project`||t===`session`)&&(w=[],O=null,R()),t===`project`&&(C=[],D=null),I();try{if(t===`refresh`){let e=await d(`projects_list`);if(n!==b)return;S=e}if(T&&(t===`refresh`||t===`project`||t===`olderSessions`)){let r=t===`olderSessions`,i=await d(`query_sessions`,{projectId:T,before:r?D:null,limit:25});if(n!==b)return;if(i.items.some(({origin_id:e})=>!e))throw Error(e(`originServiceUpgrade`));C=r?C.concat(i.items):i.items,D=i.next_cursor}if(t!==`olderSessions`){let e=t===`olderTasks`,r=await d(`query_task_history`,{projectId:T||null,originId:E||null,before:e?O:null,limit:25});if(n!==b)return;w=e?w.concat(r.items):r.items,O=r.next_cursor}j=void 0,y=!0}catch(e){if(n!==b)return;j={message:`historyError`,detail:String(e)}}finally{n===b&&(_=!1,I())}!j&&t===`refresh`&&k&&L(k)}function B(e){T=e,E=``,z(`project`)}n.addEventListener(`change`,()=>B(n.value)),r.addEventListener(`change`,()=>{E=r.value,z(`session`)}),i.addEventListener(`click`,()=>{z(`refresh`)}),a.addEventListener(`click`,()=>{z(`olderSessions`)}),s.addEventListener(`click`,()=>{z(`olderTasks`)}),o.addEventListener(`click`,async()=>{let e=N();if(e&&g&&!_&&!v){v=!0,j=void 0,I();try{await d(`launch_claude_project`,e)}catch(e){j={message:`resumeClaudeError`,detail:String(e)}}finally{v=!1,I()}}});function V(){y||z(`refresh`)}return{render:I,open:V,selectProject:B,setProjects(e){S=e,I()},setReady(e){g!==e&&(g=e,g||(b++,_=y=!1,S=[],C=[],w=[],T=E=``,D=O=null,R()),I(),t.hidden||V())}}}var _={en:{overview:`Overview`,settings:`Settings`,application:`Application`,language:`Language`,languageHint:`Choose the language used by Runspur.`,systemLanguage:`Use system language`,localScheduler:`Local scheduler`,schedulerLimit:`Maximum concurrent tasks`,schedulerLimitHint:`All projects share this limit. Extra tasks wait in the queue. Lowering the limit lets running tasks finish.`,saveSchedulerLimit:`Save`,workerAccess:`Child Agent permissions`,schedulerWorkerAccessHint:`Full access enables native shell and file tools, including edits to the live project. Follow main Agent uses verified full or read-only access and falls back to project permissions for other modes.`,workerAccessProject:`Use project permissions`,workerAccessFull:`Full access`,workerAccessFollowMain:`Follow main Agent`,schedulerSettingsOffline:`Start the scheduler to change these settings.`,schedulerSettingsReadError:`Could not read the scheduler settings.`,schedulerSettingsWriteError:`Could not save the scheduler setting.`,schedulerLimitInvalid:`Enter a whole number from 1 to 64.`,refresh:`Refresh`,serviceVersion:`Service version`,protocol:`Protocol`,workers:`Active workers`,development:`Development`,checking:`Checking connection`,starting:`Starting scheduler`,stopping:`Stopping scheduler`,running:`Scheduler running`,runningDetail:`The local scheduler is responding.`,offline:`Scheduler offline`,offlineDetail:`Start the local Runspur scheduler to continue.`,railReady:`Scheduler ready`,railOffline:`Scheduler offline`,railError:`Connection error`,railPending:`Connecting`,connectionError:`Connection error`,technicalDetails:`Technical details`,start:`Start scheduler`,stop:`Stop scheduler`,retry:`Retry startup`,saving:`Saving…`,saved:`Saved.`,preferencesReadError:`Could not read preferences.`,preferencesWriteError:`Could not save preferences.`,projects:`Projects`,projectsIntro:`Manage project integrations and dispatch history.`,chooseProject:`Add project`,configureProject:`Edit configuration`,projectEditTitle:`Edit project configuration`,projectAlreadyConnected:`This folder is already connected. Saving will update the existing project.`,registeredProjects:`Registered projects`,noProjects:`No projects yet`,projectEmpty:`Choose a folder to configure its agents and track its dispatches here.`,backToProjects:`Back to projects`,projectSetup:`Setup`,projectConfiguration:`Configure`,projectReview:`Review`,editProject:`Edit configuration`,projectFolder:`Project folder`,projectName:`Project name`,parentAgent:`Main agent`,workerAgents:`Worker agents`,workerWritePolicy:`Worker file access`,workerAccessHint:`Worker changes are collected for review.`,workersReadOnlyHint:`The selected workers are read-only. Project write policies apply to workers that support editing.`,codexReadOnlyHint:`Codex workers run in read-only mode under every project policy.`,workerReadOnly:`Read only`,workerReadOnlyHint:`Inspect project files and report findings.`,workerScopedWrite:`Specified files`,workerScopedWriteHint:`Edit task-listed files in an isolated workspace.`,workerProjectWrite:`Project-wide text edits`,workerProjectWriteHint:`Edit text across an isolated project workspace.`,integrationScope:`Confirm to save the project manifest, Skill and main agent configuration.`,previewProject:`Preview integration`,projectManifest:`Project manifest`,projectSkill:`Skill`,projectMcp:`Runspur MCP entry`,projectClaudeHook:`Claude Code project hook`,projectDeveloperInstructions:`Runspur developer instructions`,projectCleanup:`Previous integration entries to remove`,applyProject:`Confirm and connect`,saveProjectChanges:`Save changes`,refreshAgents:`Refresh agents`,noWorkers:`No supported worker detected. Install a worker and refresh agents.`,chooseWorker:`Select at least one available worker agent.`,missingWorker:`Unavailable`,projectSaved:`Project saved. MCP and Skill files installed. Reload the project in the main agent host to use them.`,projectUpdated:`Project configuration updated. Open a new conversation to use the updated Skill and tools.`,projectSavedNativeClaude:`Project saved. Run claude in this folder to start a new Runspur-enabled conversation.`,projectLoadError:`Could not load project configuration.`,projectPreviewError:`Could not prepare the project integration preview.`,projectDifferentState:`This project is connected to a different Runspur data directory. Open it with the Runspur instance that originally connected it.`,projectSaveError:`Could not save the project integration.`,projectBrowseError:`Could not open the folder picker.`,agentLoadError:`Could not detect agents.`,projectsLoadError:`Could not load registered projects.`,loading:`Loading…`,schedulerNeeded:`Start the local scheduler in Overview to continue.`,history:`Dispatch history`,historyIntro:`Inspect each dispatch, its execution, and delivery back to the main agent.`,filterProject:`Project`,filterSession:`Session`,allProjects:`All projects`,allSessions:`All sessions`,chooseProjectForSessions:`Select a project to see its sessions`,noSessions:`No sessions with dispatches`,olderSessions:`Load older sessions`,resumeClaudeSession:`Resume Claude session`,resumeClaudeError:`Could not resume the selected Claude session.`,dispatches:`Dispatches`,noDispatches:`No dispatches match this view.`,olderDispatches:`Load older dispatches`,taskEmpty:`Select a dispatch to see its prompt, result, and delivery details.`,dispatchDetails:`Dispatch details`,cancelTask:`Cancel dispatch`,cancelPending:`Cancellation requested.`,cancelError:`Could not cancel this dispatch.`,historyError:`Could not load dispatch history.`,taskError:`Could not load this dispatch.`,execution:`Execution`,delivery:`Delivery`,taskId:`Dispatch ID`,deliveryId:`Delivery ID`,sessionId:`Origin session`,originId:`Runspur origin ID`,originServiceUpgrade:`Update the running Runspur service to filter by conversation.`,parentTurnId:`Main agent turn`,worker:`Worker`,queuedAt:`Dispatched`,startedAt:`Started`,finishedAt:`Finished`,duration:`Duration`,timeout:`Time limit`,prompt:`Prompt`,result:`Result`,noResult:`Result pending.`,exitCode:`Exit code`,errorClass:`Error category`,verification:`Verification`,artifacts:`Artifacts`,deliveryError:`Delivery details`,queued:`Queued`,startingTask:`Starting`,runningTask:`Running`,waitingApproval:`Waiting for approval`,succeeded:`Succeeded`,failed:`Failed`,canceled:`Canceled`,timedOut:`Timed out`,notReady:`Not ready`,pending:`Pending`,sending:`Sending`,acceptedByTransport:`Received by host`,acknowledgedByParent:`Acknowledged by main agent`,held:`On hold`,refused:`Refused`,retryWait:`Waiting to retry`,orphaned:`Origin unavailable`,uncertain:`Uncertain`},"zh-CN":{overview:`概览`,settings:`设置`,application:`应用`,language:`语言`,languageHint:`选择 Runspur 使用的界面语言。`,systemLanguage:`跟随系统`,localScheduler:`本地调度器`,schedulerLimit:`最大并发任务数`,schedulerLimitHint:`所有项目共享此上限。超出的任务会排队。调低上限后,已运行的任务会继续完成。`,saveSchedulerLimit:`保存`,workerAccess:`子 Agent 权限`,schedulerWorkerAccessHint:`完整权限启用原生 Shell 和文件工具,可以直接修改项目。跟随主 Agent 时会采用已确认的完整权限或只读模式,其他情况按项目权限运行。`,workerAccessProject:`按项目权限`,workerAccessFull:`完整权限`,workerAccessFollowMain:`跟随主 Agent`,schedulerSettingsOffline:`启动调度器后可修改这些设置。`,schedulerSettingsReadError:`无法读取调度器设置。`,schedulerSettingsWriteError:`无法保存调度器设置。`,schedulerLimitInvalid:`请输入 1 到 64 之间的整数。`,refresh:`刷新`,serviceVersion:`服务版本`,protocol:`协议版本`,workers:`运行中的子 Agent`,development:`开发版`,checking:`正在检查连接`,starting:`正在启动调度器`,stopping:`正在停止调度器`,running:`调度器正在运行`,runningDetail:`本地调度器已响应。`,offline:`调度器未运行`,offlineDetail:`启动本地 Runspur 调度器后可继续。`,railReady:`调度器已就绪`,railOffline:`调度器未运行`,railError:`连接出错`,railPending:`正在连接`,connectionError:`连接出错`,technicalDetails:`技术详情`,start:`启动调度器`,stop:`停止调度器`,retry:`重试启动`,saving:`正在保存…`,saved:`已保存。`,preferencesReadError:`无法读取设置。`,preferencesWriteError:`无法保存设置。`,projects:`项目`,projectsIntro:`管理项目接入和调度历史。`,chooseProject:`添加项目`,configureProject:`编辑配置`,projectEditTitle:`编辑项目配置`,projectAlreadyConnected:`此目录已接入。保存后将更新现有项目的配置。`,registeredProjects:`已登记项目`,noProjects:`暂无项目`,projectEmpty:`选择项目目录,配置 Agent 后即可在这里查看调度记录。`,backToProjects:`返回项目`,projectSetup:`接入步骤`,projectConfiguration:`配置`,projectReview:`确认`,editProject:`返回修改`,projectFolder:`项目目录`,projectName:`项目名称`,parentAgent:`主 Agent`,workerAgents:`子 Agent`,workerWritePolicy:`子 Agent 文件权限`,workerAccessHint:`子 Agent 的改动会保留供审查。`,workersReadOnlyHint:`所选子 Agent 均为只读。项目写入设置适用于支持编辑的子 Agent。`,codexReadOnlyHint:`无论项目采用哪种写入设置,Codex 子 Agent 都以只读方式运行。`,workerReadOnly:`只读`,workerReadOnlyHint:`查看项目文件并汇报结果。`,workerScopedWrite:`指定文件写入`,workerScopedWriteHint:`在隔离工作区修改每次任务指定的文件。`,workerProjectWrite:`项目内写入`,workerProjectWriteHint:`在隔离的项目工作区修改文本文件。`,integrationScope:`确认后将保存项目清单、Skill 和主 Agent 配置。`,previewProject:`预览接入配置`,projectManifest:`项目清单`,projectSkill:`Skill`,projectMcp:`Runspur MCP 条目`,projectClaudeHook:`Claude Code 项目 Hook`,projectDeveloperInstructions:`Runspur 开发者指令`,projectCleanup:`将移除的旧接入条目`,applyProject:`确认接入`,saveProjectChanges:`保存修改`,refreshAgents:`刷新 Agent`,noWorkers:`暂未检测到可用的子 Agent。安装后可重新检测。`,chooseWorker:`请至少选择一个可用的子 Agent。`,missingWorker:`不可用`,projectSaved:`项目已保存,MCP 和 Skill 已安装。请在主 Agent 宿主中重新加载此项目。`,projectUpdated:`项目配置已更新。请在主 Agent 中开新会话使用更新后的 Skill 和工具。`,projectSavedNativeClaude:`项目配置已保存。在此目录运行 claude,即可开启支持 Runspur 的新会话。`,projectLoadError:`无法读取项目配置。`,projectPreviewError:`无法生成项目接入预览。`,projectDifferentState:`这个项目已接入另一套 Runspur 数据。请用原先接入项目的 Runspur 实例打开。`,projectSaveError:`无法保存项目集成。`,projectBrowseError:`无法打开目录选择器。`,agentLoadError:`无法检测 Agent。`,projectsLoadError:`无法读取已登记的项目。`,loading:`正在加载…`,schedulerNeeded:`请先在概览中启动本地调度器。`,history:`调度历史`,historyIntro:`查看每次调度的执行过程与回传状态。`,filterProject:`项目`,filterSession:`会话`,allProjects:`所有项目`,allSessions:`所有会话`,chooseProjectForSessions:`选择项目后可查看会话`,noSessions:`暂无派发记录的会话`,olderSessions:`加载更早的会话`,dispatches:`调度记录`,noDispatches:`当前视图没有调度记录。`,olderDispatches:`加载更早的记录`,taskEmpty:`选择一条调度记录,查看提示词、结果和回传详情。`,dispatchDetails:`调度详情`,cancelTask:`取消调度`,cancelPending:`已请求取消。`,cancelError:`无法取消此调度。`,resumeClaudeSession:`继续 Claude 会话`,resumeClaudeError:`无法继续选中的 Claude 会话。`,historyError:`无法读取调度历史。`,taskError:`无法读取此调度。`,execution:`执行状态`,delivery:`回传状态`,taskId:`调度 ID`,deliveryId:`回传 ID`,sessionId:`发起会话`,originId:`Runspur 原会话 ID`,originServiceUpgrade:`请更新正在运行的 Runspur 服务以按会话筛选。`,parentTurnId:`主 Agent 回合`,worker:`子 Agent`,queuedAt:`派发时间`,startedAt:`开始时间`,finishedAt:`结束时间`,duration:`耗时`,timeout:`超时限制`,prompt:`提示词`,result:`结果`,noResult:`正在等待结果。`,exitCode:`退出码`,errorClass:`错误类别`,verification:`验收信息`,artifacts:`产物`,deliveryError:`回传详情`,queued:`排队中`,startingTask:`启动中`,runningTask:`运行中`,waitingApproval:`等待授权`,succeeded:`成功`,failed:`失败`,canceled:`已取消`,timedOut:`超时`,notReady:`尚未就绪`,pending:`等待中`,sending:`回传中`,acceptedByTransport:`宿主已接收`,acknowledgedByParent:`主 Agent 已确认`,held:`暂缓`,refused:`已拒绝`,retryWait:`等待重试`,orphaned:`发起会话不可用`,uncertain:`状态不确定`}};function v(e,t){return e===`system`?t.toLowerCase().split(`-`)[0]===`zh`?`zh-CN`:`en`:e}var y={codex_desktop:`codex`,codex_exec:`codex`,claude_print:`claude`},b={read_only:{label:`workerReadOnly`,detail:`workerReadOnlyHint`},workspace_write:{label:`workerScopedWrite`,detail:`workerScopedWriteHint`},project_write:{label:`workerProjectWrite`,detail:`workerProjectWriteHint`}};function x(e){return e.allow_project_write?`project_write`:e.allow_workspace_write?`workspace_write`:`read_only`}var S={skill:`projectSkill`,runspur_scheduler:`projectMcp`,developer_instructions:`projectDeveloperInstructions`,claude_origin_hook:`projectClaudeHook`};function C(e,t){let n=t instanceof Error?t.message:String(t),r=`[runspur_state_conflict]`;return n.includes(r)?{message:`projectDifferentState`,detail:n.replace(r,``).trim()}:{message:e,detail:n}}function w(e,t,n){let r=f(`projects`),i=f(`choose-project`),a=f(`close-project-setup`),o=f(`project-list`),s=f(`project-form`),c=f(`project-root`),l=f(`project-name`),u=f(`parent-agent`),h=f(`worker-agents`),te=Array.from(f(`worker-file-access`).querySelectorAll(`input`)),g=f(`preview-project`),_=f(`project-preview`),v=f(`preview-hook`),w=f(`edit-project`),T=f(`apply-project`),E=f(`refresh-agents`),D=f(`project-setup-feedback`),O=f(`project-setup-message`),k=f(`project-setup-details`),A=f(`project-setup-error`),j=f(`project-feedback`),M=[],N=[],P,F,I=!1,L=!1,R=!1,z,B,V=()=>N.filter(e=>e.parent);function H(e,t){let n=N.find(e=>e.profile_id===t);return n!==void 0&&y[e.kind]===y[n.kind]}let U=()=>N.filter(e=>e.worker&&!H(e,P?.main_agent_profile_id));function W(e,t){let n=[[`codex_desktop`,`codex-desktop`,`Codex`],[`codex_exec`,`codex-cli`,`Codex`],[`claude_print`,`claude-cli`,`Claude Code`]].find(([n,r])=>t===void 0?r===e:n===t);if(!n)return e;let[,r,i]=n;return e===r?i:`${i} · ${e}`}function G(e){return W(e,N.find(t=>t.profile_id===e)?.kind)}function K(){i.disabled=L||!I,a.disabled=w.disabled=L,E.disabled=L||!I,l.disabled=u.disabled=!I||L;let t=P?.worker_profile_ids.map(e=>N.find(t=>t.profile_id===e)?.kind)??[],n=t.length>0&&t.every(e=>e===`codex_exec`);P&&n&&(P.allow_workspace_write=!1,P.allow_project_write=!1),te.forEach(e=>{e.checked=P?e.value===x(P):!1,e.disabled=!I||L||n&&e.value!==`read_only`});let r=t.includes(`codex_exec`)?`codexReadOnlyHint`:`workerAccessHint`,o=e(n?`workersReadOnlyHint`:r),s=f(`worker-access-hint`);s.textContent!==o&&(s.textContent=o),h.querySelectorAll(`input`).forEach(e=>{e.disabled=!I||L});let c=P&&P.name.trim()&&P.worker_profile_ids.length>0&&V().some(e=>e.profile_id===P?.main_agent_profile_id)&&P.worker_profile_ids.every(e=>U().some(t=>t.profile_id===e));f(`worker-hint`).hidden=!P||U().length===0||P.worker_profile_ids.length>0,g.disabled=L||!I||!c,T.disabled=g.disabled||!F}function q(){s.hidden=!P||!!F,_.hidden=!F,v.hidden=!F?.hook_path,v.hidden&&(v.open=!1),F?(f(`configure-step`).removeAttribute(`aria-current`),f(`review-step`).setAttribute(`aria-current`,`step`)):(f(`configure-step`).setAttribute(`aria-current`,`step`),f(`review-step`).removeAttribute(`aria-current`),f(`preview-skill`).open=!1,f(`preview-mcp`).open=!1);let t=F?b[x(F)]:void 0;f(`preview-name`).textContent=F&&P?P.name.trim():``,f(`preview-parent`).textContent=F&&P?G(P.main_agent_profile_id):``,f(`preview-workers`).textContent=F&&P?P.worker_profile_ids.map(G).join(`, `):``;for(let[e,t]of[[`preview-manifest`,F?.manifest_path],[`preview-skill-path`,F?.skill_path],[`preview-mcp-path`,F?.mcp_path],[`preview-hook-path`,F?.hook_path]]){let n=t?m(t):``,r=f(e);r.textContent=r.title=n}f(`preview-write-policy`).textContent=t?e(t.label):``,f(`preview-write-detail`).textContent=t?e(t.detail):``,f(`preview-skill-content`).textContent=F?.skill_content??``,f(`preview-mcp-content`).textContent=F?.mcp_content??``,f(`preview-hook-content`).textContent=F?.hook_content??``;let n=F?.cleanup??[];f(`preview-cleanup`).hidden=n.length===0,f(`preview-cleanup-items`).replaceChildren(...n.map(({path:t,entry:n})=>{let r=p(`div`,``,`preview-file`),i=S[n],a=p(`code`,m(t));return a.title=a.textContent,r.append(p(`strong`,i?e(i):n),a),r}))}function J(){F=void 0,B=void 0,q(),Y(),K()}function Y(){let t=P?I?B:{message:`schedulerNeeded`}:void 0,n=t?.detail??``;A.textContent!==n&&(k.open=!1),D.hidden=!t,D.dataset.error=String(!!n),O.textContent=t?e(t.message):``,k.hidden=!n,A.textContent=n,j.dataset.complete=String(!P&&(B?.message===`projectSaved`||B?.message===`projectUpdated`||B?.message===`projectSavedNativeClaude`)),ee(j,e,P?void 0:B)}function X(){if(o.replaceChildren(...M.map(t=>{let r=p(`div`,``,`project-row`),i=p(`button`,``,`dispatch-entry`);i.type=`button`,i.disabled=L||!I,i.append(p(`strong`,t.config.name),p(`span`,m(t.root))),i.addEventListener(`click`,()=>n(t.config.project_id));let a=p(`button`,e(`configureProject`),`text-button`);return a.type=`button`,a.disabled=L||!I,a.setAttribute(`aria-label`,`${e(`configureProject`)} · ${m(t.root)}`),a.addEventListener(`click`,()=>{Q(t.root)}),r.append(i,a),r})),f(`project-home`).hidden=!!P,f(`project-setup`).hidden=!P,f(`project-empty`).hidden=!I||L||!!z||M.length>0,P){f(`project-setup-title`).textContent=e(P.registered?`projectEditTitle`:`chooseProject`),f(`project-registered-note`).hidden=!P.registered,T.textContent=e(P.registered?`saveProjectChanges`:`applyProject`),c.textContent=m(P.root),l.value=P.name;let t=V(),n=P.main_agent_profile_id,r=t.map(({profile_id:e,kind:t})=>new Option(W(e,t),e));n&&!t.some(e=>e.profile_id===n)&&r.unshift(new Option(`${W(n)} · ${e(`missingWorker`)}`,n)),u.replaceChildren(...r),u.value=n;let i=U(),a=P.worker_profile_ids.filter(e=>!i.some(t=>t.profile_id===e)),o=i.map(({profile_id:e,kind:t})=>({id:e,caption:W(e,t)}));for(let t of a)o.push({id:t,caption:`${W(t)} · ${e(`missingWorker`)}`});h.replaceChildren(...o.map(({id:e,caption:t})=>{let n=p(`label`,``,`worker-option`),r=document.createElement(`input`);return r.type=`checkbox`,r.value=e,r.checked=P?.worker_profile_ids.includes(e)??!1,r.addEventListener(`change`,()=>{P&&(P.worker_profile_ids=Array.from(h.querySelectorAll(`input:checked`),e=>e.value),J())}),n.append(r,p(`span`,t)),n})),i.length===0&&h.append(p(`p`,e(`noWorkers`),`empty-state`))}ee(f(`projects-notice`),e,I?z:{message:`schedulerNeeded`}),Y(),q(),K()}async function Z(){if(!(!I||L||R)){L=!0,z={message:`loading`},X();try{M=await d(`projects_list`),t(M),z=void 0,R=!0}catch(e){z={message:`projectsLoadError`,detail:String(e)}}finally{L=!1,X()}}}async function ne(){try{if(N=await d(`agent_profiles`),P){P.main_agent_profile_id||(P.main_agent_profile_id=V()[0]?.profile_id??``);let e=U();P.worker_profile_ids=P.worker_profile_ids.filter(t=>e.some(e=>e.profile_id===t))}}catch(e){B={message:`agentLoadError`,detail:String(e)}}}async function Q(e){if(L||!I)return;L=!0,B=void 0,z={message:`loading`},X();let t=!e;try{let n=e??await d(`choose_project_folder`);t=!1,n&&(P=await d(`project_read`,{root:n}),F=void 0,N=[],await ne()),z=void 0}catch(e){z={message:t?`projectBrowseError`:`projectLoadError`,detail:String(e)}}finally{L=!1,X(),P&&!z&&l.focus()}}i.addEventListener(`click`,()=>{Q()}),a.addEventListener(`click`,()=>{P=void 0,F=void 0,B=void 0,X(),i.focus()}),w.addEventListener(`click`,()=>{J(),l.focus()}),l.addEventListener(`input`,()=>{P&&(P.name=l.value),J()}),u.addEventListener(`change`,()=>{if(!P)return;let e=u.value;P.main_agent_profile_id=e,P.worker_profile_ids=P.worker_profile_ids.filter(t=>{let n=N.find(e=>e.profile_id===t);return!n||!H(n,e)}),F=void 0,B=void 0,X()});for(let e of te)e.addEventListener(`change`,()=>{P&&e.checked&&(P.allow_workspace_write=e.value!==`read_only`,P.allow_project_write=e.value===`project_write`,J())});return E.addEventListener(`click`,async()=>{!L&&I&&(L=!0,F=void 0,B={message:`loading`},X(),await ne(),B?.message===`loading`&&(B=void 0),L=!1,X())}),s.addEventListener(`submit`,async e=>{if(e.preventDefault(),P&&!g.disabled){L=!0,F=void 0,B={message:`loading`},X();try{let e=await d(`project_preview`,{input:{...P,name:P.name.trim()}});I&&(F=e),B=void 0}catch(e){B=C(`projectPreviewError`,e)}finally{L=!1,X(),F?f(`preview-title`).focus():B?.detail&&D.focus()}}}),T.addEventListener(`click`,async()=>{if(!F||!P||T.disabled)return;let e=F.token,n=!!F.hook_path,r=P.registered;F=void 0,L=!0,B={message:`saving`},X();try{let i=await d(`project_apply`,{token:e});i.main_agent_kind=N.find(e=>e.profile_id===i.config.main_agent_profile_id)?.kind,M=[...M.filter(e=>e.config.project_id!==i.config.project_id),i],M.sort((e,t)=>e.config.name.localeCompare(t.config.name)),t(M),P=void 0,B={message:n?`projectSavedNativeClaude`:r?`projectUpdated`:`projectSaved`}}catch(e){B=C(`projectSaveError`,e)}finally{L=!1,X(),P?B?.detail&&D.focus():i.focus()}}),{render:X,refresh:Z,setReady(e){I!==e&&(I=e,I||(R=!1,F=void 0),X(),r.hidden||Z())}}}var T=f(`status`),E=f(`detail`),D=f(`indicator`),O=f(`channel`),k=f(`refresh`),A=f(`start`),j=f(`stop`),M=f(`language-setting`),N=f(`settings-message`),P=f(`scheduler-settings-form`),F=f(`scheduler-limit`),I=f(`scheduler-limit-save`),L=f(`worker-access`),R=f(`scheduler-settings-message`),z,B=v(`system`,navigator.language),V,H,U,W,G,K=!1,q,J=e=>_[B][e],Y=g(J),X=w(J,Y.setProjects,e=>{Y.selectProject(e),ie(`history`)});function Z(e){return`${J(`technicalDetails`)} — ${e}`}function ne(){let e=V?.status===`ready`?V.health:void 0,t=V?.channel===`development`;O.hidden=!t,O.textContent=t?J(`development`):``,f(`version`).textContent=e?.version??`—`,f(`protocol`).textContent=e?.protocol_version.toString()??`—`,f(`workers`).textContent=e?.active_workers.toString()??`—`;let n=U??(V?.status===`error`?V.detail:void 0),r=H?`pending`:n?`error`:V?.status??`pending`;D.dataset.status=r;let i={ready:`railReady`,offline:`railOffline`,error:`railError`,pending:`railPending`};switch(f(`rail-status`).textContent=J(i[r]),A.hidden=r===`ready`||r===`pending`,A.textContent=J(r===`error`?`retry`:`start`),j.hidden=c||r!==`ready`,r){case`pending`:T.textContent=J(H===`start_service`?`starting`:H===`stop_service`?`stopping`:`checking`),E.textContent=``;break;case`ready`:T.textContent=J(`running`),E.textContent=J(`runningDetail`);break;case`offline`:T.textContent=J(`offline`),E.textContent=J(`offlineDetail`);break;case`error`:T.textContent=J(`connectionError`),E.textContent=n?Z(n):``}}async function Q(e){H=e,k.disabled=A.disabled=j.disabled=!0,ne(),$();try{V=await d(e),U=void 0}catch(e){V=void 0,U=String(e)}finally{H=void 0,k.disabled=A.disabled=j.disabled=!1,ne();let t=V?.status===`ready`;Y.setReady(t),X.setReady(t),t||le(void 0),$(),t&&(e===`start_service`||!f(`settings`).hidden)&&ue()}}k.addEventListener(`click`,()=>{Q(`service_status`)}),A.addEventListener(`click`,()=>{Q(`start_service`)}),c||j.addEventListener(`click`,()=>{Q(`stop_service`)});var re=[`projects`,`history`,`overview`,`settings`];function ie(e){for(let t of re){f(t).hidden=t!==e;let n=f(`${t}-nav`);t===e?n.setAttribute(`aria-current`,`page`):n.removeAttribute(`aria-current`)}e===`history`&&Y.open(),e===`projects`&&X.refresh(),e===`settings`&&ue()}for(let e of re)f(`${e}-nav`).addEventListener(`click`,()=>ie(e));function ae(){N.textContent=W?`${J(W.message)}${W.detail?` ${Z(W.detail)}`:``}`:``}function oe(e){B=v(e,navigator.language),document.documentElement.lang=B;for(let e of document.querySelectorAll(`[data-i18n]`))e.textContent=J(e.dataset.i18n);for(let e of document.querySelectorAll(`[data-i18n-label]`))e.setAttribute(`aria-label`,J(e.dataset.i18nLabel));ne(),ae(),$(),Y.render(),X.render()}function se(e){M.value=e.language,oe(e.language)}async function ce(e){if(z){M.disabled=!0,W={message:`saving`},se(e);try{await d(`set_preferences`,{preferences:e}),z=e,W={message:`saved`}}catch(e){W={message:`preferencesWriteError`,detail:String(e)},se(z)}finally{M.disabled=!1,ae()}}}M.addEventListener(`change`,()=>{ce({language:M.value})});function $(){let e=V?.status===`ready`&&!H;F.disabled=I.disabled=!e||K||!G,L.disabled=F.disabled||!G?.worker_access;let t=H?{message:`checking`}:e?q:{message:`schedulerSettingsOffline`};R.textContent=t?`${J(t.message)}${t.detail?` ${Z(t.detail)}`:``}`:``}function le(e,t=!1){t&&F.value!==G?.max_concurrent_workers.toString()||(F.value=e?.max_concurrent_workers.toString()??``,F.removeAttribute(`aria-invalid`)),G=e,L.value=e?.worker_access??`project`}async function ue(){if(!(V?.status!==`ready`||H||K)){K=!0,q=void 0,$();try{le(await d(`get_scheduler_settings`))}catch(e){le(void 0),q={message:`schedulerSettingsReadError`,detail:String(e)}}finally{K=!1,$()}}}async function de(){if(F.disabled)return;let e=F.valueAsNumber;!Number.isInteger(e)||e<1||e>64?(F.setAttribute(`aria-invalid`,`true`),q={message:`schedulerLimitInvalid`},$()):(F.removeAttribute(`aria-invalid`),await fe({maxConcurrentWorkers:e}))}async function fe(e){K=!0,q={message:`saving`},$();try{le(await d(`set_scheduler_settings`,e),`workerAccess`in e),q={message:`saved`}}catch(e){L.value=G?.worker_access??`project`,q={message:`schedulerSettingsWriteError`,detail:String(e)}}finally{K=!1,$()}}P.addEventListener(`submit`,e=>{e.preventDefault(),de()}),L.addEventListener(`change`,()=>{L.disabled||fe({workerAccess:L.value})});async function pe(){let e=Q(`start_service`);try{z=await d(`get_preferences`),se(z),M.disabled=!1}catch(e){W={message:`preferencesReadError`,detail:String(e)},ae()}await e}oe(`system`),pe();
|
package/web/index.html
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
6
|
<link rel="icon" type="image/svg+xml" href="/assets/icon-GvZv3lcu.svg" />
|
|
7
7
|
<title>Runspur</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-CqsPCOTj.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="/assets/index-B-DC_Iqf.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
12
12
|
<div class="app-shell">
|
|
@@ -267,6 +267,29 @@
|
|
|
267
267
|
</select>
|
|
268
268
|
</div>
|
|
269
269
|
<p id="settings-message" class="settings-message" aria-live="polite"></p>
|
|
270
|
+
<h2 data-i18n="localScheduler">Local scheduler</h2>
|
|
271
|
+
<form id="scheduler-settings-form" class="setting-row scheduler-setting" novalidate>
|
|
272
|
+
<div>
|
|
273
|
+
<label for="scheduler-limit" data-i18n="schedulerLimit">Maximum concurrent tasks</label>
|
|
274
|
+
<p id="scheduler-limit-hint" data-i18n="schedulerLimitHint">All projects share this limit. Extra tasks wait in the queue. Lowering the limit lets running tasks finish.</p>
|
|
275
|
+
</div>
|
|
276
|
+
<div class="setting-controls">
|
|
277
|
+
<input id="scheduler-limit" type="number" min="1" max="64" step="1" required aria-describedby="scheduler-limit-hint scheduler-settings-message" disabled>
|
|
278
|
+
<button id="scheduler-limit-save" type="submit" data-i18n="saveSchedulerLimit" disabled>Save</button>
|
|
279
|
+
</div>
|
|
280
|
+
</form>
|
|
281
|
+
<div class="setting-row scheduler-setting">
|
|
282
|
+
<div>
|
|
283
|
+
<label for="worker-access" data-i18n="workerAccess">Child Agent permissions</label>
|
|
284
|
+
<p id="scheduler-worker-access-hint" data-i18n="schedulerWorkerAccessHint">Full access enables Claude Code's own shell and file tools. Follow main Agent uses the project's permissions when the main Agent's current permissions are unavailable.</p>
|
|
285
|
+
</div>
|
|
286
|
+
<select id="worker-access" aria-describedby="scheduler-worker-access-hint scheduler-settings-message" disabled>
|
|
287
|
+
<option value="project" data-i18n="workerAccessProject">Use project permissions</option>
|
|
288
|
+
<option value="full" data-i18n="workerAccessFull">Full access</option>
|
|
289
|
+
<option value="follow_main" data-i18n="workerAccessFollowMain">Follow main Agent</option>
|
|
290
|
+
</select>
|
|
291
|
+
</div>
|
|
292
|
+
<p id="scheduler-settings-message" class="settings-message" aria-live="polite"></p>
|
|
270
293
|
</section>
|
|
271
294
|
</main>
|
|
272
295
|
</div>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e=`modulepreload`,t=function(e){return`/`+e},n={},r=function(e){return e.pathname.endsWith(`.css`)},i=function(e,t,n){if(t in e)return e[t];let r=n();if(!r){e[t]=void 0;return}let i=r.then(()=>{e[t]=void 0},n=>{throw e[t]=void 0,n});return e[t]=i,i},a=function(a,o,s){let c=Promise.resolve();if(o&&o.length>0){let a,l=document.querySelector(`meta[property=csp-nonce]`),u=l?.nonce||l?.getAttribute(`nonce`);function d(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function f(e){return import.meta.resolve?new URL(import.meta.resolve(e)):new URL(e,import.meta.url)}c=d(o.map(o=>{o=t(o,s);let c=f(o),l=r(c);return i(n,c.href,()=>{if(a===void 0){a={all:new Set,styles:new Set};let e=document.getElementsByTagName(`link`);for(let t=e.length-1;t>=0;t--){let n=e[t];a.all.add(n.href),n.rel===`stylesheet`&&a.styles.add(n.href)}}if((l?a.styles:a.all).has(c.href))return;let t=document.createElement(`link`);if(t.rel=l?`stylesheet`:e,l||(t.as=`script`),t.crossOrigin=``,t.href=c.href,u&&t.setAttribute(`nonce`,u),document.head.appendChild(t),l)return new Promise((e,n)=>{let r=i=>{t.removeEventListener(`load`,r),t.removeEventListener(`error`,r),i.type===`error`?n(Error(`Unable to preload CSS for ${c}`)):e(i)};t.addEventListener(`load`,r),t.addEventListener(`error`,r)})})}).filter(e=>e!==void 0))}function l(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return c.then(e=>{for(let t of e||[])t.status===`rejected`&&l(t.reason);return a().catch(l)})},o=`runspur.tui.token`,s=/^[0-9a-f]{64}$/i,c=`__TAURI_INTERNALS__`in window;function l(){let{hash:e,pathname:t,search:n}=window.location,r=new URLSearchParams(e.slice(1)).get(`token`);if(e&&window.history.replaceState(window.history.state,``,t+n),r!==null&&!s.test(r))return null;try{if(r!==null)window.sessionStorage.setItem(o,r);else{let e=window.sessionStorage.getItem(o);return e!==null&&s.test(e)?e:null}}catch{}return r}var u=c?null:l();async function d(e,t={}){if(c){let{invoke:n}=await a(async()=>{let{invoke:e}=await import(`./core-CwxXejkd.js`);return{invoke:e}},[]);return n(e,t)}if(u===null)throw Error("Open the Runspur browser panel with `runspur tui`.");let n=await fetch(`/api/${encodeURIComponent(e)}`,{method:`POST`,credentials:`omit`,redirect:`error`,headers:{Authorization:`Bearer ${u}`,"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok){let e=await n.json().catch(()=>null);throw Error(typeof e?.error==`string`?e.error:`Runspur returned HTTP ${n.status}.`)}return n.json()}function f(e){let t=document.getElementById(e);if(!t)throw Error(`Missing element: ${e}`);return t}function p(e,t,n){let r=document.createElement(e);return r.textContent=t,n&&(r.className=n),r}function m(e){return e.startsWith(`\\\\?\\UNC\\`)?`\\\\${e.slice(8)}`:e.startsWith(`\\\\?\\`)?e.slice(4):e}function h(e,t,n){e.textContent=n?[t(n.message),n.detail].filter(Boolean).join(` `):``,e.dataset.error=String(!!n?.detail)}var g={queued:`queued`,starting:`startingTask`,running:`runningTask`,waiting_approval:`waitingApproval`,succeeded:`succeeded`,failed:`failed`,canceled:`canceled`,timed_out:`timedOut`},_={not_ready:`notReady`,pending:`pending`,sending:`sending`,accepted_by_transport:`acceptedByTransport`,acknowledged_by_parent:`acknowledgedByParent`,held:`held`,refused:`refused`,retry_wait:`retryWait`,orphaned:`orphaned`,uncertain:`uncertain`};function v(e){let t=f(`history`),n=f(`history-project`),r=f(`history-session`),i=f(`refresh-history`),a=f(`load-sessions`),o=f(`resume-claude-session`),s=f(`load-history`),l=f(`history-list`),u=f(`task-detail`),m=f(`task-content`),v=!1,y=!1,b=!1,x=!1,S=0,C=0,w=[],T=[],E=[],D=``,O=``,k=null,A=null,j=``,M,N,P;function F(){if(!c||!D||!O)return;let e=w.find(({config:e})=>e.project_id===D);if(e?.main_agent_kind!==`claude_print`)return;let t=T.find(({origin_id:e})=>e===O);if(t?.adapter_id===`claude_code_managed`&&t.transport!==`native_inbox`&&t.session_id)return{root:e.root,resume:t.session_id}}function I(e){return new Intl.DateTimeFormat(document.documentElement.lang,{dateStyle:`medium`,timeStyle:`short`}).format(e)}function L(){if(f(`history-inspector`).hidden=E.length===0&&!j,f(`task-empty`).hidden=!!j,u.hidden=!j,h(f(`task-notice`),e,P),m.replaceChildren(),!M)return;let{task:t,prompt:n,origin_id:r,session_id:i,timeout_seconds:a}=M,o=p(`dl`,``,`task-readout`),s=(t,n)=>{if(n==null||n===``)return;let r=document.createElement(`div`);r.append(p(`dt`,e(t)),p(`dd`,String(n))),o.append(r)};if(s(`filterProject`,w.find(({config:e})=>e.project_id===t.project_id)?.config.name??t.project_id),s(`sessionId`,i),s(`originId`,r),s(`taskId`,t.task_id),s(`worker`,t.worker_profile_id),s(`execution`,e(g[t.execution_state])),s(`delivery`,e(_[t.delivery_state])),s(`queuedAt`,I(t.created_at_ms)),s(`startedAt`,t.started_at_ms==null?null:I(t.started_at_ms)),s(`finishedAt`,t.finished_at_ms==null?null:I(t.finished_at_ms)),s(`timeout`,new Intl.NumberFormat(document.documentElement.lang,{style:`unit`,unit:`second`}).format(a)),s(`deliveryId`,t.delivery_id),s(`parentTurnId`,t.parent_turn_id),s(`deliveryError`,t.delivery_error),t.result&&(s(`exitCode`,t.result.exit_code),s(`errorClass`,t.result.error_class)),m.append(o,p(`h3`,e(`prompt`)),p(`pre`,n,`task-text`)),m.append(p(`h3`,e(`result`))),!t.result)m.append(p(`p`,e(`noResult`)));else{m.append(p(`pre`,t.result.summary,`task-text`));for(let[n,r]of[[`verification`,t.result.verification.map(({description:e,outcome:t})=>`${e} · ${t}`)],[`artifacts`,t.result.artifact_refs]]){if(r.length===0)continue;let t=p(`ul`,``,`task-result-list`);t.append(...r.map(e=>p(`li`,e))),m.append(p(`h3`,e(n)),t)}}}function R(){n.replaceChildren(new Option(e(`allProjects`),``),...w.map(({config:e})=>new Option(e.name,e.project_id))),n.value=D;let t=D?T.length||O?`allSessions`:`noSessions`:`chooseProjectForSessions`;r.replaceChildren(new Option(e(t),``),...T.map(({origin_id:e,adapter_id:t,session_id:n,task_count:r,transport:i})=>new Option(`${n} · ${i===`native_inbox`?`Claude Code`:t} · ${r}`,e))),O&&!T.some(({origin_id:e})=>e===O)&&r.add(new Option(O,O)),r.value=O,n.disabled=i.disabled=!v||y,r.disabled=!v||y||!D||r.options.length<2,a.hidden=k==null,s.hidden=A==null,a.disabled=s.disabled=!v||y,o.hidden=!F(),o.disabled=!v||y||b,h(f(`history-notice`),e,v?N:{message:`schedulerNeeded`}),l.replaceChildren(...E.map(t=>{let n=p(`button`,``,`entry-button dispatch-entry`);return n.type=`button`,n.disabled=y,n.dataset.taskId=t.task_id,n.setAttribute(`aria-pressed`,String(t.task_id===j)),n.append(p(`strong`,t.worker_profile_id),p(`span`,`${e(g[t.execution_state])} · ${e(_[t.delivery_state])}`),p(`span`,I(t.created_at_ms))),n.addEventListener(`click`,()=>{z(t.task_id)}),n})),v&&!y&&!N&&E.length===0&&l.append(p(`p`,e(`noDispatches`),`empty-state`)),L()}async function z(e){let t=++C;j=e,M=void 0,P={message:`loading`};for(let t of l.querySelectorAll(`button`))t.setAttribute(`aria-pressed`,String(t.dataset.taskId===e));L();try{let n=await d(`query_task_detail`,{taskId:e});if(t!==C)return;M=n,P=void 0}catch(e){if(t!==C)return;P={message:`taskError`,detail:String(e)}}L()}function B(){C++,j=``,M=void 0,P=void 0}async function V(t){if(!v||y&&t!==`project`)return;let n=++S;y=!0,N={message:`loading`},(t===`project`||t===`session`)&&(E=[],A=null,B()),t===`project`&&(T=[],k=null),R();try{if(t===`refresh`){let e=await d(`projects_list`);if(n!==S)return;w=e}if(D&&(t===`refresh`||t===`project`||t===`olderSessions`)){let r=t===`olderSessions`,i=await d(`query_sessions`,{projectId:D,before:r?k:null,limit:25});if(n!==S)return;if(i.items.some(({origin_id:e})=>!e))throw Error(e(`originServiceUpgrade`));T=r?T.concat(i.items):i.items,k=i.next_cursor}if(t!==`olderSessions`){let e=t===`olderTasks`,r=await d(`query_task_history`,{projectId:D||null,originId:O||null,before:e?A:null,limit:25});if(n!==S)return;E=e?E.concat(r.items):r.items,A=r.next_cursor}N=void 0,x=!0}catch(e){if(n!==S)return;N={message:`historyError`,detail:String(e)}}finally{n===S&&(y=!1,R())}!N&&t===`refresh`&&j&&z(j)}function H(e){D=e,O=``,V(`project`)}n.addEventListener(`change`,()=>H(n.value)),r.addEventListener(`change`,()=>{O=r.value,V(`session`)}),i.addEventListener(`click`,()=>{V(`refresh`)}),a.addEventListener(`click`,()=>{V(`olderSessions`)}),s.addEventListener(`click`,()=>{V(`olderTasks`)}),o.addEventListener(`click`,async()=>{let e=F();if(e&&v&&!y&&!b){b=!0,N=void 0,R();try{await d(`launch_claude_project`,e)}catch(e){N={message:`resumeClaudeError`,detail:String(e)}}finally{b=!1,R()}}});function U(){x||V(`refresh`)}return{render:R,open:U,selectProject:H,setProjects(e){w=e,R()},setReady(e){v!==e&&(v=e,v||(S++,y=x=!1,w=[],T=[],E=[],D=O=``,k=A=null,B()),R(),t.hidden||U())}}}var y={en:{overview:`Overview`,settings:`Settings`,application:`Application`,language:`Language`,languageHint:`Choose the language used by Runspur.`,systemLanguage:`Use system language`,localScheduler:`Local scheduler`,refresh:`Refresh`,serviceVersion:`Service version`,protocol:`Protocol`,workers:`Active workers`,development:`Development`,checking:`Checking connection`,starting:`Starting scheduler`,stopping:`Stopping scheduler`,running:`Scheduler running`,runningDetail:`The local scheduler is responding.`,offline:`Scheduler offline`,offlineDetail:`Start the local Runspur scheduler to continue.`,railReady:`Scheduler ready`,railOffline:`Scheduler offline`,railError:`Connection error`,railPending:`Connecting`,connectionError:`Connection error`,technicalDetails:`Technical details`,start:`Start scheduler`,stop:`Stop scheduler`,retry:`Retry startup`,saving:`Saving…`,saved:`Saved.`,preferencesReadError:`Could not read preferences.`,preferencesWriteError:`Could not save preferences.`,projects:`Projects`,projectsIntro:`Manage project integrations and dispatch history.`,chooseProject:`Add project`,configureProject:`Edit configuration`,projectEditTitle:`Edit project configuration`,projectAlreadyConnected:`This folder is already connected. Saving will update the existing project.`,registeredProjects:`Registered projects`,noProjects:`No projects yet`,projectEmpty:`Choose a folder to configure its agents and track its dispatches here.`,backToProjects:`Back to projects`,projectSetup:`Setup`,projectConfiguration:`Configure`,projectReview:`Review`,editProject:`Edit configuration`,projectFolder:`Project folder`,projectName:`Project name`,parentAgent:`Main agent`,workerAgents:`Worker agents`,workerWritePolicy:`Worker file access`,workerAccessHint:`Worker changes are collected for review.`,workersReadOnlyHint:`The selected workers are read-only. Project write policies apply to workers that support editing.`,codexReadOnlyHint:`Codex workers run in read-only mode under every project policy.`,workerReadOnly:`Read only`,workerReadOnlyHint:`Inspect project files and report findings.`,workerScopedWrite:`Specified files`,workerScopedWriteHint:`Edit task-listed files in an isolated workspace.`,workerProjectWrite:`Project-wide text edits`,workerProjectWriteHint:`Edit text across an isolated project workspace.`,integrationScope:`Confirm to save the project manifest, Skill and main agent configuration.`,previewProject:`Preview integration`,projectManifest:`Project manifest`,projectSkill:`Skill`,projectMcp:`Runspur MCP entry`,projectClaudeHook:`Claude Code project hook`,projectDeveloperInstructions:`Runspur developer instructions`,projectCleanup:`Previous integration entries to remove`,applyProject:`Confirm and connect`,saveProjectChanges:`Save changes`,refreshAgents:`Refresh agents`,noWorkers:`No supported worker detected. Install a worker and refresh agents.`,chooseWorker:`Select at least one available worker agent.`,missingWorker:`Unavailable`,projectSaved:`Project saved. MCP and Skill files installed. Reload the project in the main agent host to use them.`,projectUpdated:`Project configuration updated. Open a new conversation to use the updated Skill and tools.`,projectSavedNativeClaude:`Project saved. Run claude in this folder to start a new Runspur-enabled conversation.`,projectLoadError:`Could not load project configuration.`,projectPreviewError:`Could not prepare the project integration preview.`,projectDifferentState:`This project is connected to a different Runspur data directory. Open it with the Runspur instance that originally connected it.`,projectSaveError:`Could not save the project integration.`,projectBrowseError:`Could not open the folder picker.`,agentLoadError:`Could not detect agents.`,projectsLoadError:`Could not load registered projects.`,loading:`Loading…`,schedulerNeeded:`Start the local scheduler in Overview to continue.`,history:`Dispatch history`,historyIntro:`Inspect each dispatch, its execution, and delivery back to the main agent.`,filterProject:`Project`,filterSession:`Session`,allProjects:`All projects`,allSessions:`All sessions`,chooseProjectForSessions:`Select a project to see its sessions`,noSessions:`No sessions with dispatches`,olderSessions:`Load older sessions`,resumeClaudeSession:`Resume Claude session`,resumeClaudeError:`Could not resume the selected Claude session.`,dispatches:`Dispatches`,noDispatches:`No dispatches match this view.`,olderDispatches:`Load older dispatches`,taskEmpty:`Select a dispatch to see its prompt, result, and delivery details.`,dispatchDetails:`Dispatch details`,cancelTask:`Cancel dispatch`,cancelPending:`Cancellation requested.`,cancelError:`Could not cancel this dispatch.`,historyError:`Could not load dispatch history.`,taskError:`Could not load this dispatch.`,execution:`Execution`,delivery:`Delivery`,taskId:`Dispatch ID`,deliveryId:`Delivery ID`,sessionId:`Origin session`,originId:`Runspur origin ID`,originServiceUpgrade:`Update the running Runspur service to filter by conversation.`,parentTurnId:`Main agent turn`,worker:`Worker`,queuedAt:`Dispatched`,startedAt:`Started`,finishedAt:`Finished`,duration:`Duration`,timeout:`Time limit`,prompt:`Prompt`,result:`Result`,noResult:`Result pending.`,exitCode:`Exit code`,errorClass:`Error category`,verification:`Verification`,artifacts:`Artifacts`,deliveryError:`Delivery details`,queued:`Queued`,startingTask:`Starting`,runningTask:`Running`,waitingApproval:`Waiting for approval`,succeeded:`Succeeded`,failed:`Failed`,canceled:`Canceled`,timedOut:`Timed out`,notReady:`Not ready`,pending:`Pending`,sending:`Sending`,acceptedByTransport:`Received by host`,acknowledgedByParent:`Acknowledged by main agent`,held:`On hold`,refused:`Refused`,retryWait:`Waiting to retry`,orphaned:`Origin unavailable`,uncertain:`Uncertain`},"zh-CN":{overview:`概览`,settings:`设置`,application:`应用`,language:`语言`,languageHint:`选择 Runspur 使用的界面语言。`,systemLanguage:`跟随系统`,localScheduler:`本地调度器`,refresh:`刷新`,serviceVersion:`服务版本`,protocol:`协议版本`,workers:`运行中的子 Agent`,development:`开发版`,checking:`正在检查连接`,starting:`正在启动调度器`,stopping:`正在停止调度器`,running:`调度器正在运行`,runningDetail:`本地调度器已响应。`,offline:`调度器未运行`,offlineDetail:`启动本地 Runspur 调度器后可继续。`,railReady:`调度器已就绪`,railOffline:`调度器未运行`,railError:`连接出错`,railPending:`正在连接`,connectionError:`连接出错`,technicalDetails:`技术详情`,start:`启动调度器`,stop:`停止调度器`,retry:`重试启动`,saving:`正在保存…`,saved:`已保存。`,preferencesReadError:`无法读取设置。`,preferencesWriteError:`无法保存设置。`,projects:`项目`,projectsIntro:`管理项目接入和调度历史。`,chooseProject:`添加项目`,configureProject:`编辑配置`,projectEditTitle:`编辑项目配置`,projectAlreadyConnected:`此目录已接入。保存后将更新现有项目的配置。`,registeredProjects:`已登记项目`,noProjects:`暂无项目`,projectEmpty:`选择项目目录,配置 Agent 后即可在这里查看调度记录。`,backToProjects:`返回项目`,projectSetup:`接入步骤`,projectConfiguration:`配置`,projectReview:`确认`,editProject:`返回修改`,projectFolder:`项目目录`,projectName:`项目名称`,parentAgent:`主 Agent`,workerAgents:`子 Agent`,workerWritePolicy:`子 Agent 文件权限`,workerAccessHint:`子 Agent 的改动会保留供审查。`,workersReadOnlyHint:`所选子 Agent 均为只读。项目写入设置适用于支持编辑的子 Agent。`,codexReadOnlyHint:`无论项目采用哪种写入设置,Codex 子 Agent 都以只读方式运行。`,workerReadOnly:`只读`,workerReadOnlyHint:`查看项目文件并汇报结果。`,workerScopedWrite:`指定文件写入`,workerScopedWriteHint:`在隔离工作区修改每次任务指定的文件。`,workerProjectWrite:`项目内写入`,workerProjectWriteHint:`在隔离的项目工作区修改文本文件。`,integrationScope:`确认后将保存项目清单、Skill 和主 Agent 配置。`,previewProject:`预览接入配置`,projectManifest:`项目清单`,projectSkill:`Skill`,projectMcp:`Runspur MCP 条目`,projectClaudeHook:`Claude Code 项目 Hook`,projectDeveloperInstructions:`Runspur 开发者指令`,projectCleanup:`将移除的旧接入条目`,applyProject:`确认接入`,saveProjectChanges:`保存修改`,refreshAgents:`刷新 Agent`,noWorkers:`暂未检测到可用的子 Agent。安装后可重新检测。`,chooseWorker:`请至少选择一个可用的子 Agent。`,missingWorker:`不可用`,projectSaved:`项目已保存,MCP 和 Skill 已安装。请在主 Agent 宿主中重新加载此项目。`,projectUpdated:`项目配置已更新。请在主 Agent 中开新会话使用更新后的 Skill 和工具。`,projectSavedNativeClaude:`项目配置已保存。在此目录运行 claude,即可开启支持 Runspur 的新会话。`,projectLoadError:`无法读取项目配置。`,projectPreviewError:`无法生成项目接入预览。`,projectDifferentState:`这个项目已接入另一套 Runspur 数据。请用原先接入项目的 Runspur 实例打开。`,projectSaveError:`无法保存项目集成。`,projectBrowseError:`无法打开目录选择器。`,agentLoadError:`无法检测 Agent。`,projectsLoadError:`无法读取已登记的项目。`,loading:`正在加载…`,schedulerNeeded:`请先在概览中启动本地调度器。`,history:`调度历史`,historyIntro:`查看每次调度的执行过程与回传状态。`,filterProject:`项目`,filterSession:`会话`,allProjects:`所有项目`,allSessions:`所有会话`,chooseProjectForSessions:`选择项目后可查看会话`,noSessions:`暂无派发记录的会话`,olderSessions:`加载更早的会话`,dispatches:`调度记录`,noDispatches:`当前视图没有调度记录。`,olderDispatches:`加载更早的记录`,taskEmpty:`选择一条调度记录,查看提示词、结果和回传详情。`,dispatchDetails:`调度详情`,cancelTask:`取消调度`,cancelPending:`已请求取消。`,cancelError:`无法取消此调度。`,resumeClaudeSession:`继续 Claude 会话`,resumeClaudeError:`无法继续选中的 Claude 会话。`,historyError:`无法读取调度历史。`,taskError:`无法读取此调度。`,execution:`执行状态`,delivery:`回传状态`,taskId:`调度 ID`,deliveryId:`回传 ID`,sessionId:`发起会话`,originId:`Runspur 原会话 ID`,originServiceUpgrade:`请更新正在运行的 Runspur 服务以按会话筛选。`,parentTurnId:`主 Agent 回合`,worker:`子 Agent`,queuedAt:`派发时间`,startedAt:`开始时间`,finishedAt:`结束时间`,duration:`耗时`,timeout:`超时限制`,prompt:`提示词`,result:`结果`,noResult:`正在等待结果。`,exitCode:`退出码`,errorClass:`错误类别`,verification:`验收信息`,artifacts:`产物`,deliveryError:`回传详情`,queued:`排队中`,startingTask:`启动中`,runningTask:`运行中`,waitingApproval:`等待授权`,succeeded:`成功`,failed:`失败`,canceled:`已取消`,timedOut:`超时`,notReady:`尚未就绪`,pending:`等待中`,sending:`回传中`,acceptedByTransport:`宿主已接收`,acknowledgedByParent:`主 Agent 已确认`,held:`暂缓`,refused:`已拒绝`,retryWait:`等待重试`,orphaned:`发起会话不可用`,uncertain:`状态不确定`}};function b(e,t){return e===`system`?t.toLowerCase().split(`-`)[0]===`zh`?`zh-CN`:`en`:e}var x={codex_desktop:`codex`,codex_exec:`codex`,claude_print:`claude`},S={read_only:{label:`workerReadOnly`,detail:`workerReadOnlyHint`},workspace_write:{label:`workerScopedWrite`,detail:`workerScopedWriteHint`},project_write:{label:`workerProjectWrite`,detail:`workerProjectWriteHint`}};function C(e){return e.allow_project_write?`project_write`:e.allow_workspace_write?`workspace_write`:`read_only`}var w={skill:`projectSkill`,runspur_scheduler:`projectMcp`,developer_instructions:`projectDeveloperInstructions`,claude_origin_hook:`projectClaudeHook`};function T(e,t){let n=t instanceof Error?t.message:String(t),r=`[runspur_state_conflict]`;return n.includes(r)?{message:`projectDifferentState`,detail:n.replace(r,``).trim()}:{message:e,detail:n}}function E(e,t,n){let r=f(`projects`),i=f(`choose-project`),a=f(`close-project-setup`),o=f(`project-list`),s=f(`project-form`),c=f(`project-root`),l=f(`project-name`),u=f(`parent-agent`),g=f(`worker-agents`),_=Array.from(f(`worker-file-access`).querySelectorAll(`input`)),v=f(`preview-project`),y=f(`project-preview`),b=f(`preview-hook`),E=f(`edit-project`),D=f(`apply-project`),O=f(`refresh-agents`),k=f(`project-setup-feedback`),A=f(`project-setup-message`),j=f(`project-setup-details`),M=f(`project-setup-error`),N=f(`project-feedback`),P=[],F=[],I,L,R=!1,z=!1,B=!1,V,H,U=()=>F.filter(e=>e.parent);function W(e,t){let n=F.find(e=>e.profile_id===t);return n!==void 0&&x[e.kind]===x[n.kind]}let G=()=>F.filter(e=>e.worker&&!W(e,I?.main_agent_profile_id));function K(e,t){let n=[[`codex_desktop`,`codex-desktop`,`Codex`],[`codex_exec`,`codex-cli`,`Codex`],[`claude_print`,`claude-cli`,`Claude Code`]].find(([n,r])=>t===void 0?r===e:n===t);if(!n)return e;let[,r,i]=n;return e===r?i:`${i} · ${e}`}function q(e){return K(e,F.find(t=>t.profile_id===e)?.kind)}function J(){i.disabled=z||!R,a.disabled=E.disabled=z,O.disabled=z||!R,l.disabled=u.disabled=!R||z;let t=I?.worker_profile_ids.map(e=>F.find(t=>t.profile_id===e)?.kind)??[],n=t.length>0&&t.every(e=>e===`codex_exec`);I&&n&&(I.allow_workspace_write=!1,I.allow_project_write=!1),_.forEach(e=>{e.checked=I?e.value===C(I):!1,e.disabled=!R||z||n&&e.value!==`read_only`});let r=t.includes(`codex_exec`)?`codexReadOnlyHint`:`workerAccessHint`,o=e(n?`workersReadOnlyHint`:r),s=f(`worker-access-hint`);s.textContent!==o&&(s.textContent=o),g.querySelectorAll(`input`).forEach(e=>{e.disabled=!R||z});let c=I&&I.name.trim()&&I.worker_profile_ids.length>0&&U().some(e=>e.profile_id===I?.main_agent_profile_id)&&I.worker_profile_ids.every(e=>G().some(t=>t.profile_id===e));f(`worker-hint`).hidden=!I||G().length===0||I.worker_profile_ids.length>0,v.disabled=z||!R||!c,D.disabled=v.disabled||!L}function Y(){s.hidden=!I||!!L,y.hidden=!L,b.hidden=!L?.hook_path,b.hidden&&(b.open=!1),L?(f(`configure-step`).removeAttribute(`aria-current`),f(`review-step`).setAttribute(`aria-current`,`step`)):(f(`configure-step`).setAttribute(`aria-current`,`step`),f(`review-step`).removeAttribute(`aria-current`),f(`preview-skill`).open=!1,f(`preview-mcp`).open=!1);let t=L?S[C(L)]:void 0;f(`preview-name`).textContent=L&&I?I.name.trim():``,f(`preview-parent`).textContent=L&&I?q(I.main_agent_profile_id):``,f(`preview-workers`).textContent=L&&I?I.worker_profile_ids.map(q).join(`, `):``;for(let[e,t]of[[`preview-manifest`,L?.manifest_path],[`preview-skill-path`,L?.skill_path],[`preview-mcp-path`,L?.mcp_path],[`preview-hook-path`,L?.hook_path]]){let n=t?m(t):``,r=f(e);r.textContent=r.title=n}f(`preview-write-policy`).textContent=t?e(t.label):``,f(`preview-write-detail`).textContent=t?e(t.detail):``,f(`preview-skill-content`).textContent=L?.skill_content??``,f(`preview-mcp-content`).textContent=L?.mcp_content??``,f(`preview-hook-content`).textContent=L?.hook_content??``;let n=L?.cleanup??[];f(`preview-cleanup`).hidden=n.length===0,f(`preview-cleanup-items`).replaceChildren(...n.map(({path:t,entry:n})=>{let r=p(`div`,``,`preview-file`),i=w[n],a=p(`code`,m(t));return a.title=a.textContent,r.append(p(`strong`,i?e(i):n),a),r}))}function X(){L=void 0,H=void 0,Y(),Z(),J()}function Z(){let t=I?R?H:{message:`schedulerNeeded`}:void 0,n=t?.detail??``;M.textContent!==n&&(j.open=!1),k.hidden=!t,k.dataset.error=String(!!n),A.textContent=t?e(t.message):``,j.hidden=!n,M.textContent=n,N.dataset.complete=String(!I&&(H?.message===`projectSaved`||H?.message===`projectUpdated`||H?.message===`projectSavedNativeClaude`)),h(N,e,I?void 0:H)}function Q(){if(o.replaceChildren(...P.map(t=>{let r=p(`div`,``,`project-row`),i=p(`button`,``,`dispatch-entry`);i.type=`button`,i.disabled=z||!R,i.append(p(`strong`,t.config.name),p(`span`,m(t.root))),i.addEventListener(`click`,()=>n(t.config.project_id));let a=p(`button`,e(`configureProject`),`text-button`);return a.type=`button`,a.disabled=z||!R,a.setAttribute(`aria-label`,`${e(`configureProject`)} · ${m(t.root)}`),a.addEventListener(`click`,()=>{te(t.root)}),r.append(i,a),r})),f(`project-home`).hidden=!!I,f(`project-setup`).hidden=!I,f(`project-empty`).hidden=!R||z||!!V||P.length>0,I){f(`project-setup-title`).textContent=e(I.registered?`projectEditTitle`:`chooseProject`),f(`project-registered-note`).hidden=!I.registered,D.textContent=e(I.registered?`saveProjectChanges`:`applyProject`),c.textContent=m(I.root),l.value=I.name;let t=U(),n=I.main_agent_profile_id,r=t.map(({profile_id:e,kind:t})=>new Option(K(e,t),e));n&&!t.some(e=>e.profile_id===n)&&r.unshift(new Option(`${K(n)} · ${e(`missingWorker`)}`,n)),u.replaceChildren(...r),u.value=n;let i=G(),a=I.worker_profile_ids.filter(e=>!i.some(t=>t.profile_id===e)),o=i.map(({profile_id:e,kind:t})=>({id:e,caption:K(e,t)}));for(let t of a)o.push({id:t,caption:`${K(t)} · ${e(`missingWorker`)}`});g.replaceChildren(...o.map(({id:e,caption:t})=>{let n=p(`label`,``,`worker-option`),r=document.createElement(`input`);return r.type=`checkbox`,r.value=e,r.checked=I?.worker_profile_ids.includes(e)??!1,r.addEventListener(`change`,()=>{I&&(I.worker_profile_ids=Array.from(g.querySelectorAll(`input:checked`),e=>e.value),X())}),n.append(r,p(`span`,t)),n})),i.length===0&&g.append(p(`p`,e(`noWorkers`),`empty-state`))}h(f(`projects-notice`),e,R?V:{message:`schedulerNeeded`}),Z(),Y(),J()}async function $(){if(!(!R||z||B)){z=!0,V={message:`loading`},Q();try{P=await d(`projects_list`),t(P),V=void 0,B=!0}catch(e){V={message:`projectsLoadError`,detail:String(e)}}finally{z=!1,Q()}}}async function ee(){try{if(F=await d(`agent_profiles`),I){I.main_agent_profile_id||(I.main_agent_profile_id=U()[0]?.profile_id??``);let e=G();I.worker_profile_ids=I.worker_profile_ids.filter(t=>e.some(e=>e.profile_id===t))}}catch(e){H={message:`agentLoadError`,detail:String(e)}}}async function te(e){if(z||!R)return;z=!0,H=void 0,V={message:`loading`},Q();let t=!e;try{let n=e??await d(`choose_project_folder`);t=!1,n&&(I=await d(`project_read`,{root:n}),L=void 0,F=[],await ee()),V=void 0}catch(e){V={message:t?`projectBrowseError`:`projectLoadError`,detail:String(e)}}finally{z=!1,Q(),I&&!V&&l.focus()}}i.addEventListener(`click`,()=>{te()}),a.addEventListener(`click`,()=>{I=void 0,L=void 0,H=void 0,Q(),i.focus()}),E.addEventListener(`click`,()=>{X(),l.focus()}),l.addEventListener(`input`,()=>{I&&(I.name=l.value),X()}),u.addEventListener(`change`,()=>{if(!I)return;let e=u.value;I.main_agent_profile_id=e,I.worker_profile_ids=I.worker_profile_ids.filter(t=>{let n=F.find(e=>e.profile_id===t);return!n||!W(n,e)}),L=void 0,H=void 0,Q()});for(let e of _)e.addEventListener(`change`,()=>{I&&e.checked&&(I.allow_workspace_write=e.value!==`read_only`,I.allow_project_write=e.value===`project_write`,X())});return O.addEventListener(`click`,async()=>{!z&&R&&(z=!0,L=void 0,H={message:`loading`},Q(),await ee(),H?.message===`loading`&&(H=void 0),z=!1,Q())}),s.addEventListener(`submit`,async e=>{if(e.preventDefault(),I&&!v.disabled){z=!0,L=void 0,H={message:`loading`},Q();try{let e=await d(`project_preview`,{input:{...I,name:I.name.trim()}});R&&(L=e),H=void 0}catch(e){H=T(`projectPreviewError`,e)}finally{z=!1,Q(),L?f(`preview-title`).focus():H?.detail&&k.focus()}}}),D.addEventListener(`click`,async()=>{if(!L||!I||D.disabled)return;let e=L.token,n=!!L.hook_path,r=I.registered;L=void 0,z=!0,H={message:`saving`},Q();try{let i=await d(`project_apply`,{token:e});i.main_agent_kind=F.find(e=>e.profile_id===i.config.main_agent_profile_id)?.kind,P=[...P.filter(e=>e.config.project_id!==i.config.project_id),i],P.sort((e,t)=>e.config.name.localeCompare(t.config.name)),t(P),I=void 0,H={message:n?`projectSavedNativeClaude`:r?`projectUpdated`:`projectSaved`}}catch(e){H=T(`projectSaveError`,e)}finally{z=!1,Q(),I?H?.detail&&k.focus():i.focus()}}),{render:Q,refresh:$,setReady(e){R!==e&&(R=e,R||(B=!1,L=void 0),Q(),r.hidden||$())}}}var D=f(`status`),O=f(`detail`),k=f(`indicator`),A=f(`channel`),j=f(`refresh`),M=f(`start`),N=f(`stop`),P=f(`language-setting`),F=f(`settings-message`),I,L=b(`system`,navigator.language),R,z,B,V,H=e=>y[L][e],U=v(H),W=E(H,U.setProjects,e=>{U.selectProject(e),Y(`history`)});function G(e){return`${H(`technicalDetails`)} — ${e}`}function K(){let e=R?.status===`ready`?R.health:void 0,t=R?.channel===`development`;A.hidden=!t,A.textContent=t?H(`development`):``,f(`version`).textContent=e?.version??`—`,f(`protocol`).textContent=e?.protocol_version.toString()??`—`,f(`workers`).textContent=e?.active_workers.toString()??`—`;let n=B??(R?.status===`error`?R.detail:void 0),r=z?`pending`:n?`error`:R?.status??`pending`;k.dataset.status=r;let i={ready:`railReady`,offline:`railOffline`,error:`railError`,pending:`railPending`};switch(f(`rail-status`).textContent=H(i[r]),M.hidden=r===`ready`||r===`pending`,M.textContent=H(r===`error`?`retry`:`start`),N.hidden=c||r!==`ready`,r){case`pending`:D.textContent=H(z===`start_service`?`starting`:z===`stop_service`?`stopping`:`checking`),O.textContent=``;break;case`ready`:D.textContent=H(`running`),O.textContent=H(`runningDetail`);break;case`offline`:D.textContent=H(`offline`),O.textContent=H(`offlineDetail`);break;case`error`:D.textContent=H(`connectionError`),O.textContent=n?G(n):``}}async function q(e){z=e,j.disabled=M.disabled=N.disabled=!0,K();try{R=await d(e),B=void 0}catch(e){R=void 0,B=String(e)}finally{z=void 0,j.disabled=M.disabled=N.disabled=!1,K();let e=R?.status===`ready`;U.setReady(e),W.setReady(e)}}j.addEventListener(`click`,()=>{q(`service_status`)}),M.addEventListener(`click`,()=>{q(`start_service`)}),c||N.addEventListener(`click`,()=>{q(`stop_service`)});var J=[`projects`,`history`,`overview`,`settings`];function Y(e){for(let t of J){f(t).hidden=t!==e;let n=f(`${t}-nav`);t===e?n.setAttribute(`aria-current`,`page`):n.removeAttribute(`aria-current`)}e===`history`&&U.open(),e===`projects`&&W.refresh()}for(let e of J)f(`${e}-nav`).addEventListener(`click`,()=>Y(e));function X(){F.textContent=V?`${H(V.message)}${V.detail?` ${G(V.detail)}`:``}`:``}function Z(e){L=b(e,navigator.language),document.documentElement.lang=L;for(let e of document.querySelectorAll(`[data-i18n]`))e.textContent=H(e.dataset.i18n);for(let e of document.querySelectorAll(`[data-i18n-label]`))e.setAttribute(`aria-label`,H(e.dataset.i18nLabel));K(),X(),U.render(),W.render()}function Q(e){P.value=e.language,Z(e.language)}async function $(e){if(I){P.disabled=!0,V={message:`saving`},Q(e);try{await d(`set_preferences`,{preferences:e}),I=e,V={message:`saved`}}catch(e){V={message:`preferencesWriteError`,detail:String(e)},Q(I)}finally{P.disabled=!1,X()}}}P.addEventListener(`change`,()=>{$({language:P.value})});async function ee(){let e=q(`start_service`);try{I=await d(`get_preferences`),Q(I),P.disabled=!1}catch(e){V={message:`preferencesReadError`,detail:String(e)},X()}await e}Z(`system`),ee();
|