agent-policy-kit 0.0.0-stage → 0.1.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,896 @@
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 subagent models for your coding tools with one setup command.">
8
+ <title>APK — configure subagents for your coding tools</title>
9
+ <!-- Public Sans is embedded under the SIL Open Font License.
10
+ Copyright 2015 The Public Sans Project Authors (https://github.com/uswds/public-sans)
11
+
12
+ This Font Software is licensed under the SIL Open Font License, Version 1.1.
13
+ This license is copied below, and is also available with a FAQ at:
14
+ https://scripts.sil.org/OFL
15
+
16
+
17
+ -----------------------------------------------------------
18
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
19
+ -----------------------------------------------------------
20
+
21
+ PREAMBLE
22
+ The goals of the Open Font License (OFL) are to stimulate worldwide
23
+ development of collaborative font projects, to support the font creation
24
+ efforts of academic and linguistic communities, and to provide a free and
25
+ open framework in which fonts may be shared and improved in partnership
26
+ with others.
27
+
28
+ The OFL allows the licensed fonts to be used, studied, modified and
29
+ redistributed freely as long as they are not sold by themselves. The
30
+ fonts, including any derivative works, can be bundled, embedded,
31
+ redistributed and/or sold with any software provided that any reserved
32
+ names are not used by derivative works. The fonts and derivatives,
33
+ however, cannot be released under any other type of license. The
34
+ requirement for fonts to remain under this license does not apply
35
+ to any document created using the fonts or their derivatives.
36
+
37
+ DEFINITIONS
38
+ "Font Software" refers to the set of files released by the Copyright
39
+ Holder(s) under this license and clearly marked as such. This may
40
+ include source files, build scripts and documentation.
41
+
42
+ "Reserved Font Name" refers to any names specified as such after the
43
+ copyright statement(s).
44
+
45
+ "Original Version" refers to the collection of Font Software components as
46
+ distributed by the Copyright Holder(s).
47
+
48
+ "Modified Version" refers to any derivative made by adding to, deleting,
49
+ or substituting -- in part or in whole -- any of the components of the
50
+ Original Version, by changing formats or by porting the Font Software to a
51
+ new environment.
52
+
53
+ "Author" refers to any designer, engineer, programmer, technical
54
+ writer or other person who contributed to the Font Software.
55
+
56
+ PERMISSION & CONDITIONS
57
+ Permission is hereby granted, free of charge, to any person obtaining
58
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
59
+ redistribute, and sell modified and unmodified copies of the Font
60
+ Software, subject to the following conditions:
61
+
62
+ 1) Neither the Font Software nor any of its individual components,
63
+ in Original or Modified Versions, may be sold by itself.
64
+
65
+ 2) Original or Modified Versions of the Font Software may be bundled,
66
+ redistributed and/or sold with any software, provided that each copy
67
+ contains the above copyright notice and this license. These can be
68
+ included either as stand-alone text files, human-readable headers or
69
+ in the appropriate machine-readable metadata fields within text or
70
+ binary files as long as those fields can be easily viewed by the user.
71
+
72
+ 3) No Modified Version of the Font Software may use the Reserved Font
73
+ Name(s) unless explicit written permission is granted by the corresponding
74
+ Copyright Holder. This restriction only applies to the primary font name as
75
+ presented to the users.
76
+
77
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
78
+ Software shall not be used to promote, endorse or advertise any
79
+ Modified Version, except to acknowledge the contribution(s) of the
80
+ Copyright Holder(s) and the Author(s) or with their explicit written
81
+ permission.
82
+
83
+ 5) The Font Software, modified or unmodified, in part or in whole,
84
+ must be distributed entirely under this license, and must not be
85
+ distributed under any other license. The requirement for fonts to
86
+ remain under this license does not apply to any document created
87
+ using the Font Software.
88
+
89
+ TERMINATION
90
+ This license becomes null and void if any of the above conditions are
91
+ not met.
92
+
93
+ DISCLAIMER
94
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
95
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
96
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
97
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
98
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
99
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
100
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
101
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
102
+ OTHER DEALINGS IN THE FONT SOFTWARE.
103
+ -->
104
+
105
+ <style>
106
+ /* Shared getacc.dev base style snapshot. Source: https://getacc.dev/assets/base.css */
107
+ /* 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. */
108
+ :root {
109
+ color-scheme: light; --white: #fff; --paper: #f5f7fb; --ink: #19283e;
110
+ --muted: #59657a; --accent: #284b91; --accent-hover: #193667; --brand-blue: #3158c3; --brand-yellow: #f2c94c; --amber: #795700; --yellow-paper: #fff4ce; --line: #e0e5ed; --reply: #fff;
111
+ --selection: #fff4ce; --scrollbar: #9eafd0; --control-hover: #eaf0ff;
112
+ --sans: "Public Sans", sans-serif; --serif: Georgia, serif;
113
+ }
114
+ * { box-sizing: border-box; }
115
+ html { scrollbar-gutter: stable; scroll-behavior: smooth; scroll-padding-top: 24px; background: var(--white); }
116
+ 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); }
117
+ ::selection { color: var(--ink); background: var(--selection); }
118
+ a { color: var(--accent); text-decoration-thickness: 1px; text-underline-offset: 3px; }
119
+ a:hover { color: var(--accent-hover); text-decoration-thickness: 2px; }
120
+ button, input, summary { font: inherit; }
121
+ button, summary { -webkit-tap-highlight-color: transparent; }
122
+ button { cursor: pointer; }
123
+ button:disabled { cursor: wait; opacity: .7; }
124
+ :focus-visible { outline: 2px solid var(--accent); outline-offset: 4px; }
125
+ [hidden] { display: none !important; }
126
+ img, svg { max-width: 100%; }
127
+ p, figure { margin: 0; }
128
+ p + p { margin-top: 1em; }
129
+ h1, h2, h3 { margin: 0; text-wrap: balance; font-family: var(--sans); }
130
+ h1, h2 { font-weight: 600; line-height: 1.25; letter-spacing: -.02em; }
131
+ h1 { font-size: 36px; }
132
+ h2 { font-size: 25px; }
133
+ h3 { font-size: 17px; font-weight: 600; line-height: 1.45; }
134
+ .shell { width: min(calc(100% - 64px), 1120px); margin-inline: auto; }
135
+ .icon { width: 18px; height: 18px; flex: 0 0 auto; }
136
+ .skip-link { position: absolute; z-index: 100; top: 10px; left: 16px; padding: 8px 14px; background: var(--white); color: var(--accent); transform: translateY(-180%); }
137
+ .skip-link:focus { transform: translateY(0); }
138
+ .site-header { display: flex; align-items: center; gap: 28px; min-height: 73px; border-bottom: 1px solid var(--line); }
139
+ .brand { display: flex; align-items: center; gap: 12px; color: var(--ink); text-decoration: none; white-space: nowrap; }
140
+ .wordmark { font: 650 27px/1 var(--sans); letter-spacing: -.035em; color: var(--ink); text-decoration: none; }
141
+ .brand-type { display: flex; flex-direction: column; gap: 6px; padding-block: 12px; }
142
+ .brand-name { font-size: 11px; line-height: 1.3; letter-spacing: .005em; color: var(--muted); }
143
+ .brand-symbol { width: 48px; height: 34px; }
144
+ .desktop-nav { display: flex; align-items: center; gap: 24px; margin-left: auto; font-size: 14px; }
145
+ .desktop-nav > a { color: var(--ink); text-decoration: none; padding-block: 20px; }
146
+ .desktop-nav a[aria-current] { color: var(--accent); text-decoration: underline; text-decoration-thickness: 2px; }
147
+ .reading-menu { position: relative; }
148
+ .reading-menu:has([aria-current="page"]) > summary { color: var(--accent); text-decoration: underline; text-decoration-thickness: 2px; text-underline-offset: 3px; }
149
+ .reading-menu summary { cursor: pointer; color: var(--ink); padding-block: 20px; }
150
+ .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; }
151
+ .reading-menu nav a { display: block; padding-block: 8px; }
152
+ .header-actions { display: flex; align-items: center; gap: 24px; font-size: 14px; }
153
+ .github-star { display: inline-flex; align-items: center; min-width: 106px; min-height: 28px; line-height: 1; }
154
+ .github-star > span { display: inline-flex !important; }
155
+ .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; }
156
+ .github-star-mobile { display: none; }
157
+ .search-link { display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 36px; color: var(--ink); }
158
+ .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; }
159
+ .button:hover { background: var(--accent-hover); border-color: var(--accent-hover); color: #fff; }
160
+ .actions { display: flex; align-items: center; gap: 23px; flex-wrap: wrap; }
161
+ .text-link { display: inline-flex; align-items: center; gap: 9px; font-size: 14px; font-weight: 500; }
162
+ .quiet-link { color: var(--muted); font-size: 14px; }
163
+ .mobile-nav { display: none; }
164
+ .mobile-nav summary { cursor: pointer; font-size: 14px; padding-block: 12px; }
165
+ .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; }
166
+ .mobile-nav nav a { display: block; padding-block: 9px; }
167
+ .site-footer { margin-top: 55px; padding-block: 25px; font-size: 13px; color: var(--muted); }
168
+ .footer-links { display: flex; flex-wrap: wrap; gap: 8px 20px; border-top: 1px solid var(--line); padding-top: 20px; }
169
+ .footer-note { margin-top: 15px; display: flex; flex-wrap: wrap; justify-content: space-between; gap: 10px 25px; font-size: 13px; }
170
+ .article-link { border-top: 1px solid var(--line); padding-block: 23px; }
171
+ .article-link-meta { display: flex; gap: 20px; font-size: 13px; color: var(--muted); margin-bottom: 10px; }
172
+ .article-link .article-link-heading { font-size: 22px; line-height: 1.35; max-width: 36ch; }
173
+ .article-link .article-link-heading a { color: var(--ink); text-decoration: none; }
174
+ .article-link .article-link-heading a:hover { color: var(--accent); text-decoration: underline; }
175
+ .article-link p { margin-top: 12px; color: var(--muted); font-size: 15px; max-width: 70ch; }
176
+ .article-link .text-link { margin-top: 15px; font-size: 14px; }
177
+ 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); }
178
+ code { font-family: ui-monospace, "SFMono-Regular", Consolas, monospace; font-size: .85em; }
179
+ pre code { font-size: inherit; }
180
+ pre:has(.code-copy) { padding-top: 46px; }
181
+ .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); }
182
+ .code-copy:hover { color: var(--accent); background: var(--control-hover); }
183
+ .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
184
+ @media (max-width: 1000px) {
185
+ .site-header { gap: 20px; }
186
+ .desktop-nav { gap: 16px; }
187
+ .header-actions { gap: 16px; }
188
+ }
189
+ @media (max-width: 900px) {
190
+ .desktop-nav, .github-star-desktop { display: none; }
191
+ .header-actions { margin-left: auto; }
192
+ .mobile-nav { display: block; }
193
+ .mobile-nav nav .github-star-mobile { display: flex; margin-block: 12px 4px; }
194
+ .mobile-nav nav .github-button { padding-block: 4px; }
195
+ }
196
+ @media (max-width: 700px) {
197
+ .shell { width: calc(100% - 40px); }
198
+ .site-header { min-height: 74px; gap: 12px; }
199
+ .brand { gap: 9px; }
200
+ .brand-symbol { width: 42px; height: auto; }
201
+ .wordmark { font-size: 25px; }
202
+ .brand-type { gap: 4px; }
203
+ .brand-name { font-size: 10px; }
204
+ .header-actions { gap: 12px; }
205
+ .site-footer { margin-top: 37px; padding-top: 0; }
206
+ .footer-note { font-size: 13px; }
207
+ }
208
+ @media (max-width: 350px) { .header-actions > .search-link { display: none; } }
209
+ @media (prefers-reduced-motion: reduce) {
210
+ html { scroll-behavior: auto; }
211
+ *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; }
212
+ }
213
+
214
+ @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')}
215
+ :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}
216
+ *{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)}
217
+ 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}.concept{margin-left:auto;padding:4px 7px;border:1px solid var(--line);border-radius:4px;color:var(--muted);font-size:var(--text-meta);line-height:1.3}
218
+ .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}
219
+ .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}
220
+ .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}
221
+ .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)}
222
+ .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)}
223
+ .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}
224
+ .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}
225
+ .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 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}
226
+ footer{display:flex;justify-content:space-between;gap:20px;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}
227
+ @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}}
228
+
229
+ html{scrollbar-gutter:stable}body{overflow-anchor:none}
230
+ .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)}
231
+ .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}
232
+ .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)}
233
+ button,.helper-option{transition:background-color 120ms ease,border-color 120ms ease,color 120ms ease}
234
+ 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}
235
+ #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}
236
+ ::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}
237
+ .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}
238
+ @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}}
239
+
240
+
241
+ .editor-head,.editor-row{display:grid;grid-template-columns:156px minmax(0,1fr) minmax(0,1fr);gap:16px;align-items:center}
242
+ .editor-head{margin-top:16px;padding-bottom:9px;color:var(--muted);font-size:var(--text-support);line-height:1.4}
243
+ .editor-row{margin-top:0;padding:11px 0;border-top:1px solid var(--line)}
244
+ .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}
245
+
246
+
247
+ .advanced h3{margin:0 0 12px;font-size:var(--text-ui);font-weight:600;line-height:1.5;color:var(--ink)}
248
+ .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}.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)}
249
+
250
+
251
+ #selected-tools[hidden]+#tool-options{margin-top:0}
252
+
253
+ .tool-group .empty{align-self:center;padding:8px 9px}
254
+ .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)}
255
+
256
+ .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)}
257
+
258
+ .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}}
259
+ @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{flex-wrap:wrap;gap:8px}}
260
+ </style></head><body>
261
+ <header><span class="mark" aria-hidden="true">apk</span><span class="brand">Agent Policy Kit</span><span class="concept" id="release-version"></span><button type="button" class="reset-form" id="reset-form">Reset form</button></header>
262
+ <main>
263
+ <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">
264
+ <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>
265
+ <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>
266
+ </div></details><p class="link-error" id="link-error" role="status" hidden></p></div>
267
+ <div class="builder">
268
+ <section aria-labelledby="helpers-heading"><div class="step-heading"><span class="step-number">1</span><h2 id="helpers-heading" tabindex="-1">Subagent roles</h2><span class="step-hint" id="step-hint-1" role="status" aria-live="polite" aria-atomic="true" hidden></span></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>
269
+ <section aria-labelledby="tools-heading"><div class="step-heading"><span class="step-number">2</span><h2 id="tools-heading" tabindex="-1">Coding tools</h2><span class="step-hint" id="step-hint-2" role="status" aria-live="polite" aria-atomic="true" hidden></span></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>
270
+ <section aria-labelledby="mode-heading"><div class="step-heading"><span class="step-number">3</span><h2 id="mode-heading" tabindex="-1">Work mode</h2><span class="step-hint" id="step-hint-3" role="status" aria-live="polite" aria-atomic="true" hidden></span></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><section class="advanced" id="advanced" aria-label="Models and effort"><h3>Models &amp; effort</h3><div id="editor"></div></section></div></section>
271
+ <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><p class="release-status" id="release-status"></p></section>
272
+ </div>
273
+ </main>
274
+ <div id="role-tooltip" class="role-tooltip" role="tooltip" hidden></div>
275
+ <footer><span>Writes native config, then exits. Main model unchanged.</span><span><a id="agent-guide">AI installation guide</a> · <a id="release-notes">Release notes</a></span></footer>
276
+ <script>
277
+ 'use strict';
278
+ const RELEASE = {"schemaVersion":1,"version":"0.1.0","preset":"balanced","presets":[{"id":"fast","label":"Fast & economical","description":"For small, well-defined tasks. Lighter models, with extra reasoning for review and tests.","preferences":{"schemaVersion":1,"maxConcurrent":3,"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":[]}}}},{"id":"balanced","label":"Balanced","description":"Stronger coding and verification, lighter exploration and mechanical work.","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"},"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":[]}}}},{"id":"quality","label":"Quality first","description":"For demanding implementation and verification. Prioritizes capability over response time and usage.","preferences":{"schemaVersion":1,"maxConcurrent":3,"clients":{"codex":{"code":{"model":"gpt-6-astra","effort":"xhigh"},"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-fable-5-1","effort":"xhigh"},"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.1-pro","effort":"max"},"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":[]}}}}],"catalogReviewedAt":"2026-10-30","preferencesHash":"d7783c6514ee952314de2f55a4d39d2db055b4d3da4e8139c2c6f7f5b17cb40d","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.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.1.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"},"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":[]}}},"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."}}},"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};
279
+ // Pure command codec, also embedded in the offline configuration page.
280
+ const TOOL_FLAGS=Object.freeze({codex:'codex',claude:'claude',kimi:'kimi',antigravity:'agy'});
281
+ const EXPLICIT_FIELDS=Object.freeze(['roles','max-concurrent',...Object.keys(TOOL_FLAGS),...Object.keys(TOOL_FLAGS).map(flag=>'avoid-'+flag)]);
282
+ const EXPLICIT_MODEL=/^[A-Za-z0-9][A-Za-z0-9._:@/\[\]-]{0,127}$/;
283
+ const EXPLICIT_EFFORTS=['none','minimal','low','medium','high','xhigh','max'];
284
+ function invalidExplicit(){throw Object.assign(new Error('Invalid explicit configuration.'),{code:'INVALID_EXPLICIT_CONFIG'});}
285
+ function explicitList(value,limit){
286
+ if(typeof value!=='string'||!value.length)invalidExplicit();
287
+ const list=value.split(',').map(value=>value.trim());
288
+ if(!list.length||list.length>limit||list.some(value=>!value)||new Set(list).size!==list.length)invalidExplicit();
289
+ return list;
290
+ }
291
+
292
+ function parseExplicitOptions(options,roleIds){
293
+ if(!options||typeof options!=='object'||Array.isArray(options))invalidExplicit();
294
+ const fields=Object.getOwnPropertyDescriptors(options);
295
+ if(Object.entries(fields).some(([key,value])=>!EXPLICIT_FIELDS.includes(key)||value.get||value.set||typeof value.value!=='string'))invalidExplicit();
296
+ options=Object.fromEntries(Object.entries(fields).map(([key,value])=>[key,value.value]));
297
+ if(Object.values(fields).reduce((size,value)=>size+value.value.length,0)>65536)invalidExplicit();
298
+ const requested=explicitList(options.roles,roleIds.length);
299
+ if(requested.some(role=>!roleIds.includes(role)))invalidExplicit();
300
+ const roles=roleIds.filter(role=>requested.includes(role)),maxConcurrent=Number(options['max-concurrent']);
301
+ if(!/^[1-9]\d*$/.test(options['max-concurrent'])||!Number.isInteger(maxConcurrent)||maxConcurrent>32)invalidExplicit();
302
+ for(const flag of Object.keys(TOOL_FLAGS))if(options['avoid-'+flag]!==undefined&&options[flag]===undefined)invalidExplicit();
303
+ const clients={};
304
+ for(const flag of Object.keys(options).filter(flag=>Object.hasOwn(TOOL_FLAGS,flag))){
305
+ const client=TOOL_FLAGS[flag],choices={};
306
+ for(const entry of explicitList(options[flag],roles.length)){
307
+ const at=entry.indexOf('='),role=entry.slice(0,at).trim(),value=entry.slice(at+1).trim();
308
+ if(at<1||!roles.includes(role)||Object.hasOwn(choices,role))invalidExplicit();
309
+ let model=value,effort=null;
310
+ if(client==='agy'){if(!['pro','flash','flash_lite','inherit'].includes(model))invalidExplicit();}
311
+ else{
312
+ const colon=value.lastIndexOf(':');if(colon<1)invalidExplicit();
313
+ model=value.slice(0,colon);const level=value.slice(colon+1);
314
+ if(level!=='native'&&!EXPLICIT_EFFORTS.includes(level))invalidExplicit();effort=level==='native'?null:level;
315
+ }
316
+ if(!EXPLICIT_MODEL.test(model))invalidExplicit();choices[role]={model,effort};
317
+ }
318
+ if(Object.keys(choices).length!==roles.length)invalidExplicit();
319
+ const avoidModels=options['avoid-'+flag]===undefined?[]:explicitList(options['avoid-'+flag],32);
320
+ if(avoidModels.some(model=>!EXPLICIT_MODEL.test(model)))invalidExplicit();
321
+ const first=choices[roles[0]];
322
+ clients[client]={code:{...first},light:{...first},roles:Object.fromEntries(roles.map(role=>[role,choices[role]])),avoidModels};
323
+ }
324
+ if(!Object.keys(clients).length)invalidExplicit();
325
+ return {schemaVersion:1,maxConcurrent,...(roles.length===roleIds.length?{}:{selectedRoles:roles}),clients};
326
+ }
327
+
328
+ function explicitOptions(config,roleCatalog){
329
+ const legacy={worker:'code',reviewer:'code',explorer:'light',routine:'light'};
330
+ if(!Array.isArray(roleCatalog)||!roleCatalog.length)invalidExplicit();
331
+ const definitions=roleCatalog.map(role=>typeof role==='string'?{id:role,kind:legacy[role]}:role);
332
+ 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();
333
+ const roleIds=definitions.map(role=>role.id),kinds=new Map(definitions.map(role=>[role.id,role.kind]));
334
+ if(!config||config.schemaVersion!==1||!config.clients||typeof config.clients!=='object'||Array.isArray(config.clients))invalidExplicit();
335
+ const selected=config.selectedRoles??roleIds;
336
+ if(!Array.isArray(selected)||!selected.length||new Set(selected).size!==selected.length||selected.some(role=>!roleIds.includes(role)))invalidExplicit();
337
+ const roles=roleIds.filter(role=>selected.includes(role));
338
+ const options={roles:roles.join(','),'max-concurrent':String(config.maxConcurrent)};
339
+ for(const [client,preferences]of Object.entries(config.clients)){
340
+ const flag=Object.keys(TOOL_FLAGS).find(flag=>TOOL_FLAGS[flag]===client);if(!flag||!preferences)invalidExplicit();
341
+ options[flag]=roles.map(role=>{
342
+ const selected=preferences.roles?.[role]??preferences[kinds.get(role)];
343
+ if(!selected||typeof selected.model!=='string'||!EXPLICIT_MODEL.test(selected.model)||(selected.effort!==null&&!EXPLICIT_EFFORTS.includes(selected.effort)))invalidExplicit();
344
+ if(client==='agy'&&selected.effort!==null)invalidExplicit();
345
+ return `${role}=${selected.model}${client==='agy'?'':':'+(selected.effort??'native')}`;
346
+ }).join(',');
347
+ if(!Array.isArray(preferences.avoidModels)||preferences.avoidModels.some(model=>typeof model!=='string'||!EXPLICIT_MODEL.test(model)))invalidExplicit();
348
+ if(preferences.avoidModels.length)options['avoid-'+flag]=preferences.avoidModels.join(',');
349
+ }
350
+ parseExplicitOptions(options,roleIds);
351
+ return options;
352
+ }
353
+
354
+ function formatExplicitCommand(config,version,roleCatalog){
355
+ if(typeof version!=='string'||!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(version))throw new Error('Invalid release version.');
356
+ const options=explicitOptions(config,roleCatalog),quote=value=>"'"+value.replaceAll("'","'\"'\"'")+"'";
357
+ const lines=[`npx --yes --ignore-scripts --package agent-policy-kit@${version} agent-policy setup`];
358
+ for(const [name,value]of Object.entries(options))lines.push(`--${name} ${name==='max-concurrent'?value:quote(value)}`);
359
+ lines.push('--apply');return lines.join(' \\\n ');
360
+ }
361
+
362
+ // Pure URL state codec, also embedded in the offline configuration page.
363
+ const SHARE_BYTES=65536,SHARE_TOKEN=87384;
364
+ const SHARE_VERSION=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/;
365
+ const SHARE_UNSAFE=new Set(['__proto__','constructor','prototype']);
366
+ function invalidShare(){throw Object.assign(new Error('Invalid shared configuration link.'),{code:'INVALID_SHARE_LINK'});}
367
+
368
+ // Inspect descriptors before reading any user-supplied value. UI-only cached data is
369
+ // allowed, but accessors, exotic prototypes, sparse arrays and hidden fields are not.
370
+ function shareData(value,depth=0,budget={left:100000}){
371
+ if(--budget.left<0||depth>32)invalidShare();
372
+ if(value===null||value===undefined||typeof value==='string'||typeof value==='boolean')return;
373
+ if(typeof value==='number'){if(!Number.isFinite(value))invalidShare();return;}
374
+ if(typeof value!=='object')invalidShare();
375
+ const array=Array.isArray(value),prototype=Object.getPrototypeOf(value);
376
+ if(array?prototype!==Array.prototype:prototype!==Object.prototype&&prototype!==null)invalidShare();
377
+ const fields=Object.getOwnPropertyDescriptors(value),keys=Reflect.ownKeys(fields);
378
+ if(array&&(keys.length!==value.length+1||value.length>100000))invalidShare();
379
+ for(const key of keys){
380
+ if(typeof key!=='string'||SHARE_UNSAFE.has(key))invalidShare();
381
+ const field=fields[key];
382
+ if(!Object.hasOwn(field,'value')||(!field.enumerable&&!(array&&key==='length')))invalidShare();
383
+ if(array&&key!=='length'&&!/^(0|[1-9]\d*)$/.test(key))invalidShare();
384
+ if(key!=='length'||!array)shareData(field.value,depth+1,budget);
385
+ }
386
+ }
387
+ function shareRecord(value,keys){
388
+ if(!value||typeof value!=='object'||Array.isArray(value))invalidShare();
389
+ if(keys&&(Object.keys(value).length!==keys.length||keys.some(key=>!Object.hasOwn(value,key))))invalidShare();
390
+ return value;
391
+ }
392
+ function shareList(value,known){
393
+ if(!Array.isArray(value)||value.length>known.length||new Set(value).size!==value.length||value.some(id=>typeof id!=='string'||!known.includes(id)))invalidShare();
394
+ return [...value];
395
+ }
396
+ function shareRelease(release){
397
+ shareData(release);shareRecord(release);
398
+ if(typeof release.version!=='string'||!SHARE_VERSION.test(release.version))invalidShare();
399
+ const preferences=shareRecord(release.preferences),clients=Object.keys(shareRecord(preferences.clients));
400
+ const catalog=shareRecord(shareRecord(release.catalog).clients);
401
+ if(!clients.length||clients.some(id=>!Object.hasOwn(catalog,id)||!Array.isArray(catalog[id].efforts)||catalog[id].efforts.some(level=>typeof level!=='string')))invalidShare();
402
+ if(!Array.isArray(release.roles)||!release.roles.length||!Array.isArray(release.presets)||!release.presets.length)invalidShare();
403
+ const roles=new Map(),presets=new Map();
404
+ for(const role of release.roles){
405
+ shareRecord(role);if(typeof role.id!=='string'||!role.id||SHARE_UNSAFE.has(role.id)||roles.has(role.id)||!['code','light'].includes(role.kind))invalidShare();
406
+ roles.set(role.id,role);
407
+ }
408
+ for(const preset of release.presets){
409
+ shareRecord(preset);if(typeof preset.id!=='string'||!preset.id||preset.id==='custom'||SHARE_UNSAFE.has(preset.id)||presets.has(preset.id))invalidShare();
410
+ shareRecord(shareRecord(preset.preferences).clients);presets.set(preset.id,preset);
411
+ }
412
+ if(!presets.has(release.preset))invalidShare();
413
+ return {clients,roles,presets,catalog};
414
+ }
415
+ function shareChoice(choice,id,metadata){
416
+ shareRecord(choice,['model','effort']);
417
+ if(typeof choice.model!=='string'||choice.model.length>128||(choice.effort!==null&&(id==='agy'||!metadata.catalog[id].efforts.includes(choice.effort))))invalidShare();
418
+ return {model:choice.model,effort:choice.effort};
419
+ }
420
+ function sharePayload(payload,release,metadata){
421
+ shareRecord(payload,['v','release','roles','tools','scope','maxConcurrent']);
422
+ if(payload.v!==1||typeof payload.release!=='string'||!SHARE_VERSION.test(payload.release))invalidShare();
423
+ if(payload.release!==release.version)throw Object.assign(new Error('This link uses a different release.'),{code:'SHARE_RELEASE_MISMATCH'});
424
+ if(!Number.isInteger(payload.maxConcurrent)||payload.maxConcurrent<1||payload.maxConcurrent>32)invalidShare();
425
+ const roles=shareList(payload.roles,[...metadata.roles.keys()]);
426
+ if(!Array.isArray(payload.tools)||payload.tools.length>metadata.clients.length)invalidShare();
427
+ const selected=[];
428
+ const tools=payload.tools.map(tool=>{
429
+ shareRecord(tool,['id','mode','base','choices']);
430
+ const {id,mode,base}=tool;
431
+ if(!metadata.clients.includes(id)||selected.includes(id)||!metadata.presets.has(base)||(mode!==null&&mode!=='custom'&&!metadata.presets.has(mode)))invalidShare();
432
+ selected.push(id);shareRecord(tool.choices,roles);
433
+ const choices=Object.fromEntries(roles.map(role=>[role,shareChoice(tool.choices[role],id,metadata)]));
434
+ if(mode!==null&&mode!=='custom'){
435
+ if(mode!==base)invalidShare();
436
+ const clients=metadata.presets.get(mode).preferences.clients;
437
+ if(!Object.hasOwn(clients,id))invalidShare();
438
+ const preferences=shareRecord(clients[id]);
439
+ for(const role of roles){
440
+ const expected=preferences.roles&&Object.hasOwn(preferences.roles,role)?preferences.roles[role]:preferences[metadata.roles.get(role).kind];
441
+ const choice=shareChoice(expected,id,metadata);
442
+ if(choice.model!==choices[role].model||choice.effort!==choices[role].effort)invalidShare();
443
+ }
444
+ }
445
+ return {id,mode,base,choices};
446
+ });
447
+ const scope=payload.scope;
448
+ if(scope!==null&&(typeof scope!=='string'||(scope==='all'?tools.length<2:!selected.includes(scope))))invalidShare();
449
+ return {v:1,release:payload.release,roles,tools,scope,maxConcurrent:payload.maxConcurrent};
450
+ }
451
+ function shareBase64(bytes){return btoa(Array.from(bytes,byte=>String.fromCharCode(byte)).join('')).replaceAll('+','-').replaceAll('/','_').replace(/=+$/,'');}
452
+ function shareJson(text){
453
+ const payload=JSON.parse(text),stack=[];
454
+ // JSON.parse validates syntax; this small token pass preserves duplicate-key
455
+ // evidence that JSON.parse would otherwise discard, including escaped names.
456
+ const tokens=text.match(/"(?:[^"\\]|\\.)*"|[{}\[\]:,]/g)??[];
457
+ for(let at=0;at<tokens.length;at++){
458
+ const token=tokens[at];
459
+ if(token==='{')stack.push(new Set());
460
+ else if(token==='[')stack.push(null);
461
+ else if(token==='}'||token===']')stack.pop();
462
+ else if(token[0]==='"'&&tokens[at+1]===':'){
463
+ const key=JSON.parse(token),keys=stack.at(-1);
464
+ if(!keys||keys.has(key)||SHARE_UNSAFE.has(key))invalidShare();keys.add(key);
465
+ }
466
+ }
467
+ return payload;
468
+ }
469
+
470
+ function encodeFormState(snapshot,release){
471
+ try{
472
+ shareData(snapshot);shareRecord(snapshot);
473
+ const metadata=shareRelease(release),state=shareRecord(snapshot.state),profiles=shareRecord(state.profiles),jobs=shareRecord(state.jobs);
474
+ const roles=shareList(snapshot.helpers,[...metadata.roles.keys()]),selected=shareList(snapshot.pickedTools,metadata.clients);
475
+ const tools=selected.map(id=>{
476
+ if(!Object.hasOwn(profiles,id)||!Object.hasOwn(jobs,id))invalidShare();
477
+ const profile=shareRecord(profiles[id]),choices=shareRecord(jobs[id]);
478
+ if(typeof profile.custom!=='boolean'||(profile.modeSelected!==undefined&&typeof profile.modeSelected!=='boolean'))invalidShare();
479
+ return {id,mode:profile.modeSelected===false?null:profile.custom?'custom':profile.presetId,base:profile.presetId,choices:Object.fromEntries(roles.map(role=>{
480
+ if(!Object.hasOwn(choices,role))invalidShare();return [role,shareChoice(choices[role],id,metadata)];
481
+ }))};
482
+ });
483
+ const payload=sharePayload({v:1,release:release.version,roles,tools,scope:snapshot.selectedScope,maxConcurrent:state.maxConcurrent},release,metadata);
484
+ if(!roles.length&&!tools.length)return '';
485
+ const bytes=new TextEncoder().encode(JSON.stringify(payload));if(bytes.length>SHARE_BYTES)invalidShare();
486
+ const token=shareBase64(bytes);if(token.length>SHARE_TOKEN)invalidShare();return '#setup='+token;
487
+ }catch(error){if(error?.code==='INVALID_SHARE_LINK'||error?.code==='SHARE_RELEASE_MISMATCH')throw error;invalidShare();}
488
+ }
489
+
490
+ function decodeFormState(fragment,release){
491
+ try{
492
+ if(typeof fragment!=='string')invalidShare();
493
+ if(!fragment.startsWith('#setup='))return null;
494
+ const token=fragment.slice(7);
495
+ if(!token.length||token.length>SHARE_TOKEN||!/^[A-Za-z0-9_-]+$/.test(token)||token.length%4===1)invalidShare();
496
+ const binary=atob(token.replaceAll('-','+').replaceAll('_','/'));
497
+ if(binary.length>SHARE_BYTES)invalidShare();
498
+ const bytes=Uint8Array.from(binary,char=>char.charCodeAt(0));if(shareBase64(bytes)!==token)invalidShare();
499
+ const payload=shareJson(new TextDecoder('utf-8',{fatal:true}).decode(bytes));shareData(payload);
500
+ return sharePayload(payload,release,shareRelease(release));
501
+ }catch(error){if(error?.code==='INVALID_SHARE_LINK'||error?.code==='SHARE_RELEASE_MISMATCH')throw error;invalidShare();}
502
+ }
503
+
504
+ (() => {
505
+ const CLIENTS = ['codex', 'claude', 'kimi', 'agy'];
506
+ const ROLES = RELEASE.roles.map(role=>role.id);
507
+ const ROLE_KINDS=Object.fromEntries(RELEASE.roles.map(role=>[role.id,role.kind]));
508
+ const TIERS = ['pro', 'flash', 'flash_lite', 'inherit'];
509
+ const IDENTIFIER = /^[A-Za-z0-9][A-Za-z0-9._:@/\[\]-]{0,127}$/;
510
+ const LABELS = {codex: 'Codex', claude: 'Claude', kimi: 'Kimi', agy: 'Antigravity'};
511
+ const TASKS = Object.fromEntries(RELEASE.roles.map(role=>[role.id,role.name]));
512
+ const NOTES = {codex: '', claude: '', kimi: 'Effort changes apply to every task using the same alias.', agy: 'Native tiers only; per-task effort is unavailable.'};
513
+ const clone = value => JSON.parse(JSON.stringify(value));
514
+ function effective(config, role) {
515
+ return config.roles?.[role] ?? config[ROLE_KINDS[role]];
516
+ }
517
+ function initialState(preferences, presetId = 'balanced', {empty=false}={}) {
518
+ const available = CLIENTS.filter(client => preferences.clients[client]),selected=empty?[]:available;
519
+ return {selected, active: empty?null:'all', maxConcurrent: preferences.maxConcurrent,...(empty?{selectedRoles:[]}:{}),
520
+ profiles: Object.fromEntries(available.map(client => [client, {presetId, custom: false, modeSelected:!empty,presetCap:preferences.maxConcurrent,preferences: clone(preferences.clients[client])}])),
521
+ jobs: Object.fromEntries(available.map(client => [client, Object.fromEntries(ROLES.map(role => [role, clone(effective(preferences.clients[client], role))]))]))};
522
+ }
523
+ function modeFor(state, client = state.active) {
524
+ if (client !== 'all') {const profile=state.profiles[client];return !profile||profile.modeSelected===false?null:profile.custom?'custom':profile.presetId;}
525
+ const modes = (Array.isArray(state.selected)?state.selected:[]).map(client => modeFor(state, client));
526
+ if(!modes.length||modes.some(mode=>mode===null))return null;
527
+ return modes.every(mode => mode === modes[0]) ? modes[0] : 'custom';
528
+ }
529
+ function applyPreset(state, preset, confirmReplace = () => false) {
530
+ const all = state.active === 'all', targets = all ? state.selected : [state.active];
531
+ if (targets.some(client => !preset.preferences.clients[client])) return state;
532
+ const chosen=targets.filter(client=>state.profiles[client]?.modeSelected!==false),replacing=chosen.length>0;
533
+ const mixed=new Set(chosen.map(client=>state.profiles[client].presetId)).size>1,pending=chosen.length<targets.length;
534
+ const edited=chosen.some(client=>{
535
+ const profile=state.profiles[client];
536
+ return (Number.isInteger(profile.presetCap)&&state.maxConcurrent!==profile.presetCap)||ROLES.some(role=>{const current=state.jobs?.[client]?.[role],base=effective(profile.preferences,role);return current?.model!==base.model||current?.effort!==base.effort;});
537
+ });
538
+ if(replacing&&(!all||mixed||pending||edited)&&!confirmReplace())return state;
539
+ const next = clone(state);
540
+ for (const client of targets) {
541
+ const preferences = preset.preferences.clients[client];
542
+ next.profiles[client] = {presetId: preset.id ?? 'balanced', custom: false, modeSelected:true,presetCap:preset.preferences.maxConcurrent,preferences: clone(preferences)};
543
+ next.jobs[client] = Object.fromEntries(ROLES.map(role => [role, clone(effective(preferences, role))]));
544
+ }
545
+ if (all) next.maxConcurrent = preset.preferences.maxConcurrent;
546
+ return next;
547
+ }
548
+ function allowedEfforts(catalog, model) {
549
+ const supported = catalog?.models?.find(choice => choice.id === model)?.efforts ?? catalog?.efforts ?? [];
550
+ return [null, ...new Set(supported.filter(effort => effort !== null))];
551
+ }
552
+ function clientCatalog(client, preferences, catalog = RELEASE.catalog) {
553
+ if (catalog?.clients?.[client]) return catalog.clients[client];
554
+ const config = preferences.clients[client];
555
+ const recommendations = [config.code, config.light, ...Object.values(config.roles ?? {})];
556
+ const efforts = [...new Set(recommendations.map(choice => choice.effort).filter(effort => effort !== null))];
557
+ const ids = client === 'agy' ? TIERS : [...new Set(recommendations.map(choice => choice.model))];
558
+ return {label: LABELS[client], efforts, models: ids.map(id => ({id, label: id, efforts, defaultEffort: recommendations.find(choice => choice.model === id)?.effort ?? null}))};
559
+ }
560
+ function preferenceForModel(config, role, model, jobs = {}, catalog, syncAliases = false) {
561
+ const shared = Object.entries(jobs).find(([otherRole, choice]) => otherRole !== role && choice.model === model)?.[1];
562
+ if (!catalog) {
563
+ const recommended = [config.code, config.light, ...Object.values(config.roles ?? {})].find(choice => choice.model === model);
564
+ return {model, effort: (recommended ?? shared ?? effective(config, role)).effort};
565
+ }
566
+ const allowed = allowedEfforts(catalog, model);
567
+ const current = syncAliases ? shared ?? jobs[role] : jobs[role];
568
+ const documentedDefault = catalog.models?.find(choice => choice.id === model)?.defaultEffort ?? null;
569
+ const effort = current && allowed.includes(current.effort) ? current.effort : allowed.includes(documentedDefault) ? documentedDefault : null;
570
+ return {model, effort};
571
+ }
572
+ function updateEffort(state, client, role, effort) {
573
+ state.profiles[client].custom = true;
574
+ state.profiles[client].modeSelected = true;
575
+ const model = state.jobs[client][role].model;
576
+ state.jobs[client][role].effort = effort;
577
+ if (client === 'kimi') for (const choice of Object.values(state.jobs[client])) if (choice.model === model) choice.effort = effort;
578
+ }
579
+ function buildConfig(state, preferences, catalog = RELEASE.catalog) {
580
+ const errors = [];
581
+ const maxConcurrent = Number(state.maxConcurrent);
582
+ if (!Number.isInteger(maxConcurrent) || maxConcurrent < 1 || maxConcurrent > 32) errors.push('Invalid preset parallelism. Reset defaults.');
583
+ if (!Array.isArray(state.selected) || !state.selected.length) errors.push('Choose at least one coding tool.');
584
+ else if(new Set(state.selected).size!==state.selected.length||state.selected.some(client=>!CLIENTS.includes(client)))errors.push('Choose supported coding tools.');
585
+ const selection=state.selectedRoles===undefined?ROLES:Array.isArray(state.selectedRoles)?state.selectedRoles:[];
586
+ if(!selection.length||new Set(selection).size!==selection.length||selection.some(role=>!ROLES.includes(role)))errors.push('Choose valid subagent roles.');
587
+ const selectedRoles=ROLES.filter(role=>selection.includes(role));
588
+ const clients = {};
589
+ for (const client of (Array.isArray(state.selected)?state.selected:[]).filter(client => CLIENTS.includes(client))) {
590
+ if(state.profiles?.[client]?.modeSelected===false){errors.push(`${LABELS[client]}: choose a work mode.`);continue;}
591
+ const defaults = state.profiles?.[client]?.preferences ?? preferences.clients[client];
592
+ if (!defaults) { errors.push(`${LABELS[client]} has no release defaults.`); continue; }
593
+ const config = clone(defaults);
594
+ const roles = {};
595
+ const choices = [];
596
+ for (const role of selectedRoles) {
597
+ const choice = state.jobs[client]?.[role];
598
+ if (!choice || typeof choice.model !== 'string' || !IDENTIFIER.test(choice.model)) {
599
+ errors.push(`${LABELS[client]} ${TASKS[role]}: enter a valid model ID (1–128 ASCII characters, no spaces).`); continue;
600
+ }
601
+ if (client === 'agy' && (!TIERS.includes(choice.model) || choice.effort !== null)) {
602
+ errors.push(`Antigravity ${TASKS[role]}: choose a supported native tier.`); continue;
603
+ }
604
+ if (client !== 'agy' && !allowedEfforts(clientCatalog(client, {clients: {[client]: defaults}}, catalog), choice.model).includes(choice.effort)) {
605
+ errors.push(`${LABELS[client]} ${TASKS[role]}: choose a supported effort.`); continue;
606
+ }
607
+ if (client === 'kimi' && choice.model === 'primary') {
608
+ errors.push(`Kimi ${TASKS[role]}: choose an explicit model alias, not primary.`); continue;
609
+ }
610
+ const selected = {model: choice.model, effort: choice.effort};
611
+ choices.push(selected);
612
+ const fallback = config[ROLE_KINDS[role]];
613
+ if (selected.model !== fallback.model || selected.effort !== fallback.effort) roles[role] = selected;
614
+ }
615
+ if (client === 'kimi') {
616
+ const aliases = new Map();
617
+ for (const choice of choices) {
618
+ if (choice.effort === null) continue;
619
+ if (aliases.has(choice.model) && aliases.get(choice.model) !== choice.effort) {
620
+ errors.push(`Kimi: tasks using the same alias must use the same effort.`); break;
621
+ }
622
+ aliases.set(choice.model, choice.effort);
623
+ }
624
+ }
625
+ delete config.roles;
626
+ if (Object.keys(roles).length) config.roles = roles;
627
+ const chosen = new Set(choices.map(choice => choice.model));
628
+ config.avoidModels = config.avoidModels.filter(model => !chosen.has(model));
629
+ clients[client] = config;
630
+ }
631
+ return {config: errors.length ? null : {schemaVersion: preferences.schemaVersion, maxConcurrent,...(selectedRoles.length===ROLES.length?{}:{selectedRoles}), clients}, errors};
632
+ }
633
+ function encodeConfig(config) {
634
+ const bytes = new TextEncoder().encode(JSON.stringify(config));
635
+ let binary = '';
636
+ for (const byte of bytes) binary += String.fromCharCode(byte);
637
+ return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
638
+ }
639
+ function buildCommand(config, release) {return formatExplicitCommand(config,release.version,RELEASE.roles);}
640
+ globalThis.APKConfigurator = Object.freeze({initialState, modeFor, applyPreset, effective, allowedEfforts, preferenceForModel, updateEffort, buildConfig, encodeConfig, buildCommand});
641
+ if (typeof document === 'undefined') return;
642
+
643
+ (() => {
644
+ const A=globalThis.APKConfigurator,$=id=>document.getElementById(id);
645
+ const roles=RELEASE.roles,toolModeLabels=new Map();
646
+ const clients=Object.keys(RELEASE.preferences.clients),toolName=id=>RELEASE.catalog.clients[id].label;
647
+ const presets=RELEASE.presets,initial=presets.find(p=>p.id==='balanced')??presets[0];
648
+ let state=A.initialState(initial.preferences,initial.id,{empty:true});
649
+ let helpers=[],pickedTools=[];
650
+ let selectedScope=null;
651
+ function syncTargets(){
652
+ state.selected=[...pickedTools];state.selectedRoles=[...helpers];
653
+ if(selectedScope==='all'?pickedTools.length<2:!pickedTools.includes(selectedScope))selectedScope=null;
654
+ state.active=selectedScope??(pickedTools.length>=2?'all':pickedTools[0]??null);
655
+ }
656
+ syncTargets();
657
+ const modeName=id=>id===null?'Choose mode':presets.find(p=>p.id===id)?.label??'Custom';
658
+ 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;}
659
+ let mounted=false,activeTransition=null,motionCount=0,motionReady=0,lastAnimationCount=0,currentCommand='',commandRevision=0,lastCopiedCommand=null,linkError='',lastAddress=location.hash;
660
+ $('release-version').textContent='v'+RELEASE.version;
661
+ $('release-status').textContent=RELEASE.unreleased?'Release candidate · npm command available after publication.':`Configuration release ${RELEASE.version}`;
662
+ const guideBase=location.protocol==='file:'?new URL('../',location.href).href:`https://unpkg.com/agent-policy-kit@${RELEASE.version}/`;
663
+ $('agent-guide').href=guideBase+'AGENT_INSTALL.md';$('release-notes').href=guideBase+'CHANGELOG.md';
664
+ const reducedMotion=matchMedia('(prefers-reduced-motion:reduce)');
665
+ function animateUpdate(update){
666
+ hideRoleInfo(true);
667
+ if(reducedMotion.matches||typeof document.startViewTransition!=='function'){update();return;}
668
+ activeTransition?.skipTransition();
669
+ const transition=document.startViewTransition(update);activeTransition=transition;motionCount++;
670
+ transition.ready.then(()=>{motionReady++;lastAnimationCount=document.getAnimations().length;}).catch(()=>{});transition.finished.then(()=>{if(activeTransition===transition)activeTransition=null;}).catch(()=>{});
671
+ }
672
+ let tipTrigger=null,tipTimer=null;
673
+ const tip=$('role-tooltip');
674
+ function hideRoleInfo(immediate=false){
675
+ clearTimeout(tipTimer);tip.classList.remove('visible');tipTrigger?.removeAttribute('aria-describedby');tipTrigger=null;
676
+ if(immediate)tip.hidden=true;else tipTimer=setTimeout(()=>{tip.hidden=true;},130);
677
+ }
678
+ function scheduleHide(){clearTimeout(tipTimer);tipTimer=setTimeout(()=>{if(!tip.matches(':hover')&&document.activeElement!==tipTrigger)hideRoleInfo();},100);}
679
+ function showRoleInfo(role,trigger){
680
+ clearTimeout(tipTimer);tipTrigger?.removeAttribute('aria-describedby');tipTrigger=trigger;
681
+ tip.replaceChildren(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.'));
682
+ tip.hidden=false;trigger.setAttribute('aria-describedby','role-tooltip');
683
+ const anchor=trigger.getBoundingClientRect(),box=tip.getBoundingClientRect();
684
+ tip.style.left=Math.max(16,Math.min(anchor.left-12,innerWidth-box.width-16))+'px';
685
+ const below=anchor.bottom+8;tip.style.top=(below+box.height<innerHeight-16?below:Math.max(16,anchor.top-box.height-8))+'px';
686
+ requestAnimationFrame(()=>{if(tipTrigger===trigger)tip.classList.add('visible');});
687
+ }
688
+ function roleInfo(role){
689
+ const button=el('button',{type:'button',class:'helper-info','aria-label':'About '+role.name});button.append(el('span',{class:'info-dot','aria-hidden':'true'},'?'));
690
+ button.addEventListener('pointerenter',()=>showRoleInfo(role,button));button.addEventListener('pointerleave',scheduleHide);
691
+ button.addEventListener('focus',()=>showRoleInfo(role,button));button.addEventListener('blur',scheduleHide);button.addEventListener('click',event=>{event.stopPropagation();showRoleInfo(role,button);});
692
+ return button;
693
+ }
694
+ tip.addEventListener('pointerenter',()=>clearTimeout(tipTimer));tip.addEventListener('pointerleave',scheduleHide);
695
+ document.addEventListener('keydown',event=>{if(event.key==='Escape')hideRoleInfo();});
696
+ document.addEventListener('pointerdown',event=>{if(!tip.contains(event.target)&&!tipTrigger?.contains(event.target))hideRoleInfo();});
697
+ window.addEventListener('resize',()=>hideRoleInfo(true));window.addEventListener('scroll',()=>hideRoleInfo(true),{passive:true});
698
+ window.getTeamBuilderMotion=()=>({supported:typeof document.startViewTransition==='function',reduced:reducedMotion.matches,count:motionCount,active:!!activeTransition,ready:motionReady,animations:lastAnimationCount,duration:180});
699
+
700
+ function flashLabel(node,color='var(--yellow-paper)'){
701
+ if(reducedMotion.matches||typeof node.animate!=='function')return;const expected=node.textContent;
702
+ const flash=()=>{
703
+ if(!node.isConnected||node.textContent!==expected||reducedMotion.matches)return;
704
+ node.getAnimations?.().forEach(animation=>animation.cancel());
705
+ node.animate([{backgroundColor:color,offset:0},{backgroundColor:color,offset:.5},{backgroundColor:'transparent',offset:1}],{duration:4000,easing:'linear'});
706
+ };
707
+ if(activeTransition)activeTransition.finished.then(flash).catch(()=>{});else requestAnimationFrame(flash);
708
+ }
709
+ function toolModeLabel(client){
710
+ const text=modeName(A.modeFor(state,client));let node=toolModeLabels.get(client);
711
+ if(!node){node=el('small',{},text);toolModeLabels.set(client,node);}
712
+ else if(node.textContent!==text){node.textContent=text;flashLabel(node);}
713
+ return node;
714
+ }
715
+ function renderPickers(){
716
+ for(const kind of ['helpers','tools']){
717
+ const isRole=kind==='helpers',chosen=isRole?helpers:pickedTools,available=isRole?roles:clients.map(id=>({id,name:toolName(id)}));
718
+ const box=$(isRole?'selected-helpers':'selected-tools'),options=$(isRole?'helper-options':'tool-options');box.replaceChildren();options.replaceChildren();box.hidden=false;
719
+ if(isRole&&!chosen.length)box.append(el('span',{class:'empty'},'Add roles from below'));
720
+ if(!isRole&&!chosen.length)box.append(el('span',{class:'empty'},'Add a coding tool'));
721
+ 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);}
722
+ const ordered=isRole?available:[...chosen.map(id=>available.find(item=>item.id===id)).filter(Boolean),...available.filter(item=>!chosen.includes(item.id))];
723
+ for(const item of ordered){
724
+ if(!chosen.includes(item.id)){
725
+ 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));
726
+ 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;
727
+ }
728
+ const tag=el('span',{class:isRole?'tag':'tool-item'+(state.active===item.id?' active':'')});
729
+ tag.style.viewTransitionName=(isRole?'helper-':'tool-')+item.id;
730
+ if(isRole)tag.append(el('span',{class:'tag-label'},item.name),roleInfo(item));
731
+ 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);}
732
+ 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);
733
+ }
734
+ }
735
+
736
+ }
737
+ function apply(preset){
738
+ const message=state.active==='all'?`Apply ${preset.label} to all selected tools? This replaces their individual modes, models and effort.`:`Apply ${preset.label} to ${toolName(state.active)} only? Other tools keep their choices.`;
739
+ const next=A.applyPreset(state,preset,()=>window.confirm(message));if(next!==state){state=next;}render();
740
+ }
741
+ function renderModes(){
742
+ const ready=helpers.length>0&&state.selected.length>0;$('mode-empty').hidden=ready;$('mode-panel').hidden=!ready;if(!ready){$('editor').replaceChildren();return;}
743
+ 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'));}
744
+ const options=$('mode-options');options.replaceChildren();
745
+ 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);}
746
+ renderModeNotice();
747
+ $('advanced').hidden=all||mode===null;renderEditor();
748
+ }
749
+ function renderModeNotice(){
750
+ const all=state.active==='all',mode=A.modeFor(state),notice=$('mode-notice');
751
+ const message=mode==='custom'?(all?'Open a coding tool to customize its models and effort.':`Custom models and effort for ${toolName(state.active)}.`):(presets.find(p=>p.id===mode)?.description??'');
752
+ const fable=state.selected.includes('claude')&&state.profiles.claude.modeSelected!==false&&helpers.some(role=>/^(?:claude-)?fable(?:-|$)/.test(state.jobs.claude?.[role]?.model??''));
753
+ const credit=fable?'Claude Fable may use usage credits and requires Claude Code 2.1.257+.':'';
754
+ const text=[message,credit].filter(Boolean).join(' ');
755
+ if(notice.textContent!==text){notice.replaceChildren();if(mode==='custom'&&all)notice.append('Open a ',el('strong',{},'coding tool'),' to customize its models and effort.');else notice.append(message);if(credit)notice.append((message?' ':'')+credit);}
756
+ notice.hidden=!text;
757
+ }
758
+ function renderEditor(){
759
+ const parent=$('editor');parent.replaceChildren();if(!helpers.length||!state.active||state.active==='all'||state.profiles[state.active].modeSelected===false)return;
760
+ const client=state.active,catalog=RELEASE.catalog.clients[client],profile=state.profiles[client].preferences;
761
+ 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);
762
+ for(const role of roles.filter(role=>helpers.includes(role.id))){
763
+ 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)}`});
764
+ row.style.viewTransitionName=`config-${client}-${role.id}`;
765
+ const name=el('div',{class:'editor-name'});name.append(el('span',{},role.name),roleInfo(role));row.append(name);
766
+ 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…'));
767
+ const known=catalog.models.some(model=>model.id===choice.model);modelSelect.value=known?choice.model:'__custom__';
768
+ 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;
769
+ 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();});
770
+ 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();});
771
+ modelControl.append(modelSelect,custom);row.append(modelControl);
772
+ const group=el('div',{class:'efforts',role:'group','aria-label':`${role.name} effort`});
773
+ function renderEfforts(){
774
+ group.replaceChildren();const current=state.jobs[client][role.id],levels=A.allowedEfforts(catalog,current.model).filter(level=>level!==null);
775
+ if(!levels.length)group.append(el('span',{class:'unavailable',title:'Native effort setting unavailable for this model'},'—'));
776
+ 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);}
777
+ }
778
+ renderEfforts();
779
+ row.append(group);parent.append(row);
780
+ }
781
+ }
782
+ function freshForm(){
783
+ state=A.initialState(initial.preferences,initial.id,{empty:true});helpers=[];pickedTools=[];selectedScope=null;lastCopiedCommand=null;commandRevision++;for(const node of toolModeLabels.values())node.getAnimations?.().forEach(animation=>animation.cancel());toolModeLabels.clear();
784
+ }
785
+ function loadAddress(first=false){
786
+ try{
787
+ const data=decodeFormState(location.hash,RELEASE);
788
+ if(data){
789
+ freshForm();helpers=[...data.roles];pickedTools=data.tools.map(tool=>tool.id);selectedScope=data.scope;state.maxConcurrent=data.maxConcurrent;
790
+ for(const tool of data.tools){
791
+ const base=presets.find(preset=>preset.id===tool.base),preferences=JSON.parse(JSON.stringify(base.preferences.clients[tool.id]));
792
+ state.profiles[tool.id]={presetId:tool.base,custom:tool.mode==='custom',modeSelected:tool.mode!==null,presetCap:base.preferences.maxConcurrent,preferences};
793
+ state.jobs[tool.id]=Object.fromEntries(roles.map(role=>[role.id,JSON.parse(JSON.stringify(A.effective(preferences,role.id)))]));
794
+ for(const [role,choice]of Object.entries(tool.choices))state.jobs[tool.id][role]={...choice};
795
+ }
796
+ }else if(!first)freshForm();
797
+ linkError='';
798
+ }catch(error){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.';}
799
+ }
800
+ function publishAddress(){
801
+ let message=linkError;
802
+ if(!message)try{
803
+ const fragment=encodeFormState({state,helpers,pickedTools,selectedScope},RELEASE);
804
+ if(location.hash!==fragment)history.replaceState(history.state,'',location.pathname+location.search+fragment);
805
+ lastAddress=fragment;
806
+ }catch{message='Check your model IDs before sharing this setup.';}
807
+ $('link-error').textContent=message;$('link-error').hidden=!message;
808
+ }
809
+ function setStepHint(number,message){
810
+ const node=$('step-hint-'+number);if(node.dataset.message===message)return;const wasHidden=node.hidden;node.dataset.message=message;
811
+ node.getAnimations?.().forEach(animation=>animation.cancel());node.dataset.success=String(number===4&&!!message);
812
+ 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'});};
813
+ if(!message){
814
+ if(!activeTransition&&!reducedMotion.matches&&!wasHidden&&typeof node.animate==='function'){
815
+ 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(()=>{});
816
+ }else{node.hidden=true;node.textContent='';}
817
+ return;
818
+ }
819
+ node.textContent=message;node.hidden=false;
820
+ if(activeTransition)activeTransition.finished.then(attention).catch(()=>{});
821
+ 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(()=>{});
822
+ else attention();
823
+ }
824
+ function flashStep(marker,complete){
825
+ marker.getAnimations?.().forEach(animation=>animation.cancel());if(reducedMotion.matches||typeof marker.animate!=='function')return;
826
+ const expected=String(complete),flash=()=>{
827
+ if(marker.dataset.complete!==expected||reducedMotion.matches)return;
828
+ const color=complete?'var(--success-line)':'var(--yellow-paper)',base=getComputedStyle(marker).backgroundColor;
829
+ marker.animate([{backgroundColor:color,offset:0},{backgroundColor:color,offset:.5},{backgroundColor:base,offset:1}],{duration:4000,easing:'linear'});
830
+ };
831
+ if(activeTransition)activeTransition.finished.then(flash).catch(()=>{});
832
+ else marker.animate([{opacity:0},{opacity:1}],{duration:160,easing:'ease-out'}).finished.then(flash).catch(()=>{});
833
+ }
834
+ function updateProgress(){
835
+ const copied=!!currentCommand&&lastCopiedCommand===currentCommand;
836
+ const complete=[helpers.length>0,pickedTools.length>0,!!currentCommand,copied];
837
+ document.querySelectorAll('.builder>section').forEach((section,index)=>{
838
+ 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;
839
+ 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]);
840
+ });
841
+ setStepHint(1,helpers.length?(helpers.length<roles.length?'You can add more roles.':'All available roles added.'):'');
842
+ setStepHint(2,pickedTools.length===1?'You can add more coding tools.':pickedTools.length>=2?'Click a coding tool to configure it individually.':'');
843
+ setStepHint(3,helpers.length&&pickedTools.length?'Click a mode to select it.':'');
844
+ setStepHint(4,copied?'Copied':'');
845
+ }
846
+ function stepLink(id,text){
847
+ 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;
848
+ }
849
+ function renderResult(){
850
+ renderModeNotice();
851
+ let next='',summary='Complete the steps above.',detail='',missing=[];
852
+ if(!helpers.length)missing.push(['helpers-heading','a subagent role in step 1']);
853
+ if(!pickedTools.length)missing.push(['tools-heading','a coding tool in step 2']);
854
+ if(!missing.length){
855
+ if(pickedTools.some(client=>A.modeFor(state,client)===null))missing.push(['mode-heading','a work mode for each selected coding tool in step 3']);
856
+ else{
857
+ const {config,errors}=A.buildConfig(state,RELEASE.preferences,RELEASE.catalog);
858
+ if(errors.length){summary='Check your model settings.';detail=errors[0];}
859
+ else try{next=A.buildCommand(config,RELEASE);summary=`${helpers.length} subagent role${helpers.length===1?'':'s'} · ${pickedTools.length} coding tool${pickedTools.length===1?'':'s'}`;detail='Run this command in your terminal. Only installed tools are configured.';}
860
+ catch{summary='Command unavailable.';detail='Check the configuration release.';}
861
+ }
862
+ }
863
+ if(next!==currentCommand){commandRevision++;lastCopiedCommand=null;}
864
+ currentCommand=next;
865
+ const copied=!!next&&lastCopiedCommand===next;
866
+ $('copy').disabled=!next;$('copy').textContent='Copy command';$('copy').closest('.output').dataset.ready=String(!!next);
867
+ $('copy-feedback').hidden=true;$('copy-feedback').textContent='';
868
+ $('setup-command').value=next;$('setup-command').hidden=!next;$('setup-summary').textContent=summary;
869
+ const description=$('setup-description');description.replaceChildren();
870
+ if(missing.length){description.append('Choose ');missing.forEach(([id,text],index)=>{if(index)description.append(' and ');description.append(stepLink(id,text));});description.append('.');}
871
+ else description.textContent=detail;
872
+ updateProgress();publishAddress();
873
+ }
874
+ function renderNow(){syncTargets();renderPickers();renderModes();renderResult();}
875
+ function render({fromAddress=false}={}){if(mounted&&!fromAddress)linkError='';if(!mounted){renderNow();mounted=true;}else animateUpdate(renderNow);}
876
+ function addressChanged(){
877
+ if(location.hash===lastAddress||(location.hash&&!location.hash.startsWith('#setup=')))return;
878
+ lastAddress=location.hash;loadAddress();render({fromAddress:true});
879
+ }
880
+ window.addEventListener('hashchange',addressChanged);window.addEventListener('popstate',addressChanged);
881
+ $('reset-form').addEventListener('click',()=>{freshForm();linkError='';render();});
882
+
883
+ $('setup-command').addEventListener('focus',()=>$('setup-command').select());
884
+ $('copy').addEventListener('click',async()=>{
885
+ if(!currentCommand)return;const commandToCopy=currentCommand,revision=commandRevision;
886
+ try{
887
+ if(!navigator.clipboard?.writeText)throw new Error('Clipboard unavailable');await navigator.clipboard.writeText(commandToCopy);
888
+ if(revision!==commandRevision)return;lastCopiedCommand=commandToCopy;$('copy-feedback').hidden=true;$('copy-feedback').textContent='';animateUpdate(updateProgress);
889
+ }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;}
890
+ });
891
+ window.getTeamBuilderSnapshot=()=>JSON.parse(JSON.stringify({state,helpers,pickedTools,selectedScope,copied:!!currentCommand&&lastCopiedCommand===currentCommand,advancedOpen:true}));
892
+ loadAddress(true);render();
893
+ })();
894
+
895
+ })();
896
+ </script></body></html>