@skaile/workspaces 4.5.1 → 4.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/app-sdk/index.js +1 -1
  3. package/dist/{asset-feeds-UQDXXKYK.js → asset-feeds-3XUEJHLJ.js} +4 -4
  4. package/dist/{asset-feeds-UQDXXKYK.js.map → asset-feeds-3XUEJHLJ.js.map} +1 -1
  5. package/dist/asset-manager/index.js +1 -1
  6. package/dist/bridge/drivers/claude-sdk.js +4 -4
  7. package/dist/bridge/drivers/codex.js +2 -2
  8. package/dist/bridge/drivers/continue.js +2 -2
  9. package/dist/bridge/drivers/echo.js +3 -3
  10. package/dist/bridge/drivers/gemini.js +4 -4
  11. package/dist/bridge/drivers/goose.js +2 -2
  12. package/dist/bridge/drivers/omp.js +1 -1
  13. package/dist/bridge/drivers/opencode.js +2 -2
  14. package/dist/bridge/drivers/qwen.js +4 -4
  15. package/dist/bridge/index.js +5 -5
  16. package/dist/{chunk-WIBL34ZS.js → chunk-2CFREMKM.js} +3 -3
  17. package/dist/{chunk-WIBL34ZS.js.map → chunk-2CFREMKM.js.map} +1 -1
  18. package/dist/{chunk-7ZFC3E2C.js → chunk-2HZJKDLG.js} +2 -2
  19. package/dist/{chunk-7ZFC3E2C.js.map → chunk-2HZJKDLG.js.map} +1 -1
  20. package/dist/{chunk-NOH5UDO7.js → chunk-3GKBSHUG.js} +3 -3
  21. package/dist/{chunk-NOH5UDO7.js.map → chunk-3GKBSHUG.js.map} +1 -1
  22. package/dist/{chunk-RBQOLTC4.js → chunk-5CDL6VZQ.js} +6 -6
  23. package/dist/{chunk-RBQOLTC4.js.map → chunk-5CDL6VZQ.js.map} +1 -1
  24. package/dist/{chunk-KIIH2T7W.js → chunk-63PBQN5U.js} +6 -6
  25. package/dist/{chunk-KIIH2T7W.js.map → chunk-63PBQN5U.js.map} +1 -1
  26. package/dist/{chunk-YVQZQGVW.js → chunk-6ZQU5WKJ.js} +3 -3
  27. package/dist/{chunk-YVQZQGVW.js.map → chunk-6ZQU5WKJ.js.map} +1 -1
  28. package/dist/{chunk-3OLCTLTH.js → chunk-7WVPAQPE.js} +3 -2
  29. package/dist/chunk-7WVPAQPE.js.map +1 -0
  30. package/dist/{chunk-JF77XKD7.js → chunk-CU32AWH5.js} +3 -3
  31. package/dist/{chunk-JF77XKD7.js.map → chunk-CU32AWH5.js.map} +1 -1
  32. package/dist/{chunk-GWSVMX53.js → chunk-D3332IMQ.js} +3 -3
  33. package/dist/{chunk-GWSVMX53.js.map → chunk-D3332IMQ.js.map} +1 -1
  34. package/dist/{chunk-QCXQXLS2.js → chunk-DXXIALYF.js} +3 -3
  35. package/dist/{chunk-QCXQXLS2.js.map → chunk-DXXIALYF.js.map} +1 -1
  36. package/dist/{chunk-F54V4XMH.js → chunk-EVVE4SL4.js} +3 -3
  37. package/dist/{chunk-F54V4XMH.js.map → chunk-EVVE4SL4.js.map} +1 -1
  38. package/dist/{chunk-C2CYBRYJ.js → chunk-KMFZVPYR.js} +2 -2
  39. package/dist/{chunk-C2CYBRYJ.js.map → chunk-KMFZVPYR.js.map} +1 -1
  40. package/dist/{chunk-U4AA7MOV.js → chunk-QAH24E5U.js} +6 -3
  41. package/dist/chunk-QAH24E5U.js.map +1 -0
  42. package/dist/{chunk-VP2CACF2.js → chunk-QVTROHEZ.js} +3 -3
  43. package/dist/{chunk-VP2CACF2.js.map → chunk-QVTROHEZ.js.map} +1 -1
  44. package/dist/{chunk-CNYIITSZ.js → chunk-R4OMDCGZ.js} +3 -3
  45. package/dist/{chunk-CNYIITSZ.js.map → chunk-R4OMDCGZ.js.map} +1 -1
  46. package/dist/{chunk-UHKFMUM2.js → chunk-SAXTWLXZ.js} +10 -10
  47. package/dist/{chunk-UHKFMUM2.js.map → chunk-SAXTWLXZ.js.map} +1 -1
  48. package/dist/chunk-SDNGG6FB.js +32 -0
  49. package/dist/chunk-SDNGG6FB.js.map +1 -0
  50. package/dist/{chunk-KY5VVPM2.js → chunk-TRGMQUAZ.js} +129 -66
  51. package/dist/chunk-TRGMQUAZ.js.map +1 -0
  52. package/dist/{chunk-GVOPQBGM.js → chunk-V7SHQXDI.js} +4 -4
  53. package/dist/{chunk-GVOPQBGM.js.map → chunk-V7SHQXDI.js.map} +1 -1
  54. package/dist/{chunk-PJP2TOCB.js → chunk-VZOUBMM4.js} +5 -5
  55. package/dist/{chunk-PJP2TOCB.js.map → chunk-VZOUBMM4.js.map} +1 -1
  56. package/dist/{chunk-LKAWUFZA.js → chunk-YNZ5FIFH.js} +2 -2
  57. package/dist/{chunk-LKAWUFZA.js.map → chunk-YNZ5FIFH.js.map} +1 -1
  58. package/dist/{chunk-XHNK67X7.js → chunk-ZGYPEVZW.js} +4 -4
  59. package/dist/{chunk-XHNK67X7.js.map → chunk-ZGYPEVZW.js.map} +1 -1
  60. package/dist/cli/index.js +35 -34
  61. package/dist/cli/index.js.map +1 -1
  62. package/dist/connectors/index.js +7 -6
  63. package/dist/connectors/src/classify-connect-error.d.ts +20 -0
  64. package/dist/connectors/src/classify-connect-error.d.ts.map +1 -0
  65. package/dist/connectors/src/connect-error-kind.d.ts +47 -0
  66. package/dist/connectors/src/connect-error-kind.d.ts.map +1 -0
  67. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  68. package/dist/connectors/src/index.d.ts +3 -0
  69. package/dist/connectors/src/index.d.ts.map +1 -1
  70. package/dist/connectors-shared/index.js +2 -0
  71. package/dist/connectors-shared/index.js.map +1 -1
  72. package/dist/connectors-shared/src/index.d.ts +7 -2
  73. package/dist/connectors-shared/src/index.d.ts.map +1 -1
  74. package/dist/{ensure-sources-FDDMDIDJ.js → ensure-sources-MFQDQPYL.js} +4 -4
  75. package/dist/{ensure-sources-FDDMDIDJ.js.map → ensure-sources-MFQDQPYL.js.map} +1 -1
  76. package/dist/factory-assets/connectors/box.js +7 -6
  77. package/dist/factory-assets/connectors/deploy.js +7 -6
  78. package/dist/factory-assets/connectors/devserver.js +7 -6
  79. package/dist/factory-assets/connectors/flow/adapter.js +7 -6
  80. package/dist/factory-assets/connectors/flow/run-flow.js +8 -7
  81. package/dist/factory-assets/connectors/flow.js +7 -6
  82. package/dist/factory-assets/connectors/git/driver.d.ts +24 -4
  83. package/dist/factory-assets/connectors/git/driver.d.ts.map +1 -1
  84. package/dist/factory-assets/connectors/git.js +7 -6
  85. package/dist/factory-assets/connectors/gmail.js +7 -6
  86. package/dist/factory-assets/connectors/googledrive.js +7 -6
  87. package/dist/factory-assets/connectors/local.js +7 -6
  88. package/dist/factory-assets/connectors/mattermost.js +7 -6
  89. package/dist/factory-assets/connectors/memory.js +7 -6
  90. package/dist/factory-assets/connectors/minio.js +7 -6
  91. package/dist/factory-assets/connectors/postgres.js +7 -6
  92. package/dist/factory-assets/connectors/s3.js +7 -6
  93. package/dist/factory-assets/connectors/sharepoint.js +7 -6
  94. package/dist/factory-assets/connectors/sqlite.js +7 -6
  95. package/dist/factory-assets/connectors/static-server.js +7 -6
  96. package/dist/factory-assets/connectors/tunnel.js +7 -6
  97. package/dist/factory-assets/connectors/webdav.js +7 -6
  98. package/dist/factory-assets/connectors/xstate-store.js +7 -6
  99. package/dist/factory-assets/connectors/xstate.js +7 -6
  100. package/dist/{helpers-QWMKOP52.js → helpers-VQLLQ6HB.js} +4 -4
  101. package/dist/{helpers-QWMKOP52.js.map → helpers-VQLLQ6HB.js.map} +1 -1
  102. package/dist/{library-publish-GW7JXEPE.js → library-publish-73SFVNCE.js} +6 -6
  103. package/dist/{library-publish-GW7JXEPE.js.map → library-publish-73SFVNCE.js.map} +1 -1
  104. package/dist/{open-library-QVBKKXX5.js → open-library-QGTUQMUG.js} +5 -5
  105. package/dist/{open-library-QVBKKXX5.js.map → open-library-QGTUQMUG.js.map} +1 -1
  106. package/dist/{project-JEEMFZUN.js → project-LWS5PYIF.js} +5 -5
  107. package/dist/{project-JEEMFZUN.js.map → project-LWS5PYIF.js.map} +1 -1
  108. package/dist/runner/index.js +11 -10
  109. package/dist/sdk/asset-manager.js +1 -1
  110. package/dist/sdk/bridge.js +5 -5
  111. package/dist/sdk/index.js +11 -10
  112. package/dist/sdk/index.js.map +1 -1
  113. package/dist/sdk/runner.js +11 -10
  114. package/dist/sdk/session.js +2 -2
  115. package/dist/sdk/store.js +1 -1
  116. package/dist/sdk/types.js +1 -1
  117. package/dist/session/index.js +2 -2
  118. package/dist/{setup-5UZ4VPI4.js → setup-EOJWDJK2.js} +10 -10
  119. package/dist/{setup-5UZ4VPI4.js.map → setup-EOJWDJK2.js.map} +1 -1
  120. package/dist/{source-WZICRPYZ.js → source-Q5IIYTRA.js} +6 -6
  121. package/dist/{source-WZICRPYZ.js.map → source-Q5IIYTRA.js.map} +1 -1
  122. package/dist/{source-manifest-publish-4Y47IQYN.js → source-manifest-publish-Z3WC4HA2.js} +7 -7
  123. package/dist/{source-manifest-publish-4Y47IQYN.js.map → source-manifest-publish-Z3WC4HA2.js.map} +1 -1
  124. package/dist/store/index.js +1 -1
  125. package/dist/store/src/resource-client.d.ts.map +1 -1
  126. package/dist/store/src/types.d.ts +3 -1
  127. package/dist/store/src/types.d.ts.map +1 -1
  128. package/dist/tui/index.js +11 -10
  129. package/dist/tui/index.js.map +1 -1
  130. package/dist/types/index.js +1 -1
  131. package/dist/types/src/events.d.ts +22 -0
  132. package/dist/types/src/events.d.ts.map +1 -1
  133. package/dist/types/src/index.d.ts +2 -1
  134. package/dist/types/src/index.d.ts.map +1 -1
  135. package/dist/workspace-plugin/adapters/mcp.js +2 -2
  136. package/dist/workspace-plugin/index.js +1 -1
  137. package/package.json +1 -1
  138. package/dist/chunk-3OLCTLTH.js.map +0 -1
  139. package/dist/chunk-KY5VVPM2.js.map +0 -1
  140. package/dist/chunk-U4AA7MOV.js.map +0 -1
