@westonkd/sprint 0.6.0 → 0.7.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.
package/README.md CHANGED
@@ -3,8 +3,10 @@
3
3
  A React component library for products that people and AI agents both use. Sprint components
4
4
  look and behave like any other interface, and can describe themselves to an agent on request.
5
5
 
6
- Status: experimental. A full catalog of components on top of the agent runtime, verified in jsdom
7
- and normal browsers; no real WebMCP implementation has accepted a descriptor yet.
6
+ Status: experimental and pre-1.0, published to npm as `@westonkd/sprint`. A full catalog of
7
+ components on top of the agent runtime, verified in jsdom and normal browsers; no real WebMCP
8
+ implementation has accepted a descriptor yet. Until 1.0, a minor version may carry breaking
9
+ changes, and `CHANGELOG.md` marks each one.
8
10
 
9
11
  ## What a Sprint component does
10
12
 
@@ -70,7 +72,8 @@ generated entirely from `agent-manifest.json` — props, state attributes, tool
70
72
  code snippet come from the same metadata an agent reads. Each example can be toggled between the
71
73
  human and agent view, individually or a whole page at once.
72
74
 
73
- Four written guides sit alongside them:
75
+ Four written guides sit alongside them, plus an "Every component" page that renders the whole
76
+ catalog at once:
74
77
 
75
78
  - **WebMCP** — the platform API: both forms, availability, hard limits, and security.
76
79
  - **Integration philosophy** — the decisions behind how Sprint uses it, and what each costs.
@@ -108,8 +111,12 @@ scripts/ manifest generation, build output checks
108
111
 
109
112
  ## Consuming it
110
113
 
111
- React 19 and TypeScript, no runtime dependencies. Not published to npm yet. Once it is, the
112
- package name is `@westonkd/sprint`:
114
+ React 19 and TypeScript, with no runtime dependencies; `react` and `react-dom` 19 are peer
115
+ dependencies.
116
+
117
+ ```bash
118
+ npm install @westonkd/sprint
119
+ ```
113
120
 
114
121
  ```tsx
115
122
  import { Button, SprintProvider } from "@westonkd/sprint";
@@ -123,6 +130,10 @@ import manifest from "@westonkd/sprint/agent-manifest.json" with { type: "json"
123
130
  Wrap your app in `SprintProvider` to register the page-level `list-page-regions` and `read-region`
124
131
  tools. Components work without it.
125
132
 
133
+ Sprint works under a strict `style-src` Content Security Policy: no component writes a `style`
134
+ attribute for a documented value. The one escape hatch is an off-scale length passed to `Stack`'s
135
+ `min` or `Table`'s column `width`, which falls back to an inline style and says so in its docs.
136
+
126
137
  ## WebMCP
127
138
 
128
139
  Tools use the [web platform WebMCP API](https://developer.chrome.com/docs/ai/webmcp)
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "library": "sprint",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "conventions": {
5
5
  "componentAttribute": "data-sprint",
6
6
  "partAttribute": "data-sprint-part",
@@ -1347,7 +1347,7 @@
1347
1347
  },
1348
1348
  {
1349
1349
  "title": "The page's main break",
1350
- "description": "A band draws the theme's own ornament: hatching in the default register, pins in calorie, a barcode strip in trax. Use it once per page.",
1350
+ "description": "A band draws the theme's own ornament: hatching in the default register, pins in calorie, a barcode strip in trax, a row of dots in ambient. Use it once per page.",
1351
1351
  "code": "<Divider label=\"Body\" weight=\"band\" />"
1352
1352
  }
1353
1353
  ]
package/dist/index.cjs CHANGED
@@ -197,7 +197,7 @@ ${P.current([N.current])}`:"The change removed this disclosure from the page."},
197
197
  />
198
198
  <Divider />
199
199
  <Text>The body of the page starts here.</Text>
