@skaile/workspaces 4.6.0 → 4.7.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 (182) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/{asset-feeds-3XUEJHLJ.js → asset-feeds-CV7EE4GI.js} +7 -7
  3. package/dist/{asset-feeds-3XUEJHLJ.js.map → asset-feeds-CV7EE4GI.js.map} +1 -1
  4. package/dist/asset-manager/catalog-deployer.js +3 -3
  5. package/dist/asset-manager/index.js +6 -6
  6. package/dist/asset-manager/installer.js +4 -4
  7. package/dist/bridge/codex-app-server.js +4 -4
  8. package/dist/bridge/drivers/claude-sdk.js +52 -9
  9. package/dist/bridge/drivers/claude-sdk.js.map +1 -1
  10. package/dist/bridge/drivers/codex.js +6 -6
  11. package/dist/bridge/drivers/continue.js +6 -6
  12. package/dist/bridge/drivers/echo.js +1 -1
  13. package/dist/bridge/drivers/gemini.js +4 -4
  14. package/dist/bridge/drivers/goose.js +6 -6
  15. package/dist/bridge/drivers/omp.js +1 -1
  16. package/dist/bridge/drivers/opencode.js +6 -6
  17. package/dist/bridge/drivers/qwen.js +4 -4
  18. package/dist/bridge/index.js +6 -6
  19. package/dist/bridge/src/drivers/claude-sdk.d.ts +16 -0
  20. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
  21. package/dist/{chunk-YNZ5FIFH.js → chunk-4AAEBUX7.js} +7 -7
  22. package/dist/{chunk-YNZ5FIFH.js.map → chunk-4AAEBUX7.js.map} +1 -1
  23. package/dist/{chunk-JXCUUZA3.js → chunk-4ZTPYIBE.js} +9 -6
  24. package/dist/chunk-4ZTPYIBE.js.map +1 -0
  25. package/dist/{chunk-KMFZVPYR.js → chunk-5GYFYGVW.js} +2 -2
  26. package/dist/{chunk-KMFZVPYR.js.map → chunk-5GYFYGVW.js.map} +1 -1
  27. package/dist/{chunk-2HZJKDLG.js → chunk-7UM46L33.js} +2 -2
  28. package/dist/{chunk-2HZJKDLG.js.map → chunk-7UM46L33.js.map} +1 -1
  29. package/dist/{chunk-EVVE4SL4.js → chunk-A42QGGSB.js} +3 -3
  30. package/dist/{chunk-EVVE4SL4.js.map → chunk-A42QGGSB.js.map} +1 -1
  31. package/dist/{chunk-UJPVUN6H.js → chunk-BCXZ74DM.js} +4 -4
  32. package/dist/{chunk-UJPVUN6H.js.map → chunk-BCXZ74DM.js.map} +1 -1
  33. package/dist/{chunk-PTETBRRC.js → chunk-DS7B54NF.js} +3 -3
  34. package/dist/{chunk-PTETBRRC.js.map → chunk-DS7B54NF.js.map} +1 -1
  35. package/dist/{chunk-KW7YIRYL.js → chunk-DYT3AQBM.js} +44 -4
  36. package/dist/chunk-DYT3AQBM.js.map +1 -0
  37. package/dist/{chunk-6ZQU5WKJ.js → chunk-HBBVWZ4T.js} +4 -4
  38. package/dist/{chunk-6ZQU5WKJ.js.map → chunk-HBBVWZ4T.js.map} +1 -1
  39. package/dist/{chunk-K27T47OO.js → chunk-HKOC273F.js} +71 -5
  40. package/dist/chunk-HKOC273F.js.map +1 -0
  41. package/dist/{chunk-COK4WPU4.js → chunk-HR2AGPLJ.js} +4 -4
  42. package/dist/{chunk-COK4WPU4.js.map → chunk-HR2AGPLJ.js.map} +1 -1
  43. package/dist/{chunk-SAXTWLXZ.js → chunk-HVTU3CVF.js} +187 -48
  44. package/dist/chunk-HVTU3CVF.js.map +1 -0
  45. package/dist/{chunk-W3YYB7K7.js → chunk-IECSLI55.js} +3 -3
  46. package/dist/{chunk-W3YYB7K7.js.map → chunk-IECSLI55.js.map} +1 -1
  47. package/dist/{chunk-QVTROHEZ.js → chunk-IUVPPJ4T.js} +3 -3
  48. package/dist/{chunk-QVTROHEZ.js.map → chunk-IUVPPJ4T.js.map} +1 -1
  49. package/dist/{chunk-35XUCUKZ.js → chunk-J2NEKEZK.js} +3 -3
  50. package/dist/{chunk-35XUCUKZ.js.map → chunk-J2NEKEZK.js.map} +1 -1
  51. package/dist/{chunk-DXXIALYF.js → chunk-JH63TVZG.js} +5 -5
  52. package/dist/{chunk-DXXIALYF.js.map → chunk-JH63TVZG.js.map} +1 -1
  53. package/dist/{chunk-WVSF3IEQ.js → chunk-JWWER4L5.js} +2 -2
  54. package/dist/{chunk-WVSF3IEQ.js.map → chunk-JWWER4L5.js.map} +1 -1
  55. package/dist/{chunk-63PBQN5U.js → chunk-MHROUPZN.js} +9 -9
  56. package/dist/{chunk-63PBQN5U.js.map → chunk-MHROUPZN.js.map} +1 -1
  57. package/dist/{chunk-NWZQMJTI.js → chunk-NIHNZC6E.js} +3 -3
  58. package/dist/{chunk-NWZQMJTI.js.map → chunk-NIHNZC6E.js.map} +1 -1
  59. package/dist/{chunk-VZOUBMM4.js → chunk-NV6R6HJR.js} +5 -5
  60. package/dist/{chunk-VZOUBMM4.js.map → chunk-NV6R6HJR.js.map} +1 -1
  61. package/dist/{chunk-TRGMQUAZ.js → chunk-NYRLSXTB.js} +66 -47
  62. package/dist/chunk-NYRLSXTB.js.map +1 -0
  63. package/dist/{chunk-D3332IMQ.js → chunk-P2PXD3AF.js} +6 -6
  64. package/dist/{chunk-D3332IMQ.js.map → chunk-P2PXD3AF.js.map} +1 -1
  65. package/dist/{chunk-CU32AWH5.js → chunk-Q5WGUPC5.js} +3 -3
  66. package/dist/{chunk-CU32AWH5.js.map → chunk-Q5WGUPC5.js.map} +1 -1
  67. package/dist/{chunk-ZGYPEVZW.js → chunk-RN3N7PHY.js} +5 -5
  68. package/dist/{chunk-ZGYPEVZW.js.map → chunk-RN3N7PHY.js.map} +1 -1
  69. package/dist/{chunk-5CDL6VZQ.js → chunk-S5TEP5WI.js} +7 -7
  70. package/dist/{chunk-5CDL6VZQ.js.map → chunk-S5TEP5WI.js.map} +1 -1
  71. package/dist/{chunk-REILIKVM.js → chunk-SU5LVG6T.js} +3 -3
  72. package/dist/{chunk-REILIKVM.js.map → chunk-SU5LVG6T.js.map} +1 -1
  73. package/dist/{chunk-23BTREZQ.js → chunk-TKHJXUG3.js} +4 -4
  74. package/dist/{chunk-23BTREZQ.js.map → chunk-TKHJXUG3.js.map} +1 -1
  75. package/dist/{chunk-V7SHQXDI.js → chunk-U4LC6PLI.js} +3 -3
  76. package/dist/{chunk-V7SHQXDI.js.map → chunk-U4LC6PLI.js.map} +1 -1
  77. package/dist/{chunk-YSJKLJD4.js → chunk-VRBEMXEM.js} +3 -3
  78. package/dist/{chunk-YSJKLJD4.js.map → chunk-VRBEMXEM.js.map} +1 -1
  79. package/dist/{chunk-2CFREMKM.js → chunk-XENB453B.js} +4 -4
  80. package/dist/{chunk-2CFREMKM.js.map → chunk-XENB453B.js.map} +1 -1
  81. package/dist/cli/index.js +50 -50
  82. package/dist/connectors/config.js +4 -4
  83. package/dist/connectors/index.js +9 -9
  84. package/dist/connectors/src/config.d.ts.map +1 -1
  85. package/dist/connectors/src/connector-manager.d.ts +9 -0
  86. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  87. package/dist/connectors/src/connector-prompt.d.ts.map +1 -1
  88. package/dist/connectors/src/connector-types.d.ts +25 -0
  89. package/dist/connectors/src/connector-types.d.ts.map +1 -1
  90. package/dist/connectors/src/index.d.ts +2 -2
  91. package/dist/connectors/src/index.d.ts.map +1 -1
  92. package/dist/core/index.js +3 -3
  93. package/dist/core/runtime-assets.js +2 -2
  94. package/dist/core/src/index.d.ts +1 -1
  95. package/dist/core/src/index.d.ts.map +1 -1
  96. package/dist/core/src/workspace-config.d.ts +64 -0
  97. package/dist/core/src/workspace-config.d.ts.map +1 -1
  98. package/dist/core/workspace-config.js +1 -1
  99. package/dist/deploy/index.js +3 -3
  100. package/dist/{ensure-sources-MFQDQPYL.js → ensure-sources-E5C3NAZ5.js} +9 -9
  101. package/dist/{ensure-sources-MFQDQPYL.js.map → ensure-sources-E5C3NAZ5.js.map} +1 -1
  102. package/dist/factory-assets/connectors/box.js +9 -9
  103. package/dist/factory-assets/connectors/deploy.js +9 -9
  104. package/dist/factory-assets/connectors/devserver.js +9 -9
  105. package/dist/factory-assets/connectors/flow/adapter.js +9 -9
  106. package/dist/factory-assets/connectors/flow/engine.js +4 -4
  107. package/dist/factory-assets/connectors/flow/run-flow.js +10 -10
  108. package/dist/factory-assets/connectors/flow.js +9 -9
  109. package/dist/factory-assets/connectors/git.js +9 -9
  110. package/dist/factory-assets/connectors/gmail.js +9 -9
  111. package/dist/factory-assets/connectors/googledrive.js +9 -9
  112. package/dist/factory-assets/connectors/local.js +9 -9
  113. package/dist/factory-assets/connectors/mattermost.js +9 -9
  114. package/dist/factory-assets/connectors/memory.js +9 -9
  115. package/dist/factory-assets/connectors/minio.js +9 -9
  116. package/dist/factory-assets/connectors/postgres.js +9 -9
  117. package/dist/factory-assets/connectors/s3.js +9 -9
  118. package/dist/factory-assets/connectors/sharepoint.js +9 -9
  119. package/dist/factory-assets/connectors/sqlite.js +9 -9
  120. package/dist/factory-assets/connectors/static-server.js +9 -9
  121. package/dist/factory-assets/connectors/tunnel.js +9 -9
  122. package/dist/factory-assets/connectors/webdav.js +9 -9
  123. package/dist/factory-assets/connectors/xstate-store.js +9 -9
  124. package/dist/factory-assets/connectors/xstate.js +9 -9
  125. package/dist/{flows-X4KJC4RH.js → flows-DAA2HPCK.js} +6 -6
  126. package/dist/{flows-X4KJC4RH.js.map → flows-DAA2HPCK.js.map} +1 -1
  127. package/dist/{helpers-VQLLQ6HB.js → helpers-B37XGJHI.js} +9 -9
  128. package/dist/{helpers-VQLLQ6HB.js.map → helpers-B37XGJHI.js.map} +1 -1
  129. package/dist/library/index.js +4 -4
  130. package/dist/library/install.js +3 -3
  131. package/dist/{library-publish-73SFVNCE.js → library-publish-ANMJDDZH.js} +13 -13
  132. package/dist/{library-publish-73SFVNCE.js.map → library-publish-ANMJDDZH.js.map} +1 -1
  133. package/dist/{open-library-QGTUQMUG.js → open-library-O5HS654Y.js} +11 -11
  134. package/dist/{open-library-QGTUQMUG.js.map → open-library-O5HS654Y.js.map} +1 -1
  135. package/dist/{paths-FRD62K2N.js → paths-LH7LD4CC.js} +6 -6
  136. package/dist/{paths-FRD62K2N.js.map → paths-LH7LD4CC.js.map} +1 -1
  137. package/dist/{plugin-store-54SEASTK.js → plugin-store-A6VLQHCT.js} +5 -5
  138. package/dist/{plugin-store-54SEASTK.js.map → plugin-store-A6VLQHCT.js.map} +1 -1
  139. package/dist/{project-LWS5PYIF.js → project-DLAPSJ36.js} +10 -10
  140. package/dist/{project-LWS5PYIF.js.map → project-DLAPSJ36.js.map} +1 -1
  141. package/dist/resolver/index.js +3 -3
  142. package/dist/runner/index.js +15 -15
  143. package/dist/runner/src/runner-capabilities.d.ts +33 -2
  144. package/dist/runner/src/runner-capabilities.d.ts.map +1 -1
  145. package/dist/runner/src/serial-lock.d.ts +17 -0
  146. package/dist/runner/src/serial-lock.d.ts.map +1 -0
  147. package/dist/runner/src/serve.d.ts.map +1 -1
  148. package/dist/runner/src/session-capability-wiring.d.ts +5 -0
  149. package/dist/runner/src/session-capability-wiring.d.ts.map +1 -1
  150. package/dist/runner/src/session-resource-handlers.d.ts.map +1 -1
  151. package/dist/runner/src/skill-staging.d.ts +76 -0
  152. package/dist/runner/src/skill-staging.d.ts.map +1 -0
  153. package/dist/sdk/asset-manager.js +6 -6
  154. package/dist/sdk/bridge.js +6 -6
  155. package/dist/sdk/core.js +3 -3
  156. package/dist/sdk/flow.js +4 -4
  157. package/dist/sdk/index.js +15 -15
  158. package/dist/sdk/resolver.js +3 -3
  159. package/dist/sdk/runner.js +15 -15
  160. package/dist/{setup-EOJWDJK2.js → setup-TMPJSDCX.js} +13 -13
  161. package/dist/{setup-EOJWDJK2.js.map → setup-TMPJSDCX.js.map} +1 -1
  162. package/dist/{skills-C6NOMIBV.js → skills-ZO66BL2Y.js} +5 -5
  163. package/dist/{skills-C6NOMIBV.js.map → skills-ZO66BL2Y.js.map} +1 -1
  164. package/dist/{source-Q5IIYTRA.js → source-5WMBWNO7.js} +12 -12
  165. package/dist/{source-Q5IIYTRA.js.map → source-5WMBWNO7.js.map} +1 -1
  166. package/dist/{source-manifest-publish-Z3WC4HA2.js → source-manifest-publish-WBVQV3JC.js} +14 -14
  167. package/dist/{source-manifest-publish-Z3WC4HA2.js.map → source-manifest-publish-WBVQV3JC.js.map} +1 -1
  168. package/dist/tui/index.js +15 -15
  169. package/dist/validator-FA2PFW6N.js +5 -0
  170. package/dist/{validator-P5ESKTW5.js.map → validator-FA2PFW6N.js.map} +1 -1
  171. package/dist/workspace-plugin/adapters/mcp.js +6 -6
  172. package/dist/workspace-plugin/adapters/omp.js +10 -10
  173. package/dist/workspace-plugin/index.js +1 -1
  174. package/dist/workspace-plugin/src/tools/validator.d.ts +1 -0
  175. package/dist/workspace-plugin/src/tools/validator.d.ts.map +1 -1
  176. package/package.json +1 -1
  177. package/dist/chunk-JXCUUZA3.js.map +0 -1
  178. package/dist/chunk-K27T47OO.js.map +0 -1
  179. package/dist/chunk-KW7YIRYL.js.map +0 -1
  180. package/dist/chunk-SAXTWLXZ.js.map +0 -1
  181. package/dist/chunk-TRGMQUAZ.js.map +0 -1
  182. package/dist/validator-P5ESKTW5.js +0 -5
