@kafca/agentdock 0.1.15 → 0.1.17

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.
Files changed (61) hide show
  1. package/bin/agentdock.mjs +73 -3
  2. package/dist/renderer/assets/Badge-DXt7cKFc.js +1 -0
  3. package/dist/renderer/assets/Chat-KI72IiDR.js +2 -0
  4. package/dist/renderer/assets/ChatMarkdown-BJUbKIWx.js +45 -0
  5. package/dist/renderer/assets/Config-Cy7Bghwk.js +16 -0
  6. package/dist/renderer/assets/CronList-CDLl1ZzX.js +1 -0
  7. package/dist/renderer/assets/Dashboard-GInRzjlA.js +26 -0
  8. package/dist/renderer/assets/EmptyState-Blxa5wT6.js +6 -0
  9. package/dist/renderer/assets/KnowledgeDetail-DG5ACw7Z.js +16 -0
  10. package/dist/renderer/assets/KnowledgeHome-Co82W8Gm.js +11 -0
  11. package/dist/renderer/assets/Logs-CX-AZ4l9.js +1 -0
  12. package/dist/renderer/assets/Modal-BfZUw-Vc.js +10 -0
  13. package/dist/renderer/assets/Page-Bj33TMID.js +1 -0
  14. package/dist/renderer/assets/ProjectDetail-Br1_6OXA.js +11 -0
  15. package/dist/renderer/assets/ProjectList-DtfMApqf.js +1 -0
  16. package/dist/renderer/assets/Select-zyP8Fyv-.js +11 -0
  17. package/dist/renderer/assets/SessionChat-DaU2m8t8.js +1 -0
  18. package/dist/renderer/assets/SessionList-C5Qm9meA.js +1 -0
  19. package/dist/renderer/assets/ThreadChat-mXwKVnjn.js +23 -0
  20. package/dist/renderer/assets/Workspace-D33Uehab.js +14 -0
  21. package/dist/renderer/assets/arrow-left-CHaLGNIO.js +6 -0
  22. package/dist/renderer/assets/book-open-ErTuahLF.js +6 -0
  23. package/dist/renderer/assets/check-DdHpkvai.js +6 -0
  24. package/dist/renderer/assets/circle-jGjPqcBV.js +6 -0
  25. package/dist/renderer/assets/desktop-D4Z7M9RM.js +3 -0
  26. package/dist/renderer/assets/desktop-DTOHffl0.js +1 -0
  27. package/dist/renderer/assets/en-CKhCF6St.js +1 -0
  28. package/dist/renderer/assets/es-C8UBPhxM.js +1 -0
  29. package/dist/renderer/assets/funnel-SfDR1vLQ.js +6 -0
  30. package/dist/renderer/assets/heart-uLLDdrUQ.js +6 -0
  31. package/dist/renderer/assets/index-CTOb2Qbz.js +41 -0
  32. package/dist/renderer/assets/index-CVrF_DwQ.css +11 -0
  33. package/dist/renderer/assets/index-DbqC4-hV.js +177 -0
  34. package/dist/renderer/assets/ja-ChF4vbBL.js +1 -0
  35. package/dist/renderer/assets/pencil-CmkSVcVi.js +6 -0
  36. package/dist/renderer/assets/play-D4sbHoXa.js +6 -0
  37. package/dist/renderer/assets/plug-CTnt9Fqi.js +6 -0
  38. package/dist/renderer/assets/plus-C88o4pqU.js +6 -0
  39. package/dist/renderer/assets/projects-CxhcfuFo.js +1 -0
  40. package/dist/renderer/assets/save-D8aBjpdR.js +6 -0
  41. package/dist/renderer/assets/search-CR2u_AT7.js +6 -0
  42. package/dist/renderer/assets/server-DD_yCA3I.js +11 -0
  43. package/dist/renderer/assets/session-utils-DzI7rMtW.js +6 -0
  44. package/dist/renderer/assets/sessions-qYxQCCGN.js +1 -0
  45. package/dist/renderer/assets/shield-check-Du9pUUbm.js +6 -0
  46. package/dist/renderer/assets/trash-2-DwMqg4qR.js +6 -0
  47. package/dist/renderer/assets/user-cFDevW5m.js +11 -0
  48. package/dist/renderer/assets/wifi-off-opRy17vp.js +11 -0
  49. package/dist/renderer/assets/zh-Dz5FLTBV.js +1 -0
  50. package/dist/renderer/assets/zh-TW-BtRwreY_.js +1 -0
  51. package/dist/renderer/index.html +2 -2
  52. package/dist-electron/electron/local-core-refactor.test.js +150 -0
  53. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-backend.js +3 -0
  54. package/dist-electron/services/local-ai-core/src/acp/local-core-acp-turn-coordinator.js +42 -5
  55. package/dist-electron/services/local-ai-core/src/acp/workspace-acp-permissions.js +19 -1
  56. package/dist-electron/src/pages/Threads/thread-chat-model.js +3 -3
  57. package/dist-electron/src/pages/Threads/thread-chat-permission.js +4 -0
  58. package/dist-electron/src/pages/Threads/thread-chat-permission.test.js +35 -0
  59. package/package.json +1 -1
  60. package/dist/renderer/assets/index-BSFT2vom.js +0 -502
  61. package/dist/renderer/assets/index-tUukeThX.css +0 -11
