@cyanautomation/kaseki-agent 1.41.0 → 1.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"kaseki-api-web.d.ts","sourceRoot":"","sources":["../src/kaseki-api-web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AA+fjC,wBAAgB,eAAe,IAAI,MAAM,CAQxC"}
1
+ {"version":3,"file":"kaseki-api-web.d.ts","sourceRoot":"","sources":["../src/kaseki-api-web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAqsBjC,wBAAgB,eAAe,IAAI,MAAM,CAQxC"}
@@ -82,8 +82,8 @@ const controllerPage = String.raw `<!doctype html>
82
82
  outline: 3px solid color-mix(in srgb, var(--focus) 35%, transparent);
83
83
  outline-offset: 1px;
84
84
  }
85
- .grid, .checks, .action-row, .run-status { display: grid; gap: var(--control-gap); }
86
- .grid, .checks, .action-row, .run-status { grid-template-columns: minmax(0, 1fr); }
85
+ .grid, .checks, .action-row, .run-status, .summary-grid, .link-grid { display: grid; gap: var(--control-gap); }
86
+ .grid, .checks, .action-row, .run-status, .summary-grid, .link-grid { grid-template-columns: minmax(0, 1fr); }
87
87
  .check {
88
88
  align-items: center;
89
89
  display: flex;
@@ -97,9 +97,46 @@ const controllerPage = String.raw `<!doctype html>
97
97
  .check-helper { color: var(--muted); font-size: 14px; line-height: 1.5; }
98
98
  .action-row { align-items: end; }
99
99
  .action-row > button, .run-status > button { width: 100%; }
100
- .action-row > button, .run-status > button { width: 100%; }
101
- .action-row > button, .run-status > button { width: 100%; }
102
100
  .run-status { grid-template-columns: minmax(0, 1fr); }
101
+ .summary-grid {
102
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
103
+ }
104
+ .summary-card {
105
+ background: #f7faf8;
106
+ border: 1px solid var(--line);
107
+ border-radius: 8px;
108
+ display: grid;
109
+ gap: 4px;
110
+ min-height: 76px;
111
+ padding: var(--space-2);
112
+ }
113
+ .summary-label { color: var(--muted); font-size: 13px; font-weight: 650; }
114
+ .summary-value { color: var(--ink); font-size: 18px; font-weight: 700; overflow-wrap: anywhere; }
115
+ .summary-value.ok { color: var(--ok); }
116
+ .summary-value.bad { color: var(--bad); }
117
+ .run-links {
118
+ background: #f7faf8;
119
+ border: 1px solid var(--line);
120
+ border-radius: 8px;
121
+ display: grid;
122
+ gap: var(--space-2);
123
+ padding: var(--space-3);
124
+ }
125
+ .run-links[hidden] { display: none; }
126
+ .link-grid { grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); }
127
+ .link-grid a {
128
+ align-items: center;
129
+ background: #eef2ee;
130
+ border: 1px solid #99aaa5;
131
+ border-radius: 6px;
132
+ color: var(--ink);
133
+ display: inline-flex;
134
+ font-weight: 650;
135
+ justify-content: center;
136
+ min-height: var(--control-min-height);
137
+ padding: var(--control-pad);
138
+ text-decoration: none;
139
+ }
103
140
  button {
104
141
  background: var(--ink);
105
142
  color: #fff;
@@ -110,6 +147,7 @@ const controllerPage = String.raw `<!doctype html>
110
147
  button.secondary { background: #eef2ee; color: var(--ink); }
111
148
  button.run { background: var(--accent); }
112
149
  button:disabled { cursor: wait; opacity: .65; }
150
+ .toolbar-button { white-space: nowrap; }
113
151
  .response-panel {
114
152
  background: #172022;
115
153
  border: 1px solid #2e3a3d;
@@ -259,7 +297,25 @@ const controllerPage = String.raw `<!doctype html>
259
297
  <button class="health-check-button" data-probe="/health" type="button">Health<span class="health-check-status" data-status="health"></span></button>
260
298
  <button class="health-check-button" data-probe="/ready" type="button">Readiness<span class="health-check-status" data-status="readiness"></span></button>
261
299
  <button class="health-check-button" data-probe="/api/preflight" data-auth="true" type="button">Preflight<span class="health-check-status" data-status="preflight"></span></button>
262
- <button class="health-check-button" id="status-check" type="button">Check Status<span class="health-check-status" data-status="status"></span></button>
300
+ <button class="health-check-button" id="status-check" type="button">Check status<span class="health-check-status" data-status="status"></span></button>
301
+ </div>
302
+ <div class="summary-grid" id="health-summary" aria-live="polite">
303
+ <div class="summary-card">
304
+ <span class="summary-label">Controller</span>
305
+ <span class="summary-value" data-summary="controller">Not checked</span>
306
+ </div>
307
+ <div class="summary-card">
308
+ <span class="summary-label">Queue</span>
309
+ <span class="summary-value" data-summary="queue">Not checked</span>
310
+ </div>
311
+ <div class="summary-card">
312
+ <span class="summary-label">Preflight</span>
313
+ <span class="summary-value" data-summary="preflight">Not checked</span>
314
+ </div>
315
+ <div class="summary-card">
316
+ <span class="summary-label">Run</span>
317
+ <span class="summary-value" data-summary="run">No run selected</span>
318
+ </div>
263
319
  </div>
264
320
  <div class="form-field">
265
321
  <label for="run-id">Run ID (for Check Status)</label>
@@ -267,7 +323,7 @@ const controllerPage = String.raw `<!doctype html>
267
323
  </div>
268
324
  <div id="state" role="status" aria-live="polite"></div>
269
325
  </div>
270
- <div id="submit-tab" class="tab-content hidden" role="tabpanel" aria-labelledby="submit-heading">
326
+ <div id="submit-tab" class="tab-content hidden" role="tabpanel" aria-labelledby="submit-heading" hidden aria-hidden="true">
271
327
  <div>
272
328
  <h2 id="submit-heading">Submit Repository Task</h2>
273
329
  <p>Configure and submit a task for the ephemeral agent to execute.</p>
@@ -291,12 +347,47 @@ const controllerPage = String.raw `<!doctype html>
291
347
  <textarea id="task-prompt" name="taskPrompt" required minlength="10" placeholder="Describe the task for the ephemeral agent."></textarea>
292
348
  <p class="field-error" data-error-for="taskPrompt" aria-live="polite"></p>
293
349
  </div>
294
- <!-- Hidden fields with defaults -->
295
- <input id="ref" name="ref" type="hidden" value="main">
296
- <input id="publish-mode" name="publishMode" type="hidden" value="auto">
297
- <input id="task-mode" name="taskMode" type="hidden" value="patch">
298
- <input id="timeout-seconds" name="timeoutSeconds" type="hidden" value="10800">
299
- <input id="scouting" name="scouting" type="hidden" value="true">
350
+ <div class="grid">
351
+ <div class="form-field">
352
+ <label for="ref">Git ref</label>
353
+ <input id="ref" name="ref" value="main" placeholder="main">
354
+ <p class="field-helper">Branch, tag, or commit SHA to start from.</p>
355
+ </div>
356
+ <div class="form-field">
357
+ <label for="timeout-seconds">Timeout</label>
358
+ <input id="timeout-seconds" name="timeoutSeconds" type="number" min="60" max="10800" step="60" value="10800">
359
+ <p class="field-helper">Run timeout in seconds.</p>
360
+ </div>
361
+ <div class="form-field">
362
+ <label for="task-mode">Task mode</label>
363
+ <select id="task-mode" name="taskMode">
364
+ <option value="patch" selected>Patch</option>
365
+ <option value="inspect">Inspect</option>
366
+ </select>
367
+ </div>
368
+ <div class="form-field">
369
+ <label for="publish-mode">Publish mode</label>
370
+ <select id="publish-mode" name="publishMode">
371
+ <option value="pr" selected>Pull request</option>
372
+ <option value="draft_pr">Draft pull request</option>
373
+ <option value="branch">Branch only</option>
374
+ <option value="auto">Auto</option>
375
+ <option value="none">None</option>
376
+ </select>
377
+ </div>
378
+ </div>
379
+ </fieldset>
380
+ <fieldset>
381
+ <legend>Options</legend>
382
+ <div class="form-field">
383
+ <div class="check">
384
+ <input name="scouting" type="checkbox" checked>
385
+ <div class="check-copy">
386
+ <label class="check-label">Enable scouting mode</label>
387
+ <div class="check-helper">Allow the agent to explore beyond the specified scope (experimental).</div>
388
+ </div>
389
+ </div>
390
+ </div>
300
391
  </fieldset>
301
392
  <fieldset>
302
393
  <legend>Run actions</legend>
@@ -312,6 +403,15 @@ const controllerPage = String.raw `<!doctype html>
312
403
  <div>
313
404
  <h2 id="responses-heading">Responses</h2>
314
405
  </div>
406
+ <div class="run-links" id="run-links" hidden>
407
+ <strong>Run follow-through</strong>
408
+ <div class="link-grid">
409
+ <a data-run-link="status" href="#">Status</a>
410
+ <a data-run-link="events" href="#">Events</a>
411
+ <a data-run-link="stdout" href="#">Stdout</a>
412
+ <a data-run-link="artifacts" href="#">Artifacts</a>
413
+ </div>
414
+ </div>
315
415
  <div class="response-panel">
316
416
  <p class="response-meta" id="output-meta" aria-live="polite">Status: idle</p>
317
417
  <pre class="response-log empty" id="output" aria-live="polite">No output yet. Run a health check or submit a task to see responses.</pre>
@@ -325,6 +425,8 @@ const controllerPage = String.raw `<!doctype html>
325
425
  const state = document.querySelector('#state');
326
426
  const tokenInput = document.querySelector('#token');
327
427
  const runIdInput = document.querySelector('#run-id');
428
+ const runLinks = document.querySelector('#run-links');
429
+ let pollTimer = null;
328
430
  tokenInput.value = sessionStorage.getItem('kasekiApiToken') || '';
329
431
 
330
432
  function sanitizeOutput(value) {
@@ -354,6 +456,66 @@ const controllerPage = String.raw `<!doctype html>
354
456
  output.classList.toggle('empty', !text);
355
457
  }
356
458
 
459
+ function setSummary(key, value, kind) {
460
+ const element = document.querySelector('[data-summary="' + key + '"]');
461
+ if (!element) return;
462
+ element.textContent = value;
463
+ element.className = 'summary-value' + (kind ? ' ' + kind : '');
464
+ }
465
+
466
+ function runUrl(runId, suffix) {
467
+ return '/api/runs/' + encodeURIComponent(runId) + suffix;
468
+ }
469
+
470
+ function showRunLinks(runId) {
471
+ if (!runId) return;
472
+ const links = {
473
+ status: runUrl(runId, '/status'),
474
+ events: runUrl(runId, '/events?tail=50'),
475
+ stdout: runUrl(runId, '/logs/stdout?tail=lines&lines=200'),
476
+ artifacts: runUrl(runId, '/artifacts'),
477
+ };
478
+ Object.entries(links).forEach(([key, href]) => {
479
+ const link = document.querySelector('[data-run-link="' + key + '"]');
480
+ if (link) link.href = href;
481
+ });
482
+ runLinks.hidden = false;
483
+ }
484
+
485
+ function isTerminalStatus(status) {
486
+ return status === 'completed' || status === 'failed';
487
+ }
488
+
489
+ function stopPolling() {
490
+ if (pollTimer) clearTimeout(pollTimer);
491
+ pollTimer = null;
492
+ }
493
+
494
+ function summarizeHealth(path, payload) {
495
+ if (path === '/health') {
496
+ setSummary('controller', payload.status || 'Healthy', 'ok');
497
+ if (payload.queue) {
498
+ setSummary('queue', String(payload.queue.running || 0) + ' running, ' + String(payload.queue.pending || 0) + ' pending', 'ok');
499
+ }
500
+ }
501
+ if (path === '/ready') {
502
+ setSummary('controller', payload.status || 'Ready', 'ok');
503
+ }
504
+ if (path === '/api/preflight') {
505
+ const checks = Array.isArray(payload.checks) ? payload.checks : [];
506
+ const failed = checks.filter((check) => !check.ok);
507
+ setSummary('preflight', failed.length === 0 ? String(checks.length) + ' checks passed' : String(failed.length) + ' failed', failed.length === 0 ? 'ok' : 'bad');
508
+ }
509
+ }
510
+
511
+ function summarizeRun(payload) {
512
+ if (!payload || !payload.status) return;
513
+ const bits = [payload.status];
514
+ if (payload.progress && payload.progress.stage) bits.push(payload.progress.stage);
515
+ if (payload.progress && typeof payload.progress.percentComplete === 'number') bits.push(String(payload.progress.percentComplete) + '%');
516
+ setSummary('run', bits.join(' - '), payload.status === 'failed' ? 'bad' : 'ok');
517
+ }
518
+
357
519
  function requestBody() {
358
520
  const data = new FormData(form);
359
521
  const timeoutSeconds = String(data.get('timeoutSeconds') || '10800').trim();
@@ -363,8 +525,10 @@ const controllerPage = String.raw `<!doctype html>
363
525
  taskPrompt: String(data.get('taskPrompt') || '').trim(),
364
526
  publishMode: String(data.get('publishMode') || 'auto'),
365
527
  taskMode: String(data.get('taskMode') || 'patch'),
366
- scouting: { enabled: true },
367
528
  };
529
+ if (data.get('scouting') === 'on') {
530
+ body.scouting = { enabled: true };
531
+ }
368
532
  const parsed = Number(timeoutSeconds);
369
533
  if (!isNaN(parsed)) {
370
534
  body.timeoutSeconds = parsed;
@@ -401,6 +565,11 @@ const controllerPage = String.raw `<!doctype html>
401
565
  response: payload,
402
566
  }, null, 2));
403
567
  setState(response.ok ? 'Request completed.' : 'Request failed.', response.ok ? 'ok' : 'bad');
568
+ if (response.ok && payload && typeof payload === 'object') {
569
+ summarizeHealth(path, payload);
570
+ summarizeRun(payload);
571
+ if (runId) showRunLinks(runId);
572
+ }
404
573
  return { payload, response };
405
574
  }
406
575
 
@@ -409,31 +578,58 @@ const controllerPage = String.raw `<!doctype html>
409
578
  setOutputMetadata('running', String(runIdInput.value || '').trim() || undefined);
410
579
  setState('Contacting the controller...');
411
580
  try {
412
- await apiRequest(path, options);
581
+ return await apiRequest(path, options);
413
582
  } catch (error) {
414
583
  setOutputMetadata('failed', String(runIdInput.value || '').trim() || undefined);
415
584
  setOutputBody(sanitizeOutput(error instanceof Error ? error.message : String(error)));
416
585
  setState('Request could not be sent.', 'bad');
586
+ return { payload: null, response: { ok: false } };
417
587
  } finally {
418
588
  button.disabled = false;
419
589
  }
420
590
  }
421
591
 
592
+ async function pollRun(runId) {
593
+ stopPolling();
594
+ if (!runId) return;
595
+ let retryCount = 0;
596
+ const maxRetries = 36;
597
+ async function poll() {
598
+ try {
599
+ const result = await apiRequest(runUrl(runId, '/status'), { auth: true });
600
+ summarizeRun(result.payload);
601
+ retryCount = 0;
602
+ if (result.response.ok && result.payload && result.payload.status && !isTerminalStatus(result.payload.status)) {
603
+ pollTimer = setTimeout(poll, 5000);
604
+ }
605
+ } catch {
606
+ retryCount++;
607
+ if (retryCount < maxRetries) {
608
+ pollTimer = setTimeout(poll, 10000);
609
+ } else {
610
+ setState('Polling stopped after repeated failures.', 'bad');
611
+ }
612
+ }
613
+ }
614
+ poll();
615
+ }
616
+
422
617
  // Tab switching
423
618
  document.querySelectorAll('.tab-button').forEach((button) => {
424
619
  button.addEventListener('click', () => {
425
620
  const tabName = button.dataset.tab;
426
- // Update tab buttons
427
621
  document.querySelectorAll('.tab-button').forEach(b => {
428
- b.classList.toggle('active', b.dataset.tab === tabName);
429
- b.setAttribute('aria-selected', b.dataset.tab === tabName ? 'true' : 'false');
622
+ const active = b.dataset.tab === tabName;
623
+ b.classList.toggle('active', active);
624
+ b.setAttribute('aria-selected', active ? 'true' : 'false');
430
625
  });
431
- // Update tab content
432
626
  document.querySelectorAll('.tab-content').forEach(content => {
433
627
  const contentTabName = content.id.replace('-tab', '');
434
- content.classList.toggle('hidden', contentTabName !== tabName);
628
+ const active = contentTabName === tabName;
629
+ content.classList.toggle('hidden', !active);
630
+ content.hidden = !active;
631
+ content.setAttribute('aria-hidden', active ? 'false' : 'true');
435
632
  });
436
- // Store preference
437
633
  sessionStorage.setItem('kasekiActiveTab', tabName);
438
634
  });
439
635
  });
@@ -445,16 +641,15 @@ const controllerPage = String.raw `<!doctype html>
445
641
  // Health check button handlers
446
642
  document.querySelectorAll('[data-probe]').forEach((button) => {
447
643
  button.addEventListener('click', () => {
448
- const statusKey = button.dataset.probe.replace(/\//g, '-').replace('-api-', '-');
449
- const statusEl = document.querySelector('[data-status="' + statusKey + '"]');
644
+ const statusEl = button.querySelector('.health-check-status');
450
645
  if (statusEl) {
451
646
  statusEl.className = 'health-check-status spinner';
452
647
  }
453
648
  run(button, button.dataset.probe, {
454
649
  auth: button.dataset.auth === 'true',
455
- }).then(() => {
650
+ }).then(({ response }) => {
456
651
  if (statusEl) {
457
- statusEl.className = 'health-check-status ok';
652
+ statusEl.className = response.ok ? 'health-check-status ok' : 'health-check-status bad';
458
653
  }
459
654
  }).catch(() => {
460
655
  if (statusEl) {
@@ -477,7 +672,8 @@ const controllerPage = String.raw `<!doctype html>
477
672
  setState('Run status needs a run ID.', 'bad');
478
673
  return;
479
674
  }