@@ -1,27 +1,27 @@
1
- import { WorkspacePlugin } from './chunk-2HZJKDLG.js';
2
- import { buildWorkspaceToolDefs } from './chunk-6ZQU5WKJ.js';
1
+ import { WorkspacePlugin } from './chunk-7UM46L33.js';
2
+ import { buildWorkspaceToolDefs } from './chunk-HBBVWZ4T.js';
3
3
  import { findAiAssetsRoot } from './chunk-7IRJ4K4F.js';
4
4
  import { WebSocketServerTransport } from './chunk-73ZXUUL6.js';
5
5
  import { assembleSystemPrompt, buildCapabilitiesPromptSection } from './chunk-W3UDISS2.js';
6
6
  import { prepareNativePolicy, codexInstanceEnvironment, parseCodexCredential, parseCodexRefreshInput, parseCodexRefreshResult } from './chunk-45LLHKQ2.js';
7
- import { resolveFlowPath } from './chunk-D3332IMQ.js';
7
+ import { resolveFlowPath } from './chunk-P2PXD3AF.js';
8
8
  import { findAiAssetsRoot as findAiAssetsRoot$1, deployCatalogEntry, undeployCatalogEntry } from './chunk-7BUZQVRR.js';
9
- import { registerBuiltinConnectors, buildConnectorPromptSection, findMissingPackages, installNpmPackages, ConnectorManager, ConnectorStartupError, buildSdkConnectorTools, buildLazySdkFlowTools, describeFlowOperations, buildConnectorToolDefs, buildFlowToolDefs, driveOrchestratorTurn, SessionNodeExecutor, SessionSubpromptRunner, ClassifierSubpromptRunner, SessionInlineSubFlowRunner, buildSdkFlowTools } from './chunk-TRGMQUAZ.js';
10
- import { loadConnectorDeclarations, SecretProviderChain, PreMintedSecretProvider, InMemorySecretProvider, resolvedConfigToDeclarations, isKnownSecretRef, deriveSingleMaterializedConnectorDeclaration } from './chunk-KW7YIRYL.js';
11
- import { EventNormalizer } from './chunk-V7SHQXDI.js';
9
+ import { registerBuiltinConnectors, buildConnectorPromptSection, findMissingPackages, installNpmPackages, ConnectorManager, buildSdkConnectorTools, buildLazySdkFlowTools, describeFlowOperations, buildConnectorToolDefs, buildFlowToolDefs, driveOrchestratorTurn, SessionNodeExecutor, SessionSubpromptRunner, ClassifierSubpromptRunner, SessionInlineSubFlowRunner, buildSdkFlowTools } from './chunk-NYRLSXTB.js';
10
+ import { loadConnectorDeclarations, SecretProviderChain, ConnectorStartupError, PreMintedSecretProvider, InMemorySecretProvider, resolvedConfigToDeclarations, isKnownSecretRef, deriveSingleMaterializedConnectorDeclaration } from './chunk-DYT3AQBM.js';
11
+ import { EventNormalizer } from './chunk-U4LC6PLI.js';
12
12
  import { probeResumeTranscript } from './chunk-OUJVFZWJ.js';
