@kafca/agentdock 0.1.49 → 0.1.50

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 (50) hide show
  1. package/dist/renderer/assets/{Badge-DXjx3T4U.js → Badge-DphzI84h.js} +1 -1
  2. package/dist/renderer/assets/{Chat-BdLcSBda.js → Chat-BkMHNdkV.js} +1 -1
  3. package/dist/renderer/assets/{ChatMarkdown-CSc8mfpv.js → ChatMarkdown-nmZelMA9.js} +1 -1
  4. package/dist/renderer/assets/{Config-b5NK6ZGX.js → Config-CY2peXi1.js} +1 -1
  5. package/dist/renderer/assets/{CronList-B4vdtNHN.js → CronList-Ds9TTT0f.js} +1 -1
  6. package/dist/renderer/assets/{Dashboard-BItoWTOa.js → Dashboard-DeWrprYz.js} +2 -2
  7. package/dist/renderer/assets/{EmptyState-DUDyUsLL.js → EmptyState-JnMCDgRB.js} +1 -1
  8. package/dist/renderer/assets/{KnowledgeDetail-WWH6KxiG.js → KnowledgeDetail-CQ3VlctJ.js} +1 -1
  9. package/dist/renderer/assets/{KnowledgeHome-Dn-NmRxu.js → KnowledgeHome-DsCVW1re.js} +1 -1
  10. package/dist/renderer/assets/{Logs-4zMv4FvK.js → Logs-4ENSRVB4.js} +1 -1
  11. package/dist/renderer/assets/{Modal-BYTZpyD2.js → Modal-BIm0iRtp.js} +1 -1
  12. package/dist/renderer/assets/{MonitorList-DzcwVuQO.js → MonitorList-CCj0KIGD.js} +1 -1
  13. package/dist/renderer/assets/{Page-B0lex3w0.js → Page-uCVGTzRo.js} +1 -1
  14. package/dist/renderer/assets/{ProjectDetail-zhmSLySm.js → ProjectDetail-DJ0Z_Ixk.js} +1 -1
  15. package/dist/renderer/assets/{ProjectList-DZr7agnE.js → ProjectList-DglTyk-r.js} +1 -1
  16. package/dist/renderer/assets/{Select-CybeCWXZ.js → Select-wnvxGX9B.js} +1 -1
  17. package/dist/renderer/assets/{SessionChat-DfsXUkfX.js → SessionChat-BvrFUqiK.js} +1 -1
  18. package/dist/renderer/assets/{SessionList-BHzY2T_K.js → SessionList-DN0k8lCt.js} +1 -1
  19. package/dist/renderer/assets/{ThreadChat-BB_Y2SLO.js → ThreadChat-DqZwWTdK.js} +1 -1
  20. package/dist/renderer/assets/{Workspace-COip3Zy2.js → Workspace-VrjbrPbA.js} +1 -1
  21. package/dist/renderer/assets/{arrow-left-SFlZE8SW.js → arrow-left-BflzNl62.js} +1 -1
  22. package/dist/renderer/assets/{book-open-CENFRKvo.js → book-open-D2ttV2IU.js} +1 -1
  23. package/dist/renderer/assets/{bot-DeqZUVXX.js → bot-cb9OifGp.js} +1 -1
  24. package/dist/renderer/assets/{check-BNBksd9W.js → check-B47n4xeR.js} +1 -1
  25. package/dist/renderer/assets/{chevron-down-BOhwopXd.js → chevron-down-CGsttXF_.js} +1 -1
  26. package/dist/renderer/assets/{circle-BTT_e1ZT.js → circle-BnHI6FDe.js} +1 -1
  27. package/dist/renderer/assets/{desktop-D88Gquih.js → desktop-CRlWIOU3.js} +1 -1
  28. package/dist/renderer/assets/{funnel-Btin4gwi.js → funnel-DPnOoche.js} +1 -1
  29. package/dist/renderer/assets/{heart-BCqqkImr.js → heart-Bdhq7IqP.js} +1 -1
  30. package/dist/renderer/assets/{index-DvKeLUQ8.js → index-BfJ1LHHo.js} +1 -1
  31. package/dist/renderer/assets/{index-on-scaWG.js → index-CrZRrTuv.js} +2 -2
  32. package/dist/renderer/assets/{pencil-BHu_seP7.js → pencil-0zLgPSJa.js} +1 -1
  33. package/dist/renderer/assets/{play-BoIfwVcE.js → play-fVd6Sq-t.js} +1 -1
  34. package/dist/renderer/assets/{plus-_5sDk2H8.js → plus-DmNVnnyt.js} +1 -1
  35. package/dist/renderer/assets/projects-Cm9nXtkn.js +1 -0
  36. package/dist/renderer/assets/{save-Bn9HUt7T.js → save-CSIMXP6Z.js} +1 -1
  37. package/dist/renderer/assets/{search-BOU1rpMw.js → search-Ddn9yqyb.js} +1 -1
  38. package/dist/renderer/assets/{server-BKF47usT.js → server-BVPINrD2.js} +1 -1
  39. package/dist/renderer/assets/{session-utils-B4vjXX1q.js → session-utils-BcyJwUyK.js} +1 -1
  40. package/dist/renderer/assets/{sessions-CtFBPvOB.js → sessions-BtcQ4TyW.js} +1 -1
  41. package/dist/renderer/assets/{shield-check-Q1O3wIT4.js → shield-check-B2sF2E4F.js} +1 -1
  42. package/dist/renderer/assets/{trash-2-CANqI4Db.js → trash-2-BwMAwl5Q.js} +1 -1
  43. package/dist/renderer/assets/{user-DTURDktb.js → user-BEZW7eDN.js} +1 -1
  44. package/dist/renderer/assets/{wifi-off-YfCo8Dbk.js → wifi-off-C1uypxZf.js} +1 -1
  45. package/dist/renderer/index.html +1 -1
  46. package/dist-electron/services/local-ai-core/src/scheduler/scheduled-conversation-executor.js +1 -1
  47. package/dist-electron/services/local-ai-core/src/scheduler/scheduler-service.js +24 -0
  48. package/dist-electron/tests/electron/workspace-task-store.test.js +54 -0
  49. package/package.json +1 -1
  50. package/dist/renderer/assets/projects-BR_Y3Dov.js +0 -1
