aidevops 3.32.181 → 3.32.183
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/README.md
CHANGED
|
@@ -60,7 +60,7 @@ The result: an AI operations platform that manages projects across every busines
|
|
|
60
60
|
[](https://github.com/marcusquinn)
|
|
61
61
|
|
|
62
62
|
<!-- Release & Version Info -->
|
|
63
|
-
[](https://github.com/marcusquinn/aidevops/releases)
|
|
64
64
|
[](https://www.npmjs.com/package/aidevops)
|
|
65
65
|
[](https://github.com/marcusquinn/homebrew-tap)
|
|
66
66
|
[](https://github.com/marcusquinn/aidevops)
|
|
@@ -688,7 +688,7 @@ See `.agents/tools/terminal/terminal-title.md` for customization options.
|
|
|
688
688
|
|
|
689
689
|
- **SimpleX bot** - Channel-agnostic gateway with SimpleX Chat as first adapter for AI agent dispatch (`simplex-bot/`)
|
|
690
690
|
- **Matterbridge** - Multi-platform chat bridge connecting 20+ platforms including Matrix, Discord, Telegram, Slack, IRC, WhatsApp, XMPP (`matterbridge-helper.sh`)
|
|
691
|
-
- **
|
|
691
|
+
- **Approval-bound social operations** - Owner-only immediate/scheduled posts, replies, likes/upvotes, bookmarks/saves, receipts, reconciliation, and mention/reply workflow state through a fixed provider registry. X uses the guarded official `xurl` CLI with multiple apps/accounts; Reddit uses named PRAW profiles with stable-account verification and separately protected post subjects/destinations. Model-provider auth such as OpenCode xAI/Grok remains separate from social API OAuth (`content/social-xurl.md`, `content/social-reddit.md`, `knowledge-social-helper.sh`)
|
|
692
692
|
- **Localdev** - Local development environment manager with dnsmasq, Traefik, mkcert for production-like `.local` domains with HTTPS (`localdev-helper.sh`)
|
|
693
693
|
|
|
694
694
|
**MCP Toolkit:**
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
3.32.
|
|
1
|
+
3.32.183
|
package/aidevops.sh
CHANGED
package/package.json
CHANGED
|
@@ -3,6 +3,7 @@ import { type CSSProperties, type Dispatch, type FocusEvent as ReactFocusEvent,
|
|
|
3
3
|
import { ManagedAppPanel } from "./ManagedAppPanel";
|
|
4
4
|
import { text } from "./app-model";
|
|
5
5
|
import { RecommendedAppsSurface, nextRecommendedFilterValue, recommendedAppMatchesFilters, recommendedApps, type RecommendedOsId, type RecommendedPlatformFilterId } from "./RecommendedAppsSurface";
|
|
6
|
+
import { useRunningJobRefresh } from "./useRunningJobRefresh";
|
|
6
7
|
|
|
7
8
|
export { EditableInventorySurface, InstallationSurface } from "./InventoryEditorSurfaces";
|
|
8
9
|
export { nextRecommendedFilterValue } from "./RecommendedAppsSurface";
|
|
@@ -32,23 +33,7 @@ export function AppsSurface({ status }: { status: GuiStatusData }): ReactElement
|
|
|
32
33
|
}, [firstVisibleManagedAppId]);
|
|
33
34
|
|
|
34
35
|
const runningJobIdsKey = Object.values(jobs).filter((job) => job.status === "running").map((job) => job.id).sort().join("|");
|
|
35
|
-
|
|
36
|
-
useEffect(() => {
|
|
37
|
-
const runningJobIds = runningJobIdsKey.split("|").filter(Boolean);
|
|
38
|
-
if (runningJobIds.length === 0) {
|
|
39
|
-
return undefined;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const refreshRunningJobs = () => {
|
|
43
|
-
for (const jobId of runningJobIds) {
|
|
44
|
-
void refreshJob(jobId, setJobs);
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
refreshRunningJobs();
|
|
48
|
-
const timer = window.setInterval(refreshRunningJobs, 1_500);
|
|
49
|
-
|
|
50
|
-
return () => window.clearInterval(timer);
|
|
51
|
-
}, [runningJobIdsKey]);
|
|
36
|
+
useRunningJobRefresh(runningJobIdsKey, refreshJob, setJobs);
|
|
52
37
|
|
|
53
38
|
return (
|
|
54
39
|
<section className="apps-surface" aria-label={text.apps} onBlur={() => setTooltip(null)} onFocus={showFocusedAppTooltip(setTooltip)} onPointerLeave={() => setTooltip(null)} onPointerMove={showPointedAppTooltip(setTooltip)}>
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { type CSSProperties, type Dispatch, type ReactElement, type SetStateAction,
|
|
1
|
+
import { type CSSProperties, type Dispatch, type ReactElement, type SetStateAction, useState } from "react";
|
|
2
2
|
import type { GuiPulseWorkerActionJobSummary, GuiPulseWorkerActionSummary, GuiPulseWorkerActivityEvent, GuiPulseWorkerChartSeries, GuiResponseEnvelope, GuiStatusData } from "../../gui-shared/src";
|
|
3
3
|
import { AppActionTerminal } from "./AppActionTerminal";
|
|
4
4
|
import { text } from "./app-model";
|
|
5
|
+
import { useRunningJobRefresh } from "./useRunningJobRefresh";
|
|
5
6
|
|
|
6
7
|
type PulseEvent = GuiPulseWorkerActivityEvent;
|
|
7
8
|
type PulseFilterGroup = { label: string; values: string[] };
|
|
@@ -20,23 +21,7 @@ export function PulseWorkersSurface({ status }: { status: GuiStatusData }): Reac
|
|
|
20
21
|
const chartSeries = pulse.charts.slice(0, 4);
|
|
21
22
|
const sampleSize = pulse.kpis.reduce((total, kpi) => total + (kpi.sample_size ?? 0), 0);
|
|
22
23
|
const runningJobIdsKey = Object.values(jobs).filter((job) => job.status === "running").map((job) => job.id).sort().join("|");
|
|
23
|
-
|
|
24
|
-
useEffect(() => {
|
|
25
|
-
const runningJobIds = runningJobIdsKey.split("|").filter(Boolean);
|
|
26
|
-
if (runningJobIds.length === 0) {
|
|
27
|
-
return undefined;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const refreshRunningJobs = () => {
|
|
31
|
-
for (const jobId of runningJobIds) {
|
|
32
|
-
void refreshPulseWorkerJob(jobId, setJobs);
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
refreshRunningJobs();
|
|
36
|
-
const timer = window.setInterval(refreshRunningJobs, 1_500);
|
|
37
|
-
|
|
38
|
-
return () => window.clearInterval(timer);
|
|
39
|
-
}, [runningJobIdsKey]);
|
|
24
|
+
useRunningJobRefresh(runningJobIdsKey, refreshPulseWorkerJob, setJobs);
|
|
40
25
|
|
|
41
26
|
return (
|
|
42
27
|
<section className="pulse-workers-surface" aria-label={text.workers}>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type Dispatch, type SetStateAction, useEffect } from "react";
|
|
2
|
+
|
|
3
|
+
type JobState<Job> = Record<string, Job>;
|
|
4
|
+
type RefreshJob<Job> = (
|
|
5
|
+
jobId: string,
|
|
6
|
+
setJobs: Dispatch<SetStateAction<JobState<Job>>>,
|
|
7
|
+
) => Promise<void>;
|
|
8
|
+
|
|
9
|
+
export function useRunningJobRefresh<Job>(
|
|
10
|
+
runningJobIdsKey: string,
|
|
11
|
+
refreshJob: RefreshJob<Job>,
|
|
12
|
+
setJobs: Dispatch<SetStateAction<JobState<Job>>>,
|
|
13
|
+
): void {
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
const runningJobIds = runningJobIdsKey.split("|").filter(Boolean);
|
|
16
|
+
if (runningJobIds.length === 0) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const refreshRunningJobs = () => {
|
|
21
|
+
for (const jobId of runningJobIds) {
|
|
22
|
+
void refreshJob(jobId, setJobs);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
refreshRunningJobs();
|
|
26
|
+
const timer = window.setInterval(refreshRunningJobs, 1_500);
|
|
27
|
+
|
|
28
|
+
return () => window.clearInterval(timer);
|
|
29
|
+
}, [refreshJob, runningJobIdsKey, setJobs]);
|
|
30
|
+
}
|
package/setup.sh
CHANGED
|
@@ -17,7 +17,7 @@ fi
|
|
|
17
17
|
# AI Assistant Server Access Framework Setup Script
|
|
18
18
|
# Helps developers set up the framework for their infrastructure
|
|
19
19
|
#
|
|
20
|
-
# Version: 3.32.
|
|
20
|
+
# Version: 3.32.183
|
|
21
21
|
#
|
|
22
22
|
# Quick Install:
|
|
23
23
|
# npm install -g aidevops && aidevops update (recommended)
|