@@ -0,0 +1,32 @@
1
+ import { CONNECTOR_ERROR_KINDS } from './chunk-QAH24E5U.js';
2
+
3
+ // connectors/src/connect-error-kind.ts
4
+ var CONNECT_ERROR_KIND_PROPERTY = "skaileConnectErrorKind";
5
+ function declaredConnectErrorKind(err) {
6
+ if (err === null || typeof err !== "object" || !(CONNECT_ERROR_KIND_PROPERTY in err)) {
7
+ return void 0;
8
+ }
9
+ const value = err[CONNECT_ERROR_KIND_PROPERTY];
10
+ return CONNECTOR_ERROR_KINDS.includes(value) ? value : void 0;
11
+ }
12
+ function withConnectErrorKind(err, kind) {
13
+ if (err !== null && typeof err === "object" && !(CONNECT_ERROR_KIND_PROPERTY in err)) {
14
+ try {
15
+ err[CONNECT_ERROR_KIND_PROPERTY] = kind;
16
+ } catch {
17
+ }
18
+ }
19
+ return err;
20
+ }
21
+ var ClassifiedConnectError = class extends Error {
22
+ [CONNECT_ERROR_KIND_PROPERTY];
23
+ constructor(message, kind) {
24
+ super(message);
25
+ this.name = "ClassifiedConnectError";
26
+ this[CONNECT_ERROR_KIND_PROPERTY] = kind;
27
+ }
28
+ };
29
+
30
+ export { CONNECT_ERROR_KIND_PROPERTY, ClassifiedConnectError, declaredConnectErrorKind, withConnectErrorKind };
31
+ //# sourceMappingURL=chunk-SDNGG6FB.js.map
32
+ //# sourceMappingURL=chunk-SDNGG6FB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../connectors/src/connect-error-kind.ts"],"names":[],"mappings":";;;AAuBO,IAAM,2BAAA,GAA8B;AAYpC,SAAS,yBAAyB,GAAA,EAA8C;AACrF,EAAA,IAAI,QAAQ,IAAA,IAAQ,OAAO,QAAQ,QAAA,IAAY,EAAE,+BAA+B,GAAA,CAAA,EAAM;AACpF,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAS,IAAgC,2BAA2B,CAAA;AAC1E,EAAA,OAAQ,qBAAA,CAA6C,QAAA,CAAS,KAAK,CAAA,GAC9D,KAAA,GACD,MAAA;AACN;AAOO,SAAS,oBAAA,CAAwB,KAAQ,IAAA,EAA6B;AAC3E,EAAA,IAAI,QAAQ,IAAA,IAAQ,OAAO,QAAQ,QAAA,IAAY,EAAE,+BAA+B,GAAA,CAAA,EAAM;AACpF,IAAA,IAAI;AACF,MAAC,GAAA,CAAgC,2BAA2B,CAAA,GAAI,IAAA;AAAA,IAClE,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAMO,IAAM,sBAAA,GAAN,cAAqC,KAAA,CAAM;AAAA,EAChD,CAAU,2BAA2B;AAAA,EACrC,WAAA,CAAY,SAAiB,IAAA,EAA0B;AACrD,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,wBAAA;AACZ,IAAA,IAAA,CAAK,2BAA2B,CAAA,GAAI,IAAA;AAAA,EACtC;AACF","file":"chunk-SDNGG6FB.js","sourcesContent":["/**\n * The driver-side contract for classifying a connect failure: how a thrower\n * says which {@link ConnectorErrorKind} its error is. Read by the manager's\n * `classifyConnectError` (`classify-connect-error.ts`) into the `errorKind`\n * field of `connector_status` error events.\n *\n * Depends on nothing but `types`, so the `connectors-shared` subpath can\n * re-export it to out-of-tree drivers.\n *\n * @docLink packages/connectors/concepts#connector-manager\n */\n\nimport { CONNECTOR_ERROR_KINDS, type ConnectorErrorKind } from \"@skaile/workspaces/types\";\n\n/**\n * The property a thrown error carries its kind on.\n *\n * Namespaced because it is read off any thrown object: a bare `errorKind` is\n * a name a library's own error may already use, and a value that happened to\n * read `\"config\"` would silently misroute the failure. A plain string key\n * rather than a symbol, so a driver with no import from this package can still\n * set it: `throw Object.assign(new Error(msg), { skaileConnectErrorKind: \"config\" })`.\n */\nexport const CONNECT_ERROR_KIND_PROPERTY = \"skaileConnectErrorKind\";\n\n/**\n * The shape of an error that declares its kind. For classes that must spell the\n * key out instead of computing it (see the git driver's `TokenMediatorError`):\n * `implements` keeps the literal tied to {@link CONNECT_ERROR_KIND_PROPERTY}.\n */\nexport type DeclaresConnectErrorKind = {\n readonly [CONNECT_ERROR_KIND_PROPERTY]: ConnectorErrorKind;\n};\n\n/** The kind `err` declares for itself, or `undefined` when it declares none (or an unknown one). */\nexport function declaredConnectErrorKind(err: unknown): ConnectorErrorKind | undefined {\n if (err === null || typeof err !== \"object\" || !(CONNECT_ERROR_KIND_PROPERTY in err)) {\n return undefined;\n }\n const value = (err as Record<string, unknown>)[CONNECT_ERROR_KIND_PROPERTY];\n return (CONNECTOR_ERROR_KINDS as readonly unknown[]).includes(value)\n ? (value as ConnectorErrorKind)\n : undefined;\n}\n\n/**\n * Stamp `kind` onto `err` unless it already declares one, and return it for\n * rethrowing. For throw sites that know what a failure means but throw an\n * error they did not construct (a failed `git` child, say).\n */\nexport function withConnectErrorKind<T>(err: T, kind: ConnectorErrorKind): T {\n if (err !== null && typeof err === \"object\" && !(CONNECT_ERROR_KIND_PROPERTY in err)) {\n try {\n (err as Record<string, unknown>)[CONNECT_ERROR_KIND_PROPERTY] = kind;\n } catch {\n // Frozen or sealed: unclassified beats replacing the real error with a TypeError.\n }\n }\n return err;\n}\n\n/**\n * An `Error` carrying an explicit {@link ConnectorErrorKind}, for throw sites\n * that build their own error.\n */\nexport class ClassifiedConnectError extends Error {\n readonly [CONNECT_ERROR_KIND_PROPERTY]: ConnectorErrorKind;\n constructor(message: string, kind: ConnectorErrorKind) {\n super(message);\n this.name = \"ClassifiedConnectError\";\n this[CONNECT_ERROR_KIND_PROPERTY] = kind;\n }\n}\n"]}
@@ -1,7 +1,8 @@
1
- import { resolveAuthRef } from './chunk-KW7YIRYL.js';
2
- import { EventNormalizer } from './chunk-GVOPQBGM.js';
3
- import { resolveModelTier } from './chunk-VP2CACF2.js';
4
- import { createDriver } from './chunk-C2CYBRYJ.js';
1
+ import { declaredConnectErrorKind, ClassifiedConnectError, withConnectErrorKind } from './chunk-SDNGG6FB.js';
2
+ import { OAuthRequiredError, LegacyAuthGrammarError, resolveAuthRef } from './chunk-KW7YIRYL.js';
3
+ import { EventNormalizer } from './chunk-V7SHQXDI.js';
4
+ import { resolveModelTier } from './chunk-QVTROHEZ.js';
5
+ import { createDriver } from './chunk-KMFZVPYR.js';
5
6
  import { pluginRegistry } from './chunk-6E6PKKAD.js';