@@ -0,0 +1 @@
1
+ const e={dashboard:"ダッシュボード",chat:"チャット",chatDesktop:"デスクトップチャット",chatWeb:"チャット",workspace:"ワークスペース",knowledge:"ナレッジ",projects:"プロジェクト",sessions:"セッション",cron:"Cron",bridge:"ブリッジ",system:"システム"},t={title:"ダッシュボード",version:"バージョン",uptime:"稼働時間",platforms:"プラットフォーム",projects:"プロジェクト",bridgeAdapters:"ブリッジアダプター",noData:"データがありません"},s={title:"プロジェクト",name:"名前",agent:"エージェント",platforms:"プラットフォーム",sessions:"セッション",heartbeat:"ハートビート",settings:"設定",quiet:"サイレントモード",language:"言語",adminFrom:"管理元",disabledCommands:"無効化したコマンド",save:"保存",detail:"詳細",noProjects:"プロジェクトが設定されていません",tabs:{overview:"概要",providers:"プロバイダー",heartbeat:"ハートビート",settings:"設定"}},o={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:"本当に削除しますか?"},m={light:"ライト",dark:"ダーク",system:"システムに合わせる"},p={nav:e,dashboard:t,projects:s,sessions:o,providers:a,cron:n,heartbeat:i,bridge:r,system:l,login:c,common:d,theme:m};export{r as bridge,d as common,n as cron,t as dashboard,p as default,i as heartbeat,c as login,e as nav,s as projects,a as providers,o as sessions,l as system,m as theme};
@@ -0,0 +1,6 @@
1
+ import{c as a}from"./index-DbqC4-hV.js";/**
2
+ * @license lucide-react v0.487.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const c=[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]],o=a("pencil",c);export{o as P};
@@ -0,0 +1,6 @@
1
+ import{c as o}from"./index-DbqC4-hV.js";/**
2
+ * @license lucide-react v0.487.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const c=[["polygon",{points:"6 3 20 12 6 21 6 3",key:"1oa8hb"}]],e=o("play",c);export{e as P};
@@ -0,0 +1,6 @@
1
+ import{c as o}from"./index-DbqC4-hV.js";/**
2
+ * @license lucide-react v0.487.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const a=[["path",{d:"M12 22v-5",key:"1ega77"}],["path",{d:"M9 8V2",key:"14iosj"}],["path",{d:"M15 8V2",key:"18g5xt"}],["path",{d:"M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8Z",key:"osxo6l"}]],t=o("plug",a);export{t as P};
@@ -0,0 +1,6 @@
1
+ import{c as e}from"./index-DbqC4-hV.js";/**
2
+ * @license lucide-react v0.487.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const o=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]],c=e("plus",o);export{c as P};
@@ -0,0 +1 @@
1
+ import{y as t}from"./index-DbqC4-hV.js";const e=()=>t.get("/projects"),r=o=>t.get(`/projects/${o}`);export{r as g,e as l};
@@ -0,0 +1,6 @@
1
+ import{c as a}from"./index-DbqC4-hV.js";/**
2
+ * @license lucide-react v0.487.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const e=[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z",key:"1c8476"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7",key:"1ydtos"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7",key:"t51u73"}]],o=a("save",e);export{o as S};
@@ -0,0 +1,6 @@
1
+ import{c}from"./index-DbqC4-hV.js";/**
2
+ * @license lucide-react v0.487.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const e=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]],r=c("search",e);export{r as S};
@@ -0,0 +1,11 @@
1
+ import{c as e}from"./index-DbqC4-hV.js";/**
2
+ * @license lucide-react v0.487.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const r=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]],c=e("arrow-right",r);/**
7
+ * @license lucide-react v0.487.0 - ISC
8
+ *
9
+ * This source code is licensed under the ISC license.
10
+ * See the LICENSE file in the root directory of this source tree.
11
+ */const t=[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]],i=e("server",t);export{c as A,i as S};
@@ -0,0 +1,6 @@
1
+ import{c as o}from"./index-DbqC4-hV.js";/**
2
+ * @license lucide-react v0.487.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const c=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],d=o("loader-circle",c);function i(e){return e.name||e.user_name||e.chat_name||`Session ${e.id.slice(0,8)}`}function f(e,t){var a;return t?[i(e),e.session_key,((a=e.last_message)==null?void 0:a.content)||"",e.user_name||"",e.chat_name||""].join(" ").toLowerCase().includes(t):!0}function l(e){return[...e].sort((t,r)=>t.live!==r.live?t.live?-1:1:(r.updated_at||r.created_at||"").localeCompare(t.updated_at||t.created_at||""))}function m(e,t="just now"){if(!e)return"";const r=Date.now()-new Date(e).getTime(),a=Math.floor(r/6e4);if(a<1)return t;if(a<60)return`${a}m`;const n=Math.floor(a/60);return n<24?`${n}h`:`${Math.floor(n/24)}d`}export{d as L,l as a,i as b,f as s,m as t};
@@ -0,0 +1 @@
1
+ import{y as o}from"./index-DbqC4-hV.js";const i=s=>o.get(`/projects/${s}/sessions`),c=(s,e,t)=>o.get(`/projects/${s}/sessions/${e}`,{history_limit:String(t)}),r=(s,e,t)=>o.patch(`/projects/${s}/sessions/${e}`,t),a=(s,e)=>o.delete(`/projects/${s}/sessions/${e}`),p=(s,e)=>o.post(`/projects/${s}/sessions/switch`,e),$=(s,e)=>o.post(`/projects/${s}/send`,e);export{$ as a,a as d,c as g,i as l,r,p as s};
@@ -0,0 +1,6 @@
1
+ import{c}from"./index-DbqC4-hV.js";/**
2
+ * @license lucide-react v0.487.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const e=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],o=c("shield-check",e);export{o as S};
@@ -0,0 +1,6 @@
1
+ import{c as e}from"./index-DbqC4-hV.js";/**
2
+ * @license lucide-react v0.487.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const c=[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]],a=e("trash-2",c);export{a as T};
@@ -0,0 +1,11 @@
1
+ import{c as e}from"./index-DbqC4-hV.js";/**
2
+ * @license lucide-react v0.487.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const t=[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]],o=e("bot",t);/**
7
+ * @license lucide-react v0.487.0 - ISC
8
+ *
9
+ * This source code is licensed under the ISC license.
10
+ * See the LICENSE file in the root directory of this source tree.
11
+ */const c=[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]],r=e("user",c);export{o as B,r as U};
@@ -0,0 +1,11 @@
1
+ import{c as a}from"./index-DbqC4-hV.js";/**
2
+ * @license lucide-react v0.487.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const t=[["path",{d:"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8",key:"1p45f6"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}]],c=a("rotate-cw",t);/**
7
+ * @license lucide-react v0.487.0 - ISC
8
+ *
9
+ * This source code is licensed under the ISC license.
10
+ * See the LICENSE file in the root directory of this source tree.
11
+ */const e=[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}],["path",{d:"M5 12.859a10 10 0 0 1 5.17-2.69",key:"1dl1wf"}],["path",{d:"M19 12.859a10 10 0 0 0-2.007-1.523",key:"4k23kn"}],["path",{d:"M2 8.82a15 15 0 0 1 4.177-2.643",key:"1grhjp"}],["path",{d:"M22 8.82a15 15 0 0 0-11.288-3.764",key:"z3jwby"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],d=a("wifi-off",e);export{c as R,d as W};
@@ -0,0 +1 @@
1
+ const e={dashboard:"概览",chat:"聊天",chatDesktop:"桌面聊天",chatWeb:"聊天",workspace:"工作区",knowledge:"知识库",projects:"项目",sessions:"会话",cron:"定时任务",bridge:"桥接",system:"系统"},t={title:"概览",version:"版本",uptime:"运行时间",platforms:"平台",projects:"项目",bridgeAdapters:"桥接适配器",noData:"暂无数据"},s={title:"项目",name:"名称",agent:"智能体",platforms:"平台",sessions:"会话",heartbeat:"心跳",settings:"设置",quiet:"静默模式",language:"语言",adminFrom:"管理来源",disabledCommands:"已禁用命令",save:"保存",detail:"详情",noProjects:"尚未配置项目",tabs:{overview:"概览",providers:"服务商",heartbeat:"心跳",settings:"设置"}},o={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:"确定要删除吗?"},m={light:"浅色",dark:"深色",system:"跟随系统"},p={nav:e,dashboard:t,projects:s,sessions:o,providers:a,cron:n,heartbeat:i,bridge:r,system:l,login:c,common:d,theme:m};export{r as bridge,d as common,n as cron,t as dashboard,p as default,i as heartbeat,c as login,e as nav,s as projects,a as providers,o as sessions,l as system,m as theme};
@@ -0,0 +1 @@
1
+ const e={dashboard:"總覽",chat:"聊天",chatDesktop:"桌面聊天",chatWeb:"聊天",workspace:"工作區",knowledge:"知識庫",projects:"專案",sessions:"工作階段",cron:"排程工作",bridge:"橋接",system:"系統"},t={title:"總覽",version:"版本",uptime:"運作時間",platforms:"平台",projects:"專案",bridgeAdapters:"橋接介接器",noData:"尚無資料"},s={title:"專案",name:"名稱",agent:"智慧代理",platforms:"平台",sessions:"工作階段",heartbeat:"心跳",settings:"設定",quiet:"靜音模式",language:"語言",adminFrom:"管理來源",disabledCommands:"已停用指令",save:"儲存",detail:"詳細資料",noProjects:"尚未設定專案",tabs:{overview:"總覽",providers:"供應商",heartbeat:"心跳",settings:"設定"}},o={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:"確定要刪除嗎?"},m={light:"淺色",dark:"深色",system:"跟隨系統"},p={nav:e,dashboard:t,projects:s,sessions:o,providers:a,cron:n,heartbeat:i,bridge:r,system:l,login:c,common:d,theme:m};export{r as bridge,d as common,n as cron,t as dashboard,p as default,i as heartbeat,c as login,e as nav,s as projects,a as providers,o as sessions,l as system,m as theme};
@@ -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-BSFT2vom.js"></script>
9
- <link rel="stylesheet" crossorigin href="./assets/index-tUukeThX.css">
8
+ <script type="module" crossorigin src="./assets/index-DbqC4-hV.js"></script>
9
+ <link rel="stylesheet" crossorigin href="./assets/index-CVrF_DwQ.css">
10
10
  </head>
11
11
  <body class="bg-[#f5f5f7] dark:bg-[#151516]">
12
12
  <div id="root"></div>
@@ -69,6 +69,156 @@ const local_core_acp_store_js_1 = require("../services/local-ai-core/src/acp/loc
69
69
  strict_1.default.equal(emitted.length, 1);
70
70
  strict_1.default.equal(emitted[0]?.content, appended[0]?.content);
71
71
  });
