@skaile/workspaces 4.26.0 → 4.27.1

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 (133) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/{asset-feeds-72RJOE4E.js → asset-feeds-2KMVU67Q.js} +4 -4
  3. package/dist/{asset-feeds-72RJOE4E.js.map → asset-feeds-2KMVU67Q.js.map} +1 -1
  4. package/dist/asset-manager/index.js +1 -1
  5. package/dist/bridge/drivers/claude-sdk.js +20 -8
  6. package/dist/bridge/drivers/claude-sdk.js.map +1 -1
  7. package/dist/bridge/drivers/codex.js +2 -2
  8. package/dist/bridge/drivers/continue.js +3 -3
  9. package/dist/bridge/drivers/echo.js +3 -5
  10. package/dist/bridge/drivers/echo.js.map +1 -1
  11. package/dist/bridge/drivers/gemini.js +5 -5
  12. package/dist/bridge/drivers/goose.js +3 -3
  13. package/dist/bridge/drivers/omp.js +22 -8
  14. package/dist/bridge/drivers/omp.js.map +1 -1
  15. package/dist/bridge/drivers/opencode.js +3 -3
  16. package/dist/bridge/drivers/qwen.js +5 -5
  17. package/dist/bridge/index.js +5 -4
  18. package/dist/bridge/src/capability-dispatch.d.ts +16 -31
  19. package/dist/bridge/src/capability-dispatch.d.ts.map +1 -1
  20. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
  21. package/dist/bridge/src/drivers/echo.d.ts.map +1 -1
  22. package/dist/bridge/src/drivers/omp.d.ts.map +1 -1
  23. package/dist/bridge/src/index.d.ts +1 -0
  24. package/dist/bridge/src/index.d.ts.map +1 -1
  25. package/dist/bridge/src/reconfigure-model-ref.d.ts +37 -0
  26. package/dist/bridge/src/reconfigure-model-ref.d.ts.map +1 -0
  27. package/dist/bridge/src/types.d.ts +10 -2
  28. package/dist/bridge/src/types.d.ts.map +1 -1
  29. package/dist/{chunk-EZOFQW3G.js → chunk-2L4KARVG.js} +5 -5
  30. package/dist/{chunk-EZOFQW3G.js.map → chunk-2L4KARVG.js.map} +1 -1
  31. package/dist/{chunk-H4XNX2FG.js → chunk-746DTX5S.js} +2 -2
  32. package/dist/{chunk-H4XNX2FG.js.map → chunk-746DTX5S.js.map} +1 -1
  33. package/dist/{chunk-OQRSSFTU.js → chunk-A2F7D47N.js} +4 -4
  34. package/dist/{chunk-OQRSSFTU.js.map → chunk-A2F7D47N.js.map} +1 -1
  35. package/dist/{chunk-Y6QVVKFN.js → chunk-AVYBLJ3A.js} +3 -3
  36. package/dist/{chunk-Y6QVVKFN.js.map → chunk-AVYBLJ3A.js.map} +1 -1
  37. package/dist/{chunk-IN466NSZ.js → chunk-BADVX5LG.js} +3 -3
  38. package/dist/{chunk-IN466NSZ.js.map → chunk-BADVX5LG.js.map} +1 -1
  39. package/dist/{chunk-SSODNBSC.js → chunk-CCHZLELJ.js} +3 -3
  40. package/dist/{chunk-SSODNBSC.js.map → chunk-CCHZLELJ.js.map} +1 -1
  41. package/dist/{chunk-SB4U7HLP.js → chunk-DOKEJ6H3.js} +6 -6
  42. package/dist/{chunk-SB4U7HLP.js.map → chunk-DOKEJ6H3.js.map} +1 -1
  43. package/dist/{chunk-PIY5NTXY.js → chunk-GKE66NTN.js} +3 -3
  44. package/dist/{chunk-PIY5NTXY.js.map → chunk-GKE66NTN.js.map} +1 -1
  45. package/dist/{chunk-XZCRIPWT.js → chunk-H3YO74Z5.js} +3 -3
  46. package/dist/{chunk-XZCRIPWT.js.map → chunk-H3YO74Z5.js.map} +1 -1
  47. package/dist/{chunk-IRGI7Q62.js → chunk-IQID7X6P.js} +2 -2
  48. package/dist/{chunk-IRGI7Q62.js.map → chunk-IQID7X6P.js.map} +1 -1
  49. package/dist/{chunk-2JGUFDKZ.js → chunk-JBSCY34V.js} +3 -3
  50. package/dist/{chunk-2JGUFDKZ.js.map → chunk-JBSCY34V.js.map} +1 -1
  51. package/dist/{chunk-47MUF565.js → chunk-LFYAU2H3.js} +6 -6
  52. package/dist/{chunk-47MUF565.js.map → chunk-LFYAU2H3.js.map} +1 -1
  53. package/dist/{chunk-IBMQMJ4X.js → chunk-MNJFBKFR.js} +3 -3
  54. package/dist/{chunk-IBMQMJ4X.js.map → chunk-MNJFBKFR.js.map} +1 -1
  55. package/dist/{chunk-JIPPMYOM.js → chunk-NLUW3IJL.js} +3 -3
  56. package/dist/{chunk-JIPPMYOM.js.map → chunk-NLUW3IJL.js.map} +1 -1
  57. package/dist/{chunk-YR3CLEQG.js → chunk-OGOQYOM4.js} +6 -6
  58. package/dist/{chunk-YR3CLEQG.js.map → chunk-OGOQYOM4.js.map} +1 -1
  59. package/dist/{chunk-UKUKVQO3.js → chunk-QJN462RG.js} +84 -23
  60. package/dist/chunk-QJN462RG.js.map +1 -0
  61. package/dist/chunk-TJRNJVGU.js +59 -0
  62. package/dist/chunk-TJRNJVGU.js.map +1 -0
  63. package/dist/{chunk-D3UARV3Z.js → chunk-TRRFUVDJ.js} +8 -7
  64. package/dist/chunk-TRRFUVDJ.js.map +1 -0
  65. package/dist/{chunk-IHFQTKUP.js → chunk-YOA4YBMR.js} +2 -2
  66. package/dist/{chunk-IHFQTKUP.js.map → chunk-YOA4YBMR.js.map} +1 -1
  67. package/dist/cli/index.js +33 -32
  68. package/dist/cli/index.js.map +1 -1
  69. package/dist/connectors/index.js +6 -5
  70. package/dist/{ensure-sources-HEOQJ4CS.js → ensure-sources-WQNMDENC.js} +4 -4
  71. package/dist/{ensure-sources-HEOQJ4CS.js.map → ensure-sources-WQNMDENC.js.map} +1 -1
  72. package/dist/factory-assets/connectors/box.js +6 -5
  73. package/dist/factory-assets/connectors/deploy.js +6 -5
  74. package/dist/factory-assets/connectors/devserver.js +6 -5
  75. package/dist/factory-assets/connectors/flow/adapter.js +6 -5
  76. package/dist/factory-assets/connectors/flow/run-flow.js +7 -6
  77. package/dist/factory-assets/connectors/flow.js +6 -5
  78. package/dist/factory-assets/connectors/git.js +6 -5
  79. package/dist/factory-assets/connectors/gmail.js +6 -5
  80. package/dist/factory-assets/connectors/googledrive.js +6 -5
  81. package/dist/factory-assets/connectors/local.js +6 -5
  82. package/dist/factory-assets/connectors/mattermost.js +6 -5
  83. package/dist/factory-assets/connectors/memory.js +6 -5
  84. package/dist/factory-assets/connectors/minio.js +6 -5
  85. package/dist/factory-assets/connectors/postgres.js +6 -5
  86. package/dist/factory-assets/connectors/s3.js +6 -5
  87. package/dist/factory-assets/connectors/sharepoint.js +6 -5
  88. package/dist/factory-assets/connectors/sqlite.js +6 -5
  89. package/dist/factory-assets/connectors/static-server.js +6 -5
  90. package/dist/factory-assets/connectors/tunnel.js +6 -5
  91. package/dist/factory-assets/connectors/webdav.js +6 -5
  92. package/dist/factory-assets/connectors/xstate-store.js +6 -5
  93. package/dist/factory-assets/connectors/xstate.js +6 -5
  94. package/dist/{helpers-VZJCQSLY.js → helpers-JLK7VJJK.js} +4 -4
  95. package/dist/{helpers-VZJCQSLY.js.map → helpers-JLK7VJJK.js.map} +1 -1
  96. package/dist/{library-publish-VBLSTO7S.js → library-publish-KTCHVGLN.js} +6 -6
  97. package/dist/{library-publish-VBLSTO7S.js.map → library-publish-KTCHVGLN.js.map} +1 -1
  98. package/dist/{open-library-SJ54ZBGJ.js → open-library-TJWAJRJS.js} +5 -5
  99. package/dist/{open-library-SJ54ZBGJ.js.map → open-library-TJWAJRJS.js.map} +1 -1
  100. package/dist/{project-GLZR4SLT.js → project-JBMJ44HH.js} +5 -5
  101. package/dist/{project-GLZR4SLT.js.map → project-JBMJ44HH.js.map} +1 -1
  102. package/dist/runner/index.js +9 -8
  103. package/dist/runner/src/capability-registry.d.ts +4 -5
  104. package/dist/runner/src/capability-registry.d.ts.map +1 -1
  105. package/dist/runner/src/capability-roundtrip.d.ts +2 -1
  106. package/dist/runner/src/capability-roundtrip.d.ts.map +1 -1
  107. package/dist/runner/src/codex-tools.d.ts.map +1 -1
  108. package/dist/runner/src/define-capability.d.ts +9 -0
  109. package/dist/runner/src/define-capability.d.ts.map +1 -1
  110. package/dist/runner/src/reconfigure-handler.d.ts +22 -5
  111. package/dist/runner/src/reconfigure-handler.d.ts.map +1 -1
  112. package/dist/runner/src/serve.d.ts +35 -0
  113. package/dist/runner/src/serve.d.ts.map +1 -1
  114. package/dist/runner/src/session-capability-wiring.d.ts +2 -0
  115. package/dist/runner/src/session-capability-wiring.d.ts.map +1 -1
  116. package/dist/sdk/asset-manager.js +1 -1
  117. package/dist/sdk/bridge.js +5 -4
  118. package/dist/sdk/index.js +9 -8
  119. package/dist/sdk/index.js.map +1 -1
  120. package/dist/sdk/runner.js +9 -8
  121. package/dist/{setup-X73AWRMD.js → setup-6QBZIBW2.js} +10 -9
  122. package/dist/setup-6QBZIBW2.js.map +1 -0
  123. package/dist/{source-HYXJO2IE.js → source-AEBW5RRF.js} +6 -6
  124. package/dist/{source-HYXJO2IE.js.map → source-AEBW5RRF.js.map} +1 -1
  125. package/dist/{source-manifest-publish-V5LCVOYZ.js → source-manifest-publish-E2FTXASK.js} +7 -7
  126. package/dist/{source-manifest-publish-V5LCVOYZ.js.map → source-manifest-publish-E2FTXASK.js.map} +1 -1
  127. package/dist/tui/index.js +9 -8
  128. package/dist/tui/index.js.map +1 -1
  129. package/dist/workspace-plugin/index.js +1 -1
  130. package/package.json +1 -1
  131. package/dist/chunk-D3UARV3Z.js.map +0 -1
  132. package/dist/chunk-UKUKVQO3.js.map +0 -1
  133. package/dist/setup-X73AWRMD.js.map +0 -1