480
- run(event.currentTarget, '/api/runs/' + encodeURIComponent(runId) + '/status', { auth: true });
675
+ showRunLinks(runId);
676
+ run(event.currentTarget, runUrl(runId, '/status'), { auth: true });
481
677
  });
482
678
 
483
679
  form.addEventListener('submit', (event) => {
@@ -491,7 +687,9 @@ const controllerPage = String.raw `<!doctype html>
491
687
  .then(({ payload, response }) => {
492
688
  if (response.ok && payload && typeof payload.id === 'string') {
493
689
  runIdInput.value = payload.id;
494
- setOutputMetadata('completed', payload.id);
690
+ showRunLinks(payload.id);
691
+ setOutputMetadata('queued', payload.id);
692
+ pollRun(payload.id);
495
693
  }
496
694
  })
497
695
  .catch((error) => {
@@ -510,7 +708,7 @@ const controllerPage = String.raw `<!doctype html>
510
708
  export function createWebRouter() {
511
709
  const router = Router();
512
710
  router.get(['/', '/ui'], (_req, res) => {
513
- res.set('Content-Security-Policy', "default-src 'self'; base-uri 'none'; form-action 'self'; frame-ancestors 'none'; object-src 'none'; script-src 'unsafe-inline'");
711
+ res.set('Content-Security-Policy', "default-src 'self'; base-uri 'none'; form-action 'self'; frame-ancestors 'none'; object-src 'none'; style-src 'unsafe-inline'; script-src 'unsafe-inline'");
514
712
  res.set('Referrer-Policy', 'no-referrer');
515
713
  res.type('html').send(controllerPage);
516
714
  });
@@ -1 +1 @@
1
- {"version":3,"file":"kaseki-api-web.js","sourceRoot":"","sources":["../src/kaseki-api-web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2fhC,CAAC;AAEF,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACrC,GAAG,CAAC,GAAG,CAAC,yBAAyB,EAAE,gIAAgI,CAAC,CAAC;QACrK,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;QAC1C,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"kaseki-api-web.js","sourceRoot":"","sources":["../src/kaseki-api-web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAisBhC,CAAC;AAEF,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACrC,GAAG,CAAC,GAAG,CAAC,yBAAyB,EAAE,2JAA2J,CAAC,CAAC;QAChM,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;QAC1C,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cyanautomation/kaseki-agent",
3
- "version": "1.41.0",
3
+ "version": "1.43.0",
4
4
  "description": "Admin/helper/doctor toolbox and local API client for Kaseki diagnostics, setup, and API-backed coding-agent task workflows",
5
5
  "type": "module",
6
6
  "license": "MIT",