@tung-engineering/agent-platform-web-sdk 0.0.74 → 0.0.75

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.
@@ -243,6 +243,43 @@ var d_=Object.defineProperty,p_=Object.defineProperties;var h_=Object.getOwnProp
243
243
  background: oklch(95% 0.035 50);
244
244
  }
245
245
 
246
+ /* Destructive actions (e.g. reject) use a separate red scale instead of the
247
+ brand accent, so they read as visually distinct from affirmative actions
248
+ like approve even though both can appear filled/outlined side by side. */
249
+ .ap-sdk-panel__btn--danger {
250
+ background: #dc2626;
251
+ color: #fff;
252
+ }
253
+
254
+ .ap-sdk-panel__btn--danger:hover:not(:disabled) {
255
+ background: #b91c1c;
256
+ }
257
+
258
+ .ap-sdk-panel__btn--danger-ghost {
259
+ background: transparent;
260
+ color: #b91c1c;
261
+ border: 1px solid #dc2626;
262
+ flex: 0 0 auto;
263
+ padding: 8px 16px;
264
+ }
265
+
266
+ .ap-sdk-panel__btn--danger-ghost:hover:not(:disabled) {
267
+ border-color: #b91c1c;
268
+ color: #b91c1c;
269
+ background: #fef2f2;
270
+ }
271
+
272
+ /* Full-width, roomier variant for stacked action layouts (e.g. the
273
+ automation summary card) — overrides the compact default padding/
274
+ flex sizing of whichever color variant it's paired with. */
275
+ .ap-sdk-panel__btn--block {
276
+ width: 100%;
277
+ flex: none;
278
+ padding: 11px 16px;
279
+ font-size: 14px;
280
+ border-radius: 10px;
281
+ }
282
+
246
283
  .ap-sdk-panel__btn:disabled {
247
284
  opacity: 0.55;
248
285
  cursor: not-allowed;
@@ -1088,15 +1125,21 @@ button.ap-sdk-list-item__link {
1088
1125
  }
1089
1126
  `,`
1090
1127
  .ap-sdk-runner__approval {
1091
- margin-top: 10px;
1128
+ margin-top: 14px;
1092
1129
  display: flex;
1093
1130
  flex-direction: column;
1094
- gap: 8px;
1131
+ gap: 10px;
1095
1132
  width: 100%;
1096
1133
  }
1097
1134
 
1135
+ /* Approve is the one prominent full-width action; Reject is demoted to a
1136
+ small centered text link below it rather than a second full button, so
1137
+ the decision reads as "one clear primary choice, one quiet way out"
1138
+ instead of two competing buttons crammed into a row. */
1098
1139
  .ap-sdk-runner__approval-actions {
1099
1140
  display: flex;
1141
+ flex-direction: column;
1142
+ align-items: center;
1100
1143
  gap: 8px;
1101
1144
  width: 100%;
1102
1145
  }
@@ -1104,7 +1147,16 @@ button.ap-sdk-list-item__link {
1104
1147
  .ap-sdk-runner__reject-form {
1105
1148
  display: flex;
1106
1149
  flex-direction: column;
1107
- gap: 6px;
1150
+ gap: 8px;
1151
+ }
1152
+
1153
+ /* Persistent explanation of the blank-vs-filled textarea behavior — kept as
1154
+ its own element rather than only a placeholder, since placeholders vanish
1155
+ the moment the user starts typing feedback. */
1156
+ .ap-sdk-runner__reject-hint {
1157
+ font-size: 11px;
1158
+ line-height: 1.4;
1159
+ color: #9ca3af;
1108
1160
  }
1109
1161
 
1110
1162
  .ap-sdk-runner__approval-error {
@@ -1112,6 +1164,72 @@ button.ap-sdk-list-item__link {
1112
1164
  font-size: 12px;
1113
1165
  }
1114
1166
 
1167
+ /* Separates the approve/reject decision from the always-available
1168
+ View task / Close actions below it, so the two rows don't read as one
1169
+ undifferentiated stack of buttons. */
1170
+ .ap-sdk-runner__divider {
1171
+ height: 1px;
1172
+ width: 100%;
1173
+ background: #f3f4f6;
1174
+ margin: 6px 0;
1175
+ }
1176
+
1177
+ .ap-sdk-btn-icon {
1178
+ margin-right: 5px;
1179
+ }
1180
+
1181
+ .ap-sdk-btn-icon--trailing {
1182
+ margin-right: 0;
1183
+ margin-left: 5px;
1184
+ }
1185
+
1186
+ /* Lightweight text-link treatment for secondary/rare actions (Reject, Close)
1187
+ so they read as quiet fallbacks rather than full buttons competing for
1188
+ attention with the primary Approve / View task actions above them. */
1189
+ .ap-sdk-runner__text-btn {
1190
+ background: none;
1191
+ border: none;
1192
+ padding: 4px 2px;
1193
+ font-size: 12.5px;
1194
+ font-weight: 500;
1195
+ font-family: inherit;
1196
+ cursor: pointer;
1197
+ color: #6b7280;
1198
+ text-decoration: underline;
1199
+ text-underline-offset: 2px;
1200
+ }
1201
+
1202
+ .ap-sdk-runner__text-btn:hover:not(:disabled) {
1203
+ color: #374151;
1204
+ }
1205
+
1206
+ .ap-sdk-runner__text-btn--danger {
1207
+ color: #b91c1c;
1208
+ }
1209
+
1210
+ .ap-sdk-runner__text-btn--danger:hover:not(:disabled) {
1211
+ color: #991b1b;
1212
+ }
1213
+
1214
+ .ap-sdk-runner__text-btn:disabled {
1215
+ opacity: 0.55;
1216
+ cursor: not-allowed;
1217
+ }
1218
+
1219
+ /* Stacks the View task / Close row to match the approval block above it
1220
+ (full-width primary action + a quiet text link) instead of two side-by-side
1221
+ buttons — scoped here rather than in success-card.ts's shared base classes
1222
+ so panel.ts's unrelated capture-success card is unaffected. */
1223
+ .ap-sdk-success-actions--stacked {
1224
+ flex-direction: column;
1225
+ align-items: center;
1226
+ gap: 10px;
1227
+ }
1228
+
1229
+ .ap-sdk-success-actions--stacked .ap-sdk-panel__btn {
1230
+ flex: none;
1231
+ }
1232
+
1115
1233
  .ap-sdk-runner__meta {
1116
1234
  display: flex;
1117
1235
  flex-direction: column;
@@ -1474,27 +1592,29 @@ Please report this to https://github.com/markedjs/marked.`,e){let r="<p>An error
1474
1592
  Title: ${document.title}
1475
1593
 
1476
1594
  ${n}${r?`
1477
- … (truncated)`:""}`}function Vm(e,t){var i;const r=e instanceof HTMLTextAreaElement?HTMLTextAreaElement.prototype:HTMLInputElement.prototype,o=(i=Object.getOwnPropertyDescriptor(r,"value"))==null?void 0:i.set;if(!o)throw new Error("target element does not accept text input");o.call(e,t),e.dispatchEvent(new Event("input",{bubbles:!0})),e.dispatchEvent(new Event("change",{bubbles:!0}))}function Xm(e,t,n){var g,m;const r=e==="done"?"✓":"✗",o=t.selector?` \`${t.selector}\``:"",i=t.description||`${t.action}${o}`,a=e==="done"&&t.action==="getContext"?`read context (${(g=n==null?void 0:n.length)!=null?g:0} chars)`:n,d=a?` — ${a}`:"";if(Kn.push({status:e,text:`${r} ${i}${d}`}),!z)return;const u=z.querySelector("[data-ap-runner-log]");if(!u)return;(m=u.querySelector("[data-ap-runner-placeholder]"))==null||m.remove();const p=u.scrollHeight-u.scrollTop-u.clientHeight<=Lc,h=document.createElement("div");h.className=`ap-sdk-runner__log-entry ap-sdk-runner__log-entry--${e}`,h.textContent=Kn[Kn.length-1].text,u.appendChild(h),p&&(u.scrollTop=u.scrollHeight)}function Km(e){var t,n;return(n=(t=e.display)==null?void 0:t.variant)!=null?n:e.sdkEventType}function Qm(e){const t=Km(e);return(e.stream==="stdout"||e.stream==="stderr"||e.stream==="sdk_event"&&(t==="text"||t==="thinking"))&&e.data.trim()||null}function Nc(e){var r;const t=e.filter(o=>o.sequence>Rr).sort((o,i)=>o.sequence-i.sequence);if(t.length===0||(Rr=Math.max(Rr,...t.map(o=>o.sequence)),!z))return;const n=z.querySelector("[data-ap-runner-log]");if(n)for(const o of t){const i=Qm(o);if(!i)continue;(r=n.querySelector("[data-ap-runner-placeholder]"))==null||r.remove();const a=n.scrollHeight-n.scrollTop-n.clientHeight<=Lc,d=document.createElement("div");d.className=`ap-sdk-runner__log-entry ap-sdk-runner__log-entry--output ap-sdk-runner__log-entry--${o.stream}`,o.stream==="sdk_event"?(d.classList.add("ap-sdk-markdown"),d.innerHTML=Pc(i)):d.textContent=i,n.appendChild(d),a&&(n.scrollTop=n.scrollHeight)}}function eb(e){if(!z||!ve||!er)return;const t=z.querySelector("[data-ap-runner-summary]");if(!t)return;const n=`${er.replace(/\/+$/,"")}/tasks/${ve}`,r=e==="completed"?"Automation complete!":"Automation ended",o=e==="completed";t.style.display="block",t.innerHTML=`
1595
+ … (truncated)`:""}`}function Vm(e,t){var i;const r=e instanceof HTMLTextAreaElement?HTMLTextAreaElement.prototype:HTMLInputElement.prototype,o=(i=Object.getOwnPropertyDescriptor(r,"value"))==null?void 0:i.set;if(!o)throw new Error("target element does not accept text input");o.call(e,t),e.dispatchEvent(new Event("input",{bubbles:!0})),e.dispatchEvent(new Event("change",{bubbles:!0}))}function Xm(e,t,n){var g,m;const r=e==="done"?"✓":"✗",o=t.selector?` \`${t.selector}\``:"",i=t.description||`${t.action}${o}`,a=e==="done"&&t.action==="getContext"?`read context (${(g=n==null?void 0:n.length)!=null?g:0} chars)`:n,d=a?` — ${a}`:"";if(Kn.push({status:e,text:`${r} ${i}${d}`}),!z)return;const u=z.querySelector("[data-ap-runner-log]");if(!u)return;(m=u.querySelector("[data-ap-runner-placeholder]"))==null||m.remove();const p=u.scrollHeight-u.scrollTop-u.clientHeight<=Lc,h=document.createElement("div");h.className=`ap-sdk-runner__log-entry ap-sdk-runner__log-entry--${e}`,h.textContent=Kn[Kn.length-1].text,u.appendChild(h),p&&(u.scrollTop=u.scrollHeight)}function Km(e){var t,n;return(n=(t=e.display)==null?void 0:t.variant)!=null?n:e.sdkEventType}function Qm(e){const t=Km(e);return(e.stream==="stdout"||e.stream==="stderr"||e.stream==="sdk_event"&&(t==="text"||t==="thinking"))&&e.data.trim()||null}function Nc(e){var r;const t=e.filter(o=>o.sequence>Rr).sort((o,i)=>o.sequence-i.sequence);if(t.length===0||(Rr=Math.max(Rr,...t.map(o=>o.sequence)),!z))return;const n=z.querySelector("[data-ap-runner-log]");if(n)for(const o of t){const i=Qm(o);if(!i)continue;(r=n.querySelector("[data-ap-runner-placeholder]"))==null||r.remove();const a=n.scrollHeight-n.scrollTop-n.clientHeight<=Lc,d=document.createElement("div");d.className=`ap-sdk-runner__log-entry ap-sdk-runner__log-entry--output ap-sdk-runner__log-entry--${o.stream}`,o.stream==="sdk_event"?(d.classList.add("ap-sdk-markdown"),d.innerHTML=Pc(i)):d.textContent=i,n.appendChild(d),a&&(n.scrollTop=n.scrollHeight)}}function eb(e){if(!z||!ve||!er)return;const t=z.querySelector("[data-ap-runner-summary]");if(!t)return;const n=`${er.replace(/\/+$/,"")}/tasks/${ve}`,r=e==="completed"?"Automation complete!":"Automation ended",o=e==="completed",i=o?"ap-sdk-panel__btn--secondary":"ap-sdk-panel__btn--primary";t.style.display="block",t.innerHTML=`
1478
1596
  <div class="ap-sdk-success-card">
1479
1597
  <p class="ap-sdk-success-headline">${Xs(r)}</p>
1480
1598
  ${o?`
1481
1599
  <div class="ap-sdk-runner__approval" data-ap-runner-approval>
1482
1600
  <div class="ap-sdk-runner__approval-actions">
1483
- <button class="ap-sdk-panel__btn ap-sdk-panel__btn--primary" data-ap-runner-approve>Approve</button>
1484
- <button class="ap-sdk-panel__btn ap-sdk-panel__btn--ghost" data-ap-runner-reject>Reject</button>
1601
+ <button class="ap-sdk-panel__btn ap-sdk-panel__btn--primary ap-sdk-panel__btn--block" data-ap-runner-approve><span class="ap-sdk-btn-icon" aria-hidden="true">✓</span>Approve</button>
1602
+ <button class="ap-sdk-runner__text-btn ap-sdk-runner__text-btn--danger" data-ap-runner-reject>Reject</button>
1485
1603
  </div>
1486
1604
  <div class="ap-sdk-runner__reject-form" data-ap-runner-reject-form style="display:none">
1487
- <textarea class="ap-sdk-panel__textarea" rows="2" placeholder="Describe what was wrong — the agent will continue with this instruction. Leave empty to reject permanently." data-ap-runner-reject-feedback></textarea>
1488
- <button class="ap-sdk-panel__btn ap-sdk-panel__btn--primary" data-ap-runner-reject-submit>Reject Permanently</button>
1605
+ <textarea class="ap-sdk-panel__textarea" rows="2" placeholder="What was wrong? (optional)" data-ap-runner-reject-feedback></textarea>
1606
+ <div class="ap-sdk-runner__reject-hint">Leave blank to reject permanently, or add details so the agent can retry with your feedback.</div>
1607
+ <button class="ap-sdk-panel__btn ap-sdk-panel__btn--danger ap-sdk-panel__btn--block" data-ap-runner-reject-submit>Reject Permanently</button>
1489
1608
  </div>
1490
1609
  <div class="ap-sdk-runner__approval-error" data-ap-runner-approval-error style="display:none"></div>
1491
- </div>`:""}
1492
- <div class="ap-sdk-success-actions">
1493
- <button class="ap-sdk-panel__btn ap-sdk-panel__btn--primary" data-ap-runner-view>View task →</button>
1494
- <button class="ap-sdk-panel__btn ap-sdk-panel__btn--ghost" data-ap-runner-close>Close</button>
1610
+ </div>
1611
+ <div class="ap-sdk-runner__divider"></div>`:""}
1612
+ <div class="ap-sdk-success-actions ap-sdk-success-actions--stacked">
1613
+ <button class="ap-sdk-panel__btn ${i} ap-sdk-panel__btn--block" data-ap-runner-view>View task<span class="ap-sdk-btn-icon ap-sdk-btn-icon--trailing" aria-hidden="true">↗</span></button>
1614
+ <button class="ap-sdk-runner__text-btn" data-ap-runner-close>Close</button>
1495
1615
  </div>
1496
1616
  </div>
1497
- `,t.querySelector("[data-ap-runner-view]").addEventListener("click",()=>window.open(n,"_blank","noopener,noreferrer")),t.querySelector("[data-ap-runner-close]").addEventListener("click",()=>{const i=Gs;Js(),i==null||i()}),o&&tb(t)}function tb(e){const t=e.querySelector("[data-ap-runner-approve]"),n=e.querySelector("[data-ap-runner-reject]"),r=e.querySelector("[data-ap-runner-reject-form]"),o=e.querySelector("[data-ap-runner-reject-feedback]"),i=e.querySelector("[data-ap-runner-reject-submit]"),a=e.querySelector("[data-ap-runner-approval-error]"),d=e.querySelector(".ap-sdk-runner__approval-actions"),u=h=>{a.textContent=h,a.style.display="block"};t.addEventListener("click",()=>L(null,null,function*(){if(!ve||!Wt)return;const h=ve,g=Wt;t.disabled=!0,n.disabled=!0,a.style.display="none";try{yield ug(g,h),d.innerHTML='<span class="ap-sdk-status-badge ap-sdk-status-badge--approved">Approved</span>',r.style.display="none"}catch(m){t.disabled=!1,n.disabled=!1,u(m instanceof Error?m.message:"Failed to approve — try again.")}})),n.addEventListener("click",()=>{r.style.display=r.style.display==="none"?"block":"none",r.style.display==="block"&&o.focus()});const p=()=>{i.textContent=o.value.trim()?"Reject & Continue":"Reject Permanently"};o.addEventListener("input",p),i.addEventListener("click",()=>L(null,null,function*(){if(!ve||!Wt)return;const h=ve,g=Wt,m=o.value.trim();i.disabled=!0,t.disabled=!0,a.style.display="none",i.textContent="Rejecting…";try{yield dg(g,h,m),m?$c():(d.innerHTML='<span class="ap-sdk-status-badge ap-sdk-status-badge--rejected">Rejected</span>',r.style.display="none")}catch(k){i.disabled=!1,t.disabled=!1,p(),u(k instanceof Error?k.message:"Failed to reject — try again.")}}))}function nb(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function Xs(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function rb(e,t,n){const r=!!(t.backendUrl&&t.token),o=document.createElement("div");o.className="ap-sdk-advanced",o.innerHTML=`
1617
+ `,t.querySelector("[data-ap-runner-view]").addEventListener("click",()=>window.open(n,"_blank","noopener,noreferrer")),t.querySelector("[data-ap-runner-close]").addEventListener("click",()=>{const a=Gs;Js(),a==null||a()}),o&&tb(t)}function tb(e){const t=e.querySelector("[data-ap-runner-approve]"),n=e.querySelector("[data-ap-runner-reject]"),r=e.querySelector("[data-ap-runner-reject-form]"),o=e.querySelector("[data-ap-runner-reject-feedback]"),i=e.querySelector("[data-ap-runner-reject-submit]"),a=e.querySelector("[data-ap-runner-approval-error]"),d=e.querySelector(".ap-sdk-runner__approval-actions"),u=h=>{a.textContent=h,a.style.display="block"};t.addEventListener("click",()=>L(null,null,function*(){if(!ve||!Wt)return;const h=ve,g=Wt;t.disabled=!0,n.disabled=!0,a.style.display="none";try{yield ug(g,h),d.innerHTML='<span class="ap-sdk-status-badge ap-sdk-status-badge--approved">✓ Approved</span>',r.style.display="none"}catch(m){t.disabled=!1,n.disabled=!1,u(m instanceof Error?m.message:"Failed to approve — try again.")}})),n.addEventListener("click",()=>{r.style.display=r.style.display==="none"?"block":"none",r.style.display==="block"&&o.focus()});const p=()=>{i.textContent=o.value.trim()?"Reject & Continue":"Reject Permanently"};o.addEventListener("input",p),i.addEventListener("click",()=>L(null,null,function*(){if(!ve||!Wt)return;const h=ve,g=Wt,m=o.value.trim();i.disabled=!0,t.disabled=!0,a.style.display="none",i.textContent="Rejecting…";try{yield dg(g,h,m),m?$c():(d.innerHTML='<span class="ap-sdk-status-badge ap-sdk-status-badge--rejected">✕ Rejected</span>',r.style.display="none")}catch(k){i.disabled=!1,t.disabled=!1,p(),u(k instanceof Error?k.message:"Failed to reject — try again.")}}))}function nb(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function Xs(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function rb(e,t,n){const r=!!(t.backendUrl&&t.token),o=document.createElement("div");o.className="ap-sdk-advanced",o.innerHTML=`
1498
1618
  <details class="ap-sdk-advanced__details">
1499
1619
  <summary class="ap-sdk-advanced__summary">Advanced options</summary>
1500
1620
  <div class="ap-sdk-advanced__body">