@useorgx/openclaw-plugin 0.7.18 → 0.7.23

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 (161) hide show
  1. package/dashboard/dist/assets/9gFmK3Kr.js +1 -0
  2. package/dashboard/dist/assets/9gFmK3Kr.js.br +0 -0
  3. package/dashboard/dist/assets/9gFmK3Kr.js.gz +0 -0
  4. package/dashboard/dist/assets/{DS79hzMu.js → BrMXbzQ-.js} +2 -2
  5. package/dashboard/dist/assets/BrMXbzQ-.js.br +0 -0
  6. package/dashboard/dist/assets/BrMXbzQ-.js.gz +0 -0
  7. package/dashboard/dist/assets/By0MIBj_.js +1 -0
  8. package/dashboard/dist/assets/By0MIBj_.js.br +0 -0
  9. package/dashboard/dist/assets/By0MIBj_.js.gz +0 -0
  10. package/dashboard/dist/assets/C1u2SGin.css +1 -0
  11. package/dashboard/dist/assets/C1u2SGin.css.br +0 -0
  12. package/dashboard/dist/assets/C1u2SGin.css.gz +0 -0
  13. package/dashboard/dist/assets/{467jKHFJ.js → CGJiHCIx.js} +1 -1
  14. package/dashboard/dist/assets/CGJiHCIx.js.br +0 -0
  15. package/dashboard/dist/assets/CGJiHCIx.js.gz +0 -0
  16. package/dashboard/dist/assets/CSd4rSuU.js +212 -0
  17. package/dashboard/dist/assets/CSd4rSuU.js.br +0 -0
  18. package/dashboard/dist/assets/CSd4rSuU.js.gz +0 -0
  19. package/dashboard/dist/assets/{5Ihga-4X.js → CZXS5i_5.js} +1 -1
  20. package/dashboard/dist/assets/CZXS5i_5.js.br +0 -0
  21. package/dashboard/dist/assets/CZXS5i_5.js.gz +0 -0
  22. package/dashboard/dist/assets/{a6qcPiWt.js → CbVWL74-.js} +1 -1
  23. package/dashboard/dist/assets/CbVWL74-.js.br +0 -0
  24. package/dashboard/dist/assets/CbVWL74-.js.gz +0 -0
  25. package/dashboard/dist/assets/{qDJ6rqcs.js → D-FuHfT8.js} +1 -1
  26. package/dashboard/dist/assets/D-FuHfT8.js.br +0 -0
  27. package/dashboard/dist/assets/D-FuHfT8.js.gz +0 -0
  28. package/dashboard/dist/assets/{BcJmNILk.js → D0PN5_vY.js} +1 -1
  29. package/dashboard/dist/assets/D0PN5_vY.js.br +0 -0
  30. package/dashboard/dist/assets/D0PN5_vY.js.gz +0 -0
  31. package/dashboard/dist/assets/DDCPrZRt.js +1 -0
  32. package/dashboard/dist/assets/DDCPrZRt.js.br +0 -0
  33. package/dashboard/dist/assets/DDCPrZRt.js.gz +0 -0
  34. package/dashboard/dist/assets/{B71dt9yu.js → DNQ-iFO2.js} +1 -1
  35. package/dashboard/dist/assets/DNQ-iFO2.js.br +0 -0
  36. package/dashboard/dist/assets/DNQ-iFO2.js.gz +0 -0
  37. package/dashboard/dist/assets/{PVi0vr9a.js → DhPuHPK7.js} +1 -1
  38. package/dashboard/dist/assets/DhPuHPK7.js.br +0 -0
  39. package/dashboard/dist/assets/DhPuHPK7.js.gz +0 -0
  40. package/dashboard/dist/assets/Dhz7qPtn.js +1 -0
  41. package/dashboard/dist/assets/Dhz7qPtn.js.br +0 -0
  42. package/dashboard/dist/assets/Dhz7qPtn.js.gz +0 -0
  43. package/dashboard/dist/assets/LOFrVoPD.js +1 -0
  44. package/dashboard/dist/assets/LOFrVoPD.js.br +0 -0
  45. package/dashboard/dist/assets/LOFrVoPD.js.gz +0 -0
  46. package/dashboard/dist/assets/OlLPtzdz.js +1 -0
  47. package/dashboard/dist/assets/OlLPtzdz.js.br +0 -0
  48. package/dashboard/dist/assets/OlLPtzdz.js.gz +0 -0
  49. package/dashboard/dist/assets/{sdoPH_Z1.js → RN4M9u9W.js} +2 -2
  50. package/dashboard/dist/assets/RN4M9u9W.js.br +0 -0
  51. package/dashboard/dist/assets/RN4M9u9W.js.gz +0 -0
  52. package/dashboard/dist/assets/VCHu272d.js +1 -0
  53. package/dashboard/dist/assets/VCHu272d.js.br +0 -0
  54. package/dashboard/dist/assets/VCHu272d.js.gz +0 -0
  55. package/dashboard/dist/assets/m2smti3F.js +1 -0
  56. package/dashboard/dist/assets/m2smti3F.js.br +0 -0
  57. package/dashboard/dist/assets/m2smti3F.js.gz +0 -0
  58. package/dashboard/dist/assets/{C3_j_W9V.js → nra1yvJX.js} +1 -1
  59. package/dashboard/dist/assets/nra1yvJX.js.br +0 -0
  60. package/dashboard/dist/assets/nra1yvJX.js.gz +0 -0
  61. package/dashboard/dist/assets/qLX6NZ-J.js +1 -0
  62. package/dashboard/dist/assets/qLX6NZ-J.js.br +0 -0
  63. package/dashboard/dist/assets/qLX6NZ-J.js.gz +0 -0
  64. package/dashboard/dist/index.html +2 -2
  65. package/dashboard/dist/index.html.br +0 -0
  66. package/dashboard/dist/index.html.gz +0 -0
  67. package/dist/agent-run-store.js +162 -24
  68. package/dist/cli/orgx.d.ts +3 -0
  69. package/dist/config/resolution.d.ts +7 -0
  70. package/dist/config/resolution.js +13 -5
  71. package/dist/contracts/onboarding-state.d.ts +2 -0
  72. package/dist/contracts/onboarding-state.js +23 -0
  73. package/dist/contracts/shared-types.d.ts +17 -0
  74. package/dist/http/helpers/auto-continue-engine.d.ts +62 -0
  75. package/dist/http/helpers/auto-continue-engine.js +329 -53
  76. package/dist/http/helpers/autopilot-runtime.js +5 -1
  77. package/dist/http/helpers/autopilot-slice-utils.js +25 -1
  78. package/dist/http/helpers/decision-mapper.d.ts +1 -0
  79. package/dist/http/helpers/decision-mapper.js +19 -2
  80. package/dist/http/helpers/dispatch-lifecycle.js +3 -0
  81. package/dist/http/helpers/mission-control.d.ts +1 -0
  82. package/dist/http/helpers/mission-control.js +5 -2
  83. package/dist/http/helpers/slice-run-projections.d.ts +27 -0
  84. package/dist/http/helpers/slice-run-projections.js +198 -10
  85. package/dist/http/helpers/triage-mapper.js +220 -6
  86. package/dist/http/index.d.ts +1 -0
  87. package/dist/http/index.js +94 -46
  88. package/dist/http/router.js +64 -9
  89. package/dist/http/routes/live-legacy.d.ts +19 -2
  90. package/dist/http/routes/live-legacy.js +110 -27
  91. package/dist/http/routes/live-snapshot.d.ts +16 -2
  92. package/dist/http/routes/live-snapshot.js +169 -25
  93. package/dist/http/routes/mission-control-actions.js +28 -0
  94. package/dist/http/routes/mission-control-read.d.ts +18 -0
  95. package/dist/http/routes/mission-control-read.js +130 -218
  96. package/dist/http/routes/onboarding.d.ts +1 -0
  97. package/dist/http/routes/onboarding.js +17 -0
  98. package/dist/index.d.ts +5 -0
  99. package/dist/index.js +199 -123
  100. package/dist/outbox.d.ts +0 -2
  101. package/dist/outbox.js +268 -150
  102. package/dist/reporting/rollups.js +18 -11
  103. package/dist/runtime-instance-store.js +212 -58
  104. package/dist/stores/materialized-snapshot-store.d.ts +18 -0
  105. package/dist/stores/materialized-snapshot-store.js +91 -0
  106. package/dist/stores/sqlite-state.d.ts +6 -0
  107. package/dist/stores/sqlite-state.js +179 -0
  108. package/package.json +6 -1
  109. package/dashboard/dist/assets/467jKHFJ.js.br +0 -0
  110. package/dashboard/dist/assets/467jKHFJ.js.gz +0 -0
  111. package/dashboard/dist/assets/5Ihga-4X.js.br +0 -0
  112. package/dashboard/dist/assets/5Ihga-4X.js.gz +0 -0
  113. package/dashboard/dist/assets/B71dt9yu.js.br +0 -0
  114. package/dashboard/dist/assets/B71dt9yu.js.gz +0 -0
  115. package/dashboard/dist/assets/BCudUvwg.js +0 -1
  116. package/dashboard/dist/assets/BCudUvwg.js.br +0 -0
  117. package/dashboard/dist/assets/BCudUvwg.js.gz +0 -0
  118. package/dashboard/dist/assets/BEnI6kNR.js +0 -1
  119. package/dashboard/dist/assets/BEnI6kNR.js.br +0 -0
  120. package/dashboard/dist/assets/BEnI6kNR.js.gz +0 -0
  121. package/dashboard/dist/assets/BcJmNILk.js.br +0 -0
  122. package/dashboard/dist/assets/BcJmNILk.js.gz +0 -0
  123. package/dashboard/dist/assets/C-MOJWHs.js +0 -1
  124. package/dashboard/dist/assets/C-MOJWHs.js.br +0 -0
  125. package/dashboard/dist/assets/C-MOJWHs.js.gz +0 -0
  126. package/dashboard/dist/assets/C-XuWXGi.js +0 -1
  127. package/dashboard/dist/assets/C-XuWXGi.js.br +0 -0
  128. package/dashboard/dist/assets/C-XuWXGi.js.gz +0 -0
  129. package/dashboard/dist/assets/C3_j_W9V.js.br +0 -0
  130. package/dashboard/dist/assets/C3_j_W9V.js.gz +0 -0
  131. package/dashboard/dist/assets/C9-UYhBb.js +0 -1
  132. package/dashboard/dist/assets/C9-UYhBb.js.br +0 -0
  133. package/dashboard/dist/assets/C9-UYhBb.js.gz +0 -0
  134. package/dashboard/dist/assets/C9yV06GS.js +0 -1
  135. package/dashboard/dist/assets/C9yV06GS.js.br +0 -0
  136. package/dashboard/dist/assets/C9yV06GS.js.gz +0 -0
  137. package/dashboard/dist/assets/CReugbyT.js +0 -1
  138. package/dashboard/dist/assets/CReugbyT.js.br +0 -0
  139. package/dashboard/dist/assets/CReugbyT.js.gz +0 -0
  140. package/dashboard/dist/assets/CSDhTbKy.js +0 -1
  141. package/dashboard/dist/assets/CSDhTbKy.js.br +0 -0
  142. package/dashboard/dist/assets/CSDhTbKy.js.gz +0 -0
  143. package/dashboard/dist/assets/CfMS9yIf.js +0 -1
  144. package/dashboard/dist/assets/CfMS9yIf.js.br +0 -0
  145. package/dashboard/dist/assets/CfMS9yIf.js.gz +0 -0
  146. package/dashboard/dist/assets/D2Kqcmv9.js +0 -212
  147. package/dashboard/dist/assets/D2Kqcmv9.js.br +0 -0
  148. package/dashboard/dist/assets/D2Kqcmv9.js.gz +0 -0
  149. package/dashboard/dist/assets/DS79hzMu.js.br +0 -0
  150. package/dashboard/dist/assets/DS79hzMu.js.gz +0 -0
  151. package/dashboard/dist/assets/PVi0vr9a.js.br +0 -0
  152. package/dashboard/dist/assets/PVi0vr9a.js.gz +0 -0
  153. package/dashboard/dist/assets/RZkbqlJk.css +0 -1
  154. package/dashboard/dist/assets/RZkbqlJk.css.br +0 -0
  155. package/dashboard/dist/assets/RZkbqlJk.css.gz +0 -0
  156. package/dashboard/dist/assets/a6qcPiWt.js.br +0 -0
  157. package/dashboard/dist/assets/a6qcPiWt.js.gz +0 -0
  158. package/dashboard/dist/assets/qDJ6rqcs.js.br +0 -0
  159. package/dashboard/dist/assets/qDJ6rqcs.js.gz +0 -0
  160. package/dashboard/dist/assets/sdoPH_Z1.js.br +0 -0
  161. package/dashboard/dist/assets/sdoPH_Z1.js.gz +0 -0
