aidevops 3.32.182 → 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
  [![Copyright](https://img.shields.io/badge/Copyright-Marcus%20Quinn%202025--2026-blue.svg)](https://github.com/marcusquinn)
61
61
 
62
62
  <!-- Release & Version Info -->
63
- [![Version](https://img.shields.io/badge/Version-3.32.182-blue.svg)](https://github.com/marcusquinn/aidevops/releases)
63
+ [![Version](https://img.shields.io/badge/Version-3.32.183-blue.svg)](https://github.com/marcusquinn/aidevops/releases)
64
64
  [![npm version](https://img.shields.io/npm/v/aidevops)](https://www.npmjs.com/package/aidevops)
65
65
  [![Homebrew](https://img.shields.io/badge/homebrew-marcusquinn%2Ftap-orange)](https://github.com/marcusquinn/homebrew-tap)
66
66
  [![GitHub repository](https://img.shields.io/badge/github-repository-181717.svg?logo=github)](https://github.com/marcusquinn/aidevops)
package/VERSION CHANGED
@@ -1 +1 @@
1
- 3.32.182
1
+ 3.32.183
package/aidevops.sh CHANGED
@@ -5,7 +5,7 @@
5
5
  # AI DevOps Framework CLI
6
6
  # Usage: aidevops <command> [options]
7
7
  #
8
- # Version: 3.32.182
8
+ # Version: 3.32.183
9
9
 
10
10
  set -euo pipefail
11
11
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aidevops",
3
- "version": "3.32.182",
3
+ "version": "3.32.183",
4
4
  "description": "AI DevOps Framework - AI-assisted development workflows, code quality, and deployment automation",
5
5
  "type": "module",
6
6
  "workspaces": [
@@ -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, useEffect, useState } from "react";
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.182
20
+ # Version: 3.32.183
21
21
  #
22
22
  # Quick Install:
23
23
  # npm install -g aidevops && aidevops update (recommended)