@@ -0,0 +1,59 @@
1
+ import { registryEntries, isEntryEnabled, parseModelRef } from './chunk-GZZPKAV5.js';
2
+
3
+ // bridge/src/reconfigure-model-ref.ts
4
+ function selectable(registry) {
5
+ return registryEntries(registry).filter(
6
+ (pair) => (pair[1].kind === "llm" || pair[1].kind === "embed") && isEntryEnabled(pair[1])
7
+ );
8
+ }
9
+ function entryServes(entry, modelId) {
10
+ const map = entry.model_map ?? {};
11
+ const caps = entry.capabilities ?? {};
12
+ if (Object.keys(map).length === 0 && Object.keys(caps).length === 0) return true;
13
+ return modelId in map || modelId in caps || Object.values(map).includes(modelId);
14
+ }
15
+ function currentProviderId(modelRef, registry, entries, roles) {
16
+ const named = modelRef?.trim();
17
+ if (!named) return entries[0]?.[0];
18
+ if (entries.some(([id]) => id === named)) return named;
19
+ return parseModelRef(named, registry, roles)?.providerId;
20
+ }
21
+ function scopeReconfigureModel(input) {
22
+ const { model, modelRef, registry, roles } = input;
23
+ const legacy = {
24
+ ok: true,
25
+ modelRef: modelRef === void 0 ? void 0 : model
26
+ };
27
+ if (!registry) return legacy;
28
+ const entries = selectable(registry);
29
+ if (entries.length <= 1) return legacy;
30
+ const selector = model.trim();
31
+ if (selector.startsWith("@")) return { ok: true, modelRef: selector };
32
+ const slash = selector.indexOf("/");
33
+ if (slash > 0) {
34
+ const head = selector.slice(0, slash);
35
+ const tail = selector.slice(slash + 1);
36
+ const named = entries.find(([id]) => id === head);
37
+ if (named && tail !== "") {
38
+ if (entryServes(named[1], tail)) return { ok: true, modelRef: selector };
39
+ return refuse(head, tail);
40
+ }
41
+ }
42
+ const providerId = currentProviderId(modelRef, registry, entries, roles);
43
+ const current = entries.find(([id]) => id === providerId);
44
+ if (!current) return legacy;
45
+ if (!entryServes(current[1], selector)) return refuse(current[0], selector);
46
+ return { ok: true, modelRef: `${current[0]}/${selector}` };
47
+ }
48
+ function refuse(providerId, modelId) {
49
+ return {
50
+ ok: false,
51
+ code: "model_not_on_provider",
52
+ providerId,
53
+ message: `AI provider entry "${providerId}" does not list model "${modelId}"; the change applies when the session next starts.`
54
+ };
55
+ }
56
+
57
+ export { scopeReconfigureModel };
58
+ //# sourceMappingURL=chunk-TJRNJVGU.js.map
59
+ //# sourceMappingURL=chunk-TJRNJVGU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../bridge/src/reconfigure-model-ref.ts"],"names":[],"mappings":"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","file":"chunk-TJRNJVGU.js","sourcesContent":["// The registry selector a live model change (`reconfigure({ model })`) leaves a\n// session on. Shared by the runner's `runner.reconfigure` handler and every\n// driver whose `reconfigure()` rewrites `modelRef`, so both pick the same entry.\nimport {\n type AIProviderLlmEntry,\n type AIProviderRegistry,\n isEntryEnabled,\n type MergedAIProviderRegistry,\n parseModelRef,\n registryEntries,\n} from \"@skaile/workspaces/core/provider-registry\";\n\n/** What a model-only reconfigure does to the session's registry selector. */\nexport type ReconfigureModelScope =\n | {\n ok: true;\n /** The selector to run from now on; `undefined` leaves `modelRef` unset. */\n modelRef: string | undefined;\n }\n | {\n ok: false;\n code: \"model_not_on_provider\";\n /** The entry the session runs on, or the one the patch named. */\n providerId: string;\n message: string;\n };\n\nexport interface ReconfigureModelScopeInput {\n /** The model the patch names: bare, `<providerId>/<modelId>` or `@role`. */\n model: string;\n /** The session's current selector (`AgentConfig.modelRef`). */\n modelRef: string | undefined;\n registry: AIProviderRegistry | MergedAIProviderRegistry | undefined;\n roles?: Record<string, string>;\n}\n\nfunction selectable(\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n): Array<[string, AIProviderLlmEntry]> {\n return registryEntries(registry).filter(\n (pair): pair is [string, AIProviderLlmEntry] =>\n (pair[1].kind === \"llm\" || pair[1].kind === \"embed\") && isEntryEnabled(pair[1]),\n );\n}\n\n/**\n * Whether an entry serves a model id. An entry that declares no model at all\n * (no `model_map`, no `capabilities`) passes any id through, as the wake does.\n * Otherwise the id must be a declared logical id or a `model_map` target: the\n * platform sends the provider-side id the wake translated to.\n */\nfunction entryServes(entry: AIProviderLlmEntry, modelId: string): boolean {\n const map = entry.model_map ?? {};\n const caps = entry.capabilities ?? {};\n if (Object.keys(map).length === 0 && Object.keys(caps).length === 0) return true;\n return modelId in map || modelId in caps || Object.values(map).includes(modelId);\n}\n\n/** The entry a selector runs on, resolved the way the drivers resolve it. */\nfunction currentProviderId(\n modelRef: string | undefined,\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n entries: Array<[string, AIProviderLlmEntry]>,\n roles: Record<string, string> | undefined,\n): string | undefined {\n const named = modelRef?.trim();\n if (!named) return entries[0]?.[0];\n // A selector that is exactly an entry id names the endpoint and no model.\n if (entries.some(([id]) => id === named)) return named;\n return parseModelRef(named, registry, roles)?.providerId;\n}\n\n/**\n * Decide the selector a live model change leaves the session on.\n *\n * A bare model id keeps the provider the session already runs on\n * (`<currentProvider>/<model>`): re-resolving it by id alone could move the\n * session to another entry that lists the same id, which changes billing and\n * data residency without a sign. Only a patch that names a provider\n * (`<providerId>/<model>` or `@role`) moves it. When the target entry declares\n * its models and this one is not among them, the patch is refused so the host\n * applies it at the next wake instead.\n *\n * A registry with at most one usable entry has nowhere to move to and keeps the\n * old behaviour: the selector becomes the patch's model when one was set.\n */\nexport function scopeReconfigureModel(input: ReconfigureModelScopeInput): ReconfigureModelScope {\n const { model, modelRef, registry, roles } = input;\n const legacy: ReconfigureModelScope = {\n ok: true,\n modelRef: modelRef === undefined ? undefined : model,\n };\n if (!registry) return legacy;\n const entries = selectable(registry);\n if (entries.length <= 1) return legacy;\n\n const selector = model.trim();\n if (selector.startsWith(\"@\")) return { ok: true, modelRef: selector };\n\n const slash = selector.indexOf(\"/\");\n if (slash > 0) {\n const head = selector.slice(0, slash);\n const tail = selector.slice(slash + 1);\n const named = entries.find(([id]) => id === head);\n if (named && tail !== \"\") {\n if (entryServes(named[1], tail)) return { ok: true, modelRef: selector };\n return refuse(head, tail);\n }\n }\n\n const providerId = currentProviderId(modelRef, registry, entries, roles);\n const current = entries.find(([id]) => id === providerId);\n if (!current) return legacy;\n if (!entryServes(current[1], selector)) return refuse(current[0], selector);\n return { ok: true, modelRef: `${current[0]}/${selector}` };\n}\n\nfunction refuse(providerId: string, modelId: string): ReconfigureModelScope {\n return {\n ok: false,\n code: \"model_not_on_provider\",\n providerId,\n message: `AI provider entry \"${providerId}\" does not list model \"${modelId}\"; the change applies when the session next starts.`,\n };\n}\n"]}
@@ -1,9 +1,10 @@
1
1
  import { declaresActivityLabel, stripActivityLabel } from './chunk-GRBB4CQL.js';
