@spotpatch/vite 1.9.0 → 1.11.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 +80 -16
- package/dist/cli.js +21 -1
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +75 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +80 -14
- package/dist/index.js.map +1 -1
- package/dist/runtime-client.js +34 -34
- package/dist/runtime-data-flow-panel.js +3 -3
- package/dist/runtime-data-flow-prelude.js +1 -1
- package/dist/runtime-external-handoff-panel.js +38 -0
- package/package.json +6 -5
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
var
|
|
2
|
-
`),
|
|
1
|
+
var z="data-spotpatch-ui",ae=Object.freeze({highlight:2147483646,controls:2147483647});function u(e,t){let n=e.createElement(t);return n.setAttribute(z,""),n}function _(e,t,n=""){let o=u(e,"button");return o.type="button",o.className=n,o.textContent=t,o}var q=Object.freeze({"zh-CN":Object.freeze({bindings:"数据去向",changes:"修改说明",componentEmpty:"当前组件没有找到可证明的接口。未找到不等于没有请求。",componentTab:"数据链路",componentTitle:"组件数据链路",consumed:"读取字段",declared:"代码声明,尚未在本次页面会话中观测",diagnostics:"诊断",disabled:"数据链路能力未启用,请在插件配置中设置 dataFlow: {}。",error:"数据链路报告加载失败",evidence:"证据",loading:"正在分析源码并合并运行时证据…",logicalObserved:"本次会话已进入 tRPC 调用链",noParameters:"未提取到可证明的参数键",observed:"本次会话已实际请求",pageEmpty:"当前已选页面范围内没有静态接口或运行时网络记录。",pageTab:"页面接口",pageTitle:"页面接口",parameters:"请求参数",refresh:"刷新证据",unknown:"未知"}),"en-US":Object.freeze({bindings:"Data destinations",changes:"Changes",componentEmpty:"No proven interface was found for this component. This does not prove that no request exists.",componentTab:"Data flow",componentTitle:"Component data flow",consumed:"Consumed fields",declared:"Declared in code, not observed in this page session",diagnostics:"Diagnostics",disabled:"Data flow is disabled. Set dataFlow: {} in the plugin options.",error:"Failed to load the data-flow report",evidence:"Evidence",loading:"Analyzing source and merging runtime evidence…",logicalObserved:"Dispatched through the tRPC link in this session",noParameters:"No proven parameter keys were extracted",observed:"Actually requested in this session",pageEmpty:"No static interface or runtime traffic is available for the selected page scope.",pageTab:"Page APIs",pageTitle:"Page interfaces",parameters:"Request parameters",refresh:"Refresh evidence",unknown:"Unknown"})});function C(e,t,n){let o=u(e,"span");return o.className="spotpatch-data-flow-badge",o.dataset.tone=n,o.textContent=t,o}function v(e,t,n){let o=u(e,"div");o.className="spotpatch-data-flow-detail";let a=u(e,"span");a.textContent=t;let s=u(e,"code");return s.textContent=n,o.append(a,s),o}function V(e,t,n){let o=u(e,"article");o.className="spotpatch-data-flow-card";let a=u(e,"div");a.className="spotpatch-data-flow-card-head";let s=u(e,"div");s.className="spotpatch-data-flow-endpoint";let r=u(e,"strong");r.textContent=t.method??n.unknown;let f=u(e,"code");f.textContent=t.url===void 0?t.operation??n.unknown:`${t.url.origin??""}${t.url.pathname}`,s.append(r,f);let c=u(e,"div");c.className="spotpatch-data-flow-badges",c.append(C(e,t.execution==="observed"?t.kind==="rpc"?n.logicalObserved:n.observed:n.declared,t.execution==="observed"?"success":"neutral"),C(e,t.proof,t.proof==="proven"?"proof":"warning"),C(e,t.association,"neutral")),a.append(s,c);let m=t.parameters.length===0?n.noParameters:t.parameters.map(g=>`${g.position}.${g.path}${g.type===void 0?"":`: ${g.type}`}${g.sensitive?" [sensitive]":""}${g.condition===void 0?"":` [when ${g.condition}]`}`).join(`
|
|
2
|
+
`),b=t.response.consumedFields.length===0?n.unknown:t.response.consumedFields.join(", "),w=t.suppliedBindings.length===0?n.unknown:t.suppliedBindings.join(", "),h=u(e,"div");h.className="spotpatch-data-flow-card-body";let E=new Set(t.observationIds),T=t.evidenceIds.filter(g=>!E.has(g)).length;return h.append(v(e,n.parameters,m),v(e,n.consumed,b),v(e,n.bindings,w),v(e,n.evidence,`${String(T)} static · ${String(t.observationIds.length)} runtime`)),o.append(a,h),o}function H(e,t){let n=u(e,"section");n.className="spotpatch-data-flow-panel";let o=u(e,"h3");o.textContent=t;let a=u(e,"p");a.className="spotpatch-data-flow-status";let s=u(e,"div");return s.className="spotpatch-data-flow-list",n.append(o,a,s),Object.freeze({root:n,status:a,list:s})}function I(e,t,n,o,a,s){let r=q[n()],f=H(e,r.componentTitle),c=H(e,r.pageTitle),m=_(e,r.refresh),b=e.createElement("style");b.textContent=X,m.classList.add("spotpatch-data-flow-refresh"),f.root.prepend(m);let w=u(e,"div"),h=u(e,"nav");h.className="spotpatch-view-tabs",h.setAttribute("aria-label","SpotPatch views"),h.setAttribute("role","tablist");let E=new Map([["changes",o],["component-data",f.root],["page-data",c.root],["diagnostics",a]]),T=new Map,g="changes";for(let i of E.keys()){let l=_(e,"");l.dataset.viewId=i,l.id=`spotpatch-view-${i}-tab`,l.setAttribute("role","tab"),l.setAttribute("aria-selected",String(i===g));let d=E.get(i);d?.setAttribute("aria-labelledby",l.id),d?.setAttribute("role","tabpanel"),!t&&(i==="component-data"||i==="page-data")&&(l.hidden=!0),T.set(i,l),h.append(l)}w.append(h,...E.values());function S(i){if(E.has(i)){g=i;for(let[l,d]of E){d.hidden=l!==i;let y=T.get(l);y?.setAttribute("aria-selected",String(l===i)),y!==void 0&&(y.tabIndex=l===i?0:-1)}s()}}function D(i){if(!(i.target instanceof HTMLButtonElement))return;let l=i.target.dataset.viewId;l!==void 0&&S(l)}h.addEventListener("click",D),S(g);function A(i,l,d){if(i.list.replaceChildren(),i.status.dataset.state=l.status,!t||l.status==="disabled"){i.status.textContent=r.disabled;return}if(l.status==="loading"){i.status.textContent=r.loading;return}if(l.status==="error"){i.status.textContent=l.message??r.error;return}let y=l.report,k=y===void 0?"":[...new Set(y.diagnostics.map(({code:x})=>x))].join(", "),j=k.length===0?"":` · ${r.diagnostics}: ${k}`;if(y===void 0||y.dependencies.length===0){i.status.textContent=`${d}${j}`;return}i.status.textContent=`${String(y.dependencies.length)} · ${y.completeness.complete?"complete":"partial"}${j}`,i.list.append(...y.dependencies.map(x=>V(e,x,r)))}return Object.freeze({root:w,refreshButton:m,styles:b,dispose(){h.removeEventListener("click",D)},render(i){r=q[n()];let l=[r.changes,r.componentTab,r.pageTab,r.diagnostics];[...T.values()].forEach((d,y)=>{d.textContent=l[y]??""}),m.textContent=`${r.refresh} · ${String(i.observationCount)}`,m.disabled=!t||i.component.status==="loading",A(f,i.component,r.componentEmpty),A(c,i.page,r.pageEmpty)},resetView(){S("changes")}})}var X=`
|
|
3
3
|
.spotpatch-view-tabs { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 4px; margin-bottom: 12px; padding: 3px; border: 1px solid rgb(255 255 255 / 7%); border-radius: 9px; background: rgb(3 7 18 / 42%); }
|
|
4
4
|
.spotpatch-view-tabs button { min-width: 0; border: 0; border-radius: 7px; padding: 7px 5px; color: var(--spotpatch-text-muted); background: transparent; cursor: pointer; font-size: 10.5px; }
|
|
5
5
|
.spotpatch-view-tabs button[aria-selected="true"] { color: #f8fafc; background: rgb(139 124 247 / 18%); }
|
|
@@ -23,4 +23,4 @@ var N="data-spotpatch-ui",ae=Object.freeze({highlight:2147483646,controls:214748
|
|
|
23
23
|
.spotpatch-data-flow-detail { display: grid; grid-template-columns: 82px minmax(0, 1fr); gap: 8px; align-items: start; }
|
|
24
24
|
.spotpatch-data-flow-detail > span { color: var(--spotpatch-text-muted); font-size: 10px; }
|
|
25
25
|
.spotpatch-data-flow-detail > code { overflow-wrap: anywhere; color: #cbd5e1; font: 10px/1.5 ui-monospace, SFMono-Regular, Menlo, monospace; white-space: pre-wrap; }
|
|
26
|
-
`;var
|
|
26
|
+
`;var G=Symbol.for("spotpatch.data-flow.extension.v1");function L(e,t=globalThis){t[G]=e}var p=Object.freeze({observationMaxEntries:100,observationMaxBytes:262144,observationTtlMs:3e5,protocolRequestMaxBytes:32768,reportMaxBytes:131072,reportMaxEvidence:200,reportMaxDiagnostics:256,capabilityMaxReasons:64,graphMaxDepth:5,graphMaxModules:50,graphMaxCallsites:100,analysisTimeoutMs:2e3,reportMaxFields:100}),ge=p.reportMaxFields,ye=Object.freeze({observationMaxEntries:p.observationMaxEntries,observationMaxBytes:p.observationMaxBytes,observationTtlMs:p.observationTtlMs,reportMaxBytes:p.reportMaxBytes});var W=Symbol.for("spotpatch.data-flow.runtime.v1");function O(e=globalThis){return e[W]}var K=new Set(["authorization","cookie","defaultvalue","password","setcookie","value"]);function $(e){return e.toLowerCase().replaceAll(/[-_:]/gu,"")}function N(e){let t=$(e);return K.has(t)||t.includes("apikey")||t.includes("authorization")||t.includes("secret")||t.includes("token")}function R(e,t){return Object.freeze(e.slice(0,Math.max(0,t)))}function Y(e){let t=e.url===void 0?void 0:R(e.url.queryKeys,p.reportMaxFields),n=R(e.parameters,p.reportMaxFields).map(m=>Object.freeze({...m,evidenceIds:R(m.evidenceIds,p.reportMaxEvidence)})),o=R(e.response.consumedFields,p.reportMaxFields),a=R(e.suppliedBindings,p.graphMaxCallsites),s=R(e.locationIds,p.graphMaxCallsites),r=R(e.evidenceIds,p.reportMaxEvidence),f=R(e.observationIds,p.observationMaxEntries);return t?.length!==e.url?.queryKeys.length||n.length!==e.parameters.length||n.some((m,b)=>m.evidenceIds.length!==e.parameters[b]?.evidenceIds.length)||o.length!==e.response.consumedFields.length||a.length!==e.suppliedBindings.length||s.length!==e.locationIds.length||r.length!==e.evidenceIds.length||f.length!==e.observationIds.length?Object.freeze({dependency:Object.freeze({...e,...e.url===void 0?{}:{url:Object.freeze({...e.url,queryKeys:t??Object.freeze([])})},parameters:Object.freeze(n),response:Object.freeze({consumedFields:o}),suppliedBindings:a,locationIds:s,evidenceIds:r,observationIds:f}),trimmed:!0}):Object.freeze({dependency:e,trimmed:!1})}function J(e,t){return Object.freeze([...new Set([...e.flatMap(n=>[...n.evidenceIds,...n.parameters.flatMap(o=>o.evidenceIds)]),...t.flatMap(n=>n.evidenceIds)])])}function Q(e,t,n){let o=new Map(e.map(r=>[r.id,r])),a=[],s=new Set;for(let r of t){let f=o.get(r);f!==void 0&&!s.has(r)&&(a.push(f),s.add(r))}if(n)for(let r of e)s.has(r.id)||a.push(r);return R(a,p.reportMaxEvidence)}function Z(e,t){return Object.freeze({...e,parameters:Object.freeze(e.parameters.map(n=>Object.freeze({...n,evidenceIds:Object.freeze(n.evidenceIds.filter(o=>t.has(o)))}))),evidenceIds:Object.freeze(e.evidenceIds.filter(n=>t.has(n)))})}function ee(e){return e==="analysis"?"DATA_FLOW_ANALYSIS_TRUNCATED":"DATA_FLOW_OBSERVATION_DROPPED"}function F(e,t={}){let n=Math.min(Math.max(0,t.maximumDependencies??p.graphMaxCallsites),p.graphMaxCallsites),o=R(e.dependencies,n).map(Y),a=o.map(({dependency:d})=>d),s=R(e.baseline.analyzedSourceVersions,p.graphMaxModules),r=e.dependencies.length>a.length||o.some(({trimmed:d})=>d)||e.baseline.analyzedSourceVersions.length>s.length||e.capability.reasons.length>p.capabilityMaxReasons||e.evidence.length>p.reportMaxEvidence||e.diagnostics.length>p.reportMaxDiagnostics;if(!(t.forceTruncation===!0||r))return e;let c=t.mode??"analysis",m=ee(c),b=`${e.reportId}_collection_${c}`,w=Object.freeze([...e.capability.reasons.filter(d=>d.code!==m).slice(0,p.capabilityMaxReasons-1),Object.freeze({code:m,retryable:!1})]),h=Object.freeze([...e.diagnostics.filter(d=>d.id!==b).slice(0,p.reportMaxDiagnostics-1),Object.freeze({id:b,code:m,severity:"warning",retryable:!1,evidenceIds:Object.freeze([])})]),E=J(a,h),T=Q(e.evidence,E,e.dependencies.length===a.length),g=new Set(T.map(({id:d})=>d)),S=Object.freeze(a.map(d=>Z(d,g))),D=Object.freeze(h.map(d=>Object.freeze({...d,evidenceIds:Object.freeze(d.evidenceIds.filter(y=>g.has(y)))}))),A=e.dependencies.length-a.length,i=e.baseline.analyzedSourceVersions.length-s.length,l=i>0&&A===0?"modules":"callsites";return Object.freeze({...e,baseline:Object.freeze({...e.baseline,analyzedSourceVersions:s}),capability:Object.freeze({...e.capability,...c==="analysis"&&e.capability.staticAnalysis==="available"?{staticAnalysis:"partial"}:{},reasons:w}),dependencies:S,evidence:T,diagnostics:D,...c==="analysis"?{completeness:Object.freeze({...e.completeness,complete:!1,frontierCount:e.completeness.frontierCount+A+i+(r&&A===0&&i===0?1:0),truncatedBy:t.truncatedBy??e.completeness.truncatedBy??l})}:{}})}function te(e,t){let n=t.origin;return!(t.kind==="rpc"?e.transport==="trpc"&&t.operation!==void 0&&e.operation===t.operation:t.kind==="http"?e.transport==="fetch"||e.transport==="xhr":!1)||e.freshness!=="current"||n===void 0||e.requestCallsiteId!==n.requestCallsiteId||e.sourceVersion!==n.sourceVersion||t.method!==void 0&&e.method.toUpperCase()!==t.method.toUpperCase()||t.url!==void 0&&e.url.pathname!==t.url.pathname||t.url?.origin!==void 0&&e.url.origin!==t.url.origin||n.componentSourceId!==void 0&&e.componentSourceId!==void 0&&e.componentSourceId!==n.componentSourceId||n.triggerCallsiteId!==void 0&&e.triggerCallsiteId!==void 0&&e.triggerCallsiteId!==n.triggerCallsiteId?!1:t.association!=="transitive"||e.componentSourceId===n.componentSourceId&&e.triggerCallsiteId===n.triggerCallsiteId}function ne(e){return Object.freeze({id:e.id,kind:"runtime-observation",summaryKey:"dataFlow.evidence.runtimeDispatch"})}function U(e,t){let n=new Set,o=e.map(a=>{let s=t.filter(c=>te(c,a));for(let c of s)n.add(c.id);if(s.length===0)return a;let r=[...new Set(s.flatMap(({url:c})=>c.origin===void 0?[]:[c.origin]))],f=r.length===1?r[0]:void 0;return Object.freeze({...a,...a.url===void 0||a.url.origin!==void 0||f===void 0?{}:{url:Object.freeze({...a.url,origin:f})},execution:"observed",observationIds:Object.freeze([...new Set([...a.observationIds,...s.map(({id:c})=>c)])]),evidenceIds:Object.freeze([...new Set([...a.evidenceIds,...s.map(({id:c})=>c)])])})});return Object.freeze({dependencies:Object.freeze(o),matchedObservationIds:n})}function B(e,t,n){let o=new Set(e.map(({id:a})=>a));return Object.freeze([...e,...t.flatMap(a=>n.has(a.id)&&!o.has(a.id)?[ne(a)]:[])])}function P(e,t){let n=t.filter(a=>a.componentSourceId===void 0||a.componentSourceId===e.component.componentSourceId),o=U(e.dependencies,n);return F(Object.freeze({...e,dependencies:o.dependencies,evidence:B(e.evidence,n,o.matchedObservationIds)}),{mode:"observation"})}function oe(e){let t=e.transport==="trpc";return Object.freeze({id:e.id,kind:t?"rpc":"http",direction:e.method==="GET"||e.method==="HEAD"||e.method==="QUERY"||e.method==="SUBSCRIPTION"?"read":"write",execution:"observed",proof:"unavailable",association:"unassigned",method:e.method,...t?e.operation===void 0?{}:{operation:e.operation}:{url:e.url},parameters:Object.freeze((t?[]:e.url.queryKeys).map(n=>Object.freeze({path:n,position:"query",sensitive:N(n),valueState:"not-collected",evidenceIds:Object.freeze([e.id])}))),response:Object.freeze({consumedFields:Object.freeze([])}),suppliedBindings:Object.freeze([]),locationIds:Object.freeze([]),evidenceIds:Object.freeze([e.id]),observationIds:Object.freeze([e.id])})}function M(e,t){let n=t.filter(({freshness:r})=>r==="current"),o=U(e.dependencies,n),a=n.filter(({id:r})=>!o.matchedObservationIds.has(r)).map(oe),s=new Set(n.map(({id:r})=>r));return F(Object.freeze({...e,dependencies:Object.freeze([...o.dependencies,...a]),evidence:B(e.evidence,n,s)}),{mode:"observation"})}L(Object.freeze({createPanel:I,getComponentRegistration(e){return O()?.getComponentRegistration(e)},observations(e){let t=O();return t?.updateRoute(e),t?.observations()??Object.freeze([])},mergeComponentReport:P,mergePageReport:M}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var F=Object.freeze({observationMaxEntries:100,observationMaxBytes:262144,observationTtlMs:3e5,protocolRequestMaxBytes:32768,reportMaxBytes:131072,reportMaxEvidence:200,reportMaxDiagnostics:256,capabilityMaxReasons:64,graphMaxDepth:5,graphMaxModules:50,graphMaxCallsites:100,analysisTimeoutMs:2e3,reportMaxFields:100}),
|
|
1
|
+
var F=Object.freeze({observationMaxEntries:100,observationMaxBytes:262144,observationTtlMs:3e5,protocolRequestMaxBytes:32768,reportMaxBytes:131072,reportMaxEvidence:200,reportMaxDiagnostics:256,capabilityMaxReasons:64,graphMaxDepth:5,graphMaxModules:50,graphMaxCallsites:100,analysisTimeoutMs:2e3,reportMaxFields:100}),k=F.reportMaxFields,te=Object.freeze({observationMaxEntries:F.observationMaxEntries,observationMaxBytes:F.observationMaxBytes,observationTtlMs:F.observationTtlMs,reportMaxBytes:F.reportMaxBytes});var l="/__spotpatch/v1";var oe=Object.freeze({bootstrap:`${l}/bootstrap`,sourceContext:`${l}/source-context`,openEditor:`${l}/open-editor`,dataFlowComponentReport:`${l}/data-flow/component-report`,dataFlowPageReport:`${l}/data-flow/page-report`,agentCapability:`${l}/agent/capability`,agentWorkspaceHealth:`${l}/agent/workspace-health`,agentJobs:`${l}/agent/jobs`,externalHandoffCapability:`${l}/external-handoff/capability`,externalHandoffPublish:`${l}/external-handoff/publish`,externalHandoffStatus:`${l}/external-handoff/status`,externalHandoffResolveDelivery:`${l}/external-handoff/resolve-delivery`,externalAgentControlStatus:`${l}/external-agent/control/status`,externalAgentControlConnect:`${l}/external-agent/control/connect`,externalAgentControlDisconnect:`${l}/external-agent/control/disconnect`,externalAgentControlCancel:`${l}/external-agent/control/cancel`,externalAgentEvents:`${l}/external-agent/events`,externalAgentResult:`${l}/external-agent/result`});var P=Symbol.for("spotpatch.data-flow.runtime.v1"),K=Symbol.for("react.memo"),X=Symbol.for("react.forward_ref");function j(e){return e.performance?.now()??Date.now()}function T(e){let n=0,o=(()=>{try{let i=new Uint8Array(8);return globalThis.crypto.getRandomValues(i),Array.from(i,d=>d.toString(36).padStart(2,"0")).join("")}catch{return"local"}})();return()=>(n+=1,`${e}_${o}_${n.toString(36)}`)}function q(e,n){try{let o=new URL(e,n);return Object.freeze({origin:o.origin,pathname:o.pathname,queryKeys:Object.freeze([...new Set(o.searchParams.keys())].sort().slice(0,k))})}catch{return Object.freeze({pathname:e.split(/[?#]/u,1)[0]??"{invalid}",queryKeys:Object.freeze([])})}}function Y(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function J(e,n){return n?.method!==void 0?n.method.toUpperCase():typeof Request<"u"&&e instanceof Request?e.method.toUpperCase():"GET"}function U(e,n){try{let o=new URL(e,n).pathname;return o===l||o.startsWith(`${l}/`)}catch{return!1}}function Q(e){return new TextEncoder().encode(JSON.stringify(e)).byteLength}function Z(e,n){let o=[],i=0;function d(p){for(;o[0]!==void 0&&p-o[0].recordedAt>e.observationTtlMs;){let u=o.shift();u!==void 0&&(i-=u.bytes)}}return Object.freeze({add(p){let u=j(n);d(u);let y=Q(p);if(!(y>e.observationMaxBytes))for(o.push(Object.freeze({bytes:y,observation:p,recordedAt:u})),i+=y;o.length>e.observationMaxEntries||i>e.observationMaxBytes;){let b=o.shift();b!==void 0&&(i-=b.bytes)}},clear(){o.length=0,i=0},values(){return d(j(n)),Object.freeze(o.map(({observation:p})=>p))}})}function m(e,n){try{return Object.getOwnPropertyDescriptor(e,n)}catch{return}}function ee(e){let n=m(e,"$$typeof")?.value,o=n===K?"type":n===X?"render":void 0;if(o===void 0)return;let i=m(e,o)?.value;return typeof i=="object"&&i!==null||typeof i=="function"?i:void 0}function M(e,n,o,i=m(e,n)){if(!(i===void 0||!("value"in i)||!i.writable)){try{Object.defineProperty(e,n,{...i,value:o})}catch{return}return()=>{try{m(e,n)?.value===o&&Object.defineProperty(e,n,i)}catch{}}}}function x(e){try{e()}catch{}}function z(e,n=globalThis){let o=new WeakMap,i=new WeakMap,d=Z(e.limits,n),p=T("invocation"),u=T("observation"),y=T("page")(),b=T("route"),h=b(),v,D,g,L=!1,O=(()=>{try{return n.fetch}catch{return}})();function V(t,r){if(O===void 0)throw new TypeError("Fetch is unavailable.");let s=Reflect.apply(O,this,[t,r]);return x(()=>{let a=g,c=a?.invocationToken,w=Y(t);U(w,n.location?.href??"http://spotpatch.invalid/")||d.add(Object.freeze({schemaVersion:1,id:u(),pageEpoch:y,routeEpoch:h,...a===void 0?{}:{requestCallsiteId:a.requestCallsiteId,sourceVersion:a.sourceVersion},...c===void 0?{}:{invocationId:c.invocationId,componentSourceId:c.componentSourceId,triggerCallsiteId:c.triggerCallsiteId},transport:"fetch",method:J(t,r),url:q(w,n.location?.href??"http://spotpatch.invalid/"),outcome:"dispatched",freshness:"current",diagnosticIds:Object.freeze([])}))}),s}let H=O===void 0?void 0:M(n,"fetch",V),f=(()=>{try{return n.XMLHttpRequest?.prototype}catch{return}})(),C=f===void 0?void 0:m(f,"open"),_=f===void 0?void 0:m(f,"send");function W(t,r,...s){let a=C?.value;typeof a=="function"&&Reflect.apply(a,this,[t,r,...s]),x(()=>{i.set(this,Object.freeze({method:t,url:String(r)}))})}function N(t){let r=_?.value;typeof r=="function"&&Reflect.apply(r,this,[t]),x(()=>{let s=i.get(this);if(s===void 0||U(s.url,n.location?.href??"http://spotpatch.invalid/"))return;let a=g,c=a?.invocationToken;d.add(Object.freeze({schemaVersion:1,id:u(),pageEpoch:y,routeEpoch:h,...a===void 0?{}:{requestCallsiteId:a.requestCallsiteId,sourceVersion:a.sourceVersion},...c===void 0?{}:{invocationId:c.invocationId,componentSourceId:c.componentSourceId,triggerCallsiteId:c.triggerCallsiteId},transport:"xhr",method:s.method.toUpperCase(),url:q(s.url,n.location?.href??"http://spotpatch.invalid/"),outcome:"dispatched",freshness:"current",diagnosticIds:Object.freeze([])}))})}let B=f===void 0||typeof C?.value!="function"?void 0:M(f,"open",W,C),G=f===void 0||typeof _?.value!="function"?void 0:M(f,"send",N,_),I=Object.freeze({beginInvocation(t){return Object.freeze({invocationId:p(),componentSourceId:t.componentSourceId,triggerCallsiteId:t.triggerCallsiteId,sourceVersion:t.sourceVersion})},bindInvocation(t,r){return function(...a){return I.withInvocation(t,()=>Reflect.apply(r,this,a))}},bindTrigger(t,r){if(typeof r!="function")return r;let s=r;return function(...c){let w=I.beginInvocation(t);return I.withInvocation(w,()=>Reflect.apply(s,this,c))}},captureInvocation:()=>D,clear:d.clear,createTrpcLink(){return()=>t=>(x(()=>{let r=t.op.path,s=t.op.type;if(typeof r!="string"||r.length===0||r.length>512||s!=="query"&&s!=="mutation"&&s!=="subscription")return;let a=g,c=a?.invocationToken;d.add(Object.freeze({schemaVersion:1,id:u(),pageEpoch:y,routeEpoch:h,...a===void 0?{}:{requestCallsiteId:a.requestCallsiteId,sourceVersion:a.sourceVersion},...c===void 0?{}:{invocationId:c.invocationId,componentSourceId:c.componentSourceId,triggerCallsiteId:c.triggerCallsiteId},transport:"trpc",method:s.toUpperCase(),operation:r,url:Object.freeze({pathname:r,queryKeys:Object.freeze([])}),outcome:"dispatched",freshness:"current",diagnosticIds:Object.freeze([])}))}),t.next(t.op))},dispose(){L||(L=!0,d.clear(),H?.(),B?.(),G?.())},getComponentRegistration:t=>o.get(t),getCurrentRequestFrame:()=>g,observations:()=>Object.freeze(d.values().map(t=>t.routeEpoch===h?t:Object.freeze({...t,freshness:"stale-route"}))),registerComponent(t,r,s){let a=Object.freeze({componentSourceId:r,sourceVersion:s}),c=[t],w=new Set;for(;c.length>0;){let R=c.pop();if(R===void 0||w.has(R))continue;w.add(R),o.set(R,a);let E=ee(R);E!==void 0&&c.push(E)}},updateRoute(t){v===void 0?v=t:v!==t&&(v=t,h=b())},withInvocation(t,r){let s=D;D=t;try{return r()}finally{D=s}},withRequestFrame(t,r,s){let a=g;g=Object.freeze({requestCallsiteId:r.requestCallsiteId,sourceVersion:r.sourceVersion,...t===void 0?{}:{invocationToken:t}});try{return s()}finally{g=a}}});return I}function S(e,n=globalThis){if(!e.enabled)return;let o=n[P]??z(e,n);return n[P]=o,o}var $=S(__SPOTPATCH_DATA_FLOW_CONFIG__);if($===void 0)throw new Error("SpotPatch data-flow prelude was loaded while disabled.");var ye=$;export{ye as dataFlowRuntime};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
var T="/__spotpatch/v1",ae="X-SpotPatch-Token",O=Object.freeze({bootstrap:`${T}/bootstrap`,sourceContext:`${T}/source-context`,openEditor:`${T}/open-editor`,dataFlowComponentReport:`${T}/data-flow/component-report`,dataFlowPageReport:`${T}/data-flow/page-report`,agentCapability:`${T}/agent/capability`,agentWorkspaceHealth:`${T}/agent/workspace-health`,agentJobs:`${T}/agent/jobs`,externalHandoffCapability:`${T}/external-handoff/capability`,externalHandoffPublish:`${T}/external-handoff/publish`,externalHandoffStatus:`${T}/external-handoff/status`,externalHandoffResolveDelivery:`${T}/external-handoff/resolve-delivery`,externalAgentControlStatus:`${T}/external-agent/control/status`,externalAgentControlConnect:`${T}/external-agent/control/connect`,externalAgentControlDisconnect:`${T}/external-agent/control/disconnect`,externalAgentControlCancel:`${T}/external-agent/control/cancel`,externalAgentEvents:`${T}/external-agent/events`,externalAgentResult:`${T}/external-agent/result`});var Oe=Object.freeze({INVALID_REQUEST:"INVALID_REQUEST",INVALID_TOKEN:"INVALID_TOKEN",ORIGIN_NOT_ALLOWED:"ORIGIN_NOT_ALLOWED",EXTERNAL_HANDOFF_DISABLED:"EXTERNAL_HANDOFF_DISABLED",EXTERNAL_HANDOFF_UNAVAILABLE:"EXTERNAL_HANDOFF_UNAVAILABLE",HANDOFF_VALIDATION_FAILED:"HANDOFF_VALIDATION_FAILED",HANDOFF_SOURCE_STALE:"HANDOFF_SOURCE_STALE",HANDOFF_NOT_FOUND:"HANDOFF_NOT_FOUND",HANDOFF_EXPIRED:"HANDOFF_EXPIRED",HANDOFF_CURSOR_INVALID:"HANDOFF_CURSOR_INVALID",HANDOFF_RESPONSE_TOO_LARGE:"HANDOFF_RESPONSE_TOO_LARGE",EXTERNAL_AGENT_BUSY:"EXTERNAL_AGENT_BUSY",ACTIVE_DISPATCH_INVALID:"ACTIVE_DISPATCH_INVALID",SESSION_CLOSED:"SESSION_CLOSED",INTERNAL_ERROR:"INTERNAL_ERROR"}),yt=Object.values(Oe);function $e(e){return typeof e=="string"&&yt.includes(e)}var Ae=Object.freeze({maximumConnectorReceipts:64,maximumWaiters:8,activeStatusPollMs:1e3}),k=Object.freeze({maximumEventSubscribers:4,eventHeartbeatMs:15e3,eventReconnectMinimumMs:500,eventReconnectMaximumMs:1e4,maximumChangedFiles:20,maximumChecks:64,maximumEventLineBytes:64*1024,maximumResultDiffBytes:512e3}),Ve="managed-apply-v1",je=Object.freeze(["inbox","managed"]),ze=Object.freeze(["disconnected","diagnosing","awaiting-consent","connecting","ready","busy","degraded","error","disconnecting"]),qe=Object.freeze(["authenticated","auth-not-required","signed-out","unknown"]),Ke=Object.freeze(["missing","valid","invalid"]),We=Object.freeze(["queued","dispatching","accepted","unknown"]),Ye=Object.freeze(["not-observable","started","terminal-succeeded","terminal-failed","interrupted","unknown"]),Je=Object.freeze(["preparing","running","auditing","validating","applying","completed","review-required","failed","cancelled","cleanup-warning"]),Le=Object.freeze(["passed","failed","not-configured","unavailable"]),Qe=Object.freeze(["passed","failed","unavailable"]),Ze=Object.freeze(["AGENT_BINARY_NOT_FOUND","AGENT_BINARY_UNTRUSTED","AGENT_VERSION_UNSUPPORTED","APP_SERVER_HANDSHAKE_FAILED","AGENT_AUTH_REQUIRED","AGENT_MODEL_UNAVAILABLE","AGENT_PROTOCOL_INCOMPATIBLE","CODEX_CONFIG_ISOLATION_UNSUPPORTED","MANAGED_GRANT_INVALID","MANAGED_PLATFORM_UNSUPPORTED","MANAGED_GIT_REQUIRED","MANAGED_SNAPSHOT_FAILED","MANAGED_SCOPE_VIOLATION","MANAGED_CHANGE_LIMIT_EXCEEDED","MANAGED_VALIDATION_FAILED","MANAGED_WORKSPACE_CONFLICT","MANAGED_APPLY_FAILED","MANAGED_CLEANUP_INCOMPLETE"]),et=Object.freeze(["integration","binary","handshake","auth","model","protocol","snapshot","audit","validation","apply","cleanup"]),tt=Object.freeze(["retry","user-action","reconfigure","none"]),nt=Object.freeze(["install-agent","use-supported-version","sign-in","choose-available-model","use-inbox","confirm-managed-access","review-candidate-diff","review-workspace-conflict","retry","inspect-cleanup-warning"]);function A(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function x(e,t){let a=Object.keys(e).sort(),s=[...t].sort();return a.length===s.length&&a.every((g,o)=>g===s[o])}function I(e){if(typeof e!="string")return!1;let t=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d+)?Z$/u.exec(e);if(t===null)return!1;let a=Date.parse(e);if(!Number.isFinite(a))return!1;let s=new Date(a);return s.getUTCFullYear()===Number(t[1])&&s.getUTCMonth()+1===Number(t[2])&&s.getUTCDate()===Number(t[3])&&s.getUTCHours()===Number(t[4])&&s.getUTCMinutes()===Number(t[5])&&s.getUTCSeconds()===Number(t[6])}async function Ne(e,t){let a=Number(e.headers.get("content-length"));if(Number.isFinite(a)&&a>t)throw await e.body?.cancel(),new TypeError("SpotPatch API response exceeds its safety limit.");if(e.body===null)throw new TypeError("SpotPatch API response body is unavailable.");let s=e.body.getReader(),g=[],o=0;try{for(;;){let E=await s.read();if(E.done)break;if(o+=E.value.byteLength,o>t)throw await s.cancel(),new TypeError("SpotPatch API response exceeds its safety limit.");g.push(E.value)}}finally{s.releaseLock()}let c=new Uint8Array(o),i=0;for(let E of g)c.set(E,i),i+=E.byteLength;return JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(c))}function ye(e){if(!A(e)||!x(e,["data","ok"])||e.ok!==!0)throw new TypeError("SpotPatch API success envelope is invalid.");return e.data}var ot=64*1024;function b(e,t){return typeof t=="string"&&e.includes(t)}function q(e,t=0){return Number.isSafeInteger(e)&&e>=t}function Se(e,t,a){return x(e,[...t,...a.filter(s=>e[s]!==void 0)])}function St(e){return typeof e!="string"||e.length===0||e.length>4096||e.startsWith("/")||e.includes("\\")?!1:e.split("/").every(t=>t.length>0&&t!=="."&&t!=="..")}function rt(e){if(!Array.isArray(e)||e.length>k.maximumChangedFiles)throw new TypeError("Invalid managed file summaries.");return e.map(t=>{if(!A(t)||!x(t,["additions","deletions","path"])||!St(t.path)||!q(t.additions)||!q(t.deletions))throw new TypeError("Invalid managed file summary.");return Object.freeze({path:t.path,additions:t.additions,deletions:t.deletions})})}function at(e){if(!Array.isArray(e)||e.length>k.maximumChecks)throw new TypeError("Invalid managed check summaries.");return e.map(t=>{if(!A(t)||!Se(t,["durationMs","id","outcome"],["exitCode"])||typeof t.id!="string"||!/^[A-Za-z0-9._-]{1,128}$/u.test(t.id)||!b(Qe,t.outcome)||!q(t.durationMs)||t.exitCode!==void 0&&!Number.isSafeInteger(t.exitCode))throw new TypeError("Invalid managed check summary.");return Object.freeze({id:t.id,outcome:t.outcome,durationMs:t.durationMs,...t.exitCode===void 0?{}:{exitCode:t.exitCode}})})}function it(e){let t=["preparing","agent","auditing","validating","applying","total"];if(!A(e)||!Se(e,[],t))throw new TypeError("Invalid managed timings.");for(let a of t)if(e[a]!==void 0&&!q(e[a]))throw new TypeError("Invalid managed timing.");return Object.freeze(Object.fromEntries(t.flatMap(a=>e[a]===void 0?[]:[[a,e[a]]])))}function Rt(e){if(!A(e)||!Se(e,["checks","deliveryStatus","executionStatus","files","managedPhase","revision","timings"],["resultExpiresAt","validationOutcome"])||!q(e.revision,1)||!b(We,e.deliveryStatus)||!b(Ye,e.executionStatus)||!b(Je,e.managedPhase)||e.validationOutcome!==void 0&&!b(Le,e.validationOutcome)||e.resultExpiresAt!==void 0&&!I(e.resultExpiresAt))throw new TypeError("Invalid managed task status.");return Object.freeze({revision:e.revision,deliveryStatus:e.deliveryStatus,executionStatus:e.executionStatus,managedPhase:e.managedPhase,...e.validationOutcome===void 0?{}:{validationOutcome:e.validationOutcome},files:rt(e.files),checks:at(e.checks),timings:it(e.timings),...e.resultExpiresAt===void 0?{}:{resultExpiresAt:e.resultExpiresAt}})}function ge(e){if(!A(e)||!Se(e,["adapter","authReadiness","connectionState","grantState","mode","schemaVersion","sequence","updatedAt"],["effectiveModel","error","requestedModel","task"])||e.schemaVersion!==1||!q(e.sequence)||!b(je,e.mode)||!b(ze,e.connectionState)||!b(qe,e.authReadiness)||!b(Ke,e.grantState)||!I(e.updatedAt)||e.requestedModel!==void 0&&(typeof e.requestedModel!="string"||e.requestedModel.length===0||e.requestedModel.length>128)||e.effectiveModel!==void 0&&(typeof e.effectiveModel!="string"||e.effectiveModel.length===0||e.effectiveModel.length>128)||!A(e.adapter)||!x(e.adapter,["availability","kind","maturity"])||e.adapter.kind!=="codex"||e.adapter.maturity!=="experimental"||e.adapter.availability!=="available"&&e.adapter.availability!=="unavailable")throw new TypeError("Invalid external Agent control status.");let t;if(e.error!==void 0){if(!A(e.error)||!x(e.error,["action","code","recoverability","stage"])||!b(Ze,e.error.code)||!b(et,e.error.stage)||!b(tt,e.error.recoverability)||!b(nt,e.error.action))throw new TypeError("Invalid external Agent error.");t=Object.freeze({code:e.error.code,stage:e.error.stage,recoverability:e.error.recoverability,action:e.error.action})}return Object.freeze({schemaVersion:1,sequence:e.sequence,mode:e.mode,adapter:Object.freeze({kind:"codex",maturity:"experimental",availability:e.adapter.availability}),connectionState:e.connectionState,authReadiness:e.authReadiness,grantState:e.grantState,...e.requestedModel===void 0?{}:{requestedModel:e.requestedModel},...e.effectiveModel===void 0?{}:{effectiveModel:e.effectiveModel},...e.task===void 0?{}:{task:Rt(e.task)},...t===void 0?{}:{error:t},updatedAt:e.updatedAt})}function bt(e){if(!A(e)||!x(e,["checks","diff","expiresAt","files","revision","timings","validationOutcome"])||!q(e.revision,1)||typeof e.diff!="string"||e.diff.length>k.maximumResultDiffBytes||!I(e.expiresAt)||!b(Le,e.validationOutcome))throw new TypeError("Invalid managed Agent result.");return Object.freeze({revision:e.revision,diff:e.diff,files:rt(e.files),checks:at(e.checks),timings:it(e.timings),validationOutcome:e.validationOutcome,expiresAt:e.expiresAt})}function Ct(e){if(!A(e)||typeof e.type!="string")throw new TypeError("Invalid external Agent event.");if(e.type==="status"&&x(e,["data","type"]))return Object.freeze({type:"status",data:ge(e.data)});if(e.type==="heartbeat"&&x(e,["emittedAt","sequence","type"])&&q(e.sequence)&&I(e.emittedAt))return Object.freeze({type:"heartbeat",sequence:e.sequence,emittedAt:e.emittedAt});throw new TypeError("Invalid external Agent event.")}function st(e,t){let a=async(s,g,o=ot)=>{let c=await e(s,{method:"POST",headers:{"Content-Type":"application/json",[ae]:t},body:JSON.stringify(g)}),i=await Ne(c,o);if(!c.ok)throw new TypeError("External Agent control request failed.");return ye(i)};return Object.freeze({async status(){return ge(await a(O.externalAgentControlStatus,{}))},async connect(s){return ge(await a(O.externalAgentControlConnect,s))},async disconnect(s){return ge(await a(O.externalAgentControlDisconnect,s))},async cancel(s){return ge(await a(O.externalAgentControlCancel,s))},async result(s){return bt(await a(O.externalAgentResult,{revision:s},k.maximumResultDiffBytes+ot))},async events(s,g,o){let c=await e(O.externalAgentEvents,{method:"POST",headers:{"Content-Type":"application/json",[ae]:t},body:JSON.stringify(s===void 0?{}:{afterSequence:s}),signal:g});if(!c.ok||c.body===null)throw await c.body?.cancel(),new TypeError("External Agent event stream is unavailable.");let i=c.body.getReader(),E=new Uint8Array(0);try{for(;;){let r=await i.read();if(r.done)break;let C=new Uint8Array(E.byteLength+r.value.byteLength);for(C.set(E),C.set(r.value,E.byteLength),E=C;;){let f=E.indexOf(10);if(f===-1)break;if(f===0||f>k.maximumEventLineBytes)throw new TypeError("External Agent event line is invalid.");let y=E.slice(0,f);E=E.slice(f+1);let L=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(y));o(Ct(L))}if(E.byteLength>k.maximumEventLineBytes)throw new TypeError("External Agent event line exceeds its limit.")}if(E.byteLength!==0)throw new TypeError("External Agent event stream ended mid-record.")}finally{i.releaseLock()}}})}var Ot=64*1024,ct=/^[A-Za-z0-9_-]{22,128}$/u,_=class extends Error{constructor(a){super("SpotPatch external handoff API request failed.");this.code=a;this.name="ExternalHandoffApiError"}code};function ve(e){if(e===null)return null;if(!A(e)||!x(e,["canDispatch","connectedAt","kind","state","updatedAt"])||e.kind!=="claude-channel"&&e.kind!=="codex-app-server"||e.state!=="ready"&&e.state!=="busy"&&e.state!=="blocked"||typeof e.canDispatch!="boolean"||e.canDispatch!==(e.state==="ready")||!I(e.connectedAt)||!I(e.updatedAt))throw new _;return Object.freeze({kind:e.kind,state:e.state,canDispatch:e.canDispatch,connectedAt:e.connectedAt,updatedAt:e.updatedAt})}function we(e){if(e===null)return null;if(!A(e))throw new _;if(!x(e,["adapterKind","phase","revision","updatedAt"])||e.adapterKind!=="claude-channel"&&e.adapterKind!=="codex-app-server"||!Number.isSafeInteger(e.revision)||e.revision<=0||e.phase!=="queued"&&e.phase!=="dispatching"&&e.phase!=="dispatched"&&e.phase!=="working"&&e.phase!=="completed"&&e.phase!=="failed"&&e.phase!=="delivery-unknown"||!I(e.updatedAt))throw new _;return Object.freeze({adapterKind:e.adapterKind,revision:e.revision,phase:e.phase,updatedAt:e.updatedAt})}function Lt(e){if(!A(e)||!x(e,["activeAdapter","activeWaitCount","brokerProtocolVersion","brokerReady","dispatch","enabled","snapshotSchemaVersion"])||e.enabled!==!0||typeof e.brokerReady!="boolean"||!Number.isSafeInteger(e.activeWaitCount)||e.activeWaitCount<0||e.activeWaitCount>Ae.maximumWaiters||e.snapshotSchemaVersion!==1||e.brokerProtocolVersion!==2)throw new _;return Object.freeze({enabled:!0,brokerReady:e.brokerReady,activeWaitCount:e.activeWaitCount,activeAdapter:ve(e.activeAdapter),dispatch:we(e.dispatch),snapshotSchemaVersion:1,brokerProtocolVersion:2})}function vt(e){if(!A(e)||!x(e,["delivery","handoff","replayed"])||typeof e.replayed!="boolean"||!A(e.delivery))throw new _;let t=ut(e.handoff);if(e.delivery.mode==="inbox"){if(!x(e.delivery,["mode"]))throw new _;return Object.freeze({handoff:t,delivery:Object.freeze({mode:"inbox"}),replayed:e.replayed})}if(e.delivery.mode!=="active"||!x(e.delivery,["adapter","dispatch","mode"]))throw new _;let a=ve(e.delivery.adapter),s=we(e.delivery.dispatch);if(a===null||s?.revision!==t.revision)throw new _;return Object.freeze({handoff:t,delivery:Object.freeze({mode:"active",adapter:a,dispatch:s}),replayed:e.replayed})}function pt(e){if(!A(e)||!x(e,["activeAdapter","dispatch","handoff"]))throw new _;let t=ut(e.handoff),a=we(e.dispatch);if(a!==null&&a.revision!==t.revision)throw new _;return Object.freeze({handoff:t,activeAdapter:ve(e.activeAdapter),dispatch:a})}function ut(e){if(!A(e))throw new _;let t=["cursor","expiresAt","framework","page","pickupCount","publishedAt","revision","sessionId","state","targetCount",...e.pickedUpAt===void 0?[]:["pickedUpAt"]];if(!x(e,t)||typeof e.sessionId!="string"||!ct.test(e.sessionId)||e.framework!=="vite"&&e.framework!=="next"||!Number.isSafeInteger(e.revision)||e.revision<=0||typeof e.cursor!="string"||!ct.test(e.cursor)||!Number.isSafeInteger(e.targetCount)||e.targetCount<=0||!A(e.page)||!x(e.page,["origin","pathname"])||typeof e.page.origin!="string"||typeof e.page.pathname!="string"||!I(e.publishedAt)||!I(e.expiresAt)||e.state!=="available"&&e.state!=="expired"&&e.state!=="superseded"||!Number.isSafeInteger(e.pickupCount)||e.pickupCount<0||e.pickupCount>Ae.maximumConnectorReceipts||e.pickedUpAt!==void 0&&!I(e.pickedUpAt))throw new _;return Object.freeze({sessionId:e.sessionId,framework:e.framework,revision:e.revision,cursor:e.cursor,targetCount:e.targetCount,page:Object.freeze({origin:e.page.origin,pathname:e.page.pathname}),publishedAt:e.publishedAt,expiresAt:e.expiresAt,state:e.state,pickupCount:e.pickupCount,...e.pickedUpAt===void 0?{}:{pickedUpAt:e.pickedUpAt}})}function wt(e){return A(e)&&e.ok===!1&&A(e.error)&&$e(e.error.code)?e.error.code:void 0}function Dt(e){return{...e,targets:e.targets.map(t=>({instruction:t.instruction,...t.page===void 0?{}:{page:t.page},source:t.source,react:t.react,element:t.element,styles:t.styles,warnings:t.warnings}))}}function xe(e){let t=new Uint8Array(24);return e.crypto.getRandomValues(t),Array.from(t,a=>a.toString(16).padStart(2,"0")).join("")}function It(e){return e!==null&&e.phase!=="completed"&&e.phase!=="failed"&&e.phase!=="delivery-unknown"}function kt(e){let t=new Set,a=async(s,g)=>{let o=new AbortController;t.add(o);try{let c=await e.fetch(s,{method:"POST",headers:{"Content-Type":"application/json",[ae]:e.sessionToken},body:JSON.stringify(g),signal:o.signal}),i;try{i=await Ne(c,Ot)}catch{throw new _}if(!c.ok)throw new _(wt(i));try{return ye(i)}catch{throw new _}}finally{t.delete(o)}};return Object.freeze({cancel(){for(let s of t)s.abort();t.clear()},async capability(){return Lt(await a(O.externalHandoffCapability,{}))},async publish(s,g){return vt(await a(O.externalHandoffPublish,{annotation:Dt(g),requestId:s}))},async status(s){return pt(await a(O.externalHandoffStatus,s===void 0?{}:{cursor:s}))},async resolveDelivery(s){return pt(await a(O.externalHandoffResolveDelivery,{confirmation:"workspace-reviewed",cursor:s}))}})}function De(e,t,a,s,g){let o={fetch:e,panel:t,selectedAnnotation:a,sessionToken:s,window:g},c=kt(o),i=st(e,s),E=new Set,r={disposed:!1,mounted:!1,operation:0,userActionPending:!1},C,f,y,L=k.eventReconnectMinimumMs,X,Z=!1,K,R,m,v,W=()=>r.disposed,$=()=>{for(let d of E)o.window.clearTimeout(d);E.clear()},P=()=>{X!==void 0&&(o.window.clearTimeout(X),X=void 0)},ee=async d=>{if(!(r.disposed||K===d||R===d)){R=d;try{let l=await i.result(d);if(W()||f?.task?.revision!==d)return;K=d,o.panel.renderManagedResult(l)}catch{}finally{R===d&&(R=void 0)}}},te=d=>{if(f!==void 0&&d.sequence<f.sequence)return;f=d,L=k.eventReconnectMinimumMs,o.panel.renderControlStatus(d);let l=d.task?.resultExpiresAt===void 0?void 0:d.task.revision;l!==void 0&&ee(l)},Y=d=>{if(d.type==="status"){te(d.data);return}let l=f?.task?.resultExpiresAt===void 0?void 0:f.task.revision;l!==void 0&&ee(l)},ne=()=>{if(r.disposed||!r.mounted||y!==void 0)return;P();let d=new AbortController;y=d,i.events(f?.sequence,d.signal,Y).catch(l=>{r.disposed||l instanceof DOMException&&l.name==="AbortError"||f===void 0&&o.panel.renderControlUnavailable()}).finally(()=>{if(y===d&&(y=void 0),r.disposed||!r.mounted)return;let l=L;L=Math.min(l*2,k.eventReconnectMaximumMs),X=o.window.setTimeout(()=>{X=void 0,ne()},l)})},h=async()=>{te(await i.status())},ie=async()=>{try{await h()}catch{r.disposed||o.panel.renderControlUnavailable()}finally{r.disposed||ne()}},J=async d=>{if(!(r.disposed||Z)){Z=!0,o.panel.setControlBusy(!0);try{te(await d())}catch{try{await h()}catch{W()||o.panel.renderControlUnavailable()}}finally{Z=!1,W()||o.panel.setControlBusy(!1)}}},se=()=>{J(()=>i.connect({requestId:xe(o.window),adapterKind:"codex",profile:Ve}))},de=()=>{J(()=>i.disconnect({requestId:xe(o.window),adapterKind:"codex",revokeGrant:!1}))},oe=()=>{J(()=>i.disconnect({requestId:xe(o.window),adapterKind:"codex",revokeGrant:!0}))},w=()=>{let d=f?.task?.revision;d!==void 0&&J(()=>i.cancel({requestId:xe(o.window),revision:d}))},V=d=>d instanceof _?d.code:void 0,Q=()=>{m!==void 0?o.panel.renderStatus(m):C!==void 0&&o.panel.renderCapability(C)},H=async d=>{try{let l=await c.capability();if(r.disposed||d!==r.operation)return;if(C=l,o.panel.renderCapability(l),l.dispatch!==null){let p=await c.status();if(d!==r.operation)return;m=p,o.panel.renderStatus(p)}}catch(l){if(r.disposed||d!==r.operation||l instanceof DOMException&&l.name==="AbortError")return;o.panel.renderError(V(l))}},j=async d=>{if(m===void 0){await H(d);return}try{let l=await c.status(m.handoff.cursor);if(r.disposed||d!==r.operation)return;m=l,o.panel.renderStatus(l)}catch(l){if(r.disposed||d!==r.operation||l instanceof DOMException&&l.name==="AbortError")return;o.panel.renderError(V(l))}},F=(d,l)=>{let p=r.operation,S=o.window.setTimeout(()=>{E.delete(S),j(p).then(()=>{l&&!r.disposed&&p===r.operation&&!r.userActionPending&&m!==void 0&&It(m.dispatch)&&F(Ae.activeStatusPollMs,l)})},d);E.add(S)},M=async()=>{if(r.userActionPending)return;r.userActionPending=!0;let d=v;if(d===void 0){let p=o.selectedAnnotation();if(p===void 0){r.userActionPending=!1,o.panel.renderError(Oe.HANDOFF_VALIDATION_FAILED);return}let S=r.operation;if(o.panel.setBusy(!0),!await o.panel.confirmDisclosure(p)||S!==r.operation){r.userActionPending=!1,o.panel.setBusy(!1);return}d=Object.freeze({annotation:p,requestId:xe(o.window)})}v=d,r.operation+=1;let l=r.operation;$(),c.cancel(),o.panel.renderPublishing();try{let p=await c.publish(d.requestId,d.annotation);if(l!==r.operation)return;v=void 0,m=Object.freeze({handoff:p.handoff,activeAdapter:p.delivery.mode==="active"?p.delivery.adapter:null,dispatch:p.delivery.mode==="active"?p.delivery.dispatch:null}),o.panel.renderPublishResult(p),F(p.delivery.mode==="active"?Ae.activeStatusPollMs:500,p.delivery.mode==="active")}catch(p){if(l!==r.operation||p instanceof DOMException&&p.name==="AbortError")return;let S=V(p),re=S===void 0;re||(v=void 0),o.panel.renderError(S,re)}finally{l===r.operation&&(r.userActionPending=!1,o.panel.setBusy(!1))}},he=async()=>{if(r.userActionPending)return;r.userActionPending=!0,r.operation+=1;let d=r.operation;$(),c.cancel(),o.panel.setBusy(!0);try{await j(d)}finally{!r.disposed&&d===r.operation&&(r.userActionPending=!1,o.panel.setBusy(!1))}},le=async()=>{if(r.userActionPending||m===void 0||m.dispatch?.phase!=="delivery-unknown")return;r.userActionPending=!0,r.operation+=1;let d=r.operation;$(),c.cancel(),o.panel.setBusy(!0);try{let l=await c.resolveDelivery(m.handoff.cursor);if(r.disposed||d!==r.operation)return;m=l,o.panel.renderStatus(l)}catch(l){if(r.disposed||d!==r.operation||l instanceof DOMException&&l.name==="AbortError")return;o.panel.renderError(V(l))}finally{!r.disposed&&d===r.operation&&(r.userActionPending=!1,o.panel.setBusy(!1))}},ce=()=>{M()},U=()=>{he()},z=()=>{le()};return Object.freeze({mount(){r.mounted||r.disposed||(r.mounted=!0,o.panel.sendButton.addEventListener("click",ce),o.panel.refreshButton.addEventListener("click",U),o.panel.resolveButton.addEventListener("click",z),o.panel.connectButton.addEventListener("click",se),o.panel.disconnectButton.addEventListener("click",de),o.panel.revokeButton.addEventListener("click",oe),o.panel.cancelManagedButton.addEventListener("click",w),H(r.operation),ie())},cancelPending:()=>{r.operation+=1,r.userActionPending=!1,v=void 0,$(),c.cancel(),Q(),C===void 0&&r.mounted&&!r.disposed&&H(r.operation)},dispose(){r.disposed||(r.disposed=!0,r.operation+=1,r.userActionPending=!1,v=void 0,$(),P(),y?.abort("workflow-disposed"),y=void 0,c.cancel(),o.panel.sendButton.removeEventListener("click",ce),o.panel.refreshButton.removeEventListener("click",U),o.panel.resolveButton.removeEventListener("click",z),o.panel.connectButton.removeEventListener("click",se),o.panel.disconnectButton.removeEventListener("click",de),o.panel.revokeButton.removeEventListener("click",oe),o.panel.cancelManagedButton.removeEventListener("click",w))}})}var Et="data-spotpatch-ui",Wt=Object.freeze({highlight:2147483646,controls:2147483647});function u(e,t){let a=e.createElement(t);return a.setAttribute(Et,""),a}function G(e,t,a=""){let s=u(e,"button");return s.type="button",s.className=a,s.textContent=t,s}var ft=Object.freeze({"en-US":Object.freeze({title:"External Agent connection",agentLabel:"Agent",codexManaged:"Codex · managed (experimental)",connectManaged:"Connect Codex",disconnectManaged:"Disconnect",revokeManaged:"Revoke grant",cancelManaged:"Cancel managed task",resultTitle:"Managed result",controlConnection:(e,t)=>`Connection: ${e} · Mode: ${t}`,controlAuth:(e,t)=>`Auth: ${e} · Grant: ${t}`,controlModel:e=>`Model: ${e}`,controlRevision:e=>`Revision ${String(e.revision)}: ${e.deliveryStatus} / ${e.executionStatus} / ${e.managedPhase}`,controlValidation:e=>`Validation: ${e}`,controlFailure:(e,t)=>`Error: ${e} · Next: ${t}`,controlUnavailable:"Page connection management is unavailable; external handoffs still fall back honestly to the Agent inbox.",controlErrorText:Object.freeze({AGENT_BINARY_NOT_FOUND:"Codex is not installed or is not on PATH.",AGENT_BINARY_UNTRUSTED:"The resolved Codex executable is not trusted.",AGENT_VERSION_UNSUPPORTED:"The installed Codex version is unsupported.",APP_SERVER_HANDSHAKE_FAILED:"Codex App Server did not complete startup.",AGENT_AUTH_REQUIRED:"Codex requires an authenticated account.",AGENT_MODEL_UNAVAILABLE:"The configured Codex model is unavailable.",AGENT_PROTOCOL_INCOMPATIBLE:"The Codex App Server protocol is incompatible.",CODEX_CONFIG_ISOLATION_UNSUPPORTED:"This Codex version cannot prove managed configuration isolation.",MANAGED_GRANT_INVALID:"The saved project grant failed validation.",MANAGED_PLATFORM_UNSUPPORTED:"Managed execution is not proven safe on this platform.",MANAGED_GIT_REQUIRED:"Managed execution requires a Git repository.",MANAGED_SNAPSHOT_FAILED:"The independent workspace snapshot could not be created.",MANAGED_SCOPE_VIOLATION:"The candidate change exceeded its authorized paths.",MANAGED_CHANGE_LIMIT_EXCEEDED:"The candidate change exceeded safety limits.",MANAGED_VALIDATION_FAILED:"A required check failed or changed the candidate diff.",MANAGED_WORKSPACE_CONFLICT:"An authorized source file changed during execution.",MANAGED_APPLY_FAILED:"The audited change could not be applied safely.",MANAGED_CLEANUP_INCOMPLETE:"Managed thread or workspace cleanup is incomplete."}),controlActionText:Object.freeze({"install-agent":"Install Codex and retry.","use-supported-version":"Use a supported Codex version.","sign-in":"Sign in with Codex, then retry.","choose-available-model":"Choose an available model in Codex configuration.","use-inbox":"Continue with the Agent inbox fallback.","confirm-managed-access":"Revoke the invalid grant and confirm access again.","review-candidate-diff":"Review the candidate diff and validation output.","review-workspace-conflict":"Review the workspace changes before retrying.",retry:"Retry the managed connection.","inspect-cleanup-warning":"Inspect cleanup status before reconnecting."}),resultHeader:(e,t)=>`Revision ${String(e)} · Validation ${t}`,resultDisposition:e=>e==="passed"?"Applied to the project after validation passed.":`Candidate only; it was not applied because validation is ${e}.`,resultTiming:(e,t)=>`Timing ${e}: ${String(t)} ms`,description:"Send through a ready active adapter, or publish to the project Agent inbox when no active adapter is connected.",ready:"Local Broker ready. No Agent connection is assumed until a connector reads or waits.",readyWaiting:e=>`${String(e)} active connector wait request(s); publishing can wake them immediately.`,activeReady:e=>`${e} is connected and idle. The next send will dispatch immediately.`,publishing:"Authorizing current source and publishing the handoff…",published:(e,t)=>`Revision ${String(e)} is available until ${t}. It has not been claimed as edited.`,queued:(e,t)=>`Revision ${String(t)} is reserved for ${e}.`,dispatching:(e,t)=>`Dispatching revision ${String(t)} to ${e}…`,dispatched:(e,t)=>e==="Claude Code"?`Revision ${String(t)} was written to the Claude Channel transport; there is no model ACK yet.`:`Codex App Server accepted revision ${String(t)}; waiting for the matching turn to start.`,working:(e,t)=>`${e} is working on revision ${String(t)}.`,completed:(e,t)=>`${e} ended revision ${String(t)} normally. Review the diff and checks; this does not prove the requested change is correct.`,failed:(e,t)=>`${e} reported revision ${String(t)} as failed. The connector is idle again.`,unknown:(e,t)=>`Delivery of revision ${String(t)} to ${e} is uncertain. The managed writer stopped; review the workspace before allowing another task.`,unknownResolved:(e,t)=>`Revision ${String(t)} for ${e} remains delivery-unknown, but the workspace review was confirmed. A new connector or inbox task may now be used.`,pickedUp:(e,t,a)=>`Revision ${String(e)} was picked up by ${String(t)} connector instance(s)${a===void 0?".":`; last pickup ${a}.`} This does not prove a code change.`,expired:e=>`Revision ${String(e)} expired. Review the current selection and publish again.`,superseded:e=>`Revision ${String(e)} was superseded by a newer handoff.`,send:"Send to Agent",inboxSend:"Publish to Agent inbox",retry:"Retry same send",refresh:"Refresh pickup status",resolveUnknown:"Workspace reviewed — allow a new task",settingsTitle:"Project connection setup",settingsHelp:"Codex managed mode is owned by the current development server. The browser never receives vendor credentials or arbitrary command access. Generic and attached adapters remain honest Inbox fallbacks.",disclosureTitle:"Confirm external Agent handoff",disclosureIntro:(e,t)=>`Publish ${String(e)} selected target(s) referencing ${String(t)} relative file(s).`,disclosureData:"The handoff includes your instructions, component/page context, sanitized DOM/CSS, and bounded source read again by the local Node service.",disclosureInbox:"Any SpotPatch connector configured for this project may read it during the 15-minute lifetime.",disclosureProvider:"The Agent host may send the content to its cloud provider under that product's data policy.",disclosureNoGuarantee:"External edits do not receive SpotPatch's built-in worktree, Apply, or Revert guarantees.",disclosureManagedGuarantee:"Managed Codex edits run in an independent temporary snapshot. SpotPatch audits the diff and only applies it when every trusted required check passes.",cancel:"Cancel",confirm:"Confirm and send",error:e=>e==="EXTERNAL_AGENT_BUSY"?"The active Agent is still busy or blocked by an uncertain delivery.":e==="ACTIVE_DISPATCH_INVALID"?"The active delivery state changed. Refresh before continuing.":e==="HANDOFF_SOURCE_STALE"?"The selected source changed. Select the current component again.":e==="HANDOFF_RESPONSE_TOO_LARGE"?"The handoff is too large. Reduce the selected context.":e==="EXTERNAL_HANDOFF_DISABLED"?"External Agent handoff is disabled in trusted project configuration.":e==="EXTERNAL_HANDOFF_UNAVAILABLE"||e==="SESSION_CLOSED"?"The local external Agent Broker is unavailable. Restart the development server.":"The external Agent handoff request failed without publishing a partial revision."}),"zh-CN":Object.freeze({title:"外部 Agent 连接",agentLabel:"Agent",codexManaged:"Codex · 受管模式(实验性)",connectManaged:"连接 Codex",disconnectManaged:"断开连接",revokeManaged:"撤销授权",cancelManaged:"取消受管任务",resultTitle:"受管执行结果",controlConnection:(e,t)=>`连接:${e} · 模式:${t}`,controlAuth:(e,t)=>`认证:${e} · 授权:${t}`,controlModel:e=>`模型:${e}`,controlRevision:e=>`revision ${String(e.revision)}:${e.deliveryStatus} / ${e.executionStatus} / ${e.managedPhase}`,controlValidation:e=>`验证:${e}`,controlFailure:(e,t)=>`错误:${e} · 下一步:${t}`,controlUnavailable:"页面连接管理不可用;外部交接仍会按真实能力降级为 Agent 收件箱。",controlErrorText:Object.freeze({AGENT_BINARY_NOT_FOUND:"未安装 Codex,或 Codex 不在 PATH 中。",AGENT_BINARY_UNTRUSTED:"解析到的 Codex 可执行文件不可信。",AGENT_VERSION_UNSUPPORTED:"已安装的 Codex 版本不受支持。",APP_SERVER_HANDSHAKE_FAILED:"Codex App Server 未完成启动握手。",AGENT_AUTH_REQUIRED:"Codex 需要已登录的账户。",AGENT_MODEL_UNAVAILABLE:"Codex 配置的模型当前不可用。",AGENT_PROTOCOL_INCOMPATIBLE:"Codex App Server 协议不兼容。",CODEX_CONFIG_ISOLATION_UNSUPPORTED:"当前 Codex 版本无法证明受管配置隔离。",MANAGED_GRANT_INVALID:"保存的项目授权未通过校验。",MANAGED_PLATFORM_UNSUPPORTED:"当前平台尚未证明可安全运行受管执行。",MANAGED_GIT_REQUIRED:"受管执行要求项目位于 Git 仓库中。",MANAGED_SNAPSHOT_FAILED:"无法创建独立工作区快照。",MANAGED_SCOPE_VIOLATION:"候选修改超出授权路径。",MANAGED_CHANGE_LIMIT_EXCEEDED:"候选修改超过安全上限。",MANAGED_VALIDATION_FAILED:"required check 失败或改变了候选 diff。",MANAGED_WORKSPACE_CONFLICT:"执行期间授权源码发生了变化。",MANAGED_APPLY_FAILED:"已审计修改无法安全写入。",MANAGED_CLEANUP_INCOMPLETE:"受管 thread 或工作区清理不完整。"}),controlActionText:Object.freeze({"install-agent":"安装 Codex 后重试。","use-supported-version":"改用受支持的 Codex 版本。","sign-in":"登录 Codex 后重试。","choose-available-model":"在 Codex 配置中选择可用模型。","use-inbox":"继续使用 Agent 收件箱降级路径。","confirm-managed-access":"撤销无效授权并重新确认。","review-candidate-diff":"检查候选 diff 和验证输出。","review-workspace-conflict":"检查工作区变化后再重试。",retry:"重试受管连接。","inspect-cleanup-warning":"确认清理状态后再连接。"}),resultHeader:(e,t)=>`revision ${String(e)} · 验证 ${t}`,resultDisposition:e=>e==="passed"?"验证通过,修改已写入项目。":`这只是候选 diff;验证状态为 ${e},因此没有写入项目。`,resultTiming:(e,t)=>`耗时 ${e}: ${String(t)} ms`,description:"有主动适配器就立即派发;未连接主动适配器时,诚实降级为项目 Agent 收件箱。",ready:"本地 Broker 已就绪。只有连接器读取或等待后,才能证明发生过连接。",readyWaiting:e=>`当前有 ${String(e)} 个连接器等待请求,发布后可立即唤醒。`,activeReady:e=>`${e} 已连接并处于空闲状态,下次发送会立即派发。`,publishing:"正在重新授权当前源码并发布交接……",published:(e,t)=>`交接 revision ${String(e)} 可读取至 ${t};这不表示代码已被修改。`,queued:(e,t)=>`交接 revision ${String(t)} 已为 ${e} 预留。`,dispatching:(e,t)=>`正在把 revision ${String(t)} 派发给 ${e}……`,dispatched:(e,t)=>e==="Claude Code"?`revision ${String(t)} 已写入 Claude Channel transport;当前没有模型 ACK。`:`Codex App Server 已接受 revision ${String(t)},正在等待匹配 turn 启动。`,working:(e,t)=>`${e} 正在处理 revision ${String(t)}。`,completed:(e,t)=>`${e} 已正常结束 revision ${String(t)}。请核对 diff 和检查结果;这不证明修改要求已经正确完成。`,failed:(e,t)=>`${e} 已将 revision ${String(t)} 报告为失败,连接器已恢复空闲。`,unknown:(e,t)=>`revision ${String(t)} 向 ${e} 的投递结果不确定。受管 writer 已停止,请先核对工作区再允许新任务。`,unknownResolved:(e,t)=>`${e} 的 revision ${String(t)} 仍记为投递未知,但工作区核对已经确认;现在可以重新连接或发布新的收件箱任务。`,pickedUp:(e,t,a)=>`交接 revision ${String(e)} 已被 ${String(t)} 个连接器实例取走${a===void 0?"。":`,最近取件于 ${a}。`}这不能证明代码已经修改。`,expired:e=>`交接 revision ${String(e)} 已过期,请核对当前选择后重新发布。`,superseded:e=>`交接 revision ${String(e)} 已被更新版本取代。`,send:"发送给 Agent",inboxSend:"发布到 Agent 收件箱",retry:"重试同一次发送",refresh:"刷新取件状态",resolveUnknown:"已核对工作区,允许新任务",settingsTitle:"项目连接设置",settingsHelp:"Codex 受管模式由当前开发服务托管,浏览器不会获得厂商凭证或任意命令权限;通用与 attached adapter 仍按真实能力降级为收件箱。",disclosureTitle:"确认发布到外部 Agent",disclosureIntro:(e,t)=>`将发布 ${String(e)} 个目标,涉及 ${String(t)} 个项目相对文件。`,disclosureData:"交接包含修改说明、组件与页面上下文、已清洗的 DOM/CSS,以及本地 Node 服务重新读取的有界源码。",disclosureInbox:"15 分钟有效期内,本项目中任何已配置的 SpotPatch Connector 都可能读取。",disclosureProvider:"Agent 宿主可能依据其产品数据策略,将内容发送给云端模型服务。",disclosureNoGuarantee:"外部修改不具备 SpotPatch 内建 Agent 的 worktree、Apply 或 Revert 保证。",disclosureManagedGuarantee:"受管 Codex 只写独立临时快照。SpotPatch 会审计 diff,且仅在所有可信 required checks 通过后才写入业务仓库。",cancel:"取消",confirm:"确认并发送",error:e=>e==="EXTERNAL_AGENT_BUSY"?"主动 Agent 仍在工作,或存在尚未核对的投递未知状态。":e==="ACTIVE_DISPATCH_INVALID"?"主动投递状态已经变化,请刷新后再继续。":e==="HANDOFF_SOURCE_STALE"?"选中源码已经变化,请重新选择当前组件。":e==="HANDOFF_RESPONSE_TOO_LARGE"?"交接内容超过上限,请减少所选上下文。":e==="EXTERNAL_HANDOFF_DISABLED"?"可信项目配置没有启用外部 Agent 交接。":e==="EXTERNAL_HANDOFF_UNAVAILABLE"||e==="SESSION_CLOSED"?"本地外部 Agent Broker 不可用,请重启开发服务。":"外部 Agent 交接请求失败,未发布任何部分 revision。"})});function Pt(e){let t=e.createElement("style");return t.textContent=`
|
|
2
|
+
.spotpatch-external-handoff { margin-top: 12px; padding: 12px; border: 1px solid var(--spotpatch-border); border-radius: var(--spotpatch-radius-card); background: rgb(82 168 255 / 5%); }
|
|
3
|
+
.spotpatch-external-handoff[hidden] { display: none; }
|
|
4
|
+
.spotpatch-external-heading { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
|
|
5
|
+
.spotpatch-external-heading strong { font-size: 12px; font-weight: 680; color: var(--spotpatch-text); }
|
|
6
|
+
.spotpatch-external-description, .spotpatch-external-status, .spotpatch-external-settings p { margin: 6px 0 0; font-size: 11px; line-height: 1.5; color: var(--spotpatch-text-secondary); }
|
|
7
|
+
.spotpatch-external-status { padding-left: 10px; border-left: 2px solid var(--spotpatch-accent-cyan); color: #cbd5e1; }
|
|
8
|
+
.spotpatch-external-status[data-state="error"] { border-color: var(--spotpatch-danger); color: #fecdd3; }
|
|
9
|
+
.spotpatch-external-status[data-state="picked-up"] { border-color: var(--spotpatch-success); color: #a7f3d0; }
|
|
10
|
+
.spotpatch-external-control { margin-top: 9px; padding: 9px; border: 1px solid var(--spotpatch-border); border-radius: 8px; background: rgb(3 7 18 / 28%); }
|
|
11
|
+
.spotpatch-external-control label { display: grid; gap: 4px; color: var(--spotpatch-text-secondary); font-size: 10px; }
|
|
12
|
+
.spotpatch-external-control select { width: 100%; padding: 6px 8px; border: 1px solid var(--spotpatch-border); border-radius: 6px; background: var(--spotpatch-bg-input); color: var(--spotpatch-text); font: inherit; }
|
|
13
|
+
.spotpatch-external-control-status { margin: 7px 0 0; color: #cbd5e1; font-size: 10.5px; line-height: 1.5; white-space: pre-wrap; }
|
|
14
|
+
.spotpatch-external-control-actions { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
|
|
15
|
+
.spotpatch-external-control-actions button { padding: 5px 8px; border: 1px solid var(--spotpatch-border); border-radius: 6px; background: var(--spotpatch-bg-active); color: var(--spotpatch-text); font: inherit; font-size: 10px; cursor: pointer; }
|
|
16
|
+
.spotpatch-external-control-actions button:disabled { cursor: default; opacity: .45; }
|
|
17
|
+
.spotpatch-external-result { margin-top: 8px; color: var(--spotpatch-text-secondary); font-size: 10px; }
|
|
18
|
+
.spotpatch-external-result pre { max-height: 180px; overflow: auto; margin: 6px 0 0; padding: 7px; border-radius: 6px; background: var(--spotpatch-bg-input); color: #d8d6ff; font: 9px/1.45 ui-monospace, SFMono-Regular, Menlo, monospace; white-space: pre; }
|
|
19
|
+
.spotpatch-external-settings { margin-top: 9px; }
|
|
20
|
+
.spotpatch-external-settings summary { cursor: pointer; color: #c4b5fd; font-size: 11px; }
|
|
21
|
+
.spotpatch-external-refresh { padding: 3px 7px; border: 1px solid var(--spotpatch-border); border-radius: 6px; background: transparent; color: var(--spotpatch-text-secondary); font: inherit; font-size: 10px; cursor: pointer; }
|
|
22
|
+
.spotpatch-external-refresh:disabled { cursor: default; opacity: .45; }
|
|
23
|
+
.spotpatch-external-resolve { margin-top: 8px; padding: 6px 8px; border: 1px solid #f59e0b; border-radius: 6px; background: rgb(245 158 11 / 10%); color: #fde68a; font: inherit; font-size: 10px; cursor: pointer; }
|
|
24
|
+
.spotpatch-external-resolve[hidden] { display: none; }
|
|
25
|
+
.spotpatch-external-resolve:disabled { cursor: default; opacity: .45; }
|
|
26
|
+
.spotpatch-external-disclosure { position: fixed; inset: 0; z-index: 4; display: grid; place-items: center; padding: 20px; background: rgb(3 3 8 / 72%); backdrop-filter: blur(3px); }
|
|
27
|
+
.spotpatch-external-disclosure[hidden] { display: none; }
|
|
28
|
+
.spotpatch-external-disclosure-card { width: min(420px, calc(100vw - 40px)); max-height: calc(100vh - 40px); overflow: auto; padding: 18px; border: 1px solid rgb(139 123 255 / 55%); border-radius: 14px; background: var(--spotpatch-bg-raised); box-shadow: var(--spotpatch-shadow-panel); }
|
|
29
|
+
.spotpatch-external-disclosure-card h3 { margin: 0; color: var(--spotpatch-text); font-size: 15px; }
|
|
30
|
+
.spotpatch-external-disclosure-card p { margin: 9px 0 0; color: #c4c7d0; font-size: 11.5px; line-height: 1.55; }
|
|
31
|
+
.spotpatch-external-files { max-height: 96px; overflow: auto; color: #a5b4fc; font: 10px/1.5 ui-monospace, SFMono-Regular, Menlo, monospace; white-space: pre-wrap; }
|
|
32
|
+
.spotpatch-external-disclosure-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 15px; }
|
|
33
|
+
.spotpatch-external-disclosure-actions button { padding: 7px 10px; border: 1px solid var(--spotpatch-border); border-radius: 7px; background: var(--spotpatch-bg-active); color: var(--spotpatch-text); font: inherit; cursor: pointer; }
|
|
34
|
+
.spotpatch-external-disclosure-actions .spotpatch-primary { border-color: transparent; background: var(--spotpatch-accent); color: var(--spotpatch-text-on-accent); }
|
|
35
|
+
`,t}function At(e,t){let a=new Date(e);return Number.isNaN(a.valueOf())?e:new Intl.DateTimeFormat(t,{hour:"2-digit",minute:"2-digit",second:"2-digit"}).format(a)}function Ie(e){return e==="claude-channel"?"Claude Code":"Codex"}function gt(e,t){let a=Ie(t.adapterKind);return t.phase==="queued"?e.queued(a,t.revision):t.phase==="dispatching"?e.dispatching(a,t.revision):t.phase==="dispatched"?e.dispatched(a,t.revision):t.phase==="working"?e.working(a,t.revision):t.phase==="completed"?e.completed(a,t.revision):t.phase==="failed"?e.failed(a,t.revision):e.unknown(a,t.revision)}function Mt(e){return Object.freeze([...new Set(e.targets.flatMap(t=>{let a=t.code?.relativePath??t.source.relativePath;return a===void 0?[]:[a]}))])}function xt(e,t){let a=e.effectiveModel??e.requestedModel,s=e.task;return[t.controlConnection(e.connectionState,e.mode),t.controlAuth(e.authReadiness,e.grantState),...a===void 0?[]:[t.controlModel(a)],...s===void 0?[]:[t.controlRevision(s),...s.validationOutcome===void 0?[]:[t.controlValidation(s.validationOutcome)]],...e.error===void 0?[]:[t.controlFailure(t.controlErrorText[e.error.code],t.controlActionText[e.error.action])]].join(`
|
|
36
|
+
`)}function ht(e,t){let a=e.files.map(o=>`${o.path} +${String(o.additions)} -${String(o.deletions)}`),s=e.checks.map(o=>`${o.id}: ${o.outcome} (${String(o.durationMs)} ms${o.exitCode===void 0?"":`, exit ${String(o.exitCode)}`})`),g=Object.entries(e.timings).flatMap(([o,c])=>c===void 0?[]:[t.resultTiming(o,c)]);return[t.resultHeader(e.revision,e.validationOutcome),t.resultDisposition(e.validationOutcome),...a,...s,...g].join(`
|
|
37
|
+
`)}function ke(e,t,a,s,g,o){let c={document:e,framework:t,locale:a,onViewChange:o,sessionId:s,subscribeLocale:g},i=ft[c.locale()],E=null,r=!1,C=!1,f=!1,y=!1,L=!1,X=!1,Z=!1,K=!1,R,m,v,W,$=`spotpatch:external-handoff-consent:${c.sessionId}`,P=u(e,"section");P.className="spotpatch-external-handoff",P.hidden=!0;let ee=u(e,"div");ee.className="spotpatch-external-heading";let te=u(e,"strong"),Y=G(e,"","spotpatch-external-refresh");ee.append(te,Y);let ne=u(e,"p");ne.className="spotpatch-external-description";let h=u(e,"p");h.className="spotpatch-external-status",h.setAttribute("role","status"),h.setAttribute("aria-live","polite");let ie=u(e,"div");ie.className="spotpatch-external-control";let J=u(e,"label"),se=u(e,"span"),de=u(e,"select"),oe=u(e,"option");oe.value="codex",de.append(oe),J.append(se,de);let w=u(e,"p");w.className="spotpatch-external-control-status",w.setAttribute("role","status");let V=u(e,"div");V.className="spotpatch-external-control-actions";let Q=G(e,""),H=G(e,""),j=G(e,""),F=G(e,"");V.append(Q,H,j,F);let M=u(e,"details");M.className="spotpatch-external-result",M.hidden=!0;let he=u(e,"summary"),le=u(e,"p"),ce=u(e,"pre");M.append(he,le,ce),ie.append(J,w,V,M);let U=G(e,"","spotpatch-external-resolve");U.hidden=!0;let z=u(e,"details");z.className="spotpatch-external-settings";let Re=u(e,"summary"),d=u(e,"p");z.append(Re,d),P.append(ee,ne,ie,h,U,z);let l=G(e,"","spotpatch-primary");l.hidden=!0;let p=u(e,"div");p.className="spotpatch-external-disclosure",p.hidden=!0;let S=u(e,"section");S.className="spotpatch-external-disclosure-card",S.tabIndex=-1,S.setAttribute("role","alertdialog"),S.setAttribute("aria-modal","true");let re=u(e,"h3"),Me=u(e,"p"),be=u(e,"p");be.className="spotpatch-external-files";let Ge=u(e,"p"),He=u(e,"p"),Fe=u(e,"p"),pe=u(e,"p"),Ce=u(e,"div");Ce.className="spotpatch-external-disclosure-actions";let Te=G(e,""),_e=G(e,"","spotpatch-primary");Ce.append(Te,_e),S.append(re,Me,be,Ge,He,Fe,pe,Ce),p.append(S),P.append(p);let Tt=()=>{try{return e.defaultView?.sessionStorage.getItem($)==="confirmed"}catch{return!1}},_t=()=>{try{e.defaultView?.sessionStorage.setItem($,"confirmed")}catch{}},B=()=>{l.textContent=y?i.retry:E?.canDispatch===!0?i.send:i.inboxSend,l.disabled=!K||!r||!X||f||!y&&C,l.setAttribute("aria-busy",String(f)),Y.disabled=!K||f,U.hidden=!L,U.disabled=!K||f||!L},ue=()=>{if(R===void 0){Q.disabled=!0,H.disabled=!0,j.disabled=!0,F.hidden=!0;return}let n=R.connectionState,N=Z||n==="diagnosing"||n==="connecting"||n==="disconnecting";Q.disabled=N||n==="ready"||n==="busy",H.disabled=N||n==="disconnected",j.disabled=N||R.grantState!=="valid";let D=R.task?.managedPhase;F.hidden=D===void 0||D==="completed"||D==="review-required"||D==="failed"||D==="cancelled"||D==="cleanup-warning",F.disabled=N},Ee=n=>{if(v===void 0)return;let N=v;v=void 0,p.hidden=!0,n&&_t(),W?.focus({preventScroll:!0}),W=void 0,N(n),c.onViewChange()},Ue=n=>{if(n.key==="Escape"){n.preventDefault(),Ee(!1);return}if(n.key!=="Tab")return;let N=Te,D=_e,fe=p.getRootNode(),me="activeElement"in fe?fe.activeElement:e.activeElement;n.shiftKey&&me===N?(n.preventDefault(),D.focus()):!n.shiftKey&&me===D&&(n.preventDefault(),N.focus())},Be=()=>{i=ft[c.locale()],te.textContent=i.title,ne.textContent=i.description,Y.textContent=i.refresh,Y.title=i.refresh,Re.textContent=i.settingsTitle,d.textContent=i.settingsHelp,re.textContent=i.disclosureTitle,Ge.textContent=i.disclosureData,He.textContent=i.disclosureInbox,Fe.textContent=i.disclosureProvider,pe.textContent=i.disclosureNoGuarantee,se.textContent=i.agentLabel,oe.textContent=i.codexManaged,Q.textContent=i.connectManaged,H.textContent=i.disconnectManaged,j.textContent=i.revokeManaged,F.textContent=i.cancelManaged,he.textContent=i.resultTitle,R!==void 0&&(w.textContent=xt(R,i),pe.textContent=R.mode==="managed"?i.disclosureManagedGuarantee:i.disclosureNoGuarantee),m!==void 0&&(le.textContent=ht(m,i)),Te.textContent=i.cancel,_e.textContent=i.confirm,U.textContent=i.resolveUnknown,B(),ue()};Te.addEventListener("click",()=>{Ee(!1)}),_e.addEventListener("click",()=>{Ee(!0)}),p.addEventListener("keydown",Ue),z.addEventListener("toggle",c.onViewChange),M.addEventListener("toggle",c.onViewChange);let mt=c.subscribeLocale(Be);Be(),h.textContent=i.ready,w.textContent=c.locale()==="zh-CN"?"正在读取本地连接状态……":"Reading local connection status…",B(),ue();let Nt=n=>n.state==="expired"?i.expired(n.revision):n.state==="superseded"?i.superseded(n.revision):n.pickupCount>0?i.pickedUp(n.revision,n.pickupCount,n.pickedUpAt===void 0?void 0:At(n.pickedUpAt,c.locale())):i.published(n.revision,At(n.expiresAt,c.locale())),Xe=n=>{f=!1,y=!1,E=n.activeAdapter,L=n.dispatch?.phase==="delivery-unknown"&&n.activeAdapter?.state==="blocked",C=L||n.activeAdapter!==null&&!n.activeAdapter.canDispatch,n.dispatch!==null?(h.dataset.state=n.dispatch.phase,h.textContent=n.dispatch.phase==="delivery-unknown"&&!L?i.unknownResolved(Ie(n.dispatch.adapterKind),n.dispatch.revision):gt(i,n.dispatch)):(h.dataset.state=n.handoff.state==="available"&&n.handoff.pickupCount>0?"picked-up":n.handoff.state,h.textContent=Nt(n.handoff)),B(),c.onViewChange()};return Object.freeze({root:P,styles:Pt(e),sendButton:l,refreshButton:Y,resolveButton:U,cancelManagedButton:F,connectButton:Q,disconnectButton:H,revokeButton:j,confirmDisclosure(n){if(Tt())return Promise.resolve(!0);if(v!==void 0)return Promise.resolve(!1);let N=Mt(n);Me.textContent=i.disclosureIntro(n.targets.length,N.length),be.textContent=N.length===0?"—":N.join(`
|
|
38
|
+
`),p.hidden=!1;let D=P.getRootNode(),fe="activeElement"in D?D.activeElement:e.activeElement;return W=fe instanceof HTMLElement?fe:void 0,c.onViewChange(),S.focus({preventScroll:!0}),new Promise(me=>{v=me})},renderCapability(n){r=n.brokerReady,f=!1,y=!1,E=n.activeAdapter,L=!1,C=n.activeAdapter!==null&&!n.activeAdapter.canDispatch,h.dataset.state=n.brokerReady?"ready":"error",h.textContent=n.brokerReady?n.activeAdapter?.canDispatch===!0?i.activeReady(Ie(n.activeAdapter.kind)):n.dispatch!==null&&n.activeAdapter!==null?gt(i,n.dispatch):n.activeWaitCount>0?i.readyWaiting(n.activeWaitCount):i.ready:i.error("EXTERNAL_HANDOFF_UNAVAILABLE"),B(),c.onViewChange()},renderPublishing(){f=!0,y=!1,h.dataset.state="publishing",h.textContent=i.publishing,B(),c.onViewChange()},renderPublishResult(n){Xe(Object.freeze({handoff:n.handoff,activeAdapter:n.delivery.mode==="active"?n.delivery.adapter:null,dispatch:n.delivery.mode==="active"?n.delivery.dispatch:null}))},renderStatus(n){Xe(n)},renderControlStatus(n){R=n,w.textContent=xt(n,i),w.dataset.state=n.connectionState,pe.textContent=n.mode==="managed"?i.disclosureManagedGuarantee:i.disclosureNoGuarantee,ue(),c.onViewChange()},renderControlUnavailable(){R=void 0,w.dataset.state="unavailable",w.textContent=i.controlUnavailable,pe.textContent=i.disclosureNoGuarantee,ue(),c.onViewChange()},renderManagedResult(n){m=n,M.hidden=!1,M.open=!0,le.textContent=ht(n,i),ce.textContent=n.diff,c.onViewChange()},renderError(n,N=!1){f=!1,y=N,n==="EXTERNAL_AGENT_BUSY"&&(C=!0),h.dataset.state="error",h.textContent=N?`${i.error(n)} ${i.retry}.`:i.error(n),B(),c.onViewChange()},setBusy(n){f=n,B()},setControlBusy(n){Z=n,ue()},setContextReady(n){X=n,B()},setSelectionVisible(n){K=n,P.hidden=!n,l.hidden=!n,n||Ee(!1),B()},dispose(){Ee(!1),p.removeEventListener("keydown",Ue),z.removeEventListener("toggle",c.onViewChange),M.removeEventListener("toggle",c.onViewChange),mt()}})}var Gt=Symbol.for("spotpatch.external-handoff.v1");function Pe(e){globalThis[Gt]=e}Pe(Object.freeze({createPanel:ke,createWorkflow:De}));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spotpatch/vite",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.11.0",
|
|
4
4
|
"description": "Vite development plugin for SpotPatch.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -48,11 +48,12 @@
|
|
|
48
48
|
"dependencies": {
|
|
49
49
|
"magic-string": "1.1.0",
|
|
50
50
|
"oxc-parser": "0.143.0",
|
|
51
|
+
"@spotpatch/bridge": "^0.2.0",
|
|
51
52
|
"@spotpatch/compiler": "^0.2.0",
|
|
52
|
-
"@spotpatch/dev-server": "^0.
|
|
53
|
+
"@spotpatch/dev-server": "^0.7.0",
|
|
53
54
|
"@spotpatch/react-adapter": "^1.1.0",
|
|
54
|
-
"@spotpatch/runtime": "^1.
|
|
55
|
-
"@spotpatch/shared": "^1.
|
|
55
|
+
"@spotpatch/runtime": "^1.11.0",
|
|
56
|
+
"@spotpatch/shared": "^1.11.0"
|
|
56
57
|
},
|
|
57
58
|
"peerDependencies": {
|
|
58
59
|
"vite": "^5.0.0 || ^6.0.0 || ^7.0.0"
|
|
@@ -62,7 +63,7 @@
|
|
|
62
63
|
"registry": "https://registry.npmjs.org/"
|
|
63
64
|
},
|
|
64
65
|
"scripts": {
|
|
65
|
-
"build": "tsup src/index.ts --format esm,cjs --dts --sourcemap --clean && tsup --config tsup.cli.config.ts && tsup --config tsup.runtime-client.config.ts && tsup --config tsup.runtime-react-adapter.config.ts && tsup --config tsup.runtime-data-flow-prelude.config.ts && tsup --config tsup.runtime-data-flow-panel.config.ts",
|
|
66
|
+
"build": "tsup src/index.ts --format esm,cjs --dts --sourcemap --clean && tsup --config tsup.cli.config.ts && tsup --config tsup.runtime-client.config.ts && tsup --config tsup.runtime-react-adapter.config.ts && tsup --config tsup.runtime-data-flow-prelude.config.ts && tsup --config tsup.runtime-data-flow-panel.config.ts && tsup --config tsup.runtime-external-handoff-panel.config.ts",
|
|
66
67
|
"clean": "node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"",
|
|
67
68
|
"typecheck": "tsc --noEmit -p tsconfig.json"
|
|
68
69
|
}
|