agent-policy-kit 0.0.0-stage → 0.2.0

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.
@@ -0,0 +1,1049 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <meta name="color-scheme" content="light">
7
+ <meta name="description" content="Configure local subagent roles, models and effort with Agent Policy Kit, an open source tool by Mykola Maksymenko.">
8
+ <meta name="author" content="Mykola Maksymenko">
9
+ <link rel="author" href="https://www.linkedin.com/in/nick-maximenko/">
10
+ <link rel="canonical" href="https://agent-policy-kit.trymenow.io/v/0.2.0/">
11
+ <title>Agent Policy Kit — by Mykola Maksymenko</title>
12
+ <script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"Person","@id":"https://www.linkedin.com/in/nick-maximenko/#person","name":"Mykola Maksymenko","url":"https://www.linkedin.com/in/nick-maximenko/"},{"@type":"SoftwareSourceCode","@id":"https://github.com/automatis-tools/agent-policy-kit#software","name":"Agent Policy Kit","description":"Configure native subagent settings across coding tools, then exit","url":"https://agent-policy-kit.trymenow.io/","codeRepository":"https://github.com/automatis-tools/agent-policy-kit","author":{"@id":"https://www.linkedin.com/in/nick-maximenko/#person"}},{"@type":"WebPage","@id":"https://agent-policy-kit.trymenow.io/v/0.2.0/#webpage","name":"Agent Policy Kit — by Mykola Maksymenko","url":"https://agent-policy-kit.trymenow.io/v/0.2.0/","author":{"@id":"https://www.linkedin.com/in/nick-maximenko/#person"},"mainEntity":{"@id":"https://github.com/automatis-tools/agent-policy-kit#software"},"mentions":[{"@type":"SoftwareSourceCode","name":"Agents Can Communicate","codeRepository":"https://github.com/automatis-tools/agents-can-communicate"},{"@type":"SoftwareSourceCode","name":"Automatis Skills","codeRepository":"https://github.com/automatis-tools/automatis-skills"}]}]}</script>
13
+ <!-- Public Sans is embedded under the SIL Open Font License.
14
+ Copyright 2015 The Public Sans Project Authors (https://github.com/uswds/public-sans)
15
+
16
+ This Font Software is licensed under the SIL Open Font License, Version 1.1.
17
+ This license is copied below, and is also available with a FAQ at:
18
+ https://scripts.sil.org/OFL
19
+
20
+
21
+ -----------------------------------------------------------
22
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
23
+ -----------------------------------------------------------
24
+
25
+ PREAMBLE
26
+ The goals of the Open Font License (OFL) are to stimulate worldwide
27
+ development of collaborative font projects, to support the font creation
28
+ efforts of academic and linguistic communities, and to provide a free and
29
+ open framework in which fonts may be shared and improved in partnership
30
+ with others.
31
+
32
+ The OFL allows the licensed fonts to be used, studied, modified and
33
+ redistributed freely as long as they are not sold by themselves. The
34
+ fonts, including any derivative works, can be bundled, embedded,
35
+ redistributed and/or sold with any software provided that any reserved
36
+ names are not used by derivative works. The fonts and derivatives,
37
+ however, cannot be released under any other type of license. The
38
+ requirement for fonts to remain under this license does not apply
39
+ to any document created using the fonts or their derivatives.
40
+
41
+ DEFINITIONS
42
+ "Font Software" refers to the set of files released by the Copyright
43
+ Holder(s) under this license and clearly marked as such. This may
44
+ include source files, build scripts and documentation.
45
+
46
+ "Reserved Font Name" refers to any names specified as such after the
47
+ copyright statement(s).
48
+
49
+ "Original Version" refers to the collection of Font Software components as
50
+ distributed by the Copyright Holder(s).
51
+
52
+ "Modified Version" refers to any derivative made by adding to, deleting,
53
+ or substituting -- in part or in whole -- any of the components of the
54
+ Original Version, by changing formats or by porting the Font Software to a
55
+ new environment.
56
+
57
+ "Author" refers to any designer, engineer, programmer, technical
58
+ writer or other person who contributed to the Font Software.
59
+
60
+ PERMISSION & CONDITIONS
61
+ Permission is hereby granted, free of charge, to any person obtaining
62
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
63
+ redistribute, and sell modified and unmodified copies of the Font
64
+ Software, subject to the following conditions:
65
+
66
+ 1) Neither the Font Software nor any of its individual components,
67
+ in Original or Modified Versions, may be sold by itself.
68
+
69
+ 2) Original or Modified Versions of the Font Software may be bundled,
70
+ redistributed and/or sold with any software, provided that each copy
71
+ contains the above copyright notice and this license. These can be
72
+ included either as stand-alone text files, human-readable headers or
73
+ in the appropriate machine-readable metadata fields within text or
74
+ binary files as long as those fields can be easily viewed by the user.
75
+
76
+ 3) No Modified Version of the Font Software may use the Reserved Font
77
+ Name(s) unless explicit written permission is granted by the corresponding
78
+ Copyright Holder. This restriction only applies to the primary font name as
79
+ presented to the users.
80
+
81
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
82
+ Software shall not be used to promote, endorse or advertise any
83
+ Modified Version, except to acknowledge the contribution(s) of the
84
+ Copyright Holder(s) and the Author(s) or with their explicit written
85
+ permission.
86
+
87
+ 5) The Font Software, modified or unmodified, in part or in whole,
88
+ must be distributed entirely under this license, and must not be
89
+ distributed under any other license. The requirement for fonts to
90
+ remain under this license does not apply to any document created
91
+ using the Font Software.
92
+
93
+ TERMINATION
94
+ This license becomes null and void if any of the above conditions are
95
+ not met.
96
+
97
+ DISCLAIMER
98
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
99
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
100
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
101
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
102
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
103
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
104
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
105
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
106
+ OTHER DEALINGS IN THE FONT SOFTWARE.
107
+ -->
108
+
109
+ <style>
110
+ /* Shared getacc.dev base style snapshot. Source: https://getacc.dev/assets/base.css */
111
+ /* Standalone preview snapshot of https://getacc.dev/assets/base.css. The font is embedded in the preview HTML. Hosted integration should use the site's shared asset directly. */
112
+ :root {
113
+ color-scheme: light; --white: #fff; --paper: #f5f7fb; --ink: #19283e;
114
+ --muted: #59657a; --accent: #284b91; --accent-hover: #193667; --brand-blue: #3158c3; --brand-yellow: #f2c94c; --amber: #795700; --yellow-paper: #fff4ce; --line: #e0e5ed; --reply: #fff;
115
+ --selection: #fff4ce; --scrollbar: #9eafd0; --control-hover: #eaf0ff;
116
+ --sans: "Public Sans", sans-serif; --serif: Georgia, serif;
117
+ }
118
+ * { box-sizing: border-box; }
119
+ html { scrollbar-gutter: stable; scroll-behavior: smooth; scroll-padding-top: 24px; background: var(--white); }
120
+ body { margin: 0; background: var(--white); color: var(--ink); font: 400 16px/1.7 var(--sans); font-synthesis: none; -webkit-font-smoothing: antialiased; caret-color: var(--accent); }
121
+ ::selection { color: var(--ink); background: var(--selection); }
122
+ a { color: var(--accent); text-decoration-thickness: 1px; text-underline-offset: 3px; }
123
+ a:hover { color: var(--accent-hover); text-decoration-thickness: 2px; }
124
+ button, input, summary { font: inherit; }
125
+ button, summary { -webkit-tap-highlight-color: transparent; }
126
+ button { cursor: pointer; }
127
+ button:disabled { cursor: wait; opacity: .7; }
128
+ :focus-visible { outline: 2px solid var(--accent); outline-offset: 4px; }
129
+ [hidden] { display: none !important; }
130
+ img, svg { max-width: 100%; }
131
+ p, figure { margin: 0; }
132
+ p + p { margin-top: 1em; }
133
+ h1, h2, h3 { margin: 0; text-wrap: balance; font-family: var(--sans); }
134
+ h1, h2 { font-weight: 600; line-height: 1.25; letter-spacing: -.02em; }
135
+ h1 { font-size: 36px; }
136
+ h2 { font-size: 25px; }
137
+ h3 { font-size: 17px; font-weight: 600; line-height: 1.45; }
138
+ .shell { width: min(calc(100% - 64px), 1120px); margin-inline: auto; }
139
+ .icon { width: 18px; height: 18px; flex: 0 0 auto; }
140
+ .skip-link { position: absolute; z-index: 100; top: 10px; left: 16px; padding: 8px 14px; background: var(--white); color: var(--accent); transform: translateY(-180%); }
141
+ .skip-link:focus { transform: translateY(0); }
142
+ .site-header { display: flex; align-items: center; gap: 28px; min-height: 73px; border-bottom: 1px solid var(--line); }
143
+ .brand { display: flex; align-items: center; gap: 12px; color: var(--ink); text-decoration: none; white-space: nowrap; }
144
+ .wordmark { font: 650 27px/1 var(--sans); letter-spacing: -.035em; color: var(--ink); text-decoration: none; }
145
+ .brand-type { display: flex; flex-direction: column; gap: 6px; padding-block: 12px; }
146
+ .brand-name { font-size: 11px; line-height: 1.3; letter-spacing: .005em; color: var(--muted); }
147
+ .brand-symbol { width: 48px; height: 34px; }
148
+ .desktop-nav { display: flex; align-items: center; gap: 24px; margin-left: auto; font-size: 14px; }
149
+ .desktop-nav > a { color: var(--ink); text-decoration: none; padding-block: 20px; }
150
+ .desktop-nav a[aria-current] { color: var(--accent); text-decoration: underline; text-decoration-thickness: 2px; }
151
+ .reading-menu { position: relative; }
152
+ .reading-menu:has([aria-current="page"]) > summary { color: var(--accent); text-decoration: underline; text-decoration-thickness: 2px; text-underline-offset: 3px; }
153
+ .reading-menu summary { cursor: pointer; color: var(--ink); padding-block: 20px; }
154
+ .reading-menu nav { position: absolute; z-index: 20; top: 55px; right: 0; width: 190px; background: #fff; border: 1px solid var(--line); border-radius: 5px; padding: 8px 15px; }
155
+ .reading-menu nav a { display: block; padding-block: 8px; }
156
+ .header-actions { display: flex; align-items: center; gap: 24px; font-size: 14px; }
157
+ .github-star { display: inline-flex; align-items: center; min-width: 106px; min-height: 28px; line-height: 1; }
158
+ .github-star > span { display: inline-flex !important; }
159
+ .github-star > .github-button { display: inline-flex; align-items: center; min-height: 28px; padding: 4px 12px; border: 1px solid #d1d9e0; border-radius: 6px; color: var(--ink); font-size: 12px; font-weight: 600; text-decoration: none; background: #f6f8fa; }
160
+ .github-star-mobile { display: none; }
161
+ .search-link { display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 36px; color: var(--ink); }
162
+ .button { display: inline-flex; align-items: center; justify-content: center; gap: 10px; min-height: 44px; padding: 7px 20px; border: 1px solid var(--brand-blue); border-radius: 7px; color: #fff; background: var(--brand-blue); font-size: 14px; font-weight: 500; text-decoration: none; }
163
+ .button:hover { background: var(--accent-hover); border-color: var(--accent-hover); color: #fff; }
164
+ .actions { display: flex; align-items: center; gap: 23px; flex-wrap: wrap; }
165
+ .text-link { display: inline-flex; align-items: center; gap: 9px; font-size: 14px; font-weight: 500; }
166
+ .quiet-link { color: var(--muted); font-size: 14px; }
167
+ .mobile-nav { display: none; }
168
+ .mobile-nav summary { cursor: pointer; font-size: 14px; padding-block: 12px; }
169
+ .mobile-nav nav { position: absolute; z-index: 20; right: 20px; top: 74px; width: min(310px, calc(100% - 40px)); padding: 14px 20px; border: 1px solid var(--line); border-radius: 5px; background: #fff; }
170
+ .mobile-nav nav a { display: block; padding-block: 9px; }
171
+ .site-footer { margin-top: 55px; padding-block: 25px; font-size: 13px; color: var(--muted); }
172
+ .footer-links { display: flex; flex-wrap: wrap; gap: 8px 20px; border-top: 1px solid var(--line); padding-top: 20px; }
173
+ .footer-note { margin-top: 15px; display: flex; flex-wrap: wrap; justify-content: space-between; gap: 10px 25px; font-size: 13px; }
174
+ .article-link { border-top: 1px solid var(--line); padding-block: 23px; }
175
+ .article-link-meta { display: flex; gap: 20px; font-size: 13px; color: var(--muted); margin-bottom: 10px; }
176
+ .article-link .article-link-heading { font-size: 22px; line-height: 1.35; max-width: 36ch; }
177
+ .article-link .article-link-heading a { color: var(--ink); text-decoration: none; }
178
+ .article-link .article-link-heading a:hover { color: var(--accent); text-decoration: underline; }
179
+ .article-link p { margin-top: 12px; color: var(--muted); font-size: 15px; max-width: 70ch; }
180
+ .article-link .text-link { margin-top: 15px; font-size: 14px; }
181
+ pre { position: relative; margin: 18px 0; padding: 20px; overflow-x: auto; color: var(--ink); background: var(--paper); border-radius: 5px; font-size: 13px; line-height: 1.75; tab-size: 2; scrollbar-width: thin; scrollbar-color: var(--scrollbar) var(--paper); }
182
+ code { font-family: ui-monospace, "SFMono-Regular", Consolas, monospace; font-size: .85em; }
183
+ pre code { font-size: inherit; }
184
+ pre:has(.code-copy) { padding-top: 46px; }
185
+ .code-copy { position: absolute; top: 5px; right: 6px; min-width: 48px; min-height: 35px; padding: 6px 10px; border: 0; border-radius: 4px; background: transparent; color: var(--muted); font: 500 13px/1.4 var(--sans); }
186
+ .code-copy:hover { color: var(--accent); background: var(--control-hover); }
187
+ .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
188
+ @media (max-width: 1000px) {
189
+ .site-header { gap: 20px; }
190
+ .desktop-nav { gap: 16px; }
191
+ .header-actions { gap: 16px; }
192
+ }
193
+ @media (max-width: 900px) {
194
+ .desktop-nav, .github-star-desktop { display: none; }
195
+ .header-actions { margin-left: auto; }
196
+ .mobile-nav { display: block; }
197
+ .mobile-nav nav .github-star-mobile { display: flex; margin-block: 12px 4px; }
198
+ .mobile-nav nav .github-button { padding-block: 4px; }
199
+ }
200
+ @media (max-width: 700px) {
201
+ .shell { width: calc(100% - 40px); }
202
+ .site-header { min-height: 74px; gap: 12px; }
203
+ .brand { gap: 9px; }
204
+ .brand-symbol { width: 42px; height: auto; }
205
+ .wordmark { font-size: 25px; }
206
+ .brand-type { gap: 4px; }
207
+ .brand-name { font-size: 10px; }
208
+ .header-actions { gap: 12px; }
209
+ .site-footer { margin-top: 37px; padding-top: 0; }
210
+ .footer-note { font-size: 13px; }
211
+ }
212
+ @media (max-width: 350px) { .header-actions > .search-link { display: none; } }
213
+ @media (prefers-reduced-motion: reduce) {
214
+ html { scroll-behavior: auto; }
215
+ *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; }
216
+ }
217
+
218
+ @font-face{font-family:'Public Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url('data:font/woff2;base64,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') format('woff2')}
219
+ :root{--mono:ui-monospace,SFMono-Regular,Consolas,monospace;--text-hero:36px;--text-section:20px;--text-ui:15px;--text-support:15px;--text-meta:13px;--success:#237347;--success-paper:#edf7f0;--success-line:#c4dfce}
220
+ *{box-sizing:border-box}body{background:var(--white)}button,input,select{font:inherit}button{cursor:pointer}button:disabled{cursor:default}:focus-visible{outline:2px solid var(--accent);outline-offset:4px}[hidden]{display:none!important}::selection{color:var(--ink);background:var(--selection)}
221
+ header,main,footer{width:min(calc(100% - 64px),920px);margin-inline:auto}header{min-height:74px;display:flex;align-items:center;gap:12px;border-bottom:1px solid var(--line)}.mark{display:grid;place-items:center;min-width:42px;height:34px;background:var(--brand-blue);border-bottom:3px solid var(--brand-yellow);border-radius:5px;color:var(--white);font-size:14px;font-weight:650;letter-spacing:-.5px}.brand{font-size:16px;font-weight:600;letter-spacing:-.2px}.repo-link{margin-left:auto;display:inline-flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid var(--line);border-radius:5px;color:var(--ink);font-size:var(--text-meta);font-weight:500;line-height:1.3;text-decoration:none}.repo-link:hover{background:var(--control-hover);color:var(--accent)}.repo-link svg{flex-shrink:0}
222
+ .intro{margin:32px 0}.intro h1{margin:0 0 12px;font-size:var(--text-hero);font-weight:650;line-height:1.2;letter-spacing:-.035em}.intro p{margin:0;color:var(--muted);font-size:var(--text-ui);line-height:1.7;max-width:70ch}
223
+ .builder{--step-gap:32px;display:grid;gap:var(--step-gap)}.builder>section{position:relative;padding-left:34px}.builder>section:not(:last-child)::before{content:"";position:absolute;left:10px;top:13px;width:2px;height:calc(100% + var(--step-gap));background:var(--line);pointer-events:none}.builder>section>.step-heading>.step-number{position:absolute;left:0;top:2px;z-index:1}.step-heading{display:flex;align-items:center;gap:10px;margin-bottom:12px}.step-heading h2{margin:0;font-size:var(--text-section);line-height:1.4;font-weight:600;letter-spacing:-.015em}.step-number{display:grid;place-items:center;width:22px;height:22px;background:var(--paper);border:1px solid var(--line);border-radius:50%;color:var(--muted);font:400 var(--text-meta)/1 var(--mono)}.step-hint{margin-left:auto;padding:3px 6px;border-radius:4px;color:var(--accent);font-size:var(--text-meta);line-height:1.4;font-weight:500}.step-hint[data-success=true]{color:var(--success);font-weight:600}
224
+ .tag-box{display:flex;flex-wrap:wrap;align-items:center;gap:8px;min-height:56px;padding:10px 12px;background:var(--white);border:1px solid var(--line);border-radius:7px}.tag-box:focus-within{outline:2px solid var(--accent);outline-offset:2px}.empty{padding:5px 1px;font-size:var(--text-ui);color:var(--muted)}.suggestions{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px;min-height:34px}.suggestion{padding:6px 11px;border:1px dashed var(--line);border-radius:5px;background:var(--white);color:var(--ink);font-size:var(--text-ui);line-height:1.4;font-weight:400}.suggestion:hover{border-color:var(--brand-blue);background:var(--control-hover);color:var(--accent)}.plus{color:var(--accent);margin-right:5px}
225
+ .tag{display:inline-flex;align-items:center;min-height:32px;overflow:hidden;border:1px solid var(--line);border-radius:5px;background:var(--control-hover);color:var(--ink);font-size:var(--text-ui);line-height:1.4;font-weight:500}.tag-label{padding:5px 10px}.remove{display:grid;place-items:center;align-self:stretch;width:26px;border:0;border-left:1px solid var(--line);background:transparent;color:inherit;font-size:16px;font-weight:400}.remove:hover{background:var(--control-hover)}
226
+ .tool-group{display:flex;gap:4px;min-height:54px;padding:4px;border:1px solid var(--line);border-radius:7px;background:var(--paper)}.tool-group .tool-scope{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;min-width:0;min-height:44px;padding:8px 28px 8px 13px;border:0;border-radius:5px;background:transparent;color:var(--ink);font-size:var(--text-ui);font-weight:500;line-height:1.4}.tool-group .tool-scope small{border-radius:3px;font-size:var(--text-meta);font-weight:400;line-height:1.5;color:var(--muted)}.tool-group .tool-scope:hover{background:var(--control-hover);color:var(--accent)}.tool-item.active .tool-scope{background:transparent;color:var(--accent);font-weight:600}.tool-item.active{box-shadow:inset 0 -2px 0 var(--brand-blue)}.tool-item{position:relative;display:flex;flex:1;min-width:0;border:1px solid var(--line);border-radius:5px;background:var(--control-hover)}.tool-item .tool-scope{width:100%}.tool-remove{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:grid;place-items:center;width:24px;height:30px;border:0;border-radius:4px;background:transparent;color:var(--muted);font-size:15px;opacity:.8}.tool-item.active .tool-remove{color:var(--muted)}.tool-remove:hover{background:var(--control-hover);opacity:1}.tool-item.active .tool-remove:hover{background:var(--control-hover);color:var(--accent)}
227
+ .mode-heading{display:flex;align-items:center;justify-content:space-between;margin:0 0 16px}.scope-label{display:inline-block;padding:3px 6px;margin-left:-6px;border-radius:4px;color:var(--muted);font-size:var(--text-support);line-height:1.5}.mode-placeholder{padding:20px;border:1px dashed var(--line);border-radius:7px;color:var(--muted);font-size:var(--text-support)}#mode-options{position:relative;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));margin:0 0 16px}#mode-options::before{content:"";position:absolute;top:13px;left:12.5%;right:12.5%;height:2px;background:var(--line)}.mode-option{position:relative;z-index:1;display:grid;grid-template-rows:20px auto;align-content:start;align-items:center;justify-items:center;gap:10px;padding:4px;text-align:center;font-size:var(--text-ui);font-weight:400;line-height:1.5;cursor:pointer}.mode-option input{appearance:none;position:relative;z-index:1;width:10px;height:10px;margin:0;border:0;border-radius:50%;background:var(--muted);cursor:pointer}.mode-option input:checked{width:18px;height:18px;border:3px solid var(--white);box-shadow:0 0 0 2px var(--brand-blue);background:var(--brand-blue)}.mode-option input:checked+span{color:var(--accent);font-weight:600}.mode-option:has(input:disabled){cursor:default}.notice{padding:0;margin:0 0 14px;color:var(--muted);font-size:var(--text-support);line-height:1.6}
228
+ .advanced{border-top:1px solid var(--line);padding-top:12px}.advanced summary{width:fit-content;color:var(--accent);font-size:var(--text-support);line-height:1.5;cursor:pointer}.editor{display:grid;grid-template-columns:140px minmax(0,1fr) minmax(0,1fr);gap:16px;align-items:end;margin-top:16px}.editor label{display:block;margin-bottom:7px;color:var(--muted);font-size:var(--text-support);line-height:1.4}.editor select{appearance:none;width:100%;min-width:0;height:42px;padding:0 32px 0 10px;border:1px solid var(--line);border-radius:5px;background:var(--white) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none'%3E%3Cpath d='m4 6 4 4 4-4' stroke='%2359657a' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat right 10px center/16px 16px;color:var(--ink);font-size:var(--text-ui)}.efforts{display:flex;gap:3px;align-items:center;min-height:42px;padding:3px;border:1px solid var(--line);border-radius:6px;background:var(--paper)}.efforts button{flex:1;min-height:32px;padding:5px;border:0;border-radius:4px;background:transparent;color:var(--muted);font-size:var(--text-support)}.efforts button[aria-pressed=true]{background:var(--control-hover);color:var(--accent);font-weight:600;box-shadow:inset 0 0 0 1px var(--brand-blue)}.unavailable{width:100%;text-align:center;color:var(--muted);font-size:var(--text-support)}.role-description{margin:10px 0 0;color:var(--muted);font-size:var(--text-support);line-height:1.6}
229
+ .output{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:12px 20px;padding:18px 20px;border:1px solid var(--line);border-radius:6px;background:var(--paper)}.output[data-ready=true]{border-color:var(--brand-blue)}.output strong{font-size:var(--text-ui);font-weight:600;line-height:1.5}.output p{margin:5px 0 0;color:var(--muted);font-size:var(--text-support);line-height:1.6}.output p:empty{display:none}.output p a{color:var(--accent);text-underline-offset:3px}.output[data-ready=false] .primary{background:var(--line);border-color:var(--line);color:var(--muted);opacity:1}.primary{white-space:nowrap}
230
+ footer{display:grid;gap:14px;margin-top:20px;padding:16px 0 24px;border-top:1px solid var(--line);color:var(--muted);font-size:var(--text-meta);line-height:1.6}.footer-row{display:flex;justify-content:space-between;align-items:baseline;gap:8px 24px;flex-wrap:wrap}.footer-attribution{font-size:var(--text-ui)}.footer-attribution nav{display:flex;align-items:baseline;gap:4px 10px;flex-wrap:wrap}.footer-attribution>span{color:var(--ink)}
231
+ @media(forced-colors:active){.tag,.suggestion{border-color:ButtonText}.tool-group .tool-scope[aria-pressed=true],.efforts button[aria-pressed=true]{outline:2px solid ButtonText;outline-offset:-3px}.mode-option input{appearance:auto}#mode-options::before{height:0;border-top:2px solid CanvasText}.editor select{appearance:auto;background-image:none}}
232
+
233
+ html{scrollbar-gutter:stable}body{overflow-anchor:none}
234
+ .suggestion.add-all{border-style:solid;background:var(--paper)}.suggestion.add-all:hover{background:var(--control-hover)}
235
+ .helper-option{display:inline-flex;align-items:stretch;border:1px dashed var(--line);border-radius:5px;background:var(--white)}.helper-option>.suggestion{border:0;background:transparent;border-radius:4px 0 0 4px;padding-right:5px}.helper-option:hover{border-color:var(--brand-blue);background:var(--control-hover)}.helper-option:hover>.suggestion{color:var(--accent)}
236
+ .helper-info{display:grid;place-items:center;align-self:stretch;flex-shrink:0;width:27px;min-height:28px;border:0;padding:0 5px;background:transparent;color:var(--accent);cursor:help;border-radius:4px}.helper-info:hover{background:var(--control-hover)}.info-dot{display:grid;place-items:center;width:16px;height:16px;border:1px solid currentColor;border-radius:50%;font-size:10px;line-height:1;font-weight:600}.tag .helper-info{margin-right:3px}.tag .tag-label{padding-right:4px}
237
+ .role-tooltip{position:fixed;z-index:1000;width:min(420px,calc(100vw - 32px));padding:16px;border:1px solid var(--line);border-radius:8px;background:var(--white);color:var(--ink);box-shadow:0 6px 15px #19283e07;opacity:0;transform:translateY(3px);transition:opacity 120ms ease,transform 120ms ease;view-transition-name:role-tooltip}.role-tooltip.visible{opacity:1;transform:none}.role-tooltip strong{font-size:14px;font-weight:600}.role-tooltip p{font-size:var(--text-ui);line-height:1.7;margin:9px 0 14px;color:var(--muted)}.role-tooltip .definition-label{font-size:var(--text-meta);font-weight:600;color:var(--muted);margin:0 0 7px}.role-tooltip pre{margin:0;padding:11px;border:1px solid var(--line);border-radius:5px;background:var(--paper);white-space:pre-wrap;font:var(--text-meta)/1.7 var(--mono)}.role-tooltip .definition-note{margin:10px 0 0;font-size:var(--text-meta)}
238
+ button,.helper-option{transition:background-color 120ms ease,border-color 120ms ease,color 120ms ease}
239
+ section[aria-labelledby=helpers-heading]{view-transition-name:step-helpers}section[aria-labelledby=tools-heading]{view-transition-name:step-tools}section[aria-labelledby=mode-heading]{view-transition-name:step-mode}section[aria-labelledby=setup-heading]{view-transition-name:step-setup}
240
+ #selected-helpers{view-transition-name:helpers-field}#helper-options{view-transition-name:helpers-catalog}#selected-tools{view-transition-name:tools-field}#tool-options{view-transition-name:tools-catalog}#mode-panel{view-transition-name:mode-panel}#mode-empty{view-transition-name:mode-empty}#editor{view-transition-name:model-editor}.output{view-transition-name:setup-output}footer{view-transition-name:setup-footer}
241
+ ::view-transition-group(*){animation-duration:180ms;animation-timing-function:cubic-bezier(.2,.75,.2,1)}::view-transition-old(*),::view-transition-new(*){width:100%;height:100%;object-fit:none;object-position:left top;animation-duration:140ms;animation-timing-function:ease}::view-transition-group(root),::view-transition-old(root),::view-transition-new(root){animation:none;mix-blend-mode:normal}
242
+ .tool-item,.scope-all{view-transition-class:tool-choice}::view-transition-image-pair(.tool-choice){overflow:clip}::view-transition-old(.tool-choice),::view-transition-new(.tool-choice){object-position:center}
243
+ @media(prefers-reduced-motion:reduce){button,.helper-option,.role-tooltip{transition:none}.role-tooltip{transform:none}::view-transition-group(*),::view-transition-old(*),::view-transition-new(*){animation:none!important}}
244
+
245
+
246
+ .editor-head,.editor-row{display:grid;grid-template-columns:156px minmax(0,1fr) minmax(0,1fr);gap:16px;align-items:center}
247
+ .editor-head{margin-top:16px;padding-bottom:9px;color:var(--muted);font-size:var(--text-support);line-height:1.4}
248
+ .editor-row{margin-top:0;padding:11px 0;border-top:1px solid var(--line)}
249
+ .editor-name{display:flex;align-items:center;gap:6px;font-size:var(--text-ui);font-weight:500;line-height:1.4;min-width:0}.editor-name .helper-info{width:24px;min-height:26px}
250
+
251
+
252
+ .advanced h3{margin:0 0 12px;font-size:var(--text-ui);font-weight:600;line-height:1.5;color:var(--ink)}
253
+ .concurrency{margin-top:16px;padding-top:12px;border-top:1px solid var(--line)}.concurrency-row{display:flex;align-items:center;justify-content:space-between;gap:16px}.concurrency label{color:var(--ink);font-size:var(--text-ui);font-weight:400;line-height:1.5}.concurrency-stepper{display:inline-flex;flex-shrink:0;align-items:stretch;border:1px solid var(--line);border-radius:5px;background:var(--paper)}.concurrency-stepper button{display:grid;place-items:center;width:42px;min-height:42px;padding:0;border:0;border-radius:4px;background:transparent;color:var(--ink);font-size:var(--text-ui);font-weight:400;line-height:1.5}.concurrency-stepper button:hover:not(:disabled){background:var(--control-hover);color:var(--accent)}.concurrency-stepper button:disabled{color:var(--muted);opacity:.4}.concurrency input{appearance:textfield;width:56px;min-width:0;margin:0;padding:8px 4px;border:0;border-inline:1px solid var(--line);border-radius:0;background:var(--white);color:var(--ink);font:inherit;font-size:var(--text-ui);font-weight:400;line-height:1.5;font-variant-numeric:tabular-nums;text-align:center}.concurrency input::-webkit-inner-spin-button,.concurrency input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.concurrency input:focus-visible{outline-offset:-2px}.concurrency input[aria-invalid=true]{box-shadow:inset 0 0 0 1px var(--amber)}.concurrency .field-error{margin:8px 0 0;color:var(--muted);font-size:var(--text-support);line-height:1.6}.concurrency .field-error{color:var(--ink)}.setup-result{display:contents}.setup-result>[aria-live]{grid-column:1;grid-row:1;min-width:0}.output>.primary{grid-column:2;grid-row:1;align-self:start}#copy-feedback{grid-column:1/-1;grid-row:3}.setup-command{grid-column:1/-1;grid-row:2;display:block;width:100%;min-width:0;margin-top:0;padding:9px 10px;border:1px solid var(--line);border-radius:5px;background:var(--white);color:var(--ink);font:var(--text-meta)/1.7 var(--mono);field-sizing:content;white-space:pre-wrap;overflow-wrap:anywhere;overflow:hidden;resize:none}.quiet-button{margin-left:6px;padding:1px 8px;border:1px solid var(--line);border-radius:4px;background:transparent;color:var(--muted);font-size:var(--text-meta);line-height:1.5}.quiet-button:hover{background:var(--control-hover);color:var(--accent)}.show-settings{display:inline-flex;align-items:center;flex-wrap:wrap;gap:0 2px}.show-settings code:not([hidden]){flex-basis:100%;margin-top:4px;font-family:var(--mono);color:var(--ink);overflow-wrap:anywhere;user-select:all}.setup-footer{display:flex;align-items:baseline;justify-content:space-between;gap:16px;margin-top:9px}.setup-footer .release-status{margin:0}.release-status{margin:9px 0 0;color:var(--muted);font-size:var(--text-meta);line-height:1.5}.model-control{min-width:0}.custom-model{display:block;width:100%;margin-top:7px;padding:8px 10px;border:1px solid var(--line);border-radius:5px;background:var(--white);color:var(--ink);font-size:var(--text-ui)}.custom-model[aria-invalid=true]{border-color:var(--amber)}
254
+
255
+
256
+ #selected-tools[hidden]+#tool-options{margin-top:0}
257
+
258
+ .tool-group .empty{align-self:center;padding:8px 9px}
259
+ .tool-group.is-empty{min-height:56px;padding:10px 12px;background:var(--white)}.tool-group.is-empty .empty{padding:5px 1px}
260
+ .top-models{margin-top:14px}.top-models [role=switch]{display:inline-flex;align-items:center;gap:10px;padding:2px 0;border:0;background:transparent;color:var(--ink);font-size:var(--text-ui);text-align:left;cursor:pointer}.switch-track{position:relative;flex-shrink:0;width:34px;height:20px;border-radius:10px;background:var(--line);transition:background-color .15s}.switch-track::before{content:'';position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:var(--white);box-shadow:0 1px 2px rgba(0,0,0,.25);transition:transform .15s}.top-models [aria-checked=true] .switch-track,.top-models [data-mixed] .switch-track{background:var(--accent)}.top-models [aria-checked=true] .switch-track::before{transform:translateX(14px)}.top-models [data-mixed] .switch-track::before{transform:translateX(7px)}@media(forced-colors:active){.switch-track{border:1px solid ButtonText}.switch-track::before{background:ButtonText;box-shadow:none}}
261
+ .tool-group>.scope-all{padding:8px 13px}.tool-group>.scope-all[aria-pressed=true]{background:var(--control-hover);color:var(--accent);font-weight:600;box-shadow:inset 0 -2px 0 var(--brand-blue)}
262
+
263
+ .reset-form{padding:4px 0;border:0;background:transparent;color:var(--muted);font-size:var(--text-support);text-decoration:underline;text-underline-offset:3px}.reset-form:hover{color:var(--accent)}.intro .link-error{margin-top:12px;color:var(--amber);font-size:var(--text-support)}.builder>section[data-complete=true]>.step-heading>.step-number{background:var(--success-paper);border-color:var(--success-line);color:var(--success);font-size:14px;font-weight:600}.builder>section[data-complete=true]::before{background:var(--success-line)}
264
+
265
+ .how-it-works{margin-top:18px;border:1px solid var(--line);border-radius:7px;background:var(--paper);interpolate-size:allow-keywords}.how-it-works summary{padding:14px 16px;color:var(--accent);font-size:var(--text-ui);font-weight:500;line-height:1.5;cursor:pointer}.how-it-works summary:hover{background:var(--control-hover);border-radius:6px}.how-it-works::details-content{height:0;overflow:hidden;opacity:0;transition:height 200ms ease,opacity 180ms ease,content-visibility 200ms allow-discrete}.how-it-works[open]::details-content{height:auto;opacity:1}.how-it-works .explanation{padding:2px 16px 18px;display:grid;gap:14px}.intro .how-it-works p{max-width:70ch;font-size:var(--text-ui);line-height:1.7}.how-it-works strong{color:var(--ink);font-weight:600}@media(prefers-reduced-motion:reduce){.how-it-works::details-content{transition:none}}
266
+ @media(max-width:600px){header,main,footer{width:calc(100% - 32px)}.intro h1{font-size:30px}.step-heading{flex-wrap:wrap;gap:6px 10px}.step-hint{flex-basis:100%;margin-left:0;padding-left:0}.output{grid-template-columns:minmax(0,1fr);padding:16px}.output>.primary{grid-column:1;grid-row:2;justify-self:start}.setup-command{grid-row:3}#copy-feedback{grid-row:4}.editor-head{display:none}.editor-row{grid-template-columns:minmax(0,1fr);gap:10px;padding:16px 0}.editor-name{font-weight:600}.tool-group{flex-wrap:wrap}.tool-item{flex-basis:calc(50% - 4px)}.tool-group>.scope-all{flex-basis:100%}.tool-group .tool-scope{padding-left:8px;padding-right:24px}.mode-option{font-size:var(--text-meta);gap:12px}.brand{font-size:15px}header{gap:9px}footer{gap:14px}}
267
+ </style></head><body>
268
+ <header><span class="mark" aria-hidden="true">apk</span><span class="brand">Agent Policy Kit</span><a class="repo-link" href="https://github.com/automatis-tools/agent-policy-kit" target="_blank" rel="noopener noreferrer" aria-label="Agent Policy Kit on GitHub"><svg viewBox="0 0 16 16" width="16" height="16" aria-hidden="true" focusable="false"><path fill="currentColor" d="M8 0c4.42 0 8 3.58 8 8a8.013 8.013 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27-.68 0-1.36.09-2 .27-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8Z"/></svg><span>GitHub</span></a></header>
269
+ <main>
270
+ <div class="intro"><h1>Set up subagents for your coding tools.</h1><p>Choose roles, models and effort. Apply your setup locally with one command.</p><details class="how-it-works"><summary>How it works and why you need it</summary><div class="explanation">
271
+ <p>Coding agents can delegate specific tasks to temporary subagents. Those tasks vary in complexity and importance. A single model for every task is rarely the best balance of capability, speed and cost.</p>
272
+ <p>Agent Policy Kit lets you match subagent roles with models and effort. It configures your coding tools’ native environment, then exits. The main agent still decides when to delegate, and its model stays unchanged.</p>
273
+ </div></details><p class="link-error" id="link-error" role="status" hidden></p></div>
274
+ <div class="builder">
275
+ <section aria-labelledby="helpers-heading"><div class="step-heading"><span class="step-number">1</span><h2 id="helpers-heading" tabindex="-1">Subagent roles</h2></div><div class="tag-box" id="selected-helpers" role="group" aria-label="Selected subagent roles"></div><div class="suggestions" id="helper-options" role="group" aria-label="Available subagent roles"></div></section>
276
+ <section aria-labelledby="tools-heading"><div class="step-heading"><span class="step-number">2</span><h2 id="tools-heading" tabindex="-1">Coding tools</h2></div><div class="tool-group" id="selected-tools" role="group" aria-label="Selected coding tools"></div><div class="suggestions" id="tool-options" role="group" aria-label="Available coding tools"></div></section>
277
+ <section aria-labelledby="mode-heading"><div class="step-heading"><span class="step-number">3</span><h2 id="mode-heading" tabindex="-1">Work mode</h2></div><div id="mode-empty" class="mode-placeholder">Choose subagent roles and coding tools above.</div><div id="mode-panel" hidden><div class="mode-heading"><span class="scope-label" id="scope-label">All selected tools</span></div><div id="mode-options" role="radiogroup" aria-label="Work mode"></div><p class="notice" id="mode-notice" hidden></p><div class="top-models" id="top-models" hidden><button type="button" role="switch" id="top-models-toggle" aria-checked="false"><span class="switch-track" aria-hidden="true"></span><span id="top-models-label">Use top models for code, review and tests</span></button></div><section class="advanced" id="advanced" aria-label="Models and effort"><h3>Models &amp; effort</h3><div id="editor"></div><div class="concurrency" id="concurrency-panel" hidden><h3>Parallel subagents</h3><div class="concurrency-row"><label for="max-concurrent" id="concurrency-label">Max per session</label><div class="concurrency-stepper" role="group" aria-label="Maximum concurrent subagents"><button id="decrease-concurrency" type="button" aria-label="Decrease maximum concurrent subagents">−</button><input id="max-concurrent" type="number" min="1" max="32" step="1" value="3" inputmode="numeric" aria-describedby="concurrency-error"><button id="increase-concurrency" type="button" aria-label="Increase maximum concurrent subagents">+</button></div></div><p class="field-error" id="concurrency-error" role="status" hidden>Enter a whole number from 1 to 32.</p></div></section></div></section>
278
+
279
+ <section aria-labelledby="setup-heading"><div class="step-heading"><span class="step-number">4</span><h2 id="setup-heading">Copy setup command</h2><span class="step-hint" id="step-hint-4" role="status" aria-live="polite" aria-atomic="true" hidden></span></div><div class="output" data-ready="false"><div class="setup-result"><div aria-live="polite" aria-atomic="true"><strong id="setup-summary">Complete the steps above.</strong><p id="setup-description">Choose a subagent role in step 1 and a coding tool in step 2.</p></div><textarea class="setup-command" id="setup-command" readonly aria-label="Setup command" wrap="soft" rows="1" hidden></textarea><p id="copy-feedback" role="status" hidden></p></div><button class="button primary" id="copy" type="button" aria-describedby="setup-description" disabled>Copy command</button></div><div class="setup-footer"><p class="release-status" id="release-status"></p><button type="button" class="reset-form" id="reset-form">Reset form</button></div></section>
280
+ </div>
281
+ </main>
282
+ <div id="role-tooltip" class="role-tooltip" role="tooltip" hidden></div>
283
+ <footer><div class="footer-row footer-details"><span class="show-settings">Check current settings <button type="button" class="quiet-button" id="copy-show" aria-label="Copy the command that shows current settings">Copy</button><code id="show-command" hidden></code></span><span><a id="agent-guide">AI installation guide</a> · <a id="release-notes">Release notes</a></span></div><div class="footer-row footer-attribution"><span>Created by <a rel="author" href="https://www.linkedin.com/in/nick-maximenko/">Mykola Maksymenko</a></span><nav aria-label="Related projects"><span>More tools:</span><a href="https://github.com/automatis-tools/agents-can-communicate">Agents Can Communicate</a> <a href="https://github.com/automatis-tools/automatis-skills">Automatis Skills</a></nav></div></footer>
284
+ <script>
285
+ 'use strict';
286
+ const RELEASE = {"schemaVersion":1,"version":"0.2.0","preset":"balanced","presets":[{"id":"fast","label":"Light","description":"Light models for every role. Limits last longest.","preferences":{"schemaVersion":1,"maxConcurrent":2,"clients":{"codex":{"code":{"model":"gpt-6-luna","effort":"medium"},"light":{"model":"gpt-6-luna","effort":"low"},"roles":{"reviewer":{"model":"gpt-6-luna","effort":"high"},"tester":{"model":"gpt-6-luna","effort":"high"}},"avoidModels":[]},"claude":{"code":{"model":"claude-haiku-5-5","effort":"medium"},"light":{"model":"claude-haiku-5-5","effort":"low"},"roles":{"reviewer":{"model":"claude-haiku-5-5","effort":"high"},"tester":{"model":"claude-haiku-5-5","effort":"high"}},"avoidModels":[]},"kimi":{"code":{"model":"kimi-code/kimi-for-coding","effort":"low"},"light":{"model":"kimi-code/kimi-for-coding","effort":"low"},"avoidModels":[]},"agy":{"code":{"model":"flash","effort":null},"light":{"model":"flash_lite","effort":null},"avoidModels":[]},"grok":{"code":{"model":"grok-build-0.1","effort":null},"light":{"model":"grok-build-0.1","effort":null},"avoidModels":[]}}}},{"id":"balanced","label":"Standard","description":"Stronger models for code, review, tests and docs. Fits most plans.","preferences":{"schemaVersion":1,"maxConcurrent":3,"clients":{"codex":{"code":{"model":"gpt-6.1-sol","effort":"medium"},"light":{"model":"gpt-6-luna","effort":"low"},"roles":{"reviewer":{"model":"gpt-6.1-sol","effort":"high"},"explorer":{"model":"gpt-6-luna","effort":"high"},"tester":{"model":"gpt-6.1-sol","effort":"high"},"writer":{"model":"gpt-6.1-sol","effort":"medium"}},"avoidModels":[]},"claude":{"code":{"model":"claude-sonnet-5-5","effort":"medium"},"light":{"model":"claude-haiku-5-5","effort":"low"},"roles":{"reviewer":{"model":"claude-sonnet-5-5","effort":"high"},"explorer":{"model":"claude-haiku-5-5","effort":"medium"},"tester":{"model":"claude-sonnet-5-5","effort":"high"},"writer":{"model":"claude-sonnet-5-5","effort":"medium"}},"avoidModels":[]},"kimi":{"code":{"model":"kimi-code/k3-256k","effort":"high"},"light":{"model":"kimi-code/kimi-for-coding","effort":"low"},"roles":{"writer":{"model":"kimi-code/k3-256k","effort":"high"}},"avoidModels":[]},"agy":{"code":{"model":"pro","effort":null},"light":{"model":"flash_lite","effort":null},"roles":{"explorer":{"model":"flash","effort":null},"writer":{"model":"flash","effort":null}},"avoidModels":[]},"grok":{"code":{"model":"grok-4.7","effort":null},"light":{"model":"grok-build-0.1","effort":null},"roles":{"writer":{"model":"grok-4.7","effort":null}},"avoidModels":[]}}}},{"id":"quality","label":"Top-tier","description":"High-end models for most roles. Uses limits fastest.","topModels":{"codex":"gpt-6-astra","claude":"claude-fable-5-1","kimi":"kimi-code/k3.1-pro"},"preferences":{"schemaVersion":1,"maxConcurrent":2,"clients":{"codex":{"code":{"model":"gpt-6.1-sol","effort":"high"},"light":{"model":"gpt-6.1-sol","effort":"medium"},"roles":{"explorer":{"model":"gpt-6.1-sol","effort":"high"},"writer":{"model":"gpt-6.1-sol","effort":"high"}},"avoidModels":[]},"claude":{"code":{"model":"claude-opus-5-5","effort":"high"},"light":{"model":"claude-sonnet-5-5","effort":"medium"},"roles":{"explorer":{"model":"claude-opus-5-5","effort":"high"},"writer":{"model":"claude-opus-5-5","effort":"high"}},"avoidModels":[]},"kimi":{"code":{"model":"kimi-code/k3","effort":"high"},"light":{"model":"kimi-code/kimi-for-coding","effort":"high"},"roles":{"explorer":{"model":"kimi-code/k3","effort":"high"},"writer":{"model":"kimi-code/k3","effort":"high"}},"avoidModels":[]},"agy":{"code":{"model":"pro","effort":null},"light":{"model":"flash","effort":null},"roles":{"explorer":{"model":"pro","effort":null},"writer":{"model":"pro","effort":null}},"avoidModels":[]},"grok":{"code":{"model":"grok-4.7","effort":null},"light":{"model":"grok-build-0.1","effort":null},"roles":{"explorer":{"model":"grok-4.7","effort":null},"writer":{"model":"grok-4.7","effort":null}},"avoidModels":[]}}}}],"catalogReviewedAt":"2026-10-30","preferencesHash":"8f000dfb78f5a5fd583ae10e26f3cb79c1e306de8680dddb16198cdd20fc61df","notes":"# Changelog\n\nEach npm version is one configuration release: its presets, native role definitions, instructions and configuration page. Published versions are not rewritten. Applying another release is explicit; package installation alone changes no settings.\n\n## 0.2.0 — 2026-11-01\n\n### Why this release\n\nSubagents draw on the same plan limits as the main session, and every parallel session adds to that usage. Without explicit choices, subagents can inherit the most expensive model and use up a weekly limit within days. This release names the work modes by how much of a plan subagents may use, adds per-tool parallel limits, a read-only settings check and Grok Build support.\n\n### Who should update\n\nAnyone who wants Grok Build roles, per-tool parallel limits or the renamed modes. Re-running setup with 0.2.0 applies the new preset values: Top-tier now uses Opus 5.5, GPT-6.1 Sol and K3 at high effort, with top models behind an opt-in switch, and Kimi's Standard Docs writer uses K3 256K. Installations of 0.1.0 keep working unchanged until setup is run again.\n\n### Migration and rollback\n\nPreset ids (`fast`, `balanced`, `quality`), receipt format v4 and ownership, drift and rollback behavior are unchanged. Version 1 share links still open; new links use version 2 and carry each tool's parallel limit. Applying 0.1.0 again restores its owned settings, as the synthetic upgrade/downgrade gate verifies. Grok Build is new, so it has nothing to migrate.\n\n### Presets and model catalog\n\nThe model catalog snapshot is dated 2026-10-30; Grok Build entries were checked on 2026-11-01 against the Grok Build 1.0.70 user guide and the xAI model list. An independent audit compared every preset, tool and role with the catalog and the documentation tables, and a test now keeps those tables in sync. Configuration checks are not model-quality evaluations.\n\n### What changed\n\n- Add Grok Build as a fifth coding tool, listed after Antigravity. APK writes `agents/apk-\u003crole>.md` role files (Reviewer and Code explorer use the read-only `permission_mode: plan`), per-role models and a `general-purpose` fallback copied from the first selected role (the Coder when selected) in `config.toml` `[subagents.models]`, a native `[subagents] max_concurrent` cap and a delegation block in `AGENTS.md` under `$GROK_HOME` (default `~/.grok`). Per-role effort is not configurable, so every Grok choice has effort null and the page shows no effort controls. Presets use Grok Build 0.1, xAI's fast coding model, for light work and Grok 4.7 for stronger roles; Grok 4.6 and 4.5 stay available in Custom. Explicit commands use `--grok`, `--grok-max-concurrent` and `--avoid-grok`. Removal restores the original settings and refuses on local edits.\n\n- Rename work modes to Light, Standard and Top-tier and describe them by how much of a plan's limits subagents use. Preset ids and share-link ids are unchanged. Top-tier now uses Opus 5.5, GPT-6.1 Sol and K3 at high effort for code, review and tests. A per-tool switch under Top-tier opts those roles into Fable 5.1, GPT-6 Astra or K3.1 Pro; it is off by default. Top models no longer run at xhigh/max, because native default subagent settings copy the first selected role (the Coder when selected) to subagents started without a named role.\n\n- Explain each configuration step with a short ? note, and stop repeating vendor billing or version documentation in the work-mode notice.\n\n- Start a fresh or reset form with every subagent role selected, and give the empty coding-tool field the same appearance as the empty role field.\n\n- Automatically deploy the latest website from verified main while preserving exact tagged release pages and older share links. Configuration guards keep commands pinned to published package capabilities; npm releases remain explicit.\n\n- Credit Mykola Maksymenko in the configuration page and package metadata. Link the supplied LinkedIn profile and related projects, with static author/project structured data and a release-specific canonical URL.\n\n- Interactive terminals get readable setup, doctor, release and show output; captured output keeps the existing JSON contract, and `--json` forces JSON.\n\n- `agent-policy show` reads the current user-level subagent settings of every tool, before or after APK installation, without writing files. The page footer offers it as \"Check current settings\" with a copy button.\n\n- Each tool has its own parallel limit from 1 to 32, set in its details on the page or with `--TOOL-max-concurrent`; policies accept `clients[tool].maxConcurrent`.\n\n- The page adds Add all for roles and tools, a GitHub link in the header, Reset form beside the release line, and preset switching for a single selected tool without a needless confirmation.\n\n## 0.1.0 — 2026-10-30\n\n### Why this release\n\nUse a common approach to optional delegation across Codex, Claude Code, Kimi and Antigravity, without an extra process in normal agent operation. Configure once and remove the installer afterward.\n\n### What it configures\n\nSix focused roles cover implementation, read-only review, code discovery, test creation, documentation and prescribed execution. Each preset assigns a model and supported effort to every role; the [preset matrix](docs/model-catalog.md#how-the-presets-are-designed) explains the choices.\n\nThese are starting preferences, not model-quality benchmarks. Native model formats and alias behavior were reviewed against the official sources linked in [support](docs/compatibility.md) and [model maintenance](docs/model-updates.md). Model availability must be checked before applying. Provider aliases and tiers may resolve differently over time.\n\n### Presets and model catalog\n\nAll three presets were rebuilt for public use. Personal Astra/Opus/Fable and other avoid lists were removed. Fast gives review and testing more reasoning than simple execution. Balanced separates implementation, verification, discovery, documentation and mechanics. Quality uses Astra/Fable for demanding work and regular K3.1 Pro at max for Kimi code/review/tests. Claude recommendations pin current versioned IDs; Kimi Balanced uses the quota-conscious K3 256K variant. These are editable recommendations, not benchmark results.\n\nThe release contains a dated model/effort catalog from official documentation and native selector observations, including native-default effort and account-dependent availability. Antigravity role choices are native tiers, with no invented per-role effort setting.\n\nCatalog audit, 2026-10-30 UTC: Kimi now lists all six current models, including K3.1 Pro and Pro Highspeed. Quality first now uses regular K3.1 Pro at max effort for implementation/review/tests; other roles have separate choices described in the preset matrix. Highspeed remains optional because its faster output consumes about twice regular Pro's quota, according to Kimi. Setup requires provisioned access and does not silently fall back to another model.\n\nBoth Pro variants require compatible thinking settings. Even with unpinned effort, setup refuses an explicit thinking-disabled setting without modifying it.\n\nCodex effort choices/defaults now follow CLI 0.166.0 rather than API defaults; API metadata remains separate, and Ultra stays separate from ordinary effort. Claude Opus 4.5 no longer advertises an API-only native effort override. Existing custom inputs using levels outside the current native catalog require review before reapplication; owned inspection/removal remains independent of current recommendations. Sonnet 4.5 remains selectable with its Anthropic deprecation status marked. Antigravity CLI's four tier choices are unchanged.\n\n### What changed\n\n- Added Test writer and Docs writer; clarified Code explorer and Task runner. Old four-role native v2/v3 receipts remain supported, including explicit expansion to six, owned removal, drift refusal and late rollback. New v4 snapshots support six independently configured Kimi aliases.\n\n- Readable type uses a compact 36/20/15/13 px scale with more spacing; narrow layouts stack model controls and command actions.\n- A short collapsible explanation introduces role-specific models, native setup and optional delegation, using the same wording as the README.\n- The builder now starts with no roles, tools or chosen modes. Green checks track completed selections and successful copy, and Reset form restores a blank state. URL fragments restore visible settings without a backend. Conditional section hints and changed step markers use a two-second highlight hold plus two-second fade, respecting reduced motion. Selection controls share a soft treatment; Copy remains the primary action.\n- Page commands always list every selected role/model/effort under its tool, including presets. Explicit --roles, --max-concurrent and optional --avoid-TOOL preserve the existing selection, cap and guidance. :native represents unpinned effort; Antigravity remains tier-only. The shared codec validates complete role maps and rejects duplicate/mixed input before writes. Legacy release/config/policy inputs remain supported.\n- The four-step page now selects subagent roles and coding tools before mode/model/effort configuration. It generates and copies a real pinned command. Tool additions preserve All or a manually selected view. Role help uses the same prompt definitions as native generation.\n- Optional selectedRoles creates only the requested native roles. Receipt v4 binds that role set to owned files and supports safe expansion, reduction and removal. Earlier v2/v3 native receipts retain their historical four-role ownership boundary. Unselected Kimi aliases do not need provisioning or effort pins.\n- Native role files and routing instructions apply only when the main agent chooses delegation. Main models and disabled delegation features are preserved.\n- A static page lets each tool use its own mode and per-task models/effort. All shows mixed settings as Custom and can apply one preset to every tool. Scope warnings protect individual and global replacements; the page generates one pinned command.\n- Explicit release application supports safe upgrade/downgrade of owned settings; per-client receipts record the actual applied version and custom choices.\n- Ownership/drift checks, private backups and rollback preserve unrelated settings and earlier user values.\n- No custom hooks, proxy, plugin, launcher, daemon or normal-operation runtime is installed.\n\n### Who should use it\n\nPeople who want consistent subagent preferences across their installed coding tools. You can keep the recommendations or select different native models in the configuration page.\n\n### Applying this version\n\n```sh\nnpx --yes --ignore-scripts --package agent-policy-kit@0.1.0 agent-policy setup --release --apply\n```\n\nWithout --apply the same command previews the changes. The page-generated explicit tool arguments apply the visible choices using this release's native templates. See [release usage](docs/releases.md).\n\n### Migration and limits\n\nThis is the first public release. Synthetic versions in tests are not real releases. Experimental runtime receipts from older development commits require their original owned removal. Supported native snapshot formats can be updated safely; unknown future formats/layouts are refused.\n\nKimi/Antigravity concurrency guidance and native tier/precedence limits remain explicit. A pinned release reproduces declared configuration, not provider weights, entitlement or model quality.\n","packageSpec":"agent-policy-kit@0.2.0","preferences":{"schemaVersion":1,"maxConcurrent":3,"clients":{"codex":{"code":{"model":"gpt-6.1-sol","effort":"medium"},"light":{"model":"gpt-6-luna","effort":"low"},"roles":{"reviewer":{"model":"gpt-6.1-sol","effort":"high"},"explorer":{"model":"gpt-6-luna","effort":"high"},"tester":{"model":"gpt-6.1-sol","effort":"high"},"writer":{"model":"gpt-6.1-sol","effort":"medium"}},"avoidModels":[]},"claude":{"code":{"model":"claude-sonnet-5-5","effort":"medium"},"light":{"model":"claude-haiku-5-5","effort":"low"},"roles":{"reviewer":{"model":"claude-sonnet-5-5","effort":"high"},"explorer":{"model":"claude-haiku-5-5","effort":"medium"},"tester":{"model":"claude-sonnet-5-5","effort":"high"},"writer":{"model":"claude-sonnet-5-5","effort":"medium"}},"avoidModels":[]},"kimi":{"code":{"model":"kimi-code/k3-256k","effort":"high"},"light":{"model":"kimi-code/kimi-for-coding","effort":"low"},"roles":{"writer":{"model":"kimi-code/k3-256k","effort":"high"}},"avoidModels":[]},"agy":{"code":{"model":"pro","effort":null},"light":{"model":"flash_lite","effort":null},"roles":{"explorer":{"model":"flash","effort":null},"writer":{"model":"flash","effort":null}},"avoidModels":[]},"grok":{"code":{"model":"grok-4.7","effort":null},"light":{"model":"grok-build-0.1","effort":null},"roles":{"writer":{"model":"grok-4.7","effort":null}},"avoidModels":[]}}},"hostedReleases":[],"catalog":{"schemaVersion":1,"reviewedAt":"2026-10-30","scope":"Documented/native coding-tool selectors at this release; account access and custom deployment IDs vary.","clients":{"codex":{"label":"Codex","efforts":["none","minimal","low","medium","high","xhigh","max"],"observedClientVersion":"0.166.0","observation":"codex debug models --bundled: 9 visible selectors; 3 hidden specialized/utility entries excluded","models":[{"id":"gpt-6-astra","label":"GPT-6 Astra","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"low","source":"https://developers.openai.com/api/docs/models/gpt-6-astra","kind":"model","apiEfforts":["low","medium","high","xhigh","max"],"apiDefaultEffort":null,"nativeSource":"https://learn.chatgpt.com/docs/models","delegationModes":["ultra"]},{"id":"gpt-6.1-sol","label":"GPT-6.1 Sol","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"low","source":"https://developers.openai.com/api/docs/models/gpt-6.1-sol","kind":"model","apiEfforts":["low","medium","high","xhigh","max"],"apiDefaultEffort":"medium","nativeSource":"https://learn.chatgpt.com/docs/models","delegationModes":["ultra"]},{"id":"gpt-6.1-terra","label":"GPT-6.1 Terra","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"low","source":"https://developers.openai.com/api/docs/models/gpt-6.1-terra","kind":"model","apiEfforts":["none","low","medium","high","xhigh","max"],"apiDefaultEffort":"medium","nativeSource":"https://learn.chatgpt.com/docs/models","delegationModes":["ultra"]},{"id":"gpt-6-sol","label":"GPT-6 Sol","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"medium","source":"https://developers.openai.com/api/docs/models/gpt-6-sol","kind":"model","apiEfforts":["none","low","medium","high","xhigh","max"],"apiDefaultEffort":"medium","nativeSource":"https://learn.chatgpt.com/docs/models","delegationModes":["ultra"]},{"id":"gpt-6-luna","label":"GPT-6 Luna","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"medium","source":"https://developers.openai.com/api/docs/models/gpt-6-luna","kind":"model","apiEfforts":["none","low","medium","high","xhigh","max"],"apiDefaultEffort":"medium","nativeSource":"https://learn.chatgpt.com/docs/models"},{"id":"gpt-5.6-sol","label":"GPT-5.6 Sol","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"low","source":"https://developers.openai.com/api/docs/models/gpt-5.6-sol","kind":"model","apiEfforts":["none","low","medium","high","xhigh","max"],"apiDefaultEffort":"medium","nativeSource":"https://learn.chatgpt.com/docs/models","delegationModes":["ultra"]},{"id":"gpt-5.6-terra","label":"GPT-5.6 Terra","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"medium","source":"https://developers.openai.com/api/docs/models/gpt-5.6-terra","kind":"model","apiEfforts":["none","low","medium","high","xhigh","max"],"apiDefaultEffort":"medium","nativeSource":"https://learn.chatgpt.com/docs/models","delegationModes":["ultra"]},{"id":"gpt-5.6-luna","label":"GPT-5.6 Luna","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"medium","source":"https://developers.openai.com/api/docs/models/gpt-5.6-luna","kind":"model","apiEfforts":["none","low","medium","high","xhigh","max"],"apiDefaultEffort":"medium","nativeSource":"https://learn.chatgpt.com/docs/models"},{"id":"gpt-5.5","label":"GPT-5.5","efforts":["low","medium","high","xhigh"],"defaultEffort":"medium","source":"https://developers.openai.com/api/docs/models/gpt-5.5","kind":"model","apiEfforts":["none","low","medium","high","xhigh"],"apiDefaultEffort":"medium","nativeSource":"https://learn.chatgpt.com/docs/models"}],"excluded":[{"id":"gpt-daybreak-blue-latest","reason":"hidden specialized selector"},{"id":"gpt-daybreak-red-latest","reason":"hidden specialized selector"},{"id":"codex-auto-review","reason":"hidden internal utility selector"}],"note":"Efforts and defaults follow the bundled Codex CLI 0.166.0 catalog. API capabilities are separate apiEfforts/apiDefaultEffort metadata. Ultra is a delegating execution mode, recorded separately and not offered as ordinary subagent effort. An API-supported level absent from the native catalog is unverified for manual per-role configuration, not proven runtime-rejected."},"claude":{"label":"Claude Code","efforts":["low","medium","high","xhigh","max"],"observedClientVersion":"2.1.312","models":[{"id":"sonnet","label":"Sonnet (alias)","efforts":["low","medium","high","xhigh","max"],"defaultEffort":null,"source":"https://code.claude.com/docs/en/model-config","kind":"alias","effortResolution":"Depends on the resolved model and provider; requested levels can be clamped or ignored by Claude Code."},{"id":"opus","label":"Opus (alias)","efforts":["low","medium","high","xhigh","max"],"defaultEffort":null,"source":"https://code.claude.com/docs/en/model-config","kind":"alias","effortResolution":"Depends on the resolved model and provider; requested levels can be clamped or ignored by Claude Code."},{"id":"haiku","label":"Haiku (alias)","efforts":["low","medium","high","xhigh","max"],"defaultEffort":null,"source":"https://code.claude.com/docs/en/model-config","kind":"alias","effortResolution":"Depends on the resolved model and provider; requested levels can be clamped or ignored by Claude Code."},{"id":"fable","label":"Fable (alias)","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"high","source":"https://code.claude.com/docs/en/sub-agents#choose-a-model","kind":"alias","effortResolution":"Depends on the resolved model and provider; requested levels can be clamped or ignored by Claude Code."},{"id":"claude-fable-5-1","label":"Fable 5.1","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"high","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-opus-5-5","label":"Opus 5.5","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"medium","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-sonnet-5-5","label":"Sonnet 5.5","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"medium","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-haiku-5-5","label":"Haiku 5.5","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"medium","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-fable-5","label":"Fable 5","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"high","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-opus-5","label":"Opus 5","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"high","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-sonnet-5","label":"Sonnet 5","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"high","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-opus-4-8","label":"Opus 4.8","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"high","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-opus-4-7","label":"Opus 4.7","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"xhigh","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-opus-4-6","label":"Opus 4.6","efforts":["low","medium","high","max"],"defaultEffort":"high","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-sonnet-4-6","label":"Sonnet 4.6","efforts":["low","medium","high","max"],"defaultEffort":"high","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-opus-4-5-20251101","label":"Opus 4.5","efforts":[],"defaultEffort":null,"source":"https://code.claude.com/docs/en/model-config#adjust-effort-level","kind":"model","apiEfforts":["low","medium","high"],"apiDefaultEffort":null,"apiSource":"https://platform.claude.com/docs/en/build-with-claude/effort"},{"id":"claude-sonnet-4-5-20250929","label":"Sonnet 4.5 (deprecated)","efforts":[],"defaultEffort":null,"source":"https://code.claude.com/docs/en/model-config","kind":"model","lifecycle":{"status":"deprecated","retirementDate":"2026-11-30","scope":"Anthropic-operated platforms; partner lifecycles differ","source":"https://platform.claude.com/docs/en/about-claude/model-deprecations"}},{"id":"claude-haiku-4-5-20251001","label":"Haiku 4.5","efforts":[],"defaultEffort":null,"source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"inherit","label":"Inherit main model","efforts":["low","medium","high","xhigh","max"],"defaultEffort":null,"source":"https://code.claude.com/docs/en/sub-agents","kind":"inherit","effortResolution":"Depends on the resolved model and provider; requested levels can be clamped or ignored by Claude Code."}],"note":"Full model IDs use the current Claude Code native effort table, which differs from API support for Opus 4.5. Alias/inherit efforts are possible requested levels, not a guarantee for every resolved provider model; unsupported levels can clamp or be ignored. Current account access and provider alias resolution vary.","excluded":[{"id":"best","reason":"session/context selector rather than a distinct documented subagent model; custom native ID remains available"},{"id":"default","reason":"session/context selector rather than a distinct documented subagent model; custom native ID remains available"},{"id":"opus[1m]","reason":"session/context selector rather than a distinct documented subagent model; custom native ID remains available"},{"id":"opusplan","reason":"session/context selector rather than a distinct documented subagent model; custom native ID remains available"},{"id":"sonnet[1m]","reason":"session/context selector rather than a distinct documented subagent model; custom native ID remains available"}]},"kimi":{"label":"Kimi","efforts":["low","medium","high","xhigh","max"],"models":[{"id":"kimi-code/k3.1-pro","label":"K3.1 Pro","efforts":["low","high","max"],"defaultEffort":"high","source":"https://www.kimi.com/code/docs/en/kimi-code/models","kind":"native-alias","upstreamModelId":"k3.1-pro","thinkingRequired":true},{"id":"kimi-code/k3.1-pro-highspeed","label":"K3.1 Pro Highspeed","efforts":["low","high","max"],"defaultEffort":"high","source":"https://www.kimi.com/code/docs/en/kimi-code/models","kind":"native-alias","upstreamModelId":"k3.1-pro-highspeed","thinkingRequired":true},{"id":"kimi-code/k3","label":"K3","efforts":["low","high","max"],"defaultEffort":"high","source":"https://www.kimi.com/code/docs/en/kimi-code/models","kind":"native-alias","upstreamModelId":"k3"},{"id":"kimi-code/k3-256k","label":"K3 · 256K","efforts":["low","high","max"],"defaultEffort":"high","source":"https://www.kimi.com/code/docs/en/kimi-code/models","kind":"native-alias","upstreamModelId":"k3-256k"},{"id":"kimi-code/kimi-for-coding","label":"K2.8 Preview","efforts":["low","high","max"],"defaultEffort":"max","source":"https://www.kimi.com/code/docs/en/kimi-code/models","kind":"native-alias","upstreamModelId":"kimi-for-coding"},{"id":"kimi-code/kimi-for-coding-highspeed","label":"K2.7 Code HighSpeed","efforts":[],"defaultEffort":null,"source":"https://www.kimi.com/code/docs/en/kimi-code/models","kind":"native-alias","upstreamModelId":"kimi-for-coding-highspeed"}],"note":"Current Kimi Code docs list six model IDs; the older kimi.ai/help page still lists four. K3.1 Pro and Highspeed require thinking and support low/high/max, default high. These are preferred native aliases: setup resolves a missing preferred alias only to a unique provisioned match; no provider identity is invented. Account tier controls access.","observedClientVersion":"2.4.0","observation":"Kimi Code CLI 2.4.0: all six documented preferred aliases and native effort/default capabilities corroborated through whitelisted provisioned metadata; no credentials or custom account aliases retained."},"agy":{"label":"Antigravity","efforts":[],"observedClientVersion":"1.4.10","models":[{"id":"pro","label":"Pro","efforts":[],"defaultEffort":null,"source":"https://antigravity.google/docs/subagents?tab=cli","kind":"tier"},{"id":"flash","label":"Flash","efforts":[],"defaultEffort":null,"source":"https://antigravity.google/docs/subagents?tab=cli","kind":"tier"},{"id":"flash_lite","label":"Flash Lite","efforts":[],"defaultEffort":null,"source":"https://antigravity.google/docs/subagents?tab=cli","kind":"tier"},{"id":"inherit","label":"Inherit main model","efforts":[],"defaultEffort":null,"source":"https://antigravity.google/docs/subagents?tab=cli","kind":"tier"}],"note":"Native per-subagent selectors are tiers, not the session model inventory. CLI 1.4.10 parser explicitly accepts inherit/flash_lite/flash/pro, including Flash Lite absent from the shared docs App table. Per-role effort is not exposed by the agent-file schema."},"grok":{"label":"Grok Build","efforts":[],"observedClientVersion":"1.0.70","models":[{"id":"grok-4.7","label":"Grok 4.7","efforts":[],"defaultEffort":null,"source":"https://docs.x.ai/developers/models","nativeSource":"https://github.com/xai-org/grok-build/blob/main/crates/codegen/xai-grok-pager/docs/user-guide/16-subagents.md","kind":"model"},{"id":"grok-4.6","label":"Grok 4.6","efforts":[],"defaultEffort":null,"source":"https://docs.x.ai/developers/models","nativeSource":"https://github.com/xai-org/grok-build/blob/main/crates/codegen/xai-grok-pager/docs/user-guide/16-subagents.md","kind":"model"},{"id":"grok-4.5","label":"Grok 4.5","efforts":[],"defaultEffort":null,"source":"https://docs.x.ai/developers/models","nativeSource":"https://github.com/xai-org/grok-build/blob/main/crates/codegen/xai-grok-pager/docs/user-guide/16-subagents.md","kind":"model"},{"id":"grok-build-0.1","label":"Grok Build 0.1","efforts":[],"defaultEffort":null,"source":"https://docs.x.ai/developers/models","nativeSource":"https://github.com/xai-org/grok-build/blob/main/crates/codegen/xai-grok-pager/docs/user-guide/16-subagents.md","kind":"model"}],"note":"Per-subagent models are set in config.toml [subagents.models]; model IDs follow the documented xAI model list and account access varies. Per-role effort is not exposed by the agent-file schema, so subagents use the main session effort. [subagents] max_concurrent is a native cap."}}},"roles":[{"id":"worker","name":"Coder","kind":"code","assignment":"scoped implementation and fixes","description":"Implements scoped changes, preserves peers' edits, and verifies the result.","prompt":"Implement the assigned change or fix within the assigned files. You share the workspace with other agents: preserve their edits. Verify the result and report changes, checks, and remaining limitations. Do not create child agents; return any need for further delegation to the parent."},{"id":"reviewer","name":"Reviewer","kind":"code","assignment":"read-only correctness, security and regression review","description":"Reviews correctness, security and regressions without edits; reports actionable evidence.","prompt":"Review the assigned change without editing files. Find actionable correctness, security, and regression issues. Report each finding with file and line evidence and explain its impact; distinguish confirmed issues from uncertainty. Do not create child agents; return any need for further delegation to the parent."},{"id":"explorer","name":"Code explorer","kind":"light","assignment":"read-only code and documentation discovery","description":"Maps code and documentation, cites sources, and separates facts from uncertainty.","prompt":"Explore the assigned code and documentation without editing files. Return a concise map or factual answer with source paths or citations. Distinguish verified facts from assumptions and unknowns. Do not create child agents; return any need for further delegation to the parent."},{"id":"tester","name":"Test writer","kind":"code","assignment":"test creation and targeted execution","description":"Writes behavior and edge-case tests, reproduces issues, and runs targeted checks.","prompt":"Own the assigned tests and targeted execution. Reproduce the issue or establish a baseline, then test observable behavior and edge cases. Never weaken checks to make them pass. Do not edit application code unless explicitly assigned. Preserve peers' edits and report results and limitations. Do not create child agents; return any need for further delegation to the parent."},{"id":"writer","name":"Docs writer","kind":"light","assignment":"assigned documentation, examples and release notes","description":"Updates assigned docs and examples, verifies claims, and keeps terminology consistent.","prompt":"Update only the assigned documentation, examples, or release notes. Verify claims against code or cited sources and use consistent terminology. Do not edit application code. Preserve peers' edits and report changes and unknowns. Do not create child agents; return any need for further delegation to the parent."},{"id":"routine","name":"Task runner","kind":"light","assignment":"explicit commands and mechanical edits","description":"Runs prescribed commands and mechanical edits; returns ambiguous decisions to the parent.","prompt":"Execute only the prescribed commands or clearly specified mechanical edits. Preserve other agents' work and report the outcome. Do not make ambiguous design or behavior decisions; return those decisions to the parent. Do not create child agents; return any need for further delegation to the parent."}],"unreleased":false};
287
+ // Pure command codec, also embedded in the offline configuration page.
288
+ const TOOL_FLAGS=Object.freeze({codex:'codex',claude:'claude',kimi:'kimi',antigravity:'agy',grok:'grok'});
289
+ const EXPLICIT_FIELDS=Object.freeze(['roles','max-concurrent',...Object.keys(TOOL_FLAGS),...Object.keys(TOOL_FLAGS).map(flag=>'avoid-'+flag),...Object.keys(TOOL_FLAGS).map(flag=>flag+'-max-concurrent')]);
290
+ const EXPLICIT_MODEL=/^[A-Za-z0-9][A-Za-z0-9._:@/\[\]-]{0,127}$/;
291
+ const EXPLICIT_EFFORTS=['none','minimal','low','medium','high','xhigh','max'];
292
+ function invalidExplicit(){throw Object.assign(new Error('Invalid explicit configuration.'),{code:'INVALID_EXPLICIT_CONFIG'});}
293
+ function explicitList(value,limit){
294
+ if(typeof value!=='string'||!value.length)invalidExplicit();
295
+ const list=value.split(',').map(value=>value.trim());
296
+ if(!list.length||list.length>limit||list.some(value=>!value)||new Set(list).size!==list.length)invalidExplicit();
297
+ return list;
298
+ }
299
+
300
+ // Grok has no per-role effort, so its value is the whole model id; a trailing ':<effort>' would be ambiguous and is refused.
301
+ const grokEffortSuffix=model=>{const colon=model.lastIndexOf(':');return colon>=0&&['native',...EXPLICIT_EFFORTS].includes(model.slice(colon+1));};
302
+ function parseExplicitOptions(options,roleIds){
303
+ if(!options||typeof options!=='object'||Array.isArray(options))invalidExplicit();
304
+ const fields=Object.getOwnPropertyDescriptors(options);
305
+ if(Object.entries(fields).some(([key,value])=>!EXPLICIT_FIELDS.includes(key)||value.get||value.set||typeof value.value!=='string'))invalidExplicit();
306
+ options=Object.fromEntries(Object.entries(fields).map(([key,value])=>[key,value.value]));
307
+ if(Object.values(fields).reduce((size,value)=>size+value.value.length,0)>65536)invalidExplicit();
308
+ const requested=explicitList(options.roles,roleIds.length);
309
+ if(requested.some(role=>!roleIds.includes(role)))invalidExplicit();
310
+ const roles=roleIds.filter(role=>requested.includes(role)),maxConcurrent=Number(options['max-concurrent']);
311
+ if(!/^[1-9]\d*$/.test(options['max-concurrent'])||!Number.isInteger(maxConcurrent)||maxConcurrent>32)invalidExplicit();
312
+ for(const flag of Object.keys(TOOL_FLAGS))if((options['avoid-'+flag]!==undefined||options[flag+'-max-concurrent']!==undefined)&&options[flag]===undefined)invalidExplicit();
313
+ const clients={};
314
+ for(const flag of Object.keys(options).filter(flag=>Object.hasOwn(TOOL_FLAGS,flag))){
315
+ const client=TOOL_FLAGS[flag],choices={};
316
+ for(const entry of explicitList(options[flag],roles.length)){
317
+ const at=entry.indexOf('='),role=entry.slice(0,at).trim(),value=entry.slice(at+1).trim();
318
+ if(at<1||!roles.includes(role)||Object.hasOwn(choices,role))invalidExplicit();
319
+ let model=value,effort=null;
320
+ if(client==='agy'){if(!['pro','flash','flash_lite','inherit'].includes(model))invalidExplicit();}
321
+ else if(client==='grok'){if(grokEffortSuffix(value))invalidExplicit();}
322
+ else{
323
+ const colon=value.lastIndexOf(':');if(colon<1)invalidExplicit();
324
+ model=value.slice(0,colon);const level=value.slice(colon+1);
325
+ if(level!=='native'&&!EXPLICIT_EFFORTS.includes(level))invalidExplicit();effort=level==='native'?null:level;
326
+ }
327
+ if(!EXPLICIT_MODEL.test(model))invalidExplicit();choices[role]={model,effort};
328
+ }
329
+ if(Object.keys(choices).length!==roles.length)invalidExplicit();
330
+ const avoidModels=options['avoid-'+flag]===undefined?[]:explicitList(options['avoid-'+flag],32);
331
+ if(avoidModels.some(model=>!EXPLICIT_MODEL.test(model)))invalidExplicit();
332
+ const first=choices[roles[0]];
333
+ const limit=options[flag+'-max-concurrent'];
334
+ if(limit!==undefined&&(!/^[1-9]\d*$/.test(limit)||Number(limit)>32))invalidExplicit();
335
+ clients[client]={...(limit===undefined?{}:{maxConcurrent:Number(limit)}),code:{...first},light:{...first},roles:Object.fromEntries(roles.map(role=>[role,choices[role]])),avoidModels};
336
+ }
337
+ if(!Object.keys(clients).length)invalidExplicit();
338
+ return {schemaVersion:1,maxConcurrent,...(roles.length===roleIds.length?{}:{selectedRoles:roles}),clients};
339
+ }
340
+
341
+ function explicitOptions(config,roleCatalog){
342
+ const legacy={worker:'code',reviewer:'code',explorer:'light',routine:'light'};
343
+ if(!Array.isArray(roleCatalog)||!roleCatalog.length)invalidExplicit();
344
+ const definitions=roleCatalog.map(role=>typeof role==='string'?{id:role,kind:legacy[role]}:role);
345
+ if(definitions.some(role=>!role||typeof role.id!=='string'||!['code','light'].includes(role.kind))||new Set(definitions.map(role=>role.id)).size!==definitions.length)invalidExplicit();
346
+ const roleIds=definitions.map(role=>role.id),kinds=new Map(definitions.map(role=>[role.id,role.kind]));
347
+ if(!config||config.schemaVersion!==1||!config.clients||typeof config.clients!=='object'||Array.isArray(config.clients))invalidExplicit();
348
+ const selected=config.selectedRoles??roleIds;
349
+ if(!Array.isArray(selected)||!selected.length||new Set(selected).size!==selected.length||selected.some(role=>!roleIds.includes(role)))invalidExplicit();
350
+ const roles=roleIds.filter(role=>selected.includes(role));
351
+ const options={roles:roles.join(','),'max-concurrent':String(config.maxConcurrent)};
352
+ for(const [client,preferences]of Object.entries(config.clients)){
353
+ const flag=Object.keys(TOOL_FLAGS).find(flag=>TOOL_FLAGS[flag]===client);if(!flag||!preferences)invalidExplicit();
354
+ options[flag]=roles.map(role=>{
355
+ const selected=preferences.roles?.[role]??preferences[kinds.get(role)];
356
+ if(!selected||typeof selected.model!=='string'||!EXPLICIT_MODEL.test(selected.model)||(selected.effort!==null&&!EXPLICIT_EFFORTS.includes(selected.effort)))invalidExplicit();
357
+ if(['agy','grok'].includes(client)&&selected.effort!==null)invalidExplicit();
358
+ if(client==='grok'&&grokEffortSuffix(selected.model))invalidExplicit();
359
+ return `${role}=${selected.model}${['agy','grok'].includes(client)?'':':'+(selected.effort??'native')}`;
360
+ }).join(',');
361
+ if(preferences.maxConcurrent!==undefined)options[flag+'-max-concurrent']=String(preferences.maxConcurrent);
362
+ if(!Array.isArray(preferences.avoidModels)||preferences.avoidModels.some(model=>typeof model!=='string'||!EXPLICIT_MODEL.test(model)))invalidExplicit();
363
+ if(preferences.avoidModels.length)options['avoid-'+flag]=preferences.avoidModels.join(',');
364
+ }
365
+ parseExplicitOptions(options,roleIds);
366
+ return options;
367
+ }
368
+
369
+ function formatExplicitCommand(config,version,roleCatalog){
370
+ if(typeof version!=='string'||!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(version))throw new Error('Invalid release version.');
371
+ const options=explicitOptions(config,roleCatalog),quote=value=>"'"+value.replaceAll("'","'\"'\"'")+"'";
372
+ const lines=[`npx --yes --ignore-scripts --package agent-policy-kit@${version} agent-policy setup`];
373
+ for(const [name,value]of Object.entries(options))lines.push(`--${name} ${name==='max-concurrent'||name.endsWith('-max-concurrent')?value:quote(value)}`);
374
+ lines.push('--apply');return lines.join(' \\\n ');
375
+ }
376
+
377
+ // Pure URL state codec, also embedded in the offline configuration page.
378
+ const SHARE_BYTES=65536,SHARE_TOKEN=87384;
379
+ const SHARE_VERSION=/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-(?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*)(?:\.(?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*))*)?$/;
380
+ const SHARE_UNSAFE=new Set(['__proto__','constructor','prototype']);
381
+ function invalidShare(){throw Object.assign(new Error('Invalid shared configuration link.'),{code:'INVALID_SHARE_LINK'});}
382
+
383
+ // Inspect descriptors before reading any user-supplied value. UI-only cached data is
384
+ // allowed, but accessors, exotic prototypes, sparse arrays and hidden fields are not.
385
+ function shareData(value,depth=0,budget={left:100000}){
386
+ if(--budget.left<0||depth>32)invalidShare();
387
+ if(value===null||value===undefined||typeof value==='string'||typeof value==='boolean')return;
388
+ if(typeof value==='number'){if(!Number.isFinite(value))invalidShare();return;}
389
+ if(typeof value!=='object')invalidShare();
390
+ const array=Array.isArray(value),prototype=Object.getPrototypeOf(value);
391
+ if(array?prototype!==Array.prototype:prototype!==Object.prototype&&prototype!==null)invalidShare();
392
+ const fields=Object.getOwnPropertyDescriptors(value),keys=Reflect.ownKeys(fields);
393
+ if(array&&(keys.length!==value.length+1||value.length>100000))invalidShare();
394
+ for(const key of keys){
395
+ if(typeof key!=='string'||SHARE_UNSAFE.has(key))invalidShare();
396
+ const field=fields[key];
397
+ if(!Object.hasOwn(field,'value')||(!field.enumerable&&!(array&&key==='length')))invalidShare();
398
+ if(array&&key!=='length'&&!/^(0|[1-9]\d*)$/.test(key))invalidShare();
399
+ if(key!=='length'||!array)shareData(field.value,depth+1,budget);
400
+ }
401
+ }
402
+ function shareRecord(value,keys){
403
+ if(!value||typeof value!=='object'||Array.isArray(value))invalidShare();
404
+ if(keys&&(Object.keys(value).length!==keys.length||keys.some(key=>!Object.hasOwn(value,key))))invalidShare();
405
+ return value;
406
+ }
407
+ function shareList(value,known){
408
+ if(!Array.isArray(value)||value.length>known.length||new Set(value).size!==value.length||value.some(id=>typeof id!=='string'||!known.includes(id)))invalidShare();
409
+ return [...value];
410
+ }
411
+ function shareRelease(release){
412
+ shareData(release);shareRecord(release);
413
+ if(typeof release.version!=='string'||!SHARE_VERSION.test(release.version))invalidShare();
414
+ const preferences=shareRecord(release.preferences),clients=Object.keys(shareRecord(preferences.clients));
415
+ const catalog=shareRecord(shareRecord(release.catalog).clients);
416
+ if(!clients.length||clients.some(id=>!Object.hasOwn(catalog,id)||!Array.isArray(catalog[id].efforts)||catalog[id].efforts.some(level=>typeof level!=='string')))invalidShare();
417
+ if(!Array.isArray(release.roles)||!release.roles.length||!Array.isArray(release.presets)||!release.presets.length)invalidShare();
418
+ const roles=new Map(),presets=new Map();
419
+ for(const role of release.roles){
420
+ shareRecord(role);if(typeof role.id!=='string'||!role.id||SHARE_UNSAFE.has(role.id)||roles.has(role.id)||!['code','light'].includes(role.kind))invalidShare();
421
+ roles.set(role.id,role);
422
+ }
423
+ for(const preset of release.presets){
424
+ shareRecord(preset);if(typeof preset.id!=='string'||!preset.id||preset.id==='custom'||SHARE_UNSAFE.has(preset.id)||presets.has(preset.id))invalidShare();
425
+ shareRecord(shareRecord(preset.preferences).clients);
426
+ if(preset.topModels!==undefined&&Object.values(shareRecord(preset.topModels)).some(model=>typeof model!=='string'))invalidShare();
427
+ presets.set(preset.id,preset);
428
+ }
429
+ if(!presets.has(release.preset))invalidShare();
430
+ return {clients,roles,presets,catalog};
431
+ }
432
+ function shareChoice(choice,id,metadata){
433
+ shareRecord(choice,['model','effort']);
434
+ if(typeof choice.model!=='string'||choice.model.length>128||(choice.effort!==null&&(['agy','grok'].includes(id)||!metadata.catalog[id].efforts.includes(choice.effort))))invalidShare();
435
+ return {model:choice.model,effort:choice.effort};
436
+ }
437
+ function sharePayload(payload,release,metadata){
438
+ shareRecord(payload);const legacy=payload.v===1;
439
+ if(!legacy&&payload.v!==2)invalidShare();
440
+ shareRecord(payload,legacy?['v','release','roles','tools','scope','maxConcurrent']:['v','release','roles','tools','scope']);
441
+ if(typeof payload.release!=='string'||payload.release.length>128||!SHARE_VERSION.test(payload.release))invalidShare();
442
+ if(legacy&&(!Number.isInteger(payload.maxConcurrent)||payload.maxConcurrent<1||payload.maxConcurrent>32))invalidShare();
443
+ if(payload.release!==release.version){
444
+ // Validate the wire shape without imposing today's models or preset values on
445
+ // an older release. Invalid links must never turn into navigation.
446
+ const identifier=value=>typeof value==='string'&&/^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/.test(value);
447
+ if(!Array.isArray(payload.roles)||payload.roles.length>1000||payload.roles.some(role=>!identifier(role)))invalidShare();
448
+ const roles=shareList(payload.roles,payload.roles),ids=[];
449
+ if(!Array.isArray(payload.tools)||payload.tools.length>32)invalidShare();
450
+ for(const tool of payload.tools){
451
+ shareRecord(tool,legacy?['id','mode','base','choices']:['id','mode','base','choices','maxConcurrent']);if(!legacy&&(!Number.isInteger(tool.maxConcurrent)||tool.maxConcurrent<1||tool.maxConcurrent>32))invalidShare();if(!identifier(tool.id)||ids.includes(tool.id)||!identifier(tool.base)||(tool.mode!==null&&!identifier(tool.mode)))invalidShare();ids.push(tool.id);
452
+ shareRecord(tool.choices,roles);for(const role of roles){const choice=shareRecord(tool.choices[role],['model','effort']);if(typeof choice.model!=='string'||choice.model.length>128||(choice.effort!==null&&(typeof choice.effort!=='string'||choice.effort.length>32)))invalidShare();}
453
+ }
454
+ if(payload.scope!==null&&(typeof payload.scope!=='string'||(payload.scope==='all'?ids.length<2:!ids.includes(payload.scope))))invalidShare();
455
+ throw Object.assign(new Error('This link uses a different release.'),{code:'SHARE_RELEASE_MISMATCH',releaseVersion:payload.release});
456
+ }
457
+ const roles=shareList(payload.roles,[...metadata.roles.keys()]);
458
+ if(!Array.isArray(payload.tools)||payload.tools.length>metadata.clients.length)invalidShare();
459
+ const selected=[];
460
+ const tools=payload.tools.map(tool=>{
461
+ shareRecord(tool,legacy?['id','mode','base','choices']:['id','mode','base','choices','maxConcurrent']);if(!legacy&&(!Number.isInteger(tool.maxConcurrent)||tool.maxConcurrent<1||tool.maxConcurrent>32))invalidShare();
462
+ const {id,mode,base}=tool;
463
+ if(!metadata.clients.includes(id)||selected.includes(id)||!metadata.presets.has(base)||(mode!==null&&mode!=='custom'&&!metadata.presets.has(mode)))invalidShare();
464
+ selected.push(id);shareRecord(tool.choices,roles);
465
+ const choices=Object.fromEntries(roles.map(role=>[role,shareChoice(tool.choices[role],id,metadata)]));
466
+ if(mode!==null&&mode!=='custom'){
467
+ if(mode!==base)invalidShare();
468
+ const named=metadata.presets.get(mode),preset=named.preferences,clients=preset.clients;
469
+ if(!legacy&&tool.maxConcurrent!==(clients[id]?.maxConcurrent??preset.maxConcurrent))invalidShare();
470
+ if(!Object.hasOwn(clients,id))invalidShare();
471
+ const preferences=shareRecord(clients[id]),own=role=>preferences.roles&&Object.hasOwn(preferences.roles,role);
472
+ // A preset's optional top model replaces every shared code role that has no role-specific choice, or none of them.
473
+ const top=named.topModels&&Object.hasOwn(named.topModels,id)?named.topModels[id]:null;
474
+ const topRoles=roles.filter(role=>metadata.roles.get(role).kind==='code'&&!own(role)),topped=top!==null&&topRoles.some(role=>choices[role].model===top);
475
+ for(const role of roles){
476
+ const expected=own(role)?preferences.roles[role]:preferences[metadata.roles.get(role).kind];
477
+ const choice=shareChoice(expected,id,metadata);if(topped&&topRoles.includes(role))choice.model=top;
478
+ if(choice.model!==choices[role].model||choice.effort!==choices[role].effort)invalidShare();
479
+ }
480
+ }
481
+ return {id,mode,base,choices,...(legacy?{}:{maxConcurrent:tool.maxConcurrent})};
482
+ });
483
+ const scope=payload.scope;
484
+ if(scope!==null&&(typeof scope!=='string'||(scope==='all'?tools.length<2:!selected.includes(scope))))invalidShare();
485
+ return {v:payload.v,release:payload.release,roles,tools,scope,...(legacy?{maxConcurrent:payload.maxConcurrent}:{})};
486
+ }
487
+ function shareBase64(bytes){return btoa(Array.from(bytes,byte=>String.fromCharCode(byte)).join('')).replaceAll('+','-').replaceAll('/','_').replace(/=+$/,'');}
488
+ function shareJson(text){
489
+ const payload=JSON.parse(text),stack=[];
490
+ // JSON.parse validates syntax; this small token pass preserves duplicate-key
491
+ // evidence that JSON.parse would otherwise discard, including escaped names.
492
+ const tokens=text.match(/"(?:[^"\\]|\\.)*"|[{}\[\]:,]/g)??[];
493
+ for(let at=0;at<tokens.length;at++){
494
+ const token=tokens[at];
495
+ if(token==='{')stack.push(new Set());
496
+ else if(token==='[')stack.push(null);
497
+ else if(token==='}'||token===']')stack.pop();
498
+ else if(token[0]==='"'&&tokens[at+1]===':'){
499
+ const key=JSON.parse(token),keys=stack.at(-1);
500
+ if(!keys||keys.has(key)||SHARE_UNSAFE.has(key))invalidShare();keys.add(key);
501
+ }
502
+ }
503
+ return payload;
504
+ }
505
+
506
+ function encodeFormState(snapshot,release){
507
+ try{
508
+ shareData(snapshot);shareRecord(snapshot);
509
+ const metadata=shareRelease(release),state=shareRecord(snapshot.state),profiles=shareRecord(state.profiles),jobs=shareRecord(state.jobs);
510
+ const roles=shareList(snapshot.helpers,[...metadata.roles.keys()]),selected=shareList(snapshot.pickedTools,metadata.clients);
511
+ const modern=Object.values(profiles).some(profile=>Object.hasOwn(profile,'maxConcurrent'));
512
+ const tools=selected.map(id=>{
513
+ if(!Object.hasOwn(profiles,id)||!Object.hasOwn(jobs,id))invalidShare();
514
+ const profile=shareRecord(profiles[id]),choices=shareRecord(jobs[id]);
515
+ if(typeof profile.custom!=='boolean'||(profile.modeSelected!==undefined&&typeof profile.modeSelected!=='boolean'))invalidShare();
516
+ return {id,...(modern?{maxConcurrent:Object.hasOwn(profile,'maxConcurrent')?profile.maxConcurrent:state.maxConcurrent}:{}),mode:profile.modeSelected===false?null:profile.custom?'custom':profile.presetId,base:profile.presetId,choices:Object.fromEntries(roles.map(role=>{
517
+ if(!Object.hasOwn(choices,role))invalidShare();return [role,shareChoice(choices[role],id,metadata)];
518
+ }))};
519
+ });
520
+ const payload=sharePayload({v:modern?2:1,release:release.version,roles,tools,scope:snapshot.selectedScope,...(modern?{}:{maxConcurrent:state.maxConcurrent})},release,metadata);
521
+ if(!roles.length&&!tools.length)return '';
522
+ const bytes=new TextEncoder().encode(JSON.stringify(payload));if(bytes.length>SHARE_BYTES)invalidShare();
523
+ const token=shareBase64(bytes);if(token.length>SHARE_TOKEN)invalidShare();return '#setup='+token;
524
+ }catch(error){if(error?.code==='INVALID_SHARE_LINK'||error?.code==='SHARE_RELEASE_MISMATCH')throw error;invalidShare();}
525
+ }
526
+
527
+ function decodeFormState(fragment,release){
528
+ try{
529
+ if(typeof fragment!=='string')invalidShare();
530
+ if(!fragment.startsWith('#setup='))return null;
531
+ const token=fragment.slice(7);
532
+ if(!token.length||token.length>SHARE_TOKEN||!/^[A-Za-z0-9_-]+$/.test(token)||token.length%4===1)invalidShare();
533
+ const binary=atob(token.replaceAll('-','+').replaceAll('_','/'));
534
+ if(binary.length>SHARE_BYTES)invalidShare();
535
+ const bytes=Uint8Array.from(binary,char=>char.charCodeAt(0));if(shareBase64(bytes)!==token)invalidShare();
536
+ const payload=shareJson(new TextDecoder('utf-8',{fatal:true}).decode(bytes));shareData(payload);
537
+ return sharePayload(payload,release,shareRelease(release));
538
+ }catch(error){if(error?.code==='INVALID_SHARE_LINK'||error?.code==='SHARE_RELEASE_MISMATCH')throw error;invalidShare();}
539
+ }
540
+
541
+ function archivedReleaseUrl(error,href,hostedReleases=[]){
542
+ if(error?.code!=='SHARE_RELEASE_MISMATCH'||typeof error.releaseVersion!=='string'||error.releaseVersion.length>128||!SHARE_VERSION.test(error.releaseVersion)||!Array.isArray(hostedReleases)||!hostedReleases.includes(error.releaseVersion))return null;
543
+ try{
544
+ const current=new URL(href);if(!['http:','https:'].includes(current.protocol)||current.username||current.password||current.pathname!=='/'||!current.hash.startsWith('#setup='))return null;
545
+ const target=new URL(`/v/${error.releaseVersion}/`,current.origin);target.hash=current.hash;
546
+ return target.origin===current.origin?target.href:null;
547
+ }catch{return null;}
548
+ }
549
+
550
+ (() => {
551
+ const CLIENTS = ['codex', 'claude', 'kimi', 'agy', 'grok'];
552
+ const ROLES = RELEASE.roles.map(role=>role.id);
553
+ const ROLE_KINDS=Object.fromEntries(RELEASE.roles.map(role=>[role.id,role.kind]));
554
+ const TIERS = ['pro', 'flash', 'flash_lite', 'inherit'];
555
+ const IDENTIFIER = /^[A-Za-z0-9][A-Za-z0-9._:@/\[\]-]{0,127}$/;
556
+ const LABELS = {codex: 'Codex', claude: 'Claude', kimi: 'Kimi', agy: 'Antigravity', grok: 'Grok Build'};
557
+ const TASKS = Object.fromEntries(RELEASE.roles.map(role=>[role.id,role.name]));
558
+ const NOTES = {codex: '', claude: '', kimi: 'Effort changes apply to every task using the same alias.', agy: 'Native tiers only; per-task effort is unavailable.', grok: 'Per-task effort is unavailable; subagents use the main session effort.'};
559
+ const clone = value => JSON.parse(JSON.stringify(value));
560
+ const addAll = (selected, available) => [...selected, ...available.filter(id => !selected.includes(id))];
561
+ function effective(config, role) {
562
+ return config.roles?.[role] ?? config[ROLE_KINDS[role]];
563
+ }
564
+ function initialState(preferences, presetId = 'balanced', {empty=false}={}) {
565
+ const available = CLIENTS.filter(client => preferences.clients[client]),selected=empty?[]:available;
566
+ return {selected, active: empty?null:'all', maxConcurrent: preferences.maxConcurrent,...(empty?{selectedRoles:[...ROLES]}:{}),
567
+ profiles: Object.fromEntries(available.map(client => [client, {presetId, custom: false, modeSelected:!empty,top:topModelFor(RELEASE.presets?.find(preset=>preset.id===presetId),client),presetCap:preferences.clients[client].maxConcurrent??preferences.maxConcurrent,maxConcurrent:preferences.clients[client].maxConcurrent??preferences.maxConcurrent,preferences: clone(preferences.clients[client])}])),
568
+ jobs: Object.fromEntries(available.map(client => [client, Object.fromEntries(ROLES.map(role => [role, clone(effective(preferences.clients[client], role))]))]))};
569
+ }
570
+ function topModelFor(preset, client) {return typeof preset?.topModels?.[client]==='string'?preset.topModels[client]:null;}
571
+ // Code roles without a role-specific preset choice can switch to the preset's optional top model.
572
+ function topModelRoles(state, client) {
573
+ const profile=state.profiles?.[client];
574
+ if(!profile?.top||profile.custom||profile.modeSelected===false)return [];
575
+ return ROLES.filter(role=>ROLE_KINDS[role]==='code'&&!profile.preferences.roles?.[role]);
576
+ }
577
+ function topModelsOn(state, client) {
578
+ const roles=topModelRoles(state,client).filter(role=>(state.selectedRoles??ROLES).includes(role));
579
+ return roles.length>0&&roles.every(role=>state.jobs?.[client]?.[role]?.model===state.profiles[client].top);
580
+ }
581
+ function setTopModels(state, clients, on) {
582
+ for(const client of clients){
583
+ const profile=state.profiles[client];
584
+ for(const role of topModelRoles(state,client)){const base=effective(profile.preferences,role);state.jobs[client][role]={model:on?profile.top:base.model,effort:base.effort};}
585
+ }
586
+ }
587
+ function presetJob(state, client, role) {
588
+ const profile=state.profiles[client],base=effective(profile.preferences,role);
589
+ return topModelsOn(state,client)&&topModelRoles(state,client).includes(role)?{model:profile.top,effort:base.effort}:base;
590
+ }
591
+ // Tools whose presets choose identical role models differ only by parallel limits.
592
+ function presetModelSummary(presets, client) {
593
+ const choices=presets.map(preset=>{const config=preset.preferences?.clients?.[client];return config?ROLES.map(role=>effective(config,role)):null;});
594
+ if(!choices.length||choices.some(value=>value===null))return {same:false,model:null};
595
+ const first=JSON.stringify(choices[0]),same=choices.every(value=>JSON.stringify(value)===first),models=new Set(choices[0].map(choice=>choice.model));
596
+ return {same,model:same&&models.size===1?[...models][0]:null};
597
+ }
598
+ function modeFor(state, client = state.active) {
599
+ if (client !== 'all') {const profile=state.profiles[client];return !profile||profile.modeSelected===false?null:profile.custom?'custom':profile.presetId;}
600
+ const modes = (Array.isArray(state.selected)?state.selected:[]).map(client => modeFor(state, client));
601
+ if(!modes.length||modes.some(mode=>mode===null))return null;
602
+ return modes.every(mode => mode === modes[0]) ? modes[0] : 'custom';
603
+ }
604
+ function applyPreset(state, preset, confirmReplace = () => false) {
605
+ const all = state.active === 'all', targets = all ? state.selected : [state.active];
606
+ if (targets.some(client => !preset.preferences.clients[client])) return state;
607
+ const chosen=targets.filter(client=>state.profiles[client]?.modeSelected!==false),replacing=chosen.length>0;
608
+ const mixed=new Set(chosen.map(client=>state.profiles[client].presetId)).size>1,pending=chosen.length<targets.length;
609
+ const edited=chosen.some(client=>{
610
+ const profile=state.profiles[client];
611
+ return concurrencyFor(state,client)!==profile.presetCap||ROLES.some(role=>{const current=state.jobs?.[client]?.[role],base=presetJob(state,client,role);return current?.model!==base.model||current?.effort!==base.effort;});
612
+ });
613
+ // The scope warning only matters when other selected tools keep their choices; otherwise ask only before losing edits.
614
+ const scoped=!all&&(Array.isArray(state.selected)?state.selected.length:0)>1;
615
+ if(replacing&&(scoped||mixed||pending||edited)&&!confirmReplace())return state;
616
+ const next = clone(state);
617
+ for (const client of targets) {
618
+ const preferences = preset.preferences.clients[client];
619
+ next.profiles[client] = {presetId: preset.id ?? 'balanced', custom: false, modeSelected:true,top:topModelFor(preset,client),presetCap:preferences.maxConcurrent??preset.preferences.maxConcurrent,maxConcurrent:preferences.maxConcurrent??preset.preferences.maxConcurrent,preferences: clone(preferences)};
620
+ next.jobs[client] = Object.fromEntries(ROLES.map(role => [role, clone(effective(preferences, role))]));
621
+ }
622
+ return next;
623
+ }
624
+ function concurrencyFor(state, client) {
625
+ const profile=state.profiles?.[client];
626
+ return profile&&Object.hasOwn(profile,'maxConcurrent')?profile.maxConcurrent:state.maxConcurrent;
627
+ }
628
+ function updateConcurrency(state, client, value) {
629
+ const profile=state.profiles[client];
630
+ if(!profile)throw new Error('Choose one coding tool.');
631
+ const count=Number(value),next=value===''?'':Number.isFinite(count)?count:String(value);
632
+ if(next!==concurrencyFor(state,client)){profile.custom=true;profile.modeSelected=true;}
633
+ profile.maxConcurrent=next;
634
+ }
635
+ function stepConcurrency(state, client, step) {
636
+ const current=concurrencyFor(state,client),value=Number(current);
637
+ updateConcurrency(state,client,current!==''&&Number.isInteger(value)?Math.max(1,Math.min(32,value+step)):1);
638
+ }
639
+ function restoreState(data, preferences, presets, presetId='balanced') {
640
+ const state=initialState(preferences,presetId,{empty:true});
641
+ if(data.v===1){state.maxConcurrent=data.maxConcurrent;for(const profile of Object.values(state.profiles))profile.maxConcurrent=data.maxConcurrent;}
642
+ state.selected=data.tools.map(tool=>tool.id);state.selectedRoles=[...data.roles];
643
+ state.active=data.scope??(state.selected.length>=2?'all':state.selected[0]??null);
644
+ for(const tool of data.tools){
645
+ const base=presets.find(preset=>preset.id===tool.base),selected=clone(base.preferences.clients[tool.id]);
646
+ const presetCap=selected.maxConcurrent??base.preferences.maxConcurrent,maxConcurrent=data.v===1?data.maxConcurrent:tool.maxConcurrent;
647
+ state.profiles[tool.id]={presetId:tool.base,custom:tool.mode==='custom'||tool.mode!==null&&maxConcurrent!==presetCap,modeSelected:tool.mode!==null,top:topModelFor(base,tool.id),presetCap,maxConcurrent,preferences:selected};
648
+ state.jobs[tool.id]=Object.fromEntries(ROLES.map(role=>[role,clone(effective(selected,role))]));
649
+ for(const [role,choice]of Object.entries(tool.choices))state.jobs[tool.id][role]={...choice};
650
+ if(topModelRoles(state,tool.id).some(role=>tool.choices[role]?.model===state.profiles[tool.id].top))setTopModels(state,[tool.id],true);
651
+ }
652
+ return state;
653
+ }
654
+ function allowedEfforts(catalog, model) {
655
+ const supported = catalog?.models?.find(choice => choice.id === model)?.efforts ?? catalog?.efforts ?? [];
656
+ return [null, ...new Set(supported.filter(effort => effort !== null))];
657
+ }
658
+ function clientCatalog(client, preferences, catalog = RELEASE.catalog) {
659
+ if (catalog?.clients?.[client]) return catalog.clients[client];
660
+ const config = preferences.clients[client];
661
+ const recommendations = [config.code, config.light, ...Object.values(config.roles ?? {})];
662
+ const efforts = [...new Set(recommendations.map(choice => choice.effort).filter(effort => effort !== null))];
663
+ const ids = client === 'agy' ? TIERS : [...new Set(recommendations.map(choice => choice.model))];
664
+ return {label: LABELS[client], efforts, models: ids.map(id => ({id, label: id, efforts, defaultEffort: recommendations.find(choice => choice.model === id)?.effort ?? null}))};
665
+ }
666
+ function preferenceForModel(config, role, model, jobs = {}, catalog, syncAliases = false) {
667
+ const shared = Object.entries(jobs).find(([otherRole, choice]) => otherRole !== role && choice.model === model)?.[1];
668
+ if (!catalog) {
669
+ const recommended = [config.code, config.light, ...Object.values(config.roles ?? {})].find(choice => choice.model === model);
670
+ return {model, effort: (recommended ?? shared ?? effective(config, role)).effort};
671
+ }
672
+ const allowed = allowedEfforts(catalog, model);
673
+ const current = syncAliases ? shared ?? jobs[role] : jobs[role];
674
+ const documentedDefault = catalog.models?.find(choice => choice.id === model)?.defaultEffort ?? null;
675
+ const effort = current && allowed.includes(current.effort) ? current.effort : allowed.includes(documentedDefault) ? documentedDefault : null;
676
+ return {model, effort};
677
+ }
678
+ function updateEffort(state, client, role, effort) {
679
+ state.profiles[client].custom = true;
680
+ state.profiles[client].modeSelected = true;
681
+ const model = state.jobs[client][role].model;
682
+ state.jobs[client][role].effort = effort;
683
+ if (client === 'kimi') for (const choice of Object.values(state.jobs[client])) if (choice.model === model) choice.effort = effort;
684
+ }
685
+ function buildConfig(state, preferences, catalog = RELEASE.catalog) {
686
+ const errors = [];
687
+ const selectedTools=(Array.isArray(state.selected)?state.selected:[]).filter(client=>CLIENTS.includes(client));
688
+ const limits=selectedTools.map(client=>concurrencyFor(state,client));
689
+ const maxConcurrent=limits.length&&limits.every(limit=>limit===limits[0])&&Number.isInteger(limits[0])&&limits[0]>=1&&limits[0]<=32?limits[0]:preferences.maxConcurrent;
690
+ if (!Array.isArray(state.selected) || !state.selected.length) errors.push('Choose at least one coding tool.');
691
+ else if(new Set(state.selected).size!==state.selected.length||state.selected.some(client=>!CLIENTS.includes(client)))errors.push('Choose supported coding tools.');
692
+ const selection=state.selectedRoles===undefined?ROLES:Array.isArray(state.selectedRoles)?state.selectedRoles:[];
693
+ if(!selection.length||new Set(selection).size!==selection.length||selection.some(role=>!ROLES.includes(role)))errors.push('Choose valid subagent roles.');
694
+ const selectedRoles=ROLES.filter(role=>selection.includes(role));
695
+ const clients = {};
696
+ for (const client of (Array.isArray(state.selected)?state.selected:[]).filter(client => CLIENTS.includes(client))) {
697
+ if(state.profiles?.[client]?.modeSelected===false){errors.push(`${LABELS[client]}: choose a work mode.`);continue;}
698
+ const defaults = state.profiles?.[client]?.preferences ?? preferences.clients[client];
699
+ if (!defaults) { errors.push(`${LABELS[client]} has no release defaults.`); continue; }
700
+ const config = clone(defaults),limit=concurrencyFor(state,client);
701
+ if(!Number.isInteger(limit)||limit<1||limit>32)errors.push(`${LABELS[client]}: enter a whole number from 1 to 32 for parallel subagents.`);
702
+ if(limit===maxConcurrent)delete config.maxConcurrent;else config.maxConcurrent=limit;
703
+ const roles = {};
704
+ const choices = [];
705
+ for (const role of selectedRoles) {
706
+ const choice = state.jobs[client]?.[role];
707
+ if (!choice || typeof choice.model !== 'string' || !IDENTIFIER.test(choice.model)) {
708
+ errors.push(`${LABELS[client]} ${TASKS[role]}: enter a valid model ID (1–128 ASCII characters, no spaces).`); continue;
709
+ }
710
+ if (client === 'agy' && (!TIERS.includes(choice.model) || choice.effort !== null)) {
711
+ errors.push(`Antigravity ${TASKS[role]}: choose a supported native tier.`); continue;
712
+ }
713
+ if (client !== 'agy' && !allowedEfforts(clientCatalog(client, {clients: {[client]: defaults}}, catalog), choice.model).includes(choice.effort)) {
714
+ errors.push(`${LABELS[client]} ${TASKS[role]}: choose a supported effort.`); continue;
715
+ }
716
+ if (client === 'kimi' && choice.model === 'primary') {
717
+ errors.push(`Kimi ${TASKS[role]}: choose an explicit model alias, not primary.`); continue;
718
+ }
719
+ const selected = {model: choice.model, effort: choice.effort};
720
+ choices.push(selected);
721
+ const fallback = config[ROLE_KINDS[role]];
722
+ if (selected.model !== fallback.model || selected.effort !== fallback.effort) roles[role] = selected;
723
+ }
724
+ if (client === 'kimi') {
725
+ const aliases = new Map();
726
+ for (const choice of choices) {
727
+ if (choice.effort === null) continue;
728
+ if (aliases.has(choice.model) && aliases.get(choice.model) !== choice.effort) {
729
+ errors.push(`Kimi: tasks using the same alias must use the same effort.`); break;
730
+ }
731
+ aliases.set(choice.model, choice.effort);
732
+ }
733
+ }
734
+ delete config.roles;
735
+ if (Object.keys(roles).length) config.roles = roles;
736
+ const chosen = new Set(choices.map(choice => choice.model));
737
+ config.avoidModels = config.avoidModels.filter(model => !chosen.has(model));
738
+ clients[client] = config;
739
+ }
740
+ return {config: errors.length ? null : {schemaVersion: preferences.schemaVersion, maxConcurrent,...(selectedRoles.length===ROLES.length?{}:{selectedRoles}), clients}, errors};
741
+ }
742
+ function encodeConfig(config) {
743
+ const bytes = new TextEncoder().encode(JSON.stringify(config));
744
+ let binary = '';
745
+ for (const byte of bytes) binary += String.fromCharCode(byte);
746
+ return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
747
+ }
748
+ function buildCommand(config, release) {return formatExplicitCommand(config,release.version,RELEASE.roles);}
749
+ globalThis.APKConfigurator = Object.freeze({initialState, modeFor, presetModelSummary, topModelRoles, topModelsOn, setTopModels, applyPreset, effective, allowedEfforts, preferenceForModel, updateEffort, updateConcurrency, stepConcurrency, concurrencyFor, restoreState, addAll, buildConfig, encodeConfig, buildCommand});
750
+ if (typeof document === 'undefined') return;
751
+
752
+ (() => {
753
+ const A=globalThis.APKConfigurator,$=id=>document.getElementById(id);
754
+ const roles=RELEASE.roles,toolModeLabels=new Map();
755
+ const clients=Object.keys(RELEASE.preferences.clients),toolName=id=>RELEASE.catalog.clients[id].label;
756
+ const presets=RELEASE.presets,initial=presets.find(p=>p.id==='balanced')??presets[0];
757
+ let state=A.initialState(initial.preferences,initial.id,{empty:true});
758
+ let helpers=[...state.selectedRoles],pickedTools=[];
759
+ let selectedScope=null;
760
+ function syncTargets(){
761
+ state.selected=[...pickedTools];state.selectedRoles=[...helpers];
762
+ if(selectedScope==='all'?pickedTools.length<2:!pickedTools.includes(selectedScope))selectedScope=null;
763
+ state.active=selectedScope??(pickedTools.length>=2?'all':pickedTools[0]??null);
764
+ }
765
+ syncTargets();
766
+ const modeName=id=>id===null?'Choose mode':presets.find(p=>p.id===id)?.label??'Custom';
767
+ function el(tag,attrs={},text){const n=document.createElement(tag);for(const[k,v]of Object.entries(attrs))n.setAttribute(k,v);if(text!==undefined)n.textContent=text;return n;}
768
+ let mounted=false,archiveNavigation=false,activeTransition=null,motionCount=0,motionReady=0,lastAnimationCount=0,currentCommand='',commandRevision=0,lastCopiedCommand=null,linkError='',lastAddress=location.hash;
769
+ const showCommand=`npx --yes --ignore-scripts --package ${RELEASE.packageSpec} agent-policy show`;
770
+ $('show-command').textContent=showCommand;
771
+ $('copy-show').addEventListener('click',async()=>{
772
+ const button=$('copy-show');
773
+ try{if(!navigator.clipboard?.writeText)throw new Error('Clipboard unavailable');await navigator.clipboard.writeText(showCommand);button.textContent='Copied';setTimeout(()=>{button.textContent='Copy';},1600);}
774
+ catch{$('show-command').hidden=false;getSelection()?.selectAllChildren($('show-command'));}
775
+ });
776
+ $('release-status').textContent=RELEASE.unreleased?'Release candidate · npm command available after publication.':`Configuration release ${RELEASE.version}`;
777
+ const guideBase=location.protocol==='file:'?new URL('../',location.href).href:`https://unpkg.com/agent-policy-kit@${RELEASE.version}/`;
778
+ $('agent-guide').href=guideBase+'AGENT_INSTALL.md';$('release-notes').href=guideBase+'CHANGELOG.md';
779
+ const reducedMotion=matchMedia('(prefers-reduced-motion:reduce)');
780
+ function animateUpdate(update){
781
+ hideRoleInfo(true);
782
+ if(reducedMotion.matches||typeof document.startViewTransition!=='function'){update();return;}
783
+ activeTransition?.skipTransition();
784
+ const transition=document.startViewTransition(update);activeTransition=transition;motionCount++;
785
+ transition.ready.then(()=>{motionReady++;lastAnimationCount=document.getAnimations().length;}).catch(()=>{});transition.finished.then(()=>{if(activeTransition===transition)activeTransition=null;}).catch(()=>{});
786
+ }
787
+ let tipTrigger=null,tipTimer=null;
788
+ const tip=$('role-tooltip');
789
+ function hideRoleInfo(immediate=false){
790
+ clearTimeout(tipTimer);tip.classList.remove('visible');tipTrigger?.removeAttribute('aria-describedby');tipTrigger=null;
791
+ if(immediate)tip.hidden=true;else tipTimer=setTimeout(()=>{tip.hidden=true;},130);
792
+ }
793
+ function scheduleHide(){clearTimeout(tipTimer);tipTimer=setTimeout(()=>{if(!tip.matches(':hover')&&document.activeElement!==tipTrigger)hideRoleInfo();},100);}
794
+ function showTip(trigger,...content){
795
+ clearTimeout(tipTimer);tipTrigger?.removeAttribute('aria-describedby');tipTrigger=trigger;
796
+ tip.replaceChildren(...content);
797
+ tip.hidden=false;trigger.setAttribute('aria-describedby','role-tooltip');
798
+ const anchor=trigger.getBoundingClientRect(),box=tip.getBoundingClientRect();
799
+ tip.style.left=Math.max(16,Math.min(anchor.left-12,innerWidth-box.width-16))+'px';
800
+ const below=anchor.bottom+8;tip.style.top=(below+box.height<innerHeight-16?below:Math.max(16,anchor.top-box.height-8))+'px';
801
+ requestAnimationFrame(()=>{if(tipTrigger===trigger)tip.classList.add('visible');});
802
+ }
803
+ function showRoleInfo(role,trigger){
804
+ showTip(trigger,el('strong',{},role.name),el('p',{},role.description),el('div',{class:'definition-label'},'Base role prompt'),el('pre',{},role.prompt),el('p',{class:'definition-note'},'APK saves this description and prompt as a native role. Model and effort are configured separately.'));
805
+ }
806
+ function infoButton(name,show){
807
+ const button=el('button',{type:'button',class:'helper-info','aria-label':'About '+name});button.append(el('span',{class:'info-dot','aria-hidden':'true'},'?'));
808
+ button.addEventListener('pointerenter',()=>show(button));button.addEventListener('pointerleave',scheduleHide);
809
+ button.addEventListener('focus',()=>show(button));button.addEventListener('blur',scheduleHide);button.addEventListener('click',event=>{event.stopPropagation();show(button);});
810
+ return button;
811
+ }
812
+ function roleInfo(role){return infoButton(role.name,button=>showRoleInfo(role,button));}
813
+ const stepInfo={
814
+ 'helpers-heading':'Helpers your main agent can hand work to. Each role gets its own model and effort, so routine work does not run on your most expensive model.',
815
+ 'tools-heading':'The coding tools you use. Only installed ones are configured; nothing else changes. With several tools, click one to adjust it separately.',
816
+ 'mode-heading':'How much of your plan’s limits subagents may use. Light suits entry plans or many parallel sessions; Top-tier suits top plans with few.',
817
+ 'setup-heading':'Run it in a terminal. It writes native settings for installed tools once and exits. Your main model stays unchanged.'
818
+ };
819
+ $('copy-show').before(infoButton('current settings',button=>showTip(button,el('strong',{},'Check current settings'),el('p',{},'Copies a read-only command. Run it in a terminal to see the roles, models, effort and parallel limits your coding tools use now. It changes nothing.'),el('pre',{},showCommand))));
820
+ for(const [id,text]of Object.entries(stepInfo)){const heading=$(id),name=heading.textContent;heading.after(infoButton(name,button=>showTip(button,el('strong',{},name),el('p',{},text))));}
821
+ tip.addEventListener('pointerenter',()=>clearTimeout(tipTimer));tip.addEventListener('pointerleave',scheduleHide);
822
+ document.addEventListener('keydown',event=>{if(event.key==='Escape')hideRoleInfo();});
823
+ document.addEventListener('pointerdown',event=>{if(!tip.contains(event.target)&&!tipTrigger?.contains(event.target))hideRoleInfo();});
824
+ window.addEventListener('resize',()=>hideRoleInfo(true));window.addEventListener('scroll',()=>hideRoleInfo(true),{passive:true});
825
+ window.getTeamBuilderMotion=()=>({supported:typeof document.startViewTransition==='function',reduced:reducedMotion.matches,count:motionCount,active:!!activeTransition,ready:motionReady,animations:lastAnimationCount,duration:180});
826
+
827
+ function flashLabel(node,color='var(--yellow-paper)'){
828
+ if(reducedMotion.matches||typeof node.animate!=='function')return;const expected=node.textContent;
829
+ const flash=()=>{
830
+ if(!node.isConnected||node.textContent!==expected||reducedMotion.matches)return;
831
+ node.getAnimations?.().forEach(animation=>animation.cancel());
832
+ node.animate([{backgroundColor:color,offset:0},{backgroundColor:color,offset:.5},{backgroundColor:'transparent',offset:1}],{duration:4000,easing:'linear'});
833
+ };
834
+ if(activeTransition)activeTransition.finished.then(flash).catch(()=>{});else requestAnimationFrame(flash);
835
+ }
836
+ function toolModeLabel(client){
837
+ const text=modeName(A.modeFor(state,client));let node=toolModeLabels.get(client);
838
+ if(!node){node=el('small',{},text);toolModeLabels.set(client,node);}
839
+ else if(node.textContent!==text){node.textContent=text;flashLabel(node);}
840
+ return node;
841
+ }
842
+ function renderPickers(){
843
+ for(const kind of ['helpers','tools']){
844
+ const isRole=kind==='helpers',chosen=isRole?helpers:pickedTools,available=isRole?roles:clients.map(id=>({id,name:toolName(id)}));
845
+ const box=$(isRole?'selected-helpers':'selected-tools'),options=$(isRole?'helper-options':'tool-options');box.replaceChildren();options.replaceChildren();box.hidden=false;
846
+ if(available.some(item=>!chosen.includes(item.id))){
847
+ const all=el('button',{type:'button',class:'suggestion add-all','aria-label':isRole?'Add all subagent roles':'Add all coding tools'},'Add all');
848
+ all.addEventListener('click',()=>{const next=A.addAll(chosen,available.map(item=>item.id));if(isRole)helpers=next;else pickedTools=next;render();});
849
+ options.append(all);
850
+ }
851
+ box.classList.toggle('is-empty',!chosen.length);
852
+ if(isRole&&!chosen.length)box.append(el('span',{class:'empty'},'Add roles from below'));
853
+ if(!isRole&&!chosen.length)box.append(el('span',{class:'empty'},'Add coding tools from below'));
854
+ if(!isRole&&chosen.length>=2){const all=el('button',{type:'button',class:'tool-scope scope-all','aria-label':'Configure all selected tools','aria-pressed':String(state.active==='all')},'All');all.style.viewTransitionName='tool-all';all.addEventListener('click',()=>{selectedScope='all';render();});box.append(all);}
855
+ const ordered=isRole?available:[...chosen.map(id=>available.find(item=>item.id===id)).filter(Boolean),...available.filter(item=>!chosen.includes(item.id))];
856
+ for(const item of ordered){
857
+ if(!chosen.includes(item.id)){
858
+ const add=el('button',{type:'button',class:'suggestion','aria-label':'Add '+item.name});add.append(el('span',{class:'plus','aria-hidden':'true'},'+'),document.createTextNode(item.name));
859
+ add.addEventListener('click',()=>{if(isRole){if(!helpers.includes(item.id))helpers.push(item.id);}else if(!pickedTools.includes(item.id)){pickedTools.push(item.id);}render();});if(isRole){const option=el('span',{class:'helper-option'});option.style.viewTransitionName='helper-'+item.id;option.append(add,roleInfo(item));options.append(option);}else{add.style.viewTransitionName='tool-option-'+item.id;options.append(add);}continue;
860
+ }
861
+ const tag=el('span',{class:isRole?'tag':'tool-item'+(state.active===item.id?' active':'')});
862
+ tag.style.viewTransitionName=(isRole?'helper-':'tool-')+item.id;
863
+ if(isRole)tag.append(el('span',{class:'tag-label'},item.name),roleInfo(item));
864
+ else{const main=el('button',{type:'button',class:'tool-scope','aria-label':'Configure '+item.name,'aria-pressed':String(state.active===item.id)});main.append(el('span',{},item.name),toolModeLabel(item.id));main.addEventListener('click',()=>{selectedScope=item.id;render();});tag.append(main);}
865
+ const remove=el('button',{type:'button',class:isRole?'remove':'tool-remove','aria-label':'Remove '+item.name},'×');remove.addEventListener('click',()=>{if(isRole){helpers=helpers.filter(id=>id!==item.id);}else{pickedTools=pickedTools.filter(id=>id!==item.id);}render();});tag.append(remove);box.append(tag);
866
+ }
867
+ }
868
+
869
+ }
870
+ function apply(preset){
871
+ const message=state.active==='all'?`Apply ${preset.label} to all selected tools? This replaces their individual modes, models and effort.`:state.selected.length>1?`Apply ${preset.label} to ${toolName(state.active)} only? Other tools keep their choices.`:`Replace your changes to ${toolName(state.active)} with ${preset.label}?`;
872
+ const next=A.applyPreset(state,preset,()=>window.confirm(message));if(next!==state){state=next;}render();
873
+ }
874
+ function renderModes(){
875
+ const ready=helpers.length>0&&state.selected.length>0;$('mode-empty').hidden=ready;$('mode-panel').hidden=!ready;if(!ready){$('editor').replaceChildren();return;}
876
+ const all=state.active==='all',mode=A.modeFor(state),scope=all?'All selected tools':toolName(state.active);if($('scope-label').textContent!==scope){$('scope-label').textContent=scope;flashLabel($('scope-label'));}
877
+ const options=$('mode-options');options.replaceChildren();
878
+ for(const p of [...presets,{id:'custom',label:'Custom'}]){const label=el('label',{class:'mode-option'}),radio=el('input',{type:'radio',name:'mode',value:p.id,'aria-label':p.label});label.style.viewTransitionName='mode-'+p.id;radio.checked=mode===p.id;radio.addEventListener('change',()=>{if(p.id==='custom'){for(const client of (all?state.selected:[state.active])){state.profiles[client].custom=true;state.profiles[client].modeSelected=true;}render();}else apply(p);});label.append(radio,el('span',{},p.label));options.append(label);}
879
+ renderModeNotice();renderTopModels();
880
+ $('advanced').hidden=all||mode===null;renderEditor();
881
+ }
882
+ function topTargets(){
883
+ if(A.modeFor(state)!=='quality')return [];
884
+ return (state.active==='all'?state.selected:[state.active]).filter(client=>A.topModelRoles(state,client).some(role=>helpers.includes(role)));
885
+ }
886
+ function renderTopModels(){
887
+ const targets=topTargets(),toggle=$('top-models-toggle');$('top-models').hidden=!targets.length;if(!targets.length)return;
888
+ const names=targets.map(client=>{const top=state.profiles[client].top;return RELEASE.catalog.clients[client].models.find(model=>model.id===top)?.label??top;});
889
+ const text=state.active==='all'?`Use top models (${names.join(', ')}) for code, review and tests`:`Use ${names[0]} for code, review and tests`;
890
+ if($('top-models-label').textContent!==text)$('top-models-label').textContent=text;
891
+ const on=targets.filter(client=>A.topModelsOn(state,client)).length;toggle.setAttribute('aria-checked',String(on===targets.length));toggle.toggleAttribute('data-mixed',on>0&&on<targets.length);
892
+ }
893
+ function renderModeNotice(){
894
+ const all=state.active==='all',mode=A.modeFor(state),notice=$('mode-notice');
895
+ const shared=!all&&mode!==null&&mode!=='custom'?A.presetModelSummary(presets,state.active):{same:false,model:null};
896
+ const sharedModel=shared.model?RELEASE.catalog.clients[state.active].models.find(model=>model.id===shared.model)?.label??shared.model:'the same models';
897
+ const message=mode==='custom'?(all?'Open a coding tool to customize its models and effort.':`Custom models and effort for ${toolName(state.active)}.`):shared.same?`${toolName(state.active)} uses ${sharedModel} for every role in every mode. Modes change only how many subagents run at once.`:(presets.find(p=>p.id===mode)?.description??'');
898
+ if(notice.textContent!==message){notice.replaceChildren();if(mode==='custom'&&all)notice.append('Open a ',el('strong',{},'coding tool'),' to customize its models and effort.');else notice.append(message);}
899
+ notice.hidden=!message;
900
+ }
901
+ function renderEditor(){
902
+ const parent=$('editor');parent.replaceChildren();if(!helpers.length||!state.active||state.active==='all'||state.profiles[state.active].modeSelected===false)return;
903
+ const client=state.active,catalog=RELEASE.catalog.clients[client],profile=state.profiles[client].preferences;
904
+ const header=el('div',{class:'editor-head','aria-hidden':'true'});for(const label of ['Role','Model','Effort'])header.append(el('span',{},label));parent.append(header);
905
+ for(const role of roles.filter(role=>helpers.includes(role.id))){
906
+ const choice=state.jobs[client][role.id],row=el('div',{class:'editor editor-row','data-helper-id':role.id,role:'group','aria-label':`${role.name} settings for ${toolName(client)}`});
907
+ row.style.viewTransitionName=`config-${client}-${role.id}`;
908
+ const name=el('div',{class:'editor-name'});name.append(el('span',{},role.name),roleInfo(role));row.append(name);
909
+ const modelControl=el('div',{class:'model-control'}),modelSelect=el('select',{'aria-label':`${role.name} model`,'data-model-role':role.id});catalog.models.forEach(model=>modelSelect.append(el('option',{value:model.id},model.label)));if(client!=='agy')modelSelect.append(el('option',{value:'__custom__'},'Custom model…'));
910
+ const known=catalog.models.some(model=>model.id===choice.model);modelSelect.value=known?choice.model:'__custom__';
911
+ const custom=el('input',{type:'text',class:'custom-model','aria-label':`${role.name} custom model ID`,placeholder:'Native model ID',autocomplete:'off',spellcheck:'false',maxlength:'128'});custom.hidden=known;custom.value=known?'':choice.model;
912
+ modelSelect.addEventListener('change',()=>{if(modelSelect.value==='__custom__'){state.jobs[client][role.id]={model:'',effort:choice.effort};state.profiles[client].custom=true;state.profiles[client].modeSelected=true;render();const focus=()=>{if(state.active===client)document.querySelector(`[aria-label="${role.name} custom model ID"]`)?.focus();};if(activeTransition)activeTransition.finished.then(focus);else focus();return;}state.jobs[client][role.id]=A.preferenceForModel(profile,role.id,modelSelect.value,state.jobs[client],catalog,client==='kimi');state.profiles[client].custom=true;state.profiles[client].modeSelected=true;render();});
913
+ custom.addEventListener('input',()=>{state.jobs[client][role.id]=A.preferenceForModel(profile,role.id,custom.value.trim(),state.jobs[client],catalog,client==='kimi');state.profiles[client].custom=true;state.profiles[client].modeSelected=true;custom.setAttribute('aria-invalid',String(!IDENTIFIER.test(custom.value.trim())||(client==='kimi'&&custom.value.trim()==='primary')));renderEfforts();renderResult();});
914
+ modelControl.append(modelSelect,custom);row.append(modelControl);
915
+ const group=el('div',{class:'efforts',role:'group','aria-label':`${role.name} effort`});
916
+ function renderEfforts(){
917
+ group.replaceChildren();const current=state.jobs[client][role.id],levels=A.allowedEfforts(catalog,current.model).filter(level=>level!==null);
918
+ if(!levels.length)group.append(el('span',{class:'unavailable',title:'Native effort setting unavailable for this model'},'—'));
919
+ for(const level of levels){const button=el('button',{type:'button','data-effort':level,'aria-label':`${role.name} effort ${level}`,'aria-pressed':String(current.effort===level)},level==='xhigh'?'XHigh':level[0].toUpperCase()+level.slice(1));button.addEventListener('click',()=>{A.updateEffort(state,client,role.id,level);render();});group.append(button);}
920
+ }
921
+ renderEfforts();
922
+ row.append(group);parent.append(row);
923
+ }
924
+ }
925
+ function freshForm(){
926
+ state=A.initialState(initial.preferences,initial.id,{empty:true});helpers=[...state.selectedRoles];pickedTools=[];selectedScope=null;lastCopiedCommand=null;commandRevision++;for(const node of toolModeLabels.values())node.getAnimations?.().forEach(animation=>animation.cancel());toolModeLabels.clear();
927
+ }
928
+ function loadAddress(first=false){
929
+ try{
930
+ const data=decodeFormState(location.hash,RELEASE);
931
+ if(data){
932
+ freshForm();helpers=[...data.roles];pickedTools=data.tools.map(tool=>tool.id);selectedScope=data.scope;
933
+ state=A.restoreState(data,initial.preferences,presets,initial.id);
934
+ }else if(!first)freshForm();
935
+ linkError='';
936
+ }catch(error){
937
+ const archived=archivedReleaseUrl(error,location.href,RELEASE.hostedReleases??[]);
938
+ if(archived){archiveNavigation=true;location.replace(archived);return;}
939
+ freshForm();linkError=error?.code==='SHARE_RELEASE_MISMATCH'?'Open this setup link with its matching APK release, or reset the form.':'This setup link is invalid. Reset the form to start again.';
940
+ }
941
+ }
942
+ function publishAddress(){
943
+ let message=linkError;
944
+ if(!message)try{
945
+ const fragment=encodeFormState({state,helpers,pickedTools,selectedScope},RELEASE);
946
+ if(location.hash!==fragment)history.replaceState(history.state,'',location.pathname+location.search+fragment);
947
+ lastAddress=fragment;
948
+ }catch{message=pickedTools.some(client=>{const cap=A.concurrencyFor(state,client);return !Number.isInteger(cap)||cap<1||cap>32;})?'Check parallel limits in the coding tool details.':'Check your model IDs before sharing this setup.';}
949
+ $('link-error').textContent=message;$('link-error').hidden=!message;
950
+ }
951
+ function setStepHint(number,message){
952
+ const node=$('step-hint-'+number);if(node.dataset.message===message)return;const wasHidden=node.hidden;node.dataset.message=message;
953
+ node.getAnimations?.().forEach(animation=>animation.cancel());node.dataset.success=String(number===4&&!!message);
954
+ const attention=()=>{if(node.dataset.message!==message||!message||reducedMotion.matches||typeof node.animate!=='function')return;const color=number===4?'var(--success-paper)':'var(--yellow-paper)';node.animate([{backgroundColor:color,offset:0},{backgroundColor:color,offset:.5},{backgroundColor:'transparent',offset:1}],{duration:4000,easing:'linear'});};
955
+ if(!message){
956
+ if(!activeTransition&&!reducedMotion.matches&&!wasHidden&&typeof node.animate==='function'){
957
+ node.animate([{opacity:1},{opacity:0,transform:'translateY(-2px)'}],{duration:120,easing:'ease-out'}).finished.then(()=>{if(node.dataset.message===''){node.hidden=true;node.textContent='';}}).catch(()=>{});
958
+ }else{node.hidden=true;node.textContent='';}
959
+ return;
960
+ }
961
+ node.textContent=message;node.hidden=false;
962
+ if(activeTransition)activeTransition.finished.then(attention).catch(()=>{});
963
+ else if(wasHidden&&!reducedMotion.matches&&typeof node.animate==='function')node.animate([{opacity:0,transform:'translateY(2px)'},{opacity:1,transform:'none'}],{duration:160,easing:'ease-out'}).finished.then(attention).catch(()=>{});
964
+ else attention();
965
+ }
966
+ function flashStep(marker,complete){
967
+ marker.getAnimations?.().forEach(animation=>animation.cancel());if(reducedMotion.matches||typeof marker.animate!=='function')return;
968
+ const expected=String(complete),flash=()=>{
969
+ if(marker.dataset.complete!==expected||reducedMotion.matches)return;
970
+ const color=complete?'var(--success-line)':'var(--yellow-paper)',base=getComputedStyle(marker).backgroundColor;
971
+ marker.animate([{backgroundColor:color,offset:0},{backgroundColor:color,offset:.5},{backgroundColor:base,offset:1}],{duration:4000,easing:'linear'});
972
+ };
973
+ if(activeTransition)activeTransition.finished.then(flash).catch(()=>{});
974
+ else marker.animate([{opacity:0},{opacity:1}],{duration:160,easing:'ease-out'}).finished.then(flash).catch(()=>{});
975
+ }
976
+ function updateProgress(){
977
+ const copied=!!currentCommand&&lastCopiedCommand===currentCommand;
978
+ const complete=[helpers.length>0,pickedTools.length>0,!!currentCommand,copied];
979
+ document.querySelectorAll('.builder>section').forEach((section,index)=>{
980
+ const marker=section.querySelector('.step-number'),value=String(complete[index]),changed=marker.dataset.complete!==undefined&&marker.dataset.complete!==value;section.dataset.complete=value;marker.dataset.complete=value;
981
+ const text=complete[index]?'✓':String(index+1);if(marker.textContent!==text)marker.textContent=text;marker.setAttribute('role','img');marker.setAttribute('aria-label',`Step ${index+1}${complete[index]?' complete':''}`);if(changed)flashStep(marker,complete[index]);
982
+ });
983
+ setStepHint(4,copied?'Copied':'');
984
+ }
985
+ function stepLink(id,text){
986
+ const link=el('a',{href:'#'+id},text);link.addEventListener('click',event=>{event.preventDefault();const target=$(id);target.scrollIntoView({behavior:reducedMotion.matches?'instant':'smooth',block:'center'});target.focus({preventScroll:true});});return link;
987
+ }
988
+ function renderResult(){
989
+ renderModeNotice();
990
+ const client=state.active,visible=clients.includes(client)&&pickedTools.includes(client)&&helpers.length>0&&state.profiles[client].modeSelected!==false;
991
+ $('concurrency-panel').hidden=!visible;
992
+ if(visible){
993
+ const cap=A.concurrencyFor(state,client),validCap=Number.isInteger(cap)&&cap>=1&&cap<=32,capInput=$('max-concurrent');
994
+ if(document.activeElement!==capInput||capInput.dataset.client!==client)capInput.value=cap;
995
+ capInput.dataset.client=client;capInput.setAttribute('aria-invalid',String(!validCap));
996
+ $('concurrency-label').textContent=['kimi','agy'].includes(client)?'Max per session (advisory)':'Max per session';
997
+ $('concurrency-error').hidden=validCap;
998
+ $('decrease-concurrency').disabled=validCap&&cap===1;$('increase-concurrency').disabled=validCap&&cap===32;
999
+ }
1000
+ let next='',summary='Complete the steps above.',detail='',missing=[];
1001
+ if(!helpers.length)missing.push(['helpers-heading','a subagent role in step 1']);
1002
+ if(!pickedTools.length)missing.push(['tools-heading','a coding tool in step 2']);
1003
+ if(!missing.length){
1004
+ if(pickedTools.some(client=>A.modeFor(state,client)===null))missing.push(['mode-heading','a work mode for each selected coding tool in step 3']);
1005
+ else{
1006
+ const {config,errors}=A.buildConfig(state,RELEASE.preferences,RELEASE.catalog);
1007
+ if(errors.length){summary='Check your settings.';detail=errors[0];}
1008
+ else try{next=A.buildCommand(config,RELEASE);summary=`${helpers.length} subagent role${helpers.length===1?'':'s'} · ${pickedTools.length} coding tool${pickedTools.length===1?'':'s'}`;}
1009
+ catch{summary='Command unavailable.';detail='Check the configuration release.';}
1010
+ }
1011
+ }
1012
+ if(next!==currentCommand){commandRevision++;lastCopiedCommand=null;}
1013
+ currentCommand=next;
1014
+ const copied=!!next&&lastCopiedCommand===next;
1015
+ $('copy').disabled=!next;$('copy').textContent='Copy command';$('copy').closest('.output').dataset.ready=String(!!next);
1016
+ $('copy-feedback').hidden=true;$('copy-feedback').textContent='';
1017
+ $('setup-command').value=next;$('setup-command').hidden=!next;$('setup-summary').textContent=summary;
1018
+ const description=$('setup-description');description.replaceChildren();
1019
+ if(missing.length){description.append('Choose ');missing.forEach(([id,text],index)=>{if(index)description.append(' and ');description.append(stepLink(id,text));});description.append('.');}
1020
+ else description.textContent=detail;
1021
+ updateProgress();publishAddress();
1022
+ }
1023
+ function renderNow(){syncTargets();renderPickers();renderModes();renderResult();}
1024
+ function render({fromAddress=false}={}){if(archiveNavigation)return;if(mounted&&!fromAddress)linkError='';if(!mounted){renderNow();mounted=true;}else animateUpdate(renderNow);}
1025
+ function addressChanged(){
1026
+ if(location.hash===lastAddress||(location.hash&&!location.hash.startsWith('#setup=')))return;
1027
+ lastAddress=location.hash;loadAddress();render({fromAddress:true});
1028
+ }
1029
+ window.addEventListener('hashchange',addressChanged);window.addEventListener('popstate',addressChanged);
1030
+ $('reset-form').addEventListener('click',()=>{freshForm();linkError='';render();});
1031
+
1032
+ function refreshConcurrency(){linkError='';toolModeLabel(state.active);renderModes();renderResult();}
1033
+ $('max-concurrent').addEventListener('input',event=>{const client=event.target.dataset.client;if(client!==state.active||!clients.includes(client))return;A.updateConcurrency(state,client,event.target.value);refreshConcurrency();});
1034
+ for(const [id,step]of [['decrease-concurrency',-1],['increase-concurrency',1]])$(id).addEventListener('click',()=>{const client=state.active;if(!clients.includes(client))return;A.stepConcurrency(state,client,step);$('max-concurrent').value=A.concurrencyFor(state,client);refreshConcurrency();});
1035
+ $('top-models-toggle').addEventListener('click',event=>{A.setTopModels(state,topTargets(),event.currentTarget.getAttribute('aria-checked')!=='true');render();});
1036
+ $('setup-command').addEventListener('focus',()=>$('setup-command').select());
1037
+ $('copy').addEventListener('click',async()=>{
1038
+ if(!currentCommand)return;const commandToCopy=currentCommand,revision=commandRevision;
1039
+ try{
1040
+ if(!navigator.clipboard?.writeText)throw new Error('Clipboard unavailable');await navigator.clipboard.writeText(commandToCopy);
1041
+ if(revision!==commandRevision)return;lastCopiedCommand=commandToCopy;$('copy-feedback').hidden=true;$('copy-feedback').textContent='';animateUpdate(updateProgress);
1042
+ }catch{if(revision!==commandRevision)return;$('setup-command').focus();$('setup-command').select();$('copy-feedback').textContent='Command selected. Copy it with your keyboard.';$('copy-feedback').hidden=false;}
1043
+ });
1044
+ window.getTeamBuilderSnapshot=()=>JSON.parse(JSON.stringify({state,helpers,pickedTools,selectedScope,copied:!!currentCommand&&lastCopiedCommand===currentCommand,advancedOpen:true}));
1045
+ loadAddress(true);render();
1046
+ })();
1047
+
1048
+ })();
1049
+ </script></body></html>