13
13
  import { CodexNativeStateUnavailable } from './chunk-LOO5CB5M.js';
14
14
  import { dispatchCapability } from './chunk-3GKBSHUG.js';
15
15
  import { classifyClaudeSdkError } from './chunk-GAH4YRCI.js';
16
- import { createDriver, catalogLayer, providerCredentialEnvName, toMergedRegistry, registryCredentialEnv } from './chunk-KMFZVPYR.js';
17
- import { loadFlow } from './chunk-NWZQMJTI.js';
16
+ import { createDriver, catalogLayer, providerCredentialEnvName, toMergedRegistry, registryCredentialEnv } from './chunk-5GYFYGVW.js';
17
+ import { loadFlow } from './chunk-NIHNZC6E.js';
18
18
  import { parseFlowDefinition } from './chunk-53ORCYPJ.js';
19
19
  import { renderStimulusPrompt } from './chunk-2D5BYAL6.js';
20
20
  import { withActivityLabelJsonSchema, TOOL_ACTIVITY_PROMPT_SECTION, SESSION_ROOT_CONNECTOR_ID, PROTOCOL_VERSION } from './chunk-QAH24E5U.js';
21
- import { resolveSettings, loadProviderRegistry } from './chunk-UJPVUN6H.js';
22
- import { resolveRuntimeAssets } from './chunk-REILIKVM.js';
21
+ import { resolveSettings, loadProviderRegistry } from './chunk-BCXZ74DM.js';
22
+ import { resolveRuntimeAssets } from './chunk-SU5LVG6T.js';
23
23
  import { resolveDriverPaths } from './chunk-K5GBV4SA.js';
