@kafca/agentdock 0.1.58 → 0.1.62
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 +18 -0
- package/dist/renderer/assets/AutomationList-BgJgAdVO.js +16 -0
- package/dist/renderer/assets/{Badge-BfY1VaHS.js → Badge-Bq2hPVcR.js} +1 -1
- package/dist/renderer/assets/{Card-DWA_Tww_.js → Card-BPJNSZce.js} +1 -1
- package/dist/renderer/assets/{Config-nHj3g1U5.js → Config-aSFqlI88.js} +2 -2
- package/dist/renderer/assets/Dashboard-D3ezFmb7.js +36 -0
- package/dist/renderer/assets/{EmptyState-zatDjLj_.js → EmptyState-DK496gBq.js} +1 -1
- package/dist/renderer/assets/{HighlightedMarkdown-CsM5n70d.js → HighlightedMarkdown-Ckre5jNv.js} +1 -1
- package/dist/renderer/assets/{Input-R1XdFK1K.js → Input-C5C1d0ba.js} +1 -1
- package/dist/renderer/assets/{KnowledgeDetail-Co5sxeGd.js → KnowledgeDetail-N8Ey1ikc.js} +2 -2
- package/dist/renderer/assets/{KnowledgeHome-DwziPw5m.js → KnowledgeHome-9aF8nJEf.js} +2 -2
- package/dist/renderer/assets/{Logs-NwZUtR_G.js → Logs-sgAdwEeS.js} +2 -2
- package/dist/renderer/assets/{Modal-CrcIwIFL.js → Modal-BB10hTRc.js} +3 -3
- package/dist/renderer/assets/{Page-Dp0obeSw.js → Page-DfC319Ck.js} +1 -1
- package/dist/renderer/assets/{Select-6mVQaf84.js → Select-RHJBmNER.js} +1 -1
- package/dist/renderer/assets/{ThreadChat-BFzbn3L6.js → ThreadChat-BU1zCdr4.js} +3 -3
- package/dist/renderer/assets/{Workspace-DCmo8BMm.js → Workspace-BoZCz7S8.js} +1 -1
- package/dist/renderer/assets/{arrow-left-9rjg_Hp4.js → arrow-left-D2V1eZSD.js} +1 -1
- package/dist/renderer/assets/{book-open-Bu8GCHnG.js → book-open-DUcBn7Bb.js} +1 -1
- package/dist/renderer/assets/{channels-BxVbG-6j.js → channels-DMhDSlf2.js} +2 -2
- package/dist/renderer/assets/{chevron-down-BE8uQmWM.js → chevron-down-Ca2FQDB7.js} +1 -1
- package/dist/renderer/assets/en-Bnr4nMzg.js +1 -0
- package/dist/renderer/assets/es-B1GIFh3i.js +1 -0
- package/dist/renderer/assets/{index-BIKL3fTP.css → index-B6WcpkJF.css} +1 -1
- package/dist/renderer/assets/{index-B7TeF6Es.js → index-BlnvlekJ.js} +1 -1
- package/dist/renderer/assets/index-DRJ5wgw_.js +162 -0
- package/dist/renderer/assets/ja-CDWPWqEW.js +1 -0
- package/dist/renderer/assets/{knowledge-Kl19SqGS.js → knowledge-D1-k56eY.js} +1 -1
- package/dist/renderer/assets/{pencil-CPB7SK1m.js → pencil-BhWdv_86.js} +1 -1
- package/dist/renderer/assets/{plus-Bt26z-4q.js → plus-BacLMlK3.js} +1 -1
- package/dist/renderer/assets/{save-Une7GMxT.js → save-Bpoxbzau.js} +1 -1
- package/dist/renderer/assets/{search-DE0agJjJ.js → search-BVJcpdFX.js} +1 -1
- package/dist/renderer/assets/{shield-check-De7xaXZh.js → shield-check-C2cw_Ip6.js} +1 -1
- package/dist/renderer/assets/{threads-BnsNL5ei.js → threads-DOsBQBg_.js} +1 -1
- package/dist/renderer/assets/{trash-2-6iGF59Ac.js → trash-2-Bs3rEm3g.js} +1 -1
- package/dist/renderer/assets/zh-MSddxMDX.js +1 -0
- package/dist/renderer/assets/zh-TW-C_LNWX0o.js +1 -0
- package/dist/renderer/index.html +2 -2
- package/dist-electron/electron/managed-skills/agent-browser/SKILL.md +41 -0
- package/dist-electron/electron/managed-skills/agent-browser/references/authentication.md +83 -0
- package/dist-electron/electron/managed-skills/agent-browser/references/commands.md +50 -0
- package/dist-electron/electron/managed-skills/agent-browser/references/profiling.md +20 -0
- package/dist-electron/electron/managed-skills/agent-browser/references/proxy-support.md +18 -0
- package/dist-electron/electron/managed-skills/agent-browser/references/session-management.md +17 -0
- package/dist-electron/electron/managed-skills/agent-browser/references/snapshot-refs.md +17 -0
- package/dist-electron/electron/managed-skills/agent-browser/references/video-recording.md +21 -0
- package/dist-electron/electron/managed-skills/agent-browser/templates/authenticated-session.sh +11 -0
- package/dist-electron/electron/managed-skills/agent-browser/templates/capture-workflow.sh +12 -0
- package/dist-electron/electron/managed-skills/agent-browser/templates/form-automation.sh +10 -0
- package/dist-electron/electron/managed-skills/condition-trigger/SKILL.md +21 -0
- package/dist-electron/electron/managed-skills/condition-trigger/scripts/register-condition-trigger.sh +106 -0
- package/dist-electron/electron/managed-skills/knowledge-base/SKILL.md +13 -0
- package/dist-electron/electron/managed-skills/knowledge-base/scripts/search-knowledge.sh +80 -0
- package/dist-electron/packages/contracts/src/automations.js +211 -0
- package/dist-electron/packages/contracts/src/index.js +1 -0
- package/dist-electron/packages/core-sdk/src/automations.js +87 -0
- package/dist-electron/packages/core-sdk/src/client.js +101 -0
- package/dist-electron/packages/core-sdk/src/index.js +2 -1
- package/dist-electron/services/local-ai-core/src/acp/store/automation-script-store.js +415 -0
- package/dist-electron/services/local-ai-core/src/acp/store/automation-store.js +829 -0
- package/dist-electron/services/local-ai-core/src/acp/store/local-core-acp-store.js +158 -0
- package/dist-electron/services/local-ai-core/src/acp/store/schema.js +81 -0
- package/dist-electron/services/local-ai-core/src/automation/automation-action-executor.js +144 -0
- package/dist-electron/services/local-ai-core/src/automation/automation-condition-engine.js +79 -0
- package/dist-electron/services/local-ai-core/src/automation/automation-conversation-executor.js +39 -73
- package/dist-electron/services/local-ai-core/src/automation/automation-monitor-service.js +695 -260
- package/dist-electron/services/local-ai-core/src/automation/automation-script-service.js +507 -0
- package/dist-electron/services/local-ai-core/src/automation/automation-service.js +1019 -0
- package/dist-electron/services/local-ai-core/src/automation/automation-trigger-engine.js +141 -0
- package/dist-electron/services/local-ai-core/src/automation/condition-evaluator.js +60 -17
- package/dist-electron/services/local-ai-core/src/automation/legacy-automation-mappers.js +286 -0
- package/dist-electron/services/local-ai-core/src/automation/scripts/anthropic-sandbox-runner.js +792 -0
- package/dist-electron/services/local-ai-core/src/automation/scripts/sandbox-runner.js +2 -0
- package/dist-electron/services/local-ai-core/src/automation/scripts/script-package.js +475 -0
- package/dist-electron/services/local-ai-core/src/automation/scripts/script-protocol-runner.js +266 -0
- package/dist-electron/services/local-ai-core/src/automation/scripts/secret-resolver.js +37 -0
- package/dist-electron/services/local-ai-core/src/channel/weixin/inbound-poller.js +1 -2
- package/dist-electron/services/local-ai-core/src/channel/weixin/transport.js +9 -8
- package/dist-electron/services/local-ai-core/src/cli/lac.js +229 -0
- package/dist-electron/services/local-ai-core/src/kernel/bootstrap.js +21 -0
- package/dist-electron/services/local-ai-core/src/runtime/deployment-diagnostics.js +76 -0
- package/dist-electron/services/local-ai-core/src/runtime/handlers/automations-handler.js +322 -0
- package/dist-electron/services/local-ai-core/src/runtime/local-core-controller.js +20 -0
- package/dist-electron/services/local-ai-core/src/runtime/managed-skill-catalog.js +37 -0
- package/dist-electron/services/local-ai-core/src/runtime/server-helpers.js +14 -4
- package/dist-electron/services/local-ai-core/src/runtime/server-routes.js +75 -0
- package/dist-electron/services/local-ai-core/src/runtime/server.js +21 -0
- package/dist-electron/services/local-ai-core/src/runtime/standalone.js +1 -0
- package/dist-electron/services/local-ai-core/src/scheduler/cron.js +151 -39
- package/dist-electron/services/local-ai-core/src/scheduler/scheduled-conversation-executor.js +2 -4
- package/dist-electron/services/local-ai-core/src/scheduler/scheduled-job-application-service.js +64 -12
- package/dist-electron/services/local-ai-core/src/scheduler/scheduler-service.js +71 -4
- package/dist-electron/services/local-ai-core/src/scheduler/thread-resolution.js +10 -0
- package/dist-electron/services/local-ai-core/src/thread/agent-message-policy.js +16 -1
- package/dist-electron/src/pages/Automation/automation-page-model.js +76 -0
- package/dist-electron/tests/contracts/agent-message-policy.test.js +32 -0
- package/dist-electron/tests/contracts/architecture-docs.test.js +30 -0
- package/dist-electron/tests/contracts/automation-contracts.test.js +154 -0
- package/dist-electron/tests/contracts/automation-renderer-model.test.js +47 -0
- package/dist-electron/tests/electron/automation-action-executor.test.js +75 -0
- package/dist-electron/tests/electron/automation-compatibility.test.js +463 -0
- package/dist-electron/tests/electron/automation-deployment.test.js +66 -0
- package/dist-electron/tests/electron/automation-engine.test.js +264 -0
- package/dist-electron/tests/electron/automation-monitor.test.js +1333 -0
- package/dist-electron/tests/electron/automation-sandbox-runner.test.js +333 -0
- package/dist-electron/tests/electron/automation-script-approval.test.js +553 -0
- package/dist-electron/tests/electron/automation-script-package.test.js +499 -0
- package/dist-electron/tests/electron/automation-script-runner.test.js +120 -0
- package/dist-electron/tests/electron/automation-service.test.js +1078 -0
- package/dist-electron/tests/electron/automation-store.test.js +593 -0
- package/dist-electron/tests/electron/condition-trigger-skill.test.js +93 -0
- package/dist-electron/tests/electron/core-client.test.js +99 -0
- package/dist-electron/tests/electron/lac-cli.test.js +110 -0
- package/dist-electron/tests/electron/workspace-task-store.test.js +25 -0
- package/dist-electron/tests/integration/automation-routes.test.js +186 -0
- package/dist-electron/tests/integration/automation-sandbox-runtime.test.js +92 -0
- package/package.json +5 -6
- package/dist/renderer/assets/CronList-BwkA_I7v.js +0 -1
- package/dist/renderer/assets/Dashboard-D0_A7k02.js +0 -41
- package/dist/renderer/assets/MonitorList-CS1uLS5A.js +0 -1
- package/dist/renderer/assets/en-CmAr_0e6.js +0 -1
- package/dist/renderer/assets/es-Cs9x52ca.js +0 -1
- package/dist/renderer/assets/index-BkI9POxj.js +0 -167
- package/dist/renderer/assets/ja-DtvtBRTW.js +0 -1
- package/dist/renderer/assets/play-DGAO4OCu.js +0 -6
- package/dist/renderer/assets/zh-CcJ9vBZj.js +0 -1
- package/dist/renderer/assets/zh-TW-elI72AC1.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e={dashboard:"ダッシュボード",chat:"チャット",chatDesktop:"デスクトップチャット",chatWeb:"チャット",workspace:"ワークスペース",knowledge:"ナレッジ",projects:"プロジェクト",sessions:"セッション",cron:"Cron",automations:"自動化",bridge:"ブリッジ",system:"システム"},t={title:"ダッシュボード",version:"バージョン",uptime:"稼働時間",platforms:"プラットフォーム",projects:"プロジェクト",bridgeAdapters:"ブリッジアダプター",noData:"データがありません"},o={title:"プロジェクト",name:"名前",agent:"エージェント",platforms:"プラットフォーム",sessions:"セッション",heartbeat:"ハートビート",settings:"設定",quiet:"サイレントモード",language:"言語",adminFrom:"管理元",disabledCommands:"無効化したコマンド",save:"保存",detail:"詳細",noProjects:"プロジェクトが設定されていません",tabs:{overview:"概要",providers:"プロバイダー",sandbox:"サンドボックス",heartbeat:"ハートビート",settings:"設定"}},s={title:"セッション",id:"ID",sessionKey:"セッションキー",name:"名前",platform:"プラットフォーム",active:"アクティブ",createdAt:"作成日時",history:"履歴",send:"送信",messageInput:"メッセージ",delete:"削除",noSessions:"セッションがありません",noMessages:"メッセージはまだありません",notLiveHint:"この相手は現在オフラインのため、今は返信できません。新しいアクティビティが届くと送信可能に戻ります。",offline:"オフライン",justNow:"たった今",allProjects:"すべてのプロジェクト",chat:"チャット",enterSession:"セッションを開く",newChat:"新しいチャット",selectProject:"プロジェクトを選択",projectRequired:"チャットを開始する前にプロジェクトを選択してください。",noAvailableChatTarget:"このプロジェクトにはまだすぐ使える会話がありません。先にセッション一覧から利用可能な会話を開いてください。",noReadyChats:"すぐに使える会話はありません。履歴はセッション一覧で確認してください。",emptyProject:"このプロジェクトにはまだセッションがありません。",emptySelection:"プロジェクトを選び、新しいチャットを開始してください。",activeChat:"現在のチャット",sendHint:"メッセージは選択中のプロジェクトに送信されます。",waitingForReply:"アシスタントの返信を待っています…",preparingChat:"チャットを準備しています…",pollTimeout:"更新のタイムアウト前に応答が完了しませんでした。",createFailed:"新しいチャットセッションの作成に失敗しました。",loadFailed:"選択したセッションの読み込みに失敗しました。",sendFailed:"メッセージの送信に失敗しました。",sessionUnavailable:"この相手は現在オフラインのため、今は返信できません。新しいアクティビティが届いてから再試行してください。",deleteConfirmTitle:"セッションを削除",deleteConfirmBody:"選択したセッションの保存済み会話履歴を削除します。",renameTitle:"セッション名を変更",renamePlaceholder:"セッション名",loadSession:"開く",historyTitle:"会話履歴",availableNow:"送信可能",waitingActivation:"利用可能になるのを待機中"},a={title:"プロバイダー",name:"名前",model:"モデル",baseUrl:"ベース URL",active:"有効",add:"プロバイダーを追加",remove:"削除",activate:"有効化",setModel:"モデルを設定",models:"利用可能なモデル"},n={title:"スケジュールジョブ",expression:"Cron 式",prompt:"プロンプト",exec:"実行",description:"説明",enabled:"有効",silent:"サイレント",lastRun:"最終実行",lastError:"最後のエラー",add:"ジョブを追加",delete:"削除",noJobs:"スケジュールジョブがありません",workDir:"作業ディレクトリ",sessionKey:"セッションキー",project:"プロジェクト"},i={title:"ハートビート",status:"状態",interval:"間隔",paused:"一時停止",running:"実行中",pause:"一時停止",resume:"再開",trigger:"今すぐ実行",setInterval:"間隔を設定",runCount:"実行回数",errorCount:"エラー回数",skippedBusy:"スキップ(ビジー)",lastRun:"最終実行"},r={title:"ブリッジ",platform:"プラットフォーム",capabilities:"機能",connectedAt:"接続日時",noAdapters:"ブリッジアダプターがありません"},l={title:"システム",config:"設定",logs:"ログ",restart:"再起動",reload:"設定の再読み込み",restartConfirm:"サービスを再起動しますか?アクティブなセッションが中断される場合があります。",reloadConfirm:"ディスクから設定を再読み込みしますか?",level:"ログレベル",limit:"行数の上限"},c={title:"AgentDock",subtitle:"AgentDock インスタンスに接続",token:"API トークン",serverUrl:"サーバー URL",connect:"接続",invalidToken:"トークンが無効または期限切れです",logout:"ログアウト"},d={loading:"読み込み中…",error:"エラー",success:"成功",confirm:"確認",cancel:"キャンセル",save:"保存",delete:"削除",back:"戻る",refresh:"更新",search:"検索",noData:"データなし",actions:"操作",viewAll:"すべて表示",optional:"任意",confirmDelete:"本当に削除しますか?"},p={title:"自動化",description:"スケジュール、監視、スクリプト条件の自動化を一元管理します。",refresh:"更新",all:"すべての自動化",native:"ネイティブ",cron:"Cron インポート",monitor:"監視インポート",empty:"自動化がありません",active:"有効",paused:"一時停止",blocked:"ブロック済み",activation:"起動",condition:"条件",workspace:"ワークスペース",lastEvaluation:"前回の評価",lastRun:"前回の実行",check:"今すぐ確認",pause:"一時停止",enable:"有効化",detail:"詳細",scriptApprovals:"スクリプト承認",reviewApproval:"確認"},m={light:"ライト",dark:"ダーク",system:"システムに合わせる"},v={nav:e,dashboard:t,projects:o,sessions:s,providers:a,cron:n,heartbeat:i,bridge:r,system:l,login:c,common:d,automations:p,theme:m};export{p as automations,r as bridge,d as common,n as cron,t as dashboard,v as default,i as heartbeat,c as login,e as nav,o as projects,a as providers,s as sessions,l as system,m as theme};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z as n,Z as l}from"./index-
|
|
1
|
+
import{z as n,Z as l}from"./index-DRJ5wgw_.js";function c(){return n("GET","/knowledge/config")}function f(){return n("GET","/knowledge/folders")}function g(e){return n("POST","/knowledge/folders",e)}function i(e,o){return n("PATCH",`/knowledge/folders/${encodeURIComponent(e)}`,o)}function w(e){return n("DELETE",`/knowledge/folders/${encodeURIComponent(e)}`)}function u(){return n("GET","/knowledge/bases")}function p(e){return n("POST","/knowledge/bases",e)}function E(e){return n("GET",`/knowledge/bases/${encodeURIComponent(e)}`)}function k(e,o){return n("PATCH",`/knowledge/bases/${encodeURIComponent(e)}`,o)}function m(e){return n("DELETE",`/knowledge/bases/${encodeURIComponent(e)}`)}function C(e){return n("GET",`/knowledge/bases/${encodeURIComponent(e)}/files`)}async function K(e,o){const s=new FormData;s.append("collection",o.collection),s.append("knowledgebase_id",e),o.folder&&s.append("folder",o.folder),o.files.forEach(a=>{s.append("files",a,a.name)});const d=await fetch(`${l}/knowledge/bases/${encodeURIComponent(e)}/files`,{method:"POST",body:s}),t=await d.json();if(!d.ok||!t.ok)throw new Error(t.error||`Local AI Core upload failed: ${d.status}`);return t.data}function T(e,o){return n("DELETE",`/knowledge/bases/${encodeURIComponent(e)}/files/${encodeURIComponent(o)}`)}function b(e,o){return n("POST",`/knowledge/bases/${encodeURIComponent(e)}/search`,o)}export{f as a,p as b,g as c,w as d,k as e,m as f,c as g,E as h,C as i,K as j,T as k,u as l,b as s,i as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z as t,
|
|
1
|
+
import{z as t,D as r}from"./index-DRJ5wgw_.js";function s(){return t("GET","/workspaces")}function a(e){return t("GET",`/threads${r({workspace_id:e})}`)}function d(e,n){return t("POST","/threads",{workspaceId:e,title:n})}function u(e){return t("GET",`/threads/${encodeURIComponent(e)}`)}function c(e,n){return t("PATCH",`/threads/${encodeURIComponent(e)}`,{title:n})}function i(e,n){return t("PATCH",`/threads/${encodeURIComponent(e)}/knowledge-bases`,{knowledgeBaseIds:n})}function T(e,n){return t("PATCH",`/threads/${encodeURIComponent(e)}/mode`,{mode:n})}function p(e){return t("DELETE",`/threads/${encodeURIComponent(e)}`)}function h(e,n){return t("POST",`/threads/${encodeURIComponent(e)}/messages`,{content:n})}function m(e,n){return t("POST",`/threads/${encodeURIComponent(e)}/actions`,{content:n})}function f(e){return t("POST",`/runs/${encodeURIComponent(e)}/interrupt`)}export{a,i as b,d as c,h as d,p as e,u as g,f as i,s as l,c as r,m as s,T as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e={dashboard:"概览",chat:"聊天",chatDesktop:"桌面聊天",chatWeb:"聊天",workspace:"工作区",knowledge:"知识库",projects:"项目",sessions:"会话",cron:"定时任务",monitors:"监控任务",automations:"自动化",bridge:"桥接",system:"系统"},t={title:"概览",version:"版本",uptime:"运行时间",platforms:"平台",projects:"项目",bridgeAdapters:"桥接适配器",noData:"暂无数据"},o={title:"项目",name:"名称",agent:"智能体",platforms:"平台",sessions:"会话",heartbeat:"心跳",settings:"设置",quiet:"静默模式",language:"语言",adminFrom:"管理来源",disabledCommands:"已禁用命令",save:"保存",detail:"详情",noProjects:"尚未配置项目",tabs:{overview:"概览",providers:"服务商",sandbox:"沙箱",heartbeat:"心跳",settings:"设置"}},s={title:"会话",id:"编号",sessionKey:"会话键",name:"名称",platform:"平台",active:"活跃",createdAt:"创建时间",history:"历史",send:"发送",messageInput:"消息",delete:"删除",noSessions:"暂无会话",noMessages:"暂无消息",notLiveHint:"当前聊天对象现在不在线,暂时不能继续回复。等有新消息进来后,这里会自动恢复可发送。",offline:"离线",justNow:"刚刚",allProjects:"全部项目",chat:"对话",enterSession:"进入会话",newChat:"新建聊天",selectProject:"选择项目",projectRequired:"开始聊天前请先选择一个项目。",noAvailableChatTarget:"当前项目还没有可直接聊天的会话,请先从会话列表打开一个可用会话。",noReadyChats:"当前没有可立即聊天的会话,请到“会话”页查看历史记录。",emptyProject:"这个项目下还没有任何会话。",emptySelection:"选择一个项目,然后开始新的聊天。",activeChat:"当前聊天",sendHint:"消息会发送到当前选中的项目。",waitingForReply:"正在等待助手回复…",preparingChat:"正在准备聊天…",pollTimeout:"刷新超时前未收到完整回复。",createFailed:"创建新聊天会话失败。",loadFailed:"加载所选会话失败。",sendFailed:"发送消息失败。",sessionUnavailable:"当前聊天对象现在不在线,暂时不能继续回复。等有新消息进来后再试。",deleteConfirmTitle:"删除会话",deleteConfirmBody:"这会移除该会话保存的历史对话。",renameTitle:"重命名会话",renamePlaceholder:"会话名称",loadSession:"打开",historyTitle:"历史会话",availableNow:"可发送消息",waitingActivation:"等待激活"},a={title:"模型提供方",name:"名称",model:"模型",baseUrl:"基础 URL",active:"当前使用",add:"添加提供方",remove:"移除",activate:"启用",setModel:"设置模型",models:"可用模型"},n={title:"定时任务",expression:"Cron 表达式",prompt:"提示词",exec:"执行",description:"描述",enabled:"已启用",silent:"静默",lastRun:"上次运行",lastError:"上次错误",add:"添加任务",delete:"删除",noJobs:"暂无定时任务",workDir:"工作目录",sessionKey:"会话键",project:"项目"},i={title:"监控任务",prompt:"提示词",condition:"触发条件",cooldown:"冷却时间(分钟)",enabled:"已启用",lastRun:"上次触发",add:"添加监控",edit:"编辑监控",run:"立即执行",noMonitors:"暂无监控任务",monitorTitle:"标题"},r={title:"心跳",status:"状态",interval:"间隔",paused:"已暂停",running:"运行中",pause:"暂停",resume:"恢复",trigger:"立即执行",setInterval:"设置间隔",runCount:"执行次数",errorCount:"错误次数",skippedBusy:"跳过(忙碌)",lastRun:"上次运行"},l={title:"桥接",platform:"平台",capabilities:"能力",connectedAt:"连接时间",noAdapters:"暂无桥接适配器"},c={title:"系统",config:"配置",logs:"日志",restart:"重启",reload:"重载配置",restartConfirm:"确定要重启服务吗?进行中的会话可能会中断。",reloadConfirm:"从磁盘重新加载配置?",level:"日志级别",limit:"行数限制"},d={title:"AgentDock",subtitle:"连接到您的 AgentDock 实例",token:"API 令牌",serverUrl:"服务器地址",connect:"连接",invalidToken:"令牌无效或已过期",logout:"退出登录"},p={loading:"加载中…",error:"错误",success:"成功",confirm:"确认",cancel:"取消",save:"保存",delete:"删除",back:"返回",refresh:"刷新",search:"搜索",noData:"无数据",actions:"操作",viewAll:"查看全部",optional:"可选",confirmDelete:"确定要删除吗?"},m={title:"自动化",description:"在同一处管理定时、监控和脚本条件自动化。",refresh:"刷新",all:"全部自动化",native:"原生",cron:"定时任务导入",monitor:"监控任务导入",empty:"没有自动化任务",active:"运行中",paused:"已暂停",blocked:"已阻止",activation:"触发器",condition:"条件",workspace:"工作区",lastEvaluation:"最近评估",lastRun:"最近执行",check:"立即检查",pause:"暂停",enable:"启用",detail:"详情",scriptApprovals:"脚本审批",reviewApproval:"审批"},v={light:"浅色",dark:"深色",system:"跟随系统"},u={nav:e,dashboard:t,projects:o,sessions:s,providers:a,cron:n,monitors:i,heartbeat:r,bridge:l,system:c,login:d,common:p,automations:m,theme:v};export{m as automations,l as bridge,p as common,n as cron,t as dashboard,u as default,r as heartbeat,d as login,i as monitors,e as nav,o as projects,a as providers,s as sessions,c as system,v as theme};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e={dashboard:"總覽",chat:"聊天",chatDesktop:"桌面聊天",chatWeb:"聊天",workspace:"工作區",knowledge:"知識庫",projects:"專案",sessions:"工作階段",cron:"排程工作",automations:"自動化",bridge:"橋接",system:"系統"},t={title:"總覽",version:"版本",uptime:"運作時間",platforms:"平台",projects:"專案",bridgeAdapters:"橋接介接器",noData:"尚無資料"},o={title:"專案",name:"名稱",agent:"智慧代理",platforms:"平台",sessions:"工作階段",heartbeat:"心跳",settings:"設定",quiet:"靜音模式",language:"語言",adminFrom:"管理來源",disabledCommands:"已停用指令",save:"儲存",detail:"詳細資料",noProjects:"尚未設定專案",tabs:{overview:"總覽",providers:"供應商",sandbox:"沙箱",heartbeat:"心跳",settings:"設定"}},s={title:"工作階段",id:"編號",sessionKey:"工作階段金鑰",name:"名稱",platform:"平台",active:"使用中",createdAt:"建立時間",history:"歷程",send:"傳送",messageInput:"訊息",delete:"刪除",noSessions:"尚無工作階段",noMessages:"暫無訊息",notLiveHint:"目前這個聊天對象不在線上,暫時無法繼續回覆。等有新訊息進來後,這裡會自動恢復可傳送。",offline:"離線",justNow:"剛剛",allProjects:"全部專案",chat:"對話",enterSession:"進入工作階段",newChat:"新增聊天",selectProject:"選擇專案",projectRequired:"開始聊天前請先選擇一個專案。",noAvailableChatTarget:"這個專案目前還沒有可直接聊天的對話,請先從工作階段頁面開啟一個可用對話。",noReadyChats:"目前沒有可立即聊天的對話,請到「工作階段」頁面查看歷史記錄。",emptyProject:"這個專案下還沒有任何工作階段。",emptySelection:"選擇一個專案,然後開始新的聊天。",activeChat:"目前聊天",sendHint:"訊息會傳送到目前選取的專案。",waitingForReply:"正在等待助手回覆…",preparingChat:"正在準備聊天…",pollTimeout:"在重新整理逾時前尚未收到完整回覆。",createFailed:"建立新聊天工作階段失敗。",loadFailed:"載入所選工作階段失敗。",sendFailed:"傳送訊息失敗。",sessionUnavailable:"目前這個聊天對象不在線上,暫時無法繼續回覆。等有新訊息進來後再試一次。",deleteConfirmTitle:"刪除工作階段",deleteConfirmBody:"這會移除該工作階段儲存的歷史對話。",renameTitle:"重新命名工作階段",renamePlaceholder:"工作階段名稱",loadSession:"開啟",historyTitle:"歷史工作階段",availableNow:"可傳送訊息",waitingActivation:"等待啟用"},a={title:"模型供應商",name:"名稱",model:"模型",baseUrl:"基礎 URL",active:"使用中",add:"新增供應商",remove:"移除",activate:"啟用",setModel:"設定模型",models:"可用模型"},n={title:"排程工作",expression:"Cron 運算式",prompt:"提示詞",exec:"執行",description:"說明",enabled:"已啟用",silent:"靜音",lastRun:"上次執行",lastError:"上次錯誤",add:"新增工作",delete:"刪除",noJobs:"尚無排程工作",workDir:"工作目錄",sessionKey:"工作階段金鑰",project:"專案"},i={title:"心跳",status:"狀態",interval:"間隔",paused:"已暫停",running:"執行中",pause:"暫停",resume:"繼續",trigger:"立即執行",setInterval:"設定間隔",runCount:"執行次數",errorCount:"錯誤次數",skippedBusy:"略過(忙碌)",lastRun:"上次執行"},r={title:"橋接",platform:"平台",capabilities:"能力",connectedAt:"連線時間",noAdapters:"尚無橋接介接器"},l={title:"系統",config:"設定",logs:"記錄",restart:"重新啟動",reload:"重新載入設定",restartConfirm:"確定要重新啟動服務嗎?進行中的工作階段可能會中斷。",reloadConfirm:"從磁碟重新載入設定?",level:"記錄層級",limit:"筆數上限"},c={title:"AgentDock",subtitle:"連線至您的 AgentDock 執行個體",token:"API 權杖",serverUrl:"伺服器位址",connect:"連線",invalidToken:"權杖無效或已過期",logout:"登出"},d={loading:"載入中…",error:"錯誤",success:"成功",confirm:"確認",cancel:"取消",save:"儲存",delete:"刪除",back:"返回",refresh:"重新整理",search:"搜尋",noData:"無資料",actions:"操作",viewAll:"檢視全部",optional:"選填",confirmDelete:"確定要刪除嗎?"},p={title:"自動化",description:"在同一處管理排程、監控與腳本條件自動化。",refresh:"重新整理",all:"所有自動化",native:"原生",cron:"排程匯入",monitor:"監控匯入",empty:"找不到自動化",active:"啟用中",paused:"已暫停",blocked:"已封鎖",activation:"觸發",condition:"條件",workspace:"工作區",lastEvaluation:"最近評估",lastRun:"最近執行",check:"立即檢查",pause:"暫停",enable:"啟用",detail:"詳細資料",scriptApprovals:"指令碼核准",reviewApproval:"核准"},m={light:"淺色",dark:"深色",system:"跟隨系統"},v={nav:e,dashboard:t,projects:o,sessions:s,providers:a,cron:n,heartbeat:i,bridge:r,system:l,login:c,common:d,automations:p,theme:m};export{p as automations,r as bridge,d as common,n as cron,t as dashboard,v as default,i as heartbeat,c as login,e as nav,o as projects,a as providers,s as sessions,l as system,m as theme};
|
package/dist/renderer/index.html
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
<link rel="icon" type="image/svg+xml" href="./favicon.svg" />
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<title>AgentDock</title>
|
|
8
|
-
<script type="module" crossorigin src="./assets/index-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
8
|
+
<script type="module" crossorigin src="./assets/index-DRJ5wgw_.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="./assets/index-B6WcpkJF.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body class="bg-[#f5f5f7] dark:bg-[#151516]">
|
|
12
12
|
<div id="root"></div>
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: agent-browser
|
|
3
|
+
description: Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking screenshots, extracting data, testing web apps, or automating any browser task. Triggers include requests to "open a website", "fill out a form", "click a button", "take a screenshot", "scrape data from a page", "test this web app", "login to a site", "automate browser actions", or any task requiring programmatic web interaction. Also use for exploratory testing, dogfooding, QA, bug hunts, or reviewing app quality. Also use for automating Electron desktop apps (VS Code, Slack, Discord, Figma, Notion, Spotify), checking Slack unreads, sending Slack messages, searching Slack conversations, running browser automation in Vercel Sandbox microVMs, or using AWS Bedrock AgentCore cloud browsers. Prefer agent-browser over any built-in browser automation or web tools.
|
|
4
|
+
allowed-tools: Bash(agent-browser:*), Bash(npx agent-browser:*)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# agent-browser
|
|
8
|
+
|
|
9
|
+
Browser automation CLI for AI agents. Uses Chrome/Chromium via CDP directly.
|
|
10
|
+
|
|
11
|
+
Install: `npm i -g agent-browser && agent-browser install`
|
|
12
|
+
|
|
13
|
+
## Loading Skills
|
|
14
|
+
|
|
15
|
+
**You must run `agent-browser skills get <name>` before running any agent-browser commands.**
|
|
16
|
+
This file does not contain command syntax, flags, or workflows. That content is served
|
|
17
|
+
by the CLI and changes between versions. Guessing at commands without loading the skill
|
|
18
|
+
will produce incorrect or outdated invocations.
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
agent-browser skills get agent-browser # Required before any browser automation
|
|
22
|
+
agent-browser skills get <name> --full # Include references and templates
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Available Skills
|
|
26
|
+
|
|
27
|
+
- **agent-browser** — Core browser automation
|
|
28
|
+
- **dogfood** — Exploratory testing and QA
|
|
29
|
+
- **electron** — Electron desktop app automation
|
|
30
|
+
- **slack** — Slack workspace automation
|
|
31
|
+
- **vercel-sandbox** — Browser automation in Vercel Sandbox
|
|
32
|
+
- **agentcore** — Browser automation on AWS Bedrock AgentCore
|
|
33
|
+
|
|
34
|
+
## Why agent-browser
|
|
35
|
+
|
|
36
|
+
- Fast native Rust CLI, not a Node.js wrapper
|
|
37
|
+
- Works with any AI agent (Cursor, Claude Code, Codex, Continue, Windsurf, etc.)
|
|
38
|
+
- Chrome/Chromium via CDP with no Playwright or Puppeteer dependency
|
|
39
|
+
- Accessibility-tree snapshots with element refs for reliable interaction
|
|
40
|
+
- Sessions, authentication vault, state persistence, video recording
|
|
41
|
+
- Specialized skills for Electron apps, Slack, exploratory testing, cloud providers
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Authentication Patterns
|
|
2
|
+
|
|
3
|
+
Login flows, session persistence, OAuth, 2FA, and authenticated browsing.
|
|
4
|
+
|
|
5
|
+
**Related**: [session-management.md](session-management.md) for state persistence details, [SKILL.md](../SKILL.md) for quick start.
|
|
6
|
+
|
|
7
|
+
## Contents
|
|
8
|
+
|
|
9
|
+
- [Import Auth from Your Browser](#import-auth-from-your-browser)
|
|
10
|
+
- [Persistent Profiles](#persistent-profiles)
|
|
11
|
+
- [Session Persistence](#session-persistence)
|
|
12
|
+
- [Basic Login Flow](#basic-login-flow)
|
|
13
|
+
- [Saving Authentication State](#saving-authentication-state)
|
|
14
|
+
- [Restoring Authentication](#restoring-authentication)
|
|
15
|
+
- [OAuth / SSO Flows](#oauth--sso-flows)
|
|
16
|
+
- [Two-Factor Authentication](#two-factor-authentication)
|
|
17
|
+
- [HTTP Basic Auth](#http-basic-auth)
|
|
18
|
+
- [Cookie-Based Auth](#cookie-based-auth)
|
|
19
|
+
- [Token Refresh Handling](#token-refresh-handling)
|
|
20
|
+
- [Security Best Practices](#security-best-practices)
|
|
21
|
+
|
|
22
|
+
## Import Auth from Your Browser
|
|
23
|
+
|
|
24
|
+
The fastest way to authenticate is to reuse cookies from a Chrome session you are already logged into.
|
|
25
|
+
|
|
26
|
+
**Step 1: Start Chrome with remote debugging**
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# macOS
|
|
30
|
+
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --remote-debugging-port=9222
|
|
31
|
+
|
|
32
|
+
# Linux
|
|
33
|
+
google-chrome --remote-debugging-port=9222
|
|
34
|
+
|
|
35
|
+
# Windows
|
|
36
|
+
"C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Log in to your target site(s) in this Chrome window as you normally would.
|
|
40
|
+
|
|
41
|
+
> **Security note:** `--remote-debugging-port` exposes full browser control on localhost. Any local process can connect and read cookies, execute JS, etc. Only use on trusted machines and close Chrome when done.
|
|
42
|
+
|
|
43
|
+
**Step 2: Grab the auth state**
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# Auto-discover the running Chrome and save its cookies + localStorage
|
|
47
|
+
agent-browser --auto-connect state save ./my-auth.json
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**Step 3: Reuse in automation**
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# Load auth at launch
|
|
54
|
+
agent-browser --state ./my-auth.json open https://app.example.com/dashboard
|
|
55
|
+
|
|
56
|
+
# Or load into an existing session
|
|
57
|
+
agent-browser state load ./my-auth.json
|
|
58
|
+
agent-browser open https://app.example.com/dashboard
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
This works for any site, including those with complex OAuth flows, SSO, or 2FA -- as long as Chrome already has valid session cookies.
|
|
62
|
+
|
|
63
|
+
> **Security note:** State files contain session tokens in plaintext. Add them to `.gitignore`, delete when no longer needed, and set `AGENT_BROWSER_ENCRYPTION_KEY` for encryption at rest. See [Security Best Practices](#security-best-practices).
|
|
64
|
+
|
|
65
|
+
**Tip:** Combine with `--session-name` so the imported auth auto-persists across restarts:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
agent-browser --session-name myapp state load ./my-auth.json
|
|
69
|
+
# From now on, state is auto-saved/restored for "myapp"
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Persistent Profiles
|
|
73
|
+
|
|
74
|
+
Use `--profile` to point agent-browser at a Chrome user data directory. This persists everything (cookies, IndexedDB, service workers, cache) across browser restarts without explicit save/load:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
# First run: login once
|
|
78
|
+
agent-browser --profile ~/.myapp-profile open https://app.example.com/login
|
|
79
|
+
# ... complete login flow ...
|
|
80
|
+
|
|
81
|
+
# All subsequent runs: already authenticated
|
|
82
|
+
agent-browser --profile ~/.myapp-profile open https://app.example.com/dashboard
|
|
83
|
+
```
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Command Reference
|
|
2
|
+
|
|
3
|
+
Complete reference for all agent-browser commands. For quick start and common patterns, see SKILL.md.
|
|
4
|
+
|
|
5
|
+
## Navigation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
agent-browser open <url> # Navigate to URL (aliases: goto, navigate)
|
|
9
|
+
# Supports: https://, http://, file://, about:, data://
|
|
10
|
+
# Auto-prepends https:// if no protocol given
|
|
11
|
+
agent-browser back # Go back
|
|
12
|
+
agent-browser forward # Go forward
|
|
13
|
+
agent-browser reload # Reload page
|
|
14
|
+
agent-browser close # Close browser (aliases: quit, exit)
|
|
15
|
+
agent-browser connect 9222 # Connect to browser via CDP port
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Snapshot (page analysis)
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
agent-browser snapshot # Full accessibility tree
|
|
22
|
+
agent-browser snapshot -i # Interactive elements only (recommended)
|
|
23
|
+
agent-browser snapshot -c # Compact output
|
|
24
|
+
agent-browser snapshot -d 3 # Limit depth to 3
|
|
25
|
+
agent-browser snapshot -s "#main" # Scope to CSS selector
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Interactions (use @refs from snapshot)
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
agent-browser click @e1 # Click
|
|
32
|
+
agent-browser click @e1 --new-tab # Click and open in new tab
|
|
33
|
+
agent-browser dblclick @e1 # Double-click
|
|
34
|
+
agent-browser focus @e1 # Focus element
|
|
35
|
+
agent-browser fill @e2 "text" # Clear and type
|
|
36
|
+
agent-browser type @e2 "text" # Type without clearing
|
|
37
|
+
agent-browser press Enter # Press key (alias: key)
|
|
38
|
+
agent-browser press Control+a # Key combination
|
|
39
|
+
agent-browser keydown Shift # Hold key down
|
|
40
|
+
agent-browser keyup Shift # Release key
|
|
41
|
+
agent-browser hover @e1 # Hover
|
|
42
|
+
agent-browser check @e1 # Check checkbox
|
|
43
|
+
agent-browser uncheck @e1 # Uncheck checkbox
|
|
44
|
+
agent-browser select @e1 "value" # Select dropdown option
|
|
45
|
+
agent-browser select @e1 "a" "b" # Select multiple options
|
|
46
|
+
agent-browser scroll down 500 # Scroll page (default: down 300px)
|
|
47
|
+
agent-browser scrollintoview @e1 # Scroll element into view (alias: scrollinto)
|
|
48
|
+
agent-browser drag @e1 @e2 # Drag and drop
|
|
49
|
+
agent-browser upload @e1 file.pdf # Upload files
|
|
50
|
+
```
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Profiling
|
|
2
|
+
|
|
3
|
+
Capture Chrome DevTools performance profiles during browser automation for performance analysis.
|
|
4
|
+
|
|
5
|
+
**Related**: [commands.md](commands.md) for full command reference, [SKILL.md](../SKILL.md) for quick start.
|
|
6
|
+
|
|
7
|
+
## Basic Profiling
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# Start profiling
|
|
11
|
+
agent-browser profiler start
|
|
12
|
+
|
|
13
|
+
# Perform actions
|
|
14
|
+
agent-browser navigate https://example.com
|
|
15
|
+
agent-browser click "#button"
|
|
16
|
+
agent-browser wait 1000
|
|
17
|
+
|
|
18
|
+
# Stop and save
|
|
19
|
+
agent-browser profiler stop ./trace.json
|
|
20
|
+
```
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Proxy Support
|
|
2
|
+
|
|
3
|
+
Proxy configuration for geo-testing, rate limiting avoidance, and corporate environments.
|
|
4
|
+
|
|
5
|
+
**Related**: [commands.md](commands.md) for global options, [SKILL.md](../SKILL.md) for quick start.
|
|
6
|
+
|
|
7
|
+
## Basic Proxy Configuration
|
|
8
|
+
|
|
9
|
+
Use the `--proxy` flag or set proxy via environment variable:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# Via CLI flag
|
|
13
|
+
agent-browser --proxy "http://proxy.example.com:8080" open https://example.com
|
|
14
|
+
|
|
15
|
+
# Via environment variable
|
|
16
|
+
export HTTP_PROXY="http://proxy.example.com:8080"
|
|
17
|
+
agent-browser open https://example.com
|
|
18
|
+
```
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Session Management
|
|
2
|
+
|
|
3
|
+
Multiple isolated browser sessions with state persistence and concurrent browsing.
|
|
4
|
+
|
|
5
|
+
**Related**: [authentication.md](authentication.md) for login patterns, [SKILL.md](../SKILL.md) for quick start.
|
|
6
|
+
|
|
7
|
+
## Named Sessions
|
|
8
|
+
|
|
9
|
+
Use `--session` flag to isolate browser contexts:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# Session 1: Authentication flow
|
|
13
|
+
agent-browser --session auth open https://app.example.com/login
|
|
14
|
+
|
|
15
|
+
# Session 2: Public browsing (separate cookies, storage)
|
|
16
|
+
agent-browser --session public open https://example.com
|
|
17
|
+
```
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Snapshot and Refs
|
|
2
|
+
|
|
3
|
+
Compact element references that reduce context usage dramatically for AI agents.
|
|
4
|
+
|
|
5
|
+
**Related**: [commands.md](commands.md) for full command reference, [SKILL.md](../SKILL.md) for quick start.
|
|
6
|
+
|
|
7
|
+
## How Refs Work
|
|
8
|
+
|
|
9
|
+
Traditional approach:
|
|
10
|
+
```
|
|
11
|
+
Full DOM/HTML → AI parses → CSS selector → Action (~3000-5000 tokens)
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
agent-browser approach:
|
|
15
|
+
```
|
|
16
|
+
Compact snapshot → @refs assigned → Direct interaction (~200-400 tokens)
|
|
17
|
+
```
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Video Recording
|
|
2
|
+
|
|
3
|
+
Capture browser automation as video for debugging, documentation, or verification.
|
|
4
|
+
|
|
5
|
+
**Related**: [commands.md](commands.md) for full command reference, [SKILL.md](../SKILL.md) for quick start.
|
|
6
|
+
|
|
7
|
+
## Basic Recording
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# Start recording
|
|
11
|
+
agent-browser record start ./demo.webm
|
|
12
|
+
|
|
13
|
+
# Perform actions
|
|
14
|
+
agent-browser open https://example.com
|
|
15
|
+
agent-browser snapshot -i
|
|
16
|
+
agent-browser click @e1
|
|
17
|
+
agent-browser fill @e2 "test input"
|
|
18
|
+
|
|
19
|
+
# Stop and save
|
|
20
|
+
agent-browser record stop
|
|
21
|
+
```
|
package/dist-electron/electron/managed-skills/agent-browser/templates/authenticated-session.sh
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Template: Authenticated Session Workflow
|
|
3
|
+
# Purpose: Login once, save state, reuse for subsequent runs
|
|
4
|
+
# Usage: ./authenticated-session.sh <login-url> [state-file]
|
|
5
|
+
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
|
|
8
|
+
LOGIN_URL="${1:?Usage: $0 <login-url> [state-file]}"
|
|
9
|
+
STATE_FILE="${2:-./auth-state.json}"
|
|
10
|
+
|
|
11
|
+
echo "Authentication workflow: $LOGIN_URL"
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Template: Content Capture Workflow
|
|
3
|
+
# Purpose: Extract content from web pages (text, screenshots, PDF)
|
|
4
|
+
# Usage: ./capture-workflow.sh <url> [output-dir]
|
|
5
|
+
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
|
|
8
|
+
TARGET_URL="${1:?Usage: $0 <url> [output-dir]}"
|
|
9
|
+
OUTPUT_DIR="${2:-.}"
|
|
10
|
+
|
|
11
|
+
echo "Capturing: $TARGET_URL"
|
|
12
|
+
mkdir -p "$OUTPUT_DIR"
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: condition-trigger
|
|
3
|
+
description: Author an approved, sandboxed script condition for a unified Automation.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Use this skill only when the user asks for a condition-based Automation or script-backed trigger.
|
|
7
|
+
|
|
8
|
+
The policy supplies an absolute helper path in `[Condition Trigger Helper]`. Use that path as `<condition-trigger-helper>` below; do not assume `./scripts` exists in the current workspace.
|
|
9
|
+
|
|
10
|
+
Follow this sequence exactly:
|
|
11
|
+
|
|
12
|
+
1. Create the Automation Script record first with `<condition-trigger-helper> create "<title>"`; retain the returned script ID.
|
|
13
|
+
2. Create a flat temporary source bundle outside managed script storage. It must contain `manifest.json`, one executable entrypoint with a valid shebang, fixtures, and tests (use filename prefixes instead of subdirectories). Do not write an immutable script package location or managed script directory.
|
|
14
|
+
3. Use `<condition-trigger-helper> stage <script-id> <temporary-source-dir>` to stage the source through Local AI Core. The server derives the package hash and interpreter facts.
|
|
15
|
+
4. Request test authorization with the helper, then stop for test authorization: ask the user to approve that one sandbox test. Do not run the test before the authorization is granted.
|
|
16
|
+
5. Once the user resolves the approval, apply that approved decision with `apply-approval <version-id> <approval-id> <actor>` before the sandbox test. Then run the helper's sandbox test command and review the server-recorded result.
|
|
17
|
+
6. Request final enable approval, then stop and ask the user to approve it.
|
|
18
|
+
7. Once the user resolves the final approval, apply that approved decision with `apply-approval <version-id> <approval-id> <actor>` before creating the Automation. Confirm the server reports the version as `approved`.
|
|
19
|
+
8. Use the helper to create the Automation with the approved version. Return the Automation ID and explain that `lac automation info <id>` is its management entry point.
|
|
20
|
+
|
|
21
|
+
Never manufacture a package hash, package path, interpreter path, approval ID, test result, or approval status. Keep secret values out of the bundle and logs; declare only permitted secret reference names in the manifest.
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
set -eu
|
|
3
|
+
|
|
4
|
+
usage() {
|
|
5
|
+
echo "Usage: register-condition-trigger.sh create <title> | stage <script-id> <source-dir> | test-approval <version-id> <actor> | apply-approval <version-id> <approval-id> <actor> | test <version-id> <actor> | enable-approval <version-id> <actor> | add <title> <script-id> <version-id> <interval> <message>" >&2
|
|
6
|
+
exit 1
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
command=${1:-}
|
|
10
|
+
case "$command" in
|
|
11
|
+
create) [ "$#" = 2 ] || usage; lac script create --title "$2" ;;
|
|
12
|
+
stage)
|
|
13
|
+
[ "$#" = 3 ] || usage
|
|
14
|
+
script_id=$2
|
|
15
|
+
source_dir=$3
|
|
16
|
+
source_file=$(mktemp "${TMPDIR:-/tmp}/condition-trigger-source.XXXXXX")
|
|
17
|
+
trap 'rm -f "$source_file"' EXIT HUP INT TERM
|
|
18
|
+
SOURCE_DIR="$source_dir" SOURCE_FILE="$source_file" node <<'NODE'
|
|
19
|
+
const { closeSync, constants, fstatSync, lstatSync, openSync, readSync, readdirSync, realpathSync, statSync, writeFileSync } = require('node:fs');
|
|
20
|
+
const { relative, resolve, sep } = require('node:path');
|
|
21
|
+
const MAX_FILES = 64;
|
|
22
|
+
const MAX_BYTES = 1_048_576;
|
|
23
|
+
const sourceDirectory = resolve(process.env.SOURCE_DIR || '');
|
|
24
|
+
const noFollow = constants.O_NOFOLLOW;
|
|
25
|
+
const directoryOnly = constants.O_DIRECTORY;
|
|
26
|
+
if (!noFollow || !directoryOnly) throw new Error('secure source staging requires O_NOFOLLOW and O_DIRECTORY');
|
|
27
|
+
function sameFile(left, right) {
|
|
28
|
+
return left.dev === right.dev && left.ino === right.ino;
|
|
29
|
+
}
|
|
30
|
+
function openDirectory(path, isRoot = false) {
|
|
31
|
+
let fd;
|
|
32
|
+
try {
|
|
33
|
+
fd = openSync(path, constants.O_RDONLY | noFollow | directoryOnly);
|
|
34
|
+
} catch (error) {
|
|
35
|
+
if (isRoot) throw new Error('source root must be a non-symlink directory');
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
const stat = fstatSync(fd);
|
|
40
|
+
if (!stat.isDirectory()) throw new Error('source root must be a non-symlink directory');
|
|
41
|
+
return stat;
|
|
42
|
+
} finally {
|
|
43
|
+
closeSync(fd);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const openedRoot = openDirectory(sourceDirectory, true);
|
|
47
|
+
const root = realpathSync(sourceDirectory);
|
|
48
|
+
function assertRootStable() {
|
|
49
|
+
if (!sameFile(openedRoot, statSync(root))) throw new Error('source root changed while staging');
|
|
50
|
+
}
|
|
51
|
+
assertRootStable();
|
|
52
|
+
const files = [];
|
|
53
|
+
let bytes = 0;
|
|
54
|
+
function readStableRegularFile(path) {
|
|
55
|
+
assertRootStable();
|
|
56
|
+
const fd = openSync(path, constants.O_RDONLY | noFollow);
|
|
57
|
+
try {
|
|
58
|
+
const before = fstatSync(fd);
|
|
59
|
+
if (!before.isFile()) throw new Error(`non-regular file is not allowed: ${path}`);
|
|
60
|
+
if (before.size > MAX_BYTES - bytes) throw new Error(`source bundle exceeds ${MAX_BYTES} content bytes`);
|
|
61
|
+
const buffer = Buffer.allocUnsafe(before.size);
|
|
62
|
+
let offset = 0;
|
|
63
|
+
while (offset < buffer.length) {
|
|
64
|
+
const read = readSync(fd, buffer, offset, buffer.length - offset, null);
|
|
65
|
+
if (!read) throw new Error(`source file changed while staging: ${path}`);
|
|
66
|
+
offset += read;
|
|
67
|
+
}
|
|
68
|
+
const after = fstatSync(fd);
|
|
69
|
+
if (!sameFile(before, after) || before.size !== after.size || before.mtimeMs !== after.mtimeMs || before.ctimeMs !== after.ctimeMs) {
|
|
70
|
+
throw new Error(`source file changed while staging: ${path}`);
|
|
71
|
+
}
|
|
72
|
+
assertRootStable();
|
|
73
|
+
bytes += buffer.length;
|
|
74
|
+
return new TextDecoder('utf-8', { fatal: true }).decode(buffer);
|
|
75
|
+
} finally {
|
|
76
|
+
closeSync(fd);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function walk(directory) {
|
|
80
|
+
for (const name of readdirSync(directory).sort()) {
|
|
81
|
+
const full = resolve(directory, name);
|
|
82
|
+
const stat = lstatSync(full);
|
|
83
|
+
if (stat.isSymbolicLink()) throw new Error(`symlink is not allowed: ${full}`);
|
|
84
|
+
if (stat.isDirectory()) throw new Error(`source bundle must be flat; nested directory is not allowed: ${full}`);
|
|
85
|
+
else if (stat.isFile()) {
|
|
86
|
+
if (files.length >= MAX_FILES) throw new Error(`source bundle exceeds ${MAX_FILES} files`);
|
|
87
|
+
const path = relative(root, full).split(sep).join('/');
|
|
88
|
+
const content = readStableRegularFile(full);
|
|
89
|
+
files.push({ path, content });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
walk(root);
|
|
94
|
+
writeFileSync(process.env.SOURCE_FILE, JSON.stringify(files), { mode: 0o600 });
|
|
95
|
+
NODE
|
|
96
|
+
lac script stage --script "$script_id" --source-file "$source_file"
|
|
97
|
+
rm -f "$source_file"
|
|
98
|
+
trap - EXIT HUP INT TERM
|
|
99
|
+
;;
|
|
100
|
+
test-approval) [ "$#" = 3 ] || usage; lac script test-approval "$2" --actor "$3" ;;
|
|
101
|
+
apply-approval) [ "$#" = 4 ] || usage; lac script approve "$2" --approval "$3" --actor "$4" ;;
|
|
102
|
+
test) [ "$#" = 3 ] || usage; lac script test "$2" --actor "$3" ;;
|
|
103
|
+
enable-approval) [ "$#" = 3 ] || usage; lac script enable-approval "$2" --actor "$3" ;;
|
|
104
|
+
add) [ "$#" = 6 ] || usage; lac automation add --script-version "$4" --script-id "$3" --title "$2" --interval "$5" --message "$6" ;;
|
|
105
|
+
*) usage ;;
|
|
106
|
+
esac
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: knowledge-base
|
|
3
|
+
description: Search selected knowledge bases through the local AgentDock knowledge API.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Use this skill when the user message includes a `[Selected Knowledge Bases]` block.
|
|
7
|
+
|
|
8
|
+
- Only search the knowledge bases listed in that block.
|
|
9
|
+
- Prefer the bundled script `./scripts/search-knowledge.sh` instead of writing inline `curl`.
|
|
10
|
+
- Call the script with the user question first, followed by one or more knowledge-base IDs.
|
|
11
|
+
- If the script reports `No results`, tell the user the selected knowledge bases did not contain relevant content.
|
|
12
|
+
- If the script reports `Error: ...`, tell the user the knowledge search failed and avoid claiming retrieved facts.
|
|
13
|
+
- When you answer from retrieved content, cite the matching knowledge base title or file name shown by the script.
|