page-agent-sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ .code-preview-overlay[data-v-1e52dc9d]{z-index:9999;background:#00000080;justify-content:center;align-items:center;padding:20px;display:flex;position:fixed;inset:0}.code-preview-modal[data-v-1e52dc9d]{background:#fff;border-radius:12px;flex-direction:column;width:90%;max-width:900px;height:80vh;display:flex;overflow:hidden;box-shadow:0 20px 60px #0000004d}.preview-header[data-v-1e52dc9d]{color:#fff;background:#1f2937;align-items:center;gap:12px;padding:10px 16px;display:flex}.preview-title[data-v-1e52dc9d]{font-size:14px;font-weight:600}.preview-tabs[data-v-1e52dc9d]{gap:4px;margin-left:auto;display:flex}.preview-tabs button[data-v-1e52dc9d]{color:#fff;cursor:pointer;background:#ffffff1a;border:none;border-radius:6px;padding:4px 12px;font-size:13px}.preview-tabs button.active[data-v-1e52dc9d]{background:#667eea}.preview-tabs button[data-v-1e52dc9d]:disabled{opacity:.4;cursor:not-allowed}.preview-actions[data-v-1e52dc9d]{gap:4px;display:flex}.icon-btn[data-v-1e52dc9d]{color:#fff;cursor:pointer;background:#ffffff1a;border:none;border-radius:6px;justify-content:center;align-items:center;width:28px;height:28px;font-size:14px;display:flex}.icon-btn[data-v-1e52dc9d]:hover{background:#ffffff40}.preview-body[data-v-1e52dc9d]{background:#f9fafb;flex:1;overflow:hidden}.preview-iframe[data-v-1e52dc9d]{background:#fff;border:none;width:100%;height:100%}.preview-source[data-v-1e52dc9d]{color:#e5e7eb;white-space:pre-wrap;word-break:break-word;background:#1f2937;height:100%;margin:0;padding:16px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:13px;line-height:1.5;overflow:auto}.message-md{word-break:break-word;font-size:14px;line-height:1.6}.message-md p{margin:0 0 8px}.message-md p:last-child{margin-bottom:0}.message-md ul,.message-md ol{margin:6px 0;padding-left:20px}.message-md li{margin:2px 0}.message-md h1,.message-md h2,.message-md h3{margin:10px 0 6px;font-weight:600}.message-md h1{font-size:18px}.message-md h2{font-size:16px}.message-md h3{font-size:15px}.message-md a{color:#667eea;text-decoration:underline}.message-md code:not(.hljs){color:#4338ca;background:#667eea1a;border-radius:4px;padding:1px 5px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:13px}.message-md .code-block{background:#1f2937;border-radius:8px;margin:10px 0;padding:0;position:relative;overflow:hidden}.message-md .code-block code{color:#e5e7eb;background:0 0;padding:12px 14px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:13px;line-height:1.5;display:block;overflow-x:auto}.message-md .code-toolbar{background:#00000040;border-bottom:1px solid #ffffff14;align-items:center;gap:8px;padding:6px 12px;display:flex}.message-md .code-lang{color:#9ca3af;text-transform:lowercase;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px}.message-md .code-action-btn{color:#e5e7eb;cursor:pointer;background:#ffffff1a;border:none;border-radius:4px;margin-left:auto;padding:3px 10px;font-size:12px;transition:background .2s}.message-md .code-action-btn:hover{background:#fff3}.message-md .code-action-btn.preview-btn{color:#fff;background:#667eea;margin-left:4px}.message-md .code-action-btn.preview-btn:hover{background:#5568d3}.message-md .hljs{color:#e5e7eb}.message-md .hljs-keyword{color:#c084fc}.message-md .hljs-string{color:#86efac}.message-md .hljs-comment{color:#6b7280;font-style:italic}.message-md .hljs-number{color:#fca5a5}.message-md .hljs-function .hljs-title,.message-md .hljs-title{color:#93c5fd}.message-md .hljs-tag{color:#fca5a5}.message-md .hljs-attr{color:#fcd34d}.message-md .hljs-built_in{color:#67e8f9}.debug-drawer[data-v-1bf2e689]{z-index:9000;pointer-events:none;position:fixed;inset:0}.drawer-mask[data-v-1bf2e689]{pointer-events:auto;background:#00000040;position:absolute;inset:0}.drawer-panel[data-v-1bf2e689]{--cs-primary:#1f4d3a;--cs-primary-rgb:31, 77, 58;pointer-events:auto;z-index:2;background:#fff;flex-direction:column;width:520px;max-width:90vw;display:flex;position:absolute;top:0;bottom:0;right:0;box-shadow:-8px 0 32px #00000026}.drawer-mask[data-v-1bf2e689]{z-index:1}.drawer-header[data-v-1bf2e689]{color:#fff;background:linear-gradient(135deg,#1f2937,#111827);justify-content:space-between;align-items:center;padding:12px 16px;display:flex}.drawer-title[data-v-1bf2e689]{font-size:15px;font-weight:600}.tab-group[data-v-1bf2e689]{gap:4px;display:flex}.tab-btn[data-v-1bf2e689]{color:#fff;cursor:pointer;background:#ffffff1f;border:none;border-radius:6px;padding:4px 12px;font-size:13px;transition:background .2s}.tab-btn[data-v-1bf2e689]:hover{background:#ffffff38}.tab-btn.active[data-v-1bf2e689]{background:#ffffff73;font-weight:600}.info-body[data-v-1bf2e689]{padding:4px 0}.info-section[data-v-1bf2e689]{margin-bottom:14px}.info-title[data-v-1bf2e689]{color:#2d5a47;border-bottom:1px solid #f3f4f6;margin-bottom:6px;padding-bottom:4px;font-size:12px;font-weight:600}.info-item[data-v-1bf2e689]{background:#f9fafb;border-radius:6px;margin-bottom:4px;padding:6px 8px}.info-name[data-v-1bf2e689]{color:#1f2937;font-family:SF Mono,Monaco,Consolas,monospace;font-size:12px;font-weight:600}.info-desc[data-v-1bf2e689]{color:#6b7280;margin-top:2px;font-size:11px;line-height:1.5}.info-desc.muted[data-v-1bf2e689]{color:#9ca3af}.src-tag[data-v-1bf2e689]{vertical-align:middle;border-radius:8px;margin-left:6px;padding:0 6px;font-size:10px;font-weight:600;display:inline-block}.src-tag.builtin[data-v-1bf2e689]{color:#6b7280;background:#f3f4f6}.src-tag.mcp[data-v-1bf2e689]{color:#7c3aed;background:#f3e8ff}.src-tag.user[data-v-1bf2e689]{color:#2563eb;background:#dbeafe}.info-todo[data-v-1bf2e689]{color:#374151;background:#f9fafb;border-radius:6px;align-items:center;gap:6px;margin-bottom:4px;padding:4px 8px;font-size:12px;display:flex}.todo-tag[data-v-1bf2e689]{color:#fff;border-radius:8px;flex-shrink:0;padding:1px 6px;font-size:10px}.info-pre[data-v-1bf2e689]{color:#4b5563;white-space:pre-wrap;word-break:break-word;background:#f9fafb;border-radius:6px;max-height:200px;margin:0;padding:8px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px;overflow-y:auto}.header-actions[data-v-1bf2e689]{gap:4px;display:flex}.hd-btn[data-v-1bf2e689]{color:#fff;cursor:pointer;background:#ffffff1f;border:none;border-radius:6px;width:28px;height:28px}.hd-btn[data-v-1bf2e689]:hover{background:#ffffff40}.drawer-filters[data-v-1bf2e689]{background:#fafafa;border-bottom:1px solid #f3f4f6;flex-wrap:wrap;gap:6px;padding:10px 16px;display:flex}.filter-chip[data-v-1bf2e689]{color:#6b7280;cursor:pointer;background:#fff;border:1px solid #e5e7eb;border-radius:14px;align-items:center;gap:4px;padding:4px 10px;font-size:12px;transition:all .2s;display:inline-flex}.filter-chip[data-v-1bf2e689]:hover{border-color:var(--chip-color,var(--cs-primary))}.filter-chip.active[data-v-1bf2e689]{background:var(--chip-color,var(--cs-primary));border-color:var(--chip-color,var(--cs-primary));color:#fff}.chip-count[data-v-1bf2e689]{background:#00000014;border-radius:8px;padding:0 5px;font-size:11px}.filter-chip.active .chip-count[data-v-1bf2e689]{background:#ffffff40}.drawer-body[data-v-1bf2e689]{flex:1;padding:12px;overflow-y:auto}.empty[data-v-1bf2e689]{text-align:center;color:#9ca3af;padding:40px 20px;font-size:13px}.log-item[data-v-1bf2e689]{background:#fff;border:1px solid #e5e7eb;border-radius:8px;margin-bottom:10px;overflow:hidden}.log-head[data-v-1bf2e689]{background:#f9fafb;align-items:center;gap:8px;padding:8px 10px;display:flex}.log-type[data-v-1bf2e689]{color:#fff;white-space:nowrap;border-radius:4px;padding:2px 8px;font-size:11px;font-weight:600}.log-source[data-v-1bf2e689]{color:#7c3aed;white-space:nowrap;background:#f3e8ff;border-radius:4px;padding:2px 8px;font-size:10px;font-weight:600}.log-time[data-v-1bf2e689]{color:#9ca3af;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px}.log-body[data-v-1bf2e689]{padding:10px 12px}.log-footer[data-v-1bf2e689]{border-top:1px dashed #f3f4f6;gap:8px;padding:6px 12px;display:flex}.raw-toggle[data-v-1bf2e689]{color:var(--cs-primary);cursor:pointer;background:0 0;border:none;padding:2px 4px;font-size:11px}.raw-toggle[data-v-1bf2e689]:hover{text-decoration:underline}.log-raw[data-v-1bf2e689]{color:#e5e7eb;white-space:pre-wrap;word-break:break-word;background:#1f2937;border-top:1px solid #f3f4f6;max-height:280px;margin:0;padding:10px 12px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px;line-height:1.5;overflow:auto}.kv-grid[data-v-1bf2e689]{grid-template-columns:1fr 1fr;gap:6px;margin-bottom:8px;display:grid}.kv[data-v-1bf2e689]{background:#f9fafb;border-radius:6px;flex-direction:column;padding:6px 8px;display:flex}.kv .k[data-v-1bf2e689]{color:#9ca3af;text-transform:uppercase;font-size:10px}.kv .v[data-v-1bf2e689]{color:#1f2937;font-family:SF Mono,Monaco,Consolas,monospace;font-size:13px;font-weight:600}.section-label[data-v-1bf2e689]{color:#6b7280;margin:10px 0 4px;font-size:11px;font-weight:600}.chip-row[data-v-1bf2e689]{flex-wrap:wrap;gap:4px;display:flex}.tool-chip[data-v-1bf2e689]{color:#2d5a47;background:#ecf5ef;border-radius:10px;padding:2px 8px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px}.msg-list[data-v-1bf2e689]{flex-direction:column;gap:4px;display:flex}.msg-row[data-v-1bf2e689]{background:#f9fafb;border-radius:6px;align-items:flex-start;gap:6px;padding:5px 8px;display:flex}.msg-role[data-v-1bf2e689]{color:#fff;border-radius:3px;flex-shrink:0;margin-top:1px;padding:2px 6px;font-size:9px;font-weight:700}.msg-text[data-v-1bf2e689]{color:#374151;white-space:pre-wrap;word-break:break-word;flex:1;font-size:12px;line-height:1.5}.msg-tool-hint[data-v-1bf2e689]{color:#7c3aed;flex-shrink:0;font-size:10px}.badge-row[data-v-1bf2e689]{flex-wrap:wrap;gap:6px;margin-bottom:8px;display:flex}.badge[data-v-1bf2e689]{color:#2d5a47;background:#dbeee4;border-radius:10px;padding:2px 8px;font-size:11px;font-weight:600}.badge.muted[data-v-1bf2e689]{color:#6b7280;background:#f3f4f6}.badge.warn[data-v-1bf2e689]{color:#92400e;background:#fef3c7}.resp-content[data-v-1bf2e689]{color:#1f2937;white-space:pre-wrap;word-break:break-word;background:#fffbeb;border-left:3px solid #d97706;border-radius:4px;margin-bottom:8px;padding:6px 10px;font-size:12px}.tc-list[data-v-1bf2e689]{flex-direction:column;gap:6px;display:flex}.tc-card[data-v-1bf2e689]{border:1px solid #e5e7eb;border-radius:6px;overflow:hidden}.tc-card.inline[data-v-1bf2e689]{margin-top:4px}.tc-name[data-v-1bf2e689]{color:#2d5a47;background:#ecf5ef;padding:5px 8px;font-size:12px;font-weight:600}.tc-args[data-v-1bf2e689]{color:#e5e7eb;white-space:pre-wrap;word-break:break-word;background:#1f2937;max-height:200px;margin:0;padding:8px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px;line-height:1.5;overflow-y:auto}.usage-row[data-v-1bf2e689]{flex-wrap:wrap;gap:6px;margin-top:8px;display:flex}.usage[data-v-1bf2e689]{color:#047857;background:#ecfdf5;border-radius:10px;padding:2px 8px;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px}.err-box[data-v-1bf2e689]{color:#991b1b;white-space:pre-wrap;word-break:break-word;background:#fef2f2;border:1px solid #fecaca;border-radius:6px;padding:8px 10px;font-size:12px}.msg-detail[data-v-1bf2e689]{flex-direction:column;flex:1;gap:3px;min-width:0;display:flex}.tc-inline[data-v-1bf2e689]{background:#f0f7f3;border:1px solid #c3dcd0;border-radius:4px;align-items:baseline;gap:4px;padding:2px 6px;font-size:11px;display:flex}.tc-inline-name[data-v-1bf2e689]{color:#2d5a47;white-space:nowrap;font-weight:600}.tc-inline-args[data-v-1bf2e689]{color:#16402f;word-break:break-all;font-family:SF Mono,Monaco,Consolas,monospace;font-size:10px}.tc-id[data-v-1bf2e689]{color:#9ca3af;font-family:SF Mono,Monaco,Consolas,monospace;font-size:10px}.view-toggle[data-v-1bf2e689]{color:#2d5a47;cursor:pointer;background:#ecf5ef;border:1px solid #b8d4c5;border-radius:10px;margin-left:auto;padding:2px 8px;font-size:11px}.view-toggle[data-v-1bf2e689]:hover{background:#dbeee4}.drawer-enter-active[data-v-1bf2e689],.drawer-leave-active[data-v-1bf2e689]{transition:opacity .25s}.drawer-enter-active .drawer-panel[data-v-1bf2e689],.drawer-leave-active .drawer-panel[data-v-1bf2e689]{transition:transform .25s}.drawer-enter-from[data-v-1bf2e689],.drawer-leave-to[data-v-1bf2e689]{opacity:0}.drawer-enter-from .drawer-panel[data-v-1bf2e689],.drawer-leave-to .drawer-panel[data-v-1bf2e689]{transform:translate(100%)}.flow-section[data-v-1bf2e689]{margin-bottom:14px}.flow-section-title[data-v-1bf2e689]{color:#6b7280;margin-bottom:6px;padding-left:2px;font-size:11px;font-weight:600}.flow-round[data-v-1bf2e689]{border:1px solid #e5e7eb;border-radius:8px;margin-bottom:12px;overflow:hidden}.flow-round-head[data-v-1bf2e689]{color:#fff;background:var(--cs-primary);padding:5px 10px;font-size:12px;font-weight:600}.flow-round-body[data-v-1bf2e689]{flex-direction:column;gap:3px;padding:6px;display:flex}.flow-node[data-v-1bf2e689]{border-left:3px solid var(--cs-primary);background:#f9fafb;border-radius:6px;align-items:center;gap:6px;padding:5px 8px;font-size:12px;display:flex}.flow-node.llm_request[data-v-1bf2e689]{border-left-color:#059669}.flow-node.llm_response[data-v-1bf2e689]{border-left-color:#d97706}.flow-node.tool_call[data-v-1bf2e689]{border-left-color:#7c3aed}.flow-node.tool_result[data-v-1bf2e689]{border-left-color:#2563eb}.flow-node.error[data-v-1bf2e689]{background:#fef2f2;border-left-color:#dc2626}.flow-node.middleware[data-v-1bf2e689]{border-left-color:#0891b2}.flow-ico[data-v-1bf2e689]{flex-shrink:0;font-size:13px}.flow-label[data-v-1bf2e689]{color:#374151;white-space:nowrap;flex-shrink:0;font-weight:600}.flow-detail[data-v-1bf2e689]{color:#6b7280;text-overflow:ellipsis;white-space:nowrap;flex:1;font-family:SF Mono,Monaco,Consolas,monospace;font-size:11px;overflow:hidden}.flow-time[data-v-1bf2e689]{color:#9ca3af;flex-shrink:0;font-family:SF Mono,Monaco,Consolas,monospace;font-size:10px}.chat-dialog[data-v-d3e4f57d]{--cs-primary:#1f4d3a;--cs-primary-rgb:31, 77, 58;--cs-bg:#fff;--cs-bubble-ai:#f3f4f6;--cs-radius:12px;border-radius:var(--cs-radius);background:var(--cs-bg);flex-direction:column;width:100%;height:100%;transition:all .3s;display:flex;overflow:hidden;box-shadow:0 8px 32px #0000001f,0 2px 8px #00000014}.chat-dialog.collapsed[data-v-d3e4f57d]{height:52px}.chat-header[data-v-d3e4f57d]{background:var(--cs-primary);color:#fff;cursor:pointer;-webkit-user-select:none;user-select:none;justify-content:space-between;align-items:center;padding:12px 16px;display:flex}.header-left[data-v-d3e4f57d]{align-items:center;gap:8px;display:flex}.header-icon[data-v-d3e4f57d]{font-size:20px}.header-title[data-v-d3e4f57d]{font-size:15px;font-weight:600}.status-dot[data-v-d3e4f57d]{background:#4ade80;border-radius:50%;width:8px;height:8px}.status-dot.pulse[data-v-d3e4f57d]{animation:1.5s infinite pulse-d3e4f57d}@keyframes pulse-d3e4f57d{0%,to{opacity:1}50%{opacity:.4}}.header-actions[data-v-d3e4f57d]{gap:4px;display:flex}.action-btn[data-v-d3e4f57d]{color:#fff;cursor:pointer;background:#ffffff26;border:none;border-radius:6px;justify-content:center;align-items:center;width:28px;height:28px;transition:background .2s;display:flex}.action-btn[data-v-d3e4f57d]:hover:not(:disabled){background:#ffffff4d}.action-btn[data-v-d3e4f57d]:disabled{opacity:.4;cursor:not-allowed}.action-btn.debug-btn[data-v-d3e4f57d]{position:relative}.action-btn.debug-btn.active[data-v-d3e4f57d]{background:#ffffff73}.debug-badge[data-v-d3e4f57d]{color:#fff;background:#ef4444;border-radius:8px;min-width:16px;height:16px;padding:0 4px;font-size:10px;font-weight:600;line-height:16px;position:absolute;top:-2px;right:-2px}.chat-body[data-v-d3e4f57d]{scroll-behavior:smooth;flex:1;min-height:0;padding:16px;overflow-y:auto}.empty-state[data-v-d3e4f57d]{color:#9ca3af;flex-direction:column;justify-content:center;align-items:center;height:200px;display:flex}.empty-icon[data-v-d3e4f57d]{margin-bottom:12px;font-size:48px}.empty-state p[data-v-d3e4f57d]{font-size:14px}.message-row[data-v-d3e4f57d]{align-items:flex-start;gap:10px;margin-bottom:16px;display:flex}.message-row.user[data-v-d3e4f57d]{flex-direction:row-reverse}.message-avatar[data-v-d3e4f57d]{background:#f3f4f6;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:32px;height:32px;font-size:16px;display:flex}.message-row.user .message-avatar[data-v-d3e4f57d]{background:#ecf5ef}.message-content[data-v-d3e4f57d]{max-width:75%}.message-bubble[data-v-d3e4f57d]{word-break:break-word;white-space:pre-wrap;border-radius:12px;padding:10px 14px;font-size:14px;line-height:1.5}.message-row.assistant .message-bubble[data-v-d3e4f57d]{color:#1f2937;white-space:normal;background:#f3f4f6;border-bottom-left-radius:4px}.message-row.user .message-bubble[data-v-d3e4f57d]{background:var(--cs-primary);color:#fff;border-bottom-right-radius:4px}.message-row.user .message-content[data-v-d3e4f57d]{flex-direction:column;align-items:flex-end;display:flex}.message-time[data-v-d3e4f57d]{color:#9ca3af;margin-top:4px;padding:0 4px;font-size:11px}.typing[data-v-d3e4f57d]{gap:4px;padding:12px 16px;display:flex}.typing .dot[data-v-d3e4f57d]{background:#9ca3af;border-radius:50%;width:8px;height:8px;animation:1.4s ease-in-out infinite bounce-d3e4f57d}.typing .dot[data-v-d3e4f57d]:nth-child(2){animation-delay:.2s}.typing .dot[data-v-d3e4f57d]:nth-child(3){animation-delay:.4s}@keyframes bounce-d3e4f57d{0%,80%,to{transform:translateY(0)}40%{transform:translateY(-6px)}}.typing-text[data-v-d3e4f57d]{color:#9ca3af;font-size:13px}.reasoning-block[data-v-d3e4f57d]{background:#f0f7f3;border:1px dashed #b8d4c5;border-radius:8px;margin-bottom:6px;overflow:hidden}.reasoning-header[data-v-d3e4f57d]{cursor:pointer;-webkit-user-select:none;user-select:none;color:#2d5a47;align-items:center;gap:6px;padding:5px 10px;font-size:12px;display:flex}.reasoning-icon[data-v-d3e4f57d]{font-size:13px}.reasoning-title[data-v-d3e4f57d]{font-weight:600}.reasoning-toggle[data-v-d3e4f57d]{margin-left:auto}.reasoning-body[data-v-d3e4f57d]{color:#16402f;white-space:pre-wrap;word-break:break-word;border-top:1px dashed #b8d4c5;max-height:240px;padding:8px 10px;font-size:12px;line-height:1.6;overflow-y:auto}.steps-block[data-v-d3e4f57d]{flex-direction:column;gap:4px;margin-bottom:6px;display:flex}.step-item[data-v-d3e4f57d]{color:#0e7490;background:#ecfeff;border:1px solid #a5f3fc;border-radius:10px;flex-direction:column;align-self:flex-start;align-items:flex-start;gap:3px;max-width:100%;padding:2px 8px;font-size:11px;display:flex}.step-head[data-v-d3e4f57d]{align-items:center;gap:5px;display:inline-flex}.step-icon[data-v-d3e4f57d]{font-size:11px}.step-name[data-v-d3e4f57d]{font-family:SF Mono,Monaco,Consolas,monospace}.step-count[data-v-d3e4f57d]{color:#0891b2;font-size:10px;font-weight:600}.step-status.running[data-v-d3e4f57d]{color:#0891b2}.step-children[data-v-d3e4f57d]{background:#faf5ff;border-left:2px solid #c4b5fd;border-radius:0 8px 8px 0;flex-direction:column;gap:3px;margin-top:4px;padding:4px 8px 4px 10px;display:flex}.step-children-label[data-v-d3e4f57d]{color:#7c3aed;letter-spacing:.3px;font-size:10px;font-weight:600}.step-child[data-v-d3e4f57d]{color:#6d28d9;background:#ede9fe;border:1px solid #ddd6fe;border-radius:8px;align-items:center;gap:5px;padding:1px 7px;font-size:10px;display:inline-flex}.step-child .step-name[data-v-d3e4f57d]{color:#6d28d9}.step-child .step-status.running[data-v-d3e4f57d]{color:#8b5cf6}.stream-cursor[data-v-d3e4f57d],.typing-cursor[data-v-d3e4f57d]{vertical-align:text-bottom;background:var(--cs-primary);width:7px;height:14px;margin-left:2px;animation:1s steps(2,end) infinite blink-d3e4f57d;display:inline-block}@keyframes blink-d3e4f57d{0%,50%{opacity:1}51%,to{opacity:0}}.error-bar[data-v-d3e4f57d]{color:#dc2626;background:#fef2f2;border-radius:8px;align-items:flex-start;gap:10px;margin-top:8px;padding:8px 12px;font-size:13px;display:flex}.error-text[data-v-d3e4f57d]{word-break:break-word;overflow-wrap:anywhere;white-space:pre-wrap;flex:1;min-width:0;max-height:120px;line-height:1.5;overflow-y:auto}.error-bar .retry-btn[data-v-d3e4f57d],.error-bar .undo-btn[data-v-d3e4f57d]{flex-shrink:0;margin-top:1px}.retry-btn[data-v-d3e4f57d]{color:#fff;cursor:pointer;background:#dc2626;border:none;border-radius:6px;flex-shrink:0;padding:3px 12px;font-size:12px;font-weight:600;transition:background .2s}.retry-btn[data-v-d3e4f57d]:hover{background:#b91c1c}.chat-footer[data-v-d3e4f57d]{background:#fafafa;border-top:1px solid #f3f4f6;align-items:flex-end;gap:8px;padding:12px 16px;display:flex}.chat-input[data-v-d3e4f57d]{resize:none;border:1px solid #e5e7eb;border-radius:8px;outline:none;flex:1;max-height:100px;padding:10px 12px;font-family:inherit;font-size:14px;line-height:1.4;transition:border-color .2s;overflow-y:auto}.chat-input[data-v-d3e4f57d]:focus{border-color:var(--cs-primary);box-shadow:0 0 0 2px rgba(var(--cs-primary-rgb), .1)}.send-btn[data-v-d3e4f57d]{background:var(--cs-primary);color:#fff;cursor:pointer;border:none;border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;width:38px;height:38px;transition:opacity .2s,transform .1s;display:flex}.send-btn[data-v-d3e4f57d]:hover:not(:disabled){opacity:.9;transform:scale(1.05)}.send-btn[data-v-d3e4f57d]:active:not(:disabled){transform:scale(.95)}.send-btn[data-v-d3e4f57d]:disabled{opacity:.4;cursor:not-allowed}.send-btn.stop-btn[data-v-d3e4f57d]{background:#9ca3af}.send-btn.stop-btn[data-v-d3e4f57d]:hover:not(:disabled){background:#6b7280;transform:none}.cap-badge[data-v-d3e4f57d]{color:#6b7280;white-space:nowrap;-webkit-user-select:none;user-select:none;background:#f9fafb;border:1px solid #e5e7eb;border-radius:14px;flex-shrink:0;align-self:center;padding:4px 10px;font-size:11px}.msg-actions[data-v-d3e4f57d]{opacity:0;gap:6px;margin-top:4px;transition:opacity .2s;display:flex}.message-row.assistant:hover .msg-actions[data-v-d3e4f57d]{opacity:1}.msg-action-btn[data-v-d3e4f57d]{color:#6b7280;cursor:pointer;background:#fff;border:1px solid #e5e7eb;border-radius:6px;padding:2px 8px;font-size:11px;transition:all .2s}.msg-action-btn[data-v-d3e4f57d]:hover{border-color:var(--cs-primary);color:var(--cs-primary);background:#f0f7f3}.undo-btn[data-v-d3e4f57d]{color:#92400e;cursor:pointer;background:#fffbeb;border:1px solid #f59e0b;border-radius:6px;margin-left:6px;padding:2px 10px;font-size:11px;transition:all .2s}.undo-btn[data-v-d3e4f57d]:hover{background:#fde68a}.undo-foot-btn[data-v-d3e4f57d]{color:#6b7280;cursor:pointer;background:#f9fafb;border:1px solid #e5e7eb;border-radius:14px;flex-shrink:0;align-self:center;padding:4px 10px;font-size:11px;transition:all .2s}.undo-foot-btn[data-v-d3e4f57d]:hover{border-color:var(--cs-primary);color:var(--cs-primary);background:#f0f7f3}.approval-bar[data-v-d3e4f57d]{background:#fffbeb;border:1px solid #f59e0b;border-radius:10px;margin:8px 12px;padding:10px 12px}.approval-head[data-v-d3e4f57d]{color:#92400e;align-items:center;gap:6px;font-size:13px;display:flex}.approval-icon[data-v-d3e4f57d]{font-size:15px}.approval-title code[data-v-d3e4f57d]{color:#78350f;background:#fef3c7;border-radius:4px;padding:1px 6px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.approval-toggle[data-v-d3e4f57d]{color:#92400e;cursor:pointer;background:0 0;border:none;border-radius:4px;margin-left:auto;padding:2px 8px;font-size:12px}.approval-toggle[data-v-d3e4f57d]:hover{background:#fef3c7}.approval-args[data-v-d3e4f57d]{color:#57534e;white-space:pre-wrap;word-break:break-all;background:#fff;border:1px solid #fde68a;border-radius:6px;max-height:140px;margin:8px 0;padding:8px;font-size:12px;overflow:auto}.approval-actions[data-v-d3e4f57d]{justify-content:flex-end;gap:8px;display:flex}.approval-actions button[data-v-d3e4f57d]{cursor:pointer;border:none;border-radius:6px;padding:5px 16px;font-size:13px;transition:opacity .2s}.approval-deny[data-v-d3e4f57d]{color:#6b7280;background:#f3f4f6;border:1px solid #e5e7eb}.approval-deny[data-v-d3e4f57d]:hover{color:#374151;background:#e5e7eb}.approval-allow[data-v-d3e4f57d]{background:var(--cs-primary);color:#fff}.approval-allow[data-v-d3e4f57d]:hover{opacity:.9}.approval-question[data-v-d3e4f57d]{color:#57534e;white-space:pre-wrap;background:#fff;border:1px solid #fde68a;border-radius:6px;margin:8px 0;padding:8px 10px;font-size:13px;line-height:1.5}.approval-context[data-v-d3e4f57d]{color:#92400e;margin:4px 0 8px;font-size:12px;line-height:1.5}.approval-recommend[data-v-d3e4f57d]{color:#1f4d3a;margin:4px 0 8px;font-size:12px}.approval-opt[data-v-d3e4f57d]{border:1px solid var(--cs-primary);color:var(--cs-primary);cursor:pointer;background:#fff;border-radius:6px;padding:5px 14px;font-size:13px;transition:all .2s}.approval-opt[data-v-d3e4f57d]:hover{background:var(--cs-primary);color:#fff}
2
+ /*$vite$:1*/
package/package.json ADDED
@@ -0,0 +1,81 @@
1
+ {
2
+ "name": "page-agent-sdk",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "description": "框架无关的页面内 Agent JS SDK —— 以对话框形态挂载到任意网页,通过自定义 tool 读写宿主 window 属性(GET 抓文档),具备 planning/skills/虚拟工作区/快照回退/context 管理能力。Vue 打包进库,使用者无需安装 Vue。",
6
+ "main": "./dist/chat-sdk.umd.cjs",
7
+ "module": "./dist/chat-sdk.js",
8
+ "types": "./types/index.d.ts",
9
+ "unpkg": "./dist/chat-sdk.iife.js",
10
+ "jsdelivr": "./dist/chat-sdk.iife.js",
11
+ "sideEffects": [
12
+ "**/*.css"
13
+ ],
14
+ "exports": {
15
+ ".": {
16
+ "types": "./types/index.d.ts",
17
+ "import": "./dist/chat-sdk.js",
18
+ "require": "./dist/chat-sdk.umd.cjs"
19
+ },
20
+ "./style.css": "./dist/chat-sdk.css"
21
+ },
22
+ "files": [
23
+ "dist",
24
+ "types"
25
+ ],
26
+ "scripts": {
27
+ "dev": "vite",
28
+ "mcp:mock": "tsx scripts/mcp-mock-server.ts",
29
+ "mcp:probe": "tsx scripts/mcp-probe.ts",
30
+ "verify:probe": "tsx scripts/verify-probe.ts",
31
+ "build": "npm run build:lib && npm run build:iife",
32
+ "build:lib": "vite build",
33
+ "build:iife": "vite build --config vite.iife.config.ts",
34
+ "preview": "vite preview",
35
+ "test": "tsx src/core/__tests__/selftest.ts"
36
+ },
37
+ "keywords": [
38
+ "ai",
39
+ "agent",
40
+ "llm",
41
+ "tool-calling",
42
+ "react",
43
+ "vue3",
44
+ "chat",
45
+ "dialog",
46
+ "sdk",
47
+ "window"
48
+ ],
49
+ "author": "",
50
+ "license": "ISC",
51
+ "publishConfig": {
52
+ "access": "public",
53
+ "registry": "https://registry.npmjs.org/"
54
+ },
55
+ "devDependencies": {
56
+ "@modelcontextprotocol/sdk": "^1.29.0",
57
+ "@vitejs/plugin-vue": "^6.0.7",
58
+ "tsx": "^4.23.1",
59
+ "typescript": "^7.0.2",
60
+ "vite": "^8.1.4",
61
+ "vue": "^3.5.39",
62
+ "vue-tsc": "^3.3.7"
63
+ },
64
+ "dependencies": {
65
+ "@langchain/core": "^1.2.2",
66
+ "@langchain/openai": "^1.5.5",
67
+ "@langchain/textsplitters": "^1.0.1",
68
+ "highlight.js": "^11.11.1",
69
+ "marked": "^18.0.6",
70
+ "zod": "^4.4.3"
71
+ },
72
+ "peerDependencies": {
73
+ "@langchain/core": "^1.2.2",
74
+ "@langchain/openai": "^1.5.5",
75
+ "@modelcontextprotocol/sdk": "^1.29.0",
76
+ "zod": "^4.4.3"
77
+ },
78
+ "peerDependenciesMeta": {
79
+ "@modelcontextprotocol/sdk": { "optional": true }
80
+ }
81
+ }
@@ -0,0 +1,438 @@
1
+ import { DefineComponent } from 'vue';
2
+ export { z } from 'zod';
3
+
4
+ export interface ToolStep {
5
+ name: string;
6
+ args?: any;
7
+ result?: string;
8
+ status: 'running' | 'done' | 'error';
9
+ /** 子 agent 工具步骤(spawn 委派时展示子进度) */
10
+ children?: ToolStep[];
11
+ }
12
+
13
+ export interface AgentMessage {
14
+ role: 'user' | 'assistant' | 'system';
15
+ content: string;
16
+ timestamp: number;
17
+ reasoning?: string;
18
+ steps?: ToolStep[];
19
+ }
20
+
21
+ export interface AgentConfig {
22
+ model: string;
23
+ temperature?: number;
24
+ maxTokens?: number;
25
+ systemPrompt?: string;
26
+ }
27
+
28
+ export interface AgentState {
29
+ messages: AgentMessage[];
30
+ loading: boolean;
31
+ error: string | null;
32
+ }
33
+
34
+ export type StreamEvent =
35
+ | { type: 'round_start'; round: number }
36
+ | { type: 'reasoning'; delta: string }
37
+ | { type: 'text'; delta: string }
38
+ | { type: 'tool_call'; name: string; args: any }
39
+ | { type: 'tool_result'; name: string; result: string; status: 'done' | 'error' }
40
+ | { type: 'subagent'; taskId: string; label: string; kind: 'tool_call' | 'tool_result'; name: string; args?: any; result?: string; status?: 'done' | 'error' }
41
+ | { type: 'done'; content: string };
42
+
43
+ export type StreamHandler = (event: StreamEvent) => void;
44
+
45
+ /** 调试日志(与 harness/createAgent 的 DebugLog 一致) */
46
+ export interface DebugLog {
47
+ timestamp: number;
48
+ type: 'context' | 'llm_request' | 'llm_response' | 'tool_call' | 'tool_result' | 'error' | 'middleware';
49
+ data: any;
50
+ }
51
+
52
+ export interface ChatDialogProps {
53
+ fetchResponse?: (messages: AgentMessage[], signal?: AbortSignal) => Promise<string>;
54
+ fetchStream?: (messages: AgentMessage[], onEvent: StreamHandler, signal?: AbortSignal) => Promise<string>;
55
+ title?: string;
56
+ placeholder?: string;
57
+ debugLogs?: DebugLog[];
58
+ getInfo?: () => AgentInfo;
59
+ }
60
+
61
+ export interface ToolInfo { name: string; description: string; schema?: unknown; source?: string }
62
+ export interface SkillInfo { name: string; description: string }
63
+ export interface WindowPropInfo { path: string; description: string; schema?: unknown }
64
+ export interface SubagentInfo {
65
+ enabled: boolean;
66
+ maxDepth: number;
67
+ maxParallel: number;
68
+ allowedTools: string[];
69
+ }
70
+ /** 预声明子 agent 配置(同主配置子集 + id/description;缺省继承主 agent) */
71
+ export interface SubagentConfig {
72
+ /** 唯一标识;生成委派工具名 use_<id>(须合法工具名) */
73
+ id: string;
74
+ /** 一句话说明(进主 systemPrompt 索引 + 作委派工具描述) */
75
+ description: string;
76
+ llm?: LLMConfig | ChatModelLike;
77
+ systemPrompt?: string;
78
+ tools?: any[];
79
+ skills?: SkillSpec[];
80
+ temperature?: number;
81
+ maxTokens?: number;
82
+ maxToolRounds?: number;
83
+ }
84
+ export interface AgentInfo {
85
+ id: string;
86
+ model?: string;
87
+ tools: ToolInfo[];
88
+ skills: SkillInfo[];
89
+ windowProps: WindowPropInfo[];
90
+ memory: string;
91
+ middleware: string[];
92
+ todos: { content: string; status: string }[];
93
+ subagent: SubagentInfo;
94
+ verify?: { enabled: boolean; maxAttempts: number; adversarial: boolean };
95
+ mcp?: { servers: { name: string; url: string; toolCount: number }[] };
96
+ /** 最近一次跨轮压缩统计(未触发过 → undefined) */
97
+ lastCompression?: {
98
+ triggered: boolean; roundsTotal: number; roundsSummarized: number; roundsRecalled: number;
99
+ originalMessages: number; compressedMessages: number; strategy: string;
100
+ };
101
+ /** 会话级 checkpoint 装载状态(未开启 → undefined) */
102
+ checkpoints?: { enabled: boolean; auto: boolean; list: CheckpointMeta[] };
103
+ }
104
+ }
105
+ export interface McpServerConfig { transport: 'http' | 'sse' | 'websocket'; url: string; name?: string; requestInit?: any; }
106
+
107
+ export declare const ChatDialog: DefineComponent<ChatDialogProps>;
108
+ export declare const MessageContent: DefineComponent<any>;
109
+ export declare const CodePreview: DefineComponent<any>;
110
+ export declare function useChat(opts?: any): any;
111
+
112
+ // ===== 框架无关 SDK(页面内 Agent)=====
113
+ export interface LLMConfig {
114
+ apiKey: string;
115
+ baseUrl?: string;
116
+ model?: string;
117
+ temperature?: number;
118
+ maxTokens?: number;
119
+ /** 模型上下文窗口(token);缺省按 model 名查表。影响 offload 阈值与压缩触发(大模型自适应) */
120
+ contextWindow?: number;
121
+ /** 模型最大输出(token);缺省按 model 名查表。maxTokens 未传时作其缺省,避免设错被截断 */
122
+ maxOutputTokens?: number;
123
+ }
124
+ /** LangChain BaseChatModel 的结构形状(provider 抽离:llm 可传任意 provider 实例) */
125
+ export type ChatModelLike = {
126
+ invoke: (input: any, options?: any) => Promise<any>;
127
+ stream: (input: any, options?: any) => Promise<any>;
128
+ bindTools: (tools: any[]) => any;
129
+ };
130
+
131
+ export interface WindowPropSpec {
132
+ /** window 上的路径,支持点号嵌套 */
133
+ path: string;
134
+ description: string;
135
+ /** 值的 zod schema(写入时校验) */
136
+ schema: any;
137
+ }
138
+ /** createWindowOps 选项(审计回调 / 只读探测 / 快照上限 / 字段白名单读) */
139
+ export interface WindowOpsOptions {
140
+ onAudit?: (entry: { op: string; path: string; value?: any; detail?: string; timestamp: number }) => void;
141
+ allowRawRead?: boolean;
142
+ maxSnapshots?: number;
143
+ /**
144
+ * 字段白名单读模式(默认 true):仅允许读「注册 path 自身 / 其后代」,禁止读未注册的祖先,
145
+ * 防止 LLM 经 get_window_prop('page') 把整个大 JSON 拉进上下文。
146
+ * 集成方注册「可操作子路径」(如 page.theme.color / page.components)而非顶层时,默认即「LLM 只见声明字段」。
147
+ * 设 false 回退原行为(允许读注册 path 的祖先,即整体读)。
148
+ */
149
+ whitelist?: boolean;
150
+ }
151
+
152
+ export interface PermissionRule {
153
+ operations: ('read' | 'write')[];
154
+ scopes: string[];
155
+ mode: 'allow' | 'deny';
156
+ }
157
+
158
+ export interface SkillSpec {
159
+ name: string;
160
+ /** 一句话说明(进索引,兼顾「是什么」+「何时用」) */
161
+ description: string;
162
+ /** 文档源(http(s):// 远程 md,或 vfs://path / 裸路径;SDK 代劳 fetch+vfs);与 getContent 二选一,doc 优先 */
163
+ doc?: string;
164
+ getContent?: () => string | Promise<string>;
165
+ }
166
+
167
+ // ===== Verify 自检中间件 =====
168
+ /** verify check 上下文:与 beforeReturn 底层一致(messages 含 system 头 + agent 最新回复 + 历史 tool_result) */
169
+ export interface VerifyCheckContext {
170
+ messages: any[];
171
+ state: any;
172
+ }
173
+ export interface VerifyCheckResult {
174
+ ok: boolean;
175
+ /** ok=false 时的修正指引(回灌给 agent 触发自纠) */
176
+ feedback?: string;
177
+ }
178
+ /** 领域校验函数:ok=true 放行,ok=false 用 feedback 回灌自纠 */
179
+ export type VerifyCheck = (ctx: VerifyCheckContext) => Promise<VerifyCheckResult> | VerifyCheckResult;
180
+ export interface VerifyMiddlewareOptions {
181
+ check: VerifyCheck;
182
+ /** 对抗式验证:check 通过后 spawn 找茬子 agent 审查;verdict 无问题放行,否则回灌 */
183
+ adversarial?: { llm: any; tools?: any[] };
184
+ }
185
+ /** createWriteBackCheck 选项 */
186
+ export interface WriteBackCheckOptions {
187
+ /** path → zod schema(由 createChatSdk 从 windowProps 构造注入);省略则只校验「读回非空」 */
188
+ schemas?: Record<string, any>;
189
+ /** 读 window 的根对象(默认 globalThis.window) */
190
+ window?: unknown;
191
+ }
192
+
193
+ // ===== 人工确认(approval)=====
194
+ /** 人工确认中间件选项:工具调用前需用户「允许/拒绝」 */
195
+ export interface ApprovalOptions {
196
+ /** 需确认的工具名列表;不传 confirm 且不传 tools → 所有工具都确认 */
197
+ tools?: string[];
198
+ /** 自定义判定(优先于 tools);返回 true 需确认 */
199
+ confirm?: (name: string, args: any) => boolean;
200
+ /** 超时毫秒(用户未响应自动拒绝);0 = 不超时(默认) */
201
+ timeoutMs?: number;
202
+ /** 是否装载 request_human_confirmation 主动确认工具(传 approval 时默认 true;false 关闭) */
203
+ humanConfirmTool?: boolean;
204
+ }
205
+ export declare function createApprovalMiddleware(opts?: ApprovalOptions): any;
206
+ export declare function createHumanConfirmTool(): any;
207
+ export declare function createHumanConfirmMiddleware(): any;
208
+ export declare const HUMAN_CONFIRM_TOOL_NAME: string;
209
+ export interface CheckpointMeta {
210
+ id: number;
211
+ label?: string;
212
+ timestamp: number;
213
+ messageCount: number;
214
+ }
215
+ export interface CheckpointManager {
216
+ save(label?: string): number;
217
+ list(): CheckpointMeta[];
218
+ restore(id?: number): boolean;
219
+ canRestore(): boolean;
220
+ }
221
+ export declare function createCheckpointManager(deps: any): CheckpointManager;
222
+ export declare function createCheckpointMiddleware(mgr: CheckpointManager): any;
223
+
224
+ // ===== 持久化存储 =====
225
+ export type StorageBackendType = 'indexed' | 'session' | 'local' | 'memory';
226
+ export interface StorageConfig {
227
+ backend?: StorageBackendType;
228
+ enabled?: boolean;
229
+ dbName?: string;
230
+ maxBytes?: number;
231
+ maxBytesPerSession?: number;
232
+ evictionWatermark?: number;
233
+ debounceMs?: number;
234
+ }
235
+ export interface SessionMeta {
236
+ agentId: string;
237
+ sessionId: string;
238
+ createdAt: number;
239
+ lastAccessed: number;
240
+ bytes: number;
241
+ title?: string;
242
+ }
243
+ export interface SessionSnapshot {
244
+ messages: AgentMessage[];
245
+ vfs: Record<string, { content: string; mimeType?: string; updatedAt: number }>;
246
+ todos: { content: string; status: 'pending' | 'in_progress' | 'completed' }[];
247
+ memory: string;
248
+ }
249
+ export type StorageEvent =
250
+ | { type: 'degraded'; reason: string }
251
+ | { type: 'quota'; sessionBytes: number; limit: number }
252
+ | { type: 'evicted'; agentId: string; sessionId: string; bytes: number }
253
+ | { type: 'flush' };
254
+ export interface StorageBackend {
255
+ get(key: string): Promise<unknown | undefined>;
256
+ set(key: string, value: unknown): Promise<void>;
257
+ del(key: string): Promise<void>;
258
+ scan(prefix: string, cb: (key: string, value: unknown) => boolean | void): Promise<void>;
259
+ clearPrefix(prefix: string): Promise<void>;
260
+ }
261
+ export interface SessionStore {
262
+ ready: Promise<boolean>;
263
+ listSessions(agentId: string): Promise<SessionMeta[]>;
264
+ load(agentId: string, sessionId: string): Promise<SessionSnapshot | undefined>;
265
+ save(agentId: string, sessionId: string, snap: Partial<SessionSnapshot>): Promise<void>;
266
+ flush(): Promise<void>;
267
+ deleteSession(agentId: string, sessionId: string): Promise<void>;
268
+ createSession(agentId: string, title?: string, sessionId?: string): Promise<string>;
269
+ onEvent(cb: (e: StorageEvent) => void): void;
270
+ dispose(): void;
271
+ }
272
+ export interface SessionOptions {
273
+ id?: string;
274
+ autoResume?: boolean;
275
+ title?: string;
276
+ }
277
+
278
+ export interface ChatSdkOptions {
279
+ container?: string | HTMLElement;
280
+ /** UI:'default'(内置 ChatDialog)/ false(headless 不渲染,自建 UI) */
281
+ ui?: boolean | 'default';
282
+ llm: LLMConfig | ChatModelLike;
283
+ /** agent 实例 id(多 agent 共存隔离;不传则随机生成并告警,刷新后无法恢复) */
284
+ id?: string;
285
+ /** 持久化:默认关闭;赋值后端字符串('indexed'/'session'/'local'/'memory')或配置对象开启;false 关闭 */
286
+ storage?: StorageBackendType | StorageConfig | false;
287
+ /** 会话控制 */
288
+ session?: SessionOptions;
289
+ /** 共享上下文:默认 false;true 时同 id 复用同一核心(messages/agent/工作区) */
290
+ shareContext?: boolean;
291
+ systemPrompt?: string;
292
+ tools?: any[];
293
+ skills?: SkillSpec[];
294
+ memory?: string;
295
+ windowProps?: WindowPropSpec[];
296
+ permissions?: PermissionRule[];
297
+ /** 自定义中间件(注入到内置中间件之后;可拦截/观察模型调用、工具、prompt) */
298
+ middleware?: any[];
299
+ vfs?: { initialFiles?: Record<string, string>; maxBytes?: number };
300
+ /** 每个 window 属性最多保留快照数(默认 20) */
301
+ maxSnapshots?: number;
302
+ /** 内存中保留的对话轮数上限(默认 50);超限把最旧轮次压缩为摘要 system 消息(防 OOM);0 关闭 */
303
+ maxMemoryRounds?: number;
304
+ debug?: boolean;
305
+ maxToolRounds?: number;
306
+ /** 模型调用失败自动重试次数(默认 2;网络/429/5xx 重试,4xx 与 abort 不重试) */
307
+ maxRetries?: number;
308
+ /** 同轮工具并发上限(默认 1 串行) */
309
+ maxParallelTools?: number;
310
+ /** 模型上下文窗口(token);顶层声明对 llm 实例场景也生效,缺省按 model 名查表。影响 offload 阈值与压缩触发 */
311
+ contextWindow?: number;
312
+ /** 模型最大输出(token);顶层声明对 llm 实例场景也生效,缺省按 model 名查表 */
313
+ maxOutputTokens?: number;
314
+ /** 子 agent 委派(默认开启;{ enabled: false } 关闭) */
315
+ capabilities?: { windowOps?: boolean; fetch?: boolean; planning?: boolean; skills?: boolean; vfs?: boolean; summarization?: boolean; memory?: boolean; subagent?: boolean; verify?: boolean };
316
+ subagent?: { enabled?: boolean; allowedTools?: string[]; systemPrompt?: string; temperature?: number; maxTokens?: number; skills?: SkillSpec[]; llm?: LLMConfig | ChatModelLike; maxDepth?: number; maxParallel?: number };
317
+ /** 预声明子 agent 列表:每个用同主配置方式声明,自动生成 use_<id> 委派工具(与 spawn_agent 共存) */
318
+ subagents?: SubagentConfig[];
319
+ /** 自检:agent 返回前跑 check,不通过则 feedback 回灌自纠(默认关闭;需 capabilities.verify:true)。check 省略时默认 createWriteBackCheck 写后读回验证 */
320
+ verify?: { enabled?: boolean; check?: VerifyCheck; maxAttempts?: number; adversarial?: boolean };
321
+ /** 人工确认:工具调用前弹确认框,用户「允许/拒绝」后才执行(默认关闭,不传 = 不装) */
322
+ approval?: ApprovalOptions;
323
+ /** 会话级 checkpoint 回滚(回到上次正常时)。默认关闭;传 true 或 { maxCheckpoints?, auto? } 开启 */
324
+ checkpoint?: boolean | { maxCheckpoints?: number; auto?: boolean };
325
+ /** MCP server 列表(连远程 server 动态注入其 tools;浏览器仅 http/sse/websocket) */
326
+ mcp?: McpServerConfig[];
327
+ /** 上下文压缩配置(false 关闭;默认 LLM 摘要,失败回退索引摘要) */
328
+ contextOptions?: any;
329
+ /** 上下文压缩预设档位(默认 'auto'):auto / conservative / aggressive;提供合理默认,contextOptions 细参可覆盖 */
330
+ contextPreset?: 'auto' | 'conservative' | 'aggressive';
331
+ /** 摘要压缩专用 LLM(BaseChatModel 实例或 LLMConfig);不传则默认用主 agent 模型(llm) */
332
+ summaryLlm?: any;
333
+ /** 摘要 LLM 温度(默认 0.3) */
334
+ summaryTemperature?: number;
335
+ /** 摘要 LLM 输出上限(默认 1024) */
336
+ summaryMaxTokens?: number;
337
+ /** 摘要 LLM 超时毫秒(默认 15000;超时回退索引摘要) */
338
+ summaryTimeoutMs?: number;
339
+ /** 流式输出(默认 true);false 时等整段回复再显示 */
340
+ streaming?: boolean;
341
+ title?: string;
342
+ placeholder?: string;
343
+ }
344
+
345
+ export interface ChatSdk {
346
+ mount(): Promise<void>;
347
+ /** 响应式消息数组(headless 模式自建 UI 读) */
348
+ messages: AgentMessage[];
349
+ unmount(): void;
350
+ send(message: string): Promise<string>;
351
+ switchSession(sessionId?: string): Promise<string>;
352
+ stream: (messages: AgentMessage[], onEvent: StreamHandler, signal?: AbortSignal) => Promise<string>;
353
+ /** 检视 agent 详细信息(tools/skills/windowProps/middleware/todos) */
354
+ inspect(): AgentInfo;
355
+ /** 回退到最近一次正常 checkpoint(整体还原对话历史 + window 注册属性 + vfs + todos);需开启 checkpoint,无可用返回 false */
356
+ restoreLastCheckpoint(): boolean;
357
+ /** 列出可用 checkpoint(回退点);需开启 checkpoint,未开启返回空数组 */
358
+ listCheckpoints(): CheckpointMeta[];
359
+ }
360
+
361
+ export declare function createChatSdk(options: ChatSdkOptions): ChatSdk;
362
+ export declare function defineTool(opts: {
363
+ name: string;
364
+ description: string;
365
+ schema: any;
366
+ handler: (args: any) => unknown | Promise<unknown>;
367
+ }): any;
368
+ export declare function createWindowOps(props: WindowPropSpec[], opts?: WindowOpsOptions): any[];
369
+ export declare function selectBuiltinTools(caps: { windowOps?: boolean; fetch?: boolean } | undefined, windowOps: any[], fetchDocs: any[]): any[];
370
+ export declare function createUsageHintsMiddleware(caps: { planning?: boolean; windowOps?: boolean; subagent?: boolean } | undefined, hasWindowOps: boolean): any;
371
+ export declare const fetchDocTools: any[];
372
+ export declare const fetchTools: any[];
373
+ export declare function defineWindowToolset(props: WindowPropSpec[], opts?: WindowOpsOptions): any[];
374
+ export declare function defineSkill(spec: SkillSpec): SkillSpec;
375
+ export declare function createAgent(options: any): any;
376
+ export declare function createSubagentMiddleware(opts: any): any;
377
+ export declare function createVerifyMiddleware(opts: VerifyMiddlewareOptions): any;
378
+ export declare function createWriteBackCheck(opts?: WriteBackCheckOptions): VerifyCheck;
379
+ export declare const presets: Record<string, any>;
380
+ export declare function createSessionStore(config?: StorageConfig): SessionStore;
381
+ export declare function createMemoryBackend(): StorageBackend;
382
+ export declare function createWebStorageBackend(storage: Storage): StorageBackend;
383
+ export declare function isQuotaError(err: unknown): boolean;
384
+
385
+ // ============ 大 JSON 查询/搜索/沙箱脚本(windowQuery)============
386
+ export interface JpNode {
387
+ /** 相对属性根的点号路径(数组索引用数字,如 components.0.text) */
388
+ path: string;
389
+ /** 匹配元素值 */
390
+ value: unknown;
391
+ /** 父为数组时的索引(便于后续 edit_window_prop 的 jsonPath 定位) */
392
+ index?: number;
393
+ }
394
+ export interface SearchHit {
395
+ path: string;
396
+ key?: string;
397
+ value: string;
398
+ score?: number;
399
+ }
400
+ export type SearchMode = 'substring' | 'regex' | 'fuzzy';
401
+ export interface EvalResult {
402
+ ok: boolean;
403
+ result?: unknown;
404
+ error?: string;
405
+ elapsedMs: number;
406
+ }
407
+ /** JSONPath 查询(只读,无副作用);expr 子集:$ .key [n] ["key"] [*] [?(filter)] ..key ..* */
408
+ export declare function jpEval(root: unknown, expr: string): JpNode[];
409
+ /** 在 JSON 子树内搜索文本(substring/regex/fuzzy) */
410
+ export declare function searchJson(
411
+ root: unknown,
412
+ query: string,
413
+ opts?: { mode?: SearchMode; fuzzyThreshold?: number; matchKey?: boolean; limit?: number },
414
+ ): SearchHit[];
415
+ /** Web Worker 沙箱执行自定义 JS(无 window/document,禁 fetch/XHR/WebSocket/importScripts,超时可终止) */
416
+ export declare function runSandboxedScript(data: unknown, script: string, timeoutMs?: number): Promise<EvalResult>;
417
+
418
+ // ============ 工具报错(结构化 ERROR:{json},供 LLM 排查)============
419
+ export interface ToolErrorInput {
420
+ /** 机器可读错误码(大写蛇形,如 NOT_REGISTERED / SCHEMA_INVALID / JSON_PARSE / PATH_UNSAFE / NOT_OBJECT / PATCH_FAILED / JSONPATH_SYNTAX / REGEX_INVALID / SCRIPT_TIMEOUT / SCRIPT_ERROR / NOT_FOUND / NO_MATCH / AMBIGUOUS_MATCH) */
421
+ code: string;
422
+ /** 人类可读:具体发生了什么 */
423
+ message: string;
424
+ /** 建议的修复动作(可操作) */
425
+ hint?: string;
426
+ /** 相关属性路径 */
427
+ path?: string;
428
+ /** 额外结构化细节(zod issues / 匹配位置 / 实际值等) */
429
+ details?: unknown;
430
+ }
431
+ /** 格式化工具错误为 `ERROR: {json}` 字符串(单行 JSON,前缀 ERROR) */
432
+ export declare function toolError(e: ToolErrorInput): string;
433
+ /** zod 校验失败 → toolError(提取 issues 为 details) */
434
+ export declare function zodError(path: string, issues: unknown[]): string;
435
+ /** JSON 解析失败 → toolError(带原解析错误 + 预览) */
436
+ export declare function jsonParseError(path: string | undefined, raw: string, err: unknown): string;
437
+ /** 提取 zod issues 为结构化 details(每条 path/expected/received/message) */
438
+ export declare function formatZodIssues(issues: unknown[]): unknown[];