@fased/fased 0.1.48 → 0.1.51

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 (157) hide show
  1. package/dist/agents/auth-health.js +11 -5
  2. package/dist/agents/current-model-catalog.js +45 -0
  3. package/dist/agents/model-catalog-source.js +28 -3
  4. package/dist/agents/provider-id.js +1 -1
  5. package/dist/brand.js +1 -1
  6. package/dist/build-info.json +3 -3
  7. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  8. package/dist/cli/lightweight/gateway-runtime-probe.js +50 -0
  9. package/dist/cli/update-cli/update-command.js +120 -0
  10. package/dist/commands/doctor-state-integrity.js +25 -2
  11. package/dist/config/sessions/transcript.js +30 -16
  12. package/dist/config/sessions.js +2 -2
  13. package/dist/control-ui/assets/{app-CHqTx3P_.js → app-wJm5kuje.js} +1274 -1259
  14. package/dist/control-ui/assets/{chat-model-ref-BbrdMKjQ.js → chat-model-ref-Cs2TTOtF.js} +2 -2
  15. package/dist/control-ui/assets/{config-FFZLTSLS.js → config-CU5Zi8Dh.js} +2 -2
  16. package/dist/control-ui/assets/{index-CFHfNlLv.js → index-vTDTf5Zv.js} +3 -3
  17. package/dist/control-ui/assets/{mining-D_VAMFMY.js → mining-BdhMn18r.js} +3 -3
  18. package/dist/control-ui/assets/{providers-DqFL6WrJ.js → providers-C0DEXi8e.js} +14 -3
  19. package/dist/control-ui/index.html +1 -1
  20. package/dist/gateway/probe-payload.js +14 -0
  21. package/dist/gateway/probe.js +8 -4
  22. package/dist/gateway/protocol/schema/agents-models-skills.js +1 -0
  23. package/dist/gateway/protocol/schema/frames.js +5 -0
  24. package/dist/gateway/protocol/schema/snapshot.js +1 -0
  25. package/dist/gateway/server/ws-connection/message-handler.js +2 -1
  26. package/dist/gateway/server-http-lazy.js +2 -4
  27. package/dist/gateway/server-http.js +3 -4
  28. package/dist/gateway/server-methods/chat.js +4 -29
  29. package/dist/gateway/server-methods/models.js +3 -2
  30. package/dist/infra/system-presence.js +4 -2
  31. package/dist/light-update-precheck.js +1 -1
  32. package/dist/light-update-status.js +1 -1
  33. package/dist/memory/inventory.js +19 -0
  34. package/dist/plugin-sdk/{accounts-DI5226U8.js → accounts-BfdIB9Ud.js} +1 -1
  35. package/dist/plugin-sdk/{actions-CEj4gOU2.js → actions-DHN_x97P.js} +2 -2
  36. package/dist/plugin-sdk/{active-listener-Ss4UKXZb.js → active-listener-CIP_Ht8d.js} +1 -1
  37. package/dist/plugin-sdk/{audio-preflight-Cu4alGjb.js → audio-preflight-CKGhXtyV.js} +26 -26
  38. package/dist/plugin-sdk/{audit-BTskqjJ_.js → audit-Cmg38KPG.js} +1 -1
  39. package/dist/plugin-sdk/{channel-access-B1KciKmw.js → channel-access-JHDguu4T.js} +1 -1
  40. package/dist/plugin-sdk/{channel-access-configure-Y91FLOJc.js → channel-access-configure-B8mwKp-Z.js} +1 -1
  41. package/dist/plugin-sdk/channel-plugin-common.d.ts +2 -2
  42. package/dist/plugin-sdk/channel-plugin-common.js +4 -4
  43. package/dist/plugin-sdk/{chunk-items-Q8HhMuSe.js → chunk-items-iKdlZyWZ.js} +1 -1
  44. package/dist/plugin-sdk/{chunk-CSUjIQSx.js → chunk-oJRyTNTL.js} +1 -1
  45. package/dist/plugin-sdk/command-status.js +26 -26
  46. package/dist/plugin-sdk/{commands-registry-DJ0pfCcY.js → commands-registry-Cjo7OjIf.js} +2 -2
  47. package/dist/plugin-sdk/{common-Cjm8psuW.js → common-Dx4sUa9f.js} +1 -1
  48. package/dist/plugin-sdk/{config-DutIeFge.js → config-DdS0zHiU.js} +80 -4
  49. package/dist/plugin-sdk/{config-schema-Cg6PYSHR.js → config-schema-BJQEjMPz.js} +2090 -523
  50. package/dist/plugin-sdk/device-pair.d.ts +1 -1
  51. package/dist/plugin-sdk/discord.d.ts +4 -4
  52. package/dist/plugin-sdk/discord.js +19 -19
  53. package/dist/plugin-sdk/{handle-action-Dp2741iu.js → handle-action-wR0x9b0c.js} +13 -13
  54. package/dist/plugin-sdk/{helpers-BCZ9d3fl.js → helpers-DkauqZNP.js} +1 -1
  55. package/dist/plugin-sdk/{image-ops-B-QR_M9Z.js → image-ops-DmSjpAeh.js} +1 -1
  56. package/dist/plugin-sdk/index.d.ts +17 -17
  57. package/dist/plugin-sdk/index.js +28 -28
  58. package/dist/plugin-sdk/{login-BFvQxf9o.js → login-DB9LIbi8.js} +3 -3
  59. package/dist/plugin-sdk/{login-qr-CERTe_nD.js → login-qr-CDhMa-c7.js} +3 -3
  60. package/dist/plugin-sdk/{manager-Dhq3SXpO.js → manager-DGZsMQWR.js} +2 -2
  61. package/dist/plugin-sdk/{markdown-tables-B1Tx7c77.js → markdown-tables-BX7JXDUV.js} +1 -1
  62. package/dist/plugin-sdk/{media-BwsqooWC.js → media-DyzsScOp.js} +2 -2
  63. package/dist/plugin-sdk/{monitor-BYzN5Qr4.js → monitor-B91PZ2mD.js} +31 -31
  64. package/dist/plugin-sdk/{monitor-CJiacqtR.js → monitor-BH9rTJFq.js} +30 -30
  65. package/dist/plugin-sdk/{openresponses-http-VLSSqCZZ.js → openresponses-http-CmBLZ9bH.js} +26 -26
  66. package/dist/plugin-sdk/{optional-runtime-dependency-BEBP4VFJ.js → optional-runtime-dependency-DaMkPVe_.js} +1 -1
  67. package/dist/plugin-sdk/{outbound-BqWgaC5M.js → outbound-X-m2mBZn.js} +6 -6
  68. package/dist/plugin-sdk/{outbound-attachment-L1q40kiu.js → outbound-attachment-M0NCUSG-.js} +2 -2
  69. package/dist/plugin-sdk/{pairing-message-DWXHX-jt.d.ts → pairing-message-BaQiXKLE.d.ts} +1 -1
  70. package/dist/plugin-sdk/{pairing-message-CZBahREg.js → pairing-message-hnmpJlW2.js} +1 -1
  71. package/dist/plugin-sdk/{pairing-store-D7I1Qmiw.js → pairing-store-DyghUm9G.js} +2 -2
  72. package/dist/plugin-sdk/{pi-model-discovery-C5klknQZ.js → pi-model-discovery-ReorOh7W.js} +1 -1
  73. package/dist/plugin-sdk/{pi-model-discovery-runtime-DIEMhCZ5.js → pi-model-discovery-runtime-C-CHZo03.js} +2 -2
  74. package/dist/plugin-sdk/provider-web-search-config-contract.d.ts +1 -1
  75. package/dist/plugin-sdk/{pw-ai-Bv-q25gY.js → pw-ai-D_gli3_r.js} +3 -3
  76. package/dist/plugin-sdk/{replies-Bd9ktEkq.js → replies-Djyehmcu.js} +2 -2
  77. package/dist/plugin-sdk/{resolve-outbound-target-CCIyBb5H.js → resolve-outbound-target-Chznq8rS.js} +1 -1
  78. package/dist/plugin-sdk/{resolve-route-B7vZ3nKp.js → resolve-route-Ce08Fx-G.js} +1 -1
  79. package/dist/plugin-sdk/{retry-policy-ChC3G4lv.js → retry-policy-eS25atAo.js} +1 -1
  80. package/dist/plugin-sdk/{runtime-BLknHFGz.js → runtime-Cv3gX3Wc.js} +31 -18
  81. package/dist/plugin-sdk/{runtime-dependency-C5rJfC0u.js → runtime-dependency-p_iKbESf.js} +2 -2
  82. package/dist/plugin-sdk/sat-runtime.d.ts +2 -2
  83. package/dist/plugin-sdk/sat-runtime.js +5 -5
  84. package/dist/plugin-sdk/{send-Bd3Z-jAd.js → send-B3RAELvw.js} +6 -6
  85. package/dist/plugin-sdk/{send-Bmtz9ICm.js → send-BuPGxx3-.js} +8 -8
  86. package/dist/plugin-sdk/{send-mkyZzhCO.js → send-C-jaxZJG.js} +5 -5
  87. package/dist/plugin-sdk/{send-CUGEhiUa.js → send-CSob7dn9.js} +6 -6
  88. package/dist/plugin-sdk/{send-CMoWt-EX.js → send-CsLJsIvv.js} +7 -7
  89. package/dist/plugin-sdk/{session-D2zmelOL.js → session-DKJGakm1.js} +2 -2
  90. package/dist/plugin-sdk/{skill-commands-BybEjJ1_.js → skill-commands-BqpZG5nW.js} +2 -2
  91. package/dist/plugin-sdk/{slack-DogXvGG3.js → slack-CQqN9uBH.js} +38 -38
  92. package/dist/plugin-sdk/{slack-actions-uXb55QWW.js → slack-actions-DlbVH5SS.js} +11 -11
  93. package/dist/plugin-sdk/slack.d.ts +4 -4
  94. package/dist/plugin-sdk/slack.js +9 -9
  95. package/dist/plugin-sdk/{sticker-cache-BuPw7fTf.js → sticker-cache-CDyt2ZMh.js} +3 -3
  96. package/dist/plugin-sdk/{tables-CVDOT5dX.js → tables-Cij4iAXw.js} +1 -1
  97. package/dist/plugin-sdk/{targets-DskkhJAp.js → targets-VrYeAmeT.js} +1 -1
  98. package/dist/plugin-sdk/{telegram-actions-_KQPbjpI.js → telegram-actions-ZwUBOkwa.js} +29 -29
  99. package/dist/plugin-sdk/telegram.d.ts +4 -4
  100. package/dist/plugin-sdk/telegram.js +8 -8
  101. package/dist/plugin-sdk/{thread-bindings.lifecycle-CrhQXYEU.js → thread-bindings.lifecycle-BWIzwpPM.js} +3 -3
  102. package/dist/plugin-sdk/{thread-bindings.state-ssxdG7xV.js → thread-bindings.state-CpAQrGco.js} +2 -2
  103. package/dist/plugin-sdk/{tmp-fased-dir-Be1wBhVz.d.ts → tmp-fased-dir-DLba1ePP.d.ts} +1 -1
  104. package/dist/plugin-sdk/{types-CXLEOrJX.d.ts → types-CKR2Lvsa.d.ts} +1 -1
  105. package/dist/plugin-sdk/{types-CJGVZX6j.d.ts → types-NR-f-rw-.d.ts} +3 -3
  106. package/dist/plugin-sdk/{wallet-status-CQI89c_6.js → wallet-status-ClmXigGN.js} +10 -3
  107. package/dist/plugin-sdk/{web-C8DwA0eO.js → web-BK2j9z6c.js} +31 -31
  108. package/dist/plugin-sdk/{whatsapp-actions-DfvM-mlZ.js → whatsapp-actions-CaenMy79.js} +13 -13
  109. package/dist/plugin-sdk/{whatsapp-heartbeat-DyJasLDB.js → whatsapp-heartbeat-Cr9K5Sil.js} +2 -2
  110. package/dist/plugin-sdk/whatsapp.d.ts +11 -11
  111. package/dist/plugin-sdk/whatsapp.js +12 -12
  112. package/dist/plugin-sdk/{wsl-JwmI6Zu8.js → wsl-D_I-iL4U.js} +3 -3
  113. package/dist/plugin-sdk/{zod-schema.providers-core-BE_5DNhj.d.ts → zod-schema.providers-core-CIzCjXH9.d.ts} +71 -71
  114. package/dist/plugins/status-cache.js +1 -1
  115. package/dist/providers/refresh.js +1 -1
  116. package/dist/providers/refreshed-model-capabilities.js +1935 -406
  117. package/dist/providers/registry.js +14 -3
  118. package/dist/version.js +11 -1
  119. package/extensions/acpx/package.json +1 -1
  120. package/extensions/bluebubbles/package.json +1 -1
  121. package/extensions/copilot-proxy/package.json +1 -1
  122. package/extensions/diagnostics-otel/package.json +1 -1
  123. package/extensions/fased-federation/package.json +1 -1
  124. package/extensions/google-gemini-cli-auth/package.json +1 -1
  125. package/extensions/imessage/package.json +1 -1
  126. package/extensions/irc/package.json +1 -1
  127. package/extensions/line/package.json +1 -1
  128. package/extensions/llm-task/package.json +1 -1
  129. package/extensions/lobster/package.json +1 -1
  130. package/extensions/matrix/CHANGELOG.md +18 -0
  131. package/extensions/matrix/package.json +1 -1
  132. package/extensions/mattermost/package.json +1 -1
  133. package/extensions/memory-core/package.json +2 -2
  134. package/extensions/memory-lancedb/package.json +1 -1
  135. package/extensions/minimax-portal-auth/package.json +1 -1
  136. package/extensions/msteams/CHANGELOG.md +18 -0
  137. package/extensions/msteams/package.json +1 -1
  138. package/extensions/nextcloud-talk/package.json +1 -1
  139. package/extensions/nostr/CHANGELOG.md +18 -0
  140. package/extensions/nostr/package.json +1 -1
  141. package/extensions/open-prose/package.json +1 -1
  142. package/extensions/sat-mining/index.ts +121 -12
  143. package/extensions/sat-mining/package.json +1 -1
  144. package/extensions/sat-mining/src/runtime.ts +9 -3
  145. package/extensions/signal/package.json +1 -1
  146. package/extensions/synology-chat/package.json +1 -1
  147. package/extensions/tlon/package.json +1 -1
  148. package/extensions/twitch/CHANGELOG.md +18 -0
  149. package/extensions/twitch/package.json +1 -1
  150. package/extensions/voice-call/CHANGELOG.md +18 -0
  151. package/extensions/voice-call/package.json +1 -1
  152. package/extensions/zalo/CHANGELOG.md +18 -0
  153. package/extensions/zalo/package.json +1 -1
  154. package/extensions/zalouser/CHANGELOG.md +18 -0
  155. package/extensions/zalouser/package.json +1 -1
  156. package/package.json +1 -1
  157. package/scripts/start-managed.sh +35 -1