2
+ import { randomUUID } from 'crypto';
2
3
 
3
- // bridge/src/capability-dispatch.ts
4
- async function dispatchCapability(hooks, callId, name, input, onBackgroundError = () => {
4
+ async function dispatchCapability(hooks, name, input, onBackgroundError = () => {
5
5
  }, signal) {
6
6
  signal?.throwIfAborted();
7
+ const callId = randomUUID();
7
8
  const cap = hooks.resolve(name);
8
9
  if (!declaresActivityLabel(cap?.inputSchema)) input = stripActivityLabel(input);
9
10
  if (cap?.render && hooks.emitRender) {
@@ -19,11 +20,11 @@ async function dispatchCapability(hooks, callId, name, input, onBackgroundError
19
20
  }
20
21
  }
21
22
  if (cap?.fireAndForget) {
22
- void hooks.invoke(name, input, signal, callId).catch(onBackgroundError);
23
- return { result: {}, background: true };
23
+ void hooks.invoke(name, input, signal, callId).catch((err) => onBackgroundError(err, callId));
24
+ return { result: {}, background: true, callId };
24
25
  }
25
26
  const result = await hooks.invoke(name, input, signal, callId);
26
- return { result, background: false };
27
+ return { result, background: false, callId };
27
28
  }
28
29
  function renderFallback(template, input) {
29
30
  if (!input || typeof input !== "object") {
@@ -51,5 +52,5 @@ function filterRenderCapabilities(caps) {
51
52
  }
52
53
 
53
54
  export { dispatchCapability, filterRenderCapabilities, renderFallback };
54
- //# sourceMappingURL=chunk-D3UARV3Z.js.map
55
- //# sourceMappingURL=chunk-D3UARV3Z.js.map
55
+ //# sourceMappingURL=chunk-TRRFUVDJ.js.map
56
+ //# sourceMappingURL=chunk-TRRFUVDJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../bridge/src/capability-dispatch.ts"],"names":[],"mappings":";;;AAgFA,eAAsB,kBAAA,CACpB,KAAA,EACA,IAAA,EACA,KAAA,EACA,oBAA4D,MAAM;AAAC,CAAA,EACnE,MAAA,EACmC;AACnC,EAAA,MAAA,EAAQ,cAAA,EAAe;AACvB,EAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AAI9B,EAAA,IAAI,CAAC,qBAAA,CAAsB,GAAA,EAAK,WAAW,CAAA,EAAG,KAAA,GAAQ,mBAAmB,KAAK,CAAA;AAK9E,EAAA,IAAI,GAAA,EAAK,MAAA,IAAU,KAAA,CAAM,UAAA,EAAY;AACnC,IAAA,KAAA,CAAM,UAAA,CAAW;AAAA,MACf,IAAA,EAAM,gBAAA;AAAA,MACN,cAAA,EAAgB,IAAA;AAAA,MAChB,KAAA,EAAO,KAAA;AAAA,MACP;AAAA,KACD,CAAA;AACD,IAAA,IAAI,GAAA,CAAI,MAAA,CAAO,QAAA,IAAY,KAAA,CAAM,QAAA,EAAU;AACzC,MAAA,MAAM,QAAA,GAAW,cAAA,CAAe,GAAA,CAAI,MAAA,CAAO,UAAU,KAAK,CAAA;AAC1D,MAAA,KAAA,CAAM,SAAS,QAAQ,CAAA;AAAA,IACzB;AAAA,EACF;AAEA,EAAA,IAAI,KAAK,aAAA,EAAe;AAEtB,IAAA,KAAK,KAAA,CAAM,MAAA,CAAO,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,MAAM,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ,iBAAA,CAAkB,GAAA,EAAK,MAAM,CAAC,CAAA;AAC5F,IAAA,OAAO,EAAE,MAAA,EAAQ,EAAC,EAAG,UAAA,EAAY,MAAM,MAAA,EAAO;AAAA,EAChD;AAEA,EAAA,MAAM,SAAS,MAAM,KAAA,CAAM,OAAO,IAAA,EAAM,KAAA,EAAO,QAAQ,MAAM,CAAA;AAC7D,EAAA,OAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,KAAA,EAAO,MAAA,EAAO;AAC7C;AAqBO,SAAS,cAAA,CAAe,UAAkB,KAAA,EAAwB;AACvE,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,wBAAA,EAA0B,EAAE,CAAA;AAAA,EACtD;AACA,EAAA,MAAM,KAAA,GAAQ,KAAA;AACd,EAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,0BAAA,EAA4B,CAAC,QAAQ,IAAA,KAAiB;AAC5E,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,EAAO,IAAI,CAAA;AAClC,IAAA,OAAO,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,GAAO,EAAA,GAAK,OAAO,KAAK,CAAA;AAAA,EAClE,CAAC,CAAA;AACH;AAEA,SAAS,QAAA,CAAS,KAA8B,IAAA,EAAuB;AACrE,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,EAAA,IAAI,OAAA,GAAmB,GAAA;AACvB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,YAAY,IAAA,IAAQ,OAAA,KAAY,MAAA,IAAa,OAAO,YAAY,QAAA,EAAU;AAC5E,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAA,GAAW,QAAoC,IAAI,CAAA;AAAA,EACrD;AACA,EAAA,OAAO,OAAA;AACT;AAYO,SAAS,yBAAyB,IAAA,EAAkC;AACzE,EAAA,OAAO,KAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,MAAS,CAAA;AAClD","file":"chunk-TRRFUVDJ.js","sourcesContent":["/**\n * Capability dispatch helpers for bridge drivers.\n *\n * The runner builds a {@link BridgeCapabilityHooks} bundle from its\n * `CapabilityRegistry` and threads it through `AgentConfig.capabilities`.\n * Drivers consume the bundle via these helpers without taking a runtime\n * dependency on `@skaile/workspaces/runner` (which would create a circular dep).\n *\n * Three behaviours are layered into a single dispatch path:\n *\n * 1. **Standard tool call** — the LLM invokes a capability; the bridge calls\n * `hooks.invoke()`, awaits the result, and returns it to the LLM.\n * 2. **Fire-and-forget** — when the resolved Capability has `fireAndForget`\n * set, the bridge resolves to `{}` immediately and runs the handler in\n * the background. Background errors are logged but never surfaced to the\n * LLM since the call is already settled.\n * 3. **Render capability** — when the resolved Capability has a non-undefined\n * `render`, the bridge emits `RenderInvokedEvent` to the runner via\n * `hooks.emitRender` and (when `render.fallback` is set) a parallel text\n * event via `hooks.emitText` with simple `{{prop}}` substitution. The\n * placeholder convention follows the v2 spec — top-level keys of `props`\n * only, with optional dotted-path traversal (`{{user.name}}`). The legacy\n * AAP `{{props.x}}` form was retired in Phase 6.\n *\n * @category Capabilities\n * @since 2.0.0\n */\nimport { randomUUID } from \"node:crypto\";\nimport {\n type Capability,\n declaresActivityLabel,\n stripActivityLabel,\n} from \"@skaile/workspaces/types\";\nimport type { BridgeCapabilityHooks } from \"./types.js\";\n\n/**\n * Result of a capability dispatch returned by {@link dispatchCapability}.\n *\n * The bridge feeds `{ result }` back to the LLM tool-use response. For\n * fire-and-forget capabilities `result` is always `{}` and `background` is `true`.\n *\n * @docLink packages/bridge/concepts#capability-dispatch-result\n */\nexport interface CapabilityDispatchResult {\n /** Value returned to the LLM. `{}` for fire-and-forget capabilities. */\n result: unknown;\n /** True when the handler is still running in the background (fire-and-forget). */\n background: boolean;\n /** The per-dispatch call id minted for this invocation (see {@link dispatchCapability}). */\n callId: string;\n}\n\n/**\n * Run a capability invocation through the runner-provided hooks, applying\n * render-event emission and fire-and-forget short-circuit.\n *\n * The result is always shaped for direct return to the LLM. For\n * fire-and-forget capabilities the background promise is fired and any error\n * is logged through `onBackgroundError` (defaulting to a no-op). For all\n * other capabilities the handler is awaited; errors propagate as a rejection\n * so the driver can surface them as tool errors.\n *\n * **Dispatch call id.** Every dispatch mints a fresh `randomUUID()` and uses it\n * for `render_invoked.callId`, `hooks.invoke`'s `callId` and — for client\n * capabilities — the outbound `capability_invoked.callId`. It is deliberately\n * NOT the driver's tool-call id: those are only as unique as the model\n * provider makes them (some backends emit `call_0` on every turn), and the\n * runner's pending-call map is keyed by this id, so a late `capability_result`\n * for a timed-out call must never be able to resolve a later call that reused\n * the provider's id. Drivers map results back to their tool calls through the\n * returned value, never through this id.\n *\n * @param hooks - Capability dispatch bundle from `AgentConfig.capabilities`.\n * @param name - Registered capability name.\n * @param input - Raw tool input from the LLM.\n * @param onBackgroundError - Optional error handler for fire-and-forget failures; receives the dispatch call id.\n * @param signal - Optional abort signal forwarded to the handler.\n * @returns Resolved dispatch result with the LLM-facing value, background flag and dispatch call id.\n * @docLink packages/bridge/concepts#dispatch-capability\n */\nexport async function dispatchCapability(\n hooks: BridgeCapabilityHooks,\n name: string,\n input: unknown,\n onBackgroundError: (err: unknown, callId: string) => void = () => {},\n signal?: AbortSignal,\n): Promise<CapabilityDispatchResult> {\n signal?.throwIfAborted();\n const callId = randomUUID();\n const cap = hooks.resolve(name);\n // The advertised `activity_label` is for the UI only. Strip it before render\n // props and the handler: strict inputs would reject it and external MCP\n // passthrough would forward it. Kept when the capability declares it itself.\n if (!declaresActivityLabel(cap?.inputSchema)) input = stripActivityLabel(input);\n\n // Render emission happens before invocation so clients see the props the\n // LLM passed in even if the handler errors. The runner's gateway forwards\n // the event over the transport.\n if (cap?.render && hooks.emitRender) {\n hooks.emitRender({\n type: \"render_invoked\",\n capabilityName: name,\n props: input,\n callId,\n });\n if (cap.render.fallback && hooks.emitText) {\n const fallback = renderFallback(cap.render.fallback, input);\n hooks.emitText(fallback);\n }\n }\n\n if (cap?.fireAndForget) {\n // Resolve immediately; run handler in background.\n void hooks.invoke(name, input, signal, callId).catch((err) => onBackgroundError(err, callId));\n return { result: {}, background: true, callId };\n }\n\n const result = await hooks.invoke(name, input, signal, callId);\n return { result, background: false, callId };\n}\n\n/**\n * Substitute `{{prop}}` placeholders inside a fallback template using the\n * input record. Top-level keys of `props` resolve directly\n * (`{{name}}` → `props.name`); dotted paths traverse nested records\n * (`{{user.name}}` → `props.user.name`). Missing keys collapse to an empty\n * string; non-record inputs collapse all placeholders.\n *\n * The convention is fixed by the v2 spec (§1, `RenderSpec.fallback`). The\n * legacy AAP form `{{props.x}}` is no longer accepted — author fallbacks\n * with bare keys.\n *\n * Intentionally minimal — full template engines belong in the platform's\n * render layer, not the bridge.\n *\n * @param template - Fallback string from `RenderSpec.fallback` with `{{key}}` placeholders.\n * @param input - LLM tool input object; non-object values collapse all placeholders.\n * @returns Template with all resolvable placeholders replaced.\n * @docLink packages/bridge/concepts#render-fallback\n */\nexport function renderFallback(template: string, input: unknown): string {\n if (!input || typeof input !== \"object\") {\n return template.replace(/\\{\\{\\s*[\\w$.]+\\s*\\}\\}/g, \"\");\n }\n const props = input as Record<string, unknown>;\n return template.replace(/\\{\\{\\s*([\\w$.]+)\\s*\\}\\}/g, (_match, path: string) => {\n const value = readPath(props, path);\n return value === undefined || value === null ? \"\" : String(value);\n });\n}\n\nfunction readPath(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split(\".\");\n let current: unknown = obj;\n for (const part of parts) {\n if (current === null || current === undefined || typeof current !== \"object\") {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\n/**\n * Filter a capability list to those marked as render-capable (having a `render` spec).\n *\n * Used by drivers that emit a separate render manifest at registration time.\n * Currently unused in production drivers; reserved for future phases.\n *\n * @param caps - Full capability list to filter.\n * @returns Subset of capabilities with a non-undefined `render` property.\n * @docLink packages/bridge/concepts#filter-render-capabilities\n */\nexport function filterRenderCapabilities(caps: Capability[]): Capability[] {\n return caps.filter((c) => c.render !== undefined);\n}\n"]}
@@ -2096,5 +2096,5 @@ var AssetManager = class {
2096
2096
  };
2097
2097
 
2098
2098
  export { AssetManager, FACTORY_SOURCE_URL, MissingManifestError, NON_DEPLOYABLE_KINDS, normalizeRepoUrl, parseCanonicalLockKey, parseRefTolerant, renderMcpServerConfig, softDepName };
2099
- //# sourceMappingURL=chunk-IHFQTKUP.js.map
2100
- //# sourceMappingURL=chunk-IHFQTKUP.js.map
2099
+ //# sourceMappingURL=chunk-YOA4YBMR.js.map
2100
+ //# sourceMappingURL=chunk-YOA4YBMR.js.map