200
- </Stack>`},{title:"A named segment",description:"A label names what follows, on the rule itself and to an agent reading the page.",code:'<Divider label="Results" weight="heavy" />'},{title:"The page's main break",description:"A band draws the theme's own ornament: hatching in the default register, pins in calorie, a barcode strip in trax. Use it once per page.",code:'<Divider label="Body" weight="band" />'}]});function Ko(e){const{label:t,weight:n="hairline",...o}=e,i=z(),s=$({component:Yn.name,label:t,state:{weight:n}});return i==="agent"?t===void 0?null:a.jsx(Y,{node:s}):a.jsxs("div",{...o,...V(s),children:[t===void 0?null:a.jsx("span",{children:t}),a.jsx("hr",{})]})}const zt={verb:"open",description:"Follow this link and load its destination, exactly as a person clicking it would. The current page is replaced, so anything unsaved on it is lost and any tool registered by this page stops existing.",inputSchema:{type:"object",properties:{}},readOnly:!1,untrustedContent:!0,registeredWhen:"The link opts in with agentTool, is mounted, has a resolvable label, and no other component claims the same tool name. Links register nothing by default.",unregisteredWhen:"The link unmounts or opts back out."},Qn=K({name:"Link",category:"navigation",summary:"A navigation link. It publishes its destination as state, so an agent reading the page in text learns the URL rather than having to click to find out, and it renders a real anchor in both views.",whenToUse:"Use it for anything that changes the address: a nav item, a cross-reference, a link out to a specification. Set active on the item matching the current route so the agent view and the human view agree about where you are. Under a client-side router, pass an onClick that prevents default and navigates; the handler rides the anchor in both views, so agent clicks and open tools go through the router too.",whenNotToUse:"Do not use it for an action that stays on the page; that is a Button. Do not register a tool on ordinary navigation: an agent can already reach a URL, and a page of links would flood its tool list for no gain.",status:"experimental",props:{href:{kind:"string",description:"The destination. Published as data-sprint-href and carried in the agent view, so the URL is readable without a click.",required:!0},children:{kind:"node",description:"The link text. It names the destination, so prefer the page's name over here or read more.",required:!0},active:{kind:"boolean",description:"Mark the link as the current location. Sets aria-current so a screen reader and an agent learn it the same way.",default:!1},external:{kind:"boolean",description:"Mark a destination outside this app. Opens in a new context and adds the usual rel protections.",default:!1},agentTool:{kind:"boolean",description:"Set true to register an open tool for this link. Off by default: navigation is reachable by URL, so a tool per link is cost without benefit.",default:!1},agentName:{kind:"string",description:"Override the label used to derive the tool name, for icon-only links or two links with the same text."}},state:{href:{description:"Where this link goes.",attribute:"data-sprint-href"},active:{description:"Present when this link is the current location.",attribute:"data-sprint-active"},external:{description:"Present when the destination is outside this app.",attribute:"data-sprint-external"}},tools:{open:zt},agentView:{example:'- **Link** "Button" [active, href=#/Button]'},examples:[{title:"A nav item",code:'<Link href="#/Button" active={route === "Button"}>Button</Link>'},{title:"A link out",code:`<Link href="https://developer.chrome.com/docs/ai/webmcp" external>
200
+ </Stack>`},{title:"A named segment",description:"A label names what follows, on the rule itself and to an agent reading the page.",code:'<Divider label="Results" weight="heavy" />'},{title:"The page's main break",description:"A band draws the theme's own ornament: hatching in the default register, pins in calorie, a barcode strip in trax, a row of dots in ambient. Use it once per page.",code:'<Divider label="Body" weight="band" />'}]});function Ko(e){const{label:t,weight:n="hairline",...o}=e,i=z(),s=$({component:Yn.name,label:t,state:{weight:n}});return i==="agent"?t===void 0?null:a.jsx(Y,{node:s}):a.jsxs("div",{...o,...V(s),children:[t===void 0?null:a.jsx("span",{children:t}),a.jsx("hr",{})]})}const zt={verb:"open",description:"Follow this link and load its destination, exactly as a person clicking it would. The current page is replaced, so anything unsaved on it is lost and any tool registered by this page stops existing.",inputSchema:{type:"object",properties:{}},readOnly:!1,untrustedContent:!0,registeredWhen:"The link opts in with agentTool, is mounted, has a resolvable label, and no other component claims the same tool name. Links register nothing by default.",unregisteredWhen:"The link unmounts or opts back out."},Qn=K({name:"Link",category:"navigation",summary:"A navigation link. It publishes its destination as state, so an agent reading the page in text learns the URL rather than having to click to find out, and it renders a real anchor in both views.",whenToUse:"Use it for anything that changes the address: a nav item, a cross-reference, a link out to a specification. Set active on the item matching the current route so the agent view and the human view agree about where you are. Under a client-side router, pass an onClick that prevents default and navigates; the handler rides the anchor in both views, so agent clicks and open tools go through the router too.",whenNotToUse:"Do not use it for an action that stays on the page; that is a Button. Do not register a tool on ordinary navigation: an agent can already reach a URL, and a page of links would flood its tool list for no gain.",status:"experimental",props:{href:{kind:"string",description:"The destination. Published as data-sprint-href and carried in the agent view, so the URL is readable without a click.",required:!0},children:{kind:"node",description:"The link text. It names the destination, so prefer the page's name over here or read more.",required:!0},active:{kind:"boolean",description:"Mark the link as the current location. Sets aria-current so a screen reader and an agent learn it the same way.",default:!1},external:{kind:"boolean",description:"Mark a destination outside this app. Opens in a new context and adds the usual rel protections.",default:!1},agentTool:{kind:"boolean",description:"Set true to register an open tool for this link. Off by default: navigation is reachable by URL, so a tool per link is cost without benefit.",default:!1},agentName:{kind:"string",description:"Override the label used to derive the tool name, for icon-only links or two links with the same text."}},state:{href:{description:"Where this link goes.",attribute:"data-sprint-href"},active:{description:"Present when this link is the current location.",attribute:"data-sprint-active"},external:{description:"Present when the destination is outside this app.",attribute:"data-sprint-external"}},tools:{open:zt},agentView:{example:'- **Link** "Button" [active, href=#/Button]'},examples:[{title:"A nav item",code:'<Link href="#/Button" active={route === "Button"}>Button</Link>'},{title:"A link out",code:`<Link href="https://developer.chrome.com/docs/ai/webmcp" external>
201
201
  Chrome docs