package/dist/index.js CHANGED
@@ -219,7 +219,7 @@ export default function register(api) {
219
219
  // best effort
220
220
  });
221
221
  if (!config.apiKey) {
222
- api.log?.warn?.("[orgx] No API key. Set plugins.entries.orgx.config.apiKey, ORGX_API_KEY env, or ~/Code/orgx/orgx/.env.local");
222
+ api.log?.warn?.("[orgx] No API key. Set plugins.entries.openclaw-plugin.config.apiKey (or plugins.entries.orgx.config.apiKey for legacy setups), ORGX_API_KEY env, or ~/Code/orgx/orgx/.env.local");
223
223
  }
224
224
  hydrateCachedSnapshot();
225
225
  const client = new OrgXClient(config.apiKey, config.baseUrl, config.userId);
@@ -381,7 +381,11 @@ export default function register(api) {
381
381
  // ---------------------------------------------------------------------------
382
382
  let syncTimer = null;
383
383
  let syncInFlight = null;
384
+ let backgroundSyncInFlight = null;
385
+ let backgroundSyncQueued = false;
384
386
  let syncServiceRunning = false;
387
+ let lastBackgroundSyncAt = 0;
388
+ let lastBackgroundSyncError = null;
385
389
  let localAgentMirrors = [];
386
390
  let outboxReplayState = {
387
391
  status: "idle",
@@ -513,7 +517,10 @@ export default function register(api) {
513
517
  sync: {
514
518
  serviceRunning: syncServiceRunning,
515
519
  inFlight: syncInFlight !== null,
520
+ backgroundInFlight: backgroundSyncInFlight !== null,
516
521
  lastSnapshotAt: lastSnapshotAt > 0 ? new Date(lastSnapshotAt).toISOString() : null,
522
+ lastBackgroundSyncAt: lastBackgroundSyncAt > 0 ? new Date(lastBackgroundSyncAt).toISOString() : null,
523
+ lastBackgroundSyncError,
517
524
  },
518
525
  outbox: {
519
526
  pendingTotal: outbox.pendingTotal,
@@ -867,6 +874,158 @@ export default function register(api) {
867
874
  outboxReplayState = next;
868
875
  },
869
876
  });
877
+ async function syncSnapshotAndLocalTelemetry() {
878
+ let snapshotError = null;
879
+ try {
880
+ const snapshot = await client.getOrgSnapshot();
881
+ updateCachedSnapshot(snapshot);
882
+ localAgentMirrors = buildLocalAgentMirrorsFromSnapshot({
883
+ agents: snapshot.agents,
884
+ });
885
+ }
886
+ catch (err) {
887
+ if (isAuthFailure(err)) {
888
+ throw err;
889
+ }
890
+ snapshotError = toErrorMessage(err);
891
+ api.log?.warn?.("[orgx] Snapshot sync failed (continuing)", {
892
+ error: snapshotError,
893
+ });
894
+ }
895
+ const localAgents = buildLocalSyncAgentsFromRuns({
896
+ ...readAgentRuns(),
897
+ mirrors: localAgentMirrors,
898
+ });
899
+ if (localAgents.length > 0) {
900
+ try {
901
+ await client.syncMemory({ agents: localAgents });
902
+ }
903
+ catch (err) {
904
+ if (isAuthFailure(err)) {
905
+ throw err;
906
+ }
907
+ api.log?.warn?.("[orgx] Local agent telemetry sync failed (continuing)", {
908
+ error: toErrorMessage(err),
909
+ count: localAgents.length,
910
+ });
911
+ }
912
+ }
913
+ return { snapshotError };
914
+ }
915
+ async function refreshSkillPackCache() {
916
+ try {
917
+ const refreshed = await refreshSkillPackState({
918
+ getSkillPack: (args) => client.getSkillPack(args),
919
+ });
920
+ if (refreshed.changed) {
921
+ void posthogCapture({
922
+ event: "openclaw_skill_pack_updated",
923
+ distinctId: config.installationId,
924
+ properties: {
925
+ plugin_version: config.pluginVersion,
926
+ skill_pack_name: refreshed.state.pack?.name ?? null,
927
+ skill_pack_version: refreshed.state.pack?.version ?? null,
928
+ skill_pack_checksum: refreshed.state.pack?.checksum ?? null,
929
+ },
930
+ }).catch(() => {
931
+ // best effort
932
+ });
933
+ }
934
+ }
935
+ catch {
936
+ // best effort
937
+ }
938
+ }
939
+ function maybeAutoInstallAgentSuite() {
940
+ try {
941
+ if (config.autoInstallAgentSuiteOnConnect === false) {
942
+ return;
943
+ }
944
+ const state = readSkillPackState();
945
+ const updateAvailable = Boolean(state.remote?.checksum &&
946
+ state.pack?.checksum &&
947
+ state.remote.checksum !== state.pack.checksum);
948
+ const plan = computeOrgxAgentSuitePlan({
949
+ packVersion: config.pluginVersion || "0.0.0",
950
+ skillPack: state.overrides,
951
+ skillPackRemote: state.remote,
952
+ skillPackPolicy: state.policy,
953
+ skillPackUpdateAvailable: updateAvailable,
954
+ });
955
+ const hasConflicts = (plan.workspaceFiles ?? []).some((f) => f.action === "conflict");
956
+ const hasWork = Boolean(plan.openclawConfigWouldUpdate) ||
957
+ (plan.workspaceFiles ?? []).some((f) => f.action !== "noop");
958
+ if (!hasWork || hasConflicts) {
959
+ return;
960
+ }
961
+ const applied = applyOrgxAgentSuitePlan({
962
+ plan,
963
+ dryRun: false,
964
+ skillPack: state.overrides,
965
+ });
966
+ void applied;
967
+ void posthogCapture({
968
+ event: "openclaw_agent_suite_auto_install",
969
+ distinctId: config.installationId,
970
+ properties: {
971
+ plugin_version: (config.pluginVersion ?? "").trim() || null,
972
+ skill_pack_source: plan.skillPack?.source ?? null,
973
+ skill_pack_checksum: plan.skillPack?.checksum ?? null,
974
+ skill_pack_version: plan.skillPack?.version ?? null,
975
+ openclaw_config_updated: Boolean(plan.openclawConfigWouldUpdate),
976
+ },
977
+ }).catch(() => {
978
+ // best effort
979
+ });
980
+ }
981
+ catch (err) {
982
+ api.log?.debug?.("[orgx] Agent suite auto-provision skipped/failed (best effort)", {
983
+ error: err instanceof Error ? err.message : String(err),
984
+ });
985
+ }
986
+ }
987
+ async function runCriticalSyncPass() {
988
+ const { snapshotError } = await syncSnapshotAndLocalTelemetry();
989
+ updateOnboardingState({
990
+ status: "connected",
991
+ hasApiKey: true,
992
+ connectionVerified: snapshotError === null,
993
+ lastError: snapshotError,
994
+ nextAction: "open_dashboard",
995
+ });
996
+ await flushOutboxQueues();
997
+ }
998
+ async function runBackgroundSyncPass() {
999
+ await reconcileStoppedAgentRuns();
1000
+ await refreshSkillPackCache();
1001
+ maybeAutoInstallAgentSuite();
1002
+ }
1003
+ function scheduleBackgroundSyncPass() {
1004
+ if (!config.apiKey)
1005
+ return;
1006
+ if (backgroundSyncInFlight) {
1007
+ backgroundSyncQueued = true;
1008
+ return;
1009
+ }
1010
+ backgroundSyncInFlight = (async () => {
1011
+ do {
1012
+ backgroundSyncQueued = false;
1013
+ try {
1014
+ await runBackgroundSyncPass();
1015
+ lastBackgroundSyncAt = Date.now();
1016
+ lastBackgroundSyncError = null;
1017
+ }
1018
+ catch (err) {
1019
+ lastBackgroundSyncError = toErrorMessage(err);
1020
+ api.log?.warn?.("[orgx] Background sync tasks failed (continuing)", {
1021
+ error: lastBackgroundSyncError,
1022
+ });
1023
+ }
1024
+ } while (backgroundSyncQueued && Boolean(config.apiKey));
1025
+ })().finally(() => {
1026
+ backgroundSyncInFlight = null;
1027
+ });
1028
+ }
870
1029
  async function doSync() {
871
1030
  if (syncInFlight) {
872
1031
  return syncInFlight;
@@ -885,120 +1044,8 @@ export default function register(api) {
885
1044
  return;
886
1045
  }
887
1046
  try {
888
- await reconcileStoppedAgentRuns();
889
- let snapshotError = null;
890
- try {
891
- const snapshot = await client.getOrgSnapshot();
892
- updateCachedSnapshot(snapshot);
893
- localAgentMirrors = buildLocalAgentMirrorsFromSnapshot({
894
- agents: snapshot.agents,
895
- });
896
- }
897
- catch (err) {
898
- if (isAuthFailure(err)) {
899
- throw err;
900
- }
901
- snapshotError = toErrorMessage(err);
902
- api.log?.warn?.("[orgx] Snapshot sync failed (continuing)", {
903
- error: snapshotError,
904
- });
905
- }
906
- const localAgents = buildLocalSyncAgentsFromRuns({
907
- ...readAgentRuns(),
908
- mirrors: localAgentMirrors,
909
- });
910
- if (localAgents.length > 0) {
911
- try {
912
- await client.syncMemory({ agents: localAgents });
913
- }
914
- catch (err) {
915
- if (isAuthFailure(err)) {
916
- throw err;
917
- }
918
- api.log?.warn?.("[orgx] Local agent telemetry sync failed (continuing)", {
919
- error: toErrorMessage(err),
920
- count: localAgents.length,
921
- });
922
- }
923
- }
924
- // Best-effort: poll the canonical OrgX SkillPack so the dashboard/install path
925
- // can apply it without blocking on an on-demand fetch.
926
- try {
927
- const refreshed = await refreshSkillPackState({
928
- getSkillPack: (args) => client.getSkillPack(args),
929
- });
930
- if (refreshed.changed) {
931
- void posthogCapture({
932
- event: "openclaw_skill_pack_updated",
933
- distinctId: config.installationId,
934
- properties: {
935
- plugin_version: config.pluginVersion,
936
- skill_pack_name: refreshed.state.pack?.name ?? null,
937
- skill_pack_version: refreshed.state.pack?.version ?? null,
938
- skill_pack_checksum: refreshed.state.pack?.checksum ?? null,
939
- },
940
- }).catch(() => {
941
- // best effort
942
- });
943
- }
944
- }
945
- catch {
946
- // best effort
947
- }
948
- // Best-effort: provision/update the OrgX agent suite after we've verified a working connection.
949
- // This makes domain agents available immediately for launches without requiring a manual install.
950
- try {
951
- if (config.autoInstallAgentSuiteOnConnect !== false) {
952
- const state = readSkillPackState();
953
- const updateAvailable = Boolean(state.remote?.checksum &&
954
- state.pack?.checksum &&
955
- state.remote.checksum !== state.pack.checksum);
956
- const plan = computeOrgxAgentSuitePlan({
957
- packVersion: config.pluginVersion || "0.0.0",
958
- skillPack: state.overrides,
959
- skillPackRemote: state.remote,
960
- skillPackPolicy: state.policy,
961
- skillPackUpdateAvailable: updateAvailable,
962
- });
963
- const hasConflicts = (plan.workspaceFiles ?? []).some((f) => f.action === "conflict");
964
- const hasWork = Boolean(plan.openclawConfigWouldUpdate) ||
965
- (plan.workspaceFiles ?? []).some((f) => f.action !== "noop");
966
- if (hasWork && !hasConflicts) {
967
- const applied = applyOrgxAgentSuitePlan({
968
- plan,
969
- dryRun: false,
970
- skillPack: state.overrides,
971
- });
972
- void applied;
973
- void posthogCapture({
974
- event: "openclaw_agent_suite_auto_install",
975
- distinctId: config.installationId,
976
- properties: {
977
- plugin_version: (config.pluginVersion ?? "").trim() || null,
978
- skill_pack_source: plan.skillPack?.source ?? null,
979
- skill_pack_checksum: plan.skillPack?.checksum ?? null,
980
- skill_pack_version: plan.skillPack?.version ?? null,
981
- openclaw_config_updated: Boolean(plan.openclawConfigWouldUpdate),
982
- },
983
- }).catch(() => {
984
- // best effort
985
- });
986
- }
987
- }
988
- }
989
- catch (err) {
990
- api.log?.debug?.("[orgx] Agent suite auto-provision skipped/failed (best effort)", {
991
- error: err instanceof Error ? err.message : String(err),
992
- });
993
- }
994
- updateOnboardingState({
995
- status: "connected",
996
- hasApiKey: true,
997
- connectionVerified: snapshotError === null,
998
- lastError: snapshotError,
999
- nextAction: "open_dashboard",
1000
- });
1001
- await flushOutboxQueues();
1047
+ await runCriticalSyncPass();
1048
+ scheduleBackgroundSyncPass();
1002
1049
  api.log?.debug?.("[orgx] Sync OK");
1003
1050
  }
1004
1051
  catch (err) {
@@ -1042,6 +1089,7 @@ export default function register(api) {
1042
1089
  await doSync();
1043
1090
  scheduleNextSync();
1044
1091
  }, config.syncIntervalMs);
1092
+ syncTimer.unref?.();
1045
1093
  }
1046
1094
  async function startPairing(input) {
1047
1095
  updateOnboardingState({
@@ -1136,11 +1184,12 @@ export default function register(api) {
1136
1184
  pollIntervalMs: started.data.pollIntervalMs,
1137
1185
  };
1138
1186
  const state = updateOnboardingState({
1139
- status: "awaiting_browser_auth",
1140
- hasApiKey: false,
1141
- connectionVerified: false,
1187
+ status: config.apiKey ? "connected" : "awaiting_browser_auth",
1188
+ hasApiKey: Boolean(config.apiKey),
1189
+ connectionVerified: Boolean(config.apiKey),
1190
+ workspaceName: onboardingState.workspaceName,
1142
1191
  lastError: null,
1143
- nextAction: "wait_for_browser",
1192
+ nextAction: config.apiKey ? "reconnect" : "wait_for_browser",
1144
1193
  connectUrl: started.data.connectUrl,
1145
1194
  pairingId: started.data.pairingId,
1146
1195
  expiresAt: started.data.expiresAt,
@@ -1171,11 +1220,16 @@ export default function register(api) {
1171
1220
  const status = polled.data.status;
1172
1221
  if (status === "pending" || status === "authorized") {
1173
1222
  return updateOnboardingState({
1174
- status: "pairing",
1175
- hasApiKey: false,
1176
- connectionVerified: false,
1223
+ status: config.apiKey ? "connected" : "pairing",
1224
+ hasApiKey: Boolean(config.apiKey),
1225
+ connectionVerified: Boolean(config.apiKey),
1226
+ workspaceName: onboardingState.workspaceName,
1177
1227
  lastError: null,
1178
- nextAction: "wait_for_browser",
1228
+ nextAction: config.apiKey ? "reconnect" : "wait_for_browser",
1229
+ connectUrl: activePairing.connectUrl,
1230
+ pairingId: activePairing.pairingId,
1231
+ expiresAt: activePairing.expiresAt,
1232
+ pollIntervalMs: activePairing.pollIntervalMs,
1179
1233
  });
1180
1234
  }
1181
1235
  if (status === "ready") {
@@ -1236,6 +1290,24 @@ export default function register(api) {
1236
1290
  nextAction: "retry",
1237
1291
  });
1238
1292
  }
1293
+ async function cancelPairingOnboarding() {
1294
+ if (!activePairing) {
1295
+ return { ...onboardingState };
1296
+ }
1297
+ await fetchOrgxJson("POST", `/api/plugin/openclaw/pairings/${encodeURIComponent(activePairing.pairingId)}/cancel`, {
1298
+ pollToken: activePairing.pollToken,
1299
+ reason: "user_cancelled",
1300
+ });
1301
+ clearPairingState();
1302
+ return updateOnboardingState({
1303
+ status: config.apiKey ? "connected" : "idle",
1304
+ hasApiKey: Boolean(config.apiKey),
1305
+ connectionVerified: Boolean(config.apiKey),
1306
+ workspaceName: onboardingState.workspaceName,
1307
+ lastError: null,
1308
+ nextAction: config.apiKey ? "open_dashboard" : "connect",
1309
+ });
1310
+ }
1239
1311
  async function submitManualKey(input) {
1240
1312
  const nextKey = input.apiKey.trim();
1241
1313
  if (!nextKey) {
@@ -1281,6 +1353,9 @@ export default function register(api) {
1281
1353
  client.setCredentials({ apiKey: "", userId: "" });
1282
1354
  cachedSnapshot = null;
1283
1355
  lastSnapshotAt = 0;
1356
+ lastBackgroundSyncAt = 0;
1357
+ lastBackgroundSyncError = null;
1358
+ backgroundSyncQueued = false;
1284
1359
  return updateOnboardingState({
1285
1360
  status: "idle",
1286
1361
  hasApiKey: false,
@@ -1394,6 +1469,7 @@ export default function register(api) {
1394
1469
  startPairing,
1395
1470
  getStatus: getPairingStatus,
1396
1471
  submitManualKey,
1472
+ cancelPairing: cancelPairingOnboarding,
1397
1473
  disconnect: disconnectOnboarding,
1398
1474
  }, {
1399
1475
  getHealth: async (input = {}) => buildHealthReport({ probeRemote: input.probeRemote === true }),
package/dist/outbox.d.ts CHANGED
@@ -9,9 +9,7 @@ export interface OutboxEvent {
9
9
  type: "progress" | "decision" | "artifact" | "changeset" | "retro" | "outcome";
10
10
  timestamp: string;
11
11
  payload: Record<string, unknown>;
12
- /** Converted to a LiveActivityItem for dashboard display. */
13
12
  activityItem: LiveActivityItem;
14
- /** Internal replay diagnostics for bounded retry/dead-letter handling. */
15
13
  replayFailures?: number;
16
14
  lastReplayError?: string | null;
17
15
  lastReplayAt?: string | null;