72
+ (0, node_test_1.default)('ACP tool call running and completed updates share one message id', () => {
73
+ const upserted = [];
74
+ const emitted = [];
75
+ const coordinator = new local_core_acp_turn_coordinator_js_1.LocalCoreAcpTurnCoordinator({
76
+ appendMessage: () => strict_1.default.fail('tool updates should be upserted'),
77
+ upsertMessage: (_threadId, id, _role, content, kind) => upserted.push({ id, content, kind }),
78
+ emitBridge: (event) => emitted.push(event),
79
+ updateRunStatus: () => { },
80
+ sendRaw: () => true,
81
+ });
82
+ const session = {
83
+ threadId: 'thread-1',
84
+ bridgeSessionKey: 'session:thread-1',
85
+ currentRunId: 'run-1',
86
+ currentTurn: {
87
+ runId: 'run-1',
88
+ replyCtx: 'run-1',
89
+ previewHandle: 'preview-1',
90
+ assistantText: '',
91
+ typingStarted: true,
92
+ previewStarted: false,
93
+ permission: null,
94
+ },
95
+ loadReplayMode: false,
96
+ schedulerJobCreatedByRun: new Map(),
97
+ };
98
+ coordinator.handleAgentNotification(session, {
99
+ method: 'session/update',
100
+ params: {
101
+ update: {
102
+ sessionUpdate: 'tool_call',
103
+ title: 'Find',
104
+ },
105
+ },
106
+ });
107
+ coordinator.handleAgentNotification(session, {
108
+ method: 'session/update',
109
+ params: {
110
+ update: {
111
+ sessionUpdate: 'tool_call_update',
112
+ title: "Find `src/pages/Threads/**/*`",
113
+ status: 'running',
114
+ },
115
+ },
116
+ });
117
+ coordinator.handleAgentNotification(session, {
118
+ method: 'session/update',
119
+ params: {
120
+ update: {
121
+ sessionUpdate: 'tool_call_update',
122
+ title: 'Tool update',
123
+ status: 'completed',
124
+ content: [
125
+ {
126
+ type: 'content',
127
+ content: {
128
+ type: 'text',
129
+ text: 'src/pages/Threads/ThreadChat.tsx',
130
+ },
131
+ },
132
+ ],
133
+ },
134
+ },
135
+ });
136
+ strict_1.default.equal(upserted.length, 2);
137
+ strict_1.default.equal(upserted[0]?.id, upserted[1]?.id);
138
+ strict_1.default.equal(upserted[0]?.id, 'run-1-tool-1');
139
+ strict_1.default.equal(upserted[0]?.content, "🔧 Find: Find `src/pages/Threads/**/*` - running");
140
+ strict_1.default.equal(upserted[1]?.content, '🔧 Find: Find `src/pages/Threads/**/*` - completed - src/pages/Threads/ThreadChat.tsx');
141
+ strict_1.default.equal(emitted.length, 2);
142
+ strict_1.default.deepEqual(emitted.map((event) => event.messageId), ['run-1-tool-1', 'run-1-tool-1']);
143
+ });
144
+ (0, node_test_1.default)('ACP permission tool parameters are preserved in completed tool cards', () => {
145
+ const upserted = [];
146
+ const emitted = [];
147
+ const coordinator = new local_core_acp_turn_coordinator_js_1.LocalCoreAcpTurnCoordinator({
148
+ appendMessage: () => { },
149
+ upsertMessage: (_threadId, id, _role, content, kind) => upserted.push({ id, content, kind }),
150
+ emitBridge: (event) => emitted.push(event),
151
+ updateRunStatus: () => { },
152
+ sendRaw: () => true,
153
+ });
154
+ const session = {
155
+ threadId: 'thread-1',
156
+ bridgeSessionKey: 'session:thread-1',
157
+ currentRunId: 'run-1',
158
+ currentTurn: {
159
+ runId: 'run-1',
160
+ replyCtx: 'run-1',
161
+ previewHandle: 'preview-1',
162
+ assistantText: '',
163
+ typingStarted: true,
164
+ previewStarted: false,
165
+ permission: null,
166
+ },
167
+ pendingPermissionByRun: new Map(),
168
+ loadReplayMode: false,
169
+ schedulerJobCreatedByRun: new Map(),
170
+ };
171
+ coordinator.handleAgentNotification(session, {
172
+ method: 'session/update',
173
+ params: {
174
+ update: {
175
+ sessionUpdate: 'tool_call',
176
+ title: 'Terminal',
177
+ },
178
+ },
179
+ });
180
+ coordinator.handleAgentRequest(session, {
181
+ method: 'session/request_permission',
182
+ id: 42,
183
+ params: {
184
+ toolCall: {
185
+ title: 'Terminal',
186
+ parameters: {
187
+ command: 'ls -la ~/Desktop',
188
+ cwd: '/Users/mochuxian',
189
+ },
190
+ },
191
+ options: [
192
+ { optionId: 'allow-once', name: 'Allow', kind: 'allow_once' },
193
+ ],
194
+ },
195
+ });
196
+ coordinator.handleAgentNotification(session, {
197
+ method: 'session/update',
198
+ params: {
199
+ update: {
200
+ sessionUpdate: 'tool_call_update',
201
+ title: 'Tool update',
202
+ status: 'completed',
203
+ content: [
204
+ {
205
+ type: 'content',
206
+ content: {
207
+ type: 'text',
208
+ text: 'Desktop file list',
209
+ },
210
+ },
211
+ ],
212
+ },
213
+ },
214
+ });
215
+ strict_1.default.equal(upserted.length, 1);
216
+ strict_1.default.equal(upserted[0]?.id, 'run-1-tool-1');
217
+ strict_1.default.match(upserted[0]?.content || '', /Terminal/);
218
+ strict_1.default.match(upserted[0]?.content || '', /parameters:/);
219
+ strict_1.default.match(upserted[0]?.content || '', /ls -la ~\/Desktop/);
220
+ strict_1.default.match(upserted[0]?.content || '', /completed - Desktop file list/);
221
+ });
72
222
  (0, node_test_1.default)('ACP bare tool call is flushed before assistant text', () => {
73
223
  const appended = [];
74
224
  const emitted = [];
@@ -245,6 +245,9 @@ class LocalCoreAcpBackend {
245
245
  previewStarted: false,
246
246
  thoughtPreviewStarted: false,
247
247
  pendingToolCallTitle: undefined,
248
+ pendingToolCallId: undefined,
249
+ pendingToolCallDetail: undefined,
250
+ toolCallSequence: 0,
248
251
  permission: null,
249
252
  };
250
253
  const promptPromise = this.transport.request(session, 'session/prompt', {
@@ -15,8 +15,11 @@ class LocalCoreAcpTurnCoordinator {
15
15
  if (!currentTurn || !currentRunId || !title) {
16
16
  return;
17
17
  }
18
+ const messageId = currentTurn.pendingToolCallId;
18
19
  currentTurn.pendingToolCallTitle = undefined;
19
- this.emitProgress(session, currentRunId, `🔧 ${title}`);
20
+ currentTurn.pendingToolCallId = undefined;
21
+ currentTurn.pendingToolCallDetail = undefined;
22
+ this.emitProgress(session, currentRunId, `🔧 ${title}`, messageId);
20
23
  }
21
24
  getPendingPermissionRequest(session, detail) {
22
25
  const runId = session?.currentRunId;
@@ -117,6 +120,9 @@ class LocalCoreAcpTurnCoordinator {
117
120
  session.pendingPermissionByRun.set(currentRunId, permissionRequest);
118
121
  if (session.currentTurn) {
119
122
  session.currentTurn.permission = permissionRequest;
123
+ if (toolTitle && toolTitle !== 'Permission required before continuing.') {
124
+ session.currentTurn.pendingToolCallDetail = toolTitle;
125
+ }
120
126
  }
121
127
  this.options.updateRunStatus(currentRunId, session.threadId, 'awaiting_input');
122
128
  const permissionPrompt = [
@@ -211,7 +217,11 @@ class LocalCoreAcpTurnCoordinator {
211
217
  case 'tool_call': {
212
218
  const title = String(update.title || 'Running tool').trim();
213
219
  this.flushPendingToolCall(session);
220
+ const nextSequence = (currentTurn.toolCallSequence || 0) + 1;
221
+ currentTurn.toolCallSequence = nextSequence;
214
222
  currentTurn.pendingToolCallTitle = title;
223
+ currentTurn.pendingToolCallId = `${currentRunId}-tool-${nextSequence}`;
224
+ currentTurn.pendingToolCallDetail = undefined;
215
225
  return;
216
226
  }
217
227
  case 'tool_call_update': {
@@ -222,12 +232,24 @@ class LocalCoreAcpTurnCoordinator {
222
232
  session.schedulerJobCreatedByRun.set(currentRunId, true);
223
233
  }
224
234
  const toolName = currentTurn.pendingToolCallTitle?.trim();
235
+ const messageId = currentTurn.pendingToolCallId;
236
+ const priorDetail = currentTurn.pendingToolCallDetail?.trim();
225
237
  if (this.isEmptyRunningToolUpdate(title, status, content)) {
226
238
  currentTurn.pendingToolCallTitle = undefined;
239
+ currentTurn.pendingToolCallId = undefined;
240
+ currentTurn.pendingToolCallDetail = undefined;
227
241
  return;
228
242
  }
229
- currentTurn.pendingToolCallTitle = undefined;
230
- this.emitProgress(session, currentRunId, this.formatToolProgressMessage(toolName, title, status, content));
243
+ const displayTitle = this.resolveToolUpdateDisplayTitle(title, status, priorDetail);
244
+ if (!this.isTerminalToolStatus(status) && displayTitle && !/^tool update$/i.test(displayTitle)) {
245
+ currentTurn.pendingToolCallDetail = displayTitle;
246
+ }
247
+ if (this.isTerminalToolStatus(status)) {
248
+ currentTurn.pendingToolCallTitle = undefined;
249
+ currentTurn.pendingToolCallId = undefined;
250
+ currentTurn.pendingToolCallDetail = undefined;
251
+ }
252
+ this.emitProgress(session, currentRunId, this.formatToolProgressMessage(toolName, displayTitle, status, content), messageId);
231
253
  return;
232
254
  }
233
255
  case 'plan': {
@@ -254,12 +276,18 @@ class LocalCoreAcpTurnCoordinator {
254
276
  return;
255
277
  }
256
278
  }
257
- emitProgress(session, currentRunId, content) {
258
- this.options.appendMessage(session.threadId, 'assistant', content, 'progress');
279
+ emitProgress(session, currentRunId, content, messageId) {
280
+ if (messageId && this.options.upsertMessage) {
281
+ this.options.upsertMessage(session.threadId, messageId, 'assistant', content, 'progress');
282
+ }
283
+ else {
284
+ this.options.appendMessage(session.threadId, 'assistant', content, 'progress');
285
+ }
259
286
  this.options.emitBridge({
260
287
  type: 'reply',
261
288
  sessionKey: session.bridgeSessionKey,
262
289
  replyCtx: currentRunId,
290
+ messageId,
263
291
  content,
264
292
  });
265
293
  }
@@ -277,11 +305,20 @@ class LocalCoreAcpTurnCoordinator {
277
305
  const detail = [title, status, content].filter(Boolean).join(' - ');
278
306
  return toolName ? `🔧 ${toolName}: ${detail || 'Tool update'}` : `🔧 ${detail || 'Tool update'}`;
279
307
  }
308
+ resolveToolUpdateDisplayTitle(title, status, priorDetail) {
309
+ if (priorDetail && (this.isTerminalToolStatus(status) || /^tool update$/i.test(title.trim()))) {
310
+ return priorDetail;
311
+ }
312
+ return title;
313
+ }
280
314
  isEmptyRunningToolUpdate(title, status, content) {
281
315
  return !content.trim() &&
282
316
  /^running$/i.test(status) &&
283
317
  (!title.trim() || /^tool update$/i.test(title));
284
318
  }
319
+ isTerminalToolStatus(status) {
320
+ return /^(completed|failed|error|cancelled|canceled)$/i.test(status.trim());
321
+ }
285
322
  }
286
323
  exports.LocalCoreAcpTurnCoordinator = LocalCoreAcpTurnCoordinator;
287
324
  function isSchedulerAddCommand(value) {
@@ -36,7 +36,25 @@ function formatToolCallContent(toolCall) {
36
36
  .filter(Boolean)
37
37
  .join('\n')
38
38
  : '';
39
- return [title, content].filter(Boolean).join('\n\n') || 'Permission required before continuing.';
39
+ const detailFields = ['parameters', 'parameter', 'params', 'arguments', 'args', 'input'];
40
+ const details = detailFields
41
+ .map((key) => formatToolCallDetailField(key, toolCall[key]))
42
+ .filter(Boolean);
43
+ return [title, content, ...details].filter(Boolean).join('\n\n') || 'Permission required before continuing.';
44
+ }
45
+ function formatToolCallDetailField(key, value) {
46
+ if (value == null || value === '') {
47
+ return '';
48
+ }
49
+ if (typeof value === 'string') {
50
+ return `${key}:\n${value.trim()}`;
51
+ }
52
+ try {
53
+ return `${key}:\n${JSON.stringify(value, null, 2)}`;
54
+ }
55
+ catch {
56
+ return `${key}:\n${String(value)}`;
57
+ }
40
58
  }
41
59
  function toPermissionButtonRows(options, normalizeButton) {
42
60
  return [options.map((option) => {
@@ -145,6 +145,9 @@ function chatThreadMatchesSearch(thread, query) {
145
145
  }
146
146
  function sortChatMessages(messages) {
147
147
  return [...messages].sort((a, b) => {
148
+ if (a.order !== b.order) {
149
+ return a.order - b.order;
150
+ }
148
151
  const aTime = a.timestamp ? new Date(a.timestamp).getTime() : Number.NaN;
149
152
  const bTime = b.timestamp ? new Date(b.timestamp).getTime() : Number.NaN;
150
153
  const aHasTime = Number.isFinite(aTime);
@@ -152,9 +155,6 @@ function sortChatMessages(messages) {
152
155
  if (aHasTime && bHasTime && aTime !== bTime) {
153
156
  return aTime - bTime;
154
157
  }
155
- if (a.order !== b.order) {
156
- return a.order - b.order;
157
- }
158
158
  return a.id.localeCompare(b.id);
159
159
  });
160
160
  }
@@ -1,6 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.shouldEchoBridgeActionResponse = shouldEchoBridgeActionResponse;
3
4
  exports.toPendingPermissionRequest = toPendingPermissionRequest;
5
+ function shouldEchoBridgeActionResponse(message) {
6
+ return !(message.actionMode === 'permission' && message.actionInteractive);
7
+ }
4
8
  function toPendingPermissionRequest(message) {
5
9
  if (!message.id ||
6
10
  message.role !== 'assistant' ||
@@ -51,6 +51,41 @@ function createMessage(overrides) {
51
51
  strict_1.default.equal((0, thread_chat_task_state_1.taskStateForBridgeButtons)(false, false), 'idle');
52
52
  strict_1.default.equal((0, thread_chat_task_state_1.taskStateReasonForBridgeButtons)(false, false), 'bridge-buttons-idle');
53
53
  });
54
+ (0, node_test_1.default)('interactive permission responses are not echoed as user chat messages', () => {
55
+ strict_1.default.equal((0, thread_chat_permission_1.shouldEchoBridgeActionResponse)({
56
+ actionMode: 'permission',
57
+ actionInteractive: true,
58
+ }), false);
59
+ strict_1.default.equal((0, thread_chat_permission_1.shouldEchoBridgeActionResponse)({
60
+ actionMode: 'generic',
61
+ actionInteractive: true,
62
+ }), true);
63
+ strict_1.default.equal((0, thread_chat_permission_1.shouldEchoBridgeActionResponse)({
64
+ actionMode: 'permission',
65
+ actionInteractive: false,
66
+ }), true);
67
+ });
68
+ (0, node_test_1.default)('chat message sorting preserves stored order before timestamps', () => {
69
+ const messages = [
70
+ {
71
+ id: 'tool',
72
+ role: 'assistant',
73
+ content: 'tool',
74
+ kind: 'progress',
75
+ order: 2,
76
+ timestamp: '2026-04-28T10:00:00.000Z',
77
+ },
78
+ {
79
+ id: 'thought',
80
+ role: 'assistant',
81
+ content: 'thought',
82
+ kind: 'progress',
83
+ order: 1,
84
+ timestamp: '2026-04-28T10:01:00.000Z',
85
+ },
86
+ ];
87
+ strict_1.default.deepEqual((0, thread_chat_model_1.sortChatMessages)(messages).map((message) => message.id), ['thought', 'tool']);
88
+ });
54
89
  (0, node_test_1.default)('reply replacement removes only the matching answer preview from a multi-message turn', () => {
55
90
  const current = [
56
91
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kafca/agentdock",
3
- "version": "0.1.15",
3
+ "version": "0.1.17",
4
4
  "type": "module",
5
5
  "main": "dist-electron/electron/main.js",
6
6
  "bin": {