202
202
  </Link>`},{title:"A link an agent may follow itself",description:"Opting in is for the one link that completes a task, not for a nav list.",code:'<Link href="#/checkout" agentTool>Go to checkout</Link>'}],a11y:{role:"link",keyboard:["Enter follows the link"],notes:"active sets aria-current=page. External links open in a new context with rel=noreferrer noopener, and carry their outward mark as a pseudo-element with empty alternative text so it never reaches the accessible name or the tool name. Inside Text a link is underlined all the time, so colour is never the only thing distinguishing it from the prose around it."}});function Jn(e){const{href:t,active:n=!1,external:o=!1,agentTool:i=!1,agentName:s,children:d,ref:l,onClick:c,...h}=e,m=z(),p=ae(),b=r.useRef(null),g=r.useCallback(R=>{b.current=R,typeof l=="function"?l(R):l!=null&&(l.current=R)},[l]),C=s??se(d),f=r.useCallback(()=>{const R=b.current;return R===null?"This link renders no element in the current view. Navigate to its href instead.":(R.click(),`Following ${R.getAttribute("href")??t}.`)},[t]),w=te({spec:zt,label:C,enabled:i,execute:f}),v=$({component:Qn.name,label:se(d),tool:w,state:{href:t,active:n,external:o}}),k=o?{target:"_blank",rel:"noreferrer noopener"}:{target:void 0,rel:void 0};return m==="agent"?p==="never"?a.jsx(Y,{node:v}):a.jsx(Se,{node:v,as:"a",href:t,ref:g,onClick:c,target:k.target,rel:k.rel}):a.jsx("a",{...h,...V(v),href:t,ref:g,onClick:c,"aria-current":n?"page":void 0,target:k.target,rel:k.rel,children:d})}const Zn=K({name:"EmptyState",category:"feedback",summary:"A region that says there is nothing here, and why: a headline, an optional sentence, and an optional way out such as clearing filters or creating the first record. It marks the empty field with the register's own empty ornament.",whenToUse:'Use it in place of a list, grid, or set of results that has nothing to show, so the space says it is empty rather than rendering nothing. Set reason="filtered" when records exist but none match, so an agent knows to relax the filters rather than conclude there is no data.',whenNotToUse:"Do not use it for an empty Table, List, or Panel; those already carry their own emptyLabel. Do not use it for a failure; that is an Alert. Do not use it while data is still loading; that is Pending.",status:"experimental",props:{label:{kind:"string",description:`The headline, saying what is empty in a few words: "No one matches these filters". The region's accessible name.`,required:!0},description:{kind:"string",description:"One sentence of explanation or next step. Carried as the description part."},action:{kind:"object",description:"The one way out, as data: { label, onSelect?, href? }. An href renders a Link, otherwise a Button that registers its own press tool, so the action is a single control in the agent view."},reason:{kind:"enum",description:"Why it is empty: nothing exists yet, or nothing matches the current filters.",values:["empty","filtered"],default:"empty"}},state:{empty:{description:"Always present, so one selector finds every empty region.",attribute:"data-sprint-empty"},reason:{description:"Why the region is empty.",attribute:"data-sprint-reason",values:["empty","filtered"]}},agentView:{example:'- **EmptyState** "No one matches these filters" [empty, reason=filtered]\n - part `description` "Try a different role or clear the search."'},examples:[{title:"Nothing matches",description:"Records exist but the filters exclude them all. The action is a Button, so it registers press-clear-filters.",code:`<EmptyState
