wildcrane-runner 0.6.6 → 0.6.9

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/dist/runner.mjs CHANGED
@@ -1,4 +1,4 @@
1
- // wildcrane-runner 0.6.6 — built by runner/scripts/build.mjs. Do not edit.
1
+ // wildcrane-runner 0.6.9 — built by runner/scripts/build.mjs. Do not edit.
2
2
  import { createRequire as __ai4kanbanRequire } from 'node:module'
3
3
  const require = __ai4kanbanRequire(import.meta.url)
4
4
  var __create = Object.create;
@@ -49,9 +49,9 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
49
49
  mod
50
50
  ));
51
51
 
52
- // ../../../../../../git/ai4kanban/runner/node_modules/react/cjs/react.production.js
52
+ // node_modules/react/cjs/react.production.js
53
53
  var require_react_production = __commonJS({
54
- "../../../../../../git/ai4kanban/runner/node_modules/react/cjs/react.production.js"(exports) {
54
+ "node_modules/react/cjs/react.production.js"(exports) {
55
55
  "use strict";
56
56
  var REACT_ELEMENT_TYPE = /* @__PURE__ */ Symbol.for("react.transitional.element");
57
57
  var REACT_PORTAL_TYPE = /* @__PURE__ */ Symbol.for("react.portal");
@@ -501,9 +501,9 @@ var require_react_production = __commonJS({
501
501
  }
502
502
  });
503
503
 
504
- // ../../../../../../git/ai4kanban/runner/node_modules/react/cjs/react.development.js
504
+ // node_modules/react/cjs/react.development.js
505
505
  var require_react_development = __commonJS({
506
- "../../../../../../git/ai4kanban/runner/node_modules/react/cjs/react.development.js"(exports, module) {
506
+ "node_modules/react/cjs/react.development.js"(exports, module) {
507
507
  "use strict";
508
508
  "production" !== process.env.NODE_ENV && (function() {
509
509
  function defineDeprecationWarning(methodName, info) {
@@ -1498,9 +1498,9 @@ var require_react_development = __commonJS({
1498
1498
  }
1499
1499
  });
1500
1500
 
1501
- // ../../../../../../git/ai4kanban/runner/node_modules/react/index.js
1501
+ // node_modules/react/index.js
1502
1502
  var require_react = __commonJS({
1503
- "../../../../../../git/ai4kanban/runner/node_modules/react/index.js"(exports, module) {
1503
+ "node_modules/react/index.js"(exports, module) {
1504
1504
  "use strict";
1505
1505
  if (process.env.NODE_ENV === "production") {
1506
1506
  module.exports = require_react_production();
@@ -1510,9 +1510,9 @@ var require_react = __commonJS({
1510
1510
  }
1511
1511
  });
1512
1512
 
1513
- // ../../../../../../git/ai4kanban/runner/node_modules/react/cjs/react-jsx-runtime.production.js
1513
+ // node_modules/react/cjs/react-jsx-runtime.production.js
1514
1514
  var require_react_jsx_runtime_production = __commonJS({
1515
- "../../../../../../git/ai4kanban/runner/node_modules/react/cjs/react-jsx-runtime.production.js"(exports) {
1515
+ "node_modules/react/cjs/react-jsx-runtime.production.js"(exports) {
1516
1516
  "use strict";
1517
1517
  var REACT_ELEMENT_TYPE = /* @__PURE__ */ Symbol.for("react.transitional.element");
1518
1518
  var REACT_FRAGMENT_TYPE = /* @__PURE__ */ Symbol.for("react.fragment");
@@ -1540,9 +1540,9 @@ var require_react_jsx_runtime_production = __commonJS({
1540
1540
  }
1541
1541
  });
1542
1542
 
1543
- // ../../../../../../git/ai4kanban/runner/node_modules/react/cjs/react-jsx-runtime.development.js
1543
+ // node_modules/react/cjs/react-jsx-runtime.development.js
1544
1544
  var require_react_jsx_runtime_development = __commonJS({
1545
- "../../../../../../git/ai4kanban/runner/node_modules/react/cjs/react-jsx-runtime.development.js"(exports) {
1545
+ "node_modules/react/cjs/react-jsx-runtime.development.js"(exports) {
1546
1546
  "use strict";
1547
1547
  "production" !== process.env.NODE_ENV && (function() {
1548
1548
  function getComponentNameFromType(type) {
@@ -1811,9 +1811,9 @@ var require_react_jsx_runtime_development = __commonJS({
1811
1811
  }
1812
1812
  });
1813
1813
 
1814
- // ../../../../../../git/ai4kanban/runner/node_modules/react/jsx-runtime.js
1814
+ // node_modules/react/jsx-runtime.js
1815
1815
  var require_jsx_runtime = __commonJS({
1816
- "../../../../../../git/ai4kanban/runner/node_modules/react/jsx-runtime.js"(exports, module) {
1816
+ "node_modules/react/jsx-runtime.js"(exports, module) {
1817
1817
  "use strict";
1818
1818
  if (process.env.NODE_ENV === "production") {
1819
1819
  module.exports = require_react_jsx_runtime_production();
@@ -1823,9 +1823,9 @@ var require_jsx_runtime = __commonJS({
1823
1823
  }
1824
1824
  });
1825
1825
 
1826
- // ../../../../../../git/ai4kanban/runner/node_modules/react-dom/cjs/react-dom.production.js
1826
+ // node_modules/react-dom/cjs/react-dom.production.js
1827
1827
  var require_react_dom_production = __commonJS({
1828
- "../../../../../../git/ai4kanban/runner/node_modules/react-dom/cjs/react-dom.production.js"(exports) {
1828
+ "node_modules/react-dom/cjs/react-dom.production.js"(exports) {
1829
1829
  "use strict";
1830
1830
  var React4 = require_react();
1831
1831
  function formatProdErrorMessage(code) {
@@ -1980,9 +1980,9 @@ var require_react_dom_production = __commonJS({
1980
1980
  }
1981
1981
  });
1982
1982
 
1983
- // ../../../../../../git/ai4kanban/runner/node_modules/react-dom/cjs/react-dom.development.js
1983
+ // node_modules/react-dom/cjs/react-dom.development.js
1984
1984
  var require_react_dom_development = __commonJS({
1985
- "../../../../../../git/ai4kanban/runner/node_modules/react-dom/cjs/react-dom.development.js"(exports) {
1985
+ "node_modules/react-dom/cjs/react-dom.development.js"(exports) {
1986
1986
  "use strict";
1987
1987
  "production" !== process.env.NODE_ENV && (function() {
1988
1988
  function noop() {
@@ -2235,9 +2235,9 @@ var require_react_dom_development = __commonJS({
2235
2235
  }
2236
2236
  });
2237
2237
 
2238
- // ../../../../../../git/ai4kanban/runner/node_modules/react-dom/index.js
2238
+ // node_modules/react-dom/index.js
2239
2239
  var require_react_dom = __commonJS({
2240
- "../../../../../../git/ai4kanban/runner/node_modules/react-dom/index.js"(exports, module) {
2240
+ "node_modules/react-dom/index.js"(exports, module) {
2241
2241
  "use strict";
2242
2242
  function checkDCE() {
2243
2243
  if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === "undefined" || typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== "function") {
@@ -2261,9 +2261,9 @@ var require_react_dom = __commonJS({
2261
2261
  }
2262
2262
  });
2263
2263
 
2264
- // ../../../../../../git/ai4kanban/runner/node_modules/react-dom/cjs/react-dom-server-legacy.node.production.js
2264
+ // node_modules/react-dom/cjs/react-dom-server-legacy.node.production.js
2265
2265
  var require_react_dom_server_legacy_node_production = __commonJS({
2266
- "../../../../../../git/ai4kanban/runner/node_modules/react-dom/cjs/react-dom-server-legacy.node.production.js"(exports) {
2266
+ "node_modules/react-dom/cjs/react-dom-server-legacy.node.production.js"(exports) {
2267
2267
  "use strict";
2268
2268
  var React4 = require_react();
2269
2269
  var ReactDOM = require_react_dom();
@@ -7512,12 +7512,12 @@ A.finished.finally(function(){document.__reactViewTransition===A&&(document.__re
7512
7512
  }
7513
7513
  });
7514
7514
 
7515
- // ../../../../../../git/ai4kanban/runner/node_modules/react-dom/cjs/react-dom-server.node.production.js
7515
+ // node_modules/react-dom/cjs/react-dom-server.node.production.js
7516
7516
  var require_react_dom_server_node_production = __commonJS({
7517
- "../../../../../../git/ai4kanban/runner/node_modules/react-dom/cjs/react-dom-server.node.production.js"(exports) {
7517
+ "node_modules/react-dom/cjs/react-dom-server.node.production.js"(exports) {
7518
7518
  "use strict";
7519
7519
  var util = __require("util");
7520
- var crypto6 = __require("crypto");
7520
+ var crypto7 = __require("crypto");
7521
7521
  var async_hooks = __require("async_hooks");
7522
7522
  var React4 = require_react();
7523
7523
  var ReactDOM = require_react_dom();
@@ -7572,13 +7572,13 @@ var require_react_dom_server_node_production = __commonJS({
7572
7572
  var target = currentView;
7573
7573
  0 < writtenBytes && (target = currentView.subarray(writtenBytes));
7574
7574
  target = textEncoder.encodeInto(chunk, target);
7575
- var read = target.read;
7575
+ var read2 = target.read;
7576
7576
  writtenBytes += target.written;
7577
- read < chunk.length && (writeToDestination(
7577
+ read2 < chunk.length && (writeToDestination(
7578
7578
  destination,
7579
7579
  currentView.subarray(0, writtenBytes)
7580
7580
  ), currentView = new Uint8Array(4096), writtenBytes = textEncoder.encodeInto(
7581
- chunk.slice(read),
7581
+ chunk.slice(read2),
7582
7582
  currentView
7583
7583
  ).written);
7584
7584
  4096 === writtenBytes && (writeToDestination(destination, currentView), currentView = new Uint8Array(4096), writtenBytes = 0);
@@ -10382,7 +10382,7 @@ var require_react_dom_server_node_production = __commonJS({
10382
10382
  function createPostbackActionStateKey(permalink, componentKeyPath, hookIndex) {
10383
10383
  if (void 0 !== permalink) return "p" + permalink;
10384
10384
  permalink = JSON.stringify([componentKeyPath, null, hookIndex]);
10385
- componentKeyPath = crypto6.createHash("md5");
10385
+ componentKeyPath = crypto7.createHash("md5");
10386
10386
  componentKeyPath.update(permalink);
10387
10387
  return "k" + componentKeyPath.digest("hex");
10388
10388
  }
@@ -13686,9 +13686,9 @@ A.finished.finally(function(){document.__reactViewTransition===A&&(document.__re
13686
13686
  }
13687
13687
  });
13688
13688
 
13689
- // ../../../../../../git/ai4kanban/runner/node_modules/react-dom/cjs/react-dom-server-legacy.node.development.js
13689
+ // node_modules/react-dom/cjs/react-dom-server-legacy.node.development.js
13690
13690
  var require_react_dom_server_legacy_node_development = __commonJS({
13691
- "../../../../../../git/ai4kanban/runner/node_modules/react-dom/cjs/react-dom-server-legacy.node.development.js"(exports) {
13691
+ "node_modules/react-dom/cjs/react-dom-server-legacy.node.development.js"(exports) {
13692
13692
  "use strict";
13693
13693
  "production" !== process.env.NODE_ENV && (function() {
13694
13694
  function styleReplacer(match, prefix2, s, suffix2) {
@@ -17474,9 +17474,9 @@ var require_react_dom_server_legacy_node_development = __commonJS({
17474
17474
  });
17475
17475
  return errorInfo;
17476
17476
  }
17477
- function encodeErrorForBoundary(boundary, digest, error, thrownInfo, wasAborted) {
17478
- boundary.errorDigest = digest;
17479
- isRecoverableError(error) ? boundary.errorMessage = wasAborted ? "Switched to client rendering because the server render was aborted with a request to render on the client." : "Switched to client rendering because a component requested it." : (error instanceof Error ? (digest = String(error.message), error = String(error.stack)) : (digest = "object" === typeof error && null !== error ? describeObjectForErrorMessage(error) : String(error), error = null), wasAborted = wasAborted ? "Switched to client rendering because the server rendering aborted due to:\n\n" : "Switched to client rendering because the server rendering errored:\n\n", boundary.errorMessage = wasAborted + digest, boundary.errorStack = null !== error ? wasAborted + error : null);
17477
+ function encodeErrorForBoundary(boundary, digest2, error, thrownInfo, wasAborted) {
17478
+ boundary.errorDigest = digest2;
17479
+ isRecoverableError(error) ? boundary.errorMessage = wasAborted ? "Switched to client rendering because the server render was aborted with a request to render on the client." : "Switched to client rendering because a component requested it." : (error instanceof Error ? (digest2 = String(error.message), error = String(error.stack)) : (digest2 = "object" === typeof error && null !== error ? describeObjectForErrorMessage(error) : String(error), error = null), wasAborted = wasAborted ? "Switched to client rendering because the server rendering aborted due to:\n\n" : "Switched to client rendering because the server rendering errored:\n\n", boundary.errorMessage = wasAborted + digest2, boundary.errorStack = null !== error ? wasAborted + error : null);
17480
17480
  boundary.errorComponentStack = thrownInfo.componentStack;
17481
17481
  }
17482
17482
  function logRecoverableError(request2, error, errorInfo, debugTask) {
@@ -21196,9 +21196,9 @@ A.finished.finally(function(){document.__reactViewTransition===A&&(document.__re
21196
21196
  }
21197
21197
  });
21198
21198
 
21199
- // ../../../../../../git/ai4kanban/runner/node_modules/react-dom/cjs/react-dom-server.node.development.js
21199
+ // node_modules/react-dom/cjs/react-dom-server.node.development.js
21200
21200
  var require_react_dom_server_node_development = __commonJS({
21201
- "../../../../../../git/ai4kanban/runner/node_modules/react-dom/cjs/react-dom-server.node.development.js"(exports) {
21201
+ "node_modules/react-dom/cjs/react-dom-server.node.development.js"(exports) {
21202
21202
  "use strict";
21203
21203
  "production" !== process.env.NODE_ENV && (function() {
21204
21204
  function styleReplacer(match, prefix2, s, suffix2) {
@@ -21328,13 +21328,13 @@ var require_react_dom_server_node_development = __commonJS({
21328
21328
  var target = currentView;
21329
21329
  0 < writtenBytes && (target = currentView.subarray(writtenBytes));
21330
21330
  target = textEncoder.encodeInto(chunk, target);
21331
- var read = target.read;
21331
+ var read2 = target.read;
21332
21332
  writtenBytes += target.written;
21333
- read < chunk.length && (writeToDestination(
21333
+ read2 < chunk.length && (writeToDestination(
21334
21334
  destination,
21335
21335
  currentView.subarray(0, writtenBytes)
21336
21336
  ), currentView = new Uint8Array(4096), writtenBytes = textEncoder.encodeInto(
21337
- chunk.slice(read),
21337
+ chunk.slice(read2),
21338
21338
  currentView
21339
21339
  ).written);
21340
21340
  4096 === writtenBytes && (writeToDestination(destination, currentView), currentView = new Uint8Array(4096), writtenBytes = 0);
@@ -24376,7 +24376,7 @@ var require_react_dom_server_node_development = __commonJS({
24376
24376
  function createPostbackActionStateKey(permalink, componentKeyPath, hookIndex) {
24377
24377
  if (void 0 !== permalink) return "p" + permalink;
24378
24378
  permalink = JSON.stringify([componentKeyPath, null, hookIndex]);
24379
- componentKeyPath = crypto6.createHash("md5");
24379
+ componentKeyPath = crypto7.createHash("md5");
24380
24380
  componentKeyPath.update(permalink);
24381
24381
  return "k" + componentKeyPath.digest("hex");
24382
24382
  }
@@ -25186,9 +25186,9 @@ var require_react_dom_server_node_development = __commonJS({
25186
25186
  });
25187
25187
  return errorInfo;
25188
25188
  }
25189
- function encodeErrorForBoundary(boundary, digest, error, thrownInfo, wasAborted) {
25190
- boundary.errorDigest = digest;
25191
- isRecoverableError(error) ? boundary.errorMessage = wasAborted ? "Switched to client rendering because the server render was aborted with a request to render on the client." : "Switched to client rendering because a component requested it." : (error instanceof Error ? (digest = String(error.message), error = String(error.stack)) : (digest = "object" === typeof error && null !== error ? describeObjectForErrorMessage(error) : String(error), error = null), wasAborted = wasAborted ? "Switched to client rendering because the server rendering aborted due to:\n\n" : "Switched to client rendering because the server rendering errored:\n\n", boundary.errorMessage = wasAborted + digest, boundary.errorStack = null !== error ? wasAborted + error : null);
25189
+ function encodeErrorForBoundary(boundary, digest2, error, thrownInfo, wasAborted) {
25190
+ boundary.errorDigest = digest2;
25191
+ isRecoverableError(error) ? boundary.errorMessage = wasAborted ? "Switched to client rendering because the server render was aborted with a request to render on the client." : "Switched to client rendering because a component requested it." : (error instanceof Error ? (digest2 = String(error.message), error = String(error.stack)) : (digest2 = "object" === typeof error && null !== error ? describeObjectForErrorMessage(error) : String(error), error = null), wasAborted = wasAborted ? "Switched to client rendering because the server rendering aborted due to:\n\n" : "Switched to client rendering because the server rendering errored:\n\n", boundary.errorMessage = wasAborted + digest2, boundary.errorStack = null !== error ? wasAborted + error : null);
25192
25192
  boundary.errorComponentStack = thrownInfo.componentStack;
25193
25193
  }
25194
25194
  function logRecoverableError(request2, error, errorInfo, debugTask) {
@@ -28038,7 +28038,7 @@ var require_react_dom_server_node_development = __commonJS({
28038
28038
  }
28039
28039
  };
28040
28040
  }
28041
- var util = __require("util"), crypto6 = __require("crypto"), async_hooks = __require("async_hooks"), React4 = require_react(), ReactDOM = require_react_dom(), stream = __require("stream"), REACT_ELEMENT_TYPE = /* @__PURE__ */ Symbol.for("react.transitional.element"), REACT_PORTAL_TYPE = /* @__PURE__ */ Symbol.for("react.portal"), REACT_FRAGMENT_TYPE = /* @__PURE__ */ Symbol.for("react.fragment"), REACT_STRICT_MODE_TYPE = /* @__PURE__ */ Symbol.for("react.strict_mode"), REACT_PROFILER_TYPE = /* @__PURE__ */ Symbol.for("react.profiler"), REACT_CONSUMER_TYPE = /* @__PURE__ */ Symbol.for("react.consumer"), REACT_CONTEXT_TYPE = /* @__PURE__ */ Symbol.for("react.context"), REACT_FORWARD_REF_TYPE = /* @__PURE__ */ Symbol.for("react.forward_ref"), REACT_SUSPENSE_TYPE = /* @__PURE__ */ Symbol.for("react.suspense"), REACT_SUSPENSE_LIST_TYPE = /* @__PURE__ */ Symbol.for("react.suspense_list"), REACT_MEMO_TYPE = /* @__PURE__ */ Symbol.for("react.memo"), REACT_LAZY_TYPE = /* @__PURE__ */ Symbol.for("react.lazy"), REACT_SCOPE_TYPE = /* @__PURE__ */ Symbol.for("react.scope"), REACT_ACTIVITY_TYPE = /* @__PURE__ */ Symbol.for("react.activity"), REACT_LEGACY_HIDDEN_TYPE = /* @__PURE__ */ Symbol.for("react.legacy_hidden"), REACT_MEMO_CACHE_SENTINEL = /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel"), REACT_VIEW_TRANSITION_TYPE = /* @__PURE__ */ Symbol.for("react.view_transition"), REACT_RECOVERABLE_TYPE = /* @__PURE__ */ Symbol.for("react.recoverable"), MAYBE_ITERATOR_SYMBOL = Symbol.iterator, ASYNC_ITERATOR = Symbol.asyncIterator, REACT_OPTIMISTIC_KEY = /* @__PURE__ */ Symbol.for("react.optimistic_key"), isArrayImpl = Array.isArray, jsxPropsParents = /* @__PURE__ */ new WeakMap(), jsxChildrenParents = /* @__PURE__ */ new WeakMap(), CLIENT_REFERENCE_TAG = /* @__PURE__ */ Symbol.for("react.client.reference"), hasOwnProperty = Object.prototype.hasOwnProperty, supportsArrayBufferDetached = hasOwnProperty.call(
28041
+ var util = __require("util"), crypto7 = __require("crypto"), async_hooks = __require("async_hooks"), React4 = require_react(), ReactDOM = require_react_dom(), stream = __require("stream"), REACT_ELEMENT_TYPE = /* @__PURE__ */ Symbol.for("react.transitional.element"), REACT_PORTAL_TYPE = /* @__PURE__ */ Symbol.for("react.portal"), REACT_FRAGMENT_TYPE = /* @__PURE__ */ Symbol.for("react.fragment"), REACT_STRICT_MODE_TYPE = /* @__PURE__ */ Symbol.for("react.strict_mode"), REACT_PROFILER_TYPE = /* @__PURE__ */ Symbol.for("react.profiler"), REACT_CONSUMER_TYPE = /* @__PURE__ */ Symbol.for("react.consumer"), REACT_CONTEXT_TYPE = /* @__PURE__ */ Symbol.for("react.context"), REACT_FORWARD_REF_TYPE = /* @__PURE__ */ Symbol.for("react.forward_ref"), REACT_SUSPENSE_TYPE = /* @__PURE__ */ Symbol.for("react.suspense"), REACT_SUSPENSE_LIST_TYPE = /* @__PURE__ */ Symbol.for("react.suspense_list"), REACT_MEMO_TYPE = /* @__PURE__ */ Symbol.for("react.memo"), REACT_LAZY_TYPE = /* @__PURE__ */ Symbol.for("react.lazy"), REACT_SCOPE_TYPE = /* @__PURE__ */ Symbol.for("react.scope"), REACT_ACTIVITY_TYPE = /* @__PURE__ */ Symbol.for("react.activity"), REACT_LEGACY_HIDDEN_TYPE = /* @__PURE__ */ Symbol.for("react.legacy_hidden"), REACT_MEMO_CACHE_SENTINEL = /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel"), REACT_VIEW_TRANSITION_TYPE = /* @__PURE__ */ Symbol.for("react.view_transition"), REACT_RECOVERABLE_TYPE = /* @__PURE__ */ Symbol.for("react.recoverable"), MAYBE_ITERATOR_SYMBOL = Symbol.iterator, ASYNC_ITERATOR = Symbol.asyncIterator, REACT_OPTIMISTIC_KEY = /* @__PURE__ */ Symbol.for("react.optimistic_key"), isArrayImpl = Array.isArray, jsxPropsParents = /* @__PURE__ */ new WeakMap(), jsxChildrenParents = /* @__PURE__ */ new WeakMap(), CLIENT_REFERENCE_TAG = /* @__PURE__ */ Symbol.for("react.client.reference"), hasOwnProperty = Object.prototype.hasOwnProperty, supportsArrayBufferDetached = hasOwnProperty.call(
28042
28042
  ArrayBuffer.prototype,
28043
28043
  "detached"
28044
28044
  ), didWarnAboutMissingArrayBufferDetached = false, scheduleMicrotask = queueMicrotask, currentView = null, writtenBytes = 0, destinationHasCapacity$1 = true, textEncoder = new util.TextEncoder(), assign = Object.assign, VALID_ATTRIBUTE_NAME_REGEX = RegExp(
@@ -29495,9 +29495,9 @@ A.finished.finally(function(){document.__reactViewTransition===A&&(document.__re
29495
29495
  }
29496
29496
  });
29497
29497
 
29498
- // ../../../../../../git/ai4kanban/runner/node_modules/react-dom/server.node.js
29498
+ // node_modules/react-dom/server.node.js
29499
29499
  var require_server_node = __commonJS({
29500
- "../../../../../../git/ai4kanban/runner/node_modules/react-dom/server.node.js"(exports) {
29500
+ "node_modules/react-dom/server.node.js"(exports) {
29501
29501
  "use strict";
29502
29502
  var l2;
29503
29503
  var s;
@@ -29518,9 +29518,9 @@ var require_server_node = __commonJS({
29518
29518
  }
29519
29519
  });
29520
29520
 
29521
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/tokenizer/keywords.js
29521
+ // node_modules/sucrase/dist/parser/tokenizer/keywords.js
29522
29522
  var require_keywords = __commonJS({
29523
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/tokenizer/keywords.js"(exports) {
29523
+ "node_modules/sucrase/dist/parser/tokenizer/keywords.js"(exports) {
29524
29524
  "use strict";
29525
29525
  Object.defineProperty(exports, "__esModule", { value: true });
29526
29526
  var ContextualKeyword;
@@ -29611,9 +29611,9 @@ var require_keywords = __commonJS({
29611
29611
  }
29612
29612
  });
29613
29613
 
29614
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/tokenizer/types.js
29614
+ // node_modules/sucrase/dist/parser/tokenizer/types.js
29615
29615
  var require_types = __commonJS({
29616
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/tokenizer/types.js"(exports) {
29616
+ "node_modules/sucrase/dist/parser/tokenizer/types.js"(exports) {
29617
29617
  "use strict";
29618
29618
  Object.defineProperty(exports, "__esModule", { value: true });
29619
29619
  var TokenType;
@@ -30095,9 +30095,9 @@ var require_types = __commonJS({
30095
30095
  }
30096
30096
  });
30097
30097
 
30098
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/tokenizer/state.js
30098
+ // node_modules/sucrase/dist/parser/tokenizer/state.js
30099
30099
  var require_state = __commonJS({
30100
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/tokenizer/state.js"(exports) {
30100
+ "node_modules/sucrase/dist/parser/tokenizer/state.js"(exports) {
30101
30101
  "use strict";
30102
30102
  Object.defineProperty(exports, "__esModule", { value: true });
30103
30103
  var _keywords = require_keywords();
@@ -30236,9 +30236,9 @@ var require_state = __commonJS({
30236
30236
  }
30237
30237
  });
30238
30238
 
30239
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/util/charcodes.js
30239
+ // node_modules/sucrase/dist/parser/util/charcodes.js
30240
30240
  var require_charcodes = __commonJS({
30241
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/util/charcodes.js"(exports) {
30241
+ "node_modules/sucrase/dist/parser/util/charcodes.js"(exports) {
30242
30242
  "use strict";
30243
30243
  Object.defineProperty(exports, "__esModule", { value: true });
30244
30244
  var charCodes;
@@ -30459,9 +30459,9 @@ var require_charcodes = __commonJS({
30459
30459
  }
30460
30460
  });
30461
30461
 
30462
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/traverser/base.js
30462
+ // node_modules/sucrase/dist/parser/traverser/base.js
30463
30463
  var require_base = __commonJS({
30464
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/traverser/base.js"(exports) {
30464
+ "node_modules/sucrase/dist/parser/traverser/base.js"(exports) {
30465
30465
  "use strict";
30466
30466
  Object.defineProperty(exports, "__esModule", { value: true });
30467
30467
  function _interopRequireDefault(obj3) {
@@ -30522,9 +30522,9 @@ var require_base = __commonJS({
30522
30522
  }
30523
30523
  });
30524
30524
 
30525
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/traverser/util.js
30525
+ // node_modules/sucrase/dist/parser/traverser/util.js
30526
30526
  var require_util = __commonJS({
30527
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/traverser/util.js"(exports) {
30527
+ "node_modules/sucrase/dist/parser/traverser/util.js"(exports) {
30528
30528
  "use strict";
30529
30529
  Object.defineProperty(exports, "__esModule", { value: true });
30530
30530
  var _index = require_tokenizer();
@@ -30608,9 +30608,9 @@ var require_util = __commonJS({
30608
30608
  }
30609
30609
  });
30610
30610
 
30611
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/util/whitespace.js
30611
+ // node_modules/sucrase/dist/parser/util/whitespace.js
30612
30612
  var require_whitespace = __commonJS({
30613
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/util/whitespace.js"(exports) {
30613
+ "node_modules/sucrase/dist/parser/util/whitespace.js"(exports) {
30614
30614
  "use strict";
30615
30615
  Object.defineProperty(exports, "__esModule", { value: true });
30616
30616
  var _charcodes = require_charcodes();
@@ -30663,9 +30663,9 @@ var require_whitespace = __commonJS({
30663
30663
  }
30664
30664
  });
30665
30665
 
30666
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/util/identifier.js
30666
+ // node_modules/sucrase/dist/parser/util/identifier.js
30667
30667
  var require_identifier = __commonJS({
30668
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/util/identifier.js"(exports) {
30668
+ "node_modules/sucrase/dist/parser/util/identifier.js"(exports) {
30669
30669
  "use strict";
30670
30670
  Object.defineProperty(exports, "__esModule", { value: true });
30671
30671
  var _charcodes = require_charcodes();
@@ -30701,9 +30701,9 @@ var require_identifier = __commonJS({
30701
30701
  }
30702
30702
  });
30703
30703
 
30704
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/tokenizer/readWordTree.js
30704
+ // node_modules/sucrase/dist/parser/tokenizer/readWordTree.js
30705
30705
  var require_readWordTree = __commonJS({
30706
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/tokenizer/readWordTree.js"(exports) {
30706
+ "node_modules/sucrase/dist/parser/tokenizer/readWordTree.js"(exports) {
30707
30707
  "use strict";
30708
30708
  Object.defineProperty(exports, "__esModule", { value: true });
30709
30709
  var _keywords = require_keywords();
@@ -40010,9 +40010,9 @@ var require_readWordTree = __commonJS({
40010
40010
  }
40011
40011
  });
40012
40012
 
40013
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/tokenizer/readWord.js
40013
+ // node_modules/sucrase/dist/parser/tokenizer/readWord.js
40014
40014
  var require_readWord = __commonJS({
40015
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/tokenizer/readWord.js"(exports) {
40015
+ "node_modules/sucrase/dist/parser/tokenizer/readWord.js"(exports) {
40016
40016
  "use strict";
40017
40017
  Object.defineProperty(exports, "__esModule", { value: true });
40018
40018
  var _base = require_base();
@@ -40073,9 +40073,9 @@ var require_readWord = __commonJS({
40073
40073
  }
40074
40074
  });
40075
40075
 
40076
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/tokenizer/index.js
40076
+ // node_modules/sucrase/dist/parser/tokenizer/index.js
40077
40077
  var require_tokenizer = __commonJS({
40078
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/tokenizer/index.js"(exports) {
40078
+ "node_modules/sucrase/dist/parser/tokenizer/index.js"(exports) {
40079
40079
  "use strict";
40080
40080
  Object.defineProperty(exports, "__esModule", { value: true });
40081
40081
  function _interopRequireDefault(obj3) {
@@ -40827,9 +40827,9 @@ var require_tokenizer = __commonJS({
40827
40827
  }
40828
40828
  });
40829
40829
 
40830
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/getImportExportSpecifierInfo.js
40830
+ // node_modules/sucrase/dist/util/getImportExportSpecifierInfo.js
40831
40831
  var require_getImportExportSpecifierInfo = __commonJS({
40832
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/getImportExportSpecifierInfo.js"(exports) {
40832
+ "node_modules/sucrase/dist/util/getImportExportSpecifierInfo.js"(exports) {
40833
40833
  "use strict";
40834
40834
  Object.defineProperty(exports, "__esModule", { value: true });
40835
40835
  var _types = require_types();
@@ -40881,9 +40881,9 @@ var require_getImportExportSpecifierInfo = __commonJS({
40881
40881
  }
40882
40882
  });
40883
40883
 
40884
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/plugins/jsx/xhtml.js
40884
+ // node_modules/sucrase/dist/parser/plugins/jsx/xhtml.js
40885
40885
  var require_xhtml = __commonJS({
40886
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/plugins/jsx/xhtml.js"(exports) {
40886
+ "node_modules/sucrase/dist/parser/plugins/jsx/xhtml.js"(exports) {
40887
40887
  "use strict";
40888
40888
  Object.defineProperty(exports, "__esModule", { value: true });
40889
40889
  exports.default = /* @__PURE__ */ new Map([
@@ -41144,9 +41144,9 @@ var require_xhtml = __commonJS({
41144
41144
  }
41145
41145
  });
41146
41146
 
41147
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/getJSXPragmaInfo.js
41147
+ // node_modules/sucrase/dist/util/getJSXPragmaInfo.js
41148
41148
  var require_getJSXPragmaInfo = __commonJS({
41149
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/getJSXPragmaInfo.js"(exports) {
41149
+ "node_modules/sucrase/dist/util/getJSXPragmaInfo.js"(exports) {
41150
41150
  "use strict";
41151
41151
  Object.defineProperty(exports, "__esModule", { value: true });
41152
41152
  function getJSXPragmaInfo(options) {
@@ -41165,9 +41165,9 @@ var require_getJSXPragmaInfo = __commonJS({
41165
41165
  }
41166
41166
  });
41167
41167
 
41168
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/transformers/Transformer.js
41168
+ // node_modules/sucrase/dist/transformers/Transformer.js
41169
41169
  var require_Transformer = __commonJS({
41170
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/transformers/Transformer.js"(exports) {
41170
+ "node_modules/sucrase/dist/transformers/Transformer.js"(exports) {
41171
41171
  "use strict";
41172
41172
  Object.defineProperty(exports, "__esModule", { value: true });
41173
41173
  var Transformer = class {
@@ -41186,9 +41186,9 @@ var require_Transformer = __commonJS({
41186
41186
  }
41187
41187
  });
41188
41188
 
41189
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/transformers/JSXTransformer.js
41189
+ // node_modules/sucrase/dist/transformers/JSXTransformer.js
41190
41190
  var require_JSXTransformer = __commonJS({
41191
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/transformers/JSXTransformer.js"(exports) {
41191
+ "node_modules/sucrase/dist/transformers/JSXTransformer.js"(exports) {
41192
41192
  "use strict";
41193
41193
  Object.defineProperty(exports, "__esModule", { value: true });
41194
41194
  function _interopRequireDefault(obj3) {
@@ -41256,8 +41256,8 @@ var require_JSXTransformer = __commonJS({
41256
41256
  }
41257
41257
  if (this.isAutomaticRuntime) {
41258
41258
  if (this.importProcessor) {
41259
- for (const [path33, resolvedName] of Object.entries(this.cjsAutomaticModuleNameResolutions)) {
41260
- prefix += `var ${resolvedName} = require("${path33}");`;
41259
+ for (const [path37, resolvedName] of Object.entries(this.cjsAutomaticModuleNameResolutions)) {
41260
+ prefix += `var ${resolvedName} = require("${path37}");`;
41261
41261
  }
41262
41262
  } else {
41263
41263
  const { createElement: createElementResolution, ...otherResolutions } = this.esmAutomaticImportNameResolutions;
@@ -41450,11 +41450,11 @@ var require_JSXTransformer = __commonJS({
41450
41450
  }
41451
41451
  claimAutoImportedName(funcName, importPathSuffix) {
41452
41452
  if (this.importProcessor) {
41453
- const path33 = this.jsxImportSource + importPathSuffix;
41454
- if (!this.cjsAutomaticModuleNameResolutions[path33]) {
41455
- this.cjsAutomaticModuleNameResolutions[path33] = this.importProcessor.getFreeIdentifierForPath(path33);
41453
+ const path37 = this.jsxImportSource + importPathSuffix;
41454
+ if (!this.cjsAutomaticModuleNameResolutions[path37]) {
41455
+ this.cjsAutomaticModuleNameResolutions[path37] = this.importProcessor.getFreeIdentifierForPath(path37);
41456
41456
  }
41457
- return `${this.cjsAutomaticModuleNameResolutions[path33]}.${funcName}`;
41457
+ return `${this.cjsAutomaticModuleNameResolutions[path37]}.${funcName}`;
41458
41458
  } else {
41459
41459
  if (!this.esmAutomaticImportNameResolutions[funcName]) {
41460
41460
  this.esmAutomaticImportNameResolutions[funcName] = this.nameManager.claimFreeName(
@@ -41787,9 +41787,9 @@ var require_JSXTransformer = __commonJS({
41787
41787
  }
41788
41788
  });
41789
41789
 
41790
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/getNonTypeIdentifiers.js
41790
+ // node_modules/sucrase/dist/util/getNonTypeIdentifiers.js
41791
41791
  var require_getNonTypeIdentifiers = __commonJS({
41792
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/getNonTypeIdentifiers.js"(exports) {
41792
+ "node_modules/sucrase/dist/util/getNonTypeIdentifiers.js"(exports) {
41793
41793
  "use strict";
41794
41794
  Object.defineProperty(exports, "__esModule", { value: true });
41795
41795
  function _interopRequireDefault(obj3) {
@@ -41828,9 +41828,9 @@ var require_getNonTypeIdentifiers = __commonJS({
41828
41828
  }
41829
41829
  });
41830
41830
 
41831
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/CJSImportProcessor.js
41831
+ // node_modules/sucrase/dist/CJSImportProcessor.js
41832
41832
  var require_CJSImportProcessor = __commonJS({
41833
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/CJSImportProcessor.js"(exports) {
41833
+ "node_modules/sucrase/dist/CJSImportProcessor.js"(exports) {
41834
41834
  "use strict";
41835
41835
  Object.defineProperty(exports, "__esModule", { value: true });
41836
41836
  function _interopRequireDefault(obj3) {
@@ -41890,7 +41890,7 @@ var require_CJSImportProcessor = __commonJS({
41890
41890
  */
41891
41891
  pruneTypeOnlyImports() {
41892
41892
  this.nonTypeIdentifiers = _getNonTypeIdentifiers.getNonTypeIdentifiers.call(void 0, this.tokens, this.options);
41893
- for (const [path33, importInfo] of this.importInfoByPath.entries()) {
41893
+ for (const [path37, importInfo] of this.importInfoByPath.entries()) {
41894
41894
  if (importInfo.hasBareImport || importInfo.hasStarExport || importInfo.exportStarNames.length > 0 || importInfo.namedExports.length > 0) {
41895
41895
  continue;
41896
41896
  }
@@ -41900,7 +41900,7 @@ var require_CJSImportProcessor = __commonJS({
41900
41900
  ...importInfo.namedImports.map(({ localName }) => localName)
41901
41901
  ];
41902
41902
  if (names2.every((name) => this.shouldAutomaticallyElideImportedName(name))) {
41903
- this.importsToReplace.set(path33, "");
41903
+ this.importsToReplace.set(path37, "");
41904
41904
  }
41905
41905
  }
41906
41906
  }
@@ -41908,7 +41908,7 @@ var require_CJSImportProcessor = __commonJS({
41908
41908
  return this.isTypeScriptTransformEnabled && !this.keepUnusedImports && !this.nonTypeIdentifiers.has(name);
41909
41909
  }
41910
41910
  generateImportReplacements() {
41911
- for (const [path33, importInfo] of this.importInfoByPath.entries()) {
41911
+ for (const [path37, importInfo] of this.importInfoByPath.entries()) {
41912
41912
  const {
41913
41913
  defaultNames,
41914
41914
  wildcardNames,
@@ -41918,17 +41918,17 @@ var require_CJSImportProcessor = __commonJS({
41918
41918
  hasStarExport
41919
41919
  } = importInfo;
41920
41920
  if (defaultNames.length === 0 && wildcardNames.length === 0 && namedImports.length === 0 && namedExports.length === 0 && exportStarNames.length === 0 && !hasStarExport) {
41921
- this.importsToReplace.set(path33, `require('${path33}');`);
41921
+ this.importsToReplace.set(path37, `require('${path37}');`);
41922
41922
  continue;
41923
41923
  }
41924
- const primaryImportName = this.getFreeIdentifierForPath(path33);
41924
+ const primaryImportName = this.getFreeIdentifierForPath(path37);
41925
41925
  let secondaryImportName;
41926
41926
  if (this.enableLegacyTypeScriptModuleInterop) {
41927
41927
  secondaryImportName = primaryImportName;
41928
41928
  } else {
41929
- secondaryImportName = wildcardNames.length > 0 ? wildcardNames[0] : this.getFreeIdentifierForPath(path33);
41929
+ secondaryImportName = wildcardNames.length > 0 ? wildcardNames[0] : this.getFreeIdentifierForPath(path37);
41930
41930
  }
41931
- let requireCode = `var ${primaryImportName} = require('${path33}');`;
41931
+ let requireCode = `var ${primaryImportName} = require('${path37}');`;
41932
41932
  if (wildcardNames.length > 0) {
41933
41933
  for (const wildcardName of wildcardNames) {
41934
41934
  const moduleExpr = this.enableLegacyTypeScriptModuleInterop ? primaryImportName : `${this.helperManager.getHelperName("interopRequireWildcard")}(${primaryImportName})`;
@@ -41956,7 +41956,7 @@ var require_CJSImportProcessor = __commonJS({
41956
41956
  "createStarExport"
41957
41957
  )}(${primaryImportName});`;
41958
41958
  }
41959
- this.importsToReplace.set(path33, requireCode);
41959
+ this.importsToReplace.set(path37, requireCode);
41960
41960
  for (const defaultName of defaultNames) {
41961
41961
  this.identifierReplacements.set(defaultName, `${secondaryImportName}.default`);
41962
41962
  }
@@ -41965,8 +41965,8 @@ var require_CJSImportProcessor = __commonJS({
41965
41965
  }
41966
41966
  }
41967
41967
  }
41968
- getFreeIdentifierForPath(path33) {
41969
- const components = path33.split("/");
41968
+ getFreeIdentifierForPath(path37) {
41969
+ const components = path37.split("/");
41970
41970
  const lastComponent = components[components.length - 1];
41971
41971
  const baseName = lastComponent.replace(/\W/g, "");
41972
41972
  return this.nameManager.claimFreeName(`_${baseName}`);
@@ -42011,8 +42011,8 @@ var require_CJSImportProcessor = __commonJS({
42011
42011
  if (!this.tokens.matches1AtIndex(index, _types.TokenType.string)) {
42012
42012
  throw new Error("Expected string token at the end of import statement.");
42013
42013
  }
42014
- const path33 = this.tokens.stringValueAtIndex(index);
42015
- const importInfo = this.getImportInfo(path33);
42014
+ const path37 = this.tokens.stringValueAtIndex(index);
42015
+ const importInfo = this.getImportInfo(path37);
42016
42016
  importInfo.defaultNames.push(...defaultNames);
42017
42017
  importInfo.wildcardNames.push(...wildcardNames);
42018
42018
  importInfo.namedImports.push(...namedImports);
@@ -42079,8 +42079,8 @@ var require_CJSImportProcessor = __commonJS({
42079
42079
  if (!this.tokens.matches1AtIndex(index, _types.TokenType.string)) {
42080
42080
  throw new Error("Expected string token at the end of import statement.");
42081
42081
  }
42082
- const path33 = this.tokens.stringValueAtIndex(index);
42083
- const importInfo = this.getImportInfo(path33);
42082
+ const path37 = this.tokens.stringValueAtIndex(index);
42083
+ const importInfo = this.getImportInfo(path37);
42084
42084
  importInfo.namedExports.push(...namedImports);
42085
42085
  }
42086
42086
  preprocessExportStarAtIndex(index) {
@@ -42095,8 +42095,8 @@ var require_CJSImportProcessor = __commonJS({
42095
42095
  if (!this.tokens.matches1AtIndex(index, _types.TokenType.string)) {
42096
42096
  throw new Error("Expected string token at the end of star export statement.");
42097
42097
  }
42098
- const path33 = this.tokens.stringValueAtIndex(index);
42099
- const importInfo = this.getImportInfo(path33);
42098
+ const path37 = this.tokens.stringValueAtIndex(index);
42099
+ const importInfo = this.getImportInfo(path37);
42100
42100
  if (exportedName !== null) {
42101
42101
  importInfo.exportStarNames.push(exportedName);
42102
42102
  } else {
@@ -42136,8 +42136,8 @@ var require_CJSImportProcessor = __commonJS({
42136
42136
  * Get a mutable import info object for this path, creating one if it doesn't
42137
42137
  * exist yet.
42138
42138
  */
42139
- getImportInfo(path33) {
42140
- const existingInfo = this.importInfoByPath.get(path33);
42139
+ getImportInfo(path37) {
42140
+ const existingInfo = this.importInfoByPath.get(path37);
42141
42141
  if (existingInfo) {
42142
42142
  return existingInfo;
42143
42143
  }
@@ -42150,7 +42150,7 @@ var require_CJSImportProcessor = __commonJS({
42150
42150
  exportStarNames: [],
42151
42151
  hasStarExport: false
42152
42152
  };
42153
- this.importInfoByPath.set(path33, newInfo);
42153
+ this.importInfoByPath.set(path37, newInfo);
42154
42154
  return newInfo;
42155
42155
  }
42156
42156
  addExportBinding(localName, exportedName) {
@@ -42196,9 +42196,9 @@ var require_CJSImportProcessor = __commonJS({
42196
42196
  }
42197
42197
  });
42198
42198
 
42199
- // ../../../../../../git/ai4kanban/runner/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js
42199
+ // node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js
42200
42200
  var require_sourcemap_codec_umd = __commonJS({
42201
- "../../../../../../git/ai4kanban/runner/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js"(exports, module) {
42201
+ "node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js"(exports, module) {
42202
42202
  (function(global, factory) {
42203
42203
  if (typeof exports === "object" && typeof module !== "undefined") {
42204
42204
  factory(module);
@@ -42699,9 +42699,9 @@ var require_sourcemap_codec_umd = __commonJS({
42699
42699
  }
42700
42700
  });
42701
42701
 
42702
- // ../../../../../../git/ai4kanban/runner/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js
42702
+ // node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js
42703
42703
  var require_resolve_uri_umd = __commonJS({
42704
- "../../../../../../git/ai4kanban/runner/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js"(exports, module) {
42704
+ "node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js"(exports, module) {
42705
42705
  (function(global, factory) {
42706
42706
  typeof exports === "object" && typeof module !== "undefined" ? module.exports = factory() : typeof define === "function" && define.amd ? define(factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, global.resolveURI = factory());
42707
42707
  })(exports, (function() {
@@ -42730,16 +42730,16 @@ var require_resolve_uri_umd = __commonJS({
42730
42730
  }
42731
42731
  function parseFileUrl(input) {
42732
42732
  const match = fileRegex.exec(input);
42733
- const path33 = match[2];
42734
- return makeUrl("file:", "", match[1] || "", "", isAbsolutePath(path33) ? path33 : "/" + path33, match[3] || "", match[4] || "");
42733
+ const path37 = match[2];
42734
+ return makeUrl("file:", "", match[1] || "", "", isAbsolutePath(path37) ? path37 : "/" + path37, match[3] || "", match[4] || "");
42735
42735
  }
42736
- function makeUrl(scheme, user, host, port, path33, query, hash) {
42736
+ function makeUrl(scheme, user, host, port, path37, query, hash) {
42737
42737
  return {
42738
42738
  scheme,
42739
42739
  user,
42740
42740
  host,
42741
42741
  port,
42742
- path: path33,
42742
+ path: path37,
42743
42743
  query,
42744
42744
  hash,
42745
42745
  type: 7
@@ -42769,11 +42769,11 @@ var require_resolve_uri_umd = __commonJS({
42769
42769
  url.type = input ? input.startsWith("?") ? 3 : input.startsWith("#") ? 2 : 4 : 1;
42770
42770
  return url;
42771
42771
  }
42772
- function stripPathFilename(path33) {
42773
- if (path33.endsWith("/.."))
42774
- return path33;
42775
- const index = path33.lastIndexOf("/");
42776
- return path33.slice(0, index + 1);
42772
+ function stripPathFilename(path37) {
42773
+ if (path37.endsWith("/.."))
42774
+ return path37;
42775
+ const index = path37.lastIndexOf("/");
42776
+ return path37.slice(0, index + 1);
42777
42777
  }
42778
42778
  function mergePaths(url, base) {
42779
42779
  normalizePath(base, base.type);
@@ -42811,14 +42811,14 @@ var require_resolve_uri_umd = __commonJS({
42811
42811
  pieces[pointer++] = piece;
42812
42812
  positive++;
42813
42813
  }
42814
- let path33 = "";
42814
+ let path37 = "";
42815
42815
  for (let i = 1; i < pointer; i++) {
42816
- path33 += "/" + pieces[i];
42816
+ path37 += "/" + pieces[i];
42817
42817
  }
42818
- if (!path33 || addTrailingSlash && !path33.endsWith("/..")) {
42819
- path33 += "/";
42818
+ if (!path37 || addTrailingSlash && !path37.endsWith("/..")) {
42819
+ path37 += "/";
42820
42820
  }
42821
- url.path = path33;
42821
+ url.path = path37;
42822
42822
  }
42823
42823
  function resolve2(input, base) {
42824
42824
  if (!input && !base)
@@ -42859,13 +42859,13 @@ var require_resolve_uri_umd = __commonJS({
42859
42859
  case 3:
42860
42860
  return queryHash;
42861
42861
  case 4: {
42862
- const path33 = url.path.slice(1);
42863
- if (!path33)
42862
+ const path37 = url.path.slice(1);
42863
+ if (!path37)
42864
42864
  return queryHash || ".";
42865
- if (isRelative(base || input) && !isRelative(path33)) {
42866
- return "./" + path33 + queryHash;
42865
+ if (isRelative(base || input) && !isRelative(path37)) {
42866
+ return "./" + path37 + queryHash;
42867
42867
  }
42868
- return path33 + queryHash;
42868
+ return path37 + queryHash;
42869
42869
  }
42870
42870
  case 5:
42871
42871
  return url.path + queryHash;
@@ -42878,9 +42878,9 @@ var require_resolve_uri_umd = __commonJS({
42878
42878
  }
42879
42879
  });
42880
42880
 
42881
- // ../../../../../../git/ai4kanban/runner/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js
42881
+ // node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js
42882
42882
  var require_trace_mapping_umd = __commonJS({
42883
- "../../../../../../git/ai4kanban/runner/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js"(exports, module) {
42883
+ "node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js"(exports, module) {
42884
42884
  (function(global, factory) {
42885
42885
  if (typeof exports === "object" && typeof module !== "undefined") {
42886
42886
  factory(module, require_resolve_uri_umd(), require_sourcemap_codec_umd());
@@ -42964,10 +42964,10 @@ var require_trace_mapping_umd = __commonJS({
42964
42964
  module2.exports = __toCommonJS(trace_mapping_exports);
42965
42965
  var import_sourcemap_codec = __toESM2(require_sourcemap_codec());
42966
42966
  var import_resolve_uri = __toESM2(require_resolve_uri());
42967
- function stripFilename(path33) {
42968
- if (!path33) return "";
42969
- const index = path33.lastIndexOf("/");
42970
- return path33.slice(0, index + 1);
42967
+ function stripFilename(path37) {
42968
+ if (!path37) return "";
42969
+ const index = path37.lastIndexOf("/");
42970
+ return path37.slice(0, index + 1);
42971
42971
  }
42972
42972
  function resolver(mapUrl, sourceRoot) {
42973
42973
  const from = stripFilename(mapUrl);
@@ -43418,9 +43418,9 @@ var require_trace_mapping_umd = __commonJS({
43418
43418
  }
43419
43419
  });
43420
43420
 
43421
- // ../../../../../../git/ai4kanban/runner/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js
43421
+ // node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js
43422
43422
  var require_gen_mapping_umd = __commonJS({
43423
- "../../../../../../git/ai4kanban/runner/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js"(exports, module) {
43423
+ "node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js"(exports, module) {
43424
43424
  (function(global, factory) {
43425
43425
  if (typeof exports === "object" && typeof module !== "undefined") {
43426
43426
  factory(module, require_sourcemap_codec_umd(), require_trace_mapping_umd());
@@ -43769,9 +43769,9 @@ var require_gen_mapping_umd = __commonJS({
43769
43769
  }
43770
43770
  });
43771
43771
 
43772
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/computeSourceMap.js
43772
+ // node_modules/sucrase/dist/computeSourceMap.js
43773
43773
  var require_computeSourceMap = __commonJS({
43774
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/computeSourceMap.js"(exports) {
43774
+ "node_modules/sucrase/dist/computeSourceMap.js"(exports) {
43775
43775
  "use strict";
43776
43776
  Object.defineProperty(exports, "__esModule", { value: true });
43777
43777
  var _genmapping = require_gen_mapping_umd();
@@ -43832,9 +43832,9 @@ var require_computeSourceMap = __commonJS({
43832
43832
  }
43833
43833
  });
43834
43834
 
43835
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/HelperManager.js
43835
+ // node_modules/sucrase/dist/HelperManager.js
43836
43836
  var require_HelperManager = __commonJS({
43837
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/HelperManager.js"(exports) {
43837
+ "node_modules/sucrase/dist/HelperManager.js"(exports) {
43838
43838
  "use strict";
43839
43839
  Object.defineProperty(exports, "__esModule", { value: true });
43840
43840
  var HELPERS = {
@@ -44021,9 +44021,9 @@ var require_HelperManager = __commonJS({
44021
44021
  }
44022
44022
  });
44023
44023
 
44024
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/identifyShadowedGlobals.js
44024
+ // node_modules/sucrase/dist/identifyShadowedGlobals.js
44025
44025
  var require_identifyShadowedGlobals = __commonJS({
44026
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/identifyShadowedGlobals.js"(exports) {
44026
+ "node_modules/sucrase/dist/identifyShadowedGlobals.js"(exports) {
44027
44027
  "use strict";
44028
44028
  Object.defineProperty(exports, "__esModule", { value: true });
44029
44029
  var _tokenizer = require_tokenizer();
@@ -44090,9 +44090,9 @@ var require_identifyShadowedGlobals = __commonJS({
44090
44090
  }
44091
44091
  });
44092
44092
 
44093
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/getIdentifierNames.js
44093
+ // node_modules/sucrase/dist/util/getIdentifierNames.js
44094
44094
  var require_getIdentifierNames = __commonJS({
44095
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/getIdentifierNames.js"(exports) {
44095
+ "node_modules/sucrase/dist/util/getIdentifierNames.js"(exports) {
44096
44096
  "use strict";
44097
44097
  Object.defineProperty(exports, "__esModule", { value: true });
44098
44098
  var _types = require_types();
@@ -44109,9 +44109,9 @@ var require_getIdentifierNames = __commonJS({
44109
44109
  }
44110
44110
  });
44111
44111
 
44112
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/NameManager.js
44112
+ // node_modules/sucrase/dist/NameManager.js
44113
44113
  var require_NameManager = __commonJS({
44114
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/NameManager.js"(exports) {
44114
+ "node_modules/sucrase/dist/NameManager.js"(exports) {
44115
44115
  "use strict";
44116
44116
  Object.defineProperty(exports, "__esModule", { value: true });
44117
44117
  function _interopRequireDefault(obj3) {
@@ -44148,9 +44148,9 @@ var require_NameManager = __commonJS({
44148
44148
  }
44149
44149
  });
44150
44150
 
44151
- // ../../../../../../git/ai4kanban/runner/node_modules/ts-interface-checker/dist/util.js
44151
+ // node_modules/ts-interface-checker/dist/util.js
44152
44152
  var require_util2 = __commonJS({
44153
- "../../../../../../git/ai4kanban/runner/node_modules/ts-interface-checker/dist/util.js"(exports) {
44153
+ "node_modules/ts-interface-checker/dist/util.js"(exports) {
44154
44154
  "use strict";
44155
44155
  var __extends = exports && exports.__extends || /* @__PURE__ */ (function() {
44156
44156
  var extendStatics = function(d2, b2) {
@@ -44175,9 +44175,9 @@ var require_util2 = __commonJS({
44175
44175
  /** @class */
44176
44176
  (function(_super) {
44177
44177
  __extends(VError2, _super);
44178
- function VError2(path33, message) {
44178
+ function VError2(path37, message) {
44179
44179
  var _this = _super.call(this, message) || this;
44180
- _this.path = path33;
44180
+ _this.path = path37;
44181
44181
  Object.setPrototypeOf(_this, VError2.prototype);
44182
44182
  return _this;
44183
44183
  }
@@ -44237,26 +44237,26 @@ var require_util2 = __commonJS({
44237
44237
  (_b = this._messages).push.apply(_b, best._messages);
44238
44238
  }
44239
44239
  };
44240
- DetailContext2.prototype.getError = function(path33) {
44240
+ DetailContext2.prototype.getError = function(path37) {
44241
44241
  var msgParts = [];
44242
44242
  for (var i = this._propNames.length - 1; i >= 0; i--) {
44243
44243
  var p2 = this._propNames[i];
44244
- path33 += typeof p2 === "number" ? "[" + p2 + "]" : p2 ? "." + p2 : "";
44244
+ path37 += typeof p2 === "number" ? "[" + p2 + "]" : p2 ? "." + p2 : "";
44245
44245
  var m = this._messages[i];
44246
44246
  if (m) {
44247
- msgParts.push(path33 + " " + m);
44247
+ msgParts.push(path37 + " " + m);
44248
44248
  }
44249
44249
  }
44250
- return new VError(path33, msgParts.join("; "));
44250
+ return new VError(path37, msgParts.join("; "));
44251
44251
  };
44252
- DetailContext2.prototype.getErrorDetail = function(path33) {
44252
+ DetailContext2.prototype.getErrorDetail = function(path37) {
44253
44253
  var details = [];
44254
44254
  for (var i = this._propNames.length - 1; i >= 0; i--) {
44255
44255
  var p2 = this._propNames[i];
44256
- path33 += typeof p2 === "number" ? "[" + p2 + "]" : p2 ? "." + p2 : "";
44256
+ path37 += typeof p2 === "number" ? "[" + p2 + "]" : p2 ? "." + p2 : "";
44257
44257
  var message = this._messages[i];
44258
44258
  if (message) {
44259
- details.push({ path: path33, message });
44259
+ details.push({ path: path37, message });
44260
44260
  }
44261
44261
  }
44262
44262
  var detail = null;
@@ -44289,9 +44289,9 @@ var require_util2 = __commonJS({
44289
44289
  }
44290
44290
  });
44291
44291
 
44292
- // ../../../../../../git/ai4kanban/runner/node_modules/ts-interface-checker/dist/types.js
44292
+ // node_modules/ts-interface-checker/dist/types.js
44293
44293
  var require_types2 = __commonJS({
44294
- "../../../../../../git/ai4kanban/runner/node_modules/ts-interface-checker/dist/types.js"(exports) {
44294
+ "node_modules/ts-interface-checker/dist/types.js"(exports) {
44295
44295
  "use strict";
44296
44296
  var __extends = exports && exports.__extends || /* @__PURE__ */ (function() {
44297
44297
  var extendStatics = function(d2, b2) {
@@ -44928,9 +44928,9 @@ var require_types2 = __commonJS({
44928
44928
  }
44929
44929
  });
44930
44930
 
44931
- // ../../../../../../git/ai4kanban/runner/node_modules/ts-interface-checker/dist/index.js
44931
+ // node_modules/ts-interface-checker/dist/index.js
44932
44932
  var require_dist = __commonJS({
44933
- "../../../../../../git/ai4kanban/runner/node_modules/ts-interface-checker/dist/index.js"(exports) {
44933
+ "node_modules/ts-interface-checker/dist/index.js"(exports) {
44934
44934
  "use strict";
44935
44935
  var __spreadArrays = exports && exports.__spreadArrays || function() {
44936
44936
  for (var s = 0, i = 0, il2 = arguments.length; i < il2; i++) s += arguments[i].length;
@@ -45069,8 +45069,8 @@ var require_dist = __commonJS({
45069
45069
  this.checkerPlain = this.ttype.getChecker(suite, false);
45070
45070
  this.checkerStrict = this.ttype.getChecker(suite, true);
45071
45071
  }
45072
- Checker2.prototype.setReportedPath = function(path33) {
45073
- this._path = path33;
45072
+ Checker2.prototype.setReportedPath = function(path37) {
45073
+ this._path = path37;
45074
45074
  };
45075
45075
  Checker2.prototype.check = function(value) {
45076
45076
  return this._doCheck(this.checkerPlain, value);
@@ -45154,9 +45154,9 @@ var require_dist = __commonJS({
45154
45154
  }
45155
45155
  });
45156
45156
 
45157
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/Options-gen-types.js
45157
+ // node_modules/sucrase/dist/Options-gen-types.js
45158
45158
  var require_Options_gen_types = __commonJS({
45159
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/Options-gen-types.js"(exports) {
45159
+ "node_modules/sucrase/dist/Options-gen-types.js"(exports) {
45160
45160
  "use strict";
45161
45161
  Object.defineProperty(exports, "__esModule", { value: true });
45162
45162
  function _interopRequireWildcard(obj3) {
@@ -45216,9 +45216,9 @@ var require_Options_gen_types = __commonJS({
45216
45216
  }
45217
45217
  });
45218
45218
 
45219
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/Options.js
45219
+ // node_modules/sucrase/dist/Options.js
45220
45220
  var require_Options = __commonJS({
45221
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/Options.js"(exports) {
45221
+ "node_modules/sucrase/dist/Options.js"(exports) {
45222
45222
  "use strict";
45223
45223
  Object.defineProperty(exports, "__esModule", { value: true });
45224
45224
  function _interopRequireDefault(obj3) {
@@ -45235,9 +45235,9 @@ var require_Options = __commonJS({
45235
45235
  }
45236
45236
  });
45237
45237
 
45238
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/traverser/lval.js
45238
+ // node_modules/sucrase/dist/parser/traverser/lval.js
45239
45239
  var require_lval = __commonJS({
45240
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/traverser/lval.js"(exports) {
45240
+ "node_modules/sucrase/dist/parser/traverser/lval.js"(exports) {
45241
45241
  "use strict";
45242
45242
  Object.defineProperty(exports, "__esModule", { value: true });
45243
45243
  var _flow = require_flow();
@@ -45382,9 +45382,9 @@ var require_lval = __commonJS({
45382
45382
  }
45383
45383
  });
45384
45384
 
45385
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/plugins/typescript.js
45385
+ // node_modules/sucrase/dist/parser/plugins/typescript.js
45386
45386
  var require_typescript = __commonJS({
45387
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/plugins/typescript.js"(exports) {
45387
+ "node_modules/sucrase/dist/parser/plugins/typescript.js"(exports) {
45388
45388
  "use strict";
45389
45389
  Object.defineProperty(exports, "__esModule", { value: true });
45390
45390
  var _index = require_tokenizer();
@@ -46695,9 +46695,9 @@ var require_typescript = __commonJS({
46695
46695
  }
46696
46696
  });
46697
46697
 
46698
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/plugins/jsx/index.js
46698
+ // node_modules/sucrase/dist/parser/plugins/jsx/index.js
46699
46699
  var require_jsx = __commonJS({
46700
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/plugins/jsx/index.js"(exports) {
46700
+ "node_modules/sucrase/dist/parser/plugins/jsx/index.js"(exports) {
46701
46701
  "use strict";
46702
46702
  Object.defineProperty(exports, "__esModule", { value: true });
46703
46703
  var _index = require_tokenizer();
@@ -46965,9 +46965,9 @@ var require_jsx = __commonJS({
46965
46965
  }
46966
46966
  });
46967
46967
 
46968
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/plugins/types.js
46968
+ // node_modules/sucrase/dist/parser/plugins/types.js
46969
46969
  var require_types3 = __commonJS({
46970
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/plugins/types.js"(exports) {
46970
+ "node_modules/sucrase/dist/parser/plugins/types.js"(exports) {
46971
46971
  "use strict";
46972
46972
  Object.defineProperty(exports, "__esModule", { value: true });
46973
46973
  var _index = require_tokenizer();
@@ -47000,9 +47000,9 @@ var require_types3 = __commonJS({
47000
47000
  }
47001
47001
  });
47002
47002
 
47003
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/traverser/expression.js
47003
+ // node_modules/sucrase/dist/parser/traverser/expression.js
47004
47004
  var require_expression = __commonJS({
47005
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/traverser/expression.js"(exports) {
47005
+ "node_modules/sucrase/dist/parser/traverser/expression.js"(exports) {
47006
47006
  "use strict";
47007
47007
  Object.defineProperty(exports, "__esModule", { value: true });
47008
47008
  var _flow = require_flow();
@@ -47740,9 +47740,9 @@ var require_expression = __commonJS({
47740
47740
  }
47741
47741
  });
47742
47742
 
47743
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/plugins/flow.js
47743
+ // node_modules/sucrase/dist/parser/plugins/flow.js
47744
47744
  var require_flow = __commonJS({
47745
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/plugins/flow.js"(exports) {
47745
+ "node_modules/sucrase/dist/parser/plugins/flow.js"(exports) {
47746
47746
  "use strict";
47747
47747
  Object.defineProperty(exports, "__esModule", { value: true });
47748
47748
  var _index = require_tokenizer();
@@ -48623,9 +48623,9 @@ var require_flow = __commonJS({
48623
48623
  }
48624
48624
  });
48625
48625
 
48626
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/traverser/statement.js
48626
+ // node_modules/sucrase/dist/parser/traverser/statement.js
48627
48627
  var require_statement = __commonJS({
48628
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/traverser/statement.js"(exports) {
48628
+ "node_modules/sucrase/dist/parser/traverser/statement.js"(exports) {
48629
48629
  "use strict";
48630
48630
  Object.defineProperty(exports, "__esModule", { value: true });
48631
48631
  var _index = require_parser();
@@ -49620,9 +49620,9 @@ var require_statement = __commonJS({
49620
49620
  }
49621
49621
  });
49622
49622
 
49623
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/traverser/index.js
49623
+ // node_modules/sucrase/dist/parser/traverser/index.js
49624
49624
  var require_traverser = __commonJS({
49625
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/traverser/index.js"(exports) {
49625
+ "node_modules/sucrase/dist/parser/traverser/index.js"(exports) {
49626
49626
  "use strict";
49627
49627
  Object.defineProperty(exports, "__esModule", { value: true });
49628
49628
  var _index = require_tokenizer();
@@ -49640,9 +49640,9 @@ var require_traverser = __commonJS({
49640
49640
  }
49641
49641
  });
49642
49642
 
49643
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/index.js
49643
+ // node_modules/sucrase/dist/parser/index.js
49644
49644
  var require_parser = __commonJS({
49645
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/parser/index.js"(exports) {
49645
+ "node_modules/sucrase/dist/parser/index.js"(exports) {
49646
49646
  "use strict";
49647
49647
  Object.defineProperty(exports, "__esModule", { value: true });
49648
49648
  var _base = require_base();
@@ -49669,9 +49669,9 @@ var require_parser = __commonJS({
49669
49669
  }
49670
49670
  });
49671
49671
 
49672
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/isAsyncOperation.js
49672
+ // node_modules/sucrase/dist/util/isAsyncOperation.js
49673
49673
  var require_isAsyncOperation = __commonJS({
49674
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/isAsyncOperation.js"(exports) {
49674
+ "node_modules/sucrase/dist/util/isAsyncOperation.js"(exports) {
49675
49675
  "use strict";
49676
49676
  Object.defineProperty(exports, "__esModule", { value: true });
49677
49677
  var _keywords = require_keywords();
@@ -49700,9 +49700,9 @@ var require_isAsyncOperation = __commonJS({
49700
49700
  }
49701
49701
  });
49702
49702
 
49703
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/TokenProcessor.js
49703
+ // node_modules/sucrase/dist/TokenProcessor.js
49704
49704
  var require_TokenProcessor = __commonJS({
49705
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/TokenProcessor.js"(exports) {
49705
+ "node_modules/sucrase/dist/TokenProcessor.js"(exports) {
49706
49706
  "use strict";
49707
49707
  Object.defineProperty(exports, "__esModule", { value: true });
49708
49708
  function _interopRequireDefault(obj3) {
@@ -49995,9 +49995,9 @@ var require_TokenProcessor = __commonJS({
49995
49995
  }
49996
49996
  });
49997
49997
 
49998
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/getClassInfo.js
49998
+ // node_modules/sucrase/dist/util/getClassInfo.js
49999
49999
  var require_getClassInfo = __commonJS({
50000
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/getClassInfo.js"(exports) {
50000
+ "node_modules/sucrase/dist/util/getClassInfo.js"(exports) {
50001
50001
  "use strict";
50002
50002
  Object.defineProperty(exports, "__esModule", { value: true });
50003
50003
  var _keywords = require_keywords();
@@ -50237,9 +50237,9 @@ var require_getClassInfo = __commonJS({
50237
50237
  }
50238
50238
  });
50239
50239
 
50240
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/elideImportEquals.js
50240
+ // node_modules/sucrase/dist/util/elideImportEquals.js
50241
50241
  var require_elideImportEquals = __commonJS({
50242
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/elideImportEquals.js"(exports) {
50242
+ "node_modules/sucrase/dist/util/elideImportEquals.js"(exports) {
50243
50243
  "use strict";
50244
50244
  Object.defineProperty(exports, "__esModule", { value: true });
50245
50245
  var _types = require_types();
@@ -50263,9 +50263,9 @@ var require_elideImportEquals = __commonJS({
50263
50263
  }
50264
50264
  });
50265
50265
 
50266
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/getDeclarationInfo.js
50266
+ // node_modules/sucrase/dist/util/getDeclarationInfo.js
50267
50267
  var require_getDeclarationInfo = __commonJS({
50268
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/getDeclarationInfo.js"(exports) {
50268
+ "node_modules/sucrase/dist/util/getDeclarationInfo.js"(exports) {
50269
50269
  "use strict";
50270
50270
  Object.defineProperty(exports, "__esModule", { value: true });
50271
50271
  var _tokenizer = require_tokenizer();
@@ -50294,9 +50294,9 @@ var require_getDeclarationInfo = __commonJS({
50294
50294
  }
50295
50295
  });
50296
50296
 
50297
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/isExportFrom.js
50297
+ // node_modules/sucrase/dist/util/isExportFrom.js
50298
50298
  var require_isExportFrom = __commonJS({
50299
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/isExportFrom.js"(exports) {
50299
+ "node_modules/sucrase/dist/util/isExportFrom.js"(exports) {
50300
50300
  "use strict";
50301
50301
  Object.defineProperty(exports, "__esModule", { value: true });
50302
50302
  var _keywords = require_keywords();
@@ -50312,9 +50312,9 @@ var require_isExportFrom = __commonJS({
50312
50312
  }
50313
50313
  });
50314
50314
 
50315
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/removeMaybeImportAttributes.js
50315
+ // node_modules/sucrase/dist/util/removeMaybeImportAttributes.js
50316
50316
  var require_removeMaybeImportAttributes = __commonJS({
50317
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/removeMaybeImportAttributes.js"(exports) {
50317
+ "node_modules/sucrase/dist/util/removeMaybeImportAttributes.js"(exports) {
50318
50318
  "use strict";
50319
50319
  Object.defineProperty(exports, "__esModule", { value: true });
50320
50320
  var _keywords = require_keywords();
@@ -50331,9 +50331,9 @@ var require_removeMaybeImportAttributes = __commonJS({
50331
50331
  }
50332
50332
  });
50333
50333
 
50334
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/shouldElideDefaultExport.js
50334
+ // node_modules/sucrase/dist/util/shouldElideDefaultExport.js
50335
50335
  var require_shouldElideDefaultExport = __commonJS({
50336
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/shouldElideDefaultExport.js"(exports) {
50336
+ "node_modules/sucrase/dist/util/shouldElideDefaultExport.js"(exports) {
50337
50337
  "use strict";
50338
50338
  Object.defineProperty(exports, "__esModule", { value: true });
50339
50339
  var _types = require_types();
@@ -50360,9 +50360,9 @@ var require_shouldElideDefaultExport = __commonJS({
50360
50360
  }
50361
50361
  });
50362
50362
 
50363
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/transformers/CJSImportTransformer.js
50363
+ // node_modules/sucrase/dist/transformers/CJSImportTransformer.js
50364
50364
  var require_CJSImportTransformer = __commonJS({
50365
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/transformers/CJSImportTransformer.js"(exports) {
50365
+ "node_modules/sucrase/dist/transformers/CJSImportTransformer.js"(exports) {
50366
50366
  "use strict";
50367
50367
  Object.defineProperty(exports, "__esModule", { value: true });
50368
50368
  function _interopRequireDefault(obj3) {
@@ -50503,9 +50503,9 @@ var require_CJSImportTransformer = __commonJS({
50503
50503
  if (shouldElideImport) {
50504
50504
  this.tokens.removeToken();
50505
50505
  } else {
50506
- const path33 = this.tokens.stringValue();
50507
- this.tokens.replaceTokenTrimmingLeftWhitespace(this.importProcessor.claimImportCode(path33));
50508
- this.tokens.appendCode(this.importProcessor.claimImportCode(path33));
50506
+ const path37 = this.tokens.stringValue();
50507
+ this.tokens.replaceTokenTrimmingLeftWhitespace(this.importProcessor.claimImportCode(path37));
50508
+ this.tokens.appendCode(this.importProcessor.claimImportCode(path37));
50509
50509
  }
50510
50510
  _removeMaybeImportAttributes.removeMaybeImportAttributes.call(void 0, this.tokens);
50511
50511
  if (this.tokens.matches1(_types.TokenType.semi)) {
@@ -51085,8 +51085,8 @@ var require_CJSImportTransformer = __commonJS({
51085
51085
  }
51086
51086
  if (this.tokens.matchesContextual(_keywords.ContextualKeyword._from)) {
51087
51087
  this.tokens.removeToken();
51088
- const path33 = this.tokens.stringValue();
51089
- this.tokens.replaceTokenTrimmingLeftWhitespace(this.importProcessor.claimImportCode(path33));
51088
+ const path37 = this.tokens.stringValue();
51089
+ this.tokens.replaceTokenTrimmingLeftWhitespace(this.importProcessor.claimImportCode(path37));
51090
51090
  _removeMaybeImportAttributes.removeMaybeImportAttributes.call(void 0, this.tokens);
51091
51091
  } else {
51092
51092
  this.tokens.appendCode(exportStatements.join(" "));
@@ -51100,8 +51100,8 @@ var require_CJSImportTransformer = __commonJS({
51100
51100
  while (!this.tokens.matches1(_types.TokenType.string)) {
51101
51101
  this.tokens.removeToken();
51102
51102
  }
51103
- const path33 = this.tokens.stringValue();
51104
- this.tokens.replaceTokenTrimmingLeftWhitespace(this.importProcessor.claimImportCode(path33));
51103
+ const path37 = this.tokens.stringValue();
51104
+ this.tokens.replaceTokenTrimmingLeftWhitespace(this.importProcessor.claimImportCode(path37));
51105
51105
  _removeMaybeImportAttributes.removeMaybeImportAttributes.call(void 0, this.tokens);
51106
51106
  if (this.tokens.matches1(_types.TokenType.semi)) {
51107
51107
  this.tokens.removeToken();
@@ -51115,9 +51115,9 @@ var require_CJSImportTransformer = __commonJS({
51115
51115
  }
51116
51116
  });
51117
51117
 
51118
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/transformers/ESMImportTransformer.js
51118
+ // node_modules/sucrase/dist/transformers/ESMImportTransformer.js
51119
51119
  var require_ESMImportTransformer = __commonJS({
51120
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/transformers/ESMImportTransformer.js"(exports) {
51120
+ "node_modules/sucrase/dist/transformers/ESMImportTransformer.js"(exports) {
51121
51121
  "use strict";
51122
51122
  Object.defineProperty(exports, "__esModule", { value: true });
51123
51123
  function _interopRequireDefault(obj3) {
@@ -51419,9 +51419,9 @@ var require_ESMImportTransformer = __commonJS({
51419
51419
  }
51420
51420
  });
51421
51421
 
51422
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/transformers/FlowTransformer.js
51422
+ // node_modules/sucrase/dist/transformers/FlowTransformer.js
51423
51423
  var require_FlowTransformer = __commonJS({
51424
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/transformers/FlowTransformer.js"(exports) {
51424
+ "node_modules/sucrase/dist/transformers/FlowTransformer.js"(exports) {
51425
51425
  "use strict";
51426
51426
  Object.defineProperty(exports, "__esModule", { value: true });
51427
51427
  function _interopRequireDefault(obj3) {
@@ -51587,9 +51587,9 @@ var require_FlowTransformer = __commonJS({
51587
51587
  }
51588
51588
  });
51589
51589
 
51590
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/transformers/JestHoistTransformer.js
51590
+ // node_modules/sucrase/dist/transformers/JestHoistTransformer.js
51591
51591
  var require_JestHoistTransformer = __commonJS({
51592
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/transformers/JestHoistTransformer.js"(exports) {
51592
+ "node_modules/sucrase/dist/transformers/JestHoistTransformer.js"(exports) {
51593
51593
  "use strict";
51594
51594
  Object.defineProperty(exports, "__esModule", { value: true });
51595
51595
  function _interopRequireDefault(obj3) {
@@ -51693,9 +51693,9 @@ var require_JestHoistTransformer = __commonJS({
51693
51693
  }
51694
51694
  });
51695
51695
 
51696
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/transformers/NumericSeparatorTransformer.js
51696
+ // node_modules/sucrase/dist/transformers/NumericSeparatorTransformer.js
51697
51697
  var require_NumericSeparatorTransformer = __commonJS({
51698
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/transformers/NumericSeparatorTransformer.js"(exports) {
51698
+ "node_modules/sucrase/dist/transformers/NumericSeparatorTransformer.js"(exports) {
51699
51699
  "use strict";
51700
51700
  Object.defineProperty(exports, "__esModule", { value: true });
51701
51701
  function _interopRequireDefault(obj3) {
@@ -51725,9 +51725,9 @@ var require_NumericSeparatorTransformer = __commonJS({
51725
51725
  }
51726
51726
  });
51727
51727
 
51728
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/transformers/OptionalCatchBindingTransformer.js
51728
+ // node_modules/sucrase/dist/transformers/OptionalCatchBindingTransformer.js
51729
51729
  var require_OptionalCatchBindingTransformer = __commonJS({
51730
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/transformers/OptionalCatchBindingTransformer.js"(exports) {
51730
+ "node_modules/sucrase/dist/transformers/OptionalCatchBindingTransformer.js"(exports) {
51731
51731
  "use strict";
51732
51732
  Object.defineProperty(exports, "__esModule", { value: true });
51733
51733
  function _interopRequireDefault(obj3) {
@@ -51756,9 +51756,9 @@ var require_OptionalCatchBindingTransformer = __commonJS({
51756
51756
  }
51757
51757
  });
51758
51758
 
51759
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/transformers/OptionalChainingNullishTransformer.js
51759
+ // node_modules/sucrase/dist/transformers/OptionalChainingNullishTransformer.js
51760
51760
  var require_OptionalChainingNullishTransformer = __commonJS({
51761
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/transformers/OptionalChainingNullishTransformer.js"(exports) {
51761
+ "node_modules/sucrase/dist/transformers/OptionalChainingNullishTransformer.js"(exports) {
51762
51762
  "use strict";
51763
51763
  Object.defineProperty(exports, "__esModule", { value: true });
51764
51764
  function _interopRequireDefault(obj3) {
@@ -51894,9 +51894,9 @@ var require_OptionalChainingNullishTransformer = __commonJS({
51894
51894
  }
51895
51895
  });
51896
51896
 
51897
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/transformers/ReactDisplayNameTransformer.js
51897
+ // node_modules/sucrase/dist/transformers/ReactDisplayNameTransformer.js
51898
51898
  var require_ReactDisplayNameTransformer = __commonJS({
51899
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/transformers/ReactDisplayNameTransformer.js"(exports) {
51899
+ "node_modules/sucrase/dist/transformers/ReactDisplayNameTransformer.js"(exports) {
51900
51900
  "use strict";
51901
51901
  Object.defineProperty(exports, "__esModule", { value: true });
51902
51902
  function _interopRequireDefault(obj3) {
@@ -52022,9 +52022,9 @@ var require_ReactDisplayNameTransformer = __commonJS({
52022
52022
  }
52023
52023
  });
52024
52024
 
52025
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/transformers/ReactHotLoaderTransformer.js
52025
+ // node_modules/sucrase/dist/transformers/ReactHotLoaderTransformer.js
52026
52026
  var require_ReactHotLoaderTransformer = __commonJS({
52027
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/transformers/ReactHotLoaderTransformer.js"(exports) {
52027
+ "node_modules/sucrase/dist/transformers/ReactHotLoaderTransformer.js"(exports) {
52028
52028
  "use strict";
52029
52029
  Object.defineProperty(exports, "__esModule", { value: true });
52030
52030
  function _interopRequireDefault(obj3) {
@@ -52094,9 +52094,9 @@ ${namesToRegister.map(
52094
52094
  }
52095
52095
  });
52096
52096
 
52097
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/isIdentifier.js
52097
+ // node_modules/sucrase/dist/util/isIdentifier.js
52098
52098
  var require_isIdentifier = __commonJS({
52099
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/isIdentifier.js"(exports) {
52099
+ "node_modules/sucrase/dist/util/isIdentifier.js"(exports) {
52100
52100
  "use strict";
52101
52101
  Object.defineProperty(exports, "__esModule", { value: true });
52102
52102
  var _identifier = require_identifier();
@@ -52169,9 +52169,9 @@ var require_isIdentifier = __commonJS({
52169
52169
  }
52170
52170
  });
52171
52171
 
52172
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/transformers/TypeScriptTransformer.js
52172
+ // node_modules/sucrase/dist/transformers/TypeScriptTransformer.js
52173
52173
  var require_TypeScriptTransformer = __commonJS({
52174
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/transformers/TypeScriptTransformer.js"(exports) {
52174
+ "node_modules/sucrase/dist/transformers/TypeScriptTransformer.js"(exports) {
52175
52175
  "use strict";
52176
52176
  Object.defineProperty(exports, "__esModule", { value: true });
52177
52177
  function _interopRequireDefault(obj3) {
@@ -52410,9 +52410,9 @@ var require_TypeScriptTransformer = __commonJS({
52410
52410
  }
52411
52411
  });
52412
52412
 
52413
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/transformers/RootTransformer.js
52413
+ // node_modules/sucrase/dist/transformers/RootTransformer.js
52414
52414
  var require_RootTransformer = __commonJS({
52415
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/transformers/RootTransformer.js"(exports) {
52415
+ "node_modules/sucrase/dist/transformers/RootTransformer.js"(exports) {
52416
52416
  "use strict";
52417
52417
  Object.defineProperty(exports, "__esModule", { value: true });
52418
52418
  function _interopRequireDefault(obj3) {
@@ -52827,9 +52827,9 @@ var require_RootTransformer = __commonJS({
52827
52827
  }
52828
52828
  });
52829
52829
 
52830
- // ../../../../../../git/ai4kanban/runner/node_modules/lines-and-columns/build/index.js
52830
+ // node_modules/lines-and-columns/build/index.js
52831
52831
  var require_build = __commonJS({
52832
- "../../../../../../git/ai4kanban/runner/node_modules/lines-and-columns/build/index.js"(exports) {
52832
+ "node_modules/lines-and-columns/build/index.js"(exports) {
52833
52833
  "use strict";
52834
52834
  exports.__esModule = true;
52835
52835
  exports.LinesAndColumns = void 0;
@@ -52896,9 +52896,9 @@ var require_build = __commonJS({
52896
52896
  }
52897
52897
  });
52898
52898
 
52899
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/formatTokens.js
52899
+ // node_modules/sucrase/dist/util/formatTokens.js
52900
52900
  var require_formatTokens = __commonJS({
52901
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/formatTokens.js"(exports) {
52901
+ "node_modules/sucrase/dist/util/formatTokens.js"(exports) {
52902
52902
  "use strict";
52903
52903
  Object.defineProperty(exports, "__esModule", { value: true });
52904
52904
  function _interopRequireDefault(obj3) {
@@ -52969,9 +52969,9 @@ var require_formatTokens = __commonJS({
52969
52969
  }
52970
52970
  });
52971
52971
 
52972
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/getTSImportedNames.js
52972
+ // node_modules/sucrase/dist/util/getTSImportedNames.js
52973
52973
  var require_getTSImportedNames = __commonJS({
52974
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/util/getTSImportedNames.js"(exports) {
52974
+ "node_modules/sucrase/dist/util/getTSImportedNames.js"(exports) {
52975
52975
  "use strict";
52976
52976
  Object.defineProperty(exports, "__esModule", { value: true });
52977
52977
  function _interopRequireDefault(obj3) {
@@ -53036,9 +53036,9 @@ var require_getTSImportedNames = __commonJS({
53036
53036
  }
53037
53037
  });
53038
53038
 
53039
- // ../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/index.js
53039
+ // node_modules/sucrase/dist/index.js
53040
53040
  var require_dist2 = __commonJS({
53041
- "../../../../../../git/ai4kanban/runner/node_modules/sucrase/dist/index.js"(exports) {
53041
+ "node_modules/sucrase/dist/index.js"(exports) {
53042
53042
  "use strict";
53043
53043
  Object.defineProperty(exports, "__esModule", { value: true });
53044
53044
  function _interopRequireDefault(obj3) {
@@ -53151,15 +53151,15 @@ var require_dist2 = __commonJS({
53151
53151
  }
53152
53152
  });
53153
53153
 
53154
- // ../../../../../../git/ai4kanban/runner/node_modules/tailwindcss/dist/chunk-DCG7AFIE.mjs
53154
+ // node_modules/tailwindcss/dist/chunk-DCG7AFIE.mjs
53155
53155
  var o;
53156
53156
  var init_chunk_DCG7AFIE = __esm({
53157
- "../../../../../../git/ai4kanban/runner/node_modules/tailwindcss/dist/chunk-DCG7AFIE.mjs"() {
53157
+ "node_modules/tailwindcss/dist/chunk-DCG7AFIE.mjs"() {
53158
53158
  o = { inherit: "inherit", current: "currentcolor", transparent: "transparent", black: "#000", white: "#fff", slate: { 50: "oklch(98.4% 0.003 247.858)", 100: "oklch(96.8% 0.007 247.896)", 200: "oklch(92.9% 0.013 255.508)", 300: "oklch(86.9% 0.022 252.894)", 400: "oklch(70.4% 0.04 256.788)", 500: "oklch(55.4% 0.046 257.417)", 600: "oklch(44.6% 0.043 257.281)", 700: "oklch(37.2% 0.044 257.287)", 800: "oklch(27.9% 0.041 260.031)", 900: "oklch(20.8% 0.042 265.755)", 950: "oklch(12.9% 0.042 264.695)" }, gray: { 50: "oklch(98.5% 0.002 247.839)", 100: "oklch(96.7% 0.003 264.542)", 200: "oklch(92.8% 0.006 264.531)", 300: "oklch(87.2% 0.01 258.338)", 400: "oklch(70.7% 0.022 261.325)", 500: "oklch(55.1% 0.027 264.364)", 600: "oklch(44.6% 0.03 256.802)", 700: "oklch(37.3% 0.034 259.733)", 800: "oklch(27.8% 0.033 256.848)", 900: "oklch(21% 0.034 264.665)", 950: "oklch(13% 0.028 261.692)" }, zinc: { 50: "oklch(98.5% 0 none)", 100: "oklch(96.7% 0.001 286.375)", 200: "oklch(92% 0.004 286.32)", 300: "oklch(87.1% 0.006 286.286)", 400: "oklch(70.5% 0.015 286.067)", 500: "oklch(55.2% 0.016 285.938)", 600: "oklch(44.2% 0.017 285.786)", 700: "oklch(37% 0.013 285.805)", 800: "oklch(27.4% 0.006 286.033)", 900: "oklch(21% 0.006 285.885)", 950: "oklch(14.1% 0.005 285.823)" }, neutral: { 50: "oklch(98.5% 0 none)", 100: "oklch(97% 0 none)", 200: "oklch(92.2% 0 none)", 300: "oklch(87% 0 none)", 400: "oklch(70.8% 0 none)", 500: "oklch(55.6% 0 none)", 600: "oklch(43.9% 0 none)", 700: "oklch(37.1% 0 none)", 800: "oklch(26.9% 0 none)", 900: "oklch(20.5% 0 none)", 950: "oklch(14.5% 0 none)" }, stone: { 50: "oklch(98.5% 0.001 106.423)", 100: "oklch(97% 0.001 106.424)", 200: "oklch(92.3% 0.003 48.717)", 300: "oklch(86.9% 0.005 56.366)", 400: "oklch(70.9% 0.01 56.259)", 500: "oklch(55.3% 0.013 58.071)", 600: "oklch(44.4% 0.011 73.639)", 700: "oklch(37.4% 0.01 67.558)", 800: "oklch(26.8% 0.007 34.298)", 900: "oklch(21.6% 0.006 56.043)", 950: "oklch(14.7% 0.004 49.25)" }, mauve: { 50: "oklch(98.5% 0 none)", 100: "oklch(96% 0.003 325.6)", 200: "oklch(92.2% 0.005 325.62)", 300: "oklch(86.5% 0.012 325.68)", 400: "oklch(71.1% 0.019 323.02)", 500: "oklch(54.2% 0.034 322.5)", 600: "oklch(43.5% 0.029 321.78)", 700: "oklch(36.4% 0.029 323.89)", 800: "oklch(26.3% 0.024 320.12)", 900: "oklch(21.2% 0.019 322.12)", 950: "oklch(14.5% 0.008 326)" }, olive: { 50: "oklch(98.8% 0.003 106.5)", 100: "oklch(96.6% 0.005 106.5)", 200: "oklch(93% 0.007 106.5)", 300: "oklch(88% 0.011 106.6)", 400: "oklch(73.7% 0.021 106.9)", 500: "oklch(58% 0.031 107.3)", 600: "oklch(46.6% 0.025 107.3)", 700: "oklch(39.4% 0.023 107.4)", 800: "oklch(28.6% 0.016 107.4)", 900: "oklch(22.8% 0.013 107.4)", 950: "oklch(15.3% 0.006 107.1)" }, mist: { 50: "oklch(98.7% 0.002 197.1)", 100: "oklch(96.3% 0.002 197.1)", 200: "oklch(92.5% 0.005 214.3)", 300: "oklch(87.2% 0.007 219.6)", 400: "oklch(72.3% 0.014 214.4)", 500: "oklch(56% 0.021 213.5)", 600: "oklch(45% 0.017 213.2)", 700: "oklch(37.8% 0.015 216)", 800: "oklch(27.5% 0.011 216.9)", 900: "oklch(21.8% 0.008 223.9)", 950: "oklch(14.8% 0.004 228.8)" }, taupe: { 50: "oklch(98.6% 0.002 67.8)", 100: "oklch(96% 0.002 17.2)", 200: "oklch(92.2% 0.005 34.3)", 300: "oklch(86.8% 0.007 39.5)", 400: "oklch(71.4% 0.014 41.2)", 500: "oklch(54.7% 0.021 43.1)", 600: "oklch(43.8% 0.017 39.3)", 700: "oklch(36.7% 0.016 35.7)", 800: "oklch(26.8% 0.011 36.5)", 900: "oklch(21.4% 0.009 43.1)", 950: "oklch(14.7% 0.004 49.3)" }, red: { 50: "oklch(97.1% 0.013 17.38)", 100: "oklch(93.6% 0.032 17.717)", 200: "oklch(88.5% 0.062 18.334)", 300: "oklch(80.8% 0.114 19.571)", 400: "oklch(70.4% 0.191 22.216)", 500: "oklch(63.7% 0.237 25.331)", 600: "oklch(57.7% 0.245 27.325)", 700: "oklch(50.5% 0.213 27.518)", 800: "oklch(44.4% 0.177 26.899)", 900: "oklch(39.6% 0.141 25.723)", 950: "oklch(25.8% 0.092 26.042)" }, orange: { 50: "oklch(98% 0.016 73.684)", 100: "oklch(95.4% 0.038 75.164)", 200: "oklch(90.1% 0.076 70.697)", 300: "oklch(83.7% 0.128 66.29)", 400: "oklch(75% 0.183 55.934)", 500: "oklch(70.5% 0.213 47.604)", 600: "oklch(64.6% 0.222 41.116)", 700: "oklch(55.3% 0.195 38.402)", 800: "oklch(47% 0.157 37.304)", 900: "oklch(40.8% 0.123 38.172)", 950: "oklch(26.6% 0.079 36.259)" }, amber: { 50: "oklch(98.7% 0.022 95.277)", 100: "oklch(96.2% 0.059 95.617)", 200: "oklch(92.4% 0.12 95.746)", 300: "oklch(87.9% 0.169 91.605)", 400: "oklch(82.8% 0.189 84.429)", 500: "oklch(76.9% 0.188 70.08)", 600: "oklch(66.6% 0.179 58.318)", 700: "oklch(55.5% 0.163 48.998)", 800: "oklch(47.3% 0.137 46.201)", 900: "oklch(41.4% 0.112 45.904)", 950: "oklch(27.9% 0.077 45.635)" }, yellow: { 50: "oklch(98.7% 0.026 102.212)", 100: "oklch(97.3% 0.071 103.193)", 200: "oklch(94.5% 0.129 101.54)", 300: "oklch(90.5% 0.182 98.111)", 400: "oklch(85.2% 0.199 91.936)", 500: "oklch(79.5% 0.184 86.047)", 600: "oklch(68.1% 0.162 75.834)", 700: "oklch(55.4% 0.135 66.442)", 800: "oklch(47.6% 0.114 61.907)", 900: "oklch(42.1% 0.095 57.708)", 950: "oklch(28.6% 0.066 53.813)" }, lime: { 50: "oklch(98.6% 0.031 120.757)", 100: "oklch(96.7% 0.067 122.328)", 200: "oklch(93.8% 0.127 124.321)", 300: "oklch(89.7% 0.196 126.665)", 400: "oklch(84.1% 0.238 128.85)", 500: "oklch(76.8% 0.233 130.85)", 600: "oklch(64.8% 0.2 131.684)", 700: "oklch(53.2% 0.157 131.589)", 800: "oklch(45.3% 0.124 130.933)", 900: "oklch(40.5% 0.101 131.063)", 950: "oklch(27.4% 0.072 132.109)" }, green: { 50: "oklch(98.2% 0.018 155.826)", 100: "oklch(96.2% 0.044 156.743)", 200: "oklch(92.5% 0.084 155.995)", 300: "oklch(87.1% 0.15 154.449)", 400: "oklch(79.2% 0.209 151.711)", 500: "oklch(72.3% 0.219 149.579)", 600: "oklch(62.7% 0.194 149.214)", 700: "oklch(52.7% 0.154 150.069)", 800: "oklch(44.8% 0.119 151.328)", 900: "oklch(39.3% 0.095 152.535)", 950: "oklch(26.6% 0.065 152.934)" }, emerald: { 50: "oklch(97.9% 0.021 166.113)", 100: "oklch(95% 0.052 163.051)", 200: "oklch(90.5% 0.093 164.15)", 300: "oklch(84.5% 0.143 164.978)", 400: "oklch(76.5% 0.177 163.223)", 500: "oklch(69.6% 0.17 162.48)", 600: "oklch(59.6% 0.145 163.225)", 700: "oklch(50.8% 0.118 165.612)", 800: "oklch(43.2% 0.095 166.913)", 900: "oklch(37.8% 0.077 168.94)", 950: "oklch(26.2% 0.051 172.552)" }, teal: { 50: "oklch(98.4% 0.014 180.72)", 100: "oklch(95.3% 0.051 180.801)", 200: "oklch(91% 0.096 180.426)", 300: "oklch(85.5% 0.138 181.071)", 400: "oklch(77.7% 0.152 181.912)", 500: "oklch(70.4% 0.14 182.503)", 600: "oklch(60% 0.118 184.704)", 700: "oklch(51.1% 0.096 186.391)", 800: "oklch(43.7% 0.078 188.216)", 900: "oklch(38.6% 0.063 188.416)", 950: "oklch(27.7% 0.046 192.524)" }, cyan: { 50: "oklch(98.4% 0.019 200.873)", 100: "oklch(95.6% 0.045 203.388)", 200: "oklch(91.7% 0.08 205.041)", 300: "oklch(86.5% 0.127 207.078)", 400: "oklch(78.9% 0.154 211.53)", 500: "oklch(71.5% 0.143 215.221)", 600: "oklch(60.9% 0.126 221.723)", 700: "oklch(52% 0.105 223.128)", 800: "oklch(45% 0.085 224.283)", 900: "oklch(39.8% 0.07 227.392)", 950: "oklch(30.2% 0.056 229.695)" }, sky: { 50: "oklch(97.7% 0.013 236.62)", 100: "oklch(95.1% 0.026 236.824)", 200: "oklch(90.1% 0.058 230.902)", 300: "oklch(82.8% 0.111 230.318)", 400: "oklch(74.6% 0.16 232.661)", 500: "oklch(68.5% 0.169 237.323)", 600: "oklch(58.8% 0.158 241.966)", 700: "oklch(50% 0.134 242.749)", 800: "oklch(44.3% 0.11 240.79)", 900: "oklch(39.1% 0.09 240.876)", 950: "oklch(29.3% 0.066 243.157)" }, blue: { 50: "oklch(97% 0.014 254.604)", 100: "oklch(93.2% 0.032 255.585)", 200: "oklch(88.2% 0.059 254.128)", 300: "oklch(80.9% 0.105 251.813)", 400: "oklch(70.7% 0.165 254.624)", 500: "oklch(62.3% 0.214 259.815)", 600: "oklch(54.6% 0.245 262.881)", 700: "oklch(48.8% 0.243 264.376)", 800: "oklch(42.4% 0.199 265.638)", 900: "oklch(37.9% 0.146 265.522)", 950: "oklch(28.2% 0.091 267.935)" }, indigo: { 50: "oklch(96.2% 0.018 272.314)", 100: "oklch(93% 0.034 272.788)", 200: "oklch(87% 0.065 274.039)", 300: "oklch(78.5% 0.115 274.713)", 400: "oklch(67.3% 0.182 276.935)", 500: "oklch(58.5% 0.233 277.117)", 600: "oklch(51.1% 0.262 276.966)", 700: "oklch(45.7% 0.24 277.023)", 800: "oklch(39.8% 0.195 277.366)", 900: "oklch(35.9% 0.144 278.697)", 950: "oklch(25.7% 0.09 281.288)" }, violet: { 50: "oklch(96.9% 0.016 293.756)", 100: "oklch(94.3% 0.029 294.588)", 200: "oklch(89.4% 0.057 293.283)", 300: "oklch(81.1% 0.111 293.571)", 400: "oklch(70.2% 0.183 293.541)", 500: "oklch(60.6% 0.25 292.717)", 600: "oklch(54.1% 0.281 293.009)", 700: "oklch(49.1% 0.27 292.581)", 800: "oklch(43.2% 0.232 292.759)", 900: "oklch(38% 0.189 293.745)", 950: "oklch(28.3% 0.141 291.089)" }, purple: { 50: "oklch(97.7% 0.014 308.299)", 100: "oklch(94.6% 0.033 307.174)", 200: "oklch(90.2% 0.063 306.703)", 300: "oklch(82.7% 0.119 306.383)", 400: "oklch(71.4% 0.203 305.504)", 500: "oklch(62.7% 0.265 303.9)", 600: "oklch(55.8% 0.288 302.321)", 700: "oklch(49.6% 0.265 301.924)", 800: "oklch(43.8% 0.218 303.724)", 900: "oklch(38.1% 0.176 304.987)", 950: "oklch(29.1% 0.149 302.717)" }, fuchsia: { 50: "oklch(97.7% 0.017 320.058)", 100: "oklch(95.2% 0.037 318.852)", 200: "oklch(90.3% 0.076 319.62)", 300: "oklch(83.3% 0.145 321.434)", 400: "oklch(74% 0.238 322.16)", 500: "oklch(66.7% 0.295 322.15)", 600: "oklch(59.1% 0.293 322.896)", 700: "oklch(51.8% 0.253 323.949)", 800: "oklch(45.2% 0.211 324.591)", 900: "oklch(40.1% 0.17 325.612)", 950: "oklch(29.3% 0.136 325.661)" }, pink: { 50: "oklch(97.1% 0.014 343.198)", 100: "oklch(94.8% 0.028 342.258)", 200: "oklch(89.9% 0.061 343.231)", 300: "oklch(82.3% 0.12 346.018)", 400: "oklch(71.8% 0.202 349.761)", 500: "oklch(65.6% 0.241 354.308)", 600: "oklch(59.2% 0.249 0.584)", 700: "oklch(52.5% 0.223 3.958)", 800: "oklch(45.9% 0.187 3.815)", 900: "oklch(40.8% 0.153 2.432)", 950: "oklch(28.4% 0.109 3.907)" }, rose: { 50: "oklch(96.9% 0.015 12.422)", 100: "oklch(94.1% 0.03 12.58)", 200: "oklch(89.2% 0.058 10.001)", 300: "oklch(81% 0.117 11.638)", 400: "oklch(71.2% 0.194 13.428)", 500: "oklch(64.5% 0.246 16.439)", 600: "oklch(58.6% 0.253 17.585)", 700: "oklch(51.4% 0.222 16.935)", 800: "oklch(45.5% 0.188 13.697)", 900: "oklch(41% 0.159 10.272)", 950: "oklch(27.1% 0.105 12.094)" } };
53159
53159
  }
53160
53160
  });
53161
53161
 
53162
- // ../../../../../../git/ai4kanban/runner/node_modules/tailwindcss/dist/chunk-C2OYBFIH.mjs
53162
+ // node_modules/tailwindcss/dist/chunk-C2OYBFIH.mjs
53163
53163
  function N(e2) {
53164
53164
  return e2.charCodeAt(0) === 35 || U.test(e2) || S.has(e2.toLowerCase());
53165
53165
  }
@@ -53379,7 +53379,7 @@ function h(e2) {
53379
53379
  }
53380
53380
  var S, U, A, E, P, z, I, D, x, W, q2, V, Z, j, K, J, X, te, g, l, f, L, w, ne, _, ye;
53381
53381
  var init_chunk_C2OYBFIH = __esm({
53382
- "../../../../../../git/ai4kanban/runner/node_modules/tailwindcss/dist/chunk-C2OYBFIH.mjs"() {
53382
+ "node_modules/tailwindcss/dist/chunk-C2OYBFIH.mjs"() {
53383
53383
  init_chunk_DCG7AFIE();
53384
53384
  S = /* @__PURE__ */ new Set(["black", "silver", "gray", "white", "maroon", "red", "purple", "fuchsia", "green", "lime", "olive", "yellow", "navy", "blue", "teal", "aqua", "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "green", "greenyellow", "grey", "honeydew", "hotpink", "indianred", "indigo", "ivory", "khaki", "lavender", "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightgrey", "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", "lightslategrey", "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", "purple", "rebeccapurple", "red", "rosybrown", "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", "slategrey", "snow", "springgreen", "steelblue", "tan", "teal", "thistle", "tomato", "turquoise", "violet", "wheat", "white", "whitesmoke", "yellow", "yellowgreen", "transparent", "currentcolor", "canvas", "canvastext", "linktext", "visitedtext", "activetext", "buttonface", "buttontext", "buttonborder", "field", "fieldtext", "highlight", "highlighttext", "selecteditem", "selecteditemtext", "mark", "marktext", "graytext", "accentcolor", "accentcolortext"]);
53385
53385
  U = /^(rgba?|hsla?|hwb|color|(ok)?(lab|lch)|light-dark|color-mix|--alpha)\(/i;
@@ -53426,7 +53426,7 @@ var init_chunk_C2OYBFIH = __esm({
53426
53426
  }
53427
53427
  });
53428
53428
 
53429
- // ../../../../../../git/ai4kanban/runner/node_modules/tailwindcss/dist/chunk-5JIJA4QV.mjs
53429
+ // node_modules/tailwindcss/dist/chunk-5JIJA4QV.mjs
53430
53430
  function h2(n) {
53431
53431
  if (arguments.length === 0) throw new TypeError("`CSS.escape` requires an argument.");
53432
53432
  let e2 = String(n), i = e2.length, r2 = -1, t2, s = "", l2 = e2.charCodeAt(0);
@@ -53460,7 +53460,7 @@ function g2(n, e2) {
53460
53460
  }
53461
53461
  var c, p;
53462
53462
  var init_chunk_5JIJA4QV = __esm({
53463
- "../../../../../../git/ai4kanban/runner/node_modules/tailwindcss/dist/chunk-5JIJA4QV.mjs"() {
53463
+ "node_modules/tailwindcss/dist/chunk-5JIJA4QV.mjs"() {
53464
53464
  c = /* @__PURE__ */ new Map([["--font", ["--font-weight", "--font-size"]], ["--inset", ["--inset-shadow", "--inset-ring"]], ["--text", ["--text-color", "--text-decoration-color", "--text-decoration-thickness", "--text-indent", "--text-shadow", "--text-underline-offset"]], ["--grid-column", ["--grid-column-start", "--grid-column-end"]], ["--grid-row", ["--grid-row-start", "--grid-row-end"]]]);
53465
53465
  p = class {
53466
53466
  constructor(e2 = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Set([])) {
@@ -53580,7 +53580,7 @@ var init_chunk_5JIJA4QV = __esm({
53580
53580
  }
53581
53581
  });
53582
53582
 
53583
- // ../../../../../../git/ai4kanban/runner/node_modules/tailwindcss/dist/lib.mjs
53583
+ // node_modules/tailwindcss/dist/lib.mjs
53584
53584
  function mn(e2) {
53585
53585
  return { kind: "combinator", value: e2 };
53586
53586
  }
@@ -58691,7 +58691,7 @@ async function zf(e2, i = {}) {
58691
58691
  }
58692
58692
  var yr, Cr, vn, Sr, Lt, Vr, wn, Rr, $r, Dt, Pr, zt, Tr, Nr, kn, Kt, Ut, Er, Or, jt, He, ct, pt, _r, Ir, bn, dt, me, mt, Ze, Je, Dr, Ft, Yt, Kr, yn, xn, Ur, Wt, An, ge2, U2, zr, Vn, jr, Mr, $n, Fr, Wr, Br, Yr, Tn, Nn, En, Gr, qr, qt, V2, Rn, Pn, On, In, Dn, Jt, Ln, Qr, Xr, ei, er, zn, jn, Fn, Bn, le, Yn, Gn, qn, Hn, yt, rr, oi, ir, fi, Zn, Jn, Qn, Xn, el, tl, rl, kt, bt, il, nl, nr, ci, gl, hl, vl, wi, ki, bi, Ti, lt, Ni, Ei, $l, Ri, Nl, Pi, Rl, or, Vt, _i, Ul, Fl, Wl, we, Vi, sr, $t, ur, Nt, Ki, fa, Et, fr, pr, Zi, wa, Aa, fn, Va, Ht, ze;
58693
58693
  var init_lib = __esm({
58694
- "../../../../../../git/ai4kanban/runner/node_modules/tailwindcss/dist/lib.mjs"() {
58694
+ "node_modules/tailwindcss/dist/lib.mjs"() {
58695
58695
  init_chunk_C2OYBFIH();
58696
58696
  init_chunk_DCG7AFIE();
58697
58697
  init_chunk_5JIJA4QV();
@@ -59010,24 +59010,24 @@ var init_lib = __esm({
59010
59010
  }
59011
59011
  });
59012
59012
 
59013
- // ../../../../../../git/ai4kanban/runner/node_modules/tailwindcss/index.css
59013
+ // node_modules/tailwindcss/index.css
59014
59014
  var tailwindcss_default;
59015
59015
  var init_tailwindcss = __esm({
59016
- "../../../../../../git/ai4kanban/runner/node_modules/tailwindcss/index.css"() {
59016
+ "node_modules/tailwindcss/index.css"() {
59017
59017
  tailwindcss_default = '@layer theme, base, components, utilities;\n\n@layer theme {\n @theme default {\n --font-sans:\n -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue",\n "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji",\n "Segoe UI Symbol", "Noto Color Emoji";\n --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;\n --font-mono:\n ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",\n "Courier New", monospace;\n\n --color-red-50: oklch(97.1% 0.013 17.38);\n --color-red-100: oklch(93.6% 0.032 17.717);\n --color-red-200: oklch(88.5% 0.062 18.334);\n --color-red-300: oklch(80.8% 0.114 19.571);\n --color-red-400: oklch(70.4% 0.191 22.216);\n --color-red-500: oklch(63.7% 0.237 25.331);\n --color-red-600: oklch(57.7% 0.245 27.325);\n --color-red-700: oklch(50.5% 0.213 27.518);\n --color-red-800: oklch(44.4% 0.177 26.899);\n --color-red-900: oklch(39.6% 0.141 25.723);\n --color-red-950: oklch(25.8% 0.092 26.042);\n\n --color-orange-50: oklch(98% 0.016 73.684);\n --color-orange-100: oklch(95.4% 0.038 75.164);\n --color-orange-200: oklch(90.1% 0.076 70.697);\n --color-orange-300: oklch(83.7% 0.128 66.29);\n --color-orange-400: oklch(75% 0.183 55.934);\n --color-orange-500: oklch(70.5% 0.213 47.604);\n --color-orange-600: oklch(64.6% 0.222 41.116);\n --color-orange-700: oklch(55.3% 0.195 38.402);\n --color-orange-800: oklch(47% 0.157 37.304);\n --color-orange-900: oklch(40.8% 0.123 38.172);\n --color-orange-950: oklch(26.6% 0.079 36.259);\n\n --color-amber-50: oklch(98.7% 0.022 95.277);\n --color-amber-100: oklch(96.2% 0.059 95.617);\n --color-amber-200: oklch(92.4% 0.12 95.746);\n --color-amber-300: oklch(87.9% 0.169 91.605);\n --color-amber-400: oklch(82.8% 0.189 84.429);\n --color-amber-500: oklch(76.9% 0.188 70.08);\n --color-amber-600: oklch(66.6% 0.179 58.318);\n --color-amber-700: oklch(55.5% 0.163 48.998);\n --color-amber-800: oklch(47.3% 0.137 46.201);\n --color-amber-900: oklch(41.4% 0.112 45.904);\n --color-amber-950: oklch(27.9% 0.077 45.635);\n\n --color-yellow-50: oklch(98.7% 0.026 102.212);\n --color-yellow-100: oklch(97.3% 0.071 103.193);\n --color-yellow-200: oklch(94.5% 0.129 101.54);\n --color-yellow-300: oklch(90.5% 0.182 98.111);\n --color-yellow-400: oklch(85.2% 0.199 91.936);\n --color-yellow-500: oklch(79.5% 0.184 86.047);\n --color-yellow-600: oklch(68.1% 0.162 75.834);\n --color-yellow-700: oklch(55.4% 0.135 66.442);\n --color-yellow-800: oklch(47.6% 0.114 61.907);\n --color-yellow-900: oklch(42.1% 0.095 57.708);\n --color-yellow-950: oklch(28.6% 0.066 53.813);\n\n --color-lime-50: oklch(98.6% 0.031 120.757);\n --color-lime-100: oklch(96.7% 0.067 122.328);\n --color-lime-200: oklch(93.8% 0.127 124.321);\n --color-lime-300: oklch(89.7% 0.196 126.665);\n --color-lime-400: oklch(84.1% 0.238 128.85);\n --color-lime-500: oklch(76.8% 0.233 130.85);\n --color-lime-600: oklch(64.8% 0.2 131.684);\n --color-lime-700: oklch(53.2% 0.157 131.589);\n --color-lime-800: oklch(45.3% 0.124 130.933);\n --color-lime-900: oklch(40.5% 0.101 131.063);\n --color-lime-950: oklch(27.4% 0.072 132.109);\n\n --color-green-50: oklch(98.2% 0.018 155.826);\n --color-green-100: oklch(96.2% 0.044 156.743);\n --color-green-200: oklch(92.5% 0.084 155.995);\n --color-green-300: oklch(87.1% 0.15 154.449);\n --color-green-400: oklch(79.2% 0.209 151.711);\n --color-green-500: oklch(72.3% 0.219 149.579);\n --color-green-600: oklch(62.7% 0.194 149.214);\n --color-green-700: oklch(52.7% 0.154 150.069);\n --color-green-800: oklch(44.8% 0.119 151.328);\n --color-green-900: oklch(39.3% 0.095 152.535);\n --color-green-950: oklch(26.6% 0.065 152.934);\n\n --color-emerald-50: oklch(97.9% 0.021 166.113);\n --color-emerald-100: oklch(95% 0.052 163.051);\n --color-emerald-200: oklch(90.5% 0.093 164.15);\n --color-emerald-300: oklch(84.5% 0.143 164.978);\n --color-emerald-400: oklch(76.5% 0.177 163.223);\n --color-emerald-500: oklch(69.6% 0.17 162.48);\n --color-emerald-600: oklch(59.6% 0.145 163.225);\n --color-emerald-700: oklch(50.8% 0.118 165.612);\n --color-emerald-800: oklch(43.2% 0.095 166.913);\n --color-emerald-900: oklch(37.8% 0.077 168.94);\n --color-emerald-950: oklch(26.2% 0.051 172.552);\n\n --color-teal-50: oklch(98.4% 0.014 180.72);\n --color-teal-100: oklch(95.3% 0.051 180.801);\n --color-teal-200: oklch(91% 0.096 180.426);\n --color-teal-300: oklch(85.5% 0.138 181.071);\n --color-teal-400: oklch(77.7% 0.152 181.912);\n --color-teal-500: oklch(70.4% 0.14 182.503);\n --color-teal-600: oklch(60% 0.118 184.704);\n --color-teal-700: oklch(51.1% 0.096 186.391);\n --color-teal-800: oklch(43.7% 0.078 188.216);\n --color-teal-900: oklch(38.6% 0.063 188.416);\n --color-teal-950: oklch(27.7% 0.046 192.524);\n\n --color-cyan-50: oklch(98.4% 0.019 200.873);\n --color-cyan-100: oklch(95.6% 0.045 203.388);\n --color-cyan-200: oklch(91.7% 0.08 205.041);\n --color-cyan-300: oklch(86.5% 0.127 207.078);\n --color-cyan-400: oklch(78.9% 0.154 211.53);\n --color-cyan-500: oklch(71.5% 0.143 215.221);\n --color-cyan-600: oklch(60.9% 0.126 221.723);\n --color-cyan-700: oklch(52% 0.105 223.128);\n --color-cyan-800: oklch(45% 0.085 224.283);\n --color-cyan-900: oklch(39.8% 0.07 227.392);\n --color-cyan-950: oklch(30.2% 0.056 229.695);\n\n --color-sky-50: oklch(97.7% 0.013 236.62);\n --color-sky-100: oklch(95.1% 0.026 236.824);\n --color-sky-200: oklch(90.1% 0.058 230.902);\n --color-sky-300: oklch(82.8% 0.111 230.318);\n --color-sky-400: oklch(74.6% 0.16 232.661);\n --color-sky-500: oklch(68.5% 0.169 237.323);\n --color-sky-600: oklch(58.8% 0.158 241.966);\n --color-sky-700: oklch(50% 0.134 242.749);\n --color-sky-800: oklch(44.3% 0.11 240.79);\n --color-sky-900: oklch(39.1% 0.09 240.876);\n --color-sky-950: oklch(29.3% 0.066 243.157);\n\n --color-blue-50: oklch(97% 0.014 254.604);\n --color-blue-100: oklch(93.2% 0.032 255.585);\n --color-blue-200: oklch(88.2% 0.059 254.128);\n --color-blue-300: oklch(80.9% 0.105 251.813);\n --color-blue-400: oklch(70.7% 0.165 254.624);\n --color-blue-500: oklch(62.3% 0.214 259.815);\n --color-blue-600: oklch(54.6% 0.245 262.881);\n --color-blue-700: oklch(48.8% 0.243 264.376);\n --color-blue-800: oklch(42.4% 0.199 265.638);\n --color-blue-900: oklch(37.9% 0.146 265.522);\n --color-blue-950: oklch(28.2% 0.091 267.935);\n\n --color-indigo-50: oklch(96.2% 0.018 272.314);\n --color-indigo-100: oklch(93% 0.034 272.788);\n --color-indigo-200: oklch(87% 0.065 274.039);\n --color-indigo-300: oklch(78.5% 0.115 274.713);\n --color-indigo-400: oklch(67.3% 0.182 276.935);\n --color-indigo-500: oklch(58.5% 0.233 277.117);\n --color-indigo-600: oklch(51.1% 0.262 276.966);\n --color-indigo-700: oklch(45.7% 0.24 277.023);\n --color-indigo-800: oklch(39.8% 0.195 277.366);\n --color-indigo-900: oklch(35.9% 0.144 278.697);\n --color-indigo-950: oklch(25.7% 0.09 281.288);\n\n --color-violet-50: oklch(96.9% 0.016 293.756);\n --color-violet-100: oklch(94.3% 0.029 294.588);\n --color-violet-200: oklch(89.4% 0.057 293.283);\n --color-violet-300: oklch(81.1% 0.111 293.571);\n --color-violet-400: oklch(70.2% 0.183 293.541);\n --color-violet-500: oklch(60.6% 0.25 292.717);\n --color-violet-600: oklch(54.1% 0.281 293.009);\n --color-violet-700: oklch(49.1% 0.27 292.581);\n --color-violet-800: oklch(43.2% 0.232 292.759);\n --color-violet-900: oklch(38% 0.189 293.745);\n --color-violet-950: oklch(28.3% 0.141 291.089);\n\n --color-purple-50: oklch(97.7% 0.014 308.299);\n --color-purple-100: oklch(94.6% 0.033 307.174);\n --color-purple-200: oklch(90.2% 0.063 306.703);\n --color-purple-300: oklch(82.7% 0.119 306.383);\n --color-purple-400: oklch(71.4% 0.203 305.504);\n --color-purple-500: oklch(62.7% 0.265 303.9);\n --color-purple-600: oklch(55.8% 0.288 302.321);\n --color-purple-700: oklch(49.6% 0.265 301.924);\n --color-purple-800: oklch(43.8% 0.218 303.724);\n --color-purple-900: oklch(38.1% 0.176 304.987);\n --color-purple-950: oklch(29.1% 0.149 302.717);\n\n --color-fuchsia-50: oklch(97.7% 0.017 320.058);\n --color-fuchsia-100: oklch(95.2% 0.037 318.852);\n --color-fuchsia-200: oklch(90.3% 0.076 319.62);\n --color-fuchsia-300: oklch(83.3% 0.145 321.434);\n --color-fuchsia-400: oklch(74% 0.238 322.16);\n --color-fuchsia-500: oklch(66.7% 0.295 322.15);\n --color-fuchsia-600: oklch(59.1% 0.293 322.896);\n --color-fuchsia-700: oklch(51.8% 0.253 323.949);\n --color-fuchsia-800: oklch(45.2% 0.211 324.591);\n --color-fuchsia-900: oklch(40.1% 0.17 325.612);\n --color-fuchsia-950: oklch(29.3% 0.136 325.661);\n\n --color-pink-50: oklch(97.1% 0.014 343.198);\n --color-pink-100: oklch(94.8% 0.028 342.258);\n --color-pink-200: oklch(89.9% 0.061 343.231);\n --color-pink-300: oklch(82.3% 0.12 346.018);\n --color-pink-400: oklch(71.8% 0.202 349.761);\n --color-pink-500: oklch(65.6% 0.241 354.308);\n --color-pink-600: oklch(59.2% 0.249 0.584);\n --color-pink-700: oklch(52.5% 0.223 3.958);\n --color-pink-800: oklch(45.9% 0.187 3.815);\n --color-pink-900: oklch(40.8% 0.153 2.432);\n --color-pink-950: oklch(28.4% 0.109 3.907);\n\n --color-rose-50: oklch(96.9% 0.015 12.422);\n --color-rose-100: oklch(94.1% 0.03 12.58);\n --color-rose-200: oklch(89.2% 0.058 10.001);\n --color-rose-300: oklch(81% 0.117 11.638);\n --color-rose-400: oklch(71.2% 0.194 13.428);\n --color-rose-500: oklch(64.5% 0.246 16.439);\n --color-rose-600: oklch(58.6% 0.253 17.585);\n --color-rose-700: oklch(51.4% 0.222 16.935);\n --color-rose-800: oklch(45.5% 0.188 13.697);\n --color-rose-900: oklch(41% 0.159 10.272);\n --color-rose-950: oklch(27.1% 0.105 12.094);\n\n --color-slate-50: oklch(98.4% 0.003 247.858);\n --color-slate-100: oklch(96.8% 0.007 247.896);\n --color-slate-200: oklch(92.9% 0.013 255.508);\n --color-slate-300: oklch(86.9% 0.022 252.894);\n --color-slate-400: oklch(70.4% 0.04 256.788);\n --color-slate-500: oklch(55.4% 0.046 257.417);\n --color-slate-600: oklch(44.6% 0.043 257.281);\n --color-slate-700: oklch(37.2% 0.044 257.287);\n --color-slate-800: oklch(27.9% 0.041 260.031);\n --color-slate-900: oklch(20.8% 0.042 265.755);\n --color-slate-950: oklch(12.9% 0.042 264.695);\n\n --color-gray-50: oklch(98.5% 0.002 247.839);\n --color-gray-100: oklch(96.7% 0.003 264.542);\n --color-gray-200: oklch(92.8% 0.006 264.531);\n --color-gray-300: oklch(87.2% 0.01 258.338);\n --color-gray-400: oklch(70.7% 0.022 261.325);\n --color-gray-500: oklch(55.1% 0.027 264.364);\n --color-gray-600: oklch(44.6% 0.03 256.802);\n --color-gray-700: oklch(37.3% 0.034 259.733);\n --color-gray-800: oklch(27.8% 0.033 256.848);\n --color-gray-900: oklch(21% 0.034 264.665);\n --color-gray-950: oklch(13% 0.028 261.692);\n\n --color-zinc-50: oklch(98.5% 0 none);\n --color-zinc-100: oklch(96.7% 0.001 286.375);\n --color-zinc-200: oklch(92% 0.004 286.32);\n --color-zinc-300: oklch(87.1% 0.006 286.286);\n --color-zinc-400: oklch(70.5% 0.015 286.067);\n --color-zinc-500: oklch(55.2% 0.016 285.938);\n --color-zinc-600: oklch(44.2% 0.017 285.786);\n --color-zinc-700: oklch(37% 0.013 285.805);\n --color-zinc-800: oklch(27.4% 0.006 286.033);\n --color-zinc-900: oklch(21% 0.006 285.885);\n --color-zinc-950: oklch(14.1% 0.005 285.823);\n\n --color-neutral-50: oklch(98.5% 0 none);\n --color-neutral-100: oklch(97% 0 none);\n --color-neutral-200: oklch(92.2% 0 none);\n --color-neutral-300: oklch(87% 0 none);\n --color-neutral-400: oklch(70.8% 0 none);\n --color-neutral-500: oklch(55.6% 0 none);\n --color-neutral-600: oklch(43.9% 0 none);\n --color-neutral-700: oklch(37.1% 0 none);\n --color-neutral-800: oklch(26.9% 0 none);\n --color-neutral-900: oklch(20.5% 0 none);\n --color-neutral-950: oklch(14.5% 0 none);\n\n --color-stone-50: oklch(98.5% 0.001 106.423);\n --color-stone-100: oklch(97% 0.001 106.424);\n --color-stone-200: oklch(92.3% 0.003 48.717);\n --color-stone-300: oklch(86.9% 0.005 56.366);\n --color-stone-400: oklch(70.9% 0.01 56.259);\n --color-stone-500: oklch(55.3% 0.013 58.071);\n --color-stone-600: oklch(44.4% 0.011 73.639);\n --color-stone-700: oklch(37.4% 0.01 67.558);\n --color-stone-800: oklch(26.8% 0.007 34.298);\n --color-stone-900: oklch(21.6% 0.006 56.043);\n --color-stone-950: oklch(14.7% 0.004 49.25);\n\n --color-mauve-50: oklch(98.5% 0 none);\n --color-mauve-100: oklch(96% 0.003 325.6);\n --color-mauve-200: oklch(92.2% 0.005 325.62);\n --color-mauve-300: oklch(86.5% 0.012 325.68);\n --color-mauve-400: oklch(71.1% 0.019 323.02);\n --color-mauve-500: oklch(54.2% 0.034 322.5);\n --color-mauve-600: oklch(43.5% 0.029 321.78);\n --color-mauve-700: oklch(36.4% 0.029 323.89);\n --color-mauve-800: oklch(26.3% 0.024 320.12);\n --color-mauve-900: oklch(21.2% 0.019 322.12);\n --color-mauve-950: oklch(14.5% 0.008 326);\n\n --color-olive-50: oklch(98.8% 0.003 106.5);\n --color-olive-100: oklch(96.6% 0.005 106.5);\n --color-olive-200: oklch(93% 0.007 106.5);\n --color-olive-300: oklch(88% 0.011 106.6);\n --color-olive-400: oklch(73.7% 0.021 106.9);\n --color-olive-500: oklch(58% 0.031 107.3);\n --color-olive-600: oklch(46.6% 0.025 107.3);\n --color-olive-700: oklch(39.4% 0.023 107.4);\n --color-olive-800: oklch(28.6% 0.016 107.4);\n --color-olive-900: oklch(22.8% 0.013 107.4);\n --color-olive-950: oklch(15.3% 0.006 107.1);\n\n --color-mist-50: oklch(98.7% 0.002 197.1);\n --color-mist-100: oklch(96.3% 0.002 197.1);\n --color-mist-200: oklch(92.5% 0.005 214.3);\n --color-mist-300: oklch(87.2% 0.007 219.6);\n --color-mist-400: oklch(72.3% 0.014 214.4);\n --color-mist-500: oklch(56% 0.021 213.5);\n --color-mist-600: oklch(45% 0.017 213.2);\n --color-mist-700: oklch(37.8% 0.015 216);\n --color-mist-800: oklch(27.5% 0.011 216.9);\n --color-mist-900: oklch(21.8% 0.008 223.9);\n --color-mist-950: oklch(14.8% 0.004 228.8);\n\n --color-taupe-50: oklch(98.6% 0.002 67.8);\n --color-taupe-100: oklch(96% 0.002 17.2);\n --color-taupe-200: oklch(92.2% 0.005 34.3);\n --color-taupe-300: oklch(86.8% 0.007 39.5);\n --color-taupe-400: oklch(71.4% 0.014 41.2);\n --color-taupe-500: oklch(54.7% 0.021 43.1);\n --color-taupe-600: oklch(43.8% 0.017 39.3);\n --color-taupe-700: oklch(36.7% 0.016 35.7);\n --color-taupe-800: oklch(26.8% 0.011 36.5);\n --color-taupe-900: oklch(21.4% 0.009 43.1);\n --color-taupe-950: oklch(14.7% 0.004 49.3);\n\n --color-black: #000;\n --color-white: #fff;\n\n --spacing: 0.25rem;\n\n --breakpoint-sm: 40rem;\n --breakpoint-md: 48rem;\n --breakpoint-lg: 64rem;\n --breakpoint-xl: 80rem;\n --breakpoint-2xl: 96rem;\n\n --container-3xs: 16rem;\n --container-2xs: 18rem;\n --container-xs: 20rem;\n --container-sm: 24rem;\n --container-md: 28rem;\n --container-lg: 32rem;\n --container-xl: 36rem;\n --container-2xl: 42rem;\n --container-3xl: 48rem;\n --container-4xl: 56rem;\n --container-5xl: 64rem;\n --container-6xl: 72rem;\n --container-7xl: 80rem;\n\n --text-xs: 0.75rem;\n --text-xs--line-height: calc(1 / 0.75);\n --text-sm: 0.875rem;\n --text-sm--line-height: calc(1.25 / 0.875);\n --text-base: 1rem;\n --text-base--line-height: calc(1.5 / 1);\n --text-lg: 1.125rem;\n --text-lg--line-height: calc(1.75 / 1.125);\n --text-xl: 1.25rem;\n --text-xl--line-height: calc(1.75 / 1.25);\n --text-2xl: 1.5rem;\n --text-2xl--line-height: calc(2 / 1.5);\n --text-3xl: 1.875rem;\n --text-3xl--line-height: calc(2.25 / 1.875);\n --text-4xl: 2.25rem;\n --text-4xl--line-height: calc(2.5 / 2.25);\n --text-5xl: 3rem;\n --text-5xl--line-height: 1;\n --text-6xl: 3.75rem;\n --text-6xl--line-height: 1;\n --text-7xl: 4.5rem;\n --text-7xl--line-height: 1;\n --text-8xl: 6rem;\n --text-8xl--line-height: 1;\n --text-9xl: 8rem;\n --text-9xl--line-height: 1;\n\n --font-weight-thin: 100;\n --font-weight-extralight: 200;\n --font-weight-light: 300;\n --font-weight-normal: 400;\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --font-weight-bold: 700;\n --font-weight-extrabold: 800;\n --font-weight-black: 900;\n\n --tracking-tighter: -0.05em;\n --tracking-tight: -0.025em;\n --tracking-normal: 0em;\n --tracking-wide: 0.025em;\n --tracking-wider: 0.05em;\n --tracking-widest: 0.1em;\n\n --leading-tight: 1.25;\n --leading-snug: 1.375;\n --leading-normal: 1.5;\n --leading-relaxed: 1.625;\n --leading-loose: 2;\n\n --radius-xs: 0.125rem;\n --radius-sm: 0.25rem;\n --radius-md: 0.375rem;\n --radius-lg: 0.5rem;\n --radius-xl: 0.75rem;\n --radius-2xl: 1rem;\n --radius-3xl: 1.5rem;\n --radius-4xl: 2rem;\n\n --shadow-2xs: 0 1px rgb(0 0 0 / 0.05);\n --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --shadow-md:\n 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --shadow-lg:\n 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --shadow-xl:\n 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);\n\n --inset-shadow-2xs: inset 0 1px rgb(0 0 0 / 0.05);\n --inset-shadow-xs: inset 0 1px 1px rgb(0 0 0 / 0.05);\n --inset-shadow-sm: inset 0 2px 4px rgb(0 0 0 / 0.05);\n\n --drop-shadow-xs: 0 1px 1px rgb(0 0 0 / 0.05);\n --drop-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.15);\n --drop-shadow-md: 0 3px 3px rgb(0 0 0 / 0.12);\n --drop-shadow-lg: 0 4px 4px rgb(0 0 0 / 0.15);\n --drop-shadow-xl: 0 9px 7px rgb(0 0 0 / 0.1);\n --drop-shadow-2xl: 0 25px 25px rgb(0 0 0 / 0.15);\n\n --text-shadow-2xs: 0px 1px 0px rgb(0 0 0 / 0.15);\n --text-shadow-xs: 0px 1px 1px rgb(0 0 0 / 0.2);\n --text-shadow-sm:\n 0px 1px 0px rgb(0 0 0 / 0.075), 0px 1px 1px rgb(0 0 0 / 0.075),\n 0px 2px 2px rgb(0 0 0 / 0.075);\n --text-shadow-md:\n 0px 1px 1px rgb(0 0 0 / 0.1), 0px 1px 2px rgb(0 0 0 / 0.1),\n 0px 2px 4px rgb(0 0 0 / 0.1);\n --text-shadow-lg:\n 0px 1px 2px rgb(0 0 0 / 0.1), 0px 3px 2px rgb(0 0 0 / 0.1),\n 0px 4px 8px rgb(0 0 0 / 0.1);\n\n --ease-in: cubic-bezier(0.4, 0, 1, 1);\n --ease-out: cubic-bezier(0, 0, 0.2, 1);\n --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);\n\n --animate-spin: spin 1s linear infinite;\n --animate-ping: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;\n --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n --animate-bounce: bounce 1s infinite;\n\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n @keyframes ping {\n 75%,\n 100% {\n transform: scale(2);\n opacity: 0;\n }\n }\n\n @keyframes pulse {\n 50% {\n opacity: 0.5;\n }\n }\n\n @keyframes bounce {\n 0%,\n 100% {\n transform: translateY(-25%);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n\n 50% {\n transform: none;\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n }\n\n --blur-xs: 4px;\n --blur-sm: 8px;\n --blur-md: 12px;\n --blur-lg: 16px;\n --blur-xl: 24px;\n --blur-2xl: 40px;\n --blur-3xl: 64px;\n\n --perspective-dramatic: 100px;\n --perspective-near: 300px;\n --perspective-normal: 500px;\n --perspective-midrange: 800px;\n --perspective-distant: 1200px;\n\n --aspect-video: 16 / 9;\n\n --default-transition-duration: 150ms;\n --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n --default-font-family: --theme(--font-sans, initial);\n --default-font-feature-settings: --theme(\n --font-sans--font-feature-settings,\n initial\n );\n --default-font-variation-settings: --theme(\n --font-sans--font-variation-settings,\n initial\n );\n --default-mono-font-family: --theme(--font-mono, initial);\n --default-mono-font-feature-settings: --theme(\n --font-mono--font-feature-settings,\n initial\n );\n --default-mono-font-variation-settings: --theme(\n --font-mono--font-variation-settings,\n initial\n );\n }\n\n /* Deprecated */\n @theme default inline reference {\n --blur: 8px;\n --shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --shadow-inner: inset 0 2px 4px 0 rgb(0 0 0 / 0.05);\n --drop-shadow: 0 1px 2px rgb(0 0 0 / 0.1), 0 1px 1px rgb(0 0 0 / 0.06);\n --radius: 0.25rem;\n --max-width-prose: 65ch;\n }\n}\n\n@layer base {\n /*\n 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n 2. Remove default margins and padding\n 3. Reset all borders.\n*/\n\n *,\n ::after,\n ::before,\n ::backdrop,\n ::file-selector-button {\n box-sizing: border-box; /* 1 */\n margin: 0; /* 2 */\n padding: 0; /* 2 */\n border: 0 solid; /* 3 */\n }\n\n /*\n 1. Use a consistent sensible line-height in all browsers.\n 2. Prevent adjustments of font size after orientation changes in iOS.\n 3. Use a more readable tab size.\n 4. Use the user\'s configured `sans` font-family by default.\n 5. Use the user\'s configured `sans` font-feature-settings by default.\n 6. Use the user\'s configured `sans` font-variation-settings by default.\n 7. Disable tap highlights on iOS.\n*/\n\n html,\n :host {\n line-height: 1.5; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n tab-size: 4; /* 3 */\n font-family: --theme(\n --default-font-family,\n -apple-system,\n BlinkMacSystemFont,\n "Segoe UI",\n Roboto,\n "Helvetica Neue",\n "Noto Sans",\n Arial,\n sans-serif,\n "Apple Color Emoji",\n "Segoe UI Emoji",\n "Segoe UI Symbol",\n "Noto Color Emoji"\n ); /* 4 */\n font-feature-settings: --theme(\n --default-font-feature-settings,\n normal\n ); /* 5 */\n font-variation-settings: --theme(\n --default-font-variation-settings,\n normal\n ); /* 6 */\n -webkit-tap-highlight-color: transparent; /* 7 */\n }\n\n /*\n 1. Add the correct height in Firefox.\n 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n 3. Reset the default border style to a 1px solid border.\n*/\n\n hr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n border-top-width: 1px; /* 3 */\n }\n\n /*\n Add the correct text decoration in Chrome, Edge, and Safari.\n*/\n\n abbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n }\n\n /*\n Remove the default font size and weight for headings.\n*/\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-size: inherit;\n font-weight: inherit;\n }\n\n /*\n Reset links to optimize for opt-in styling instead of opt-out.\n*/\n\n a {\n color: inherit;\n -webkit-text-decoration: inherit;\n text-decoration: inherit;\n }\n\n /*\n Add the correct font weight in Edge and Safari.\n*/\n\n b,\n strong {\n font-weight: bolder;\n }\n\n /*\n 1. Use the user\'s configured `mono` font-family by default.\n 2. Use the user\'s configured `mono` font-feature-settings by default.\n 3. Use the user\'s configured `mono` font-variation-settings by default.\n 4. Correct the odd `em` font sizing in all browsers.\n*/\n\n code,\n kbd,\n samp,\n pre {\n font-family: --theme(\n --default-mono-font-family,\n ui-monospace,\n SFMono-Regular,\n Menlo,\n Monaco,\n Consolas,\n "Liberation Mono",\n "Courier New",\n monospace\n ); /* 1 */\n font-feature-settings: --theme(\n --default-mono-font-feature-settings,\n normal\n ); /* 2 */\n font-variation-settings: --theme(\n --default-mono-font-variation-settings,\n normal\n ); /* 3 */\n font-size: 1em; /* 4 */\n }\n\n /*\n Add the correct font size in all browsers.\n*/\n\n small {\n font-size: 80%;\n }\n\n /*\n Prevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\n\n sub,\n sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n }\n\n sub {\n bottom: -0.25em;\n }\n\n sup {\n top: -0.5em;\n }\n\n /*\n 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n 3. Remove gaps between table borders by default.\n*/\n\n table {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n border-collapse: collapse; /* 3 */\n }\n\n /*\n Use the modern Firefox focus style for all focusable elements.\n*/\n\n :-moz-focusring:where(:not(iframe)) {\n outline: auto;\n }\n\n /*\n Add the correct vertical alignment in Chrome and Firefox.\n*/\n\n progress {\n vertical-align: baseline;\n }\n\n /*\n Add the correct display in Chrome and Safari.\n*/\n\n summary {\n display: list-item;\n }\n\n /*\n Make lists unstyled by default.\n*/\n\n ol,\n ul,\n menu {\n list-style: none;\n }\n\n /*\n 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\n img,\n svg,\n video,\n canvas,\n audio,\n iframe,\n embed,\n object {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n }\n\n /*\n Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\n img,\n video {\n max-width: 100%;\n height: auto;\n }\n\n /*\n 1. Inherit font styles in all browsers.\n 2. Remove border radius in all browsers.\n 3. Remove background color in all browsers.\n 4. Ensure consistent opacity for disabled states in all browsers.\n*/\n\n button,\n input,\n select,\n optgroup,\n textarea,\n ::file-selector-button {\n font: inherit; /* 1 */\n font-feature-settings: inherit; /* 1 */\n font-variation-settings: inherit; /* 1 */\n letter-spacing: inherit; /* 1 */\n color: inherit; /* 1 */\n border-radius: 0; /* 2 */\n background-color: transparent; /* 3 */\n opacity: 1; /* 4 */\n }\n\n /*\n Restore default font weight.\n*/\n\n :where(select:is([multiple], [size])) optgroup {\n font-weight: bolder;\n }\n\n /*\n Restore indentation.\n*/\n\n :where(select:is([multiple], [size])) optgroup option {\n padding-inline-start: 20px;\n }\n\n /*\n Restore space after button.\n*/\n\n ::file-selector-button {\n margin-inline-end: 4px;\n }\n\n /*\n Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n*/\n\n ::placeholder {\n opacity: 1;\n }\n\n /*\n Set the default placeholder color to a semi-transparent version of the current text color in browsers that do not\n crash when using `color-mix(\u2026)` with `currentcolor`. (https://github.com/tailwindlabs/tailwindcss/issues/17194)\n*/\n\n @supports (not (-webkit-appearance: -apple-pay-button)) /* Not Safari */ or\n (contain-intrinsic-size: 1px) /* Safari 17+ */ {\n ::placeholder {\n color: color-mix(in oklab, currentcolor 50%, transparent);\n }\n }\n\n /*\n Prevent resizing textareas horizontally by default.\n*/\n\n textarea {\n resize: vertical;\n }\n\n /*\n Remove the inner padding in Chrome and Safari on macOS.\n*/\n\n ::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n\n /*\n 1. Ensure date/time inputs have the same height when empty in iOS Safari.\n 2. Ensure text alignment can be changed on date/time inputs in iOS Safari.\n*/\n\n ::-webkit-date-and-time-value {\n min-height: 1lh; /* 1 */\n text-align: inherit; /* 2 */\n }\n\n /*\n Prevent height from changing on date/time inputs in macOS Safari when the input is set to `display: block`.\n*/\n\n ::-webkit-datetime-edit {\n display: inline-flex;\n }\n\n /*\n Remove excess padding from pseudo-elements in date/time inputs to ensure consistent height across browsers.\n*/\n\n ::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n }\n\n ::-webkit-datetime-edit,\n ::-webkit-datetime-edit-year-field,\n ::-webkit-datetime-edit-month-field,\n ::-webkit-datetime-edit-day-field,\n ::-webkit-datetime-edit-hour-field,\n ::-webkit-datetime-edit-minute-field,\n ::-webkit-datetime-edit-second-field,\n ::-webkit-datetime-edit-millisecond-field,\n ::-webkit-datetime-edit-meridiem-field {\n padding-block: 0;\n }\n\n /*\n Center dropdown marker shown on inputs with paired `<datalist>`s in Chrome. (https://github.com/tailwindlabs/tailwindcss/issues/18499)\n*/\n\n ::-webkit-calendar-picker-indicator {\n line-height: 1;\n }\n\n /*\n Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n :-moz-ui-invalid {\n box-shadow: none;\n }\n\n /*\n Correct the inability to style the border radius in iOS Safari.\n*/\n\n button,\n input:where([type="button"], [type="reset"], [type="submit"]),\n ::file-selector-button {\n appearance: button;\n }\n\n /*\n Correct the cursor style of increment and decrement buttons in Safari.\n*/\n\n ::-webkit-inner-spin-button,\n ::-webkit-outer-spin-button {\n height: auto;\n }\n\n /*\n Make elements with the HTML hidden attribute stay hidden by default.\n*/\n\n [hidden]:where(:not([hidden="until-found"])) {\n display: none !important;\n }\n}\n\n@layer utilities {\n @tailwind utilities;\n}\n';
59018
59018
  }
59019
59019
  });
59020
59020
 
59021
- // ../../../../../../git/ai4kanban/runner/node_modules/react-icons/lib/iconsManifest.mjs
59021
+ // node_modules/react-icons/lib/iconsManifest.mjs
59022
59022
  var init_iconsManifest = __esm({
59023
- "../../../../../../git/ai4kanban/runner/node_modules/react-icons/lib/iconsManifest.mjs"() {
59023
+ "node_modules/react-icons/lib/iconsManifest.mjs"() {
59024
59024
  }
59025
59025
  });
59026
59026
 
59027
- // ../../../../../../git/ai4kanban/runner/node_modules/react-icons/lib/iconContext.mjs
59027
+ // node_modules/react-icons/lib/iconContext.mjs
59028
59028
  var import_react, DefaultContext, IconContext;
59029
59029
  var init_iconContext = __esm({
59030
- "../../../../../../git/ai4kanban/runner/node_modules/react-icons/lib/iconContext.mjs"() {
59030
+ "node_modules/react-icons/lib/iconContext.mjs"() {
59031
59031
  import_react = __toESM(require_react(), 1);
59032
59032
  DefaultContext = {
59033
59033
  color: void 0,
@@ -59040,7 +59040,7 @@ var init_iconContext = __esm({
59040
59040
  }
59041
59041
  });
59042
59042
 
59043
- // ../../../../../../git/ai4kanban/runner/node_modules/react-icons/lib/iconBase.mjs
59043
+ // node_modules/react-icons/lib/iconBase.mjs
59044
59044
  function _objectWithoutProperties(e2, t2) {
59045
59045
  if (null == e2) return {};
59046
59046
  var o2, r2, i = _objectWithoutPropertiesLoose(e2, t2);
@@ -59141,23 +59141,23 @@ function IconBase(props) {
59141
59141
  }
59142
59142
  var import_react2, _excluded;
59143
59143
  var init_iconBase = __esm({
59144
- "../../../../../../git/ai4kanban/runner/node_modules/react-icons/lib/iconBase.mjs"() {
59144
+ "node_modules/react-icons/lib/iconBase.mjs"() {
59145
59145
  import_react2 = __toESM(require_react(), 1);
59146
59146
  init_iconContext();
59147
59147
  _excluded = ["attr", "size", "title"];
59148
59148
  }
59149
59149
  });
59150
59150
 
59151
- // ../../../../../../git/ai4kanban/runner/node_modules/react-icons/lib/index.mjs
59151
+ // node_modules/react-icons/lib/index.mjs
59152
59152
  var init_lib2 = __esm({
59153
- "../../../../../../git/ai4kanban/runner/node_modules/react-icons/lib/index.mjs"() {
59153
+ "node_modules/react-icons/lib/index.mjs"() {
59154
59154
  init_iconsManifest();
59155
59155
  init_iconBase();
59156
59156
  init_iconContext();
59157
59157
  }
59158
59158
  });
59159
59159
 
59160
- // ../../../../../../git/ai4kanban/runner/node_modules/react-icons/fi/index.mjs
59160
+ // node_modules/react-icons/fi/index.mjs
59161
59161
  var fi_exports = {};
59162
59162
  __export(fi_exports, {
59163
59163
  FiActivity: () => FiActivity,
@@ -60310,12 +60310,12 @@ function FiActivity(props) {
60310
60310
  return GenIcon({ "tag": "svg", "attr": { "viewBox": "0 0 24 24", "fill": "none", "stroke": "currentColor", "strokeWidth": "2", "strokeLinecap": "round", "strokeLinejoin": "round" }, "child": [{ "tag": "polyline", "attr": { "points": "22 12 18 12 15 21 9 3 6 12 2 12" }, "child": [] }] })(props);
60311
60311
  }
60312
60312
  var init_fi = __esm({
60313
- "../../../../../../git/ai4kanban/runner/node_modules/react-icons/fi/index.mjs"() {
60313
+ "node_modules/react-icons/fi/index.mjs"() {
60314
60314
  init_lib2();
60315
60315
  }
60316
60316
  });
60317
60317
 
60318
- // ../../../../../../git/ai4kanban/runner/node_modules/react-icons/fa/index.mjs
60318
+ // node_modules/react-icons/fa/index.mjs
60319
60319
  var fa_exports = {};
60320
60320
  __export(fa_exports, {
60321
60321
  Fa500Px: () => Fa500Px,
@@ -66764,12 +66764,12 @@ function FaRegAddressBook(props) {
66764
66764
  return GenIcon({ "tag": "svg", "attr": { "viewBox": "0 0 448 512" }, "child": [{ "tag": "path", "attr": { "d": "M436 160c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20V48c0-26.5-21.5-48-48-48H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h320c26.5 0 48-21.5 48-48v-48h20c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20v-64h20c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20v-64h20zm-68 304H48V48h320v416zM208 256c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm-89.6 128h179.2c12.4 0 22.4-8.6 22.4-19.2v-19.2c0-31.8-30.1-57.6-67.2-57.6-10.8 0-18.7 8-44.8 8-26.9 0-33.4-8-44.8-8-37.1 0-67.2 25.8-67.2 57.6v19.2c0 10.6 10 19.2 22.4 19.2z" }, "child": [] }] })(props);
66765
66765
  }
66766
66766
  var init_fa = __esm({
66767
- "../../../../../../git/ai4kanban/runner/node_modules/react-icons/fa/index.mjs"() {
66767
+ "node_modules/react-icons/fa/index.mjs"() {
66768
66768
  init_lib2();
66769
66769
  }
66770
66770
  });
66771
66771
 
66772
- // ../../../../../../git/ai4kanban/runner/node_modules/react-icons/si/index.mjs
66772
+ // node_modules/react-icons/si/index.mjs
66773
66773
  var si_exports = {};
66774
66774
  __export(si_exports, {
66775
66775
  Si1001Tracklists: () => Si1001Tracklists,
@@ -80558,12 +80558,12 @@ function Si1001Tracklists(props) {
80558
80558
  return GenIcon({ "tag": "svg", "attr": { "role": "img", "viewBox": "0 0 24 24" }, "child": [{ "tag": "path", "attr": { "d": "M8.0957 1.334v1.3457H6.7461v1.3457H5.3984V5.371H4.0488v1.3457H2.6992v6.6816H1.3496v1.3477H0v2.4512h1.3496v1.3457h1.3496v1.3457h2.457v-7.836H3.8067V7.8223h1.3497V6.4766h1.3496V5.1309h1.3496V3.7852h8.289v1.3457h1.3496v1.3457h1.3496v1.3457h1.3497v4.2304h-1.3497v7.836h2.457V18.543h1.3497v-1.3457H24V14.746h-1.3496v-1.3477h-1.3496V6.7168h-1.3496V5.3711h-1.3496V4.0254h-1.3477V2.6797h-1.3496V1.334Zm1.3711 8v1.3515H8.1113v3.8165h2.4688v-4.0567h2.9512v4.3477h-1.3555v1.3515h-1.3535v2.4649h2.4668v-2.7051H16v-5.2188h-1.3555V9.334Zm1.3555 10.8691v2.463h2.4668v-2.463z" }, "child": [] }] })(props);
80559
80559
  }
80560
80560
  var init_si = __esm({
80561
- "../../../../../../git/ai4kanban/runner/node_modules/react-icons/si/index.mjs"() {
80561
+ "node_modules/react-icons/si/index.mjs"() {
80562
80562
  init_lib2();
80563
80563
  }
80564
80564
  });
80565
80565
 
80566
- // ../../../../../../git/ai4kanban/runner/node_modules/clsx/dist/clsx.mjs
80566
+ // node_modules/clsx/dist/clsx.mjs
80567
80567
  var clsx_exports = {};
80568
80568
  __export(clsx_exports, {
80569
80569
  clsx: () => clsx,
@@ -80584,12 +80584,12 @@ function clsx() {
80584
80584
  }
80585
80585
  var clsx_default;
80586
80586
  var init_clsx = __esm({
80587
- "../../../../../../git/ai4kanban/runner/node_modules/clsx/dist/clsx.mjs"() {
80587
+ "node_modules/clsx/dist/clsx.mjs"() {
80588
80588
  clsx_default = clsx;
80589
80589
  }
80590
80590
  });
80591
80591
 
80592
- // ../../../../../../git/ai4kanban/runner/node_modules/tailwind-merge/dist/bundle-mjs.mjs
80592
+ // node_modules/tailwind-merge/dist/bundle-mjs.mjs
80593
80593
  var bundle_mjs_exports = {};
80594
80594
  __export(bundle_mjs_exports, {
80595
80595
  createTailwindMerge: () => createTailwindMerge,
@@ -80603,7 +80603,7 @@ __export(bundle_mjs_exports, {
80603
80603
  });
80604
80604
  var concatArrays, createClassValidatorObject, createClassPartObject, CLASS_PART_SEPARATOR, EMPTY_CONFLICTS, ARBITRARY_PROPERTY_PREFIX, createClassGroupUtils, getGroupRecursive, getGroupIdForArbitraryProperty, createClassMap, processClassGroups, processClassesRecursively, processClassDefinition, processStringDefinition, processFunctionDefinition, processObjectDefinition, getPart, isThemeGetter, createLruCache, IMPORTANT_MODIFIER, MODIFIER_SEPARATOR, EMPTY_MODIFIERS, createResultObject, createParseClassName, createSortModifiers, createConfigUtils, createPostfixLookupClassGroupIds, SPLIT_CLASSES_REGEX, mergeClassList, twJoin, toValue, createTailwindMerge, fallbackThemeArr, fromTheme, arbitraryValueRegex, arbitraryVariableRegex, fractionRegex, tshirtUnitRegex, lengthUnitRegex, colorFunctionRegex, shadowRegex, imageRegex, isFraction, isNumber, isInteger, isPercent, isTshirtSize, isAny, isLengthOnly, isNever, isShadow, isImage, isAnyNonArbitrary, isNamedContainerQuery, isArbitrarySize, isArbitraryValue, isArbitraryLength, isArbitraryNumber, isArbitraryWeight, isArbitraryFamilyName, isArbitraryPosition, isArbitraryImage, isArbitraryShadow, isArbitraryVariable, isArbitraryVariableLength, isArbitraryVariableFamilyName, isArbitraryVariablePosition, isArbitraryVariableSize, isArbitraryVariableImage, isArbitraryVariableShadow, isArbitraryVariableWeight, getIsArbitraryValue, getIsArbitraryVariable, isLabelPosition, isLabelImage, isLabelSize, isLabelLength, isLabelNumber, isLabelFamilyName, isLabelWeight, isLabelShadow, validators, getDefaultConfig, mergeConfigs, overrideProperty, overrideConfigProperties, mergeConfigProperties, mergeArrayProperties, extendTailwindMerge, twMerge;
80605
80605
  var init_bundle_mjs = __esm({
80606
- "../../../../../../git/ai4kanban/runner/node_modules/tailwind-merge/dist/bundle-mjs.mjs"() {
80606
+ "node_modules/tailwind-merge/dist/bundle-mjs.mjs"() {
80607
80607
  concatArrays = (array1, array2) => {
80608
80608
  const combinedArray = new Array(array1.length + array2.length);
80609
80609
  for (let i = 0; i < array1.length; i++) {
@@ -80745,9 +80745,9 @@ var init_bundle_mjs = __esm({
80745
80745
  processClassesRecursively(value, getPart(classPartObject, key), classGroupId, theme);
80746
80746
  }
80747
80747
  };
80748
- getPart = (classPartObject, path33) => {
80748
+ getPart = (classPartObject, path37) => {
80749
80749
  let current = classPartObject;
80750
- const parts = path33.split(CLASS_PART_SEPARATOR);
80750
+ const parts = path37.split(CLASS_PART_SEPARATOR);
80751
80751
  const len = parts.length;
80752
80752
  for (let i = 0; i < len; i++) {
80753
80753
  const part = parts[i];
@@ -83943,7 +83943,7 @@ var init_bundle_mjs = __esm({
83943
83943
  }
83944
83944
  });
83945
83945
 
83946
- // ../../../../../../git/ai4kanban/runner/node_modules/class-variance-authority/dist/index.mjs
83946
+ // node_modules/class-variance-authority/dist/index.mjs
83947
83947
  var dist_exports = {};
83948
83948
  __export(dist_exports, {
83949
83949
  cva: () => cva,
@@ -83951,7 +83951,7 @@ __export(dist_exports, {
83951
83951
  });
83952
83952
  var falsyToString, cx, cva;
83953
83953
  var init_dist = __esm({
83954
- "../../../../../../git/ai4kanban/runner/node_modules/class-variance-authority/dist/index.mjs"() {
83954
+ "node_modules/class-variance-authority/dist/index.mjs"() {
83955
83955
  init_clsx();
83956
83956
  falsyToString = (value) => typeof value === "boolean" ? `${value}` : value === 0 ? "0" : value;
83957
83957
  cx = clsx;
@@ -84435,11 +84435,12 @@ function status(line) {
84435
84435
  }
84436
84436
 
84437
84437
  // src/protocol.ts
84438
- var VERSION = true ? "0.6.6" : "0.0.0";
84439
- var AKB_VERSION = true ? "0.11.5" : "0.0.0";
84440
- var AKB_CONTRACT = true ? 2 : 0;
84438
+ var VERSION = true ? "0.6.9" : "0.0.0";
84439
+ var AKB_VERSION = true ? "0.11.8" : "0.0.0";
84440
+ var AKB_CONTRACT = true ? 4 : 0;
84441
84441
  var EXIT_REFUSED = 10;
84442
84442
  var EXIT_OUTDATED = 11;
84443
+ var EXIT_UPDATE = 12;
84443
84444
 
84444
84445
  // src/runtimes.ts
84445
84446
  import { spawn as spawn2 } from "node:child_process";
@@ -85291,10 +85292,10 @@ function findRollout(threadId) {
85291
85292
  }
85292
85293
  for (const name of names2) {
85293
85294
  if (!name.startsWith("rollout-") || !name.endsWith(tail)) continue;
85294
- const path33 = join(dir, name);
85295
+ const path37 = join(dir, name);
85295
85296
  try {
85296
- const at2 = statSync(path33).mtimeMs;
85297
- if (!newest2 || at2 > newest2.at) newest2 = { path: path33, at: at2 };
85297
+ const at2 = statSync(path37).mtimeMs;
85298
+ if (!newest2 || at2 > newest2.at) newest2 = { path: path37, at: at2 };
85298
85299
  } catch {
85299
85300
  }
85300
85301
  }
@@ -85302,11 +85303,11 @@ function findRollout(threadId) {
85302
85303
  return newest2?.path;
85303
85304
  }
85304
85305
  function readCodexRunFacts(threadId) {
85305
- const path33 = findRollout(threadId);
85306
- if (!path33) return void 0;
85306
+ const path37 = findRollout(threadId);
85307
+ if (!path37) return void 0;
85307
85308
  let raw;
85308
85309
  try {
85309
- raw = readFileSync(path33, "utf8");
85310
+ raw = readFileSync(path37, "utf8");
85310
85311
  } catch {
85311
85312
  return void 0;
85312
85313
  }
@@ -85414,8 +85415,8 @@ function renderCompleted(item) {
85414
85415
  const changes = Array.isArray(item.changes) ? item.changes : [];
85415
85416
  return changes.map((raw) => {
85416
85417
  const change = obj(raw);
85417
- const path33 = str(change.path);
85418
- return path33 ? `\u23FA ${str(change.kind) || "change"}(${path33})
85418
+ const path37 = str(change.path);
85419
+ return path37 ? `\u23FA ${str(change.kind) || "change"}(${path37})
85419
85420
  ` : "";
85420
85421
  }).join("");
85421
85422
  }
@@ -85663,10 +85664,10 @@ function readKimiRunFacts(sessionId) {
85663
85664
  const total = { input: 0, cacheCreation: 0, cacheRead: 0, output: 0 };
85664
85665
  let model;
85665
85666
  let holding = 0;
85666
- for (const { path: path33, main: main2 } of wireFiles(entry.sessionDir)) {
85667
+ for (const { path: path37, main: main2 } of wireFiles(entry.sessionDir)) {
85667
85668
  let raw;
85668
85669
  try {
85669
- raw = readFileSync2(path33, "utf8");
85670
+ raw = readFileSync2(path37, "utf8");
85670
85671
  } catch {
85671
85672
  continue;
85672
85673
  }
@@ -85922,8 +85923,8 @@ function createTail(log) {
85922
85923
  // ../cli/package.json
85923
85924
  var package_default = {
85924
85925
  name: "wildcrane",
85925
- version: "0.11.5",
85926
- akbContract: 2,
85926
+ version: "0.11.8",
85927
+ akbContract: 4,
85927
85928
  description: "WildCrane's `akb` command \u2014 scaffold the Markdown board under docs/kanban/, put an agent on a card, and carry the flows the agent works by.",
85928
85929
  keywords: [
85929
85930
  "kanban",
@@ -85984,8 +85985,8 @@ var CLIENT_CAPABILITIES = {
85984
85985
  };
85985
85986
  function whereHint(update2, title) {
85986
85987
  const locations = Array.isArray(update2.locations) ? update2.locations : [];
85987
- const path33 = str(obj(locations[0]).path);
85988
- return path33 && !title.includes(path33) ? hint(path33) : "";
85988
+ const path37 = str(obj(locations[0]).path);
85989
+ return path37 && !title.includes(path37) ? hint(path37) : "";
85989
85990
  }
85990
85991
  function saidBy(update2) {
85991
85992
  const content = Array.isArray(update2.content) ? update2.content : [];
@@ -86455,8 +86456,8 @@ async function tokensOf(rpc, sessionId) {
86455
86456
  }
86456
86457
  async function contextOf(rpc, sessionId) {
86457
86458
  try {
86458
- const read = await rpc.call("session/read", { sessionId, messageLimit: 1 });
86459
- const state = obj(read.projection);
86459
+ const read2 = await rpc.call("session/read", { sessionId, messageLimit: 1 });
86460
+ const state = obj(read2.projection);
86460
86461
  const used = num(state.contextUsed);
86461
86462
  const limit = num(state.contextWindow);
86462
86463
  return used > 0 ? { used, limit: limit > 0 ? limit : void 0 } : void 0;
@@ -88024,6 +88025,7 @@ var DEFAULT_HARNESS = HARNESSES[0];
88024
88025
  checkHarnesses(HARNESSES);
88025
88026
 
88026
88027
  // ../cli/src/lib/agent/env.ts
88028
+ var RUN_ENV = "KANBAN_RUN";
88027
88029
  var SCHEDULED_AGENTS_ENV = "AI4KANBAN_SCHEDULED_AGENTS";
88028
88030
  var SESSION_VARS = {
88029
88031
  "claude-code": "CLAUDE_CODE_SESSION_ID",
@@ -88226,7 +88228,7 @@ var secretsSet = () => Object.fromEntries(Object.entries(readAll()).map(([id, ke
88226
88228
 
88227
88229
  // src/api.ts
88228
88230
  var RUNTIMES = ["claude-code", "codex", "cursor", "opencode", "kimi", "dsh", "zcode", "grok"];
88229
- var PROTOCOL = 11;
88231
+ var PROTOCOL = 12;
88230
88232
  var TIMEOUT_MS = 2e4;
88231
88233
  async function send(method, route, body, signedIn, ms, type) {
88232
88234
  const headers = { accept: "application/json" };
@@ -88313,7 +88315,7 @@ var listFolders = (machineId2) => request("GET", `/v1/runner/folders?machine=${q
88313
88315
  var listElsewhere = (machineId2) => request("GET", `/v1/runner/folders?machine=${q(machineId2)}&elsewhere=1`);
88314
88316
  var listMachineTasks = (machineId2) => request("GET", `/v1/runner/tasks?machine=${q(machineId2)}`);
88315
88317
  var stopTask = (task, how) => request("POST", how === "chat" ? `/v1/tasks/${q(task)}/chat/stop` : `/v1/tasks/${q(task)}/stop`, {});
88316
- var addFolder = (machineId2, name, path33, project) => request("POST", "/v1/runner/folders", { machineId: machineId2, name, path: path33, ...project ? { project } : {} });
88318
+ var addFolder = (machineId2, name, path37, project) => request("POST", "/v1/runner/folders", { machineId: machineId2, name, path: path37, ...project ? { project } : {} });
88317
88319
  var removeFolder = (machineId2, project) => request("POST", `/v1/runner/folders/${q(project)}/remove`, { machineId: machineId2 });
88318
88320
  var readBoard = (project, since) => request("GET", `/v1/projects/${q(project)}/board${since === null ? "" : `?since=${since}`}`);
88319
88321
  async function commitBoard(project, job, machine, files) {
@@ -88391,6 +88393,7 @@ function plan(runtime, prompt, cwd, resume, model, given = {}, fork = false, lin
88391
88393
  stdout: child.stdout,
88392
88394
  stdin: child.stdin,
88393
88395
  prompt,
88396
+ restartPrompt: prompt,
88394
88397
  cwd,
88395
88398
  resumeId: resume ?? void 0,
88396
88399
  log: () => {
@@ -88833,9 +88836,9 @@ async function askDueAgents(machineId2, now = Date.now()) {
88833
88836
  if (!folders2.ok) return false;
88834
88837
  let started = false;
88835
88838
  for (const { project } of folders2.value.folders) {
88836
- const read = await readAgents(machineId2, project);
88837
- if (!read.ok) continue;
88838
- for (const agent of read.value.agents.filter((a3) => agentDue(a3, now))) {
88839
+ const read2 = await readAgents(machineId2, project);
88840
+ if (!read2.ok) continue;
88841
+ for (const agent of read2.value.agents.filter((a3) => agentDue(a3, now))) {
88839
88842
  const asked = await requestAgent(machineId2, project, agent.name, agent.workflow ?? null, agent.lastSuccess);
88840
88843
  if (!asked.ok) console.error(`runner: ${agent.name} was not started on ${project}: ${asked.error}`);
88841
88844
  else if (asked.value.job) started = true;
@@ -88880,7 +88883,7 @@ exec ${line} "$@"
88880
88883
  }
88881
88884
  function akbEnv(akb, board, task, line) {
88882
88885
  const env2 = {};
88883
- const dropped = ["AI4KANBAN_BOARD", "AI4KANBAN_TASK", LANGUAGE_LINE_ENV, SCHEDULED_AGENTS_ENV];
88886
+ const dropped = ["AI4KANBAN_BOARD", "AI4KANBAN_TASK", "AI4KANBAN_EXECUTION", LANGUAGE_LINE_ENV, SCHEDULED_AGENTS_ENV];
88884
88887
  for (const [k, v2] of Object.entries(process.env)) if (!k.startsWith("KANBAN_") && !dropped.includes(k)) env2[k] = v2;
88885
88888
  const key = Object.keys(env2).find((k) => k.toUpperCase() === "PATH") ?? "PATH";
88886
88889
  env2[key] = [shimDir(akb), env2[key]].filter(Boolean).join(path14.delimiter);
@@ -88901,7 +88904,7 @@ function runAkb(akb, args, opts) {
88901
88904
  };
88902
88905
  let child;
88903
88906
  try {
88904
- child = spawn3(akb.command, [...akb.args, ...args], { cwd: opts.cwd, env: { ...akbEnv(akb, opts.board, opts.task, opts.line), ...opts.env }, stdio: ["ignore", "pipe", "pipe"] });
88907
+ child = spawn3(akb.command, [...akb.args, ...args], { cwd: opts.cwd, env: { ...akbEnv(akb, opts.board, opts.task, opts.line), ...opts.env }, detached: process.platform !== "win32", stdio: ["ignore", "pipe", "pipe"] });
88905
88908
  } catch (e2) {
88906
88909
  return resolve2({ code: null, out: "", last: e2 instanceof Error ? e2.message : String(e2) });
88907
88910
  }
@@ -89382,11 +89385,11 @@ function keepCloudChat(task, messages) {
89382
89385
  fs17.writeFileSync(file2, lines.map((l2) => `${JSON.stringify(l2)}
89383
89386
  `).join(""));
89384
89387
  }
89385
- async function keepDecisions(task, read) {
89388
+ async function keepDecisions(task, read2) {
89386
89389
  const comments = [];
89387
89390
  let after = null;
89388
89391
  do {
89389
- const page = await read(task, after);
89392
+ const page = await read2(task, after);
89390
89393
  if (!page.ok) return;
89391
89394
  for (const d2 of page.value.data) {
89392
89395
  if (d2.comment.trim()) comments.push({ id: d2.id, role: "user", text: d2.comment, at: Date.parse(d2.created_at) || Date.now() });
@@ -89460,22 +89463,22 @@ import path24 from "node:path";
89460
89463
  // ../cloud/src/board-files.ts
89461
89464
  var ROOTS = ["todo/", ".archive/", "memory/", "workflows/", "triage/", "assets/", "rules/"];
89462
89465
  var SETTINGS = ["modules.md", "config.md"];
89463
- var isSettingsPath = (path33) => SETTINGS.includes(path33) || /^rules\/(?:workflows\/)?[^/]+\.md$/.test(path33);
89466
+ var isSettingsPath = (path37) => SETTINGS.includes(path37) || /^rules\/(?:workflows\/)?[^/]+\.md$/.test(path37);
89464
89467
  var BOARD_FILE_LIMIT = 256 * 1024;
89465
- function isBoardPath(path33) {
89466
- if (!path33 || path33.length > 500 || path33.startsWith("/") || path33.includes("\\") || path33.includes("\0")) return false;
89467
- if (path33.split("/").some((part) => !part || part === "." || part === "..")) return false;
89468
- if (path33 === "todo/README.md" || path33.split("/").includes(".sync")) return false;
89469
- if (path33.startsWith("workflows/")) return true;
89470
- if (SETTINGS.includes(path33)) return true;
89471
- if (path33.startsWith("rules/")) return isSettingsPath(path33);
89472
- if (path33.startsWith("assets/")) return path33.endsWith(".json");
89473
- return ROOTS.some((root) => path33.startsWith(root)) && path33.endsWith(".md");
89468
+ function isBoardPath(path37) {
89469
+ if (!path37 || path37.length > 500 || path37.startsWith("/") || path37.includes("\\") || path37.includes("\0")) return false;
89470
+ if (path37.split("/").some((part) => !part || part === "." || part === "..")) return false;
89471
+ if (path37 === "todo/README.md" || path37.split("/").includes(".sync")) return false;
89472
+ if (path37.startsWith("workflows/")) return true;
89473
+ if (SETTINGS.includes(path37)) return true;
89474
+ if (path37.startsWith("rules/")) return isSettingsPath(path37);
89475
+ if (path37.startsWith("assets/")) return path37.endsWith(".json");
89476
+ return ROOTS.some((root) => path37.startsWith(root)) && path37.endsWith(".md");
89474
89477
  }
89475
89478
  var CARD = /^(?:todo|\.archive)\/(?:[^/]+\/)*(\d+)-[^/]*\.md$/;
89476
89479
  var ROOT = /^(?:todo|\.archive)\/(?:[^/]+\/)*(\d+)-[^/]+\/root\.md$/;
89477
- function numberOfCard(path33) {
89478
- const n = ROOT.exec(path33)?.[1] ?? CARD.exec(path33)?.[1];
89480
+ function numberOfCard(path37) {
89481
+ const n = ROOT.exec(path37)?.[1] ?? CARD.exec(path37)?.[1];
89479
89482
  return n ? Number(n) : null;
89480
89483
  }
89481
89484
  var cardSlug = (task) => task.toLowerCase().replace(/_/g, "-");
@@ -89512,7 +89515,7 @@ import crypto3 from "node:crypto";
89512
89515
  import fs20 from "node:fs";
89513
89516
  import path23 from "node:path";
89514
89517
 
89515
- // ../../../../../../git/ai4kanban/runner/node_modules/node-diff3/dist/diff3.mjs
89518
+ // node_modules/node-diff3/dist/diff3.mjs
89516
89519
  function LCS(buffer1, buffer2) {
89517
89520
  let equivalenceClasses = /* @__PURE__ */ Object.create(null);
89518
89521
  for (let j2 = 0; j2 < buffer2.length; j2++) {
@@ -89749,8 +89752,8 @@ function unquote2(v2) {
89749
89752
 
89750
89753
  // ../cloud/src/triage-files.ts
89751
89754
  var ITEM = /^triage\/(?:(dismissed|archived)\/)?([^/]+)\.md$/;
89752
- function itemAt(path33) {
89753
- const m = ITEM.exec(path33);
89755
+ function itemAt(path37) {
89756
+ const m = ITEM.exec(path37);
89754
89757
  if (!m) return null;
89755
89758
  return { state: m[1] === "dismissed" ? "dismissed" : m[1] === "archived" ? "carded" : "open", name: m[2] };
89756
89759
  }
@@ -90490,8 +90493,8 @@ function sharedMemory(board) {
90490
90493
  const declared = /* @__PURE__ */ new Map();
90491
90494
  const take = (folder, text3, builtIn) => {
90492
90495
  if (text3 === null || declared.has(folder)) return;
90493
- const read = parseSpecAgent(text3, folder, () => null, builtIn);
90494
- if ("agent" in read && read.agent.name === folder) declared.set(folder, read.agent.memoryFiles.workspace);
90496
+ const read2 = parseSpecAgent(text3, folder, () => null, builtIn);
90497
+ if ("agent" in read2 && read2.agent.name === folder) declared.set(folder, read2.agent.memoryFiles.workspace);
90495
90498
  };
90496
90499
  for (const [key, text3] of Object.entries(BUNDLED_AGENT_FILES)) {
90497
90500
  const at2 = /^([^/]+)\/AGENT\.md$/.exec(key);
@@ -90579,17 +90582,17 @@ function openCached(project) {
90579
90582
  const dir = cacheDir(project);
90580
90583
  if (fs20.existsSync(path23.join(dir, ".git"))) return dir;
90581
90584
  fs20.mkdirSync(dir, { recursive: true });
90582
- const git3 = (...args) => spawnSync4("git", ["-C", dir, ...args], { encoding: "utf8" }).status === 0;
90583
- if (git3("init", "-q")) git3("-c", "user.name=WildCrane", "-c", "user.email=runner@wildcrane.ai", "commit", "-q", "--allow-empty", "-m", "general");
90585
+ const git4 = (...args) => spawnSync4("git", ["-C", dir, ...args], { encoding: "utf8" }).status === 0;
90586
+ if (git4("init", "-q")) git4("-c", "user.name=WildCrane", "-c", "user.email=runner@wildcrane.ai", "commit", "-q", "--allow-empty", "-m", "general");
90584
90587
  return dir;
90585
90588
  }
90586
90589
  var SKILL_FOLDERS = [".claude/skills/kanban", ".agents/skills/kanban"];
90587
90590
  var SKILL_ROOTS = [".claude/skills", ".agents/skills"];
90588
90591
  function keepOutOfGit(dir, folders2 = SKILL_FOLDERS) {
90589
- const git3 = (...args) => spawnSync4("git", ["-C", dir, ...args], { encoding: "utf8" });
90590
- const inside = git3("rev-parse", "--git-path", "info/exclude");
90592
+ const git4 = (...args) => spawnSync4("git", ["-C", dir, ...args], { encoding: "utf8" });
90593
+ const inside = git4("rev-parse", "--git-path", "info/exclude");
90591
90594
  if (inside.status !== 0) return;
90592
- const missing = [".akb/", ...folders2.map((f2) => `${f2}/`)].filter((p2) => git3("check-ignore", "-q", p2).status !== 0);
90595
+ const missing = [".akb/", ...folders2.map((f2) => `${f2}/`)].filter((p2) => git4("check-ignore", "-q", p2).status !== 0);
90593
90596
  if (!missing.length) return;
90594
90597
  const exclude = path23.resolve(dir, inside.stdout.trim());
90595
90598
  fs20.mkdirSync(path23.dirname(exclude), { recursive: true });
@@ -90748,10 +90751,10 @@ async function pullWorkflow(ws, record, base) {
90748
90751
  record.builtin = ws.workflow.startsWith("wf_builtin_");
90749
90752
  let found = Object.keys(files).length > 0;
90750
90753
  if (!found && ws.cloudTask) {
90751
- const read = await readTaskWorkflow(ws.cloudTask);
90752
- if (!read.ok && read.code !== "not_found") return read;
90753
- if (read.ok) {
90754
- files = read.value.files;
90754
+ const read2 = await readTaskWorkflow(ws.cloudTask);
90755
+ if (!read2.ok && read2.code !== "not_found") return read2;
90756
+ if (read2.ok) {
90757
+ files = read2.value.files;
90755
90758
  found = true;
90756
90759
  if (!record.builtin) {
90757
90760
  for (const [name, text3] of Object.entries(files)) if (isBoardPath(root + name)) write(path23.join(ws.board, root, name), text3);
@@ -90866,12 +90869,12 @@ var readHead = (ws) => readBase(ws).head_seq;
90866
90869
  var pullChanges = (ws) => inFolder(ws.cwd, async () => {
90867
90870
  const base = readBase(ws);
90868
90871
  if (base.head_seq === null) return { ok: true, value: void 0 };
90869
- const read = await readBoard(ws.project, base.head_seq);
90870
- if (!read.ok) return read;
90872
+ const read2 = await readBoard(ws.project, base.head_seq);
90873
+ if (!read2.ok) return read2;
90871
90874
  const shared = sharedMemory(ws.board);
90872
90875
  const root = rootOf(ws);
90873
90876
  let skipped = false;
90874
- for (const f2 of read.value.files) {
90877
+ for (const f2 of read2.value.files) {
90875
90878
  const p2 = f2.path.startsWith(root) ? f2.path.slice(root.length) : f2.path;
90876
90879
  const isShared = p2.startsWith(MEMORY2) && shared(p2.slice(MEMORY2.length));
90877
90880
  if (kept3(p2) && isShared === !f2.path.startsWith(root)) {
@@ -90887,7 +90890,7 @@ var pullChanges = (ws) => inFolder(ws.cwd, async () => {
90887
90890
  if (f2.content === null) delete base.files[f2.path];
90888
90891
  else base.files[f2.path] = { seq: f2.seq, content: f2.content };
90889
90892
  }
90890
- if (!skipped) base.head_seq = read.value.head_seq;
90893
+ if (!skipped) base.head_seq = read2.value.head_seq;
90891
90894
  writeBase(ws, base);
90892
90895
  writeIndex(ws.board);
90893
90896
  return { ok: true, value: void 0 };
@@ -90900,14 +90903,14 @@ async function readCloud(ws) {
90900
90903
  if (!project.ok) return project;
90901
90904
  base.workspace = project.value.workspace ?? null;
90902
90905
  }
90903
- const read = await readBoard(ws.project, base.head_seq);
90904
- if (!read.ok) return read;
90906
+ const read2 = await readBoard(ws.project, base.head_seq);
90907
+ if (!read2.ok) return read2;
90905
90908
  if (base.head_seq === null) base.files = {};
90906
- for (const f2 of read.value.files) {
90909
+ for (const f2 of read2.value.files) {
90907
90910
  if (f2.content === null) delete base.files[f2.path];
90908
90911
  else base.files[f2.path] = { seq: f2.seq, content: f2.content };
90909
90912
  }
90910
- base.head_seq = read.value.head_seq;
90913
+ base.head_seq = read2.value.head_seq;
90911
90914
  base.project = ws.project;
90912
90915
  writeBase(ws, base);
90913
90916
  const reset = (view2) => {
@@ -91231,8 +91234,8 @@ function watchBoards(machineId2, ms, lookMs = LOOK_MS, pullMs = PULL_MS, busyMs
91231
91234
  if (closed) return;
91232
91235
  if (busy(ws.cwd)) return void afterJob.add(ws.cwd);
91233
91236
  afterJob.delete(ws.cwd);
91234
- const read = await pullChanges(ws);
91235
- if (!read.ok && read.code) console.error(`runner: the board in ${ws.cwd} was not read: ${read.error}`);
91237
+ const read2 = await pullChanges(ws);
91238
+ if (!read2.ok && read2.code) console.error(`runner: the board in ${ws.cwd} was not read: ${read2.error}`);
91236
91239
  };
91237
91240
  const send3 = async (ws) => {
91238
91241
  const sent = await pushBoard(ws, machineId2);
@@ -91391,9 +91394,114 @@ async function answerHint(machineId2, hint2) {
91391
91394
  if (!sent.ok) console.error(`runner: the diff of ${commit.slice(0, 7)} was not sent: ${sent.error}`);
91392
91395
  }
91393
91396
 
91397
+ // ../cli/src/lib/agent/stop.ts
91398
+ import { spawnSync as spawnSync5 } from "node:child_process";
91399
+ import fs23 from "node:fs";
91400
+ var runMark = (sessionId) => ({ name: RUN_ENV, value: sessionId });
91401
+ var WINDOWS3 = process.platform === "win32";
91402
+ function markedInProc(entry, strict = false) {
91403
+ const pids = [];
91404
+ for (const name of fs23.readdirSync("/proc")) {
91405
+ if (!/^\d+$/.test(name)) continue;
91406
+ try {
91407
+ if (fs23.readFileSync(`/proc/${name}/environ`, "utf8").split("\0").includes(entry)) pids.push(Number(name));
91408
+ } catch (error) {
91409
+ if (strict && !["ENOENT", "ESRCH"].includes(error.code ?? "")) {
91410
+ const stat = fs23.statSync(`/proc/${name}`, { throwIfNoEntry: false });
91411
+ if (stat?.uid === process.getuid?.()) throw error;
91412
+ }
91413
+ }
91414
+ }
91415
+ return pids;
91416
+ }
91417
+ function markedInPs(entry, roots) {
91418
+ const ps = spawnSync5("ps", ["-A", "-E", "-ww", "-o", "pid=,ppid=,command="], {
91419
+ encoding: "utf8",
91420
+ maxBuffer: 64 * 1024 * 1024,
91421
+ timeout: 5e3
91422
+ });
91423
+ if (ps.status !== 0 || !ps.stdout) throw new Error("\u65E0\u6CD5\u67E5\u8BE2\u8FDB\u7A0B\u6811\u3002");
91424
+ const children = /* @__PURE__ */ new Map();
91425
+ const listed2 = /* @__PURE__ */ new Set();
91426
+ const found = /* @__PURE__ */ new Set();
91427
+ for (const line of ps.stdout.split("\n")) {
91428
+ const m = /^\s*(\d+)\s+(\d+)\s(.*)$/.exec(line);
91429
+ if (!m) continue;
91430
+ const pid = Number(m[1]);
91431
+ const ppid = Number(m[2]);
91432
+ listed2.add(pid);
91433
+ children.set(ppid, [...children.get(ppid) ?? [], pid]);
91434
+ if (`${m[3]} `.includes(` ${entry} `)) found.add(pid);
91435
+ }
91436
+ const queue = [...found, ...roots.filter((pid) => listed2.has(pid))];
91437
+ for (const pid of queue) {
91438
+ found.add(pid);
91439
+ for (const child of children.get(pid) ?? []) if (!found.has(child)) queue.push(child);
91440
+ }
91441
+ return [...found];
91442
+ }
91443
+ function startedUnder(list, root, since) {
91444
+ const self2 = list.procs.find((p2) => p2.pid === root);
91445
+ const from = since ?? self2?.startedAt;
91446
+ if (from === void 0 || list.bootedAt > from) return [];
91447
+ if (self2 && self2.startedAt > from) return [];
91448
+ const found = self2 ? [root] : [];
91449
+ const seen = /* @__PURE__ */ new Set([root]);
91450
+ const queue = [{ pid: root, startedAt: from }];
91451
+ for (const parent of queue) {
91452
+ for (const p2 of list.procs) {
91453
+ if (p2.ppid !== parent.pid || seen.has(p2.pid) || p2.startedAt < parent.startedAt) continue;
91454
+ seen.add(p2.pid);
91455
+ found.push(p2.pid);
91456
+ queue.push(p2);
91457
+ }
91458
+ }
91459
+ return found.reverse();
91460
+ }
91461
+ var LIST_PROCS = [
91462
+ "$ErrorActionPreference = 'Stop'",
91463
+ "Get-CimInstance Win32_Process | ForEach-Object { if ($_.CreationDate) { '{0} {1} {2}' -f $_.ProcessId, $_.ParentProcessId, ([DateTimeOffset]$_.CreationDate).ToUnixTimeMilliseconds() } }",
91464
+ "'boot {0}' -f ([DateTimeOffset](Get-CimInstance Win32_OperatingSystem).LastBootUpTime).ToUnixTimeMilliseconds()"
91465
+ ].join("; ");
91466
+ function readProcList(out) {
91467
+ const procs = [];
91468
+ let bootedAt;
91469
+ for (const line of out.split(/\r?\n/)) {
91470
+ const boot = /^boot (\d+)$/.exec(line.trim());
91471
+ if (boot) bootedAt = Number(boot[1]);
91472
+ const m = /^(\d+) (\d+) (\d+)$/.exec(line.trim());
91473
+ if (m) procs.push({ pid: Number(m[1]), ppid: Number(m[2]), startedAt: Number(m[3]) });
91474
+ }
91475
+ return bootedAt !== void 0 && procs.length ? { procs, bootedAt } : void 0;
91476
+ }
91477
+ function procsOnWindows() {
91478
+ const ps = spawnSync5("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", LIST_PROCS], {
91479
+ encoding: "utf8",
91480
+ maxBuffer: 64 * 1024 * 1024,
91481
+ timeout: 5e3,
91482
+ windowsHide: true
91483
+ });
91484
+ return ps.status === 0 && ps.stdout ? readProcList(ps.stdout) : void 0;
91485
+ }
91486
+ function processesStopped(mark, root) {
91487
+ try {
91488
+ if (WINDOWS3) {
91489
+ const list = procsOnWindows();
91490
+ if (!list || !root) return false;
91491
+ const current = list.procs.find((p2) => p2.pid === root.pid);
91492
+ if (current && current.startedAt > root.since) return false;
91493
+ return startedUnder(list, root.pid, root.since).length === 0;
91494
+ }
91495
+ const entry = `${mark.name}=${mark.value}`;
91496
+ return (process.platform === "linux" ? markedInProc(entry, true) : markedInPs(entry, root ? [root.pid] : [])).length === 0;
91497
+ } catch {
91498
+ return false;
91499
+ }
91500
+ }
91501
+
91394
91502
  // src/flow.ts
91395
- import fs25 from "node:fs";
91396
- import path28 from "node:path";
91503
+ import fs28 from "node:fs";
91504
+ import path30 from "node:path";
91397
91505
 
91398
91506
  // ../cli/src/lib/question-block.ts
91399
91507
  var MODES = ["single", "multi"];
@@ -91551,7 +91659,7 @@ function reviewOf(meta) {
91551
91659
  }
91552
91660
 
91553
91661
  // src/triage.ts
91554
- import fs23 from "node:fs";
91662
+ import fs24 from "node:fs";
91555
91663
  import path26 from "node:path";
91556
91664
 
91557
91665
  // ../cli/src/lib/signals/identity.ts
@@ -91576,7 +91684,7 @@ function slugOf(title) {
91576
91684
  function freeName(dir, title) {
91577
91685
  const stem = slugOf(title);
91578
91686
  let name = `${stem}.md`;
91579
- for (let n = 2; fs23.existsSync(path26.join(dir, name)); n++) name = `${stem}-${n}.md`;
91687
+ for (let n = 2; fs24.existsSync(path26.join(dir, name)); n++) name = `${stem}-${n}.md`;
91580
91688
  return name;
91581
91689
  }
91582
91690
  function itemText(item, fields = {}) {
@@ -91596,17 +91704,17 @@ ${item.text.trim()}
91596
91704
  `;
91597
91705
  }
91598
91706
  function writeItem(dir, item, fields = {}) {
91599
- fs23.mkdirSync(dir, { recursive: true });
91707
+ fs24.mkdirSync(dir, { recursive: true });
91600
91708
  const name = freeName(dir, item.title);
91601
- fs23.writeFileSync(path26.join(dir, name), itemText(item, item.workflow ? { workflow: workflowName(item.workflow), ...fields } : fields));
91709
+ fs24.writeFileSync(path26.join(dir, name), itemText(item, item.workflow ? { workflow: workflowName(item.workflow), ...fields } : fields));
91602
91710
  return name;
91603
91711
  }
91604
91712
  function layOut(board, rejections) {
91605
91713
  clearLaid(board);
91606
91714
  const dir = rejectedDir(board);
91607
- fs23.mkdirSync(dir, { recursive: true });
91715
+ fs24.mkdirSync(dir, { recursive: true });
91608
91716
  for (const t2 of rejections.tasks) {
91609
- fs23.writeFileSync(path26.join(dir, `${t2.number}-${slugify(t2.title)}.md`), [
91717
+ fs24.writeFileSync(path26.join(dir, `${t2.number}-${slugify(t2.title)}.md`), [
91610
91718
  "---",
91611
91719
  `title: ${yamlScalar(t2.title)}`,
91612
91720
  "status: todo",
@@ -91628,14 +91736,156 @@ function layOut(board, rejections) {
91628
91736
  return { tasks: rejections.tasks.map((t2) => t2.id), triage: rejections.triage.map((i) => i.id) };
91629
91737
  }
91630
91738
  function clearLaid(board) {
91631
- fs23.rmSync(rejectedDir(board), { recursive: true, force: true });
91632
- for (const sub of SCRATCH) fs23.rmSync(path26.join(triageDir(board), sub), { recursive: true, force: true });
91739
+ fs24.rmSync(rejectedDir(board), { recursive: true, force: true });
91740
+ for (const sub of SCRATCH) fs24.rmSync(path26.join(triageDir(board), sub), { recursive: true, force: true });
91633
91741
  }
91634
91742
 
91635
- // src/built.ts
91636
- import fs24 from "node:fs";
91743
+ // src/kanban-skill.ts
91744
+ import fs25 from "node:fs";
91637
91745
  import path27 from "node:path";
91638
91746
 
91747
+ // ../skill/SKILL.md
91748
+ var SKILL_default = '---\nname: kanban\ndescription: Manage the file-based task board with akb. Use for creating and planning tasks, revising or implementing cards, and managing background runs; also for "what\'s running".\n---\n\n# Kanban board\n\nThe board is worked only through `akb`. Find the command for the job in `akb help` and run\nit; never do its work by hand or from memory.\n\n- **`--print` does it here**: `akb card revise 12 --print "drop the export"` prints the whole\n flow for that card on this board; follow it to its closing steps. Without `--print` the\n same command starts a separate agent.\n- **Keys**: never read or write API keys; the user sets them with `akb agent set apiKey`.\n';
91749
+
91750
+ // src/kanban-skill.ts
91751
+ var CONTENT = `${SKILL_default.trimEnd()}
91752
+
91753
+ <!-- ai4kanban managed -->
91754
+ `;
91755
+ var MANAGED = /^<!-- ai4kanban \S+ -->$/m;
91756
+ function prepareKanbanSkill(root) {
91757
+ for (const folder of SKILL_FOLDERS) {
91758
+ const dir = path27.join(root, folder);
91759
+ const file2 = path27.join(dir, "SKILL.md");
91760
+ try {
91761
+ let linked = false;
91762
+ let at2 = root;
91763
+ for (const name of `${folder}/SKILL.md`.split("/")) {
91764
+ at2 = path27.join(at2, name);
91765
+ if (fs25.lstatSync(at2, { throwIfNoEntry: false })?.isSymbolicLink()) linked = true;
91766
+ }
91767
+ const held4 = fs25.existsSync(file2) ? fs25.readFileSync(file2, "utf8") : null;
91768
+ const exists = fs25.lstatSync(dir, { throwIfNoEntry: false }) !== void 0;
91769
+ if (linked || exists && !MANAGED.test(held4 ?? "")) {
91770
+ if (!held4?.trim()) throw new Error("\u7528\u6237\u81EA\u6709\u76EE\u5F55\u6216\u7B26\u53F7\u94FE\u63A5\u4E2D\u7F3A\u5C11\u53EF\u8BFB\u7684 SKILL.md");
91771
+ continue;
91772
+ }
91773
+ if (held4 !== CONTENT) {
91774
+ fs25.mkdirSync(dir, { recursive: true });
91775
+ fs25.writeFileSync(file2, CONTENT);
91776
+ }
91777
+ } catch (e2) {
91778
+ throw new Error(`\u65E0\u6CD5\u51C6\u5907 ${folder}\uFF1A${e2 instanceof Error ? e2.message : String(e2)}`);
91779
+ }
91780
+ }
91781
+ }
91782
+
91783
+ // ../cli/src/lib/skill/hook.ts
91784
+ import { spawnSync as spawnSync6 } from "node:child_process";
91785
+ import fs26 from "node:fs";
91786
+ import path28 from "node:path";
91787
+ var MARKER = "# ai4kanban commit guard";
91788
+ var MARKER_LINE = new RegExp(`^${MARKER}\\b`, "m");
91789
+ var CHECK = [
91790
+ "try{",
91791
+ 'const[top,branch]=require("child_process")',
91792
+ '.execFileSync("git",["rev-parse","--show-toplevel","--abbrev-ref","HEAD"],{encoding:"utf8"}).trim().split("\\n");',
91793
+ 'if(/\\/\\.akb\\/worktrees\\//.test(top+"/"))process.exit(0);',
91794
+ 'const d=(JSON.parse(require("fs").readFileSync(process.argv[1],"utf8")).deliveries||[])',
91795
+ '.find((x)=>x&&x.status==="active"&&x.commitMode==="auto"&&x.targetBranch===branch&&(!x.landing||x.landing.status!=="landed"));',
91796
+ "if(!d)process.exit(0);",
91797
+ "process.stderr.write(",
91798
+ '"ai4kanban: delivery "+d.deliveryId+" is landing #"+d.cardId+" on "+branch+", so a commit here moves the target under it\\n"',
91799
+ '+" \u2014 commit on another branch, or `git commit --no-verify` to commit anyway.\\n");',
91800
+ "process.exit(1);",
91801
+ "}catch(e){process.exit(0)}"
91802
+ ].join("");
91803
+ var quoted = (p2) => `"${p2.replace(/(["$`\\])/g, "\\$1")}"`;
91804
+ var guardLine = (sessions) => `if command -v node >/dev/null 2>&1; then node -e '${CHECK}' ${quoted(sessions)} || exit 1; fi`;
91805
+ function hookScript(sessions) {
91806
+ return [
91807
+ "#!/bin/sh",
91808
+ `${MARKER} ${SKILL_VERSION} \u2014 \u7531 Runner \u7BA1\u7406\uFF0C\u4FEE\u6539\u4F1A\u88AB\u8986\u76D6\u3002`,
91809
+ "#",
91810
+ "# Refuses a commit on the branch a delivery is landing on, and nothing else. Anything",
91811
+ "# it cannot judge lets the commit through. `git commit --no-verify` gets past it, and",
91812
+ "# deleting this file turns it off.",
91813
+ guardLine(sessions),
91814
+ "exit 0",
91815
+ ""
91816
+ ].join("\n");
91817
+ }
91818
+ var read = (file2) => {
91819
+ try {
91820
+ return fs26.readFileSync(file2, "utf8");
91821
+ } catch {
91822
+ return null;
91823
+ }
91824
+ };
91825
+ function hooksDir(root) {
91826
+ const out = spawnSync6("git", ["rev-parse", "--git-path", "hooks"], {
91827
+ cwd: root,
91828
+ encoding: "utf8",
91829
+ windowsHide: true
91830
+ });
91831
+ if (out.error || out.status !== 0 || !out.stdout.trim()) return null;
91832
+ return path28.resolve(root, out.stdout.trim());
91833
+ }
91834
+ function hasOwnHooksPath(root) {
91835
+ const out = spawnSync6("git", ["config", "--get", "core.hooksPath"], {
91836
+ cwd: root,
91837
+ encoding: "utf8",
91838
+ windowsHide: true
91839
+ });
91840
+ return !out.error && out.status === 0 && !!out.stdout.trim();
91841
+ }
91842
+ var sessionsPath = (root, board) => path28.join(projectStateDir(board, root), SESSIONS_FILE);
91843
+ function readCommitHook(root, board = path28.join(root, "docs", "kanban")) {
91844
+ const dir = hooksDir(root);
91845
+ if (!dir) return { state: "no-git" };
91846
+ const where = shown(root, path28.join(dir, "pre-commit"));
91847
+ const line = guardLine(sessionsPath(root, board));
91848
+ if (hasOwnHooksPath(root)) return { state: "hooks-path", path: where, line };
91849
+ const file2 = path28.join(dir, "pre-commit");
91850
+ if (fs26.lstatSync(file2, { throwIfNoEntry: false })?.isSymbolicLink()) return { state: "foreign", path: where, line };
91851
+ const text3 = read(file2);
91852
+ if (text3 === null) return { state: "absent", path: where };
91853
+ return MARKER_LINE.test(text3) ? { state: "ours", path: where } : { state: "foreign", path: where, line };
91854
+ }
91855
+ var shown = (root, p2) => (path28.relative(root, p2) || p2).split(path28.sep).join("/");
91856
+ function installCommitHook(root, board = path28.join(root, "docs", "kanban")) {
91857
+ try {
91858
+ return placeCommitHook(root, board);
91859
+ } catch (e2) {
91860
+ return { note: `\u63D0\u4EA4\u4FDD\u62A4\u65E0\u6CD5\u51C6\u5907\uFF1A${e2 instanceof Error ? e2.message : String(e2)}` };
91861
+ }
91862
+ }
91863
+ function placeCommitHook(root, board) {
91864
+ const hook = readCommitHook(root, board);
91865
+ if (hook.state === "no-git") return {};
91866
+ if (hook.state === "hooks-path" || hook.state === "foreign") {
91867
+ const why = hook.state === "foreign" ? `${hook.path} is a hook the board did not write, so no commit guard was installed` : `this repository runs its hooks from \`core.hooksPath\`, so no commit guard was installed`;
91868
+ return {
91869
+ note: `${why} \u2014 add this line to ${hook.path} to refuse a commit on the branch a delivery is landing on:
91870
+ ${hook.line}`
91871
+ };
91872
+ }
91873
+ const file2 = path28.join(root, hook.path);
91874
+ try {
91875
+ fs26.mkdirSync(path28.dirname(file2), { recursive: true });
91876
+ const text3 = hookScript(sessionsPath(root, board));
91877
+ if (read(file2) !== text3) fs26.writeFileSync(file2, text3, { mode: 493 });
91878
+ fs26.chmodSync(file2, 493);
91879
+ } catch (e2) {
91880
+ return { note: `${hook.path} could not be written \u2014 ${e2 instanceof Error ? e2.message : String(e2)}` };
91881
+ }
91882
+ return { wrote: { path: hook.path, refreshed: hook.state === "ours" } };
91883
+ }
91884
+
91885
+ // src/built.ts
91886
+ import fs27 from "node:fs";
91887
+ import path29 from "node:path";
91888
+
91639
91889
  // ../cli/src/lib/spec-agent-names.ts
91640
91890
  var LEGACY_SPEC_AGENT_NAMES = {
91641
91891
  "recommend-tech-stack": "tech-stack-advisor",
@@ -91731,13 +91981,13 @@ function folderPath(file2, top) {
91731
91981
  return [parts[1], parts.slice(2).join("/")];
91732
91982
  }
91733
91983
  function mcpProblem(text3) {
91734
- let read;
91984
+ let read2;
91735
91985
  try {
91736
- read = JSON.parse(text3);
91986
+ read2 = JSON.parse(text3);
91737
91987
  } catch {
91738
91988
  return "is not JSON";
91739
91989
  }
91740
- const servers = read?.mcpServers;
91990
+ const servers = read2?.mcpServers;
91741
91991
  if (!servers || typeof servers !== "object" || Array.isArray(servers)) return "must hold `mcpServers`, an object of name \u2192 server";
91742
91992
  for (const [name, server] of Object.entries(servers)) {
91743
91993
  const { command, args, ...rest } = server ?? {};
@@ -91784,9 +92034,9 @@ function checkWorkflowFiles(value, official = false) {
91784
92034
  }
91785
92035
  const source = value[WORKFLOW_FILE];
91786
92036
  if (source === void 0) return fail(WORKFLOW_FILE, "is missing");
91787
- const read = parseWorkflowFile("workflow", source, WORKFLOW_FILE);
91788
- if ("problem" in read) return fail(WORKFLOW_FILE, read.problem.replace(`${WORKFLOW_FILE}: `, ""));
91789
- const def = read.def;
92037
+ const read2 = parseWorkflowFile("workflow", source, WORKFLOW_FILE);
92038
+ if ("problem" in read2) return fail(WORKFLOW_FILE, read2.problem.replace(`${WORKFLOW_FILE}: `, ""));
92039
+ const def = read2.def;
91790
92040
  const agents = /* @__PURE__ */ new Map();
91791
92041
  for (const [name, own] of folders2) {
91792
92042
  const from = `agents/${name}/AGENT.md`;
@@ -91810,26 +92060,26 @@ function checkWorkflowFiles(value, official = false) {
91810
92060
 
91811
92061
  // src/built.ts
91812
92062
  var isBuilder = (ws) => ws.workflow === BUILDER;
91813
- var draftDir = (ws) => path27.join(ws.board, "workflows", draftFolder(ws.task));
91814
- var draftLine = (ws) => `<!-- workflow folder: ${path27.relative(ws.cwd, draftDir(ws)).split(path27.sep).join("/")}/ -->`;
92063
+ var draftDir = (ws) => path29.join(ws.board, "workflows", draftFolder(ws.task));
92064
+ var draftLine = (ws) => `<!-- workflow folder: ${path29.relative(ws.cwd, draftDir(ws)).split(path29.sep).join("/")}/ -->`;
91815
92065
  var skeleton = (name) => ["---", `name: ${/\s#/.test(name) ? JSON.stringify(name) : yamlScalar(name)}`, "needsArtifact: false", "---", ""].join("\n");
91816
- async function placeDraft(ws, read) {
92066
+ async function placeDraft(ws, read2) {
91817
92067
  const dir = draftDir(ws);
91818
- if (fs24.existsSync(path27.join(dir, WORKFLOW_FILE))) return { ok: true, value: void 0 };
91819
- const task = await read.readTask(ws.task);
92068
+ if (fs27.existsSync(path29.join(dir, WORKFLOW_FILE))) return { ok: true, value: void 0 };
92069
+ const task = await read2.readTask(ws.task);
91820
92070
  if (!task.ok) return task;
91821
92071
  let files = { [WORKFLOW_FILE]: skeleton(task.value.title.trim() || "Untitled") };
91822
92072
  const changes = task.value.context?.workflow;
91823
92073
  if (changes) {
91824
- const held4 = await read.readWorkflow(changes);
92074
+ const held4 = await read2.readWorkflow(changes);
91825
92075
  if (!held4.ok) return held4;
91826
92076
  files = held4.value.files;
91827
92077
  }
91828
92078
  for (const [name, text3] of Object.entries(files)) {
91829
- const file2 = path27.resolve(dir, name);
91830
- if (!file2.startsWith(dir + path27.sep)) continue;
91831
- fs24.mkdirSync(path27.dirname(file2), { recursive: true });
91832
- fs24.writeFileSync(file2, text3);
92079
+ const file2 = path29.resolve(dir, name);
92080
+ if (!file2.startsWith(dir + path29.sep)) continue;
92081
+ fs27.mkdirSync(path29.dirname(file2), { recursive: true });
92082
+ fs27.writeFileSync(file2, text3);
91833
92083
  }
91834
92084
  return { ok: true, value: void 0 };
91835
92085
  }
@@ -91841,19 +92091,19 @@ async function builtWorkflow(ws, akb) {
91841
92091
  const dir = draftDir(ws);
91842
92092
  let source;
91843
92093
  try {
91844
- source = fs24.readFileSync(path27.join(dir, WORKFLOW_FILE), "utf8");
92094
+ source = fs27.readFileSync(path29.join(dir, WORKFLOW_FILE), "utf8");
91845
92095
  } catch {
91846
92096
  return fail(`workflows/${id}/${WORKFLOW_FILE} is missing.`);
91847
92097
  }
91848
- const read = parseWorkflowFile(id, source, `workflows/${id}/${WORKFLOW_FILE}`);
91849
- if ("problem" in read) return fail(read.problem);
91850
- const names2 = named(read.def);
91851
- fs24.rmSync(path27.join(dir, "agents"), { recursive: true, force: true });
92098
+ const read2 = parseWorkflowFile(id, source, `workflows/${id}/${WORKFLOW_FILE}`);
92099
+ if ("problem" in read2) return fail(read2.problem);
92100
+ const names2 = named(read2.def);
92101
+ fs27.rmSync(path29.join(dir, "agents"), { recursive: true, force: true });
91852
92102
  for (const name of names2) {
91853
- const from = path27.join(ws.board, "agents", name);
91854
- if (fs24.existsSync(from)) fs24.cpSync(from, path27.join(dir, "agents", name), { recursive: true });
92103
+ const from = path29.join(ws.board, "agents", name);
92104
+ if (fs27.existsSync(from)) fs27.cpSync(from, path29.join(dir, "agents", name), { recursive: true });
91855
92105
  }
91856
- const files = Object.fromEntries(filesUnder(dir).map((f2) => [f2, fs24.readFileSync(path27.join(dir, f2), "utf8")]));
92106
+ const files = Object.fromEntries(filesUnder(dir).map((f2) => [f2, fs27.readFileSync(path29.join(dir, f2), "utf8")]));
91857
92107
  const checked = checkWorkflowFiles(files);
91858
92108
  if (!checked.ok) return fail(`${checked.file} ${checked.reason}.`);
91859
92109
  const run2 = async (args) => answerOf2(await runAkb(akb, [...args, "--json", "--board", ws.board], { cwd: ws.cwd, board: ws.board }));
@@ -91888,7 +92138,7 @@ function spentBy(runs) {
91888
92138
  }
91889
92139
  function reviewOf2(file2) {
91890
92140
  try {
91891
- const meta = parseFrontmatter(fs25.readFileSync(file2, "utf8")).meta;
92141
+ const meta = parseFrontmatter(fs28.readFileSync(file2, "utf8")).meta;
91892
92142
  return meta ? reviewOf(meta) : null;
91893
92143
  } catch {
91894
92144
  return null;
@@ -91896,8 +92146,8 @@ function reviewOf2(file2) {
91896
92146
  }
91897
92147
  function mcpConfig(servers, file2) {
91898
92148
  if (!Object.keys(servers).length) return null;
91899
- fs25.mkdirSync(path28.dirname(file2), { recursive: true });
91900
- fs25.writeFileSync(file2, `${JSON.stringify({ mcpServers: servers }, null, 2)}
92149
+ fs28.mkdirSync(path30.dirname(file2), { recursive: true });
92150
+ fs28.writeFileSync(file2, `${JSON.stringify({ mcpServers: servers }, null, 2)}
91901
92151
  `);
91902
92152
  return file2;
91903
92153
  }
@@ -91918,21 +92168,25 @@ async function stopRuns(akb, ws, id, since, ms) {
91918
92168
  while (Date.now() < until) {
91919
92169
  const runs = answerOf2(await call(["run", "list", "--card", String(id), "--all", "--json"]))?.runs;
91920
92170
  const live = (runs ?? []).filter((r2) => r2.status === "running" && (r2.startedAt ?? 0) >= since);
91921
- if (!live.length) return;
92171
+ if (!runs) return false;
92172
+ if (!live.length && (runs ?? []).filter((r2) => (r2.startedAt ?? 0) >= since).every((r2) => processesStopped(runMark(r2.sessionId), r2.agentPid && r2.agentStartedAt ? { pid: r2.agentPid, since: r2.agentStartedAt } : void 0))) return true;
91922
92173
  for (const r2 of live) await call(["run", "stop", r2.sessionId]);
91923
92174
  await wait(250);
91924
92175
  }
92176
+ return false;
91925
92177
  }
91926
92178
  var working = /* @__PURE__ */ new Map();
91927
92179
  var workKey = (ws, id) => `${ws.board}#${id}`;
91928
92180
  async function stopLeftBehind(akb, ws, id, ms) {
91929
- if (!working.has(workKey(ws, id))) await stopRuns(akb, ws, id, 0, ms);
92181
+ if (!working.has(workKey(ws, id)) && !await stopRuns(akb, ws, id, 0, ms)) {
92182
+ throw new Error("\u672A\u80FD\u505C\u6B62\u4E0A\u6B21\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5176\u505C\u6B62\u540E\u7EED\u8DD1\u3002");
92183
+ }
91930
92184
  }
91931
92185
  function deliveryEnding(ws, id) {
91932
92186
  if (!id) return null;
91933
92187
  let held4;
91934
92188
  try {
91935
- held4 = JSON.parse(fs25.readFileSync(path28.join(ws.board, "deliveries", `${path28.basename(id)}.json`), "utf8"));
92189
+ held4 = JSON.parse(fs28.readFileSync(path30.join(ws.board, "deliveries", `${path30.basename(id)}.json`), "utf8"));
91936
92190
  } catch {
91937
92191
  return null;
91938
92192
  }
@@ -91944,16 +92198,16 @@ function deliveryEnding(ws, id) {
91944
92198
  return null;
91945
92199
  }
91946
92200
  function checkoutsOf(ws, id) {
91947
- const dir = path28.join(ws.board, "deliveries");
92201
+ const dir = path30.join(ws.board, "deliveries");
91948
92202
  let names2;
91949
92203
  try {
91950
- names2 = fs25.readdirSync(dir).filter((n) => n.endsWith(".json"));
92204
+ names2 = fs28.readdirSync(dir).filter((n) => n.endsWith(".json"));
91951
92205
  } catch {
91952
92206
  return [];
91953
92207
  }
91954
92208
  return names2.flatMap((n) => {
91955
92209
  try {
91956
- const held4 = JSON.parse(fs25.readFileSync(path28.join(dir, n), "utf8"));
92210
+ const held4 = JSON.parse(fs28.readFileSync(path30.join(dir, n), "utf8"));
91957
92211
  return held4.cardId === id && held4.worktree && held4.deliveryId ? [held4.deliveryId] : [];
91958
92212
  } catch {
91959
92213
  return [];
@@ -92007,38 +92261,34 @@ function boardAkb(job, ws, deps, io, task) {
92007
92261
  const at2 = args.includes("--") ? args.indexOf("--") : args.length;
92008
92262
  const full = [...args.slice(0, at2), "--board", ws.board, ...args.slice(at2)];
92009
92263
  const log = show ? logLines(io.show, io.event) : void 0;
92010
- const ran = await runAkb(deps.akb, full, { cwd: ws.cwd, board: ws.board, task, line: job.languageLine ?? "", env: env2, show: log?.push, track: io.track });
92264
+ const ran = await runAkb(deps.akb, full, { cwd: ws.cwd, board: ws.board, task, line: job.languageLine ?? "", env: { ...env2, AI4KANBAN_EXECUTION: JSON.stringify({ job: job.id, machine: deps.machineId }) }, show: log?.push, track: io.track });
92011
92265
  log?.end();
92012
92266
  return ran;
92013
92267
  };
92014
92268
  }
92015
- function skillStale(dir, version) {
92016
- try {
92017
- const text3 = fs25.readFileSync(path28.join(dir, "SKILL.md"), "utf8");
92018
- return !fs25.lstatSync(dir).isSymbolicLink() && /<!-- ai4kanban (\S+) -->\s*$/.exec(text3)?.[1] !== version;
92019
- } catch {
92020
- return true;
92021
- }
92022
- }
92023
92269
  async function setUp(job, ws, deps, io) {
92024
92270
  const akb = boardAkb(job, ws, deps, io);
92025
92271
  const runtime = job.runtime;
92026
92272
  const missing = unavailable(runtime, await deps.runtimes());
92027
92273
  if (missing) return missing;
92028
- if (!fs25.existsSync(path28.join(ws.board, "config.md"))) {
92274
+ if (!fs28.existsSync(path30.join(ws.board, "config.md"))) {
92029
92275
  const init = await akb(["raw", "init"]);
92030
92276
  if (init.code !== 0) return refusal(init);
92031
92277
  }
92032
- if (SKILL_FOLDERS.some((f2) => skillStale(path28.join(ws.cwd, f2), deps.akb.version))) {
92033
- const skill = await runAkb(deps.akb, ["skill", "install", "--dir", ws.cwd], { cwd: ws.cwd, track: io.track });
92034
- if (skill.code !== 0) return refusal(skill);
92278
+ try {
92279
+ prepareKanbanSkill(ws.cwd);
92280
+ } catch (e2) {
92281
+ return e2 instanceof Error ? e2.message : String(e2);
92035
92282
  }
92283
+ const hook = installCommitHook(ws.cwd, ws.board);
92284
+ if (hook.note) io.show(`${hook.note}
92285
+ `);
92036
92286
  const pulled = await pull(ws, deps.machineId);
92037
92287
  if (!pulled.ok) return pulled.error;
92038
92288
  const used = await akb(["agent", "use", runtime]);
92039
92289
  if (used.code !== 0) return refusal(used);
92040
92290
  const servers = mcpServersOf(ws);
92041
- const mcpFile = path28.join(ws.board, ".sync", `${ws.task}.mcp.json`);
92291
+ const mcpFile = path30.join(ws.board, ".sync", `${ws.task}.mcp.json`);
92042
92292
  const takes = new Set(settingKeys(runtime));
92043
92293
  const given = job.settings ?? {};
92044
92294
  const values = { ...given, model: job.model ?? "" };
@@ -92081,13 +92331,13 @@ async function runReview(job, ws, tasks, deps, io) {
92081
92331
  async function reviewRejections(job, ws, deps, io) {
92082
92332
  const workspace = workspaceOf(ws);
92083
92333
  if (!workspace) return { runs: [] };
92084
- const read = await deps.api.readRejections(workspace);
92085
- if (!read.ok) return { runs: [], failure: read.error };
92086
- if (!read.value.tasks.length && !read.value.triage.length) return { runs: [] };
92334
+ const read2 = await deps.api.readRejections(workspace);
92335
+ if (!read2.ok) return { runs: [], failure: read2.error };
92336
+ if (!read2.value.tasks.length && !read2.value.triage.length) return { runs: [] };
92087
92337
  const since = Date.now();
92088
92338
  const akb = boardAkb(job, ws, deps, io);
92089
92339
  return withBoard(ws, async (push2) => {
92090
- const laid = layOut(ws.board, read.value);
92340
+ const laid = layOut(ws.board, read2.value);
92091
92341
  const ran = await akb(["review-dismissals", "--follow", "--events", "--json"], true);
92092
92342
  clearLaid(ws.board);
92093
92343
  resetSorted(ws);
@@ -92106,12 +92356,12 @@ async function learnRejections(job, ws, deps, io) {
92106
92356
  return runs;
92107
92357
  }
92108
92358
  async function scheduledEnv(ws, deps) {
92109
- const read = await deps.api.readAgents(deps.machineId, ws.project);
92110
- if (!read.ok) {
92111
- console.error(`runner: scheduled agents not read: ${read.error}`);
92359
+ const read2 = await deps.api.readAgents(deps.machineId, ws.project);
92360
+ if (!read2.ok) {
92361
+ console.error(`runner: scheduled agents not read: ${read2.error}`);
92112
92362
  return {};
92113
92363
  }
92114
- const names2 = read.value.agents.filter((a3) => a3.workflow).map((a3) => a3.name);
92364
+ const names2 = read2.value.agents.filter((a3) => a3.workflow).map((a3) => a3.name);
92115
92365
  return { [SCHEDULED_AGENTS_ENV]: [...new Set(names2)].join(",") };
92116
92366
  }
92117
92367
  async function runAgent(job, ws, deps, io) {
@@ -92138,19 +92388,19 @@ async function runAgent(job, ws, deps, io) {
92138
92388
  }
92139
92389
  function writeTranscript(job, dir) {
92140
92390
  if (!job.transcript) return "";
92141
- const file2 = path28.join(dir, "discussion.md");
92142
- fs25.mkdirSync(dir, { recursive: true });
92143
- fs25.writeFileSync(file2, `${job.transcript}
92391
+ const file2 = path30.join(dir, "discussion.md");
92392
+ fs28.mkdirSync(dir, { recursive: true });
92393
+ fs28.writeFileSync(file2, `${job.transcript}
92144
92394
  `);
92145
92395
  return file2;
92146
92396
  }
92147
92397
  function pictures(job, ws, id) {
92148
92398
  const dir = cardAssetsDir(ws, id);
92149
92399
  if (!job.attachments.length || !dir) return "";
92150
- fs25.mkdirSync(dir, { recursive: true });
92400
+ fs28.mkdirSync(dir, { recursive: true });
92151
92401
  return job.attachments.map((a3, i) => {
92152
- const file2 = `${i + 1}-${path28.basename(a3.name).replace(/[^\w.-]+/g, "-")}`;
92153
- fs25.writeFileSync(path28.join(dir, file2), Buffer.from(a3.content, "base64"));
92402
+ const file2 = `${i + 1}-${path30.basename(a3.name).replace(/[^\w.-]+/g, "-")}`;
92403
+ fs28.writeFileSync(path30.join(dir, file2), Buffer.from(a3.content, "base64"));
92154
92404
  return `
92155
92405
  <Asset src=".assets/${id}/${file2}" label="${a3.name.replace(/["<>]/g, "") || file2}" />
92156
92406
  `;
@@ -92158,7 +92408,7 @@ function pictures(job, ws, id) {
92158
92408
  }
92159
92409
  function cardFlags(ws, fields) {
92160
92410
  if (!fields) return [];
92161
- const open = (keys) => (keys ?? []).map((k) => Number(/(\d+)$/.exec(k)?.[1])).filter((n) => n > 0 && n !== ws.number && findCard(ws.board, n)?.startsWith(path28.join(ws.board, "todo") + path28.sep));
92411
+ const open = (keys) => (keys ?? []).map((k) => Number(/(\d+)$/.exec(k)?.[1])).filter((n) => n > 0 && n !== ws.number && findCard(ws.board, n)?.startsWith(path30.join(ws.board, "todo") + path30.sep));
92162
92412
  const lists = [["--modules", fields.modules ?? []], ["--related", open(fields.related)], ["--blocked-by", open(fields.blocked_by)]];
92163
92413
  return [
92164
92414
  ...fields.priority ? ["--priority", fields.priority] : [],
@@ -92192,10 +92442,10 @@ async function runFlow(job, ws, deps, io) {
92192
92442
  const placed = await placeDraft(ws, deps.api);
92193
92443
  if (!placed.ok) return fail(placed.error);
92194
92444
  }
92195
- const body = path28.join(ws.board, ".sync", `${ws.task}.request.md`);
92196
- fs25.mkdirSync(path28.dirname(body), { recursive: true });
92445
+ const body = path30.join(ws.board, ".sync", `${ws.task}.request.md`);
92446
+ fs28.mkdirSync(path30.dirname(body), { recursive: true });
92197
92447
  if (!ws.number) return fail("This task has no number yet.");
92198
- fs25.writeFileSync(body, `${said.request || title}
92448
+ fs28.writeFileSync(body, `${said.request || title}
92199
92449
  ${isBuilder(ws) ? `
92200
92450
  ${draftLine(ws)}
92201
92451
  ` : ""}${pictures(job, ws, ws.number)}`);
@@ -92213,7 +92463,7 @@ ${draftLine(ws)}
92213
92463
  ...cardFlags(ws, flow.metadata),
92214
92464
  "--json"
92215
92465
  ]));
92216
- fs25.rmSync(body, { force: true });
92466
+ fs28.rmSync(body, { force: true });
92217
92467
  if (!created.ok) return fail(created.error);
92218
92468
  id = created.value;
92219
92469
  }
@@ -92223,19 +92473,27 @@ ${draftLine(ws)}
92223
92473
  const held4 = working.get(key) ?? 0;
92224
92474
  working.set(key, held4 + 1);
92225
92475
  try {
92226
- if (!held4) await stopRuns(deps.akb, ws, card, 0, deps.stopMs);
92476
+ if (!held4 && !await stopRuns(deps.akb, ws, card, 0, deps.stopMs)) {
92477
+ return fail("\u672A\u80FD\u505C\u6B62\u4E0A\u6B21\u8FD0\u884C\uFF0C\u8BF7\u7B49\u5F85\u5176\u505C\u6B62\u540E\u7EED\u8DD1\u3002");
92478
+ }
92227
92479
  if (io.lost()) return fail("");
92228
92480
  return await workOn(card);
92229
92481
  } finally {
92230
- fs25.rmSync(path28.join(ws.board, ".sync", `${ws.task}.discussion`), { recursive: true, force: true });
92482
+ fs28.rmSync(path30.join(ws.board, ".sync", `${ws.task}.discussion`), { recursive: true, force: true });
92231
92483
  const left = working.get(key) - 1;
92232
92484
  if (left) working.set(key, left);
92233
92485
  else working.delete(key);
92234
92486
  }
92235
92487
  async function workOn(id2) {
92236
- io.onStop(() => stopRuns(deps.akb, ws, id2, since, deps.stopMs));
92488
+ io.onStop(async () => {
92489
+ if (!await stopRuns(deps.akb, ws, id2, since, deps.stopMs)) throw new Error("\u672A\u80FD\u786E\u8BA4\u539F\u6267\u884C\u5DF2\u505C\u6B62\u3002");
92490
+ });
92237
92491
  const verb = flow.verb === "create" ? flow.skip_plan ? "implement" : "refine" : flow.verb;
92238
92492
  const text3 = flow.verb === "create" ? "" : (flow.text ?? "").trim();
92493
+ if (flow.resume && verb === "refine") {
92494
+ const review2 = reviewOf2(cardFile(ws));
92495
+ if (review2) return { ok: true, report: { card: id2, ...review2 === true ? {} : { review: review2 } } };
92496
+ }
92239
92497
  if (verb === "revise" && !text3) return fail("Say what to change.");
92240
92498
  let note = verb === "resolve" || verb === "revise" ? text3 : "";
92241
92499
  if (verb === "implement" && flow.resume) {
@@ -92281,26 +92539,73 @@ ${draftLine(ws)}
92281
92539
  }
92282
92540
  function carryArgs(verb) {
92283
92541
  if (!["refine", "resolve", "revise", "implement"].includes(verb)) return [];
92284
- const transcript = writeTranscript(job, path28.join(ws.board, ".sync", `${ws.task}.discussion`));
92542
+ const transcript = writeTranscript(job, path30.join(ws.board, ".sync", `${ws.task}.discussion`));
92285
92543
  return [
92286
92544
  ...job.resume ? ["--session", job.resume, ...job.fork ? ["--fork"] : []] : [],
92287
92545
  ...transcript ? ["--transcript", transcript] : []
92288
92546
  ];
92289
92547
  }
92290
92548
  }
92549
+ async function confirmFlowStopped(ws, job, deps) {
92550
+ const id = akbCardOf(ws) ?? job.number;
92551
+ if (!id) return false;
92552
+ const ran = await runAkb(deps.akb, ["run", "list", "--card", String(id), "--all", "--json", "--board", ws.board], { cwd: ws.cwd, board: ws.board });
92553
+ const runs = answerOf2(ran)?.runs;
92554
+ return !!runs && runs.every((r2) => r2.status !== "running" && processesStopped(
92555
+ runMark(r2.sessionId),
92556
+ r2.agentPid && r2.agentStartedAt ? { pid: r2.agentPid, since: r2.agentStartedAt } : void 0
92557
+ ));
92558
+ }
92559
+
92560
+ // src/recovery.ts
92561
+ import fs29 from "node:fs";
92562
+ import path31 from "node:path";
92563
+ var PREPARE_REASON = "Runner update prepare.";
92564
+ var UPDATE_REASON = "Runner update checkpoint.";
92565
+ var UNCERTAIN = "\u66F4\u65B0\u4E2D\u65AD\u65F6\u6709\u64CD\u4F5C\u7ED3\u679C\u5C1A\u672A\u786E\u8BA4\uFF0C\u8BF7\u68C0\u67E5\u5DF2\u6709\u7ED3\u679C\u540E\u518D\u7EED\u8DD1\u3002";
92566
+ var fileOf = (id) => path31.join(runnerHome(), "checkpoints", `${encodeURIComponent(id)}.json`);
92567
+ function readCheckpoint(id) {
92568
+ try {
92569
+ const held4 = JSON.parse(fs29.readFileSync(fileOf(id), "utf8"));
92570
+ if (!held4 || !Array.isArray(held4.pending) || !held4.pending.every((id2) => typeof id2 === "string")) throw new Error("\u8FDB\u5EA6\u683C\u5F0F\u9519\u8BEF");
92571
+ return held4;
92572
+ } catch (e2) {
92573
+ if (e2.code === "ENOENT") return null;
92574
+ return { updating: true, started: true, pending: ["unknown"] };
92575
+ }
92576
+ }
92577
+ function saveCheckpoint(id, checkpoint) {
92578
+ const file2 = fileOf(id);
92579
+ fs29.mkdirSync(path31.dirname(file2), { recursive: true, mode: 448 });
92580
+ fs29.writeFileSync(`${file2}.tmp`, JSON.stringify(checkpoint), { mode: 384 });
92581
+ fs29.renameSync(`${file2}.tmp`, file2);
92582
+ }
92583
+ function clearCheckpoint(id) {
92584
+ fs29.rmSync(fileOf(id), { force: true });
92585
+ }
92586
+ function checkpointEvent(checkpoint, event2) {
92587
+ if (event2.kind === "tool_call") {
92588
+ const { toolCallId, status: status2, kind } = event2.data;
92589
+ if (["completed", "failed"].includes(status2)) checkpoint.pending = checkpoint.pending.filter((id) => id !== toolCallId);
92590
+ if (!["read", "search", "fetch"].includes(kind) && !["completed", "failed"].includes(status2) && !checkpoint.pending.includes(toolCallId)) checkpoint.pending.push(toolCallId);
92591
+ }
92592
+ if (event2.kind === "tool_call_update" && ["completed", "failed"].includes(event2.data.status)) {
92593
+ checkpoint.pending = checkpoint.pending.filter((id) => id !== event2.data.toolCallId);
92594
+ }
92595
+ }
92291
92596
 
92292
92597
  // src/lock.ts
92293
92598
  import crypto4 from "node:crypto";
92294
- import fs26 from "node:fs";
92599
+ import fs30 from "node:fs";
92295
92600
  import net from "node:net";
92296
- import path29 from "node:path";
92601
+ import path32 from "node:path";
92297
92602
  var RETRY_MS = 5e3;
92298
92603
  var KIND_MS = 1e3;
92299
92604
  var HOLDERS = ["claude-code", "codex", "terminal"];
92300
92605
  function lockPath() {
92301
92606
  const home4 = runnerHome();
92302
92607
  if (process.platform === "win32") return `\\\\.\\pipe\\wildcrane-${crypto4.createHash("sha256").update(home4).digest("hex").slice(0, 16)}`;
92303
- return path29.join(home4, "runner.sock");
92608
+ return path32.join(home4, "runner.sock");
92304
92609
  }
92305
92610
  function holdMachine(kind, onHeld, onWaiting) {
92306
92611
  const where = lockPath();
@@ -92315,7 +92620,7 @@ function holdMachine(kind, onHeld, onWaiting) {
92315
92620
  const attempt = () => {
92316
92621
  timer = null;
92317
92622
  if (closed) return;
92318
- if (process.platform !== "win32") fs26.mkdirSync(path29.dirname(where), { recursive: true, mode: 448 });
92623
+ if (process.platform !== "win32") fs30.mkdirSync(path32.dirname(where), { recursive: true, mode: 448 });
92319
92624
  const s = net.createServer((peer) => {
92320
92625
  peers.add(peer);
92321
92626
  peer.on("error", () => {
@@ -92363,7 +92668,7 @@ function holdMachine(kind, onHeld, onWaiting) {
92363
92668
  later(0);
92364
92669
  });
92365
92670
  removeIfStill.once("error", () => {
92366
- fs26.rmSync(where, { force: true });
92671
+ fs30.rmSync(where, { force: true });
92367
92672
  later(50 + Math.random() * 200);
92368
92673
  });
92369
92674
  return;
@@ -92391,33 +92696,140 @@ function holdMachine(kind, onHeld, onWaiting) {
92391
92696
  };
92392
92697
  }
92393
92698
 
92699
+ // src/handoff.ts
92700
+ import crypto5 from "node:crypto";
92701
+ import fs31 from "node:fs";
92702
+ import path33 from "node:path";
92703
+ import { execFileSync } from "node:child_process";
92704
+ var digest = (value) => crypto5.createHash("sha256").update(value).digest("hex");
92705
+ var git3 = (cwd, ...args) => execFileSync("git", ["-C", cwd, ...args], { encoding: "utf8", timeout: 15e3, maxBuffer: 16 * 1024 * 1024, stdio: ["ignore", "pipe", "ignore"] });
92706
+ function authorizedFolder(folder) {
92707
+ if (!folder) return null;
92708
+ try {
92709
+ const real = fs31.realpathSync(folder);
92710
+ return allowedProjects().some((root) => real === root || real.startsWith(root + path33.sep)) ? real : null;
92711
+ } catch {
92712
+ return null;
92713
+ }
92714
+ }
92715
+ function progressFolder(job, folder) {
92716
+ const token = job.handoff?.progressIsolation;
92717
+ if (!token) return folder;
92718
+ if (!/^[a-zA-Z0-9-]{1,80}$/.test(token)) return null;
92719
+ try {
92720
+ const dir = fs31.realpathSync(path33.join(folder, ".akb", "handoffs", token));
92721
+ if (!dir.startsWith(fs31.realpathSync(folder) + path33.sep)) return null;
92722
+ const marker = JSON.parse(fs31.readFileSync(path33.join(dir, ".akb", "handoff.json"), "utf8"));
92723
+ return marker.task === job.task && marker.isolation === token ? dir : null;
92724
+ } catch {
92725
+ return null;
92726
+ }
92727
+ }
92728
+ function progressEvidence(job, folder) {
92729
+ try {
92730
+ const board = path33.join(folder, ".akb", "kanban");
92731
+ const deliveries = path33.join(board, "deliveries");
92732
+ const rows = fs31.readdirSync(deliveries).filter((name) => name.endsWith(".json")).map((name) => JSON.parse(fs31.readFileSync(path33.join(deliveries, name), "utf8"))).filter((row2) => row2.cardId === job.number).sort((a3, b2) => (b2.startedAt ?? 0) - (a3.startedAt ?? 0));
92733
+ const row = rows[0];
92734
+ if (!row?.deliveryId || !row.base || !row.branch || !row.worktree || row.commitMode !== "auto") return null;
92735
+ const tree = fs31.realpathSync(path33.resolve(folder, row.worktree));
92736
+ if (!tree.startsWith(fs31.realpathSync(folder) + path33.sep)) return null;
92737
+ if (git3(tree, "rev-parse", "--show-toplevel").trim() !== tree) return null;
92738
+ if (git3(tree, "branch", "--show-current").trim() !== row.branch) return null;
92739
+ git3(tree, "cat-file", "-e", `${row.base}^{commit}`);
92740
+ const changed = git3(tree, "ls-files", "-z", "--cached", "--others", "--exclude-standard").split("\0").filter(Boolean).sort();
92741
+ const files = changed.map((name) => {
92742
+ const file2 = path33.join(tree, name);
92743
+ try {
92744
+ const stat = fs31.lstatSync(file2);
92745
+ if (stat.isSymbolicLink()) return [name, "link", digest(fs31.readlinkSync(file2))];
92746
+ if (!stat.isFile()) throw new Error("\u65E0\u6CD5\u9A8C\u8BC1\u6587\u4EF6\u7C7B\u578B");
92747
+ return [name, stat.mode & 511, digest(fs31.readFileSync(file2))];
92748
+ } catch (e2) {
92749
+ if (e2.code === "ENOENT") return [name, "deleted"];
92750
+ throw e2;
92751
+ }
92752
+ });
92753
+ return digest(JSON.stringify({
92754
+ task: job.task,
92755
+ number: job.number,
92756
+ verb: job.flow?.verb,
92757
+ delivery: row.deliveryId,
92758
+ record: digest(JSON.stringify(row)),
92759
+ base: row.base,
92760
+ branch: row.branch,
92761
+ head: git3(tree, "rev-parse", "HEAD").trim(),
92762
+ index: digest(git3(tree, "diff", "--cached", "--binary")),
92763
+ files
92764
+ }));
92765
+ } catch {
92766
+ return null;
92767
+ }
92768
+ }
92769
+ function checkProgress(job) {
92770
+ const folder = authorizedFolder(job.projectDir);
92771
+ if (!folder) return { handoffIssue: "folder_unavailable" };
92772
+ if (!job.handoff?.started) return {};
92773
+ const progress = progressFolder(job, folder);
92774
+ if (!progress) return { handoffIssue: "progress_missing" };
92775
+ const evidence = progressEvidence({ ...job, flow: { verb: job.handoff.verb ?? "implement", workflow: job.workflow ?? "" } }, progress);
92776
+ if (!evidence) return { handoffIssue: "progress_missing" };
92777
+ if (!job.handoff.evidence || evidence !== job.handoff.evidence) return { handoffIssue: "progress_unknown", evidence };
92778
+ return { evidence };
92779
+ }
92780
+ function restartFolder(job, folder) {
92781
+ const token = job.handoff?.isolation ?? job.id;
92782
+ if (!/^[a-zA-Z0-9-]{1,80}$/.test(token)) throw new Error("\u9694\u79BB\u76EE\u5F55\u7F16\u53F7\u65E0\u6548\u3002");
92783
+ const dir = path33.join(folder, ".akb", "handoffs", token);
92784
+ const marker = path33.join(dir, ".akb", "handoff.json");
92785
+ for (const parent of [path33.join(folder, ".akb"), path33.dirname(dir), dir]) {
92786
+ if (fs31.lstatSync(parent, { throwIfNoEntry: false })?.isSymbolicLink()) throw new Error("\u9694\u79BB\u76EE\u5F55\u4E0D\u80FD\u901A\u8FC7\u7B26\u53F7\u94FE\u63A5\u521B\u5EFA\u3002");
92787
+ }
92788
+ if (fs31.existsSync(dir)) {
92789
+ if (job.handoff?.recovering) {
92790
+ try {
92791
+ const saved = JSON.parse(fs31.readFileSync(marker, "utf8"));
92792
+ if (saved.task === job.task && saved.isolation === token && git3(dir, "rev-parse", "--show-toplevel").trim() === fs31.realpathSync(dir)) return dir;
92793
+ } catch {
92794
+ }
92795
+ }
92796
+ throw new Error("\u91CD\u542F\u76EE\u5F55\u5DF2\u5B58\u5728\uFF0C\u8BF7\u91CD\u65B0\u68C0\u67E5\u3002");
92797
+ }
92798
+ fs31.mkdirSync(path33.dirname(dir), { recursive: true });
92799
+ git3(folder, "worktree", "add", "--detach", dir, "HEAD");
92800
+ if (fs31.lstatSync(path33.dirname(marker), { throwIfNoEntry: false })?.isSymbolicLink()) throw new Error("\u9694\u79BB\u6807\u8BB0\u76EE\u5F55\u65E0\u6548\u3002");
92801
+ fs31.mkdirSync(path33.dirname(marker), { recursive: true });
92802
+ fs31.writeFileSync(marker, JSON.stringify({ task: job.task, isolation: token }), { flag: "wx" });
92803
+ return dir;
92804
+ }
92805
+
92394
92806
  // src/jobs.ts
92395
92807
  import { spawn as spawn4 } from "node:child_process";
92396
- import fs29 from "node:fs";
92397
- import path32 from "node:path";
92808
+ import fs34 from "node:fs";
92809
+ import path36 from "node:path";
92398
92810
 
92399
92811
  // ../cli/src/lib/agent/catalog.ts
92400
- import fs27 from "node:fs";
92401
- import path30 from "node:path";
92812
+ import fs32 from "node:fs";
92813
+ import path34 from "node:path";
92402
92814
  var CATALOGUE = "https://models.dev/api.json";
92403
92815
  var FRESH_FOR_MS = 24 * 60 * 6e4;
92404
92816
  var ANSWER_BY_MS = 2e4;
92405
92817
  function cacheFile() {
92406
- return path30.join(machineHome(), "models-dev.json");
92818
+ return path34.join(machineHome(), "models-dev.json");
92407
92819
  }
92408
92820
  var held2;
92409
92821
  function readCache() {
92410
92822
  const file2 = cacheFile();
92411
92823
  let stamp2;
92412
92824
  try {
92413
- const stat = fs27.statSync(file2);
92825
+ const stat = fs32.statSync(file2);
92414
92826
  stamp2 = `${stat.mtimeMs}:${stat.size}`;
92415
92827
  } catch {
92416
92828
  return void 0;
92417
92829
  }
92418
92830
  if (held2?.stamp === stamp2) return held2.cached;
92419
92831
  try {
92420
- const data = JSON.parse(fs27.readFileSync(file2, "utf8"));
92832
+ const data = JSON.parse(fs32.readFileSync(file2, "utf8"));
92421
92833
  if (!data || typeof data.limits !== "object" || !data.limits) return void 0;
92422
92834
  const cached2 = {
92423
92835
  fetchedAt: typeof data.fetchedAt === "number" ? data.fetchedAt : 0,
@@ -92456,8 +92868,8 @@ function refreshCatalog() {
92456
92868
  const limits = limitsIn(await answer.json());
92457
92869
  if (Object.keys(limits).length === 0) return;
92458
92870
  const file2 = cacheFile();
92459
- fs27.mkdirSync(path30.dirname(file2), { recursive: true });
92460
- fs27.writeFileSync(file2, JSON.stringify({ fetchedAt: Date.now(), limits }));
92871
+ fs32.mkdirSync(path34.dirname(file2), { recursive: true });
92872
+ fs32.writeFileSync(file2, JSON.stringify({ fetchedAt: Date.now(), limits }));
92461
92873
  } catch {
92462
92874
  }
92463
92875
  })();
@@ -92501,9 +92913,9 @@ function contextLimit(harness, model) {
92501
92913
  }
92502
92914
 
92503
92915
  // src/ideas.ts
92504
- import fs28 from "node:fs";
92505
- import path31 from "node:path";
92506
- var ideasFileOf = (job) => path31.join(runnerHome(), "ideas", `${job.id}.json`);
92916
+ import fs33 from "node:fs";
92917
+ import path35 from "node:path";
92918
+ var ideasFileOf = (job) => path35.join(runnerHome(), "ideas", `${job.id}.json`);
92507
92919
  async function writeIdeas(job, list) {
92508
92920
  const workflows = [];
92509
92921
  let after = null;
@@ -92514,18 +92926,18 @@ async function writeIdeas(job, list) {
92514
92926
  after = page.value.next;
92515
92927
  } while (after);
92516
92928
  const file2 = ideasFileOf(job);
92517
- fs28.mkdirSync(path31.dirname(file2), { recursive: true });
92518
- fs28.writeFileSync(file2, `${JSON.stringify({ workflows, ideas: job.discussion.ideas }, null, 2)}
92929
+ fs33.mkdirSync(path35.dirname(file2), { recursive: true });
92930
+ fs33.writeFileSync(file2, `${JSON.stringify({ workflows, ideas: job.discussion.ideas }, null, 2)}
92519
92931
  `);
92520
92932
  return { file: file2 };
92521
92933
  }
92522
92934
  function readIdeas(file2) {
92523
92935
  try {
92524
- return JSON.parse(fs28.readFileSync(file2, "utf8")).ideas;
92936
+ return JSON.parse(fs33.readFileSync(file2, "utf8")).ideas;
92525
92937
  } catch {
92526
92938
  return void 0;
92527
92939
  } finally {
92528
- fs28.rmSync(file2, { force: true });
92940
+ fs33.rmSync(file2, { force: true });
92529
92941
  }
92530
92942
  }
92531
92943
 
@@ -92561,32 +92973,32 @@ var defaultDeps = (machineId2) => ({
92561
92973
  akb: currentAkb,
92562
92974
  runtimes: detectRuntimes
92563
92975
  });
92564
- var ownFolder = () => path32.join(runnerHome(), "work");
92976
+ var ownFolder = () => path36.join(runnerHome(), "work");
92565
92977
  function folderFor(job) {
92566
92978
  if (!job.projectDir) {
92567
- const cwd = path32.join(ownFolder(), job.id);
92568
- fs29.mkdirSync(cwd, { recursive: true });
92979
+ const cwd = path36.join(ownFolder(), job.id);
92980
+ fs34.mkdirSync(cwd, { recursive: true });
92569
92981
  return { cwd };
92570
92982
  }
92571
92983
  const real = realpath4(job.projectDir);
92572
- if (real && allowedProjects().some((root) => real === root || real.startsWith(root + path32.sep))) return { cwd: real };
92984
+ if (real && allowedProjects().some((root) => real === root || real.startsWith(root + path36.sep))) return { cwd: real };
92573
92985
  return { refused: `This Runner is not allowed to work in ${job.projectDir}.` };
92574
92986
  }
92575
92987
  function realpath4(p2) {
92576
92988
  try {
92577
- return fs29.realpathSync(p2);
92989
+ return fs34.realpathSync(p2);
92578
92990
  } catch {
92579
92991
  return null;
92580
92992
  }
92581
92993
  }
92582
- var attachmentsOf = (job) => path32.join(runnerHome(), "attachments", job.id);
92994
+ var attachmentsOf = (job) => path36.join(runnerHome(), "attachments", job.id);
92583
92995
  function writeAttachments(job) {
92584
92996
  if (!job.attachments.length) return "";
92585
92997
  const dir = attachmentsOf(job);
92586
- fs29.mkdirSync(dir, { recursive: true });
92998
+ fs34.mkdirSync(dir, { recursive: true });
92587
92999
  const files = job.attachments.map((a3) => {
92588
- const file2 = path32.join(dir, path32.basename(a3.name));
92589
- fs29.writeFileSync(file2, Buffer.from(a3.content, "base64"));
93000
+ const file2 = path36.join(dir, path36.basename(a3.name));
93001
+ fs34.writeFileSync(file2, Buffer.from(a3.content, "base64"));
92590
93002
  return file2;
92591
93003
  });
92592
93004
  return `
@@ -92615,8 +93027,10 @@ function toWire(events, first) {
92615
93027
  endLog();
92616
93028
  return out;
92617
93029
  }
93030
+ var leaseNow = () => ({ at: Date.now(), monotonic: performance.now() });
92618
93031
  function streamOut(deps, id, lease) {
92619
93032
  const wire = [];
93033
+ let firstSeq = null;
92620
93034
  let pending = [];
92621
93035
  let size = 0;
92622
93036
  let lost = false;
@@ -92628,10 +93042,18 @@ function streamOut(deps, id, lease) {
92628
93042
  };
92629
93043
  const stored = new Promise((resolve2) => ended2 = resolve2);
92630
93044
  const children = /* @__PURE__ */ new Set();
93045
+ const groups = /* @__PURE__ */ new Set();
93046
+ let stopConfirmed = true;
93047
+ const killed = /* @__PURE__ */ new Set();
92631
93048
  const kill = (child) => {
92632
93049
  if (!child.pid) return;
92633
- child.kill("SIGTERM");
92634
- setTimeout(() => child.kill("SIGKILL"), KILL_GRACE_MS).unref();
93050
+ const exited = new Promise((resolve2) => child.once("close", () => resolve2()));
93051
+ killed.add(exited);
93052
+ void exited.then(() => killed.delete(exited));
93053
+ signalTree(child, "SIGTERM");
93054
+ const timer = setTimeout(() => signalTree(child, "SIGKILL"), KILL_GRACE_MS);
93055
+ timer.unref();
93056
+ void exited.then(() => clearTimeout(timer));
92635
93057
  };
92636
93058
  let halt = null;
92637
93059
  let stopping = Promise.resolve();
@@ -92644,17 +93066,28 @@ function streamOut(deps, id, lease) {
92644
93066
  if (asked || lost) return;
92645
93067
  asked = true;
92646
93068
  for (const child of children) kill(child);
92647
- if (halt) stopping = halt();
93069
+ if (halt) stopping = halt().catch(() => {
93070
+ stopConfirmed = false;
93071
+ });
92648
93072
  onAsked();
92649
93073
  };
92650
93074
  const loseLease = () => {
92651
93075
  if (lost) return stopping;
92652
93076
  lost = true;
93077
+ lease.lost = true;
92653
93078
  for (const child of children) kill(child);
92654
- if (halt) stopping = halt();
93079
+ stopping = Promise.all([halt?.(), ...killed]).then(() => {
93080
+ }).catch(() => {
93081
+ stopConfirmed = false;
93082
+ });
92655
93083
  return stopping;
92656
93084
  };
93085
+ const valid = () => {
93086
+ if (!held3(deps, lease)) void loseLease();
93087
+ return !lost;
93088
+ };
92657
93089
  const send3 = () => {
93090
+ if (!valid()) return;
92658
93091
  const ws = log.ws;
92659
93092
  if (!ws || ws.readyState !== WebSocket.OPEN || log.after === null) return;
92660
93093
  const after = log.after;
@@ -92678,15 +93111,17 @@ function streamOut(deps, id, lease) {
92678
93111
  };
92679
93112
  const flush = () => {
92680
93113
  flushedAt = Date.now();
92681
- if (pending.length) wire.push(...toWire(pending, wire.length));
92682
- pending = [];
93114
+ if (firstSeq !== null && pending.length) {
93115
+ wire.push(...toWire(pending, firstSeq + wire.length));
93116
+ pending = [];
93117
+ }
92683
93118
  size = 0;
92684
93119
  send3();
92685
93120
  };
92686
93121
  const connect2 = async () => {
92687
93122
  log.retry = void 0;
92688
93123
  const ws = await deps.api.openLog(deps.machineId, id).catch(() => null);
92689
- if (closed) return ws?.close();
93124
+ if (closed || !valid()) return ws?.close();
92690
93125
  if (!ws) return reconnect();
92691
93126
  log.ws = ws;
92692
93127
  log.heard = Date.now();
@@ -92701,6 +93136,7 @@ function streamOut(deps, id, lease) {
92701
93136
  if (said.type === "hello") {
92702
93137
  log.tries = 0;
92703
93138
  log.after = Number.isInteger(said.after) ? said.after : -1;
93139
+ firstSeq ??= log.after + 1;
92704
93140
  log.watched = said.watched === true;
92705
93141
  flush();
92706
93142
  } else if (said.type === "watched") {
@@ -92725,6 +93161,7 @@ function streamOut(deps, id, lease) {
92725
93161
  };
92726
93162
  void connect2();
92727
93163
  const event2 = (e2) => {
93164
+ if (!valid()) return;
92728
93165
  if (e2.kind === "message") messages.push(e2.data.text);
92729
93166
  pending.push(e2);
92730
93167
  size += JSON.stringify(e2.data).length;
@@ -92740,13 +93177,21 @@ function streamOut(deps, id, lease) {
92740
93177
  drop(ws);
92741
93178
  ws.close();
92742
93179
  }, deps.logPingMs);
93180
+ const expiry = setInterval(valid, Math.min(1e3, deps.leaseMs));
93181
+ let renewing = false;
92743
93182
  const renewer = setInterval(async () => {
92744
- const renewed = await deps.api.renewJob(deps.machineId, id);
93183
+ if (renewing || !valid()) return;
93184
+ renewing = true;
93185
+ const requestedAt = leaseNow();
93186
+ const renewed = await deps.api.renewJob(deps.machineId, id).catch(() => null).finally(() => {
93187
+ renewing = false;
93188
+ });
93189
+ if (!valid() || closed || !renewed) return;
92745
93190
  if (renewed.ok && !renewed.value.renewed) return void loseLease();
92746
93191
  if (!renewed.ok) return;
92747
- lease.at = Date.now();
93192
+ Object.assign(lease, requestedAt);
92748
93193
  if (renewed.value.stop) ask();
92749
- if (log.ws?.readyState === WebSocket.OPEN) log.ws.send(JSON.stringify({ type: "alive" }));
93194
+ if (!ending && log.ws?.readyState === WebSocket.OPEN) log.ws.send(JSON.stringify({ type: "alive" }));
92750
93195
  }, deps.renewMs);
92751
93196
  return {
92752
93197
  event: event2,
@@ -92754,18 +93199,40 @@ function streamOut(deps, id, lease) {
92754
93199
  if (text3) event2({ kind: "log", data: { text: text3 } });
92755
93200
  },
92756
93201
  adopt: (child) => {
92757
- if (lost || asked) return kill(child);
93202
+ if (child.pid) groups.add(child.pid);
93203
+ if (!valid() || asked) return kill(child);
92758
93204
  children.add(child);
92759
93205
  child.on("close", () => children.delete(child));
92760
93206
  },
92761
93207
  onStop: (stop2) => {
92762
93208
  halt = stop2;
92763
- if (lost || asked) stopping = stop2();
93209
+ if (lost || asked) stopping = stop2().catch(() => {
93210
+ stopConfirmed = false;
93211
+ });
92764
93212
  },
92765
93213
  /** What stopping the job's board runs is still doing. */
92766
93214
  halted: () => stopping,
93215
+ confirmed: async () => {
93216
+ await stopping;
93217
+ if (!stopConfirmed) return false;
93218
+ const until = Date.now() + deps.stopMs;
93219
+ const alive2 = (pid) => {
93220
+ try {
93221
+ process.kill(-pid, 0);
93222
+ return true;
93223
+ } catch (e2) {
93224
+ return e2.code !== "ESRCH";
93225
+ }
93226
+ };
93227
+ if (process.platform === "win32") return children.size === 0;
93228
+ while ([...groups].some(alive2)) {
93229
+ if (Date.now() >= until) return false;
93230
+ await new Promise((resolve2) => setTimeout(resolve2, 50));
93231
+ }
93232
+ return true;
93233
+ },
92767
93234
  stop: loseLease,
92768
- lost: () => lost,
93235
+ lost: () => !valid(),
92769
93236
  asked: () => asked,
92770
93237
  whenAsked: askedOnce,
92771
93238
  /** The agent's messages so far. */
@@ -92775,6 +93242,7 @@ function streamOut(deps, id, lease) {
92775
93242
  clearInterval(flusher);
92776
93243
  clearInterval(pinger);
92777
93244
  clearInterval(renewer);
93245
+ clearInterval(expiry);
92778
93246
  ending = !lost;
92779
93247
  flush();
92780
93248
  if (ending) {
@@ -92787,27 +93255,68 @@ function streamOut(deps, id, lease) {
92787
93255
  const ws = log.ws;
92788
93256
  log.ws = null;
92789
93257
  ws?.close();
93258
+ await stopping;
92790
93259
  }
92791
93260
  };
92792
93261
  }
92793
93262
  async function runJob(id, deps, track = () => {
92794
- }) {
93263
+ }, stopped2 = () => false) {
93264
+ const lease = leaseNow();
92795
93265
  const claim = await deps.api.claimJob(deps.machineId, id);
92796
- if (!claim.ok || !claim.value.claimed) return;
93266
+ if (!claim.ok || !claim.value.claimed || stopped2() || !held3(deps, lease)) return;
92797
93267
  const job = claim.value.job;
92798
- const held4 = [];
93268
+ const releases = [];
92799
93269
  try {
92800
- await runClaimed(job, { ...deps, akb: deps.akb() }, track, (dir) => held4.push(hold(dir)));
93270
+ await runClaimed(job, { ...deps, akb: deps.akb() }, track, (dir) => releases.push(hold(dir)), lease);
92801
93271
  } finally {
92802
- for (const release2 of held4) release2();
92803
- fs29.rmSync(attachmentsOf(job), { recursive: true, force: true });
93272
+ for (const release2 of releases) release2();
93273
+ fs34.rmSync(attachmentsOf(job), { recursive: true, force: true });
92804
93274
  }
92805
93275
  }
92806
- async function runClaimed(job, deps, track, keep2) {
93276
+ async function runClaimed(job, deps, track, keep2, lease) {
92807
93277
  const id = job.id;
93278
+ const checkpoint = readCheckpoint(id) ?? { pending: [] };
93279
+ const recovering = checkpoint.updating === true;
93280
+ const persist = () => {
93281
+ checkpoint.updating ||= readCheckpoint(id)?.updating;
93282
+ saveCheckpoint(id, checkpoint);
93283
+ };
93284
+ if (recovering && !checkpoint.completed && (checkpoint.pending.length || checkpoint.opaque || !job.flow && checkpoint.started && !checkpoint.session)) {
93285
+ await deps.api.finishJob(deps.machineId, id, "failed", UNCERTAIN);
93286
+ return;
93287
+ }
93288
+ if (recovering && checkpoint.session) job = { ...job, resume: checkpoint.session, fork: false };
93289
+ if (!recovering) persist();
93290
+ if (job.handoff?.kind === "check") {
93291
+ const runtime = (await deps.runtimes()).find((r2) => r2.name === job.runtime);
93292
+ const report2 = !runtime?.installed || runtime.loggedIn === false ? { handoffIssue: "runtime_unavailable" } : checkProgress(job);
93293
+ return finish(deps, id, lease, "done", "", report2);
93294
+ }
93295
+ if (job.handoff?.kind === "execution") {
93296
+ if (recovering) job = { ...job, handoff: { ...job.handoff, recovering: true } };
93297
+ const handoff = job.handoff;
93298
+ const runtime = (await deps.runtimes()).find((r2) => r2.name === job.runtime);
93299
+ if (!runtime?.installed || runtime.loggedIn === false) return finish(deps, id, lease, "failed", "\u76EE\u6807\u8FD0\u884C\u5DE5\u5177\u5DF2\u4E0D\u53EF\u7528\uFF0C\u8BF7\u91CD\u65B0\u68C0\u67E5\u3002");
93300
+ const folder2 = authorizedFolder(job.projectDir);
93301
+ if (!folder2) return finish(deps, id, lease, "failed", "\u76EE\u6807\u76EE\u5F55\u6388\u6743\u5DF2\u53D8\u5316\u3002");
93302
+ if (handoff.action === "continue") {
93303
+ const progress = progressFolder(job, folder2);
93304
+ if (!progress || !handoff.recovering && (!handoff.evidence || progressEvidence({ ...job, flow: job.flow ? { ...job.flow, verb: handoff.verb ?? job.flow.verb } : job.flow }, progress) !== handoff.evidence)) {
93305
+ return finish(deps, id, lease, "failed", "\u672C\u5730\u8FDB\u5EA6\u5DF2\u53D8\u5316\uFF0C\u8BF7\u91CD\u65B0\u68C0\u67E5\u3002");
93306
+ }
93307
+ job = { ...job, projectDir: progress };
93308
+ }
93309
+ if (handoff.action === "restart") {
93310
+ try {
93311
+ job = { ...job, projectDir: restartFolder(job, folder2), resume: null, fork: false };
93312
+ } catch {
93313
+ return finish(deps, id, lease, "failed", "\u65E0\u6CD5\u51C6\u5907\u65B0\u9694\u79BB\u76EE\u5F55\uFF0C\u5DF2\u6709\u6587\u4EF6\u5DF2\u4FDD\u7559\u3002");
93314
+ }
93315
+ }
93316
+ }
92808
93317
  if (job.secret) return runSecret(job, deps);
92809
93318
  if (job.test) return runTest(job, deps);
92810
- if (job.agent) return runAgentJob(job, deps, track, keep2);
93319
+ if (job.agent) return runAgentJob(job, deps, track, keep2, lease, checkpoint, persist);
92811
93320
  const task = job.task ?? job.review?.tasks[0] ?? null;
92812
93321
  const folder = task && !job.projectDir ? null : folderFor(job);
92813
93322
  if (folder && "refused" in folder) {
@@ -92818,6 +93327,7 @@ async function runClaimed(job, deps, track, keep2) {
92818
93327
  let cwd = folder?.cwd ?? "";
92819
93328
  let run2 = null;
92820
93329
  let fresh = null;
93330
+ let missingSessionOnly = false;
92821
93331
  let ideas = null;
92822
93332
  let discussed;
92823
93333
  try {
@@ -92830,6 +93340,11 @@ async function runClaimed(job, deps, track, keep2) {
92830
93340
  if (!pulled.ok) throw new Error(pulled.error);
92831
93341
  }
92832
93342
  }
93343
+ if (checkpoint.completed) {
93344
+ const done = checkpoint.completed;
93345
+ if (done.outcome === "failed" || !ws) return finish(deps, id, lease, done.outcome, done.reason, done.report);
93346
+ return sendBack(deps, id, lease, ws, done.report, () => keepChat(job, done.report.reply));
93347
+ }
92833
93348
  if (job.flow && !ws) throw new Error("This job names no task.");
92834
93349
  if (job.discussion && job.projectDir && folder) {
92835
93350
  const board = openDiscussionFolder(job, folder.cwd);
@@ -92839,7 +93354,7 @@ async function runClaimed(job, deps, track, keep2) {
92839
93354
  discussed = board.board;
92840
93355
  }
92841
93356
  if (job.discussion) {
92842
- const wrote = await writeIdeas({ ...job, discussion: job.discussion }, deps.api.listWorkflows);
93357
+ const wrote = recovering && fs34.existsSync(ideasFileOf(job)) ? { file: ideasFileOf(job) } : await writeIdeas({ ...job, discussion: job.discussion }, deps.api.listWorkflows);
92843
93358
  if ("error" in wrote) throw new Error(wrote.error);
92844
93359
  ideas = wrote.file;
92845
93360
  }
@@ -92852,11 +93367,12 @@ async function runClaimed(job, deps, track, keep2) {
92852
93367
  This task came out of a discussion. Read it for what the card leaves out: ${file2}` : "";
92853
93368
  const promptOf = (said2) => {
92854
93369
  const lines = (head2 + said2).trim();
93370
+ const prompt = recovering && checkpoint.started ? "Runner \u66F4\u65B0\u540E\u7EE7\u7EED\u4E4B\u524D\u4E2D\u65AD\u7684\u4EFB\u52A1\u3002\u5148\u6838\u5BF9\u5DF2\u6709\u8FDB\u5EA6\u548C\u7ED3\u679C\uFF0C\u4FDD\u7559\u5B8C\u6210\u7684\u5DE5\u4F5C\uFF0C\u4E0D\u8981\u91CD\u590D\u5DF2\u7ECF\u6267\u884C\u7684\u64CD\u4F5C\u3002" : job.prompt;
92855
93371
  return lines ? `${lines}
92856
93372
 
92857
93373
  ---
92858
93374
 
92859
- ${job.prompt}` : job.prompt;
93375
+ ${prompt}` : prompt;
92860
93376
  };
92861
93377
  const planned = (resume, fork, said2 = "") => {
92862
93378
  let p2 = deps.plan(job.runtime, promptOf(said2), cwd, resume, job.model, settingsOf(job), fork, job.languageLine ?? "");
@@ -92870,18 +93386,42 @@ ${job.prompt}` : job.prompt;
92870
93386
  };
92871
93387
  const carried = !!job.resume && (!job.fork || forks(job.runtime));
92872
93388
  run2 = carried ? planned(job.resume, !!job.fork) : planned(null, false, transcript);
92873
- if (carried && transcript) fresh = () => planned(null, false, transcript);
93389
+ if (!recovering && carried && transcript) fresh = () => planned(null, false, transcript);
93390
+ if (!recovering && carried && (job.chat || job.discussion)) {
93391
+ fresh = () => planned(null, false, transcript);
93392
+ missingSessionOnly = true;
93393
+ }
92874
93394
  }
92875
93395
  } catch (e2) {
92876
93396
  await deps.api.finishJob(deps.machineId, id, "failed", e2 instanceof Error ? e2.message : String(e2));
92877
93397
  return;
92878
93398
  }
92879
- const lease = { at: Date.now() };
93399
+ if (!held3(deps, lease)) return;
92880
93400
  const stream = streamOut(deps, id, lease);
92881
- const told = (said2) => ideas ? { ...said2, ideas: readIdeas(ideas) } : said2;
93401
+ const remember = (event2) => {
93402
+ if (stream.lost()) return;
93403
+ checkpointEvent(checkpoint, event2);
93404
+ const session = run2?.session();
93405
+ if (session) checkpoint.session = session;
93406
+ persist();
93407
+ stream.event(event2);
93408
+ };
93409
+ const complete = (outcome, report2, reason) => {
93410
+ if (stream.lost()) return;
93411
+ checkpoint.completed = { outcome, report: report2, reason };
93412
+ checkpoint.session = report2.session ?? checkpoint.session;
93413
+ persist();
93414
+ };
93415
+ let savedIdeas;
93416
+ const told = (said2) => {
93417
+ if (ideas) savedIdeas ??= readIdeas(ideas);
93418
+ return savedIdeas ? { ...said2, ideas: savedIdeas } : said2;
93419
+ };
92882
93420
  track(stream.stop);
92883
- const io = { show: stream.out, event: stream.event, track: stream.adopt, onStop: stream.onStop, lost: stream.lost };
93421
+ const io = { show: stream.out, event: remember, track: stream.adopt, onStop: stream.onStop, lost: stream.lost };
92884
93422
  if (job.review) {
93423
+ checkpoint.started = true;
93424
+ persist();
92885
93425
  for (const task2 of job.review.tasks) {
92886
93426
  const chat = await deps.api.readChat(task2);
92887
93427
  if (chat.ok) keepCloudChat(task2, chat.value.messages);
@@ -92896,25 +93436,37 @@ ${job.prompt}` : job.prompt;
92896
93436
  const marks = reviewMarks(tasks);
92897
93437
  const refs = tasks.map((c2) => `${c2.task}:${c2.number}`);
92898
93438
  const ended3 = refs.length ? await runReview(job, ws, refs, deps, io) : { ok: true, report: {} };
93439
+ if (ended3.ok) complete("done", ended3.report);
92899
93440
  await stream.end();
92900
93441
  if (stream.lost()) return;
92901
93442
  if (!ended3.ok) return finish(deps, id, lease, "failed", ended3.reason);
92902
93443
  return sendBack(deps, id, lease, ws, ended3.report, () => markReviewed2(marks));
92903
93444
  }
92904
93445
  if (!run2) {
93446
+ checkpoint.started = true;
93447
+ persist();
92905
93448
  const ended3 = await runFlow(job, ws, deps, io);
93449
+ if (ended3.ok) complete("done", ended3.report);
92906
93450
  const stopped2 = !ended3.ok && (stream.asked() || ended3.stopped === true);
92907
93451
  if (stopped2 && stream.asked()) await stream.halted();
92908
93452
  await stream.end();
92909
93453
  if (stream.lost()) return;
92910
- if (stopped2) return finish(deps, id, lease, "stopped");
92911
- if (!ended3.ok) return finish(deps, id, lease, "failed", ended3.reason);
92912
- return sendBack(deps, id, lease, ws, ended3.report, () => keepChat(job, ended3.report.reply));
92913
- }
93454
+ const boardStopped = await confirmFlowStopped(ws, job, deps);
93455
+ const evidence = progressEvidence(job, ws.cwd);
93456
+ const proof = boardStopped && await stream.confirmed() ? { processesStopped: true, ...evidence ? { evidence } : {} } : {};
93457
+ if (ended3.ok) complete("done", { ...ended3.report, ...proof });
93458
+ if (stopped2) return finish(deps, id, lease, "stopped", "", proof);
93459
+ if (!ended3.ok) return finish(deps, id, lease, "failed", ended3.reason, proof);
93460
+ return sendBack(deps, id, lease, ws, { ...ended3.report, ...proof }, () => keepChat(job, ended3.report.reply));
93461
+ }
93462
+ checkpoint.started = true;
93463
+ checkpoint.opaque = !run2.converse && !run2.renderer?.events;
93464
+ checkpoint.session = run2.session() ?? checkpoint.session;
93465
+ persist();
92914
93466
  if (run2.converse) {
92915
93467
  const plan3 = run2;
92916
93468
  const converse = run2.converse;
92917
- const child = spawn4(plan3.command, plan3.args, { cwd, env: plan3.env, stdio: ["pipe", "pipe", "pipe"] });
93469
+ const child = spawn4(plan3.command, plan3.args, { cwd, env: plan3.env, detached: process.platform !== "win32", stdio: ["pipe", "pipe", "pipe"] });
92918
93470
  stream.adopt(child);
92919
93471
  child.stdin.on("error", () => {
92920
93472
  });
@@ -92922,11 +93474,12 @@ ${job.prompt}` : job.prompt;
92922
93474
  child.stderr.on("data", (chunk) => stream.out(quietLines(plan3, chunk)));
92923
93475
  const spawned = new Promise((resolve2) => child.on("error", (e2) => resolve2(e2.message)));
92924
93476
  const end = await Promise.race([
92925
- converse(child, stream.event),
93477
+ converse(child, remember),
92926
93478
  spawned.then((error) => ({ ok: false, error })),
92927
93479
  // Killed, the turn ends with what it said so far; one that never does is not waited on.
92928
93480
  stream.whenAsked.then(() => wait2(KILL_GRACE_MS * 2)).then(() => ({ ok: true }))
92929
93481
  ]);
93482
+ if (!stream.asked()) complete(end.ok ? "done" : "failed", told(report(job, plan3, end)), end.ok ? void 0 : end.error);
92930
93483
  stop(child);
92931
93484
  await stream.end();
92932
93485
  if (stream.lost()) return;
@@ -92936,7 +93489,7 @@ ${job.prompt}` : job.prompt;
92936
93489
  return sendBack(deps, id, lease, ws, said2, () => keepChat(job, said2.reply));
92937
93490
  }
92938
93491
  const printed = async (plan3) => {
92939
- const child = spawn4(plan3.command, plan3.args, { cwd, env: plan3.env, stdio: ["pipe", "pipe", "pipe"] });
93492
+ const child = spawn4(plan3.command, plan3.args, { cwd, env: plan3.env, detached: process.platform !== "win32", stdio: ["pipe", "pipe", "pipe"] });
92940
93493
  stream.adopt(child);
92941
93494
  child.stdin.on("error", () => {
92942
93495
  });
@@ -92945,30 +93498,47 @@ ${job.prompt}` : job.prompt;
92945
93498
  else child.stdin.end();
92946
93499
  child.stdout.setEncoding("utf8");
92947
93500
  const structured = !!renderer2.events;
93501
+ let stderr = "";
93502
+ let acted = false;
92948
93503
  const fromAgent = (text3) => {
92949
- if (!structured) stream.out(text3);
92950
- for (const e2 of renderer2.events?.() ?? []) stream.event(e2);
93504
+ if (!structured) {
93505
+ if (text3.trim()) acted = true;
93506
+ stream.out(text3);
93507
+ }
93508
+ for (const e2 of renderer2.events?.() ?? []) {
93509
+ if (e2.kind === "message" || e2.kind === "tool_call" || e2.kind === "tool_call_update") acted = true;
93510
+ remember(e2);
93511
+ }
92951
93512
  };
92952
93513
  child.stdout.on("data", (chunk) => {
92953
93514
  fromAgent(renderer2.push(chunk));
92954
93515
  if (plan3.stdin && renderer2.result() !== void 0 && !child.stdin.writableEnded) child.stdin.end();
92955
93516
  });
92956
93517
  child.stderr.setEncoding("utf8");
92957
- child.stderr.on("data", (chunk) => stream.out(quietLines(plan3, chunk)));
93518
+ child.stderr.on("data", (chunk) => {
93519
+ stderr = (stderr + chunk).slice(-EVENT_CHARS);
93520
+ stream.out(quietLines(plan3, chunk));
93521
+ });
92958
93522
  const ended3 = await new Promise((resolve2) => {
92959
93523
  child.on("error", (e2) => resolve2({ code: null, error: e2.message }));
92960
93524
  child.on("close", (code) => resolve2({ code }));
92961
93525
  });
92962
93526
  fromAgent(renderer2.flush());
92963
- return ended3;
93527
+ return { ...ended3, stderr, acted };
92964
93528
  };
92965
93529
  let plan2 = run2;
92966
93530
  let ended2 = await printed(plan2);
92967
- if (fresh && ended2.code !== 0 && plan2.renderer.result() === void 0 && !stream.asked() && !stream.lost()) {
93531
+ if (fresh && ended2.code !== 0 && plan2.renderer.result() === void 0 && !ended2.acted && (!missingSessionOnly || sessionMissing(`${ended2.stderr}
93532
+ ${plan2.renderer.failure?.() ?? ""}`)) && !stream.asked() && !stream.lost()) {
92968
93533
  plan2 = fresh();
93534
+ run2 = plan2;
92969
93535
  ended2 = await printed(plan2);
92970
93536
  }
92971
93537
  const renderer = plan2.renderer;
93538
+ if (!stream.asked()) {
93539
+ const reason = ended2.error ?? renderer.failure?.() ?? (ended2.code === 0 ? void 0 : `Exited with code ${ended2.code}.`);
93540
+ complete(reason ? "failed" : "done", told(report(job, plan2)), reason);
93541
+ }
92972
93542
  await stream.end();
92973
93543
  if (stream.lost()) return;
92974
93544
  const failure = stream.asked() ? void 0 : ended2.error ?? renderer.failure?.() ?? (ended2.code === 0 ? void 0 : `Exited with code ${ended2.code}.`);
@@ -92976,7 +93546,7 @@ ${job.prompt}` : job.prompt;
92976
93546
  if (failure || !ws) return finish(deps, id, lease, failure ? "failed" : "done", failure, said);
92977
93547
  return sendBack(deps, id, lease, ws, said, () => keepChat(job, said.reply));
92978
93548
  }
92979
- async function runAgentJob(job, deps, track, keep2) {
93549
+ async function runAgentJob(job, deps, track, keep2, lease, checkpoint, persist) {
92980
93550
  const folder = job.projectDir ? folderFor(job) : { refused: "This project has no folder on this computer." };
92981
93551
  let ws;
92982
93552
  try {
@@ -92987,10 +93557,23 @@ async function runAgentJob(job, deps, track, keep2) {
92987
93557
  await deps.api.finishJob(deps.machineId, job.id, "failed", e2 instanceof Error ? e2.message : String(e2));
92988
93558
  return;
92989
93559
  }
92990
- const lease = { at: Date.now() };
93560
+ if (!held3(deps, lease)) return;
93561
+ if (checkpoint.completed) return sendBack(deps, job.id, lease, ws, checkpoint.completed.report, () => {
93562
+ });
93563
+ checkpoint.started = true;
93564
+ persist();
92991
93565
  const stream = streamOut(deps, job.id, lease);
92992
93566
  track(stream.stop);
92993
- const ended2 = await runAgent(job, ws, deps, { show: stream.out, event: stream.event, track: stream.adopt, onStop: stream.onStop, lost: stream.lost });
93567
+ const ended2 = await runAgent(job, ws, deps, { show: stream.out, event: (event2) => {
93568
+ if (stream.lost()) return;
93569
+ checkpointEvent(checkpoint, event2);
93570
+ persist();
93571
+ stream.event(event2);
93572
+ }, track: stream.adopt, onStop: stream.onStop, lost: stream.lost });
93573
+ if (ended2.ok && !stream.lost()) {
93574
+ checkpoint.completed = { outcome: "done", report: ended2.report };
93575
+ persist();
93576
+ }
92994
93577
  await stream.end();
92995
93578
  if (stream.lost()) return;
92996
93579
  if (!ended2.ok) return finish(deps, job.id, lease, "failed", ended2.reason);
@@ -92998,29 +93581,53 @@ async function runAgentJob(job, deps, track, keep2) {
92998
93581
  }
92999
93582
  var quietLines = (plan2, chunk) => chunk.split("\n").filter((line) => line && !plan2.quiet(line)).map((line) => `${line}
93000
93583
  `).join("");
93584
+ var sessionMissing = (text3) => /\b(?:session|conversation|thread)\b[^\n]*(?:\bnot found\b|\bdoes not exist\b)/i.test(text3) || /\bno (?:conversation|session|thread) found\b/i.test(text3);
93585
+ function signalTree(child, signal) {
93586
+ if (!child.pid) return;
93587
+ if (process.platform === "win32") {
93588
+ const kill = spawn4("taskkill", ["/PID", String(child.pid), "/T", "/F"], { stdio: "ignore" });
93589
+ kill.on("error", () => child.kill(signal));
93590
+ return;
93591
+ }
93592
+ try {
93593
+ process.kill(-child.pid, signal);
93594
+ } catch {
93595
+ child.kill(signal);
93596
+ }
93597
+ }
93001
93598
  var stop = (child) => {
93002
93599
  if (!child.pid) return;
93003
- child.kill("SIGTERM");
93004
- setTimeout(() => child.kill("SIGKILL"), KILL_GRACE_MS).unref();
93600
+ signalTree(child, "SIGTERM");
93601
+ const timer = setTimeout(() => signalTree(child, "SIGKILL"), KILL_GRACE_MS);
93602
+ timer.unref();
93603
+ child.once("close", () => clearTimeout(timer));
93005
93604
  };
93006
93605
  var wait2 = (ms) => new Promise((resolve2) => setTimeout(resolve2, ms));
93007
- var held3 = (deps, lease) => Date.now() - lease.at < deps.leaseMs;
93606
+ var held3 = (deps, lease) => {
93607
+ if (Math.max(Date.now() - lease.at, performance.now() - lease.monotonic) >= deps.leaseMs) lease.lost = true;
93608
+ return !lease.lost;
93609
+ };
93008
93610
  async function whileOffline(deps, id, lease, attempt) {
93009
- for (; ; ) {
93611
+ while (held3(deps, lease)) {
93010
93612
  const out = await attempt();
93011
93613
  if (!("offline" in out && out.offline) || !held3(deps, lease)) return out;
93012
93614
  await wait2(deps.retryMs);
93615
+ if (!held3(deps, lease)) return null;
93616
+ const requestedAt = leaseNow();
93013
93617
  const renewed = await deps.api.renewJob(deps.machineId, id);
93014
- if (renewed.ok && renewed.value.renewed) lease.at = Date.now();
93618
+ if (!held3(deps, lease)) return null;
93619
+ if (renewed.ok && renewed.value.renewed) Object.assign(lease, requestedAt);
93015
93620
  if (renewed.ok && !renewed.value.renewed) return out;
93016
93621
  }
93622
+ return null;
93017
93623
  }
93018
93624
  async function ended(deps, id, lease, outcome, reason = "", report2) {
93019
93625
  const sent = await whileOffline(deps, id, lease, async () => {
93020
93626
  const done = await deps.api.finishJob(deps.machineId, id, outcome, reason, report2);
93021
93627
  return { offline: !done.ok && !done.code, finished: done.ok && done.value.finished };
93022
93628
  });
93023
- return sent.finished;
93629
+ if (sent?.finished) clearCheckpoint(id);
93630
+ return sent?.finished ?? false;
93024
93631
  }
93025
93632
  async function finish(deps, id, lease, outcome, reason = "", report2) {
93026
93633
  await ended(deps, id, lease, outcome, reason, report2);
@@ -93031,6 +93638,7 @@ async function sendBack(deps, id, lease, ws, said, landed = () => {
93031
93638
  if (built && !built.ok) return finish(deps, id, lease, "failed", built.reason, said);
93032
93639
  const report2 = built ? { ...said, workflow: { files: built.files } } : said;
93033
93640
  const pushed = await whileOffline(deps, id, lease, () => push(ws, { id, machineId: deps.machineId }));
93641
+ if (!pushed) return;
93034
93642
  if (pushed.ok) {
93035
93643
  if (await ended(deps, id, lease, "done", "", report2)) landed();
93036
93644
  return;
@@ -93055,12 +93663,12 @@ async function runTest(job, deps) {
93055
93663
  const report2 = (await deps.runtimes()).find((r2) => r2.name === job.runtime);
93056
93664
  if (!report2?.installed) return finish2("failed", "not_installed");
93057
93665
  if (report2.loggedIn === false) return finish2("failed", "signed_out");
93058
- const cwd = path32.join(ownFolder(), "test");
93059
- fs29.mkdirSync(cwd, { recursive: true });
93666
+ const cwd = path36.join(ownFolder(), "test");
93667
+ fs34.mkdirSync(cwd, { recursive: true });
93060
93668
  const run2 = deps.plan(job.runtime, job.prompt, cwd, null, job.model, settingsOf(job));
93061
93669
  const startedAt = Date.now();
93062
93670
  if (run2.converse) {
93063
- const child = spawn4(run2.command, run2.args, { cwd, env: run2.env, stdio: ["pipe", "pipe", "ignore"] });
93671
+ const child = spawn4(run2.command, run2.args, { cwd, env: run2.env, detached: process.platform !== "win32", stdio: ["pipe", "pipe", "ignore"] });
93064
93672
  child.stdin.on("error", () => {
93065
93673
  });
93066
93674
  let timer;
@@ -93080,7 +93688,7 @@ async function runTest(job, deps) {
93080
93688
  const renderer = run2.renderer;
93081
93689
  const ended2 = await new Promise((resolve2) => {
93082
93690
  let said = "";
93083
- const child = spawn4(run2.command, run2.args, { cwd, env: run2.env, stdio: ["pipe", "pipe", "pipe"] });
93691
+ const child = spawn4(run2.command, run2.args, { cwd, env: run2.env, detached: process.platform !== "win32", stdio: ["pipe", "pipe", "pipe"] });
93084
93692
  const timer = setTimeout(() => {
93085
93693
  child.kill("SIGTERM");
93086
93694
  setTimeout(() => child.kill("SIGKILL"), KILL_GRACE_MS).unref();
@@ -93214,6 +93822,7 @@ function startRunner(options) {
93214
93822
  let registration = null;
93215
93823
  let connected = false;
93216
93824
  let closed = false;
93825
+ let preparing = false;
93217
93826
  let attempts = 0;
93218
93827
  let live = null;
93219
93828
  let presence = null;
@@ -93221,7 +93830,10 @@ function startRunner(options) {
93221
93830
  let timer = null;
93222
93831
  let reading = false;
93223
93832
  let readAgain = false;
93833
+ let readDone = Promise.resolve();
93834
+ const jobs = /* @__PURE__ */ new Set();
93224
93835
  const running = /* @__PURE__ */ new Map();
93836
+ const attempted = /* @__PURE__ */ new Set();
93225
93837
  let stop2 = () => {
93226
93838
  };
93227
93839
  const stopped2 = new Promise((resolve2) => stop2 = resolve2);
@@ -93354,19 +93966,31 @@ function startRunner(options) {
93354
93966
  });
93355
93967
  };
93356
93968
  const readJobs = async () => {
93357
- if (closed || !registration) return;
93969
+ if (closed || preparing || !registration) return;
93358
93970
  if (reading) {
93359
93971
  readAgain = true;
93360
93972
  return;
93361
93973
  }
93362
93974
  reading = true;
93975
+ let readEnded = () => {
93976
+ };
93977
+ readDone = new Promise((resolve2) => readEnded = resolve2);
93363
93978
  try {
93364
93979
  const list = await listJobs(registration.machineId);
93365
- if (!list.ok) return;
93980
+ if (!list.ok || closed) return;
93981
+ const listed2 = new Set(list.value.jobs.map((job) => job.id));
93982
+ for (const id of attempted) if (!listed2.has(id) && !running.has(id)) attempted.delete(id);
93366
93983
  for (const job of list.value.jobs) {
93367
- if (job.state === "claimed" && !running.has(job.id)) {
93368
- await stopLeftOn(job);
93369
- await finishJob(registration.machineId, job.id, "failed", "The Runner restarted while this job was running.");
93984
+ if (closed || preparing) break;
93985
+ if (job.state === "claimed" && !running.has(job.id) && !attempted.has(job.id)) {
93986
+ const failure = await stopLeftOn(job);
93987
+ if (closed || preparing) break;
93988
+ const checkpoint = readCheckpoint(job.id);
93989
+ const uncertain = checkpoint?.updating && !checkpoint.completed && (checkpoint.pending.length > 0 || checkpoint.opaque || !job.flow && checkpoint.started && !checkpoint.session);
93990
+ if (checkpoint?.updating) status(uncertain ? UNCERTAIN : "\u6B63\u5728\u6062\u590D\u66F4\u65B0\u524D\u7684\u4EFB\u52A1\u2026");
93991
+ const reason = failure ?? (uncertain ? UNCERTAIN : checkpoint?.updating ? UPDATE_REASON : "The Runner restarted while this job was running.");
93992
+ const recovered = await finishJob(registration.machineId, job.id, "failed", reason, checkpoint?.session ? { session: checkpoint.session } : void 0);
93993
+ if (recovered.ok && reason === UPDATE_REASON) readAgain = true;
93370
93994
  continue;
93371
93995
  }
93372
93996
  if (job.state !== "waiting" || running.has(job.id)) continue;
@@ -93374,6 +93998,7 @@ function startRunner(options) {
93374
93998
  }
93375
93999
  } finally {
93376
94000
  reading = false;
94001
+ readEnded();
93377
94002
  if (readAgain) {
93378
94003
  readAgain = false;
93379
94004
  void readJobs();
@@ -93384,12 +94009,12 @@ function startRunner(options) {
93384
94009
  if (!job.flow || !job.task) return;
93385
94010
  try {
93386
94011
  const folder = job.projectDir ? folderFor(job) : null;
93387
- if (folder && "refused" in folder) return;
94012
+ if (folder && "refused" in folder) return folder.refused;
93388
94013
  const ws = openTaskFolder(job, folder?.cwd ?? null);
93389
94014
  const card = akbCardOf(ws);
93390
94015
  if (card) await stopLeftBehind(deps().akb(), ws, card, deps().stopMs);
93391
94016
  } catch (e2) {
93392
- console.error(`runner: the runs left on job ${job.id}'s card were not stopped: ${e2 instanceof Error ? e2.message : String(e2)}`);
94017
+ return e2 instanceof Error ? e2.message : String(e2);
93393
94018
  }
93394
94019
  };
93395
94020
  let reviewing = false;
@@ -93405,33 +94030,57 @@ function startRunner(options) {
93405
94030
  }
93406
94031
  };
93407
94032
  const start = (id) => {
94033
+ attempted.add(id);
93408
94034
  running.set(id, null);
93409
94035
  status(idle2());
93410
- void runJob(id, deps(), (halt) => running.set(id, halt)).catch(() => {
94036
+ const job = runJob(id, deps(), (halt) => {
94037
+ running.set(id, halt);
94038
+ if (closed) void halt();
94039
+ }, () => closed).catch(() => {
93411
94040
  }).finally(() => {
94041
+ jobs.delete(job);
93412
94042
  running.delete(id);
93413
94043
  if (closed) return;
93414
94044
  boards?.look();
93415
94045
  status(idle2());
93416
94046
  void readJobs();
93417
94047
  });
94048
+ jobs.add(job);
93418
94049
  };
93419
- const close = async (release2 = true) => {
94050
+ const close = async (release2 = true, updating = false) => {
93420
94051
  if (closed) return;
94052
+ if (updating) {
94053
+ preparing = true;
94054
+ await readDone;
94055
+ for (const id of running.keys()) {
94056
+ const prepared = await finishJob(registration.machineId, id, "failed", PREPARE_REASON);
94057
+ if (!prepared.ok || !prepared.value.prepared && !prepared.value.finished) {
94058
+ preparing = false;
94059
+ void readJobs();
94060
+ throw new Error("\u66F4\u65B0\u6682\u7F13\uFF1A\u672A\u80FD\u4FDD\u5B58\u4E91\u7AEF\u4EFB\u52A1\uFF0C\u7A0D\u540E\u91CD\u8BD5\u3002");
94061
+ }
94062
+ }
94063
+ }
93421
94064
  closed = true;
93422
- const handedOver = lock.waited();
93423
- lock.release();
94065
+ if (updating) {
94066
+ for (const id of running.keys()) {
94067
+ const checkpoint = readCheckpoint(id) ?? { pending: [] };
94068
+ saveCheckpoint(id, { ...checkpoint, updating: true });
94069
+ }
94070
+ }
93424
94071
  if (timer) clearTimeout(timer);
93425
94072
  if (agentsTimer) clearTimeout(agentsTimer);
93426
94073
  clearInterval(sweepTimer);
93427
94074
  live?.close();
93428
94075
  presence?.close();
93429
94076
  boards?.close();
93430
- const stops = Promise.all([...running.values()].map((halt) => halt?.()));
94077
+ const stops = Promise.all([readDone, ...jobs, ...[...running.values()].map((halt) => halt?.())]);
93431
94078
  let timeout;
93432
- await Promise.race([stops, new Promise((resolve2) => timeout = setTimeout(resolve2, (options.deps?.stopMs ?? STOP_MS) + 1e3))]);
94079
+ if (updating) await stops;
94080
+ else await Promise.race([stops, new Promise((resolve2) => timeout = setTimeout(resolve2, (options.deps?.stopMs ?? STOP_MS) + 1e3))]);
93433
94081
  clearTimeout(timeout);
93434
- if (release2 && !handedOver && registration) await release(registration.machineId);
94082
+ if (release2 && !lock.waited() && registration) await release(registration.machineId);
94083
+ lock.release();
93435
94084
  };
93436
94085
  removeLegacy();
93437
94086
  pruneChats();
@@ -93439,12 +94088,12 @@ function startRunner(options) {
93439
94088
  status(t.waitingHere(holder));
93440
94089
  options.onWaiting?.(holder);
93441
94090
  });
93442
- return { stopped: stopped2, close: () => close(true), renew: () => schedule(0) };
94091
+ return { stopped: stopped2, close: () => close(true), update: () => close(false, true), renew: () => schedule(0) };
93443
94092
  }
93444
94093
 
93445
94094
  // src/signin.ts
93446
94095
  import { spawn as spawn5 } from "node:child_process";
93447
- import crypto5 from "node:crypto";
94096
+ import crypto6 from "node:crypto";
93448
94097
  import http from "node:http";
93449
94098
  var WAIT_MS = 10 * 60 * 1e3;
93450
94099
  var CRANE = "M2 55.75C2 55.69 2.69 55.09 3.55 54.37L5.09 53.1L6.61 53.1L8.13 53.1L12.49 49.87C14.9 48.07 16.83 46.58 16.77 46.53C16.75 46.47 15.56 46.64 14.15 46.89C12.74 47.13 11.55 47.3 11.53 47.24C11.47 47.19 12.02 46.22 12.71 45.06L14.01 42.96L18.21 41.34C20.53 40.45 22.41 39.65 22.41 39.57C22.41 39.49 21.27 38.55 19.92 37.5C15.92 34.4 13.13 31.31 10.86 27.47L10.01 26.01L10.53 26.18C10.84 26.26 12.96 27.2 15.28 28.25C17.6 29.32 19.53 30.12 19.59 30.07C19.64 30.01 17.68 28.69 15.25 27.11C12.8 25.57 10.56 23.97 10.31 23.58C9.15 21.95 7.25 17.5 7.25 16.46C7.25 16.26 10.01 17.95 13.38 20.18C16.77 22.45 19.73 24.38 19.95 24.49C20.42 24.74 20.25 24.57 13.9 19.02L9.18 14.88L8.6 13.36C7.72 10.96 6.97 7.54 6.97 5.77L6.97 4.14L9.4 6.46C12.66 9.61 15.56 12.01 23.57 18.25C27.32 21.18 30.5 23.72 30.64 23.91C30.8 24.08 31.68 26.51 32.6 29.3L34.28 34.35L35.72 35.65C37.54 37.3 37.98 37.47 36.85 36.09L35.96 35.01L37.12 34.71C39.11 34.21 40.16 33.52 42.54 31.12L44.8 28.8L46.02 28.96C46.71 29.07 47.56 29.07 47.95 28.96L48.67 28.8L48.67 28.25L48.67 27.69L49.27 27.69C49.63 27.69 50.1 27.58 50.32 27.42L50.71 27.17L51.01 27.42C51.18 27.56 52.78 27.86 54.58 28.08C56.37 28.3 57.86 28.52 57.94 28.58C58 28.63 56.73 28.85 55.13 29.05C53.53 29.24 50.96 29.77 49.44 30.21C47.92 30.65 46.57 31.01 46.43 31.01C46.29 31.01 44.22 32.97 41.85 35.37C37.57 39.62 34.42 42.14 30.83 44.15L29.14 45.09L25.97 45.73L22.77 46.39L14.59 51.11L6.42 55.86L4.21 55.86C2.99 55.86 2 55.8 2 55.75Z";
@@ -93469,8 +94118,8 @@ var PAGE = (outcome, lang) => {
93469
94118
  return `<!doctype html><html lang="${lang === "zh" ? "zh-CN" : "en"}"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>${title} \xB7 WildCrane</title><style>*{margin:0;box-sizing:border-box}body{display:flex;flex-direction:column;min-height:100dvh;background:#fff;color:#24231f;font-family:ui-sans-serif,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif}header{padding:16px 36px 0}main{flex:1;display:flex;align-items:center;justify-content:center;padding:0 36px 64px;text-align:center}.icon{display:flex;margin:0 auto;width:44px;height:44px;border-radius:50%;align-items:center;justify-content:center;background:${ok ? "#e4f3ea" : "#f7ddce"};color:${ok ? "#2f6b46" : "#b83a12"}}h1{margin-top:16px;font-size:24px;font-weight:850;line-height:1.25;letter-spacing:-0.02em}p{margin:8px auto 0;max-width:38ch;font-size:13px;line-height:19px;color:#565550}</style><header><svg viewBox="2 4 56 52" width="23.7" height="22" aria-hidden="true"><path d="${CRANE}" fill="#24231f"/><path d="${CREST}" fill="#dd4f1e"/></svg></header><main><div><span class="icon"><svg viewBox="0 0 24 24" width="22" height="22" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${icon}</svg></span><h1>${title}</h1><p>${body}</p></div></main></html>`;
93470
94119
  };
93471
94120
  async function signIn(options = {}) {
93472
- const verifier = base64url(crypto5.randomBytes(32));
93473
- const challenge = base64url(crypto5.createHash("sha256").update(verifier).digest());
94121
+ const verifier = base64url(crypto6.randomBytes(32));
94122
+ const challenge = base64url(crypto6.createHash("sha256").update(verifier).digest());
93474
94123
  let finish2 = () => {
93475
94124
  };
93476
94125
  const answered = new Promise((resolve2) => finish2 = resolve2);
@@ -93558,12 +94207,21 @@ async function main() {
93558
94207
  const id = machineId();
93559
94208
  const runner = startRunner({
93560
94209
  registration: async () => ({ machineId: id, machineName: machineName(), version: VERSION, runtimes: await detectRuntimes(true) }),
93561
- kind: "terminal",
94210
+ kind: process.env.WILDCRANE_RUNNER_KIND === "codex" ? "codex" : process.env.WILDCRANE_RUNNER_KIND === "claude-code" ? "claude-code" : "terminal",
93562
94211
  onConnected: () => tell({ type: "connected" }),
93563
94212
  onWaiting: () => tell({ type: "waiting" }),
93564
94213
  // Tests shorten the job poll, which stands in when Realtime is out of reach.
93565
94214
  pollMs: Number(process.env.WILDCRANE_POLL_MS) || void 0
93566
94215
  });
94216
+ process.on("message", (message) => {
94217
+ if (message.type === "renew") return runner.renew();
94218
+ if (message.type !== "update") return;
94219
+ status("\u6B63\u5728\u66F4\u65B0 Runner\uFF0C\u91CD\u542F\u540E\u81EA\u52A8\u6062\u590D\u4EFB\u52A1\u2026");
94220
+ void runner.update().then(() => process.exit(EXIT_UPDATE)).catch((error) => {
94221
+ status(String(error));
94222
+ tell({ type: "update-deferred" });
94223
+ });
94224
+ });
93567
94225
  for (const signal of ["SIGINT", "SIGTERM"]) {
93568
94226
  process.on(signal, async () => {
93569
94227
  await runner.close();