@@ -1,4 +1,4 @@
1
- import{c as a}from"./index-on-scaWG.js";/**
1
+ import{c as a}from"./index-CrZRrTuv.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as o}from"./index-on-scaWG.js";/**
1
+ import{c as o}from"./index-CrZRrTuv.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as e}from"./index-on-scaWG.js";/**
1
+ import{c as e}from"./index-CrZRrTuv.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -0,0 +1 @@
1
+ import{D as t}from"./index-CrZRrTuv.js";const e=()=>t.get("/projects"),r=o=>t.get(`/projects/${o}`);export{r as g,e as l};
@@ -1,4 +1,4 @@
1
- import{c as a}from"./index-on-scaWG.js";/**
1
+ import{c as a}from"./index-CrZRrTuv.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c}from"./index-on-scaWG.js";/**
1
+ import{c}from"./index-CrZRrTuv.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as e}from"./index-on-scaWG.js";/**
1
+ import{c as e}from"./index-CrZRrTuv.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as o}from"./index-on-scaWG.js";/**
1
+ import{c as o}from"./index-CrZRrTuv.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{D as o}from"./index-on-scaWG.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};
1
+ import{D as o}from"./index-CrZRrTuv.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};
@@ -1,4 +1,4 @@
1
- import{c}from"./index-on-scaWG.js";/**
1
+ import{c}from"./index-CrZRrTuv.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as e}from"./index-on-scaWG.js";/**
1
+ import{c as e}from"./index-CrZRrTuv.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c}from"./index-on-scaWG.js";/**
1
+ import{c}from"./index-CrZRrTuv.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as a}from"./index-on-scaWG.js";/**
1
+ import{c as a}from"./index-CrZRrTuv.js";/**
2
2
  * @license lucide-react v0.487.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -5,7 +5,7 @@
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-on-scaWG.js"></script>
8
+ <script type="module" crossorigin src="./assets/index-CrZRrTuv.js"></script>
9
9
  <link rel="stylesheet" crossorigin href="./assets/index-CjCuR6DI.css">
10
10
  </head>
11
11
  <body class="bg-[#f5f5f7] dark:bg-[#151516]">
@@ -9,7 +9,7 @@ class ScheduledConversationExecutor {
9
9
  constructor(options) {
10
10
  this.options = options;
11
11
  }
12
- async execute(job, prompt, policy, timeoutMs = 15 * 60 * 1000) {
12
+ async execute(job, prompt, policy, timeoutMs = 60 * 60 * 1000) {
13
13
  const target = await policy.resolveTarget(job);
14
14
  await policy.beforeExecute?.(target, job);
15
15
  try {
@@ -4,6 +4,7 @@ exports.SchedulerService = void 0;
4
4
  const node_events_1 = require("node:events");
5
5
  const job_id_js_1 = require("./job-id.js");
6
6
  const scheduler_run_lifecycle_js_1 = require("./scheduler-run-lifecycle.js");
7
+ const SCHEDULER_AUTO_DISABLE_THRESHOLD = 5;
7
8
  class SchedulerService extends node_events_1.EventEmitter {
8
9
  options;
9
10
  timer = null;
@@ -148,11 +149,34 @@ class SchedulerService extends node_events_1.EventEmitter {
148
149
  this.options.eventBus.emit({ type: 'scheduler.job.updated', payload: nextJob });
149
150
  }
150
151
  this.options.log?.(`scheduler job failed ${job.id}: ${failed.error || 'unknown error'}`);
152
+ this.maybeAutoDisableAfterFailure(job.id);
151
153
  return failed;
152
154
  }
153
155
  finally {
154
156
  this.runningJobs.delete(job.id);
155
157
  }
156
158
  }
159
+ maybeAutoDisableAfterFailure(jobId) {
160
+ const runs = this.options.store.listScheduledJobRuns(jobId);
161
+ let consecutiveFailures = 0;
162
+ for (const run of runs) {
163
+ if (run.status === 'failed') {
164
+ consecutiveFailures += 1;
165
+ }
166
+ else {
167
+ break;
168
+ }
169
+ }
170
+ if (consecutiveFailures < SCHEDULER_AUTO_DISABLE_THRESHOLD) {
171
+ return;
172
+ }
173
+ this.options.store.updateScheduledJobStatus(jobId, { enabled: false });
174
+ const disabled = this.options.store.getScheduledJob(jobId);
175
+ if (disabled) {
176
+ this.emit('job', disabled);
177
+ this.options.eventBus.emit({ type: 'scheduler.job.updated', payload: disabled });
178
+ }
179
+ this.options.log?.(`scheduler auto-disabled job ${jobId} after ${consecutiveFailures} consecutive failures`);
180
+ }
157
181
  }
158
182
  exports.SchedulerService = SchedulerService;
@@ -972,6 +972,60 @@ const env_utils_js_1 = require("../../services/local-ai-core/src/runtime/env-uti
972
972
  (0, node_fs_1.rmSync)(userDataPath, { recursive: true, force: true });
973
973
  }
974
974
  });
975
+ (0, node_test_1.default)('scheduler auto-disables a job after 5 consecutive failures', async () => {
976
+ const userDataPath = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'scheduler-autodisable-'));
977
+ try {
978
+ const store = new local_core_acp_store_js_1.LocalCoreAcpStore(userDataPath);
979
+ const created = store.createScheduledJob({
980
+ workspaceId: 'workspace-a',
981
+ platform: 'local',
982
+ route: { type: 'local.thread', channelId: 'workspace-a', threadId: 'thread-1' },
983
+ executionMode: 'side-thread',
984
+ triggerType: 'cron',
985
+ cronExpr: '* * * * *',
986
+ promptTemplate: 'broken',
987
+ description: 'always-failing job',
988
+ enabled: true,
989
+ });
990
+ const logs = [];
991
+ const jobUpdates = [];
992
+ const scheduler = new scheduler_service_js_1.SchedulerService({
993
+ store,
994
+ triggers: [{
995
+ triggerTypes: ['cron'],
996
+ supports: () => true,
997
+ isDue: () => true,
998
+ }],
999
+ executors: [{
1000
+ deliveryTargets: ['local'],
1001
+ supports: () => true,
1002
+ execute: async () => {
1003
+ throw new Error("The 'gpt-5.3-codex' model is not supported");
1004
+ },
1005
+ }],
1006
+ eventBus: {
1007
+ emit: (event) => {
1008
+ if (event?.type === 'scheduler.job.updated') {
1009
+ jobUpdates.push({ enabled: event.payload.enabled });
1010
+ }
1011
+ },
1012
+ on: () => () => { },
1013
+ },
1014
+ log: (message) => logs.push(message),
1015
+ });
1016
+ for (let i = 0; i < 5; i += 1) {
1017
+ await scheduler.runJobNow(created.id);
1018
+ }
1019
+ const jobAfter = store.getScheduledJob(created.id);
1020
+ strict_1.default.equal(jobAfter?.enabled, false);
1021
+ strict_1.default.ok(logs.some((msg) => msg.includes('auto-disabled') && msg.includes('5 consecutive failures')), `expected auto-disable log, got: ${JSON.stringify(logs)}`);
1022
+ strict_1.default.ok(jobUpdates.some((update) => update.enabled === false));
1023
+ store.close();
1024
+ }
1025
+ finally {
1026
+ (0, node_fs_1.rmSync)(userDataPath, { recursive: true, force: true });
1027
+ }
1028
+ });
975
1029
  (0, node_test_1.default)('scheduled jobs normalize enum-like input before persistence', () => {
976
1030
  const userDataPath = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'scheduler-enum-store-'));
977
1031
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kafca/agentdock",
3
- "version": "0.1.49",
3
+ "version": "0.1.50",
4
4
  "license": "PolyForm-Noncommercial-1.0.0",
5
5
  "type": "module",
6
6
  "main": "dist-electron/electron/main.js",
@@ -1 +0,0 @@
1
- import{D as t}from"./index-on-scaWG.js";const e=()=>t.get("/projects"),r=o=>t.get(`/projects/${o}`);export{r as g,e as l};