6
7
  import { computeStimulus } from './chunk-IFGTRL2I.js';
7
8
  import { interpolateNodeInstruction, resolveNodeBindings, getConsumedOutputSchema, validateConsumedNodeOutput, appendAttempt, resolveTerminalFailureStatus, remainingActiveExecutionMs, deriveCheckEvidence, computeFlowStateFromSnapshots, availableRouterFrontier, evaluateRouterSelection, routerSelectionOutput, planRouterSkips, unsettledRouterBranchIds, countFailedAttempts, hasAutomaticRetryBudget, persistedRouterSelection } from './chunk-NWZQMJTI.js';
@@ -9,7 +10,7 @@ import { INPUT_SCHEMA_SHAPES_HINT, coerceInputSchema } from './chunk-TIOT3ZOQ.js
9
10
  import { classifierDecision, withoutReservedClassifierFields, parseFlowDefinition } from './chunk-53ORCYPJ.js';
10
11
  import { describeStimulus, buildOrchestratorPrompt, renderSubpromptPrompt, renderStimulusPrompt } from './chunk-2D5BYAL6.js';
11
12
  import { deterministicNodeKindLabel, nodeInstruction, flowDefaults, isAgentNode, isGateNode, isCheckNode, nodeRequiresApproval, isSubFlowNode, isFunctionNode, isSubpromptNode, isRouterNode, isActiveRuntimeNode, nodeIsOptional, nodeLabel, nodeAssets } from './chunk-ELPR5XBG.js';