@@ -138,7 +138,9 @@ const CHUTES_MODEL_IDS = [
138
138
  "moonshotai/Kimi-K2.6-TEE",
139
139
  "Qwen/Qwen3.6-27B-TEE",
140
140
  "Qwen/Qwen3.5-397B-A17B-TEE",
141
- "zai-org/GLM-5-TEE"
141
+ "zai-org/GLM-5-TEE",
142
+ "Qwen/Qwen3-235B-A22B-Thinking-2507-TEE",
143
+ "zai-org/GLM-5.2-TEE"
142
144
  ];
143
145
  const CHUTES_MODEL_REFS = CHUTES_MODEL_IDS.map((id) => `${CHUTES_ROUTE_ID}/${id}`);
144
146
  const OLLAMA_MODEL_REFS = [];
@@ -505,7 +507,7 @@ const ANTHROPIC_MODEL_CAPABILITY_OVERRIDES = {
505
507
  thinkingLevels: ANTHROPIC_THINKING_LEVELS,
506
508
  defaultThinkingLevel: "low",
507
509
  thinkingMode: "anthropic-adaptive",
508
- reasoningBudgetSupported: true
510
+ reasoningBudgetSupported: false
509
511
  },
510
512
  "anthropic/claude-haiku-4-5": {
511
513
  thinkingLevels: ANTHROPIC_THINKING_LEVELS,
@@ -853,6 +855,7 @@ const OLLAMA_PROVIDER_MANIFEST = {
853
855
  models: {
854
856
  recommended: OLLAMA_MODEL_REFS,
855
857
  dynamic: true,
858
+ operatorCatalog: true,
856
859
  routeRules: { [OLLAMA_ROUTE_ID]: [`${OLLAMA_ROUTE_ID}/*`] }
857
860
  },
858
861
  modelCapabilities: buildProviderModelCapabilities(OLLAMA_MODEL_REFS)
@@ -874,6 +877,7 @@ const LMSTUDIO_PROVIDER_MANIFEST = {
874
877
  models: {
875
878
  recommended: LMSTUDIO_MODEL_REFS,
876
879
  dynamic: true,
880
+ operatorCatalog: true,
877
881
  routeRules: { [LMSTUDIO_ROUTE_ID]: [`${LMSTUDIO_ROUTE_ID}/*`] }
878
882
  },
879
883
  modelCapabilities: buildProviderModelCapabilities(LMSTUDIO_MODEL_REFS)
@@ -895,6 +899,7 @@ const VLLM_PROVIDER_MANIFEST = {
895
899
  models: {
896
900
  recommended: VLLM_MODEL_REFS,
897
901
  dynamic: true,
902
+ operatorCatalog: true,
898
903
  routeRules: { [VLLM_ROUTE_ID]: [`${VLLM_ROUTE_ID}/*`] }
899
904
  },
900
905
  modelCapabilities: buildProviderModelCapabilities(VLLM_MODEL_REFS)
@@ -1432,6 +1437,7 @@ const LITELLM_PROVIDER_MANIFEST = {
1432
1437
  models: {
1433
1438
  recommended: [...LITELLM_MODEL_REFS],
1434
1439
  dynamic: true,
1440
+ operatorCatalog: true,
1435
1441
  routeRules: { [LITELLM_ROUTE_ID]: [`${LITELLM_ROUTE_ID}/*`] }
1436
1442
  },
1437
1443
  modelCapabilities: LITELLM_MODEL_CAPABILITY_OVERRIDES
@@ -1473,6 +1479,7 @@ const CUSTOM_PROVIDER_MANIFEST = {
1473
1479
  models: {
1474
1480
  recommended: CUSTOM_PROVIDER_MODEL_REFS,
1475
1481
  dynamic: true,
1482
+ operatorCatalog: true,
1476
1483
  routeRules: { [CUSTOM_PROVIDER_ROUTE_ID]: [`${CUSTOM_PROVIDER_ROUTE_ID}/*`] }
1477
1484
  },
1478
1485
  modelCapabilities: buildProviderModelCapabilities(CUSTOM_PROVIDER_MODEL_REFS)
@@ -1559,7 +1566,11 @@ function isStandardProviderModelRef(ref) {
1559
1566
  if (!getProviderBrandManifestForRoute(provider)) {
1560
1567
  return false;
1561
1568
  }
1562
- if (getProviderBrandManifestForRoute(provider)?.models.dynamic) {
1569
+ const manifest = getProviderBrandManifestForRoute(provider);
1570
+ if (!manifest) {
1571
+ return false;
1572
+ }
1573
+ if (manifest.models.operatorCatalog) {
1563
1574
  return true;
1564
1575
  }
1565
1576
  return STANDARD_PROVIDER_MODEL_REFS.has(value.toLowerCase());
package/dist/version.js CHANGED
@@ -52,10 +52,20 @@ function readVersionFromBuildInfoForModuleUrl(moduleUrl) {
52
52
  function resolveVersionFromModuleUrl(moduleUrl) {
53
53
  return readVersionFromPackageJsonForModuleUrl(moduleUrl) || readVersionFromBuildInfoForModuleUrl(moduleUrl);
54
54
  }
55
+ function resolveRuntimeSource(env = process.env, moduleUrl = import.meta.url) {
56
+ const configured = env["FASED_RUNTIME_SOURCE"]?.trim();
57
+ if (configured === "source-checkout" || configured === "managed-package" || configured === "packaged-runtime") {
58
+ return configured;
59
+ }
60
+ if (moduleUrl.includes("/install-cache/npm-global/") || moduleUrl.includes("/node_modules/@fased/fased/")) {
61
+ return "managed-package";
62
+ }
63
+ return env["FASED_GATEWAY_MODE"] === "managed" ? "packaged-runtime" : "source-checkout";
64
+ }
55
65
  function resolveRuntimeServiceVersion(env = process.env, fallback = "dev") {
56
66
  return firstNonEmpty(env["FASED_VERSION"], env["FASED_SERVICE_VERSION"], env["npm_package_version"]) ?? fallback;
57
67
  }
58
68
  const VERSION = typeof __FASED_VERSION__ === "string" && __FASED_VERSION__ || process.env.FASED_BUNDLED_VERSION || resolveVersionFromModuleUrl(import.meta.url) || "0.0.0";
59
69
 
60
70
  //#endregion
61
- export { VERSION, resolveRuntimeServiceVersion };
71
+ export { VERSION, resolveRuntimeServiceVersion, resolveRuntimeSource };
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/acpx",
3
- "version": "0.1.48",
3
+ "version": "0.1.51",
4
4
  "description": "FasedAgent ACP runtime backend via acpx",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/bluebubbles",
3
- "version": "0.1.48",
3
+ "version": "0.1.51",
4
4
  "description": "FasedAgent BlueBubbles channel plugin",
5
5
  "type": "module",
6
6
  "fased": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/copilot-proxy",
3
- "version": "0.1.48",
3
+ "version": "0.1.51",
4
4
  "private": true,
5
5
  "description": "FasedAgent Copilot Proxy provider plugin",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/diagnostics-otel",
3
- "version": "0.1.48",
3
+ "version": "0.1.51",
4
4
  "description": "FasedAgent diagnostics OpenTelemetry exporter",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/fased-federation",
3
- "version": "0.1.48",
3
+ "version": "0.1.51",
4
4
  "private": true,
5
5
  "description": "Fased federation adapter package scaffold (A2A + admission helpers)",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/google-gemini-cli-auth",
3
- "version": "0.1.48",
3
+ "version": "0.1.51",
4
4
  "private": true,
5
5
  "description": "FasedAgent Gemini CLI OAuth provider plugin",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/imessage",
3
- "version": "0.1.48",
3
+ "version": "0.1.51",
4
4
  "private": true,
5
5
  "description": "FasedAgent iMessage channel plugin",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/irc",
3
- "version": "0.1.48",
3
+ "version": "0.1.51",
4
4
  "description": "FasedAgent IRC channel plugin",
5
5
  "type": "module",
6
6
  "fased": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/line",
3
- "version": "0.1.48",
3
+ "version": "0.1.51",
4
4
  "private": true,
5
5
  "description": "FasedAgent LINE channel plugin",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/llm-task",
3
- "version": "0.1.48",
3
+ "version": "0.1.51",
4
4
  "private": true,
5
5
  "description": "FasedAgent JSON-only LLM task plugin",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/lobster",
3
- "version": "0.1.48",
3
+ "version": "0.1.51",
4
4
  "description": "Lobster workflow tool plugin (typed pipelines + resumable approvals)",
5
5
  "type": "module",
6
6
  "fased": {
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.51
4
+
5
+ ### Changes
6
+
7
+ - Version alignment with core FasedAgent release numbers.
8
+
9
+ ## 0.1.50
10
+
11
+ ### Changes
12
+
13
+ - Version alignment with core FasedAgent release numbers.
14
+
15
+ ## 0.1.49
16
+
17
+ ### Changes
18
+
19
+ - Version alignment with core FasedAgent release numbers.
20
+
3
21
  ## 0.1.48
4
22
 
5
23
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/matrix",
3
- "version": "0.1.48",
3
+ "version": "0.1.51",
4
4
  "description": "FasedAgent Matrix channel plugin",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/mattermost",
3
- "version": "0.1.48",
3
+ "version": "0.1.51",
4
4
  "description": "FasedAgent Mattermost channel plugin",
5
5
  "type": "module",
6
6
  "fased": {
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@fased/memory-core",
3
- "version": "0.1.48",
3
+ "version": "0.1.51",
4
4
  "private": true,
5
5
  "description": "FasedAgent core memory search plugin",
6
6
  "type": "module",
7
7
  "peerDependencies": {
8
- "@fased/fased": "^0.1.48"
8
+ "@fased/fased": "^0.1.51"
9
9
  },
10
10
  "fased": {
11
11
  "extensions": [
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/memory-lancedb",
3
- "version": "0.1.48",
3
+ "version": "0.1.51",
4
4
  "private": true,
5
5
  "description": "FasedAgent LanceDB-backed long-term memory plugin with auto-recall/capture",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/minimax-portal-auth",
3
- "version": "0.1.48",
3
+ "version": "0.1.51",
4
4
  "private": true,
5
5
  "description": "FasedAgent MiniMax Portal OAuth provider plugin",
6
6
  "type": "module",
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.51
4
+
5
+ ### Changes
6
+
7
+ - Version alignment with core FasedAgent release numbers.
8
+
9
+ ## 0.1.50
10
+
11
+ ### Changes
12
+
13
+ - Version alignment with core FasedAgent release numbers.
14
+
15
+ ## 0.1.49
16
+
17
+ ### Changes
18
+
19
+ - Version alignment with core FasedAgent release numbers.
20
+
3
21
  ## 0.1.48
4
22
 
5
23
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/msteams",
3
- "version": "0.1.48",
3
+ "version": "0.1.51",
4
4
  "description": "FasedAgent Microsoft Teams channel plugin",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/nextcloud-talk",
3
- "version": "0.1.48",
3
+ "version": "0.1.51",
4
4
  "description": "FasedAgent Nextcloud Talk channel plugin",
5
5
  "type": "module",
6
6
  "fased": {
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.51
4
+
5
+ ### Changes
6
+
7
+ - Version alignment with core FasedAgent release numbers.
8
+
9
+ ## 0.1.50
10
+
11
+ ### Changes
12
+
13
+ - Version alignment with core FasedAgent release numbers.
14
+
15
+ ## 0.1.49
16
+
17
+ ### Changes
18
+
19
+ - Version alignment with core FasedAgent release numbers.
20
+
3
21
  ## 0.1.48
4
22
 
5
23
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/nostr",
3
- "version": "0.1.48",
3
+ "version": "0.1.51",
4
4
  "description": "FasedAgent Nostr channel plugin for NIP-04 encrypted DMs",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/open-prose",
3
- "version": "0.1.48",
3
+ "version": "0.1.51",
4
4
  "private": true,
5
5
  "description": "OpenProse VM skill pack plugin (slash command + telemetry).",
6
6
  "type": "module",
@@ -784,6 +784,17 @@ const satMiningPlugin = {
784
784
  const walletId = readWalletProviderRegistry(effectiveEnv).defaultWalletId?.trim();
785
785
  return walletId ? walletId : undefined;
786
786
  };
787
+ const readRegisteredWalletRole = (walletId: string | undefined) => {
788
+ const resolvedWalletId = walletId?.trim();
789
+ if (!resolvedWalletId) {
790
+ return undefined;
791
+ }
792
+ const { effectiveEnv } = resolveWalletRuntimeContext();
793
+ const wallet = readWalletProviderRegistry(effectiveEnv).wallets.find(
794
+ (entry) => entry.id === resolvedWalletId,
795
+ );
796
+ return wallet ? resolveWalletUserRole(wallet) : undefined;
797
+ };
787
798
  const resolveMiningWalletSelection = async (opts?: {
788
799
  walletId?: string;
789
800
  requireResolvedWallet?: boolean;
@@ -807,9 +818,46 @@ const satMiningPlugin = {
807
818
  return { wallets: wallet ? [wallet] : [], wallet, selectedWalletId };
808
819
  };
809
820
  const ensureStartupWalletBinding = async (opts?: { requireResolvedWallet?: boolean }) => {
810
- const selection = await resolveMiningWalletSelection({
811
- requireResolvedWallet: opts?.requireResolvedWallet,
812
- });
821
+ let selection: Awaited<ReturnType<typeof resolveMiningWalletSelection>>;
822
+ try {
823
+ selection = await resolveMiningWalletSelection({
824
+ requireResolvedWallet: opts?.requireResolvedWallet,
825
+ });
826
+ } catch (error) {
827
+ const configuredWalletId = resolveConfiguredWalletId();
828
+ if (!configuredWalletId) {
829
+ throw error;
830
+ }
831
+ const configuredWalletRole = readRegisteredWalletRole(configuredWalletId);
832
+ if (!configuredWalletRole || configuredWalletRole === "mining") {
833
+ throw error;
834
+ }
835
+ const miningWallets = await listMiningWallets();
836
+ if (miningWallets.length === 1) {
837
+ await attachWallet(miningWallets[0]!.walletId);
838
+ api.logger.warn(
839
+ `[sat-mining] migrated invalid miner profile wallet ${configuredWalletId} to ${miningWallets[0]!.walletId}`,
840
+ );
841
+ selection = await resolveMiningWalletSelection({
842
+ requireResolvedWallet: opts?.requireResolvedWallet,
843
+ });
844
+ } else {
845
+ state.activeConfig.walletId = undefined;
846
+ state.activeConfig.enabled = false;
847
+ state.activeWalletAddress = null;
848
+ state.running = false;
849
+ await stopSatWorkerServices();
850
+ await persistActiveConfig({ includeEnabled: true });
851
+ if (opts?.requireResolvedWallet) {
852
+ throw new Error(
853
+ miningWallets.length === 0
854
+ ? "the saved mining profile referenced an invalid wallet and no dedicated Mining wallet exists; create or import @wallet:mining first"
855
+ : "the saved mining profile referenced an invalid wallet; select the dedicated Mining wallet before starting",
856
+ );
857
+ }
858
+ selection = { wallets: [], wallet: undefined, selectedWalletId: undefined };
859
+ }
860
+ }
813
861
  state.activeWalletAddress = selection.wallet?.address ?? null;
814
862
  await ensureSatCapitalActionSignerReady();
815
863
  return selection;
@@ -3288,8 +3336,20 @@ const satMiningPlugin = {
3288
3336
  options?: { syncActiveCommit?: boolean; freezeCommitMs?: number },
3289
3337
  ) => {
3290
3338
  const previousWalletId = resolveConfiguredWalletId();
3291
- state.activeConfig.walletId =
3339
+ const requestedWalletId =
3292
3340
  typeof profile.walletId === "string" ? profile.walletId.trim() || undefined : undefined;
3341
+ if (requestedWalletId) {
3342
+ const requestedWalletRole = readRegisteredWalletRole(requestedWalletId);
3343
+ if (!requestedWalletRole) {
3344
+ throw new Error(`walletId not found: ${requestedWalletId}`);
3345
+ }
3346
+ if (requestedWalletRole !== "mining") {
3347
+ throw new Error(
3348
+ `walletId ${requestedWalletId} is not the dedicated Mining wallet; create or import @wallet:mining and use that wallet for SAT mining`,
3349
+ );
3350
+ }
3351
+ }
3352
+ state.activeConfig.walletId = requestedWalletId;
3293
3353
  state.activeConfig.role =
3294
3354
  profile.role === "validator" || profile.role === "admin" || profile.role === "miner"
3295
3355
  ? profile.role
@@ -3522,9 +3582,14 @@ const satMiningPlugin = {
3522
3582
  );
3523
3583
  }
3524
3584
  if (options?.syncActiveCommit !== false && state.activeWalletAddress) {
3525
- await submitSatSetActiveCommit(state.activeConfig, {
3526
- lamports: state.activeConfig.commitLamports ?? 250_000_000,
3527
- }).catch(() => {});
3585
+ try {
3586
+ await submitSatSetActiveCommit(state.activeConfig, {
3587
+ lamports: state.activeConfig.commitLamports ?? 250_000_000,
3588
+ });
3589
+ } catch (error) {
3590
+ const detail = error instanceof Error ? error.message : String(error);
3591
+ throw new Error(`mining profile saved, but active commit was not confirmed: ${detail}`);
3592
+ }
3528
3593
  }
3529
3594
  return readProfile();
3530
3595
  };
@@ -5830,6 +5895,40 @@ const satMiningPlugin = {
5830
5895
  updatedAt: source.updatedAt,
5831
5896
  };
5832
5897
  };
5898
+ const uiMiningStatusPayload = (status: unknown) => {
5899
+ const source =
5900
+ status && typeof status === "object" && !Array.isArray(status)
5901
+ ? (status as Record<string, unknown>)
5902
+ : {};
5903
+ const {
5904
+ recentPlannerOutcomes: _recentPlannerOutcomes,
5905
+ plannerRegimeBuckets: _plannerRegimeBuckets,
5906
+ plannerTimeWindowStats: _plannerTimeWindowStats,
5907
+ deterministicBaseline: _deterministicBaseline,
5908
+ plannerPolicyContexts: _plannerPolicyContexts,
5909
+ plannerCapitalTierStats: _plannerCapitalTierStats,
5910
+ plannerLiveValidation: _plannerLiveValidation,
5911
+ recentCycleFeeBuckets: _recentCycleFeeBuckets,
5912
+ ...rest
5913
+ } = source;
5914
+ const settledHistory = Array.isArray(source.settledHistory) ? source.settledHistory : [];
5915
+ const recentActions = Array.isArray(source.recentActions) ? source.recentActions : [];
5916
+ const archivedFailures = Array.isArray(source.archivedFailures)
5917
+ ? source.archivedFailures
5918
+ : [];
5919
+ return {
5920
+ ...rest,
5921
+ mode: "ui",
5922
+ recentActions: recentActions.slice(0, 30),
5923
+ archivedFailures: archivedFailures.slice(0, 20),
5924
+ settledHistory: settledHistory.slice(0, 12),
5925
+ historyPage: {
5926
+ settledTotal: settledHistory.length,
5927
+ settledReturned: Math.min(settledHistory.length, 12),
5928
+ fullHistoryMethod: "sat.getMiningHistory",
5929
+ },
5930
+ };
5931
+ };
5833
5932
  const resolveMiningAuthorityOrThrow = async () => {
5834
5933
  const { wallet } = await ensureStartupWalletBinding({ requireResolvedWallet: true });
5835
5934
  const authority = wallet?.address?.trim();
@@ -7712,9 +7811,15 @@ const satMiningPlugin = {
7712
7811
  ? getMiningStatusResponsive({ forceFresh })
7713
7812
  : getMiningStatus({ includeTxReceipts: false, forceFresh })),
7714
7813
  )
7715
- : await (effectiveResponsive
7716
- ? getMiningStatusResponsive({ forceFresh })
7717
- : getMiningStatus({ includeTxReceipts, forceFresh })),
7814
+ : statusMode === "ui"
7815
+ ? uiMiningStatusPayload(
7816
+ await (effectiveResponsive
7817
+ ? getMiningStatusResponsive({ forceFresh })
7818
+ : getMiningStatus({ includeTxReceipts, forceFresh })),
7819
+ )
7820
+ : await (effectiveResponsive
7821
+ ? getMiningStatusResponsive({ forceFresh })
7822
+ : getMiningStatus({ includeTxReceipts, forceFresh })),
7718
7823
  ),
7719
7824
  );
7720
7825
  } catch (error) {
@@ -7988,8 +8093,12 @@ const satMiningPlugin = {
7988
8093
  typeof (params as { walletId?: string })?.walletId === "string"
7989
8094
  ? String((params as { walletId?: string }).walletId).trim()
7990
8095
  : undefined;
7991
- if (walletId && walletId !== resolveConfiguredWalletId()) {
7992
- await attachWallet(walletId);
8096
+ if (walletId) {
8097
+ if (walletId !== resolveConfiguredWalletId()) {
8098
+ await attachWallet(walletId);
8099
+ } else {
8100
+ await resolveMiningWalletSelection({ walletId, requireResolvedWallet: true });
8101
+ }
7993
8102
  }
7994
8103
  const { wallet: activeWallet } = await ensureStartupWalletBinding({
7995
8104
  requireResolvedWallet: true,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/sat-mining",
3
- "version": "0.1.48",
3
+ "version": "0.1.51",
4
4
  "private": true,
5
5
  "description": "SAT mining plugin scaffold for FasedAgent",
6
6
  "type": "module",
@@ -212,6 +212,9 @@ export type SatMiningRuntimeState = {
212
212
 
213
213
  const SAT_RATE_LIMIT_BASE_DELAY_MS = 60_000;
214
214
  const SAT_RATE_LIMIT_MAX_DELAY_MS = 5 * 60_000;
215
+ const SAT_RATE_LIMIT_CIRCUIT_BREAKER_DELAY_MS = 15 * 60_000;
216
+ const SAT_RATE_LIMIT_CIRCUIT_BREAKER_RETRY_COUNT = 8;
217
+ const SAT_RETRY_COUNT_MAX = 1_000;
215
218
  const SAT_CHAIN_TIME_FRESH_MS = 15_000;
216
219
  const SAT_CHAIN_TIME_STALE_MS = 60_000;
217
220
  const SAT_CLAIM_BATCH_DEFAULT_CYCLES = 5;
@@ -351,7 +354,7 @@ export function markWorkerFailure(
351
354
  ) {
352
355
  const entry = state.workers[worker];
353
356
  entry.running = false;
354
- entry.retryCount += 1;
357
+ entry.retryCount = Math.min(SAT_RETRY_COUNT_MAX, entry.retryCount + 1);
355
358
  entry.lastFailureAt = new Date().toISOString();
356
359
  entry.lastError = error instanceof Error ? error.message : String(error);
357
360
  entry.lastDetail = detail ?? entry.lastDetail;
@@ -442,6 +445,9 @@ export function isSatRateLimitedError(error: unknown): boolean {
442
445
 
443
446
  export function satRateLimitBackoffMs(retryCount: number): number {
444
447
  const normalizedRetryCount = Math.max(1, Math.floor(retryCount));
448
+ if (normalizedRetryCount >= SAT_RATE_LIMIT_CIRCUIT_BREAKER_RETRY_COUNT) {
449
+ return SAT_RATE_LIMIT_CIRCUIT_BREAKER_DELAY_MS;
450
+ }
445
451
  return Math.min(
446
452
  SAT_RATE_LIMIT_MAX_DELAY_MS,
447
453
  SAT_RATE_LIMIT_BASE_DELAY_MS * 2 ** Math.max(0, normalizedRetryCount - 1),
@@ -503,7 +509,7 @@ export function upsertSatClaimBacklogEntry(
503
509
  stage: patch.stage ?? existing?.stage ?? "pending",
504
510
  retryCount:
505
511
  typeof patch.retryCount === "number" && Number.isFinite(patch.retryCount)
506
- ? Math.max(0, Math.floor(patch.retryCount))
512
+ ? Math.min(SAT_RETRY_COUNT_MAX, Math.max(0, Math.floor(patch.retryCount)))
507
513
  : (existing?.retryCount ?? 0),
508
514
  firstSeenAt: existing?.firstSeenAt ?? now,
509
515
  lastUpdatedAt: patch.lastUpdatedAt ?? now,
@@ -567,7 +573,7 @@ export function markSatClaimBacklogFailure(
567
573
  const existing = state.claimBacklog.get(cycleId);
568
574
  upsertSatClaimBacklogEntry(state, cycleId, {
569
575
  stage: "failed",
570
- retryCount: (existing?.retryCount ?? 0) + 1,
576
+ retryCount: Math.min(SAT_RETRY_COUNT_MAX, (existing?.retryCount ?? 0) + 1),
571
577
  lastError: message,
572
578
  reason: "claim batch failed; retry will keep the same oldest cycles first",
573
579
  });
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/signal",
3
- "version": "0.1.48",
3
+ "version": "0.1.51",
4
4
  "private": true,
5
5
  "description": "FasedAgent Signal channel plugin",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/synology-chat",
3
- "version": "0.1.48",
3
+ "version": "0.1.51",
4
4
  "description": "Synology Chat channel plugin for FasedAgent",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/tlon",
3
- "version": "0.1.48",
3
+ "version": "0.1.51",
4
4
  "description": "FasedAgent Tlon/Urbit channel plugin",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.51
4
+
5
+ ### Changes
6
+
7
+ - Version alignment with core FasedAgent release numbers.
8
+
9
+ ## 0.1.50
10
+
11
+ ### Changes
12
+
13
+ - Version alignment with core FasedAgent release numbers.
14
+
15
+ ## 0.1.49
16
+
17
+ ### Changes
18
+
19
+ - Version alignment with core FasedAgent release numbers.
20
+
3
21
  ## 0.1.48
4
22
 
5
23
  ### Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fased/twitch",
3
- "version": "0.1.48",
3
+ "version": "0.1.51",
4
4
  "description": "FasedAgent Twitch channel plugin",
5
5
  "type": "module",
6
6
  "dependencies": {