203
203
  reason="filtered"
@@ -602,5 +602,5 @@ ${Xe(Ta(),Te-tn)}`:"Page is now in human view."}})}function er(e,t){if(e!=="page
602
602
 
603
603
  (page ${o} of ${n.length})`}const Ca="--sprint-gloss-x",Sa="--sprint-gloss-fade",Aa="--sprint-cast-shift",tr=22,nr=78,ar=28,or=.25,pn=(e,t,n)=>Math.min(n,Math.max(t,e));function ir(){return typeof matchMedia=="function"&&matchMedia("(prefers-reduced-motion: reduce)").matches}const rr=new Set(["Button","Card","Tag","SegmentedControl","Switch","Shell"]),sr=new Set(["option","thumb"]);function lr(e,t){const n=e.closest("[data-sprint-part]");if(n===null||!t.contains(n))return null;const o=n.dataset.sprintPart;return o!==void 0&&sr.has(o)?n:null}function ja(e){if(!(e instanceof Element))return null;const t=e.closest("[data-sprint]");if(t===null)return null;const n=t.dataset.sprint;return n===void 0||!rr.has(n)?null:lr(e,t)??t}function dr(e){if(e.pointerType==="touch"||ir())return;const t=ja(e.target);if(t===null)return;const n=t.getBoundingClientRect();if(n.width===0||n.height===0)return;const o=pn((e.clientX-n.left)/n.width*100,tr,nr),i=(o-50)/ar;t.style.setProperty(Ca,`${o.toFixed(1)}%`),t.style.setProperty(Sa,pn(1-Math.abs(i),or,1).toFixed(3)),t.style.setProperty(Aa,`${(i*-10).toFixed(1)}px`)}function cr(e){const t=ja(e.target);t!==null&&(t.style.removeProperty(Ca),t.style.removeProperty(Sa),t.style.removeProperty(Aa),t.style.length===0&&t.removeAttribute("style"))}const hr=1200;function ur(e){const{children:t,label:n,format:o,pageTools:i=!0,view:s,defaultView:d,onViewChange:l,agentControls:c,theme:h}=e,m=Be(),p=Pn(),b=!p.owned,[g,C]=r.useState(d??"human"),f=s!==void 0,w=f||b||d!==void 0,v=f?s:w?g:p.view,k=r.useCallback(I=>{if(!w){p.setView(I);return}f||C(I),l?.(I)},[w,f,p,l]),R=c??p.controls,x=o??p.format??Wt,A=r.useMemo(()=>({view:v,setView:k,controls:R,format:x,owned:w}),[v,k,R,x,w]),P=r.useMemo(()=>({path:n===void 0?m:[...m,n]}),[m,n]);Zi({enabled:b&&i,format:x,view:v,setView:k});const N=r.useRef(null),[T,_]=r.useState(!1);r.useEffect(()=>{if(!T)return;const I=setTimeout(()=>_(!1),hr);return()=>clearTimeout(I)},[T]);const M=()=>{const I=navigator.clipboard;if(I===void 0)return;const q=(N.current?.textContent??"").replace(/\n{3,}/g,`
604
604
 
605
- `).trim();I.writeText(q).then(()=>_(!0),()=>_(!1))},X=w&&v==="agent"&&R!=="never";return a.jsx(eo,{value:A,children:a.jsxs(qe,{value:P,children:[X?a.jsx("button",{type:"button","aria-label":T?"Copied":"Copy agent view",[mn]:"",...T?{"data-sprint-copied":""}:{},onClick:M}):null,a.jsx("div",{ref:N,onPointerMove:v==="agent"?void 0:dr,onPointerOut:v==="agent"?void 0:cr,[gn]:v,...h===void 0?{}:{[fn]:h},children:t})]})})}function pr(e){const{children:t,label:n}=e,o=Be(),i=r.useMemo(()=>({path:[...o,n]}),[o,n]);return a.jsx(qe,{value:i,children:t})}const gr="0.6.0",mr={version:gr},fr=mr.version;exports.ACT_BREADCRUMB_TOOL=Re;exports.AGENT_ATTRIBUTE=Mt;exports.AgentControl=Se;exports.AgentControlGroup=ce;exports.AgentLine=Y;exports.AgentRegion=pr;exports.AgentScopeProvider=qe;exports.Alert=po;exports.Breadcrumb=wo;exports.Button=Qe;exports.CHOOSE_TOOL=Le;exports.CLOSE_DIALOG_TOOL=Gt;exports.COMPONENT_ATTRIBUTE=fe;exports.Card=yo;exports.ChangeList=Ro;exports.Checkbox=Po;exports.ChoiceGrid=$o;exports.CodeBlock=qo;exports.CopyField=Bo;exports.DISMISS_ALERT_TOOL=Bt;exports.DescriptionList=Ho;exports.Dialog=Vo;exports.Disclosure=Go;exports.Divider=Ko;exports.EXPAND_DISCLOSURE_TOOL=Kt;exports.EmptyState=Xo;exports.EntityRow=Qo;exports.FILL_TEXTAREA_TOOL=Zt;exports.FILL_TOOL=en;exports.Heading=Jo;exports.Image=Zo;exports.Link=Jn;exports.List=ei;exports.MetaLine=ti;exports.Nav=ni;exports.NavGroup=ai;exports.OPEN_CARD_TOOL=Ht;exports.OPEN_ENTITY_ROW_TOOL=Xt;exports.OPEN_LINK_TOOL=zt;exports.OWNER_ATTRIBUTE=$t;exports.PARAM_DESCRIPTION_LIMIT=mt;exports.PART_ATTRIBUTE=Ce;exports.PRESS_TOOL=Ft;exports.PageHeader=oi;exports.Pagination=li;exports.Panel=di;exports.Pending=ci;exports.Progress=ui;exports.REGION_ATTRIBUTE=Je;exports.RESERVED_STATE_KEYS=bn;exports.SEARCH_TOOL=Yt;exports.SELECT_OPTION_TOOL=Oe;exports.SELECT_TOOL=Ee;exports.SET_CHECKBOX_TOOL=Vt;exports.SET_SWITCH_TOOL=Jt;exports.STACK_MINS=fa;exports.STATE_ATTRIBUTE_PREFIX=Ie;exports.SearchField=mi;exports.SecretField=wi;exports.SegmentedControl=yi;exports.Select=Ri;exports.Shell=Li;exports.SprintProvider=ur;exports.Stack=Oi;exports.Steps=$i;exports.Switch=Mi;exports.TABLE_WIDTHS=va;exports.THEME_ATTRIBUTE=fn;exports.TOOL_ATTRIBUTE=Ne;exports.TOOL_DESCRIPTION_LIMIT=gt;exports.TOOL_NAMING_CONVENTION=yn;exports.TOOL_OUTPUT_LIMIT=Te;exports.TURN_PAGE_TOOL=Pe;exports.Table=Wi;exports.Tag=ta;exports.Text=_i;exports.TextInput=Vi;exports.Textarea=Fi;exports.VIEW_ATTRIBUTE=gn;exports.VIEW_COPY_ATTRIBUTE=mn;exports.accessibleText=_e;exports.afterCommit=oe;exports.agentAttributes=It;exports.agentAttributesFor=V;exports.agentPartAttributesFor=D;exports.agentPartControlAttributes=Nn;exports.agentSelector=Ka;exports.alertMeta=wt;exports.breadcrumbMeta=vt;exports.buildAgentManifest=Qa;exports.buildAgentNode=$;exports.buttonMeta=yt;exports.cardMeta=kt;exports.changeListMeta=_n;exports.checkboxMeta=xt;exports.choiceGridMeta=Tt;exports.clamp=Xe;exports.codeBlockMeta=Gn;exports.copyFieldMeta=Kn;exports.defaultAgentFormat=Wt;exports.defineAgentMeta=K;exports.descriptionListMeta=zn;exports.dialogMeta=Xn;exports.disclosureMeta=Ct;exports.dividerMeta=Yn;exports.emptyStateMeta=Zn;exports.entityRowMeta=St;exports.getAgentMeta=kn;exports.getModelContext=qt;exports.headingMeta=na;exports.imageMeta=aa;exports.isModelContextAvailable=za;exports.linkMeta=Qn;exports.listAgentMeta=xn;exports.listMeta=oa;exports.metaLineMeta=ia;exports.navGroupMeta=sa;exports.navMeta=ra;exports.nodeLine=jn;exports.pageHeaderMeta=la;exports.paginate=Ut;exports.paginationMeta=jt;exports.panelMeta=da;exports.pendingMeta=ca;exports.progressMeta=ha;exports.reactText=se;exports.registerTool=vn;exports.searchFieldMeta=Rt;exports.secretFieldMeta=ua;exports.segmentedControlMeta=Lt;exports.selectMeta=Pt;exports.serializeElement=nt;exports.serializeWithin=Un;exports.shellMeta=ga;exports.slug=xe;exports.stackMeta=ma;exports.stepsMeta=ba;exports.switchMeta=Et;exports.tableMeta=wa;exports.tagMeta=ea;exports.textInputMeta=Dt;exports.textMeta=ka;exports.textareaMeta=Nt;exports.toMarkdown=Ln;exports.tokenize=Vn;exports.toolName=bt;exports.useAgentControls=ae;exports.useAgentFormat=ne;exports.useAgentScope=Be;exports.useAgentTool=te;exports.useSprintView=z;exports.useSprintViewControl=Pn;exports.validateInputs=wn;exports.version=fr;
605
+ `).trim();I.writeText(q).then(()=>_(!0),()=>_(!1))},X=w&&v==="agent"&&R!=="never";return a.jsx(eo,{value:A,children:a.jsxs(qe,{value:P,children:[X?a.jsx("button",{type:"button","aria-label":T?"Copied":"Copy agent view",[mn]:"",...T?{"data-sprint-copied":""}:{},onClick:M}):null,a.jsx("div",{ref:N,onPointerMove:v==="agent"?void 0:dr,onPointerOut:v==="agent"?void 0:cr,[gn]:v,...h===void 0?{}:{[fn]:h},children:t})]})})}function pr(e){const{children:t,label:n}=e,o=Be(),i=r.useMemo(()=>({path:[...o,n]}),[o,n]);return a.jsx(qe,{value:i,children:t})}const gr="0.7.0",mr={version:gr},fr=mr.version;exports.ACT_BREADCRUMB_TOOL=Re;exports.AGENT_ATTRIBUTE=Mt;exports.AgentControl=Se;exports.AgentControlGroup=ce;exports.AgentLine=Y;exports.AgentRegion=pr;exports.AgentScopeProvider=qe;exports.Alert=po;exports.Breadcrumb=wo;exports.Button=Qe;exports.CHOOSE_TOOL=Le;exports.CLOSE_DIALOG_TOOL=Gt;exports.COMPONENT_ATTRIBUTE=fe;exports.Card=yo;exports.ChangeList=Ro;exports.Checkbox=Po;exports.ChoiceGrid=$o;exports.CodeBlock=qo;exports.CopyField=Bo;exports.DISMISS_ALERT_TOOL=Bt;exports.DescriptionList=Ho;exports.Dialog=Vo;exports.Disclosure=Go;exports.Divider=Ko;exports.EXPAND_DISCLOSURE_TOOL=Kt;exports.EmptyState=Xo;exports.EntityRow=Qo;exports.FILL_TEXTAREA_TOOL=Zt;exports.FILL_TOOL=en;exports.Heading=Jo;exports.Image=Zo;exports.Link=Jn;exports.List=ei;exports.MetaLine=ti;exports.Nav=ni;exports.NavGroup=ai;exports.OPEN_CARD_TOOL=Ht;exports.OPEN_ENTITY_ROW_TOOL=Xt;exports.OPEN_LINK_TOOL=zt;exports.OWNER_ATTRIBUTE=$t;exports.PARAM_DESCRIPTION_LIMIT=mt;exports.PART_ATTRIBUTE=Ce;exports.PRESS_TOOL=Ft;exports.PageHeader=oi;exports.Pagination=li;exports.Panel=di;exports.Pending=ci;exports.Progress=ui;exports.REGION_ATTRIBUTE=Je;exports.RESERVED_STATE_KEYS=bn;exports.SEARCH_TOOL=Yt;exports.SELECT_OPTION_TOOL=Oe;exports.SELECT_TOOL=Ee;exports.SET_CHECKBOX_TOOL=Vt;exports.SET_SWITCH_TOOL=Jt;exports.STACK_MINS=fa;exports.STATE_ATTRIBUTE_PREFIX=Ie;exports.SearchField=mi;exports.SecretField=wi;exports.SegmentedControl=yi;exports.Select=Ri;exports.Shell=Li;exports.SprintProvider=ur;exports.Stack=Oi;exports.Steps=$i;exports.Switch=Mi;exports.TABLE_WIDTHS=va;exports.THEME_ATTRIBUTE=fn;exports.TOOL_ATTRIBUTE=Ne;exports.TOOL_DESCRIPTION_LIMIT=gt;exports.TOOL_NAMING_CONVENTION=yn;exports.TOOL_OUTPUT_LIMIT=Te;exports.TURN_PAGE_TOOL=Pe;exports.Table=Wi;exports.Tag=ta;exports.Text=_i;exports.TextInput=Vi;exports.Textarea=Fi;exports.VIEW_ATTRIBUTE=gn;exports.VIEW_COPY_ATTRIBUTE=mn;exports.accessibleText=_e;exports.afterCommit=oe;exports.agentAttributes=It;exports.agentAttributesFor=V;exports.agentPartAttributesFor=D;exports.agentPartControlAttributes=Nn;exports.agentSelector=Ka;exports.alertMeta=wt;exports.breadcrumbMeta=vt;exports.buildAgentManifest=Qa;exports.buildAgentNode=$;exports.buttonMeta=yt;exports.cardMeta=kt;exports.changeListMeta=_n;exports.checkboxMeta=xt;exports.choiceGridMeta=Tt;exports.clamp=Xe;exports.codeBlockMeta=Gn;exports.copyFieldMeta=Kn;exports.defaultAgentFormat=Wt;exports.defineAgentMeta=K;exports.descriptionListMeta=zn;exports.dialogMeta=Xn;exports.disclosureMeta=Ct;exports.dividerMeta=Yn;exports.emptyStateMeta=Zn;exports.entityRowMeta=St;exports.getAgentMeta=kn;exports.getModelContext=qt;exports.headingMeta=na;exports.imageMeta=aa;exports.isModelContextAvailable=za;exports.linkMeta=Qn;exports.listAgentMeta=xn;exports.listMeta=oa;exports.metaLineMeta=ia;exports.navGroupMeta=sa;exports.navMeta=ra;exports.nodeLine=jn;exports.pageHeaderMeta=la;exports.paginate=Ut;exports.paginationMeta=jt;exports.panelMeta=da;exports.pendingMeta=ca;exports.progressMeta=ha;exports.reactText=se;exports.registerTool=vn;exports.searchFieldMeta=Rt;exports.secretFieldMeta=ua;exports.segmentedControlMeta=Lt;exports.selectMeta=Pt;exports.serializeElement=nt;exports.serializeWithin=Un;exports.shellMeta=ga;exports.slug=xe;exports.stackMeta=ma;exports.stepsMeta=ba;exports.switchMeta=Et;exports.tableMeta=wa;exports.tagMeta=ea;exports.textInputMeta=Dt;exports.textMeta=ka;exports.textareaMeta=Nt;exports.toMarkdown=Ln;exports.tokenize=Vn;exports.toolName=bt;exports.useAgentControls=ae;exports.useAgentFormat=ne;exports.useAgentScope=Be;exports.useAgentTool=te;exports.useSprintView=z;exports.useSprintViewControl=Pn;exports.validateInputs=wn;exports.version=fr;
606
606
  //# sourceMappingURL=index.cjs.map