24
- import { resolveSkWorkspaceConfig, resolveAgentDir, stageMaterializedSkills, loadMcpServerDeclarations, COMPACTION_DEFAULTS, validateAssetRecipeAttr, deriveSingleMaterializedMcpDeclaration } from './chunk-K27T47OO.js';
24
+ import { resolveSkWorkspaceConfig, resolveAgentDir, loadMcpServerDeclarations, COMPACTION_DEFAULTS, validateAssetRecipeAttr, deriveSingleMaterializedMcpDeclaration, stageMaterializedSkills, unstageSkill } from './chunk-HKOC273F.js';
25
25
  import { withFsDeadline, FsDeadlineError, fsDeadlineMs, tryWithFsDeadline } from './chunk-MKZOK4JU.js';
26
26
  import { parseAssetRef } from './chunk-GEEW6SY2.js';
27
27
  import { resolveLogStoreConfig, createLogStoreFromConfig, OnLogBridgeSink, WsLogSink } from './chunk-FTG7CRFD.js';
@@ -4258,6 +4258,104 @@ var DriverSwapGate = class {
4258
4258
  }
4259
4259
  };
4260
4260
 
4261
+ // runner/src/serial-lock.ts
4262
+ function createSerialLock() {
4263
+ let tail = Promise.resolve();
4264
+ return (fn) => {
4265
+ const run = tail.then(fn, fn);
4266
+ tail = run.catch(() => void 0);
4267
+ return run;
4268
+ };
4269
+ }
4270
+ function createCoalescedTask(lock, fn) {
4271
+ let waiting = null;
4272
+ return (...args) => {
4273
+ if (waiting) return waiting;
4274
+ const run = lock(() => {
4275
+ waiting = null;
4276
+ return fn(...args);
4277
+ });
4278
+ waiting = run;
4279
+ return run;
4280
+ };
4281
+ }
4282
+ async function recordStagedSkills(staged, projectDir, skillsDir, names, timeoutMs) {
4283
+ for (const name of names) {
4284
+ const path5 = join(projectDir, skillsDir, name);
4285
+ const st = await tryWithFsDeadline(`lstat ${path5}`, () => lstat(path5), null, timeoutMs);
4286
+ staged.set(
4287
+ name,
4288
+ st?.isDirectory() && st.birthtimeMs > 0 ? { path: path5, dev: st.dev, ino: st.ino, birthtimeMs: st.birthtimeMs } : null
4289
+ );
4290
+ }
4291
+ }
4292
+ async function isStillOurs(record2, path5, timeoutMs) {
4293
+ if (!record2 || record2.path !== path5) return false;
4294
+ const st = await tryWithFsDeadline(`lstat ${path5}`, () => lstat(path5), null, timeoutMs);
4295
+ return st?.isDirectory() === true && st.dev === record2.dev && st.ino === record2.ino && st.birthtimeMs === record2.birthtimeMs;
4296
+ }
4297
+ async function attachStagedSkill(deps, name) {
4298
+ try {
4299
+ const skillsDir = deps.skillsDir();
4300
+ const staged = await deps.withSkillFsLock(async () => {
4301
+ const names = await stageMaterializedSkills(deps.projectDir, skillsDir, { declared: [name] });
4302
+ await recordStagedSkills(deps.stagedSkillDirs, deps.projectDir, skillsDir, names);
4303
+ return names;
4304
+ });
4305
+ if (staged.length === 0) {
4306
+ return {
4307
+ ok: false,
4308
+ code: "skill_not_materialized",
4309
+ message: `no materialized skill matching "${name}" under .skaile/assets/skill`
4310
+ };
4311
+ }
4312
+ deps.log(`[serve] runner.attach_instance staged skill(s): ${staged.join(", ")}`);
4313
+ const live = deps.driverStarted();
4314
+ deps.scheduleSkillRestart(staged.map((s) => ({ name: s, action: "add" })));
4315
+ return { ok: true, id: name, live, toolCount: 0 };
4316
+ } catch (err) {
4317
+ return {
4318
+ ok: false,
4319
+ code: "skill_attach_failed",
4320
+ message: err instanceof Error ? err.message : String(err)
4321
+ };
4322
+ }
4323
+ }
4324
+ async function detachStagedSkill(deps, name) {
4325
+ try {
4326
+ const skillsDir = deps.skillsDir();
4327
+ const dirName = name.split("/").pop() ?? name;
4328
+ const result = await deps.withSkillFsLock(async () => {
4329
+ const knownStaged = await isStillOurs(
4330
+ deps.stagedSkillDirs.get(dirName),
4331
+ join(deps.projectDir, skillsDir, dirName)
4332
+ );
4333
+ return unstageSkill(deps.projectDir, skillsDir, name, { knownStaged });
4334
+ });
4335
+ const live = deps.driverStarted();
4336
+ if ("reason" in result) {
4337
+ deps.log(
4338
+ `[serve] runner.detach_instance: "${result.name}" exists but was not staged by the runner \u2014 left in place`
4339
+ );
4340
+ return { ok: true, id: result.name, removed: false, live, reason: result.reason };
4341
+ }
4342
+ const wasTracked = deps.stagedSkillDirs.delete(result.name);
4343
+ if (!result.removedStaged && !wasTracked) {
4344
+ deps.log(`[serve] runner.detach_instance: skill "${result.name}" was not staged`);
4345
+ return { ok: true, id: result.name, removed: result.removedAsset, live };
4346
+ }
4347
+ deps.log(`[serve] runner.detach_instance unstaged skill: ${result.name}`);
4348
+ deps.scheduleSkillRestart([{ name: result.name, action: "remove" }]);
4349
+ return { ok: true, id: result.name, removed: true, live };
4350
+ } catch (err) {
4351
+ return {
4352
+ ok: false,
4353
+ code: "skill_detach_failed",
4354
+ message: err instanceof Error ? err.message : String(err)
4355
+ };
4356
+ }
4357
+ }
4358
+
4261
4359
  // runner/src/flow-turn-dispatch.ts
