diff --git a/.flox/env/manifest.lock b/.flox/env/manifest.lock index 5caba2e4..37d6d1b9 100644 --- a/.flox/env/manifest.lock +++ b/.flox/env/manifest.lock @@ -5,7 +5,7 @@ "install": { "claude-code": { "pkg-path": "claude-code", - "version": "^2.0.74" + "version": "^2.0.76" }, "docker": { "pkg-path": "docker", @@ -70,27 +70,27 @@ { "attr_path": "claude-code", "broken": false, - "derivation": "/nix/store/gyyzzp5m2j5z17jxdnp57ny1hynfdwy1-claude-code-2.0.74.drv", + "derivation": "/nix/store/mhfj4qzf10fv2jv9njf0b4jpp7inx6k2-claude-code-2.0.76.drv", "description": "Agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster", "install_id": "claude-code", "license": "Unfree", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "name": "claude-code-2.0.74", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "name": "claude-code-2.0.76", "pname": "claude-code", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T02:55:22.514509Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:02:38.420390Z", "stabilities": [ "unstable" ], "unfree": true, - "version": "2.0.74", + "version": "2.0.76", "outputs_to_install": [ "out" ], "outputs": { - "out": "/nix/store/6mj4j3n9ccqpfzqsyc4agjfjcf20a4ss-claude-code-2.0.74" + "out": "/nix/store/x9y8cms1gm1sk9vjcqgf40yk9y13qa77-claude-code-2.0.76" }, "system": "aarch64-darwin", "group": "toplevel", @@ -99,27 +99,27 @@ { "attr_path": "claude-code", "broken": false, - "derivation": "/nix/store/9a58lp0i8hx3i8rlhdw8x97fh6if95ln-claude-code-2.0.74.drv", + "derivation": "/nix/store/mrdvhrl2yfsd6f6cqsnrv9xcck81hxc9-claude-code-2.0.76.drv", "description": "Agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster", "install_id": "claude-code", "license": "Unfree", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "name": "claude-code-2.0.74", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "name": "claude-code-2.0.76", "pname": "claude-code", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:04:23.370209Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:18:00.849905Z", "stabilities": [ "unstable" ], "unfree": true, - "version": "2.0.74", + "version": "2.0.76", "outputs_to_install": [ "out" ], "outputs": { - "out": "/nix/store/l53ljyp8c4rbql771zl67197bpjdavm9-claude-code-2.0.74" + "out": "/nix/store/1g9prcgxkbi9aw76ym1ygwmv7bldifz4-claude-code-2.0.76" }, "system": "aarch64-linux", "group": "toplevel", @@ -128,27 +128,27 @@ { "attr_path": "claude-code", "broken": false, - "derivation": "/nix/store/d2jhhgwqmqjq49a6p4b43ldqq6z3cwcn-claude-code-2.0.74.drv", + "derivation": "/nix/store/h9lpg0hdb28z4byx51n5vycv5f4rq7xy-claude-code-2.0.76.drv", "description": "Agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster", "install_id": "claude-code", "license": "Unfree", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "name": "claude-code-2.0.74", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "name": "claude-code-2.0.76", "pname": "claude-code", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:14:21.750017Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:34:53.660213Z", "stabilities": [ "unstable" ], "unfree": true, - "version": "2.0.74", + "version": "2.0.76", "outputs_to_install": [ "out" ], "outputs": { - "out": "/nix/store/h2n2v1mramg9bw49fv5sl44a5zab9xis-claude-code-2.0.74" + "out": "/nix/store/0vqxdvk72pimgpzqlp95dgla3idld3ks-claude-code-2.0.76" }, "system": "x86_64-darwin", "group": "toplevel", @@ -157,27 +157,27 @@ { "attr_path": "claude-code", "broken": false, - "derivation": "/nix/store/97yri9rcr7ac341vf3n4bfgjx1s1c47k-claude-code-2.0.74.drv", + "derivation": "/nix/store/1wk6c1wjmc2nx6n3ii7sbscx4qpca955-claude-code-2.0.76.drv", "description": "Agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster", "install_id": "claude-code", "license": "Unfree", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "name": "claude-code-2.0.74", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "name": "claude-code-2.0.76", "pname": "claude-code", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:23:14.006272Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:50:18.427137Z", "stabilities": [ "unstable" ], "unfree": true, - "version": "2.0.74", + "version": "2.0.76", "outputs_to_install": [ "out" ], "outputs": { - "out": "/nix/store/nb9by8i3klzxfljcjp46j3k9rs78in3z-claude-code-2.0.74" + "out": "/nix/store/vmmvfrvjnhyip979rfbr3h21sickgh3a-claude-code-2.0.76" }, "system": "x86_64-linux", "group": "toplevel", @@ -186,27 +186,27 @@ { "attr_path": "docker", "broken": false, - "derivation": "/nix/store/7x176hcqpi84zlz8kw1m4snxllxapd0m-docker-29.1.2.drv", + "derivation": "/nix/store/5c2cga917gzia6xn92dxz8dgm461k0sf-docker-29.1.3.drv", "description": "Open source project to pack, ship and run any application as a lightweight container", "install_id": "docker", "license": "Apache-2.0", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "name": "docker-29.1.2", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "name": "docker-29.1.3", "pname": "docker", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T02:55:22.775284Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:02:38.680905Z", "stabilities": [ "unstable" ], "unfree": false, - "version": "29.1.2", + "version": "29.1.3", "outputs_to_install": [ "out" ], "outputs": { - "out": "/nix/store/38qw6ldsflj4jzvvfm2q7f4i7x1m79n7-docker-29.1.2" + "out": "/nix/store/7d5bpjx5h22nd23j8y0yzr68znkl889i-docker-29.1.3" }, "system": "aarch64-darwin", "group": "toplevel", @@ -215,27 +215,27 @@ { "attr_path": "docker", "broken": false, - "derivation": "/nix/store/wkx6caajwqhf3kqa3krxhhjhaly5qdii-docker-29.1.2.drv", + "derivation": "/nix/store/4ngbxvvps9wby82km759awq15r5yzrfc-docker-29.1.3.drv", "description": "Open source project to pack, ship and run any application as a lightweight container", "install_id": "docker", "license": "Apache-2.0", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "name": "docker-29.1.2", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "name": "docker-29.1.3", "pname": "docker", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:04:23.758715Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:18:01.235525Z", "stabilities": [ "unstable" ], "unfree": false, - "version": "29.1.2", + "version": "29.1.3", "outputs_to_install": [ "out" ], "outputs": { - "out": "/nix/store/qxgaqaqhnfb7772dgkmcp4xs75a78f0s-docker-29.1.2" + "out": "/nix/store/3rbfn7264c1779h42fy3mlvchiqdvnhw-docker-29.1.3" }, "system": "aarch64-linux", "group": "toplevel", @@ -244,27 +244,27 @@ { "attr_path": "docker", "broken": false, - "derivation": "/nix/store/27h214i520jd714li6p1f17m1hivn1qd-docker-29.1.2.drv", + "derivation": "/nix/store/qc00zs0nrr6biidq2y7hvfscabc7s2w6-docker-29.1.3.drv", "description": "Open source project to pack, ship and run any application as a lightweight container", "install_id": "docker", "license": "Apache-2.0", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "name": "docker-29.1.2", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "name": "docker-29.1.3", "pname": "docker", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:14:22.013478Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:34:53.928267Z", "stabilities": [ "unstable" ], "unfree": false, - "version": "29.1.2", + "version": "29.1.3", "outputs_to_install": [ "out" ], "outputs": { - "out": "/nix/store/1ybyvg7fkr64brb6hh33wchw1bwghi93-docker-29.1.2" + "out": "/nix/store/pd1pycln6qcdb4ppiwkcaal39ms4psg7-docker-29.1.3" }, "system": "x86_64-darwin", "group": "toplevel", @@ -273,27 +273,27 @@ { "attr_path": "docker", "broken": false, - "derivation": "/nix/store/yzvczhja3z7khhn9wlljk4wdzxpawzhs-docker-29.1.2.drv", + "derivation": "/nix/store/3acxmqgaic43bzblmr363idpbg6w1f2n-docker-29.1.3.drv", "description": "Open source project to pack, ship and run any application as a lightweight container", "install_id": "docker", "license": "Apache-2.0", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "name": "docker-29.1.2", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "name": "docker-29.1.3", "pname": "docker", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:23:14.441023Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:50:18.860247Z", "stabilities": [ "unstable" ], "unfree": false, - "version": "29.1.2", + "version": "29.1.3", "outputs_to_install": [ "out" ], "outputs": { - "out": "/nix/store/lmapifc86ql4xysybykc37b4wg02f9i5-docker-29.1.2" + "out": "/nix/store/a8gb487kzlvhpikn6c6kc2qhns75mxr7-docker-29.1.3" }, "system": "x86_64-linux", "group": "toplevel", @@ -302,17 +302,17 @@ { "attr_path": "docker-compose", "broken": false, - "derivation": "/nix/store/igx5z67aj5hl3lq8v3ypacc2gfm4jk18-docker-compose-5.0.0.drv", + "derivation": "/nix/store/ci46y3186k193zh8ry4dgd2jiwnxm76a-docker-compose-5.0.0.drv", "description": "Docker CLI plugin to define and run multi-container applications with Docker", "install_id": "docker-compose", "license": "Apache-2.0", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "docker-compose-5.0.0", "pname": "docker-compose", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T02:55:22.776172Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:02:38.681772Z", "stabilities": [ "unstable" ], @@ -322,7 +322,7 @@ "out" ], "outputs": { - "out": "/nix/store/ldj39v5m4l1bfr92j6xpj295j8d9539g-docker-compose-5.0.0" + "out": "/nix/store/npjkwmj05423jpqgsj41j4qwq67l8rnf-docker-compose-5.0.0" }, "system": "aarch64-darwin", "group": "toplevel", @@ -331,17 +331,17 @@ { "attr_path": "docker-compose", "broken": false, - "derivation": "/nix/store/7b8mg7x68rcdfki6gwh7dry5p69gbf0y-docker-compose-5.0.0.drv", + "derivation": "/nix/store/5nh1iqf9rwcmwb14bbzmsyacddkzvs7r-docker-compose-5.0.0.drv", "description": "Docker CLI plugin to define and run multi-container applications with Docker", "install_id": "docker-compose", "license": "Apache-2.0", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "docker-compose-5.0.0", "pname": "docker-compose", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:04:23.759736Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:18:01.236599Z", "stabilities": [ "unstable" ], @@ -351,7 +351,7 @@ "out" ], "outputs": { - "out": "/nix/store/pkm8ap6x893b0k5cbjjzrjm3v0r3rx53-docker-compose-5.0.0" + "out": "/nix/store/i6a35a655w6h4w7gfz90q2hvwvprf0qh-docker-compose-5.0.0" }, "system": "aarch64-linux", "group": "toplevel", @@ -360,17 +360,17 @@ { "attr_path": "docker-compose", "broken": false, - "derivation": "/nix/store/6i342sp0yzqjy28niyhxb7wi0l135zvm-docker-compose-5.0.0.drv", + "derivation": "/nix/store/xhi2ihvdfic6drm8zwfrx14f9hkn9mgh-docker-compose-5.0.0.drv", "description": "Docker CLI plugin to define and run multi-container applications with Docker", "install_id": "docker-compose", "license": "Apache-2.0", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "docker-compose-5.0.0", "pname": "docker-compose", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:14:22.014353Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:34:53.929147Z", "stabilities": [ "unstable" ], @@ -380,7 +380,7 @@ "out" ], "outputs": { - "out": "/nix/store/s2vdri2n6qjx6v55khhhnfkc19a1475m-docker-compose-5.0.0" + "out": "/nix/store/pc3ddvff38q77cymsvc60l1nh374c737-docker-compose-5.0.0" }, "system": "x86_64-darwin", "group": "toplevel", @@ -389,17 +389,17 @@ { "attr_path": "docker-compose", "broken": false, - "derivation": "/nix/store/wjbk2402x98bmhak6zvn275zvvcy8qlk-docker-compose-5.0.0.drv", + "derivation": "/nix/store/2dvv911bfli2xq96r876r6mvi229l10b-docker-compose-5.0.0.drv", "description": "Docker CLI plugin to define and run multi-container applications with Docker", "install_id": "docker-compose", "license": "Apache-2.0", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "docker-compose-5.0.0", "pname": "docker-compose", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:23:14.442110Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:50:18.861323Z", "stabilities": [ "unstable" ], @@ -409,7 +409,7 @@ "out" ], "outputs": { - "out": "/nix/store/wl4806ch41rlswd6mpivbxw7rzxn7llh-docker-compose-5.0.0" + "out": "/nix/store/ph1kdlkisvv6bbnmkslp5i6611aqgm35-docker-compose-5.0.0" }, "system": "x86_64-linux", "group": "toplevel", @@ -418,17 +418,17 @@ { "attr_path": "gh", "broken": false, - "derivation": "/nix/store/wcd8a5qbdvxy111jb0bazg3007yfp2ap-gh-2.83.2.drv", + "derivation": "/nix/store/pq71px0q7ffiw9py1yv06vsdg5vna28k-gh-2.83.2.drv", "description": "GitHub CLI tool", "install_id": "gh", "license": "MIT", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "gh-2.83.2", "pname": "gh", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T02:55:23.260035Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:02:39.145636Z", "stabilities": [ "unstable" ], @@ -447,17 +447,17 @@ { "attr_path": "gh", "broken": false, - "derivation": "/nix/store/aqndxfs2wzlkgqh52pnjmnm685yrqj6f-gh-2.83.2.drv", + "derivation": "/nix/store/ixcdwldr265f6w3f1mz4vhrili4illgr-gh-2.83.2.drv", "description": "GitHub CLI tool", "install_id": "gh", "license": "MIT", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "gh-2.83.2", "pname": "gh", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:04:24.551634Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:18:01.996756Z", "stabilities": [ "unstable" ], @@ -476,17 +476,17 @@ { "attr_path": "gh", "broken": false, - "derivation": "/nix/store/ixnnis12vsrjfrpiimnihkh3f1djgjcn-gh-2.83.2.drv", + "derivation": "/nix/store/390l3ygqwmn5xh7aq08nsyspz0821z9h-gh-2.83.2.drv", "description": "GitHub CLI tool", "install_id": "gh", "license": "MIT", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "gh-2.83.2", "pname": "gh", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:14:22.487793Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:34:54.413838Z", "stabilities": [ "unstable" ], @@ -505,17 +505,17 @@ { "attr_path": "gh", "broken": false, - "derivation": "/nix/store/lh0pmph4z6klrjinfxr594xrlm99kf0r-gh-2.83.2.drv", + "derivation": "/nix/store/agqv8nm0xfbydqcbdxgnx9zg5nkw66hz-gh-2.83.2.drv", "description": "GitHub CLI tool", "install_id": "gh", "license": "MIT", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "gh-2.83.2", "pname": "gh", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:23:15.278194Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:50:19.746078Z", "stabilities": [ "unstable" ], @@ -534,17 +534,17 @@ { "attr_path": "git", "broken": false, - "derivation": "/nix/store/i8h1nzcl046dsdbzpy3zxwjnxvq5lxlr-git-2.51.2.drv", + "derivation": "/nix/store/slg4pl4az46dkgs0nrikw07a54g4nld5-git-2.51.2.drv", "description": "Distributed version control system", "install_id": "git", "license": "GPL-2.0", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "git-2.51.2", "pname": "git", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T02:55:23.294547Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:02:39.175805Z", "stabilities": [ "unstable" ], @@ -564,17 +564,17 @@ { "attr_path": "git", "broken": false, - "derivation": "/nix/store/ljga7ydqa78ia9dkx1wnhlr1vm7v2vcl-git-2.51.2.drv", + "derivation": "/nix/store/zv738s4b3ydr2s86yc6k12ihid02ndi1-git-2.51.2.drv", "description": "Distributed version control system", "install_id": "git", "license": "GPL-2.0", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "git-2.51.2", "pname": "git", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:04:24.596157Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:18:02.041757Z", "stabilities": [ "unstable" ], @@ -595,17 +595,17 @@ { "attr_path": "git", "broken": false, - "derivation": "/nix/store/hbgr5fc5ayq1z5a464qz28i22xbqbxyx-git-2.51.2.drv", + "derivation": "/nix/store/hr9vhpi6km3knm1ym2kf0z9bm7sghj74-git-2.51.2.drv", "description": "Distributed version control system", "install_id": "git", "license": "GPL-2.0", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "git-2.51.2", "pname": "git", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:14:22.518809Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:34:54.445260Z", "stabilities": [ "unstable" ], @@ -625,17 +625,17 @@ { "attr_path": "git", "broken": false, - "derivation": "/nix/store/ji1x98dbd96wm635bm6vzj9bff96rgwj-git-2.51.2.drv", + "derivation": "/nix/store/sbz8kk6zk7ajnf6lavmyazr07wgjmm2d-git-2.51.2.drv", "description": "Distributed version control system", "install_id": "git", "license": "GPL-2.0", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "git-2.51.2", "pname": "git", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:23:15.326356Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:50:19.796142Z", "stabilities": [ "unstable" ], @@ -656,17 +656,17 @@ { "attr_path": "go", "broken": false, - "derivation": "/nix/store/ggsf85dd2jp04vdv8rivxvr77grja1qd-go-1.25.4.drv", + "derivation": "/nix/store/zaq4xq9hw1b7a4azgghhh07cpc1ynmin-go-1.25.4.drv", "description": "Go Programming language", "install_id": "go", "license": "BSD-3-Clause", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "go-1.25.4", "pname": "go", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T02:55:23.408504Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:02:39.290078Z", "stabilities": [ "unstable" ], @@ -685,17 +685,17 @@ { "attr_path": "go", "broken": false, - "derivation": "/nix/store/2fn7f1v6wfxl683jv7clxgp69ziml3h9-go-1.25.4.drv", + "derivation": "/nix/store/hf3knc631mw1pq84qv1hk5jvs467k1v4-go-1.25.4.drv", "description": "Go Programming language", "install_id": "go", "license": "BSD-3-Clause", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "go-1.25.4", "pname": "go", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:04:25.160107Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:18:02.886715Z", "stabilities": [ "unstable" ], @@ -714,17 +714,17 @@ { "attr_path": "go", "broken": false, - "derivation": "/nix/store/f7ycjjcy9j1v2g72py90mm2822bcv316-go-1.25.4.drv", + "derivation": "/nix/store/4bmjpvr4w7cw86fqwi1fcm3dq8z2d5pp-go-1.25.4.drv", "description": "Go Programming language", "install_id": "go", "license": "BSD-3-Clause", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "go-1.25.4", "pname": "go", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:14:22.663458Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:34:54.593400Z", "stabilities": [ "unstable" ], @@ -743,17 +743,17 @@ { "attr_path": "go", "broken": false, - "derivation": "/nix/store/g2d4l3m5bf4308jrc3m7bfz4dcpifyla-go-1.25.4.drv", + "derivation": "/nix/store/zgcfmmah54wp3d2ln1wh9f8ykh4pp8xc-go-1.25.4.drv", "description": "Go Programming language", "install_id": "go", "license": "BSD-3-Clause", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "go-1.25.4", "pname": "go", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:23:15.936835Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:50:20.429117Z", "stabilities": [ "unstable" ], @@ -772,17 +772,17 @@ { "attr_path": "go-task", "broken": false, - "derivation": "/nix/store/pfws48ydzd6m7asd04nj7asz7sm9vzvh-go-task-3.45.5.drv", + "derivation": "/nix/store/6j5568v5g6drvyf7g6l63h79bq1536sq-go-task-3.45.5.drv", "description": "Task runner / simpler Make alternative written in Go", "install_id": "go-task", "license": "MIT", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "go-task-3.45.5", "pname": "go-task", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T02:55:23.427640Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:02:39.309147Z", "stabilities": [ "unstable" ], @@ -801,17 +801,17 @@ { "attr_path": "go-task", "broken": false, - "derivation": "/nix/store/iywp0ipcjmzb9w15k1sp1gi8lnmz60hl-go-task-3.45.5.drv", + "derivation": "/nix/store/rjw95fz6aaczx1yc3g4b8afcqha3vpk6-go-task-3.45.5.drv", "description": "Task runner / simpler Make alternative written in Go", "install_id": "go-task", "license": "MIT", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "go-task-3.45.5", "pname": "go-task", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:04:25.189459Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:18:02.914687Z", "stabilities": [ "unstable" ], @@ -830,17 +830,17 @@ { "attr_path": "go-task", "broken": false, - "derivation": "/nix/store/wnh8gm4ngx4g3zi7bnscmh9c8w2l532c-go-task-3.45.5.drv", + "derivation": "/nix/store/2a4rphy0l4dpnb47jrlfr01hs7xgqgiq-go-task-3.45.5.drv", "description": "Task runner / simpler Make alternative written in Go", "install_id": "go-task", "license": "MIT", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "go-task-3.45.5", "pname": "go-task", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:14:22.682990Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:34:54.613190Z", "stabilities": [ "unstable" ], @@ -859,17 +859,17 @@ { "attr_path": "go-task", "broken": false, - "derivation": "/nix/store/m05d5pm3d1is0gk37n07gp18a91yd92n-go-task-3.45.5.drv", + "derivation": "/nix/store/2hmcc9is241r7lxp3z56i4mrggq2fsfg-go-task-3.45.5.drv", "description": "Task runner / simpler Make alternative written in Go", "install_id": "go-task", "license": "MIT", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "go-task-3.45.5", "pname": "go-task", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:23:15.965786Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:50:20.458321Z", "stabilities": [ "unstable" ], @@ -888,17 +888,17 @@ { "attr_path": "golangci-lint", "broken": false, - "derivation": "/nix/store/w9kiv31x5pnmmdvx9hsgs6lj84frblkj-golangci-lint-2.7.2.drv", + "derivation": "/nix/store/h6hmls6bhy0an6dc8jnnywdp56hyymcw-golangci-lint-2.7.2.drv", "description": "Fast linters Runner for Go", "install_id": "golangci-lint", "license": "GPL-3.0-or-later", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "golangci-lint-2.7.2", "pname": "golangci-lint", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T02:55:23.455796Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:02:39.350318Z", "stabilities": [ "unstable" ], @@ -917,17 +917,17 @@ { "attr_path": "golangci-lint", "broken": false, - "derivation": "/nix/store/cwh52ybsc2j1rs6931dd12d3q43865ky-golangci-lint-2.7.2.drv", + "derivation": "/nix/store/j62j0p76bsd3qxblg777ck3vhffpwijk-golangci-lint-2.7.2.drv", "description": "Fast linters Runner for Go", "install_id": "golangci-lint", "license": "GPL-3.0-or-later", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "golangci-lint-2.7.2", "pname": "golangci-lint", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:04:25.246578Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:18:02.972469Z", "stabilities": [ "unstable" ], @@ -946,17 +946,17 @@ { "attr_path": "golangci-lint", "broken": false, - "derivation": "/nix/store/7glav1ywlkv4ikkydscx4zal1njkj7cn-golangci-lint-2.7.2.drv", + "derivation": "/nix/store/w3ilgwgv52rh1q2xiqg0j68ask5pv4yy-golangci-lint-2.7.2.drv", "description": "Fast linters Runner for Go", "install_id": "golangci-lint", "license": "GPL-3.0-or-later", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "golangci-lint-2.7.2", "pname": "golangci-lint", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:14:22.711807Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:34:54.642695Z", "stabilities": [ "unstable" ], @@ -975,17 +975,17 @@ { "attr_path": "golangci-lint", "broken": false, - "derivation": "/nix/store/j810k8af6sw5ns2qppd27i1yqdi2x6a9-golangci-lint-2.7.2.drv", + "derivation": "/nix/store/5dicahp4k4657qqpdy6rg9kx9pnxdw7j-golangci-lint-2.7.2.drv", "description": "Fast linters Runner for Go", "install_id": "golangci-lint", "license": "GPL-3.0-or-later", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "golangci-lint-2.7.2", "pname": "golangci-lint", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:23:16.024666Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:50:20.519278Z", "stabilities": [ "unstable" ], @@ -1004,17 +1004,17 @@ { "attr_path": "markdownlint-cli", "broken": false, - "derivation": "/nix/store/5jrhyan2742i1471iypls8b0hi9nb0wd-markdownlint-cli-0.47.0.drv", + "derivation": "/nix/store/73fszw0gcb8gyhn0hirynfqssh5q54aw-markdownlint-cli-0.47.0.drv", "description": "Command line interface for MarkdownLint", "install_id": "markdownlint-cli", "license": "MIT", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "markdownlint-cli-0.47.0", "pname": "markdownlint-cli", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T02:55:42.122788Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:02:57.771999Z", "stabilities": [ "unstable" ], @@ -1033,17 +1033,17 @@ { "attr_path": "markdownlint-cli", "broken": false, - "derivation": "/nix/store/56xvwni8pia58xy5r1v2i4zhp9qfngsv-markdownlint-cli-0.47.0.drv", + "derivation": "/nix/store/0r4r41hg9z1458ydx8npr01hmz0cil4g-markdownlint-cli-0.47.0.drv", "description": "Command line interface for MarkdownLint", "install_id": "markdownlint-cli", "license": "MIT", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "markdownlint-cli-0.47.0", "pname": "markdownlint-cli", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:04:56.374686Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:18:33.692952Z", "stabilities": [ "unstable" ], @@ -1062,17 +1062,17 @@ { "attr_path": "markdownlint-cli", "broken": false, - "derivation": "/nix/store/26l8yg4xshh9izrlg0paiqrkwm2m0ygy-markdownlint-cli-0.47.0.drv", + "derivation": "/nix/store/hiiq9sx87y049q4c7ax0sjqfc4wbkmdk-markdownlint-cli-0.47.0.drv", "description": "Command line interface for MarkdownLint", "install_id": "markdownlint-cli", "license": "MIT", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "markdownlint-cli-0.47.0", "pname": "markdownlint-cli", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:14:41.028697Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:35:15.211008Z", "stabilities": [ "unstable" ], @@ -1091,17 +1091,17 @@ { "attr_path": "markdownlint-cli", "broken": false, - "derivation": "/nix/store/k7y4q75kkkyr7d90cn5995zvpv6xr4qh-markdownlint-cli-0.47.0.drv", + "derivation": "/nix/store/81ipx26skxfsf1h8q29my3ssk8578cbb-markdownlint-cli-0.47.0.drv", "description": "Command line interface for MarkdownLint", "install_id": "markdownlint-cli", "license": "MIT", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "markdownlint-cli-0.47.0", "pname": "markdownlint-cli", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:23:49.143555Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:50:53.341105Z", "stabilities": [ "unstable" ], @@ -1120,17 +1120,17 @@ { "attr_path": "nodejs_24", "broken": false, - "derivation": "/nix/store/g9vr8czfgjdjh63k2gl917wkhj5l0ckh-nodejs-24.12.0.drv", + "derivation": "/nix/store/pwss5jv68rh8lm0ck9dmjnwgxhzig8za-nodejs-24.12.0.drv", "description": "Event-driven I/O framework for the V8 JavaScript engine", "install_id": "nodejs", "license": "MIT", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "nodejs-24.12.0", "pname": "nodejs_24", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T02:55:44.997688Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:03:00.481685Z", "stabilities": [ "unstable" ], @@ -1151,17 +1151,17 @@ { "attr_path": "nodejs_24", "broken": false, - "derivation": "/nix/store/qn4xn5j7szjn3c2cwh60fy8rbjjxl9x3-nodejs-24.12.0.drv", + "derivation": "/nix/store/7v2c9x8l1kc7nkwbh0ssrv2jh23lh6wn-nodejs-24.12.0.drv", "description": "Event-driven I/O framework for the V8 JavaScript engine", "install_id": "nodejs", "license": "MIT", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "nodejs-24.12.0", "pname": "nodejs_24", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:05:00.960844Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:18:38.337753Z", "stabilities": [ "unstable" ], @@ -1182,17 +1182,17 @@ { "attr_path": "nodejs_24", "broken": false, - "derivation": "/nix/store/4qca6wg30cpw370vjghp3qca5vp62mmf-nodejs-24.12.0.drv", + "derivation": "/nix/store/kg6jg49pfaamcdn9fps8qa9fn7c8kazf-nodejs-24.12.0.drv", "description": "Event-driven I/O framework for the V8 JavaScript engine", "install_id": "nodejs", "license": "MIT", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "nodejs-24.12.0", "pname": "nodejs_24", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:14:43.737019Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:35:18.119782Z", "stabilities": [ "unstable" ], @@ -1213,17 +1213,17 @@ { "attr_path": "nodejs_24", "broken": false, - "derivation": "/nix/store/wbcxi5kclddbrlfxk9lafzq3y72yiq3z-nodejs-24.12.0.drv", + "derivation": "/nix/store/8i411df8xvgnr6ywybybdpk4q7g9b0yk-nodejs-24.12.0.drv", "description": "Event-driven I/O framework for the V8 JavaScript engine", "install_id": "nodejs", "license": "MIT", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "nodejs-24.12.0", "pname": "nodejs_24", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:23:54.151665Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:50:58.239991Z", "stabilities": [ "unstable" ], @@ -1244,17 +1244,17 @@ { "attr_path": "pre-commit", "broken": false, - "derivation": "/nix/store/nc5925yqybsr931w8r8n6rc6cmjy2a42-pre-commit-4.5.1.drv", + "derivation": "/nix/store/braikg8xlq4q44rg7f28l6kw1v6n64rr-pre-commit-4.5.1.drv", "description": "Framework for managing and maintaining multi-language pre-commit hooks", "install_id": "pre-commit", "license": "MIT", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "pre-commit-4.5.1", "pname": "pre-commit", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T02:56:00.570682Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:03:15.319953Z", "stabilities": [ "unstable" ], @@ -1274,17 +1274,17 @@ { "attr_path": "pre-commit", "broken": false, - "derivation": "/nix/store/3mjpx2jhdr8rqfcgm8fy86rb5khd2948-pre-commit-4.5.1.drv", + "derivation": "/nix/store/izx8smpbdhvs7820blm4694r1vvx7mgz-pre-commit-4.5.1.drv", "description": "Framework for managing and maintaining multi-language pre-commit hooks", "install_id": "pre-commit", "license": "MIT", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "pre-commit-4.5.1", "pname": "pre-commit", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:05:24.119765Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:19:01.149297Z", "stabilities": [ "unstable" ], @@ -1304,17 +1304,17 @@ { "attr_path": "pre-commit", "broken": false, - "derivation": "/nix/store/jrxqckn5wvpdfis4saxq7a4bickhb359-pre-commit-4.5.1.drv", + "derivation": "/nix/store/a3lzhys5b1d2yd82bn4fdz6id1n0av2x-pre-commit-4.5.1.drv", "description": "Framework for managing and maintaining multi-language pre-commit hooks", "install_id": "pre-commit", "license": "MIT", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "pre-commit-4.5.1", "pname": "pre-commit", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:14:58.343249Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:35:34.047241Z", "stabilities": [ "unstable" ], @@ -1334,17 +1334,17 @@ { "attr_path": "pre-commit", "broken": false, - "derivation": "/nix/store/ikyygn4p1vb1wssi0xdc25djwpnqp9qm-pre-commit-4.5.1.drv", + "derivation": "/nix/store/gih7nyf59lf01gmdyrmqnjvg1mh8hnj8-pre-commit-4.5.1.drv", "description": "Framework for managing and maintaining multi-language pre-commit hooks", "install_id": "pre-commit", "license": "MIT", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "pre-commit-4.5.1", "pname": "pre-commit", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:24:17.311623Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:51:20.575927Z", "stabilities": [ "unstable" ], @@ -1364,17 +1364,17 @@ { "attr_path": "ripgrep", "broken": false, - "derivation": "/nix/store/vkifhd68s1djr7isam3h3afc139lk3rq-ripgrep-15.1.0.drv", + "derivation": "/nix/store/956pccmd4255xhvxskgwb8f1h6x6p163-ripgrep-15.1.0.drv", "description": "Utility that combines the usability of The Silver Searcher with the raw speed of grep", "install_id": "ripgrep", "license": "[ Unlicense, MIT ]", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "ripgrep-15.1.0", "pname": "ripgrep", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T02:56:47.388155Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:03:59.183288Z", "stabilities": [ "unstable" ], @@ -1393,17 +1393,17 @@ { "attr_path": "ripgrep", "broken": false, - "derivation": "/nix/store/jlwp62vcrqzswyn6ng8iajl8mbfya6h7-ripgrep-15.1.0.drv", + "derivation": "/nix/store/6vb16q3qvk7nyi9q9pgyb25qsqzhmz3d-ripgrep-15.1.0.drv", "description": "Utility that combines the usability of The Silver Searcher with the raw speed of grep", "install_id": "ripgrep", "license": "[ Unlicense, MIT ]", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "ripgrep-15.1.0", "pname": "ripgrep", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:06:24.500444Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:20:03.617684Z", "stabilities": [ "unstable" ], @@ -1422,17 +1422,17 @@ { "attr_path": "ripgrep", "broken": false, - "derivation": "/nix/store/w7cv010yn6g5n66yskvvyip46az383pw-ripgrep-15.1.0.drv", + "derivation": "/nix/store/mlwpjfmbk5xc0xydkip5qhpcmah6mqpa-ripgrep-15.1.0.drv", "description": "Utility that combines the usability of The Silver Searcher with the raw speed of grep", "install_id": "ripgrep", "license": "[ Unlicense, MIT ]", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "ripgrep-15.1.0", "pname": "ripgrep", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:15:42.196608Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:36:22.097469Z", "stabilities": [ "unstable" ], @@ -1451,23 +1451,24 @@ { "attr_path": "ripgrep", "broken": false, - "derivation": "/nix/store/imlwp0rk9zd0wyciwx79cgyd7j9p2n50-ripgrep-15.1.0.drv", + "derivation": "/nix/store/3hghmkqrjfsq5v96m603m7k5vq836q1g-ripgrep-15.1.0.drv", "description": "Utility that combines the usability of The Silver Searcher with the raw speed of grep", "install_id": "ripgrep", "license": "[ Unlicense, MIT ]", - "locked_url": "https://github.com/flox/nixpkgs?rev=a6531044f6d0bef691ea18d4d4ce44d0daa6e816", + "locked_url": "https://github.com/flox/nixpkgs?rev=c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "name": "ripgrep-15.1.0", "pname": "ripgrep", - "rev": "a6531044f6d0bef691ea18d4d4ce44d0daa6e816", - "rev_count": 914755, - "rev_date": "2025-12-21T09:35:49Z", - "scrape_date": "2025-12-23T03:25:19.892752Z", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev_count": 917670, + "rev_date": "2025-12-28T06:08:05Z", + "scrape_date": "2025-12-29T03:52:19.602003Z", "stabilities": [ "unstable" ], "unfree": false, "version": "15.1.0", "outputs_to_install": [ + "out", "out" ], "outputs": { diff --git a/.flox/env/manifest.toml b/.flox/env/manifest.toml index f160c4ac..aabc84e0 100644 --- a/.flox/env/manifest.toml +++ b/.flox/env/manifest.toml @@ -29,7 +29,7 @@ ripgrep.version = "^15.1.0" markdownlint-cli.pkg-path = "markdownlint-cli" markdownlint-cli.version = "^0.47.0" claude-code.pkg-path = "claude-code" -claude-code.version = "^2.0.74" +claude-code.version = "^2.0.76" docker.pkg-path = "docker" docker.version = "^29.1.2" docker-compose.pkg-path = "docker-compose" diff --git a/.github/workflows/artifacts.yml b/.github/workflows/artifacts.yml index 8b24adf5..8e64b331 100644 --- a/.github/workflows/artifacts.yml +++ b/.github/workflows/artifacts.yml @@ -56,7 +56,7 @@ jobs: echo "commit=$COMMIT" >> $GITHUB_OUTPUT echo "date=$DATE" >> $GITHUB_OUTPUT - - name: Build binary (Linux portable - no CGO/SQLite for maximum compatibility) + - name: Build binary (Linux portable - pure Go, no CGO dependencies) if: matrix.goos == 'linux' run: | docker run --rm \ @@ -66,7 +66,7 @@ jobs: golang:1.25-alpine3.23 \ sh -c "go build -ldflags '-w -s -X github.com/inference-gateway/cli/cmd.version=${{ steps.version.outputs.version }} -X github.com/inference-gateway/cli/cmd.commit=${{ steps.version.outputs.commit }} -X github.com/inference-gateway/cli/cmd.date=${{ steps.version.outputs.date }}' -o infer-${{ matrix.goos }}-${{ matrix.goarch }} ." - - name: Build binary (macOS native with CGO for clipboard support) + - name: Build binary (macOS with CGO for clipboard image support) if: matrix.goos == 'darwin' env: CGO_ENABLED: ${{ matrix.cgo }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 846ba5bd..7b45b7e3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -97,17 +97,9 @@ jobs: go-version-file: 'go.mod' cache: true - - name: Install build dependencies - run: | - sudo apt-get update - sudo apt-get install -y gcc libsqlite3-dev - - name: Build project - env: - CGO_ENABLED: 1 run: | go build \ - -tags libsqlite3 \ -ldflags "\ -w -s \ -X github.com/inference-gateway/cli/cmd.version=${{ github.ref_name }} \ @@ -129,12 +121,5 @@ jobs: go-version-file: 'go.mod' cache: true - - name: Install build dependencies - run: | - sudo apt-get update - sudo apt-get install -y gcc libsqlite3-dev - - name: Run tests - env: - CGO_ENABLED: 1 - run: go test -tags libsqlite3 ./... + run: go test ./... diff --git a/.infer/config.yaml b/.infer/config.yaml index 3f39fa63..d24ab414 100644 --- a/.infer/config.yaml +++ b/.infer/config.yaml @@ -249,6 +249,12 @@ agent: - If accepted, YOU will execute this plan. Make it specific and actionable! - Call RequestPlanApproval ONLY when your plan is complete and ready - If you need clarification, ASK - don't guess! + system_prompt_remote: |- + Remote system administration agent. You are operating on a remote machine via SSH. + + FOCUS: System operations, service management, monitoring, diagnostics, and infrastructure tasks. + + CONTEXT: This is a shared system environment, not a project workspace. Users may be managing servers, containers, services, or general infrastructure. system_reminders: enabled: true interval: 4 @@ -625,3 +631,10 @@ web: port: 3000 host: localhost session_inactivity_mins: 5 + ssh: + enabled: false + use_ssh_config: true + known_hosts_path: ~/.ssh/known_hosts + auto_install: true + install_version: latest + servers: [] diff --git a/CHANGELOG.md b/CHANGELOG.md index 52c81f55..bc5db5dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,62 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.95.0-rc.5](https://github.com/inference-gateway/cli/compare/v0.95.0-rc.4...v0.95.0-rc.5) (2026-01-01) + +### ๐Ÿš€ Features + +* Add remote system administration support ([6f4751c](https://github.com/inference-gateway/cli/commit/6f4751cba152f045b657f7060281edb601eb2604)) + +### ๐Ÿงน Maintenance + +* Add label to the tab to indicate what server is the session connected to ([568ed5d](https://github.com/inference-gateway/cli/commit/568ed5db21532f99b7df774316e0b7b25782a915)) +* Bump cli version ([8788cd1](https://github.com/inference-gateway/cli/commit/8788cd1fc50292128577ba4e4dda09cf79d11ab7)) + +## [0.95.0-rc.4](https://github.com/inference-gateway/cli/compare/v0.95.0-rc.3...v0.95.0-rc.4) (2026-01-01) + +### ๐Ÿ› Bug Fixes + +* Use remote instance ([c382662](https://github.com/inference-gateway/cli/commit/c382662ca77d183e1f8c1c131a5eb0215cece2d8)) + +## [0.95.0-rc.3](https://github.com/inference-gateway/cli/compare/v0.95.0-rc.2...v0.95.0-rc.3) (2026-01-01) + +### ๐Ÿ› Bug Fixes + +* Connect to remote gateway instance when installing on remote instance ([4ba6019](https://github.com/inference-gateway/cli/commit/4ba60193e94a1a32a240fb908e8f9a87a1a3f14d)) + +### ๐Ÿงน Maintenance + +* **deps:** Bump CLI version ([e2be346](https://github.com/inference-gateway/cli/commit/e2be346c91526f56abaa0c6a0bf777ee80ff3de4)) + +## [0.95.0-rc.2](https://github.com/inference-gateway/cli/compare/v0.95.0-rc.1...v0.95.0-rc.2) (2026-01-01) + +### โ™ป๏ธ Code Refactoring + +* Simplify the sqlite deps ([70c0df4](https://github.com/inference-gateway/cli/commit/70c0df46312136754eb0c21a6ef7e43953445edb)) + +### ๐Ÿงน Maintenance + +* **deps:** Bump claude-code version ([09c8610](https://github.com/inference-gateway/cli/commit/09c861065f3677435dfce0055c7ea1b1304c7914)) +* **deps:** Bump docker compose cli version ([d28000c](https://github.com/inference-gateway/cli/commit/d28000c9d994441406446b8e517c4c6190cdaabb)) +* Test the CLI ([2936b04](https://github.com/inference-gateway/cli/commit/2936b040cad9c5d211b10f1506deceae965d3945)) + +## [0.95.0-rc.1](https://github.com/inference-gateway/cli/compare/v0.94.0...v0.95.0-rc.1) (2025-12-31) + +### ๐Ÿš€ Features + +* Add SSH remote terminal support to web interface ([41614cf](https://github.com/inference-gateway/cli/commit/41614cfccf513205efa6bf45406a9367c144a0cd)) + +### ๐Ÿ› Bug Fixes + +* Update ADK to v0.17.0 and fix API compatibility issues ([7450b5b](https://github.com/inference-gateway/cli/commit/7450b5b50923e98253760aa380d83df1c62c3336)) + +### ๐Ÿงน Maintenance + +* **deps:** bump github.com/creack/pty from 1.1.18 to 1.1.24 ([#354](https://github.com/inference-gateway/cli/issues/354)) ([a1c1daf](https://github.com/inference-gateway/cli/commit/a1c1daf50417da51a411f3a31dcbae537d3c3639)) +* **deps:** Bump github.com/gorilla/websocket from 1.5.0 to 1.5.3 ([#353](https://github.com/inference-gateway/cli/issues/353)) ([6953bf1](https://github.com/inference-gateway/cli/commit/6953bf101327f060603a49a5f7966a7609faa498)) +* Cleanup comments ([68e9075](https://github.com/inference-gateway/cli/commit/68e90754cb88de40dc38e514f769aece121ce084)) +* Cleanup IDE diagnostic warnings ([ae815b2](https://github.com/inference-gateway/cli/commit/ae815b25308d49b35b3ab84edc80b4638cb1eb21)) + ## [0.94.0](https://github.com/inference-gateway/cli/compare/v0.93.0...v0.94.0) (2025-12-23) ### ๐Ÿš€ Features diff --git a/CLAUDE.md b/CLAUDE.md index 9dabe980..46366f07 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -13,7 +13,7 @@ The project uses Clean Architecture with domain-driven design patterns. ### Development Commands ```bash -# Build the binary +# Build the binary (pure Go, no CGO required) task build # Run all tests @@ -33,6 +33,9 @@ task check # Complete development workflow (format, build, test) task dev + +# Verify dependencies +task verify:deps ``` ### Module Management @@ -715,7 +718,7 @@ Key third-party libraries: - **Lipgloss**: Styling for terminal output - **go-redis**: Redis client for storage backend - **lib/pq**: PostgreSQL driver -- **modernc.org/sqlite**: CGO-free SQLite driver +- **modernc.org/sqlite**: Pure Go SQLite driver (no CGO required) - **metoro-io/mcp-golang**: MCP (Model Context Protocol) client library ## Development Environment diff --git a/Taskfile.yml b/Taskfile.yml index 1a4accba..85033627 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -19,13 +19,7 @@ tasks: build: desc: Build the CLI binary cmds: - - | - if ! command -v gcc >/dev/null 2>&1 && ! command -v clang >/dev/null 2>&1; then - echo "ERROR: C compiler not found. Required for SQLite support." - echo "Install: build-essential (Linux) or Xcode CLI Tools (macOS)" - exit 1 - fi - - CGO_ENABLED=1 go build -tags libsqlite3 -ldflags "-w -s -X github.com/inference-gateway/cli/cmd.version={{.VERSION}} -X github.com/inference-gateway/cli/cmd.commit={{.COMMIT}} -X github.com/inference-gateway/cli/cmd.date={{.DATE}}" -o {{.BINARY_NAME}} {{.MAIN_PACKAGE}} + - go build -ldflags "-w -s -X github.com/inference-gateway/cli/cmd.version={{.VERSION}} -X github.com/inference-gateway/cli/cmd.commit={{.COMMIT}} -X github.com/inference-gateway/cli/cmd.date={{.DATE}}" -o {{.BINARY_NAME}} {{.MAIN_PACKAGE}} sources: - "**/*.go" - go.mod @@ -36,7 +30,7 @@ tasks: install: desc: Install the CLI from source cmds: - - CGO_ENABLED=1 go build -tags libsqlite3 -ldflags "-w -s -X github.com/inference-gateway/cli/cmd.version={{.VERSION}} -X github.com/inference-gateway/cli/cmd.commit={{.COMMIT}} -X github.com/inference-gateway/cli/cmd.date={{.DATE}}" -o $(go env GOPATH)/bin/{{.BINARY_NAME}} {{.MAIN_PACKAGE}} + - go build -ldflags "-w -s -X github.com/inference-gateway/cli/cmd.version={{.VERSION}} -X github.com/inference-gateway/cli/cmd.commit={{.COMMIT}} -X github.com/inference-gateway/cli/cmd.date={{.DATE}}" -o $(go env GOPATH)/bin/{{.BINARY_NAME}} {{.MAIN_PACKAGE}} clean: desc: Clean build artifacts @@ -47,17 +41,17 @@ tasks: test: desc: Run all tests cmds: - - CGO_ENABLED=1 go test -tags libsqlite3 ./... + - go test ./... test:verbose: desc: Run tests with verbose output cmds: - - CGO_ENABLED=1 go test -tags libsqlite3 -v ./... + - go test -v ./... test:coverage: desc: Run tests with coverage report cmds: - - CGO_ENABLED=1 go test -tags libsqlite3 -cover ./... + - go test -cover ./... lint: desc: Run linter (requires golangci-lint) @@ -85,35 +79,18 @@ tasks: cmds: - go mod download - verify:cgo: - desc: Verify CGO and SQLite dependencies + verify:deps: + desc: Verify Go dependencies cmds: - | - echo "Checking C compiler..." - if command -v gcc >/dev/null 2>&1; then - echo "โœ“ GCC found: $(gcc --version | head -n1)" - elif command -v clang >/dev/null 2>&1; then - echo "โœ“ Clang found: $(clang --version | head -n1)" - else - echo "โœ— No C compiler found" - echo "Install: build-essential (Linux) or Xcode CLI Tools (macOS)" - exit 1 - fi - - echo "Checking SQLite library..." - if pkg-config --exists sqlite3 2>/dev/null; then - echo "โœ“ SQLite found: $(pkg-config --modversion sqlite3)" - else - echo "โš  SQLite not detected via pkg-config (may still work if installed)" - fi - - echo "Checking CGO..." - CGO_STATUS=$(go env CGO_ENABLED) - if [ "$CGO_STATUS" = "1" ]; then - echo "โœ“ CGO enabled" - else - echo "โš  CGO disabled (will be enabled for build tasks)" - fi + echo "Checking Go version..." + go version + echo "" + echo "Checking dependencies..." + go mod verify + echo "โœ“ All dependencies verified" + echo "" + echo "Note: This CLI uses pure Go dependencies (no CGO required)" run: desc: Run the CLI locally @@ -151,18 +128,15 @@ tasks: - test release:build: - desc: Build release binary for current platform only (multi-platform builds use GitHub Actions with native runners) + desc: Build release binary for current platform only cmds: - mkdir -p dist - | - echo "Building for native platform only..." + echo "Building for native platform..." GOOS=$(go env GOOS) GOARCH=$(go env GOARCH) - CGO_ENABLED=1 go build -tags libsqlite3 -ldflags "-w -s -X github.com/inference-gateway/cli/cmd.version={{.VERSION}} -X github.com/inference-gateway/cli/cmd.commit={{.COMMIT}} -X github.com/inference-gateway/cli/cmd.date={{.DATE}}" -o dist/{{.BINARY_NAME}}-${GOOS}-${GOARCH} {{.MAIN_PACKAGE}} + go build -ldflags "-w -s -X github.com/inference-gateway/cli/cmd.version={{.VERSION}} -X github.com/inference-gateway/cli/cmd.commit={{.COMMIT}} -X github.com/inference-gateway/cli/cmd.date={{.DATE}}" -o dist/{{.BINARY_NAME}}-${GOOS}-${GOARCH} {{.MAIN_PACKAGE}} echo "โœ“ Built dist/{{.BINARY_NAME}}-${GOOS}-${GOARCH}" - echo "" - echo "Note: Cross-platform builds with dynamic SQLite linking require native runners." - echo "Use GitHub Actions for multi-platform releases." - cd dist && sha256sum {{.BINARY_NAME}}-* > checksums.txt - | if command -v cosign >/dev/null 2>&1; then @@ -173,23 +147,23 @@ tasks: fi release:build:darwin: - desc: Build macOS binary with CGO enabled (for clipboard image support) + desc: Build macOS binary vars: GOARCH: sh: go env GOARCH cmds: - mkdir -p dist - - CGO_ENABLED=1 GOOS=darwin GOARCH={{.GOARCH}} go build -tags libsqlite3 -ldflags "-w -s -X github.com/inference-gateway/cli/cmd.version={{.VERSION}} -X github.com/inference-gateway/cli/cmd.commit={{.COMMIT}} -X github.com/inference-gateway/cli/cmd.date={{.DATE}}" -o dist/{{.BINARY_NAME}}-darwin-{{.GOARCH}} {{.MAIN_PACKAGE}} + - GOOS=darwin GOARCH={{.GOARCH}} go build -ldflags "-w -s -X github.com/inference-gateway/cli/cmd.version={{.VERSION}} -X github.com/inference-gateway/cli/cmd.commit={{.COMMIT}} -X github.com/inference-gateway/cli/cmd.date={{.DATE}}" -o dist/{{.BINARY_NAME}}-darwin-{{.GOARCH}} {{.MAIN_PACKAGE}} release:build:linux: - desc: Build portable Linux binary using Docker (no CGO/SQLite for maximum compatibility) + desc: Build portable Linux binary using Docker vars: GOARCH: sh: go env GOARCH cmds: - mkdir -p dist - | - echo "Building portable Linux binary using Docker (no SQLite dependencies)..." + echo "Building portable Linux binary using Docker..." docker run --rm \ -v "{{.PWD}}":/build \ -w /build \ @@ -198,7 +172,7 @@ tasks: go build \ -ldflags "-w -s -X github.com/inference-gateway/cli/cmd.version={{.VERSION}} -X github.com/inference-gateway/cli/cmd.commit={{.COMMIT}} -X github.com/inference-gateway/cli/cmd.date={{.DATE}}" \ -o dist/{{.BINARY_NAME}}-linux-{{.GOARCH}} .' - echo "โœ“ Built portable dist/{{.BINARY_NAME}}-linux-{{.GOARCH}} (JSONL/Redis/PostgreSQL support, no SQLite)" + echo "โœ“ Built portable dist/{{.BINARY_NAME}}-linux-{{.GOARCH}} (pure Go, all storage backends supported)" container:build: desc: Build container image locally for testing diff --git a/config/config.go b/config/config.go index db7be42d..512978b9 100644 --- a/config/config.go +++ b/config/config.go @@ -311,6 +311,7 @@ type AgentConfig struct { Model string `yaml:"model" mapstructure:"model"` SystemPrompt string `yaml:"system_prompt" mapstructure:"system_prompt"` SystemPromptPlan string `yaml:"system_prompt_plan" mapstructure:"system_prompt_plan"` + SystemPromptRemote string `yaml:"system_prompt_remote" mapstructure:"system_prompt_remote"` SystemReminders SystemRemindersConfig `yaml:"system_reminders" mapstructure:"system_reminders"` VerboseTools bool `yaml:"verbose_tools" mapstructure:"verbose_tools"` MaxTurns int `yaml:"max_turns" mapstructure:"max_turns"` @@ -806,6 +807,11 @@ EXAMPLE: Now I'll create a pull request Github(...) `, + SystemPromptRemote: `Remote system administration agent. You are operating on a remote machine via SSH. + +FOCUS: System operations, service management, monitoring, diagnostics, and infrastructure tasks. + +CONTEXT: This is a shared system environment, not a project workspace. Users may be managing servers, containers, services, or general infrastructure.`, SystemReminders: SystemRemindersConfig{ Enabled: true, Interval: 4, @@ -1071,6 +1077,9 @@ func (c *Config) GetTimeout() int { } func (c *Config) GetSystemPrompt() string { + if os.Getenv("INFER_REMOTE_MANAGED") == "true" && c.Agent.SystemPromptRemote != "" { + return c.Agent.SystemPromptRemote + } return c.Agent.SystemPrompt } diff --git a/examples/web-terminal/README.md b/examples/web-terminal/README.md index 773582d5..8cb53cf1 100644 --- a/examples/web-terminal/README.md +++ b/examples/web-terminal/README.md @@ -23,10 +23,11 @@ docker compose up -d Open -You'll see a dropdown with two options: +You'll see a dropdown with three options: - **Local** - Runs `infer chat` locally in the container -- **Remote Ubuntu Server** - Connects via SSH to demonstrate auto-install +- **Remote Ubuntu Server** - Ubuntu 24.04 server with SSH (demonstrates auto-install) +- **Remote Alpine Server** - Alpine 3.23.0 server with SSH (demonstrates lightweight distribution) ## What's Running @@ -36,6 +37,7 @@ When you run `docker compose up`, it starts: 2. **web-terminal** - Web UI server on port 3000 3. **inference-gateway** - Gateway for local mode 4. **remote-ubuntu** - Ubuntu 24.04 server with SSH (for demo) +5. **remote-alpine** - Alpine 3.23.0 server with SSH (for demo) All services are connected on the `infer-network` Docker network. @@ -50,15 +52,17 @@ All services are connected on the `infer-network` Docker network. ### Remote SSH Mode -1. Select "Remote Ubuntu Server" from the dropdown +1. Select "Remote Ubuntu Server" or "Remote Alpine Server" from the dropdown 2. Click "+ New Tab" -3. Web terminal connects to remote-ubuntu via SSH +3. Web terminal connects to the selected remote server via SSH 4. Authenticates using automatically generated SSH keys 5. **Auto-installer runs** (first connection only): - Detects `infer` is not installed - Identifies OS and architecture (linux/arm64 or linux/amd64) - Downloads **portable binary** from GitHub releases (CGO-free, no SQLite dependencies) - Installs to `/home/developer/bin/infer` + - Runs `infer init --userspace` to initialize configuration + - Configures environment variables to connect to the shared gateway - Starts `infer chat` on the remote server 6. Terminal shows remote session output @@ -79,18 +83,33 @@ web: install_version: "latest" servers: - - name: "Local" - id: "local" - description: "Run infer chat locally in this container" - - name: "Remote Ubuntu Server" id: "remote-ubuntu" remote_host: "remote-ubuntu" remote_user: "developer" remote_port: 22 command_path: "/home/developer/bin/infer" + install_path: "/home/developer/bin/infer" auto_install: true description: "Ubuntu 24.04 server (demonstrates auto-install via SSH)" + tags: + - remote + - demo + - ubuntu + + - name: "Remote Alpine Server" + id: "remote-alpine" + remote_host: "remote-alpine" + remote_user: "developer" + remote_port: 22 + command_path: "/home/developer/bin/infer" + install_path: "/home/developer/bin/infer" + auto_install: true + description: "Alpine 3.23.0 server (demonstrates lightweight Linux distribution)" + tags: + - remote + - demo + - alpine ``` ### Adding Your Own Remote Servers @@ -189,7 +208,7 @@ Check logs: ```bash docker compose logs web-terminal -docker compose logs remote-ubuntu +docker compose logs remote-ubuntu # or remote-alpine ``` Common issues: @@ -204,10 +223,10 @@ Verify: ```bash # Check remote server logs -docker compose logs remote-ubuntu +docker compose logs remote-ubuntu # or remote-alpine # Test manual SSH connection -docker exec -it infer-web-terminal ssh developer@remote-ubuntu +docker exec -it infer-web-terminal ssh developer@remote-ubuntu # or developer@remote-alpine ``` Common issues: @@ -241,7 +260,8 @@ Common issues: ## Next Steps -- Try both Local and Remote modes in the dropdown +- Try all three modes in the dropdown (Local, Ubuntu, Alpine) - Watch the auto-install process on first remote connection +- Compare behavior across different Linux distributions (Ubuntu vs Alpine) - Add your own remote servers to `config.yaml` - Explore multi-server tab management in the UI diff --git a/examples/web-terminal/config.yaml b/examples/web-terminal/config.yaml index 60fd38ff..a9f76381 100644 --- a/examples/web-terminal/config.yaml +++ b/examples/web-terminal/config.yaml @@ -4,7 +4,6 @@ web: port: 3000 session_inactivity_mins: 30 - # Global SSH settings ssh: enabled: true use_ssh_config: true @@ -12,8 +11,6 @@ web: auto_install: true install_version: "latest" - # List of available servers (shown in dropdown) - # Note: "Local" is always available by default, no need to define it here servers: - name: "Remote Ubuntu Server" id: "remote-ubuntu" @@ -24,4 +21,21 @@ web: install_path: "/home/developer/bin/infer" auto_install: true description: "Ubuntu 24.04 server (demonstrates auto-install via SSH)" - tags: ["remote", "demo", "ubuntu"] + tags: + - remote + - demo + - ubuntu + + - name: "Remote Alpine Server" + id: "remote-alpine" + remote_host: "remote-alpine" + remote_user: "developer" + remote_port: 22 + command_path: "/home/developer/bin/infer" + install_path: "/home/developer/bin/infer" + auto_install: true + description: "Alpine 3.23.0 server (demonstrates lightweight Linux distribution)" + tags: + - remote + - demo + - alpine diff --git a/examples/web-terminal/docker-compose.yml b/examples/web-terminal/docker-compose.yml index 302a4522..d91585b3 100644 --- a/examples/web-terminal/docker-compose.yml +++ b/examples/web-terminal/docker-compose.yml @@ -20,7 +20,7 @@ services: - ./.ssh-keys:/keys web-terminal: - image: ghcr.io/inference-gateway/cli:local + image: ghcr.io/inference-gateway/cli:latest command: - chat - --web @@ -47,8 +47,6 @@ services: inference-gateway: image: ghcr.io/inference-gateway/inference-gateway:latest - ports: - - "8080:8080" environment: ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY} CLOUDFLARE_API_KEY: ${CLOUDFLARE_API_KEY} @@ -68,7 +66,7 @@ services: - sh - -c - | - apt-get update && apt-get install -y openssh-server sudo curl musl libsqlite3-0 + apt-get update && apt-get install -y openssh-server sudo curl mkdir -p /run/sshd useradd -m -s /bin/bash developer echo 'developer ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers @@ -88,6 +86,48 @@ services: depends_on: ssh-keygen: condition: service_completed_successfully + inference-gateway: + condition: service_started + networks: + - infer-network + restart: unless-stopped + + remote-alpine: + image: alpine:3.23.0 + command: + - sh + - -c + - | + apk add --no-cache openssh-server sudo curl bash + ssh-keygen -A + + sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config + sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config + sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config + + adduser -D -s /bin/bash developer + passwd -u developer + echo 'developer ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers + mkdir -p /home/developer/.ssh + + if [ -f /ssh-keys/id_rsa.pub ]; then + cat /ssh-keys/id_rsa.pub > /home/developer/.ssh/authorized_keys + chown -R developer:developer /home/developer/.ssh + chmod 700 /home/developer/.ssh + chmod 600 /home/developer/.ssh/authorized_keys + echo "โœ“ SSH public key installed for developer user" + else + echo "โœ— No SSH public key found in /ssh-keys/" + fi + + /usr/sbin/sshd -D -e + volumes: + - ./.ssh-keys:/ssh-keys:ro + depends_on: + ssh-keygen: + condition: service_completed_successfully + inference-gateway: + condition: service_started networks: - infer-network restart: unless-stopped diff --git a/go.mod b/go.mod index 23828b1e..07954ad9 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,6 @@ require ( github.com/inference-gateway/sdk v1.14.1 github.com/ledongthuc/pdf v0.0.0-20250511090121-5959a4027728 github.com/lib/pq v1.10.9 - github.com/mattn/go-sqlite3 v1.14.32 github.com/metoro-io/mcp-golang v0.16.0 github.com/muesli/reflow v0.3.0 github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 @@ -30,6 +29,7 @@ require ( golang.org/x/crypto v0.46.0 golang.org/x/image v0.34.0 gopkg.in/yaml.v3 v3.0.1 + modernc.org/sqlite v1.42.2 ) require ( @@ -50,6 +50,7 @@ require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/dlclark/regexp2 v1.11.0 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/go-resty/resty/v2 v2.16.5 // indirect @@ -70,10 +71,12 @@ require ( github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect github.com/muesli/cancelreader v0.2.2 // indirect github.com/muesli/termenv v0.16.0 // indirect + github.com/ncruces/go-strftime v0.1.9 // indirect github.com/oapi-codegen/runtime v1.1.2 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/sagikazarmark/locafero v0.11.0 // indirect github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect @@ -100,4 +103,7 @@ require ( golang.org/x/term v0.38.0 // indirect golang.org/x/text v0.32.0 // indirect golang.org/x/tools v0.39.0 // indirect + modernc.org/libc v1.66.10 // indirect + modernc.org/mathutil v1.7.1 // indirect + modernc.org/memory v1.11.0 // indirect ) diff --git a/go.sum b/go.sum index 90278f8b..3592cb76 100644 --- a/go.sum +++ b/go.sum @@ -61,6 +61,8 @@ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/r github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= @@ -90,6 +92,8 @@ github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PU github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs= +github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= @@ -133,8 +137,6 @@ github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+Ei github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.14.32 h1:JD12Ag3oLy1zQA+BNn74xRgaBbdhbNIDYvQUEuuErjs= -github.com/mattn/go-sqlite3 v1.14.32/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/maxbrunsfeld/counterfeiter/v6 v6.11.3 h1:Eaq36EIyJNp7b3qDhjV7jmDVq/yPeW2v4pTqzGbOGB4= github.com/maxbrunsfeld/counterfeiter/v6 v6.11.3/go.mod h1:6KKUoQBZBW6PDXJtNfqeEjPXMj/ITTk+cWK9t9uS5+E= github.com/metoro-io/mcp-golang v0.16.0 h1:7NrP8Hca4IDLipPitZaTClzmN8uQcQWX8IsziXU813Y= @@ -154,6 +156,8 @@ github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc= github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= +github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oapi-codegen/runtime v1.1.2 h1:P2+CubHq8fO4Q6fV1tqDBZHCwpVpvPg7oKiYzQgXIyI= @@ -169,6 +173,8 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= @@ -278,3 +284,29 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWD gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +modernc.org/cc/v4 v4.26.5 h1:xM3bX7Mve6G8K8b+T11ReenJOT+BmVqQj0FY5T4+5Y4= +modernc.org/cc/v4 v4.26.5/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= +modernc.org/ccgo/v4 v4.28.1 h1:wPKYn5EC/mYTqBO373jKjvX2n+3+aK7+sICCv4Fjy1A= +modernc.org/ccgo/v4 v4.28.1/go.mod h1:uD+4RnfrVgE6ec9NGguUNdhqzNIeeomeXf6CL0GTE5Q= +modernc.org/fileutil v1.3.40 h1:ZGMswMNc9JOCrcrakF1HrvmergNLAmxOPjizirpfqBA= +modernc.org/fileutil v1.3.40/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc= +modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= +modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= +modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks= +modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI= +modernc.org/libc v1.66.10 h1:yZkb3YeLx4oynyR+iUsXsybsX4Ubx7MQlSYEw4yj59A= +modernc.org/libc v1.66.10/go.mod h1:8vGSEwvoUoltr4dlywvHqjtAqHBaw0j1jI7iFBTAr2I= +modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= +modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= +modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= +modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= +modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= +modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= +modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= +modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= +modernc.org/sqlite v1.42.2 h1:7hkZUNJvJFN2PgfUdjni9Kbvd4ef4mNLOu0B9FGxM74= +modernc.org/sqlite v1.42.2/go.mod h1:+VkC6v3pLOAE0A0uVucQEcbVW0I5nHCeDaBf+DpsQT8= +modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= +modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= diff --git a/internal/infra/storage/migrations/migration_test.go b/internal/infra/storage/migrations/migration_test.go index 6c411f7c..ec5865b3 100644 --- a/internal/infra/storage/migrations/migration_test.go +++ b/internal/infra/storage/migrations/migration_test.go @@ -7,7 +7,7 @@ import ( "path/filepath" "testing" - _ "github.com/mattn/go-sqlite3" + _ "modernc.org/sqlite" ) func setupTestDB(t *testing.T) (*sql.DB, func()) { @@ -19,7 +19,7 @@ func setupTestDB(t *testing.T) (*sql.DB, func()) { } dbPath := filepath.Join(tmpDir, "test.db") - db, err := sql.Open("sqlite3", dbPath) + db, err := sql.Open("sqlite", dbPath) if err != nil { _ = os.RemoveAll(tmpDir) t.Fatalf("Failed to open database: %v", err) diff --git a/internal/infra/storage/sqlite.go b/internal/infra/storage/sqlite.go index 67f6ee3b..90e8c002 100644 --- a/internal/infra/storage/sqlite.go +++ b/internal/infra/storage/sqlite.go @@ -11,7 +11,7 @@ import ( domain "github.com/inference-gateway/cli/internal/domain" migrations "github.com/inference-gateway/cli/internal/infra/storage/migrations" - _ "github.com/mattn/go-sqlite3" + _ "modernc.org/sqlite" ) // SQLiteStorage implements ConversationStorage using SQLite @@ -36,7 +36,7 @@ func NewSQLiteStorage(config SQLiteConfig) (*SQLiteStorage, error) { return nil, fmt.Errorf("failed to create directory %s: %w", dir, err) } - db, err := sql.Open("sqlite3", config.Path+"?_journal_mode=WAL&_synchronous=NORMAL&_cache_size=1000&_timeout=30000&_busy_timeout=30000") + db, err := sql.Open("sqlite", config.Path+"?_journal_mode=WAL&_synchronous=NORMAL&_cache_size=1000&_timeout=30000&_busy_timeout=30000") if err != nil { return nil, fmt.Errorf("failed to open SQLite database: %w", err) } @@ -77,16 +77,11 @@ func (s *SQLiteStorage) runMigrations() error { return nil } -// verifySQLiteAvailable checks if SQLite is available on the system +// verifySQLiteAvailable checks if SQLite is available (using pure Go implementation) func verifySQLiteAvailable() error { - db, err := sql.Open("sqlite3", ":memory:") + db, err := sql.Open("sqlite", ":memory:") if err != nil { - return fmt.Errorf("SQLite driver not available: %w\n\n"+ - "System SQLite library is required. Install:\n"+ - " Ubuntu/Debian: sudo apt-get install libsqlite3-0\n"+ - " RHEL/CentOS: sudo yum install sqlite\n"+ - " macOS: brew install sqlite3 (or use system SQLite)\n"+ - " Windows: Download from https://www.sqlite.org/download.html", err) + return fmt.Errorf("SQLite driver not available (pure Go implementation): %w", err) } defer func() { _ = db.Close() }() diff --git a/internal/web/pty_manager.go b/internal/web/pty_manager.go index 69abc9c3..8e5144f2 100644 --- a/internal/web/pty_manager.go +++ b/internal/web/pty_manager.go @@ -32,7 +32,7 @@ type Session = SessionHandler // CreateSessionHandler creates either a local PTY session or remote SSH session func CreateSessionHandler(webCfg *config.WebConfig, serverCfg *config.SSHServerConfig, cfg *config.Config, v *viper.Viper) (SessionHandler, error) { if serverCfg != nil { - return createRemoteSSHSession(webCfg, serverCfg) + return createRemoteSSHSession(webCfg, serverCfg, cfg.Gateway.URL) } logger.Info("Creating local PTY session") @@ -40,7 +40,7 @@ func CreateSessionHandler(webCfg *config.WebConfig, serverCfg *config.SSHServerC } // createRemoteSSHSession creates a remote SSH session with optional auto-install -func createRemoteSSHSession(webCfg *config.WebConfig, serverCfg *config.SSHServerConfig) (SessionHandler, error) { +func createRemoteSSHSession(webCfg *config.WebConfig, serverCfg *config.SSHServerConfig, gatewayURL string) (SessionHandler, error) { logger.Info("Creating remote SSH session", "server", serverCfg.Name) client, err := NewSSHClient(&webCfg.SSH, serverCfg) @@ -52,14 +52,14 @@ func createRemoteSSHSession(webCfg *config.WebConfig, serverCfg *config.SSHServe return nil, fmt.Errorf("failed to connect to SSH server: %w", err) } - if err := ensureRemoteBinary(client, webCfg, serverCfg); err != nil { + if err := ensureRemoteBinary(client, webCfg, serverCfg, gatewayURL); err != nil { if closeErr := client.Close(); closeErr != nil { logger.Warn("Failed to close SSH client after install error", "error", closeErr) } return nil, err } - session, err := NewSSHSession(client, serverCfg) + session, err := NewSSHSession(client, serverCfg, gatewayURL) if err != nil { if closeErr := client.Close(); closeErr != nil { logger.Warn("Failed to close SSH client after session error", "error", closeErr) @@ -71,7 +71,7 @@ func createRemoteSSHSession(webCfg *config.WebConfig, serverCfg *config.SSHServe } // ensureRemoteBinary installs infer binary on remote server if auto-install is enabled -func ensureRemoteBinary(client *SSHClient, webCfg *config.WebConfig, serverCfg *config.SSHServerConfig) error { +func ensureRemoteBinary(client *SSHClient, webCfg *config.WebConfig, serverCfg *config.SSHServerConfig, gatewayURL string) error { autoInstall := webCfg.SSH.AutoInstall if serverCfg.AutoInstall != nil { autoInstall = *serverCfg.AutoInstall @@ -81,7 +81,7 @@ func ensureRemoteBinary(client *SSHClient, webCfg *config.WebConfig, serverCfg * return nil } - installer := NewRemoteInstaller(client, &webCfg.SSH, serverCfg) + installer := NewRemoteInstaller(client, &webCfg.SSH, serverCfg, gatewayURL) if err := installer.EnsureBinary(); err != nil { return fmt.Errorf("failed to ensure infer binary: %w", err) } diff --git a/internal/web/remote_installer.go b/internal/web/remote_installer.go index b1bd0c43..1e5919ef 100644 --- a/internal/web/remote_installer.go +++ b/internal/web/remote_installer.go @@ -14,23 +14,24 @@ import ( // RemoteInstaller handles auto-installation of infer binary on remote servers type RemoteInstaller struct { - sshClient *SSHClient - cfg *config.WebSSHConfig - server *config.SSHServerConfig + sshClient *SSHClient + cfg *config.WebSSHConfig + server *config.SSHServerConfig + gatewayURL string } // NewRemoteInstaller creates a new remote installer -func NewRemoteInstaller(client *SSHClient, cfg *config.WebSSHConfig, server *config.SSHServerConfig) *RemoteInstaller { +func NewRemoteInstaller(client *SSHClient, cfg *config.WebSSHConfig, server *config.SSHServerConfig, gatewayURL string) *RemoteInstaller { return &RemoteInstaller{ - sshClient: client, - cfg: cfg, - server: server, + sshClient: client, + cfg: cfg, + server: server, + gatewayURL: gatewayURL, } } // EnsureBinary checks if infer exists on remote server, installs if missing func (i *RemoteInstaller) EnsureBinary() error { - // Check if auto-install is enabled autoInstall := i.cfg.AutoInstall if i.server.AutoInstall != nil { autoInstall = *i.server.AutoInstall @@ -43,7 +44,6 @@ func (i *RemoteInstaller) EnsureBinary() error { logger.Info("Checking if infer binary exists on remote server", "server", i.server.Name) - // Check if binary exists exists, err := i.checkBinaryExists() if err != nil { return fmt.Errorf("failed to check if binary exists: %w", err) @@ -56,7 +56,6 @@ func (i *RemoteInstaller) EnsureBinary() error { logger.Info("Infer binary not found, installing...", "server", i.server.Name) - // Install binary if err := i.installBinary(); err != nil { return fmt.Errorf("failed to install binary: %w", err) } @@ -78,24 +77,20 @@ func (i *RemoteInstaller) checkBinaryExists() (bool, error) { } defer func() { _ = session.Close() }() - // Try to run: command -v cmd := fmt.Sprintf("command -v %s", commandPath) output, err := session.CombinedOutput(cmd) if err != nil { - // Command failed, binary doesn't exist logger.Info("Binary not found", "command", commandPath, "output", string(output)) return false, nil } - // Binary exists logger.Info("Binary found", "path", strings.TrimSpace(string(output))) return true, nil } // installBinary downloads and installs infer binary on remote server using the official install script func (i *RemoteInstaller) installBinary() error { - // Get version to install version := i.cfg.InstallVersion var err error if version == "latest" || version == "" { @@ -107,13 +102,11 @@ func (i *RemoteInstaller) installBinary() error { logger.Info("Installing version using install script", "version", version, "server", i.server.Name) - // Determine install directory installDir := "$HOME/bin" if i.server.InstallPath != "" { installDir = strings.TrimSuffix(i.server.InstallPath, "/infer") } - // Use the official install script which handles OS/arch detection and downloads the right binary installScript := fmt.Sprintf(` set -e mkdir -p %s @@ -128,7 +121,6 @@ fi logger.Info("Running installation script", "server", i.server.Name) - // Execute installation script session, err := i.sshClient.NewSession() if err != nil { return fmt.Errorf("failed to create SSH session: %w", err) @@ -142,7 +134,6 @@ fi logger.Info("Installation output", "output", string(output)) - // Verify installation session2, err := i.sshClient.NewSession() if err != nil { return fmt.Errorf("failed to create SSH session for verification: %w", err) @@ -157,6 +148,42 @@ fi logger.Info("Installation verified", "version_output", string(verifyOutput)) + session3, err := i.sshClient.NewSession() + if err != nil { + return fmt.Errorf("failed to create SSH session for initialization: %w", err) + } + defer func() { _ = session3.Close() }() + + initCmd := fmt.Sprintf("%s/infer init --userspace", installDir) + initOutput, err := session3.CombinedOutput(initCmd) + if err != nil { + logger.Warn("Failed to initialize infer config, may need manual setup", "error", err, "output", string(initOutput)) + } else { + logger.Info("Infer configuration initialized", "output", string(initOutput)) + } + + session4, err := i.sshClient.NewSession() + if err != nil { + return fmt.Errorf("failed to create SSH session for env setup: %w", err) + } + defer func() { _ = session4.Close() }() + + envSetupCmd := fmt.Sprintf(` +if ! grep -q "INFER_REMOTE_MANAGED" ~/.bashrc 2>/dev/null; then + echo "" >> ~/.bashrc + echo "# Infer CLI - Remote managed instance" >> ~/.bashrc + echo "export INFER_REMOTE_MANAGED=true" >> ~/.bashrc + echo "export INFER_GATEWAY_URL=%s" >> ~/.bashrc + echo "export INFER_GATEWAY_MODE=remote" >> ~/.bashrc +fi`, i.gatewayURL) + + envOutput, err := session4.CombinedOutput(envSetupCmd) + if err != nil { + logger.Warn("Failed to setup environment variables in profile", "error", err, "output", string(envOutput)) + } else { + logger.Info("Environment variables configured in user profile") + } + return nil } @@ -175,7 +202,6 @@ func (i *RemoteInstaller) getLatestVersion() (string, error) { return "", fmt.Errorf("failed to create request: %w", err) } - // Set User-Agent to avoid GitHub API rate limiting req.Header.Set("User-Agent", "inference-gateway-cli") resp, err := client.Do(req) @@ -197,7 +223,6 @@ func (i *RemoteInstaller) getLatestVersion() (string, error) { return "", fmt.Errorf("failed to parse release info: %w", err) } - // Remove 'v' prefix if present version := strings.TrimPrefix(release.TagName, "v") logger.Info("Latest version detected", "version", version) diff --git a/internal/web/ssh_session.go b/internal/web/ssh_session.go index af10af40..257042b7 100644 --- a/internal/web/ssh_session.go +++ b/internal/web/ssh_session.go @@ -17,20 +17,21 @@ import ( // SSHSession wraps an SSH session with PTY for remote terminal access type SSHSession struct { - sshClient *SSHClient - server *config.SSHServerConfig - session *ssh.Session - stdin io.WriteCloser - stdout io.Reader - stderr io.Reader - mu sync.Mutex - running bool - ctx context.Context - cancel context.CancelFunc + sshClient *SSHClient + server *config.SSHServerConfig + gatewayURL string + session *ssh.Session + stdin io.WriteCloser + stdout io.Reader + stderr io.Reader + mu sync.Mutex + running bool + ctx context.Context + cancel context.CancelFunc } // NewSSHSession creates a new SSH session with PTY -func NewSSHSession(client *SSHClient, server *config.SSHServerConfig) (*SSHSession, error) { +func NewSSHSession(client *SSHClient, server *config.SSHServerConfig, gatewayURL string) (*SSHSession, error) { if client == nil { return nil, fmt.Errorf("SSH client is required") } @@ -41,10 +42,11 @@ func NewSSHSession(client *SSHClient, server *config.SSHServerConfig) (*SSHSessi ctx, cancel := context.WithCancel(context.Background()) return &SSHSession{ - sshClient: client, - server: server, - ctx: ctx, - cancel: cancel, + sshClient: client, + server: server, + gatewayURL: gatewayURL, + ctx: ctx, + cancel: cancel, }, nil } @@ -109,7 +111,8 @@ func (s *SSHSession) Start(cols, rows int) error { } cmdArgs := append([]string{"chat"}, s.server.CommandArgs...) - cmd := fmt.Sprintf("%s %s", commandPath, strings.Join(cmdArgs, " ")) + cmd := fmt.Sprintf("INFER_GATEWAY_URL=%s INFER_GATEWAY_MODE=remote %s %s", + s.gatewayURL, commandPath, strings.Join(cmdArgs, " ")) logger.Info("Starting remote command", "command", cmd, diff --git a/internal/web/static/app.js b/internal/web/static/app.js index 94be0f68..70e988ab 100644 --- a/internal/web/static/app.js +++ b/internal/web/static/app.js @@ -7,6 +7,7 @@ class TerminalManager { this.terminalArea = document.getElementById('terminal-area'); this.newTabBtn = document.getElementById('new-tab-btn'); this.serverSelector = document.getElementById('server-selector'); + this.welcomeMessage = document.getElementById('welcome-message'); this.servers = []; this.currentServerID = 'local'; @@ -23,7 +24,6 @@ class TerminalManager { const data = await response.json(); this.servers = data.servers; - // Populate dropdown this.serverSelector.innerHTML = ''; this.servers.forEach(server => { const option = document.createElement('option'); @@ -35,16 +35,10 @@ class TerminalManager { this.serverSelector.appendChild(option); }); - // Set default selection this.serverSelector.value = 'local'; this.currentServerID = 'local'; - - // Create first tab after servers are loaded - this.createTab(); } catch (error) { console.error('Failed to load servers:', error); - // Fallback: create tab anyway with local mode - this.createTab(); } } @@ -54,6 +48,19 @@ class TerminalManager { const tab = new TerminalTab(tabId, this, serverID); this.tabs.set(tabId, tab); this.switchTab(tabId); + this.hideWelcomeMessage(); + } + + hideWelcomeMessage() { + if (this.welcomeMessage) { + this.welcomeMessage.classList.add('hidden'); + } + } + + showWelcomeMessage() { + if (this.welcomeMessage && this.tabs.size === 0) { + this.welcomeMessage.classList.remove('hidden'); + } } switchTab(tabId) { @@ -84,7 +91,7 @@ class TerminalManager { this.switchTab(remainingTabs[remainingTabs.length - 1]); } else { this.activeTabId = null; - this.createTab(); + this.showWelcomeMessage(); } } } @@ -108,10 +115,13 @@ class TerminalTab { } createUI() { + const server = this.manager.servers.find(s => s.id === this.serverID); + const serverName = server ? server.name : 'Local'; + this.tabElement = document.createElement('div'); this.tabElement.className = 'tab'; this.tabElement.innerHTML = ` - Terminal ${this.id} + Terminal ${this.id} (${serverName}) ร— `; diff --git a/internal/web/templates/index.html b/internal/web/templates/index.html index d81f0121..0a4bec39 100644 --- a/internal/web/templates/index.html +++ b/internal/web/templates/index.html @@ -132,6 +132,64 @@ .terminal-tab.active { display: block; } + #welcome-message { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + text-align: center; + max-width: 600px; + padding: 40px; + background: #16161e; + border: 1px solid #414868; + border-radius: 8px; + } + #welcome-message.hidden { + display: none; + } + #welcome-message h1 { + color: #7aa2f7; + font-size: 28px; + margin-bottom: 20px; + font-weight: 600; + } + #welcome-message p { + color: #a9b1d6; + font-size: 15px; + line-height: 1.6; + margin-bottom: 16px; + } + #welcome-message .instructions { + background: #1a1b26; + border: 1px solid #414868; + border-radius: 6px; + padding: 20px; + margin-top: 24px; + text-align: left; + } + #welcome-message .instructions h2 { + color: #bb9af7; + font-size: 16px; + margin-bottom: 12px; + font-weight: 500; + } + #welcome-message .instructions ol { + margin-left: 20px; + color: #a9b1d6; + font-size: 14px; + line-height: 1.8; + } + #welcome-message .instructions li { + margin-bottom: 8px; + } + #welcome-message .instructions code { + background: #24283b; + padding: 2px 6px; + border-radius: 3px; + color: #7dcfff; + font-family: 'Menlo', 'Monaco', 'Courier New', monospace; + font-size: 13px; + } @@ -144,7 +202,23 @@ -
+
+
+

Welcome to Infer Web Terminal

+

A browser-based terminal interface for interactive AI chat sessions.

+

Connect to local or remote servers and start chatting with AI models through the infer chat command.

+ +
+

Getting Started

+
    +
  1. Select a server from the Server dropdown above
  2. +
  3. Click the + button to create a new terminal tab
  4. +
  5. Start chatting with the AI in your terminal
  6. +
  7. Create multiple tabs to work with different servers simultaneously
  8. +
+
+
+