@useorgx/openclaw-plugin 0.7.20 → 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.
- package/dashboard/dist/assets/9gFmK3Kr.js +1 -0
- package/dashboard/dist/assets/9gFmK3Kr.js.br +0 -0
- package/dashboard/dist/assets/9gFmK3Kr.js.gz +0 -0
- package/dashboard/dist/assets/{BoDhb8_y.js → BrMXbzQ-.js} +2 -2
- package/dashboard/dist/assets/BrMXbzQ-.js.br +0 -0
- package/dashboard/dist/assets/BrMXbzQ-.js.gz +0 -0
- package/dashboard/dist/assets/By0MIBj_.js +1 -0
- package/dashboard/dist/assets/By0MIBj_.js.br +0 -0
- package/dashboard/dist/assets/By0MIBj_.js.gz +0 -0
- package/dashboard/dist/assets/C1u2SGin.css +1 -0
- package/dashboard/dist/assets/C1u2SGin.css.br +0 -0
- package/dashboard/dist/assets/C1u2SGin.css.gz +0 -0
- package/dashboard/dist/assets/{DAr4MfFk.js → CGJiHCIx.js} +1 -1
- package/dashboard/dist/assets/CGJiHCIx.js.br +0 -0
- package/dashboard/dist/assets/CGJiHCIx.js.gz +0 -0
- package/dashboard/dist/assets/CSd4rSuU.js +212 -0
- package/dashboard/dist/assets/CSd4rSuU.js.br +0 -0
- package/dashboard/dist/assets/CSd4rSuU.js.gz +0 -0
- package/dashboard/dist/assets/{DibzNd0I.js → CZXS5i_5.js} +1 -1
- package/dashboard/dist/assets/CZXS5i_5.js.br +0 -0
- package/dashboard/dist/assets/CZXS5i_5.js.gz +0 -0
- package/dashboard/dist/assets/{wa4jJQK9.js → CbVWL74-.js} +1 -1
- package/dashboard/dist/assets/CbVWL74-.js.br +0 -0
- package/dashboard/dist/assets/CbVWL74-.js.gz +0 -0
- package/dashboard/dist/assets/{Dm0CfDGr.js → D-FuHfT8.js} +1 -1
- package/dashboard/dist/assets/D-FuHfT8.js.br +0 -0
- package/dashboard/dist/assets/D-FuHfT8.js.gz +0 -0
- package/dashboard/dist/assets/{DXVs61e1.js → D0PN5_vY.js} +1 -1
- package/dashboard/dist/assets/D0PN5_vY.js.br +0 -0
- package/dashboard/dist/assets/D0PN5_vY.js.gz +0 -0
- package/dashboard/dist/assets/{_zpQCpjm.js → DDCPrZRt.js} +1 -1
- package/dashboard/dist/assets/DDCPrZRt.js.br +0 -0
- package/dashboard/dist/assets/DDCPrZRt.js.gz +0 -0
- package/dashboard/dist/assets/{BYb6DARX.js → DNQ-iFO2.js} +1 -1
- package/dashboard/dist/assets/DNQ-iFO2.js.br +0 -0
- package/dashboard/dist/assets/DNQ-iFO2.js.gz +0 -0
- package/dashboard/dist/assets/{BGY6oI8h.js → DhPuHPK7.js} +1 -1
- package/dashboard/dist/assets/DhPuHPK7.js.br +0 -0
- package/dashboard/dist/assets/DhPuHPK7.js.gz +0 -0
- package/dashboard/dist/assets/Dhz7qPtn.js +1 -0
- package/dashboard/dist/assets/Dhz7qPtn.js.br +0 -0
- package/dashboard/dist/assets/Dhz7qPtn.js.gz +0 -0
- package/dashboard/dist/assets/LOFrVoPD.js +1 -0
- package/dashboard/dist/assets/LOFrVoPD.js.br +0 -0
- package/dashboard/dist/assets/LOFrVoPD.js.gz +0 -0
- package/dashboard/dist/assets/OlLPtzdz.js +1 -0
- package/dashboard/dist/assets/OlLPtzdz.js.br +0 -0
- package/dashboard/dist/assets/OlLPtzdz.js.gz +0 -0
- package/dashboard/dist/assets/{B014hrCe.js → RN4M9u9W.js} +2 -2
- package/dashboard/dist/assets/RN4M9u9W.js.br +0 -0
- package/dashboard/dist/assets/RN4M9u9W.js.gz +0 -0
- package/dashboard/dist/assets/VCHu272d.js +1 -0
- package/dashboard/dist/assets/VCHu272d.js.br +0 -0
- package/dashboard/dist/assets/VCHu272d.js.gz +0 -0
- package/dashboard/dist/assets/m2smti3F.js +1 -0
- package/dashboard/dist/assets/m2smti3F.js.br +0 -0
- package/dashboard/dist/assets/m2smti3F.js.gz +0 -0
- package/dashboard/dist/assets/{CV0sWMbv.js → nra1yvJX.js} +1 -1
- package/dashboard/dist/assets/nra1yvJX.js.br +0 -0
- package/dashboard/dist/assets/nra1yvJX.js.gz +0 -0
- package/dashboard/dist/assets/qLX6NZ-J.js +1 -0
- package/dashboard/dist/assets/qLX6NZ-J.js.br +0 -0
- package/dashboard/dist/assets/qLX6NZ-J.js.gz +0 -0
- package/dashboard/dist/index.html +2 -2
- package/dashboard/dist/index.html.br +0 -0
- package/dashboard/dist/index.html.gz +0 -0
- package/dist/agent-run-store.js +162 -24
- package/dist/cli/orgx.d.ts +3 -0
- package/dist/config/resolution.d.ts +7 -0
- package/dist/config/resolution.js +13 -5
- package/dist/contracts/onboarding-state.d.ts +2 -0
- package/dist/contracts/onboarding-state.js +23 -0
- package/dist/contracts/shared-types.d.ts +17 -0
- package/dist/http/helpers/auto-continue-engine.d.ts +23 -0
- package/dist/http/helpers/auto-continue-engine.js +233 -53
- package/dist/http/helpers/autopilot-runtime.js +5 -1
- package/dist/http/helpers/autopilot-slice-utils.js +25 -1
- package/dist/http/helpers/decision-mapper.d.ts +1 -0
- package/dist/http/helpers/decision-mapper.js +19 -2
- package/dist/http/helpers/dispatch-lifecycle.js +3 -0
- package/dist/http/helpers/mission-control.d.ts +1 -0
- package/dist/http/helpers/mission-control.js +5 -2
- package/dist/http/helpers/slice-run-projections.d.ts +27 -0
- package/dist/http/helpers/slice-run-projections.js +198 -10
- package/dist/http/helpers/triage-mapper.js +220 -6
- package/dist/http/index.d.ts +1 -0
- package/dist/http/index.js +92 -45
- package/dist/http/router.js +64 -9
- package/dist/http/routes/live-legacy.d.ts +19 -2
- package/dist/http/routes/live-legacy.js +110 -27
- package/dist/http/routes/live-snapshot.d.ts +16 -2
- package/dist/http/routes/live-snapshot.js +169 -25
- package/dist/http/routes/mission-control-actions.js +28 -0
- package/dist/http/routes/mission-control-read.d.ts +4 -0
- package/dist/http/routes/mission-control-read.js +67 -219
- package/dist/http/routes/onboarding.d.ts +1 -0
- package/dist/http/routes/onboarding.js +17 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +199 -123
- package/dist/outbox.d.ts +0 -2
- package/dist/outbox.js +259 -148
- package/dist/reporting/rollups.js +18 -11
- package/dist/runtime-instance-store.js +212 -58
- package/dist/stores/materialized-snapshot-store.d.ts +18 -0
- package/dist/stores/materialized-snapshot-store.js +91 -0
- package/dist/stores/sqlite-state.d.ts +6 -0
- package/dist/stores/sqlite-state.js +179 -0
- package/package.json +5 -1
- package/dashboard/dist/assets/B014hrCe.js.br +0 -0
- package/dashboard/dist/assets/B014hrCe.js.gz +0 -0
- package/dashboard/dist/assets/BCudUvwg.js +0 -1
- package/dashboard/dist/assets/BCudUvwg.js.br +0 -0
- package/dashboard/dist/assets/BCudUvwg.js.gz +0 -0
- package/dashboard/dist/assets/BGY6oI8h.js.br +0 -0
- package/dashboard/dist/assets/BGY6oI8h.js.gz +0 -0
- package/dashboard/dist/assets/BJI1Iy5v.css +0 -1
- package/dashboard/dist/assets/BJI1Iy5v.css.br +0 -0
- package/dashboard/dist/assets/BJI1Iy5v.css.gz +0 -0
- package/dashboard/dist/assets/BUvcp_7V.js +0 -1
- package/dashboard/dist/assets/BUvcp_7V.js.br +0 -0
- package/dashboard/dist/assets/BUvcp_7V.js.gz +0 -0
- package/dashboard/dist/assets/BV2Tf8S2.js +0 -212
- package/dashboard/dist/assets/BV2Tf8S2.js.br +0 -0
- package/dashboard/dist/assets/BV2Tf8S2.js.gz +0 -0
- package/dashboard/dist/assets/BYb6DARX.js.br +0 -0
- package/dashboard/dist/assets/BYb6DARX.js.gz +0 -0
- package/dashboard/dist/assets/BoDhb8_y.js.br +0 -0
- package/dashboard/dist/assets/BoDhb8_y.js.gz +0 -0
- package/dashboard/dist/assets/Bqk_l0k6.js +0 -1
- package/dashboard/dist/assets/Bqk_l0k6.js.br +0 -0
- package/dashboard/dist/assets/Bqk_l0k6.js.gz +0 -0
- package/dashboard/dist/assets/C-MOJWHs.js +0 -1
- package/dashboard/dist/assets/C-MOJWHs.js.br +0 -0
- package/dashboard/dist/assets/C-MOJWHs.js.gz +0 -0
- package/dashboard/dist/assets/CV0sWMbv.js.br +0 -0
- package/dashboard/dist/assets/CV0sWMbv.js.gz +0 -0
- package/dashboard/dist/assets/CaAkScfa.js +0 -1
- package/dashboard/dist/assets/CaAkScfa.js.br +0 -0
- package/dashboard/dist/assets/CaAkScfa.js.gz +0 -0
- package/dashboard/dist/assets/Ck5KlsPN.js +0 -1
- package/dashboard/dist/assets/Ck5KlsPN.js.br +0 -0
- package/dashboard/dist/assets/Ck5KlsPN.js.gz +0 -0
- package/dashboard/dist/assets/D2G51wQm.js +0 -1
- package/dashboard/dist/assets/D2G51wQm.js.br +0 -0
- package/dashboard/dist/assets/D2G51wQm.js.gz +0 -0
- package/dashboard/dist/assets/DAr4MfFk.js.br +0 -0
- package/dashboard/dist/assets/DAr4MfFk.js.gz +0 -0
- package/dashboard/dist/assets/DXVs61e1.js.br +0 -0
- package/dashboard/dist/assets/DXVs61e1.js.gz +0 -0
- package/dashboard/dist/assets/DibzNd0I.js.br +0 -0
- package/dashboard/dist/assets/DibzNd0I.js.gz +0 -0
- package/dashboard/dist/assets/Dm0CfDGr.js.br +0 -0
- package/dashboard/dist/assets/Dm0CfDGr.js.gz +0 -0
- package/dashboard/dist/assets/_zpQCpjm.js.br +0 -0
- package/dashboard/dist/assets/_zpQCpjm.js.gz +0 -0
- package/dashboard/dist/assets/uNGpYMSH.js +0 -1
- package/dashboard/dist/assets/uNGpYMSH.js.br +0 -0
- package/dashboard/dist/assets/uNGpYMSH.js.gz +0 -0
- package/dashboard/dist/assets/wa4jJQK9.js.br +0 -0
- package/dashboard/dist/assets/wa4jJQK9.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
|
|
889
|
-
|
|
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:
|
|
1141
|
-
connectionVerified:
|
|
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:
|
|
1176
|
-
connectionVerified:
|
|
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;
|