4262
4360
  var FLOW_TURN_COMPACTION_TIMEOUT = "Flow turn abandoned: a compaction held the driver";
4263
4361
  async function dispatchFlowTurn(deps, prompt, timeoutMs) {
@@ -5189,6 +5287,13 @@ function asDeclaration(declaration) {
5189
5287
  }
5190
5288
  return null;
5191
5289
  }
5290
+ function isLive(rm3, id) {
5291
+ try {
5292
+ return typeof rm3.has === "function" && rm3.has(id);
5293
+ } catch {
5294
+ return false;
5295
+ }
5296
+ }
5192
5297
  function toPreMinted(token) {
5193
5298
  return { ok: true, token: token.token, expiresAt: token.expiresAt ?? null };
5194
5299
  }
@@ -5209,12 +5314,14 @@ function buildSessionResourceHandlers(deps) {
5209
5314
  `[session-resource] preMintedToken provided but secret store not ready \u2014 ${kind}:${decl.id}`
5210
5315
  );
5211
5316
  }
5317
+ const wasLive = isLive(rm3, decl.id);
5212
5318
  try {
5213
5319
  await rm3.connect(decl);
5214
5320
  } catch (err) {
5215
5321
  if (input.preMintedToken) {
5216
5322
  getPreMintedSecrets()?.unset(kind, decl.id);
5217
5323
  }
5324
+ if (wasLive && !isLive(rm3, decl.id)) emitResourcesAvailable();
5218
5325
  const message = err instanceof Error ? err.message : String(err);
5219
5326
  log(`[session-resource] runner.add_${kind} failed for ${decl.id}: ${message}`);
5220
5327
  return { ok: false, code: "connect_failed", message };
@@ -5257,12 +5364,14 @@ function buildSessionResourceHandlers(deps) {
5257
5364
  `[session-resource] preMintedToken provided but secret store not ready \u2014 connector:${decl.id}`
5258
5365
  );
5259
5366
  }