12
- import { withActivityLabelDefs } from './chunk-U4AA7MOV.js';
13
+ import { withActivityLabelDefs } from './chunk-QAH24E5U.js';
13
14
  import { processAlive } from './chunk-UJPVUN6H.js';
14
15
  import { withFsDeadline, tryWithFsDeadline, FsDeadlineError, fsDeadlineMs } from './chunk-MKZOK4JU.js';
15
16
  import { portableSpawn } from './chunk-KSIRR5PL.js';
@@ -734,6 +735,44 @@ function runIsolatedPrompt(driver, prompt) {
734
735
  driver.prompt(prompt).catch(done);
735
736
  });
736
737
  }
738
+
739
+ // connectors/src/connector-types.ts
740
+ var ConnectorFieldMissingError = class extends Error {
741
+ connectorId;
742
+ field;
743
+ triedRef;
744
+ availableProviders;
745
+ constructor(opts) {
746
+ super(
747
+ `Connector "${opts.connectorId}" is missing required field "${opts.field.key}" (tried: ${opts.triedRef || "(none)"}). Available providers: ${opts.availableProviders.join(", ") || "(none)"}`
748
+ );
749
+ this.name = "ConnectorFieldMissingError";
750
+ this.connectorId = opts.connectorId;
751
+ this.field = opts.field;
752
+ this.triedRef = opts.triedRef;
753
+ this.availableProviders = opts.availableProviders;
754
+ }
755
+ };
756
+ var ConnectorStartupError = class extends Error {
757
+ report;
758
+ failedReadWrite;
759
+ constructor(message, report, failedReadWrite) {
760
+ super(message);
761
+ this.name = "ConnectorStartupError";
762
+ this.report = report;
763
+ this.failedReadWrite = failedReadWrite;
764
+ }
765
+ };
766
+
767
+ // connectors/src/classify-connect-error.ts
768
+ function classifyConnectError(err) {
769
+ const declared = declaredConnectErrorKind(err);
770
+ if (declared) return declared;
771
+ if (err instanceof OAuthRequiredError) return "credential";
772
+ if (err instanceof ConnectorFieldMissingError) return "config";
773
+ if (err instanceof LegacyAuthGrammarError) return "config";
774
+ return void 0;
775
+ }
737
776
  var execFileAsync = promisify(execFile);
