een-api-toolkit 0.3.91 → 0.3.97
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/.claude/agents/api-coverage-agent.md +71 -29
- package/.claude/agents/een-ptz-agent.md +12 -2
- package/CHANGELOG.md +35 -44
- package/dist/index.d.ts +12 -0
- package/docs/AI-CONTEXT.md +1 -1
- package/docs/ai-reference/AI-AUTH.md +1 -1
- package/docs/ai-reference/AI-AUTOMATIONS.md +1 -1
- package/docs/ai-reference/AI-DEVICES.md +12 -1
- package/docs/ai-reference/AI-EVENT-DATA-SCHEMAS.md +1 -1
- package/docs/ai-reference/AI-EVENTS.md +1 -1
- package/docs/ai-reference/AI-GROUPING.md +1 -1
- package/docs/ai-reference/AI-JOBS.md +1 -1
- package/docs/ai-reference/AI-MEDIA.md +1 -1
- package/docs/ai-reference/AI-PTZ.md +17 -1
- package/docs/ai-reference/AI-SETUP.md +1 -1
- package/docs/ai-reference/AI-USERS.md +1 -1
- package/examples/vue-ptz/README.md +1 -1
- package/examples/vue-ptz/src/components/CameraSelector.vue +1 -1
- package/package.json +1 -1
|
@@ -205,40 +205,82 @@ Implemented: [brief list of what IS implemented]
|
|
|
205
205
|
|
|
206
206
|
#### Document 4: `docs/een-api-coverage.html`
|
|
207
207
|
|
|
208
|
-
Generate a self-contained HTML file
|
|
209
|
-
|
|
210
|
-
**
|
|
211
|
-
-
|
|
212
|
-
-
|
|
213
|
-
-
|
|
214
|
-
|
|
215
|
-
**
|
|
216
|
-
-
|
|
217
|
-
-
|
|
218
|
-
-
|
|
219
|
-
-
|
|
220
|
-
|
|
221
|
-
**
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
-
|
|
225
|
-
-
|
|
226
|
-
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
-
|
|
233
|
-
-
|
|
208
|
+
Generate a self-contained HTML file matching this exact visual style:
|
|
209
|
+
|
|
210
|
+
**Global reset and body**:
|
|
211
|
+
- `*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }`
|
|
212
|
+
- Font: `-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, sans-serif`
|
|
213
|
+
- Background: `#f5f7fa`, color: `#1a202c`
|
|
214
|
+
|
|
215
|
+
**Header** (`<header>`):
|
|
216
|
+
- Dark navy background: `#1a365d`, white text
|
|
217
|
+
- Padding: `24px 32px`
|
|
218
|
+
- `<h1>` at `1.5rem` bold: "Eagle Eye Networks API v3.0 — Toolkit Coverage"
|
|
219
|
+
- `<p>` at `0.875rem`, color `#bee3f8`: generation date and source info
|
|
220
|
+
|
|
221
|
+
**Container**: `max-width: 100%` (use full page width), centered, padding `24px 32px`
|
|
222
|
+
|
|
223
|
+
**Stat cards** (`.stats` grid):
|
|
224
|
+
- `grid-template-columns: repeat(auto-fit, minmax(180px, 1fr))`, gap `16px`
|
|
225
|
+
- Each card: white background, `border-radius: 8px`, padding `20px`, `box-shadow: 0 1px 3px rgba(0,0,0,.08)`
|
|
226
|
+
- Colored `border-top: 4px solid` — blue (`#4299e1`) for Total, green (`#48bb78`) for Implemented, red (`#fc8181`) for Missing, indigo (`#667eea`) for Coverage
|
|
227
|
+
- Label: `0.75rem` uppercase, `letter-spacing: .05em`, color `#718096`
|
|
228
|
+
- Value: `2rem` bold, color `#2d3748`
|
|
229
|
+
- Sub text: `0.8rem`, color `#718096`
|
|
230
|
+
|
|
231
|
+
**Progress bar** (`.progress-wrap`):
|
|
232
|
+
- White card with same shadow/radius as stat cards
|
|
233
|
+
- Label row: flex with `justify-content: space-between`, `0.875rem`, color `#4a5568`
|
|
234
|
+
- Bar background: `#e2e8f0`, `border-radius: 9999px`, height `12px`
|
|
235
|
+
- Fill: `linear-gradient(90deg, #48bb78, #38a169)`, same radius, `transition: width .4s ease`
|
|
236
|
+
|
|
237
|
+
**Filter bar** (`.filter-bar`):
|
|
238
|
+
- White card, flex with `flex-wrap: wrap`, gap `12px`
|
|
239
|
+
- Labels: `0.8rem`, color `#718096`
|
|
240
|
+
- Inputs/selects: border `1px solid #e2e8f0`, `border-radius: 6px`, padding `6px 10px`, `0.875rem`
|
|
241
|
+
- Focus: `border-color: #4299e1`, `box-shadow: 0 0 0 3px rgba(66,153,225,.15)`
|
|
242
|
+
- Text input width: `220px`
|
|
243
|
+
- Filter count: `margin-left: auto`, `0.8rem`, color `#718096`
|
|
244
|
+
- Dropdowns: Status (All/Implemented/Missing), Category (All + each category), Method (All/GET/POST/PATCH/DELETE/PUT)
|
|
245
|
+
- Text search placeholder: "path, function, description..."
|
|
246
|
+
|
|
247
|
+
**Table** (`.table-wrap`):
|
|
248
|
+
- White card with `overflow-x: auto` for horizontal scrollbar on narrow viewports
|
|
249
|
+
- The `<table>` element must have `min-width: 1200px` so content is never clipped — the scrollbar activates instead of truncating columns
|
|
250
|
+
- `<thead>`: dark background `#2d3748`, white text, uppercase `0.75rem`, `letter-spacing: .05em`
|
|
251
|
+
- Headers clickable (cursor pointer) with sort icon `⇅`, changing to `▲`/`▼` when sorted
|
|
252
|
+
- `<tbody>` rows: `border-bottom: 1px solid #edf2f7`, hover `#f7fafc`
|
|
253
|
+
- Cell padding: `10px 14px`
|
|
254
|
+
- Column classes:
|
|
255
|
+
- `.td-num`: color `#a0aec0`, `0.75rem`, width `44px`
|
|
256
|
+
- `.td-cat`: color `#4a5568`, `font-weight: 500`
|
|
257
|
+
- `.td-sub`: color `#718096`
|
|
258
|
+
- `.td-path`: monospace (`'SFMono-Regular', Consolas, monospace`), `0.8rem`, color `#2d3748`
|
|
259
|
+
- `.td-desc`: color `#4a5568`, `max-width: 280px`
|
|
260
|
+
- `.td-func`: monospace, `0.78rem`, color `#553c9a`
|
|
261
|
+
|
|
262
|
+
**Badges** (`.badge`):
|
|
263
|
+
- `display: inline-flex`, padding `2px 8px`, `border-radius: 4px`, `0.72rem` bold uppercase
|
|
264
|
+
- Method colors: GET (`#ebf8ff`/`#2b6cb0`), POST (`#f0fff4`/`#276749`), PATCH (`#fffff0`/`#975a16`), DELETE (`#fff5f5`/`#c53030`), PUT (`#f0e6ff`/`#553c9a`)
|
|
265
|
+
- Status colors: Implemented (`#f0fff4`/`#276749`), Missing (`#fff5f5`/`#c53030`)
|
|
266
|
+
|
|
267
|
+
**Empty state**: centered, padding `48px`, color `#a0aec0`, with a search SVG icon
|
|
268
|
+
|
|
269
|
+
**Footer**: centered, padding `24px`, color `#a0aec0`, `0.8rem`
|
|
270
|
+
|
|
271
|
+
**Columns**: #, Category, Subcategory, Method, Path, Description, Status, Toolkit Function (8 columns)
|
|
234
272
|
|
|
235
273
|
**JavaScript**:
|
|
236
274
|
- All endpoint data in a `const endpoints = [...]` array with objects: `{cat, sub, method, path, desc, status, func}`
|
|
275
|
+
- Endpoints grouped by category/subcategory with `// ─── Category - Subcategory ───` comment dividers
|
|
237
276
|
- `status` values: `"impl"` for implemented, `"miss"` for missing
|
|
238
277
|
- `func` is empty string for missing endpoints
|
|
239
|
-
- `
|
|
240
|
-
- `
|
|
241
|
-
- `
|
|
278
|
+
- `methodBadge(m)` and `statusBadge(s)` helper functions
|
|
279
|
+
- `renderTable(data)` function to populate tbody and update filter count
|
|
280
|
+
- `filterTable()` function combining all four filter inputs (status, category, method, text search across path+func+desc+sub)
|
|
281
|
+
- `sortTable(colIndex)` function with toggle direction, updating header sort icons
|
|
282
|
+
- `sortCol`/`sortAsc` state variables
|
|
283
|
+
- Initial call to `renderTable(endpoints)` at the end
|
|
242
284
|
- All code inline (no external dependencies)
|
|
243
285
|
|
|
244
286
|
## Important Guidelines
|
|
@@ -221,14 +221,24 @@ nested `capabilities.ptz.capable` field. The structure is:
|
|
|
221
221
|
```
|
|
222
222
|
|
|
223
223
|
**IMPORTANT:** The PTZ capability is at `capabilities.ptz.capable` (nested under a `ptz` object),
|
|
224
|
-
NOT at `capabilities.ptzCapable` (flat).
|
|
224
|
+
NOT at `capabilities.ptzCapable` (flat). Fisheye cameras report `capabilities.ptz.capable: true`
|
|
225
|
+
but are NOT true PTZ cameras — always exclude them. Use this pattern:
|
|
226
|
+
|
|
227
|
+
```typescript
|
|
228
|
+
import { computed } from 'vue'
|
|
229
|
+
|
|
230
|
+
const isPtzCapable = computed(() => {
|
|
231
|
+
const ptz = camera.value?.capabilities?.ptz
|
|
232
|
+
return ptz?.capable === true && ptz?.fisheye !== true
|
|
233
|
+
})
|
|
234
|
+
```
|
|
225
235
|
|
|
226
236
|
Also check `effectivePermissions.controlPTZ` to verify the user has permission to move the camera,
|
|
227
237
|
and `effectivePermissions.editPTZStations` for managing presets.
|
|
228
238
|
|
|
229
239
|
## Constraints
|
|
230
240
|
- Always check authentication before API calls
|
|
231
|
-
- Verify camera has PTZ capability (`capabilities.ptz.capable`) before showing controls
|
|
241
|
+
- Verify camera has PTZ capability (`capabilities.ptz.capable`) and is not fisheye (`capabilities.ptz.fisheye !== true`) before showing controls
|
|
232
242
|
- Check user permissions (`effectivePermissions.controlPTZ`) before enabling movement
|
|
233
243
|
- Poll position periodically (every 5s) for position display
|
|
234
244
|
- Handle 204 responses for PUT/PATCH (no response body)
|
package/CHANGELOG.md
CHANGED
|
@@ -2,41 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
-
## [0.3.
|
|
5
|
+
## [0.3.97] - 2026-02-22
|
|
6
6
|
|
|
7
7
|
### Release Summary
|
|
8
8
|
|
|
9
|
-
#### PR #118: Release v0.3.85 - API coverage docs and workflow security fix
|
|
10
|
-
## Summary
|
|
11
|
-
|
|
12
|
-
- Add EEN API v3.0 coverage documentation (4 documents comparing 211 API endpoints against 51 implemented, 24.2% coverage)
|
|
13
|
-
- Add `api-coverage-agent` for on-demand regeneration of coverage docs
|
|
14
|
-
- Update README with agent list and coverage section
|
|
15
|
-
- Fix workflow_dispatch restriction to production branch (security)
|
|
16
|
-
|
|
17
|
-
## Commits
|
|
18
|
-
|
|
19
|
-
- `baa7e1b` feat: add EEN API coverage documentation and agent
|
|
20
|
-
- `eea17e8` docs: add missing agents to README agent list
|
|
21
|
-
- `bb47cc2` docs: rename een-api-coverage-agent to api-coverage-agent
|
|
22
|
-
- `c794fba` fix: restrict workflow_dispatch to production branch to prevent supply chain attack
|
|
23
|
-
- `6e782e2` fix: restrict npm-publish workflow_dispatch to production branch
|
|
24
|
-
|
|
25
|
-
## Test Results (from PR #117)
|
|
26
|
-
|
|
27
|
-
- **Lint**: Passed
|
|
28
|
-
- **Unit tests**: 644 passed
|
|
29
|
-
- **Build**: Succeeded
|
|
30
|
-
- **E2E tests**: 236 passed across all 11 example apps
|
|
31
|
-
- **Security review**: No vulnerabilities
|
|
32
|
-
- **Code review**: Approved by Claude Sonnet 4.5
|
|
33
|
-
|
|
34
|
-
## Version
|
|
35
|
-
|
|
36
|
-
v0.3.85
|
|
37
|
-
|
|
38
|
-
🤖 Generated with [Claude Code](https://claude.com/claude-code)
|
|
39
|
-
|
|
40
9
|
#### PR #128: Release v0.3.89: PTZ camera control API and vue-ptz example
|
|
41
10
|
## Summary
|
|
42
11
|
|
|
@@ -77,26 +46,48 @@ This release adds PTZ (Pan/Tilt/Zoom) camera control support to the toolkit:
|
|
|
77
46
|
|
|
78
47
|
🤖 Generated with [Claude Code](https://claude.com/claude-code)
|
|
79
48
|
|
|
49
|
+
#### PR #130: Release v0.3.96: PTZ fisheye exclusion and API coverage docs
|
|
50
|
+
## Summary
|
|
51
|
+
- Add fisheye camera exclusion to PTZ type definitions, agent docs, AI reference docs, and vue-ptz example
|
|
52
|
+
- Add PTZ sub-capability fields (`fisheye`, `panTilt`, `zoom`, `positionMove`, `directionMove`, `centerOnMove`) to `Camera.capabilities.ptz` type
|
|
53
|
+
- Regenerate API coverage docs with full-width layout and scrollbar fix
|
|
80
54
|
|
|
81
|
-
|
|
55
|
+
## Version
|
|
56
|
+
v0.3.96
|
|
57
|
+
|
|
58
|
+
## Commits
|
|
59
|
+
- `1d9da62` docs: regenerate API coverage docs with full-width layout and scrollbar fix
|
|
60
|
+
- `044c9ae` docs: add fisheye camera exclusion guidance to PTZ agent
|
|
61
|
+
- `f65ff2e` fix: add PTZ sub-capability fields to Camera type and update docs
|
|
62
|
+
- `6ecf253` fix: address review findings for PTZ fisheye guidance
|
|
63
|
+
- `97cf632` fix: exclude fisheye cameras from PTZ selector in vue-ptz example
|
|
82
64
|
|
|
83
|
-
|
|
84
|
-
-
|
|
65
|
+
## Test Results
|
|
66
|
+
- Lint: passed (1 pre-existing warning)
|
|
67
|
+
- Unit tests: 683/683 passed
|
|
68
|
+
- Build: passed
|
|
69
|
+
- E2E: 12/12 example apps passed
|
|
70
|
+
- Security: no vulnerabilities (type/docs changes only)
|
|
71
|
+
- Confidential data scan: clean across 280 changed .md files
|
|
72
|
+
|
|
73
|
+
🤖 Generated with [Claude Code](https://claude.com/claude-code)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
### Detailed Changes
|
|
85
77
|
|
|
86
78
|
#### Bug Fixes
|
|
87
|
-
- fix:
|
|
88
|
-
- fix:
|
|
89
|
-
- fix: address
|
|
90
|
-
- fix:
|
|
91
|
-
- fix: use single getCameras call with include and pagination for PTZ discovery
|
|
92
|
-
- fix: use floating v1 tag for claude-code-action instead of SHA pin
|
|
79
|
+
- fix: fix sorting bug in coverage table and add undefined fisheye test
|
|
80
|
+
- fix: exclude fisheye cameras from PTZ selector in vue-ptz example
|
|
81
|
+
- fix: address review findings for PTZ fisheye guidance
|
|
82
|
+
- fix: add PTZ sub-capability fields to Camera type and update docs
|
|
93
83
|
|
|
94
84
|
#### Other Changes
|
|
95
|
-
-
|
|
85
|
+
- docs: add fisheye camera exclusion guidance to PTZ agent
|
|
86
|
+
- docs: regenerate API coverage docs with full-width layout and scrollbar fix
|
|
96
87
|
|
|
97
88
|
### Links
|
|
98
89
|
- [npm package](https://www.npmjs.com/package/een-api-toolkit)
|
|
99
|
-
- [Full Changelog](https://github.com/klaushofrichter/een-api-toolkit/compare/v0.3.
|
|
90
|
+
- [Full Changelog](https://github.com/klaushofrichter/een-api-toolkit/compare/v0.3.91...v0.3.97)
|
|
100
91
|
|
|
101
92
|
---
|
|
102
|
-
*Released: 2026-02-
|
|
93
|
+
*Released: 2026-02-22 19:53:20 CST*
|
package/dist/index.d.ts
CHANGED
|
@@ -610,6 +610,18 @@ export declare interface Camera {
|
|
|
610
610
|
ptz?: {
|
|
611
611
|
/** Whether this camera supports PTZ controls */
|
|
612
612
|
capable?: boolean;
|
|
613
|
+
/** Whether this is a fisheye camera (not a true PTZ camera) */
|
|
614
|
+
fisheye?: boolean;
|
|
615
|
+
/** Whether the camera supports pan/tilt movements */
|
|
616
|
+
panTilt?: boolean;
|
|
617
|
+
/** Whether the camera supports zoom */
|
|
618
|
+
zoom?: boolean;
|
|
619
|
+
/** Whether the camera supports absolute position moves */
|
|
620
|
+
positionMove?: boolean;
|
|
621
|
+
/** Whether the camera supports directional moves */
|
|
622
|
+
directionMove?: boolean;
|
|
623
|
+
/** Whether the camera supports center-on moves */
|
|
624
|
+
centerOnMove?: boolean;
|
|
613
625
|
};
|
|
614
626
|
};
|
|
615
627
|
/** List of enabled analytics on this camera */
|
package/docs/AI-CONTEXT.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Cameras & Bridges API - EEN API Toolkit
|
|
2
2
|
|
|
3
|
-
> **Version:** 0.3.
|
|
3
|
+
> **Version:** 0.3.97
|
|
4
4
|
>
|
|
5
5
|
> Complete reference for camera and bridge management.
|
|
6
6
|
> Load this document when working with devices.
|
|
@@ -33,6 +33,17 @@ interface Camera {
|
|
|
33
33
|
deviceInfo?: CameraDeviceInfo
|
|
34
34
|
shareDetails?: CameraShareDetails
|
|
35
35
|
devicePosition?: CameraDevicePosition
|
|
36
|
+
capabilities?: {
|
|
37
|
+
ptz?: {
|
|
38
|
+
capable?: boolean
|
|
39
|
+
fisheye?: boolean
|
|
40
|
+
panTilt?: boolean
|
|
41
|
+
zoom?: boolean
|
|
42
|
+
positionMove?: boolean
|
|
43
|
+
directionMove?: boolean
|
|
44
|
+
centerOnMove?: boolean
|
|
45
|
+
}
|
|
46
|
+
}
|
|
36
47
|
createdAt?: string
|
|
37
48
|
updatedAt?: string
|
|
38
49
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# PTZ Camera Controls
|
|
2
2
|
|
|
3
|
-
> **Version:** 0.3.
|
|
3
|
+
> **Version:** 0.3.97
|
|
4
4
|
>
|
|
5
5
|
> Pan/Tilt/Zoom camera control: position, movement, presets, and automation.
|
|
6
6
|
|
|
@@ -142,6 +142,22 @@ function handleVideoClick(event: MouseEvent) {
|
|
|
142
142
|
| FORBIDDEN | No permission | Show access denied |
|
|
143
143
|
| VALIDATION_ERROR | Empty camera ID | Fix input |
|
|
144
144
|
|
|
145
|
+
## Fisheye Camera Exclusion
|
|
146
|
+
|
|
147
|
+
**IMPORTANT:** Fisheye cameras report `capabilities.ptz.capable: true` but are NOT true PTZ cameras.
|
|
148
|
+
Always exclude fisheye cameras when checking PTZ capability:
|
|
149
|
+
|
|
150
|
+
```typescript
|
|
151
|
+
import { computed } from 'vue'
|
|
152
|
+
|
|
153
|
+
const isPtzCapable = computed(() => {
|
|
154
|
+
const ptz = camera.value?.capabilities?.ptz
|
|
155
|
+
return ptz?.capable === true && ptz?.fisheye !== true
|
|
156
|
+
})
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Also check `effectivePermissions.controlPTZ` to verify the user has permission to move the camera.
|
|
160
|
+
|
|
145
161
|
---
|
|
146
162
|
|
|
147
163
|
## Reference Examples
|
|
@@ -214,7 +214,7 @@ let pageToken: string | undefined
|
|
|
214
214
|
do {
|
|
215
215
|
const result = await getCameras({ pageSize: 100, include: ['capabilities'], pageToken })
|
|
216
216
|
for (const cam of result.data?.results || []) {
|
|
217
|
-
if (cam.capabilities?.ptz?.capable) ptzCameras.push(cam)
|
|
217
|
+
if (cam.capabilities?.ptz?.capable && !cam.capabilities?.ptz?.fisheye) ptzCameras.push(cam)
|
|
218
218
|
}
|
|
219
219
|
pageToken = result.data?.nextPageToken ?? undefined
|
|
220
220
|
} while (pageToken)
|
|
@@ -35,7 +35,7 @@ async function loadPtzCameras() {
|
|
|
35
35
|
|
|
36
36
|
const allCameras = result.data?.results || []
|
|
37
37
|
for (const cam of allCameras) {
|
|
38
|
-
if (cam.capabilities?.ptz?.capable) {
|
|
38
|
+
if (cam.capabilities?.ptz?.capable && !cam.capabilities?.ptz?.fisheye) {
|
|
39
39
|
ptzCameras.push(cam)
|
|
40
40
|
}
|
|
41
41
|
}
|