5367
+ const wasLive = isLive(rm3, decl.id);
5260
5368
  try {
5261
5369
  await rm3.connect(decl);
5262
5370
  } catch (err) {
5263
5371
  if (preMintedToken) {
5264
5372
  getPreMintedSecrets()?.unset("connector", decl.id);
5265
5373
  }
5374
+ if (wasLive && !isLive(rm3, decl.id)) emitResourcesAvailable();
5266
5375
  const message = err instanceof Error ? err.message : String(err);
5267
5376
  log(`[session-resource] runner.attach_instance connector failed for ${decl.id}: ${message}`);
5268
5377
  return { ok: false, code: "connector_connect_failed", message };
@@ -5446,6 +5555,10 @@ var attachInstanceInputSchema = z7.strictObject({
5446
5555
  name: z7.string(),
5447
5556
  preMintedToken: preMintedTokenSchema
5448
5557
  });
5558
+ var detachInstanceInputSchema = z7.strictObject({
5559
+ kind: z7.string(),
5560
+ name: z7.string()
5561
+ });
5449
5562
  var removeResourceInput = z7.strictObject({
5450
5563
  id: z7.string()
5451
5564
  });
@@ -5542,6 +5655,20 @@ function buildRunnerCapabilities(handlers) {
5542
5655
  });
5543
5656
  }
5544
5657
  }),