738
777
  var GIT_REV_PARSE_TIMEOUT_MS = 15e3;
739
778
  var DeployConnector = class extends AbstractConnector {
@@ -1519,6 +1558,10 @@ function resolveGitConfig(args) {
1519
1558
  };
1520
1559
  }
1521
1560
  var modeLog = createLogger({ kind: "connector", subkind: "git" });
1561
+ var REFRESH_LEAD_MS = 5 * 60 * 1e3;
1562
+ var MIN_REFRESH_DELAY_MS = 3e4;
1563
+ var TRANSIENT_REFRESH_RETRY_MS = 3e4;
1564
+ var MAX_REARM_MS = 24 * 24 * 60 * 60 * 1e3;
1522
1565
  var execFileAsync2 = promisify(execFile);
1523
1566
  function redactUrlAuth(text) {
1524
1567
  return text.replace(/\/\/[^/\s]*@/g, "//***@");
@@ -1659,6 +1702,15 @@ async function clearStaleIndexLock(targetDir, log) {
1659
1702
  log.warn("removed an abandoned .git/index.lock", { lockPath, ageMs });
1660
1703
  }
1661
1704
  }
1705
+ function isIndexLockFailure(err) {
1706
+ const stderr = err?.stderr;
1707
+ return typeof stderr === "string" && /index\.lock/.test(stderr);
1708
+ }
1709
+ function gitLocalCheckout(args, cwd) {
1710
+ return git(["checkout", ...args], cwd).catch((err) => {
1711
+ throw typeof err?.code === "number" ? withConnectErrorKind(err, "repo-state") : err;
1712
+ });
1713
+ }
1662
1714
  async function syncSubmodules(cwd, log) {
1663
1715
  if (!await pathExists(join(cwd, ".gitmodules"))) return;
1664
1716
  try {
@@ -1739,6 +1791,8 @@ async function commitAll(cwd, message) {
1739
1791
  return gitCommitting(["commit", "-m", message], cwd);
1740
1792
  }
1741
1793
  var TokenMediatorError = class extends Error {
1794
+ /** Every mediator refusal is fixed where the credential lives, whatever its code. */
1795
+ skaileConnectErrorKind = "credential";
1742
1796
  code;
1743
1797
  constructor(message, code, connectorId) {
1744
1798
  super(`Git connector '${connectorId}': backend mediator ${code} \u2014 ${message}`);
@@ -1800,10 +1854,10 @@ var GitConnector = class extends AbstractConnector {
1800
1854
  let credentialAlignmentAttempted = false;
1801
1855
  if (!url) {
1802
1856
  this.log.error("connect failed: missing mount.source URL", void 0);
1803
- throw new Error("Git connector requires a mount.source URL");
1857
+ throw new ClassifiedConnectError("Git connector requires a mount.source URL", "config");
1804
1858
  }
1805
1859
  if (!isValidGitRefOrSha(branch)) {
1806
- throw new Error(`Git connector: invalid branch name "${branch}"`);
1860
+ throw new ClassifiedConnectError(`Git connector: invalid branch name "${branch}"`, "config");
1807
1861
  }
1808
1862
  try {
1809
1863
  this.log.info("mount start", { url, branch, targetDir });
@@ -1884,6 +1938,7 @@ var GitConnector = class extends AbstractConnector {
1884
1938
  }
1885
1939
  }
1886
1940
  this.registerUnavailableCredentialHelper(declaration, credentialScopeUrl, err);
1941
+ if (isIndexLockFailure(err)) withConnectErrorKind(err, "repo-state");
1887
1942
  throw err;
1888
1943
  }
1889
1944
  }
@@ -1972,11 +2027,14 @@ var GitConnector = class extends AbstractConnector {
1972
2027
  async checkoutSessionBranch(state, session, targetDir) {
1973
2028
  const sessionBranch = `${session.branchPrefix}${session.slug}`;
1974
2029
  if (!isValidGitRefOrSha(sessionBranch)) {
1975
- throw new Error(`Git connector: invalid session branch name "${sessionBranch}"`);
2030
+ throw new ClassifiedConnectError(
2031
+ `Git connector: invalid session branch name "${sessionBranch}"`,
2032
+ "config"
2033
+ );
1976
2034
  }
1977
2035
  let created = false;
1978
2036
  if (await localBranchExists(sessionBranch, targetDir)) {
1979
- await git(["checkout", sessionBranch], targetDir);
2037
+ await gitLocalCheckout([sessionBranch], targetDir);
1980
2038
  this.log.info("reusing existing local session branch", { sessionBranch });
1981
2039
  } else {
1982
2040
  let originHasBranch = false;
@@ -1986,9 +2044,9 @@ var GitConnector = class extends AbstractConnector {
1986
2044
  } catch {
1987
2045
  }
1988
2046
  if (originHasBranch) {
1989
- await git(["checkout", "-B", sessionBranch, `origin/${sessionBranch}`], targetDir);
2047
+ await gitLocalCheckout(["-B", sessionBranch, `origin/${sessionBranch}`], targetDir);
1990
2048
  } else if (!await this.branchFromRef(session, sessionBranch, targetDir)) {
1991
- await git(["checkout", "-b", sessionBranch], targetDir);
2049
+ await gitLocalCheckout(["-b", sessionBranch], targetDir);
1992
2050
  created = true;
1993
2051
  } else {
1994
2052
  created = true;
@@ -2308,8 +2366,9 @@ var GitConnector = class extends AbstractConnector {
2308
2366
  }
2309
2367
  if (authRef.kind === "backend") {
2310
2368
  if (!tokenMediator) {
2311
- throw new Error(
2312
- `Connector '${declaration.id}' uses 'auth: backend' but no token mediator is wired (standalone CLI does not have one \u2014 use 'pat:env:NAME' instead).`
2369
+ throw new ClassifiedConnectError(
2370
+ `Connector '${declaration.id}' uses 'auth: backend' but no token mediator is wired (standalone CLI does not have one \u2014 use 'pat:env:NAME' instead).`,
2371
+ "config"
2313
2372
  );
2314
2373
  }
2315
2374
  const result = await tokenMediator({ connectorId: declaration.id, reason: "initial" });
@@ -2338,8 +2397,9 @@ var GitConnector = class extends AbstractConnector {
2338
2397
  token = inner;
2339
2398
  }
2340
2399
  if (!token) {
2341
- throw new Error(
2342
- `PAT auth ref '${authRef.raw}' did not resolve to a token. Provision '${authRef.value}' in the SecretProviderChain.`
2400
+ throw new ClassifiedConnectError(
2401
+ `PAT auth ref '${authRef.raw}' did not resolve to a token. Provision '${authRef.value}' in the SecretProviderChain.`,
2402
+ "credential"
2343
2403
  );
2344
2404
  }
2345
2405
  return { authRef, token, expiresAt: null };
@@ -2524,25 +2584,44 @@ var GitConnector = class extends AbstractConnector {
2524
2584
  }
2525
2585
  }
2526
2586
  /**
2527
- * Schedule the next refresh of the credential file.
2587
+ * Schedule the next refresh of the credential file, {@link REFRESH_LEAD_MS}
2588
+ * before `expiresAt`.
2528
2589
  *
2529
2590
  * Cancels any existing timer first so re-connects (and the test harness)
2530
- * do not double-fire. Uses a 5-minute lead per spec; if the lead is
2531
- * negative (very short-lived test tokens) we fall back to a tiny delay
2532
- * so the timer still fires in deterministic order.
2591
+ * do not double-fire. The delay is clamped into
2592
+ * [{@link MIN_REFRESH_DELAY_MS}, {@link MAX_REARM_MS}]: the floor stops a
2593
+ * mediator that keeps minting tokens inside the lead from re-minting every
2594
+ * second, and a delay above the cap is served as re-arms that mint nothing
2595
+ * until the real refresh point — `setTimeout` silently collapses anything
2596
+ * over 2^31-1 ms (~24.8d) to 1 ms, which would mint in a loop.
2533
2597
  */
2534
2598
  scheduleRefresh(connectorId, state, expiresAt) {
2535
2599
  if (state.refreshTimer) {
2536
2600
  clearTimeout(state.refreshTimer);
2537
2601
  state.refreshTimer = void 0;
2538
2602
  }
2539
- const FIVE_MINUTES_MS = 5 * 60 * 1e3;
2540
- const delay = Math.max(1e3, expiresAt.getTime() - Date.now() - FIVE_MINUTES_MS);
2541
- state.refreshTimer = setTimeout(() => {
2542
- this.refreshManagedCredential(connectorId, state).catch((err) => {
2543
- this.log.error("managed-gitconfig refresh failed", err, { connectorId });
2603
+ const delay = Math.max(
2604
+ MIN_REFRESH_DELAY_MS,
2605
+ expiresAt.getTime() - Date.now() - REFRESH_LEAD_MS
2606
+ );
2607
+ if (delay > MAX_REARM_MS) {
2608
+ this.log.info("refresh delay exceeds the re-arm cap; re-arming without a refresh", {
2609
+ connectorId,
2610
+ delayMs: delay,
2611
+ rearmMs: MAX_REARM_MS
2544
2612
  });
2545
- }, delay);
2613
+ state.refreshTimer = setTimeout(
2614
+ () => this.scheduleRefresh(connectorId, state, expiresAt),
2615
+ MAX_REARM_MS
2616
+ );
2617
+ } else {
2618
+ state.refreshTimer = setTimeout(() => {
2619
+ this.refreshManagedCredential(connectorId, state).catch((err) => {
2620
+ this.log.error("managed-gitconfig refresh failed", err, { connectorId });
2621
+ });
2622
+ }, delay);
2623
+ }
2624
+ state.refreshTimer.unref?.();
2546
2625
  }
2547
2626
  async refreshManagedCredential(connectorId, state) {
2548
2627
  if (!state.tokenMediator) return;
@@ -2562,7 +2641,8 @@ var GitConnector = class extends AbstractConnector {
2562
2641
  this.refreshManagedCredential(connectorId, state).catch((err) => {
2563
2642
  this.log.error("managed-gitconfig refresh retry failed", err, { connectorId });
2564
2643
  });
2565
- }, 3e4);
2644
+ }, TRANSIENT_REFRESH_RETRY_MS);
2645
+ state.refreshTimer.unref?.();
2566
2646
  }
2567
2647
  return;
2568
2648
  }
@@ -6237,34 +6317,6 @@ function ensureBuiltinsRegistered() {
6237
6317
  }
6238
6318
  }
6239
6319
 
6240
- // connectors/src/connector-types.ts
6241
- var ConnectorFieldMissingError = class extends Error {
6242
- connectorId;
6243
- field;
6244
- triedRef;
6245
- availableProviders;
6246
- constructor(opts) {
6247
- super(
6248
- `Connector "${opts.connectorId}" is missing required field "${opts.field.key}" (tried: ${opts.triedRef || "(none)"}). Available providers: ${opts.availableProviders.join(", ") || "(none)"}`
6249
- );
6250
- this.name = "ConnectorFieldMissingError";
6251
- this.connectorId = opts.connectorId;
6252
- this.field = opts.field;
6253
- this.triedRef = opts.triedRef;
6254
- this.availableProviders = opts.availableProviders;
6255
- }
6256
- };
6257
- var ConnectorStartupError = class extends Error {
6258
- report;
6259
- failedReadWrite;
6260
- constructor(message, report, failedReadWrite) {
6261
- super(message);
6262
- this.name = "ConnectorStartupError";
6263
- this.report = report;
6264
- this.failedReadWrite = failedReadWrite;
6265
- }
6266
- };
6267
-
6268
6320
  // connectors/src/connector-manager.ts
6269
6321
  var KNOWN_PREFIXES = ["env:", "forge:", "op:", "kp:", "oauth:"];
6270
6322
  function hasKnownPrefix(ref) {
@@ -6467,16 +6519,18 @@ var ConnectorManager = class {
6467
6519
  if (registered) return registered;
6468
6520
  const entry = this.catalogEntries.find((e) => e.kind === "connector" && e.name === driver);
6469
6521
  if (!entry) {
6470
- throw new Error(
6471
- `Unknown connector: "${driver}". Run 'skaile search connector' to see available connectors.`
6522
+ throw new ClassifiedConnectError(
6523
+ `Unknown connector: "${driver}". Run 'skaile search connector' to see available connectors.`,
6524
+ "config"
6472
6525
  );
6473
6526
  }
6474
6527
  const entryPoint = entry.metadata?.entry ?? "./connector.ts";
6475
6528
  const connectorPath = resolve(dirname(entry.source), entryPoint);
6476
6529
  const mod = await import(connectorPath);
6477
6530
  if (typeof mod.createConnector !== "function") {
6478
- throw new Error(
6479
- `Connector "${driver}" at ${connectorPath} does not export createConnector()`
6531
+ throw new ClassifiedConnectError(
6532
+ `Connector "${driver}" at ${connectorPath} does not export createConnector()`,
6533
+ "config"
6480
6534
  );
6481
6535
  }
6482
6536
  const connector = mod.createConnector();
@@ -6511,8 +6565,9 @@ var ConnectorManager = class {
6511
6565
  const owner = this.mountTargets.get(absPath);
6512
6566
  if (owner === id) return;
6513
6567
  if (owner !== void 0) {
6514
- throw new Error(
6515
- `Mount target collision: connectors "${owner}" and "${id}" both resolve to "${absPath}". Each filesystem connector needs a distinct mount.target.`
6568
+ throw new ClassifiedConnectError(
6569
+ `Mount target collision: connectors "${owner}" and "${id}" both resolve to "${absPath}". Each filesystem connector needs a distinct mount.target.`,
6570
+ "config"
6516
6571
  );
6517
6572
  }
6518
6573
  for (const [otherPath, otherId] of this.mountTargets) {
@@ -6720,12 +6775,18 @@ var ConnectorManager = class {
6720
6775
  if (!this.active.has(decl.id)) this.releaseMountTarget(decl.id);
6721
6776
  const msg = err instanceof Error ? err.message : String(err);
6722
6777
  this.recordFailure(decl, msg);
6723
- this.mgrLog.error("connect failed", err, { id: decl.id, driver: decl.driver });
6778
+ const errorKind = classifyConnectError(err);
6779
+ this.mgrLog.error("connect failed", err, {
6780
+ id: decl.id,
6781
+ driver: decl.driver,
6782
+ ...errorKind ? { errorKind } : {}
6783
+ });
6724
6784
  this.opts.onStatusChange?.({
6725
6785
  type: "connector_status",
6726
6786
  connectorId: decl.id,
6727
6787
  status: "error",
6728
- error: msg
6788
+ error: msg,
6789
+ ...errorKind ? { errorKind } : {}
6729
6790
  });
6730
6791
  return {
6731
6792
  id: decl.id,
@@ -6810,11 +6871,13 @@ var ConnectorManager = class {
6810
6871
  this.releaseMountTarget(declaration.id);
6811
6872
  const msg = err instanceof Error ? err.message : String(err);
6812
6873
  this.recordFailure(declaration, msg);
6874
+ const errorKind = classifyConnectError(err);
6813
6875
  this.opts.onStatusChange?.({
6814
6876
  type: "connector_status",
6815
6877
  connectorId: declaration.id,
6816
6878
  status: "error",
6817
- error: msg
6879
+ error: msg,
6880
+ ...errorKind ? { errorKind } : {}
6818
6881
  });
6819
6882
  throw err;
6820
6883
  }
@@ -11057,6 +11120,6 @@ function describeFlowOperations() {
11057
11120
  return new FlowAdapter().tools.describeOperations({ access: "read-write" });
11058
11121
  }
11059
11122
 
11060
- export { AbstractConnector, BUILTIN_CONNECTOR_CATALOG, BoxConnector, ClassifierSubpromptRunner, ConnectorFieldMissingError, ConnectorManager, ConnectorStartupError, DeployConnector, DevServerConnector, FlowAdapter, GitConnector, GmailConnector, GoogleDriveConnector, LocalConnector, LogBuffer, ManagedGitconfigCollisionError, MattermostConnector, MemoryConnector, MinIOConnector, NO_ACTIVE_FLOW_ERROR, PortPool, PostgresConnector, S3Connector, SQLiteConnector, SessionInlineSubFlowRunner, SessionNodeExecutor, SessionSubpromptRunner, SharePointConnector, StaticServerConnector, TunnelConnector, WebDAVConnector, XStateConnector, XStateStoreConnector, __test, atomicReplaceCredential, buildConnectorPromptSection, buildConnectorToolDefs, buildFlowPromptEvent, buildFlowToolDefs, buildLazyFlowToolDefs, buildLazySdkFlowTools, buildSdkConnectorTools, buildSdkFlowTools, classifierQuestion, createConnector, createConnector10, createConnector11, createConnector12, createConnector13, createConnector14, createConnector15, createConnector16, createConnector17, createConnector18, createConnector19, createConnector2, createConnector20, createConnector3, createConnector4, createConnector5, createConnector6, createConnector7, createConnector8, createConnector9, createFsWatcher, createWorktree, defaultSpawn, describeFlowOperations, driveOrchestratorTurn, ensureDirMode, ensureFleetMounted, ensureRefreshAttemptStamp, findGitRoot, findMissingPackages, getConnector, installNpmPackages, isFleetManaged, isPackageResolvable, listConnectors, listWorktrees, readGitSyncStatus, registerBuiltinConnectors, removeMountBlock, removeUnavailableMountBlock, renderCredentialHelperScript, tryGetConnector, worktreeRegistry, writeHelperScript, writeMountBlock, writeUnavailableMountBlock };
11061
- //# sourceMappingURL=chunk-KY5VVPM2.js.map
11062
- //# sourceMappingURL=chunk-KY5VVPM2.js.map
11123
+ export { AbstractConnector, BUILTIN_CONNECTOR_CATALOG, BoxConnector, ClassifierSubpromptRunner, ConnectorFieldMissingError, ConnectorManager, ConnectorStartupError, DeployConnector, DevServerConnector, FlowAdapter, GitConnector, GmailConnector, GoogleDriveConnector, LocalConnector, LogBuffer, MAX_REARM_MS, MIN_REFRESH_DELAY_MS, ManagedGitconfigCollisionError, MattermostConnector, MemoryConnector, MinIOConnector, NO_ACTIVE_FLOW_ERROR, PortPool, PostgresConnector, REFRESH_LEAD_MS, S3Connector, SQLiteConnector, SessionInlineSubFlowRunner, SessionNodeExecutor, SessionSubpromptRunner, SharePointConnector, StaticServerConnector, TunnelConnector, WebDAVConnector, XStateConnector, XStateStoreConnector, __test, atomicReplaceCredential, buildConnectorPromptSection, buildConnectorToolDefs, buildFlowPromptEvent, buildFlowToolDefs, buildLazyFlowToolDefs, buildLazySdkFlowTools, buildSdkConnectorTools, buildSdkFlowTools, classifierQuestion, classifyConnectError, createConnector, createConnector10, createConnector11, createConnector12, createConnector13, createConnector14, createConnector15, createConnector16, createConnector17, createConnector18, createConnector19, createConnector2, createConnector20, createConnector3, createConnector4, createConnector5, createConnector6, createConnector7, createConnector8, createConnector9, createFsWatcher, createWorktree, defaultSpawn, describeFlowOperations, driveOrchestratorTurn, ensureDirMode, ensureFleetMounted, ensureRefreshAttemptStamp, findGitRoot, findMissingPackages, getConnector, installNpmPackages, isFleetManaged, isPackageResolvable, listConnectors, listWorktrees, readGitSyncStatus, registerBuiltinConnectors, removeMountBlock, removeUnavailableMountBlock, renderCredentialHelperScript, tryGetConnector, worktreeRegistry, writeHelperScript, writeMountBlock, writeUnavailableMountBlock };
11124
+ //# sourceMappingURL=chunk-TRGMQUAZ.js.map
11125
+ //# sourceMappingURL=chunk-TRGMQUAZ.js.map