lens-image-logs-explorer 0.0.0-stage → 0.4.0

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/CHANGELOG.md ADDED
@@ -0,0 +1,57 @@
1
+ # Changelog
2
+
3
+ What changed in each version of this extension, newest first.
4
+
5
+ ## 0.4.0
6
+
7
+ - Use the updated Image & Logs Explorer artwork as the extension banner.
8
+
9
+ - Rename the extension to Image & Logs Explorer (package: lens-image-logs-explorer) with a new cube-and-log icon and informative banner.
10
+
11
+ - Highlight log loading with green primary buttons and a larger initial load action.
12
+
13
+ - Add Workloads → Logs with image/workload scope, search, facets, loaded-log timeline, source coverage and entry details.
14
+ - Bound collection concurrency, source count, line/byte limits, retained log memory and rendered rows; cancel requests when scope or view changes.
15
+ - Offer explicit snapshot auto-refresh with pause-on-inspect and two read-only Ask AI queries for loaded logs and source coverage.
16
+ - Use bounded snapshots rather than streaming; collection gaps and partial history are shown explicitly.
17
+
18
+ ## 0.3.0
19
+
20
+ - Match the approved Image Explorer design with a compact header, search toolbar, collapsible Scope panel, and dense image table.
21
+ - Show removable filter chips, a full reset, scoped keyboard search controls, and useful empty-state filter suggestions.
22
+ - Restyle expanded image usages while preserving wrapped runtime IDs, copying, Pod navigation, runtime versions, and visibility evidence.
23
+ - Add loading skeletons and keep wide tables scrollable within smaller Lens panes.
24
+
25
+ ## 0.2.1
26
+
27
+ - Reuse image-size and workload indexes and existing image groups to reduce repeated work during updates and searches.
28
+ - Release failed resource subscriptions promptly and keep resource and cluster-name failures from breaking the explorer.
29
+ - Bound cached registry and node-runtime descriptions and reuse runtime reports within Ask AI queries.
30
+ - Keep Ask AI query results and safe errors intact when subscription cleanup fails.
31
+
32
+ ## 0.2.0
33
+
34
+ - Clarify namespace sharing with inline names/counts, expandable usage, and a Multiple namespaces only filter.
35
+ - Show shortened configured digest pins instead of generic Digest pinned labels.
36
+ - Add the MIT license and public source repository metadata.
37
+ - Show node-reported container runtimes and versions in expanded image usage and Pod details, with Unavailable fallback.
38
+ - Add an Ask AI query for the node runtimes and versions running each image.
39
+
40
+ ## 0.1.0
41
+
42
+ - Add a dedicated tag/digest-pin search, pinned/unpinned filtering, match counts, and search reset using Lens-themed search fields.
43
+ - Let Ask AI find cluster images by tag or configured digest pin with namespace and pinning filters.
44
+ - Wrap full runtime image IDs as selectable text in the Images explorer with a compact copy button beside each value.
45
+ - Wrap full runtime image IDs as selectable text in Pod details with a compact copy button beside each value.
46
+ - Use compact logos for all registry providers and native Lens styling for Pod image details, wrapped references, runtime IDs, and copy controls.
47
+ - Replaced the Amazon ECR text and generic cube with Lens's compact AWS logo, keeping the provider name in accessible labels and tooltips.
48
+ - Fixed registry detail cards overlapping the image list; click and keyboard details now expand within their own row and stay hidden until opened.
49
+ - Added registry provider icons, public/private/unknown badges, and registry details in the Images view and Pod details.
50
+ - Added an Ask AI query to explain an image reference's registry and visibility evidence from any conversation.
51
+ - Introduced Lens Image Explorer, available under Workloads → Images.
52
+ - Group container images by reference, inspect and copy full runtime IDs, and view their pod usage.
53
+ - Show image sizes from node inventories, with ranges and explicit unavailable or partial results.
54
+ - Added search, sorting, namespace scope, running-only and multiple-ID filters.
55
+ - Added a Container images section to Pod details.
56
+ - Keep the Images view usable while the cluster name is loading.
57
+ - Added namespace and Deployment/StatefulSet workload dropdowns with controller-aware image filtering.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Oto Abaiadze
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,75 @@
1
- # Temporary Holding Version
1
+ # Image & Logs Explorer
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Inspect container images and investigate consolidated pod logs in Lens, with runtime IDs, image sizes, source coverage, search and filtering.
4
+
5
+ ## Features
6
+
7
+ - A live **Workloads → Images** view grouped by requested image reference.
8
+ - Compact registry marks and **Public**, **Private**, or **Unknown** visibility badges, with details about each image reference.
9
+ - Short, aligned hashes that expand into full, wrapped, selectable runtime image IDs with a small copy button beside each value.
10
+ - Pod, container, namespace, node, and state details for each image ID.
11
+ - Node-reported container runtime and version in expanded image usage and Pod details, with **Unavailable** when it cannot be read.
12
+ - Image sizes reported by the nodes running those containers.
13
+ - Search by image, tag, hash, namespace, pod, container, or node; narrow by tag or configured digest pin and filter pinned versus unpinned references.
14
+ - Sort by image, tag, size, or container count.
15
+ - Filters for running containers and references with multiple image IDs.
16
+ - Namespace, workload type, and workload dropdowns, including Deployments and StatefulSets.
17
+ - Visible namespace sharing, expandable namespace names, and a **Multiple namespaces only** filter.
18
+ - A **Container images** section in each Pod's details, including init and ephemeral containers.
19
+ - Compact registry logos, native Lens detail rows, wrapped image references and selectable runtime IDs, with small copy buttons in Pod details.
20
+
21
+ ## Install
22
+
23
+ [Open Image & Logs Explorer in Lens](https://app.k8slens.dev/lens-launcher?c=lens%3A%2F%2Fapp%2Fopen%2Fextension%3Fname%3Dlens-image-logs-explorer).
24
+
25
+ ## Usage
26
+
27
+ Connect a cluster in Lens, expand **Workloads**, and select **Images**. Expand an image row to inspect its full IDs and the containers using each one. Select a pod name to open its details.
28
+
29
+ Use **Search** for partial image names, tags, hashes, namespaces, Pods, containers, or nodes. Use **Tag / pin** to search only the configured tag or digest pin, for example `v3.5.0` or part of a `sha256:` pin. Searches ignore case and surrounding spaces; both fields apply together. **Pinning** selects all references, **Digest pinned**, or **Not pinned**. A runtime image ID alone does not make the requested reference digest-pinned. **Clear search** resets these search controls while keeping scope and display toggles. Press Escape in Search to clear its text, or `/` while focused elsewhere in the explorer to focus Search.
30
+
31
+ The compact header summarizes the current scope. Active filters appear beside the result count; use a chip's × button to remove that filter. **Reset all filters** restores the initial running-container view. When no references match, suggested filter removals show how many results they would restore within the data already available.
32
+
33
+ The view starts with running containers across all namespaces. Open **Scope**, pick a **Namespace**, select **Deployment** or **StatefulSet** under **Workload type**, and optionally choose a specific **Workload**. Image counts, sizes, and pod usage follow those filters. Deployment filtering follows the Pod's ReplicaSet controller, keeping old and new rollout replicas together.
34
+
35
+ Namespace choices come from the cluster's namespaces and observed Pods. If namespace listing is unavailable, choose **Enter a namespace manually…** in the Namespace menu and select **Apply**. Clear **Running containers** under **Show only** to include waiting, terminated, and unreported container states. Workload dropdowns include workloads with no Pods; selecting one shows an empty image list.
36
+
37
+ Deployment ownership needs access to ReplicaSets. If some workload resources cannot be read, the view explains the limitation and keeps image browsing available.
38
+
39
+ **Multiple image IDs** means the same requested image reference has more than one reported ID. Different architectures or runtimes can account for this; inspect the usage before comparing them.
40
+
41
+ **Namespaces** shows one or two names directly. When an image reference is used in three or more namespaces, select **+N** to list every namespace within the row; select **fewer** to collapse it. Expanded usages show the individual containers in each namespace. **Multiple namespaces** keeps references used in at least two namespaces in the current scope. Namespace, workload, and running-container filters affect these counts; namespaces outside that scope may also use the image. Different tags or digest pins remain separate rows, and configured digest pins are shortened in **Tag / pin**, with the full reference available in the tooltip and expanded image details.
42
+
43
+ **Reported size** comes from Kubernetes node image inventories, matched to the runtime image ID on the container's node. A range means the nodes report different sizes. A partial result covers only some containers. **Unavailable** means there is no exact match, the node inventory omits the image, or your account cannot read Nodes. Sizes can include shared layers and should not be added up as disk usage.
44
+
45
+ **Node runtime** shows the runtime and version reported by the node assigned to that Pod, for example `containerd 1.7.24`. Each node keeps its own value, so an image running on different runtime versions shows those differences in its usage rows. **Unavailable** means the Pod is not assigned to a node, the node or its runtime report is missing or unreadable, or Node access is unavailable. Hover over the value for its source or availability explanation. This is the node's latest reported runtime information, rather than a history of the runtime used when a container started; it is read separately from the runtime image ID.
46
+
47
+ Image tags, requested digest pins, and runtime image IDs are distinct. The explorer preserves the original full ID and shows **Not reported yet** when the runtime has not provided one.
48
+
49
+ Registry marks identify where the configured image reference points: AWS ECR, Google Artifact Registry or GCR, Docker Hub, GitHub, Azure, or Quay. Other registries use **?**. Provider names remain in tooltips, accessible labels, and expanded details. The marks describe the image registry, independently of where your cluster runs. Hover over visibility badges for the evidence. Expand an image row, then activate its registry badges to show the hostname, repository, tag, digest pin, and identifiable AWS account/region or Google project. Pod details retain the compact provider logos.
50
+
51
+ **Public** and **Private** are shown for recognized AWS ECR public and private registry endpoints. **Unknown** means repository visibility has not been verified, including Docker Hub, Google, GitHub, Azure, Quay, and custom registries. A provider logo or successful container start does not establish public access. The explorer does not contact registries or read registry credentials to make these classifications.
52
+
53
+ ## Ask AI
54
+
55
+ From any Ask AI conversation, ask which registry hosts an image reference and whether its visibility is public, private, or unknown. The answer includes the same evidence shown by the badges; it does not check live repository access or identify what a container actually pulled.
56
+
57
+ You can also ask Ask AI to find images in the conversation's cluster by image name, tag, configured digest pin, or runtime image ID, with optional namespace and pinned/unpinned filters. Results include the configured references, runtime image IDs, and container counts. Searches include running containers and return up to 50 image references by default, with the full match count; ask to include other container states or return more results (up to 100) when needed.
58
+
59
+ Ask Ask AI which container runtimes and versions run an image in the conversation's cluster. It groups container counts by image and node, supports a namespace or exact image reference, and reports **Unavailable** if Node information cannot be read. It reads a snapshot without changing the explorer's filters.
60
+
61
+ What changed in each version is in [CHANGELOG.md](./CHANGELOG.md).
62
+
63
+ ## License
64
+
65
+ [MIT](./LICENSE).
66
+
67
+ ## Logs Explorer
68
+
69
+ Open **Workloads → Logs**, or choose **Logs** beside an image in Image Explorer. Select a namespace, observed Deployment/StatefulSet, or image and click **Load / Refresh**. Filter the loaded entries by text, JSON `field:value`, namespace, pod, container, image, severity, or a timeline bucket. Open an entry for its message, source metadata and nearby loaded lines; click metadata values to filter. Use `/` to focus search and Escape to close details.
70
+
71
+ The view reads Kubernetes pod-log snapshots using your existing cluster access. It attempts up to 20 containers with three requests at a time, reads at most 400 lines / 128 KB per container, and keeps at most 3,000 entries / 4 MB of message text. Results render in pages of 100. Source coverage lists access failures and limits; narrow your scope if containers were excluded. Severity is inferred only from a recognized level field or prefix; otherwise it is **Unknown**. Each physical log line remains separate.
72
+
73
+ **Auto-refresh** loads a new bounded snapshot 10 seconds after the previous load completes. It is off by default and pauses when you inspect, scroll through or page the results. It replaces the previous snapshot and may miss lines during bursts; it is not a continuous stream or a historical log archive. Leaving the view releases resources and clears loaded messages. Retrieval ranges are limited by the logs the node still retains.
74
+
75
+ From any Ask AI conversation, ask it to **search logs already loaded in Logs Explorer**, or **summarize the loaded log source coverage**. These read-only queries do not start collection or change view filters. Search returns at most 50 messages, capped at 2,048 characters each. Coverage returns counts and source failures without message bodies.
Binary file
@@ -0,0 +1,38 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="800" height="400" viewBox="0 0 800 400">
2
+ <defs>
3
+ <linearGradient id="bg" x2="1" y2="1"><stop stop-color="#102c3c"/><stop offset="1" stop-color="#19233e"/></linearGradient>
4
+ <radialGradient id="glow"><stop stop-color="#42b8bc" stop-opacity=".18"/><stop offset="1" stop-color="#42b8bc" stop-opacity="0"/></radialGradient>
5
+ </defs>
6
+ <rect width="800" height="400" rx="8" fill="url(#bg)"/>
7
+ <ellipse cx="680" cy="55" rx="330" ry="250" fill="url(#glow)"/>
8
+ <g opacity=".08" stroke="#b5caf1" fill="none"><path d="M0 172h800M0 212h800M0 252h800M0 292h800M0 332h800M0 372h800M40 172v228M80 172v228M120 172v228M160 172v228M200 172v228M240 172v228M280 172v228M320 172v228M360 172v228M400 172v228M440 172v228M480 172v228M520 172v228M560 172v228M600 172v228M640 172v228M680 172v228M720 172v228M760 172v228"/></g>
9
+ <g transform="translate(42 42)">
10
+ <rect width="76" height="76" rx="18" fill="#17384b" stroke="#4e9aab" stroke-opacity=".4"/>
11
+ <path d="m13 22 19-11 19 11-19 11Zm0 0v22l19 11V33m19-11v13" fill="none" stroke="#7ce6e2" stroke-width="3.5" stroke-linejoin="round"/>
12
+ <rect x="31" y="36" width="33" height="28" rx="6" fill="#19263e" stroke="#b4a3ff" stroke-width="2.5"/>
13
+ <path d="m38 44 3 3-3 3m9-6h10m-10 8h7" fill="none" stroke="#d3c8ff" stroke-width="2.8" stroke-linecap="round" stroke-linejoin="round"/>
14
+ <circle cx="57" cy="57" r="2" fill="#6de4a3"/>
15
+ </g>
16
+ <g font-family="system-ui,-apple-system,sans-serif">
17
+ <text x="140" y="61" fill="#7ce6e2" font-size="11" font-weight="700" letter-spacing="2.5">KUBERNETES · LENS EXTENSION</text>
18
+ <text x="138" y="94" fill="#f2f6ff" font-size="32" font-weight="700" letter-spacing="-.7">Image &amp; Logs Explorer</text>
19
+ <text x="140" y="123" fill="#a6b9d1" font-size="16">Know your images. Follow the evidence.</text>
20
+ <rect x="42" y="158" width="716" height="201" rx="12" fill="#0e1b2d" stroke="#375064" stroke-opacity=".65"/>
21
+ <path d="M42 196h716" stroke="#375064" stroke-opacity=".65"/>
22
+ <circle cx="61" cy="177" r="3" fill="#7ce6e2"/>
23
+ <text x="74" y="181" fill="#cbd7e8" font-size="11" font-weight="600" letter-spacing="1.4">IMAGES</text>
24
+ <text x="414" y="181" fill="#cbd7e8" font-size="11" font-weight="600" letter-spacing="1.4">LOGS</text>
25
+ <path d="M389 196v163" stroke="#375064" stroke-opacity=".5"/>
26
+ <g font-family="ui-monospace,Menlo,monospace" font-size="13">
27
+ <text x="62" y="228" fill="#f2f6ff">api:v2.4</text><text x="239" y="228" fill="#7ce6e2">sha256:9ad…f2c</text>
28
+ <text x="62" y="265" fill="#f2f6ff">worker:v1.8</text><text x="239" y="265" fill="#7ce6e2">sha256:36e…8a1</text>
29
+ <text x="62" y="302" fill="#f2f6ff">web:v3.1</text><text x="239" y="302" fill="#7ce6e2">sha256:a71…04b</text>
30
+ <text x="413" y="228" fill="#8296af">12:04:21</text><text x="495" y="228" fill="#7ce6e2">INFO</text><text x="552" y="228" fill="#d5dfed">Request complete</text>
31
+ <rect x="402" y="242" width="342" height="31" rx="4" fill="#eab76a" fill-opacity=".08"/>
32
+ <text x="413" y="262" fill="#8296af">12:04:22</text><text x="495" y="262" fill="#eab76a">WARN</text><text x="552" y="262" fill="#d5dfed">Retry scheduled</text>
33
+ <text x="413" y="299" fill="#8296af">12:04:23</text><text x="495" y="299" fill="#af9df2">DEBUG</text><text x="552" y="299" fill="#d5dfed">Cache hit</text>
34
+ </g>
35
+ <text x="62" y="337" fill="#8296af" font-size="11">References · Runtime IDs · Sizes</text>
36
+ <text x="414" y="337" fill="#8296af" font-size="11">Search · Filter · Inspect</text>
37
+ </g>
38
+ </svg>
@@ -0,0 +1,12 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64">
2
+ <defs>
3
+ <linearGradient id="bg" x2="1" y2="1"><stop stop-color="#16384b"/><stop offset="1" stop-color="#151e35"/></linearGradient>
4
+ <linearGradient id="cube" x2="1" y2="1"><stop stop-color="#8cf3ed"/><stop offset="1" stop-color="#4bbbd2"/></linearGradient>
5
+ </defs>
6
+ <rect width="64" height="64" rx="15" fill="url(#bg)"/>
7
+ <rect x="1" y="1" width="62" height="62" rx="14" fill="none" stroke="#6de0dc" stroke-opacity=".2"/>
8
+ <path d="m12 19 16-9 16 9-16 9Zm0 0v18l16 9V28m16-9v12" fill="none" stroke="url(#cube)" stroke-width="3.5" stroke-linejoin="round"/>
9
+ <rect x="27" y="31" width="29" height="24" rx="6" fill="#18263b" stroke="#b4a3ff" stroke-width="2.5"/>
10
+ <path d="m33 38 3 3-3 3m8-6h9m-9 7h6" fill="none" stroke="#d3c8ff" stroke-width="2.7" stroke-linecap="round" stroke-linejoin="round"/>
11
+ <circle cx="50" cy="49" r="2" fill="#6de4a3"/>
12
+ </svg>