5658
+ defineCapability({
5659
+ name: "runner.detach_instance",
5660
+ displayName: "Detach instance",
5661
+ description: "Unload an instance the platform unassigned from the live session. Skills only: removes the runner-staged copy and materialized asset, then restarts the driver without killing an in-flight turn. A same-named dir the runner did not stage is left in place (reason: not_staged).",
5662
+ side: "agent",
5663
+ origin: RUNNER_CAP_ORIGIN,
5664
+ audience: ["runtime"],
5665
+ kind: "effect",
5666
+ input: detachInstanceInputSchema,
5667
+ handler: async (input) => {
5668
+ if (!handlers.detachInstance) return notImplemented("runner.detach_instance");
5669
+ return handlers.detachInstance({ kind: input.kind, name: input.name });
5670
+ }
5671
+ }),
5545
5672
  defineCapability({
5546
5673
  name: "runner.remove_resource",
5547
5674
  displayName: "Remove resource",
@@ -5646,6 +5773,7 @@ function wireSessionCapabilities(deps) {
5646
5773
  getCompactionOrchestrator,
5647
5774
  getProjectDir,
5648
5775
  attachSkillInstance,
5776
+ detachSkillInstance,
5649
5777
  registerLiveAttachedMcp,
5650
5778
  scheduleDriverRestartForToolChanges,
5651
5779
  log
@@ -5687,6 +5815,18 @@ function wireSessionCapabilities(deps) {
5687
5815
  message: "attach_instance handler not configured"
5688
5816
  };
5689
5817
  },
5818
+ // Only skills have a live unload path; a connector or mount detaches
5819
+ // through remove_resource, and MCP servers have no detach yet.
5820
+ detachInstance: async (input) => {
5821
+ if (input.kind === "skill") {
5822
+ return detachSkillInstance(input.name);
5823
+ }
5824
+ return {
5825
+ ok: false,
5826
+ code: "unsupported_kind",
5827
+ message: `detach_instance does not support kind "${input.kind}"`
5828
+ };
5829
+ },
5690
5830
  // setLogLevel left undefined (the cap self-falls-back to getLogStore);
5691
5831
  // setState remains a stub (not resource hot-plug).
5692
5832
  lifecycle: buildLifecycleHandler({
@@ -6912,14 +7052,21 @@ async function startAgentServer(opts) {
6912
7052
  let managedInitFingerprint;
6913
7053
  let managedInitComplete = false;
6914
7054
  let appliedWireAgentConfigKey;
6915
- const stagedSkillDirs = /* @__PURE__ */ new Set();
7055
+ const stagedSkillDirs = /* @__PURE__ */ new Map();
7056
+ const withSkillFsLock = createSerialLock();
7057
+ const stageDeclaredSkills = createCoalescedTask(
7058
+ withSkillFsLock,
7059
+ async (skillsDir, declared) => {
7060
+ const names = await stageMaterializedSkills(opts.projectDir, skillsDir, { declared });
7061
+ await recordStagedSkills(stagedSkillDirs, opts.projectDir, skillsDir, names);
7062
+ return names;
7063
+ }
7064
+ );
6916
7065
  await restageMaterializedSkills(false);
6917
7066
  async function restageMaterializedSkills(allowRestart) {
6918
7067
  if (managedHost) return;
6919
7068
  try {
6920
- const { skillsDir } = resolveDriverPaths({
6921
- driver: opts.driver ?? wsConfig.agent_config?.default?.driver ?? wireAgentConfig?.driver ?? "claude-sdk"
6922
- });
7069
+ const skillsDir = activeSkillsDir();
6923
7070
  const declared = (wsConfig.dependencies ?? []).flatMap((dep) => {
6924
7071
  try {
6925
7072
  const ref = parseAssetRef(dep);
@@ -6929,9 +7076,9 @@ async function startAgentServer(opts) {
6929
7076
  }
6930
7077
  });
6931
7078
  if (declared.length === 0) return;
6932
- const staged = await stageMaterializedSkills(opts.projectDir, skillsDir, { declared });
6933
- const newlyStaged = staged.filter((s) => !stagedSkillDirs.has(s));
6934
- for (const s of staged) stagedSkillDirs.add(s);
7079
+ const previouslyStaged = new Set(stagedSkillDirs.keys());
7080
+ const staged = await stageDeclaredSkills(skillsDir, declared);
7081
+ const newlyStaged = staged.filter((s) => !previouslyStaged.has(s));
6935
7082
  if (newlyStaged.length === 0) return;
6936
7083
  log(`[serve] staged ${newlyStaged.length} materialized skill(s): ${newlyStaged.join(", ")}`);
6937
7084
  if (allowRestart && driverStarted) {
@@ -7648,6 +7795,7 @@ async function startAgentServer(opts) {
7648
7795
  getCompactionOrchestrator: () => compactionOrchestrator,
7649
7796
  getProjectDir: () => opts.projectDir,
7650
7797
  attachSkillInstance,
7798
+ detachSkillInstance,
7651
7799
  registerLiveAttachedMcp,
7652
7800
  scheduleDriverRestartForToolChanges,
7653
7801
  log
@@ -7855,34 +8003,25 @@ async function startAgentServer(opts) {
7855
8003
  log(`[serve] ${removed ? "removed" : "not found"} skill: ${res.name}`);
7856
8004
  }
7857
8005
  }
7858
- async function attachSkillInstance(name) {
7859
- try {
7860
- const { skillsDir } = resolveDriverPaths({
7861
- driver: opts.driver ?? wsConfig.agent_config?.default?.driver ?? wireAgentConfig?.driver ?? "claude-sdk"
7862
- });
7863
- const staged = await stageMaterializedSkills(opts.projectDir, skillsDir, {
7864
- declared: [name]
7865
- });
7866
- if (staged.length === 0) {
7867
- return {
7868
- ok: false,
7869
- code: "skill_not_materialized",
7870
- message: `no materialized skill matching "${name}" under .skaile/assets/skill`
7871
- };
7872
- }
7873
- log(`[serve] runner.attach_instance staged skill(s): ${staged.join(", ")}`);
7874
- const live = driverStarted;
7875
- scheduleDriverRestartForSkillChanges(
7876
- staged.map((s) => ({ name: s, action: "add" }))
7877
- );
7878
- return { ok: true, id: name, live, toolCount: 0 };
7879
- } catch (err) {
7880
- return {
7881
- ok: false,
7882
- code: "skill_attach_failed",
7883
- message: err instanceof Error ? err.message : String(err)
7884
- };
7885
- }
8006
+ function activeSkillsDir() {
8007
+ return resolveDriverPaths({
8008
+ driver: opts.driver ?? wsConfig.agent_config?.default?.driver ?? wireAgentConfig?.driver ?? "claude-sdk"
8009
+ }).skillsDir;
8010
+ }
8011
+ const skillStagingDeps = {
8012
+ projectDir: opts.projectDir,
8013
+ skillsDir: () => activeSkillsDir(),
8014
+ stagedSkillDirs,
8015
+ withSkillFsLock,
8016
+ scheduleSkillRestart: (actions) => scheduleDriverRestartForSkillChanges(actions),
8017
+ driverStarted: () => driverStarted,
8018
+ log
8019
+ };
8020
+ function attachSkillInstance(name) {
8021
+ return attachStagedSkill(skillStagingDeps, name);
8022
+ }
8023
+ function detachSkillInstance(name) {
8024
+ return detachStagedSkill(skillStagingDeps, name);
7886
8025
  }
7887
8026
  async function restartDriverForToolChanges(reason) {
7888
8027
  if (!driverStarted) {
@@ -8825,5 +8964,5 @@ function touchSession(state) {
8825
8964
  }
8826
8965
 
8827
8966
  export { CLAUDE_CODE_CREDENTIALS_KEY, COMPILE_MANIFEST_FILENAME, CapabilityRegistry, DEFAULT_CAPABILITY_CALL_TIMEOUT_MS, DEFAULT_COALESCE_MS, DEFAULT_FLOW_MUTATE_CONNECTOR_WAIT_MS, MOUNT_LIST_MAX_DEPTH, MOUNT_LIST_MAX_ENTRIES, MOUNT_READ_DEADLINE_FACTOR, MOUNT_STAT_BUDGET_MS, MOUNT_STAT_MAX_ENTRIES, MOUNT_TREE_OP_DEADLINE_FACTOR, MarkdownStreamer, PreInitRingSink, ResourceOperationError, SESSION_ROOT_WRITABLE_DIRS, SESSION_ROOT_WRITABLE_FILES, agentDefinitionExists, bootstrapCapabilityRegistry, bootstrapRunnerLogStore, buildAgentResources, buildClientCapabilityHandler, buildConnectorTokenMediator, buildContextSection, buildEnvironmentSection, buildResourcesAvailablePayload, buildStoreSnapshotReplay, builtinCapabilities, capabilityLogInstance, clearPreInitRingSink, clearSession, compileComposition, computeCapabilitySignature, computeDirectoryTotals, connectorRefreshKind, createAgentSession, createFlowConnectorReadiness, createManagedCodexSubpromptDriver, createSessionStimulusBus, defineCapability, deleteSession, dispatchResourceRequest, dispatchRunnerCapabilityInvocation, emitSystemPromptComposed, ensureClaudeSettingsDisablesConnectors, ensureGitConfigInclude, executeConnectorMutate, extractClaudeAiOauthExpiresAt, flowStartNeedsDriverRestart, getPreInitRingSink, handleMountResourceRequest, handleResourceRequest, handleSessionRootResourceRequest, hasNonTerminalFlow, hostOpResumeStimulus, installPreInitRingSink, isSessionRootPathAllowed, isTerminalFlowStatus, listSessions, loadAgentManifest, loadCompileManifest, loadCompileManifestFromDir, loadManagedCodexHostConfig, loadSession, loadSessionById, mcpAuthSecretKey, newSession, nulTailPaddingLength, pickFlowToolTarget, pickRepointedManager, planFlowMutate, prepareCodexTools, reconcilePendingDecisions, registerActiveFlow, registerCompositionCapabilities, rejectCapabilityOnApprovalDeny, resetRunnerLogStore, resolveAgentComposition, resolveAgentMixins, resolveBinding, resolveCapabilityCallTimeoutMs, resolveCapabilityResult, resolveComposition, resolveFlowMutateConnectorWaitMs, resolveMixin, runAgentChat, saveSession, setCurrentSession, setUpFlowConnector, startAgentServer, stimulusFromMetas, supportsLiveToolUpdates, touchSession, validateInputResponse, writeClaudeCodeCredentialsFile };
8828
- //# sourceMappingURL=chunk-SAXTWLXZ.js.map
8829
- //# sourceMappingURL=chunk-SAXTWLXZ.js.map
8967
+ //# sourceMappingURL=chunk-HVTU3CVF.js.map
8968
+ //# sourceMappingURL=chunk-HVTU3CVF.js.map