Compare commits

...

37 Commits

Author SHA1 Message Date
github-actions[bot]
e886338b9a chore(release): Update version to v1.4.360 2025-12-23 18:29:48 +00:00
Kayvan Sylvan
5acd61a519 Merge pull request #1903 from ksylvan/kayvan/dependency-updates
Update project dependencies and core SDK versions
2025-12-23 10:27:21 -08:00
Changelog Bot
99eaab37e2 chore: incoming 1903 changelog entry 2025-12-23 10:19:24 -08:00
Kayvan Sylvan
2dc96375c4 chore: update project dependencies and core SDK versions
# CHANGES

- Upgrade AWS SDK v2 components to latest stable versions.
- Update Ollama library to version 0.13.5 for improvements.
- Bump Google API and GenAI dependencies to newer releases.
- Refresh Cobra CLI framework and Pflag to latest versions.
- Advance Go-Git and Go-Readability to their most recent commits.
- Update OpenTelemetry and gRPC libraries for better observability.
- Include new AWS sign-in service dependency in the module.
2025-12-23 10:03:49 -08:00
github-actions[bot]
0f7e8efdde chore(release): Update version to v1.4.359 2025-12-23 17:50:33 +00:00
Kayvan Sylvan
e679ae491e Merge pull request #1902 from ksylvan/kayvan/code-cleanups-12-23-25
Code Cleanup and Simplification
2025-12-23 09:48:03 -08:00
Changelog Bot
cc6d6812c1 chore: incoming 1902 changelog entry 2025-12-23 09:18:04 -08:00
Kayvan Sylvan
58e8ac1012 chore: simplify error formatting and clean up model assignment logic
### CHANGES
- Remove redundant fmt.Sprintf calls from error formatting logic
- Simplify model assignment to always use normalized model names
- Remove unused variadic parameter from the VendorsManager Clear method
2025-12-23 07:51:33 -08:00
github-actions[bot]
a56b7f2edc chore(release): Update version to v1.4.358 2025-12-23 15:03:23 +00:00
Kayvan Sylvan
16355210e4 Merge pull request #1901 from orbisai0security/fix-CVE-2025-63389-github.com-ollama-ollama
sexurity fix: Ollama update: CVE-2025-63389
2025-12-23 07:00:24 -08:00
orbisai0security
c8da276926 fix: resolve critical vulnerability CVE-2025-63389
Automatically generated security fix
2025-12-23 06:57:45 -08:00
Changelog Bot
f966c0a516 chore: incoming 1901 changelog entry 2025-12-23 06:55:46 -08:00
github-actions[bot]
9d433b71d2 chore(release): Update version to v1.4.357 2025-12-22 23:04:21 +00:00
Kayvan Sylvan
0744be4710 Merge pull request #1897 from ksylvan/kayvan/add-minimax-vendor
feat: add MiniMax provider support to OpenAI compatible plugin
2025-12-22 15:01:53 -08:00
Changelog Bot
5e96af8afb chore: incoming 1897 changelog entry 2025-12-22 14:55:23 -08:00
Kayvan Sylvan
e2c28c8f19 feat: add MiniMax provider support to OpenAI compatible plugin
- Add MiniMax provider configuration to ProviderMap
- Set MiniMax base URL to api.minimaxi.com/v1
- Configure MiniMax with ImplementsResponses as false
- Add test case for MiniMax provider validation
2025-12-22 14:52:08 -08:00
Kayvan Sylvan
9eb85725da docs: add v1.4.356 release note highlighting complete i18n support
## CHANGES
- Add v1.4.356 entry to Recent Major Features list
- Highlight full setup prompt i18n across 10 languages
- Note intelligent environment variable handling for consistency
2025-12-22 10:31:27 -08:00
github-actions[bot]
f39a4f47c9 chore(release): Update version to v1.4.356 2025-12-22 18:19:36 +00:00
Kayvan Sylvan
13b608e227 Merge pull request #1895 from ksylvan/kayvan/fix-mixed-language-output-during-setup
Localize setup process and add funding configuration
2025-12-22 10:16:59 -08:00
Kayvan Sylvan
7570e7930b feat: localize setup process and add funding configuration
- Add GitHub and Buy Me a Coffee funding configuration.
- Localize setup prompts and error messages across multiple languages.
- Implement helper for localized questions with static environment keys.
- Update environment variable builder to handle hyphenated plugin names.
- Replace hardcoded console output with localized i18n translation strings.
- Expand locale files with comprehensive pattern and strategy translations.
- Add new i18n keys for optional and required markers
- Remove hardcoded `[required]` markers from description strings
- Add custom patterns, Jina AI, YouTube, and language labels
- Switch plugin descriptions to use i18n translation keys
- Append markers dynamically to setup descriptions in Go code
- Remove trailing newlines from plugin question prompt strings
- Standardize all locale files with consistent formatting changes
2025-12-22 09:39:02 -08:00
github-actions[bot]
fe0a173166 chore(release): Update version to v1.4.355 2025-12-20 07:58:09 +00:00
Kayvan Sylvan
a916137db3 Merge pull request #1890 from ksylvan/kayvan/fix-nix-flake-to-add-yt-dlp
Bundle yt-dlp with fabric in Nix flake, introduce slim variant
2025-12-19 23:55:46 -08:00
Kayvan Sylvan
333c8cd363 feat: Nix: bundle yt-dlp with fabric package + fabric-slim variant
- rename original fabric package to fabricSlim
- create fabric package as symlinkJoin of fabricSlim and yt-dlp
- add fabric-slim output for the slim variant
- update default package to point to bundled fabric
- enhance fabric meta description to note yt-dlp inclusion
- set mainProgram to fabric in bundled package
2025-12-19 23:34:19 -08:00
github-actions[bot]
294a4635de chore(release): Update version to v1.4.354 2025-12-19 18:47:36 +00:00
Kayvan Sylvan
a70431eaa5 Merge pull request #1889 from ksylvan/kayvan/add-youtube-trabscription-to-swagger
docs: Add a YouTube transcript endpoint to the Swagger UI.
2025-12-19 10:44:47 -08:00
Changelog Bot
ac57c3d2b0 chore: incoming 1889 changelog entry 2025-12-19 10:42:38 -08:00
Kayvan Sylvan
5e4e4f4bf1 docs: Add YouTube transcript endpoint to Swagger UI.
- Add `/youtube/transcript` POST endpoint to Swagger docs
- Define `YouTubeRequest` schema with URL, language, timestamps fields
- Define `YouTubeResponse` schema with transcript and metadata fields
- Add API security requirement using ApiKeyAuth
- Document 200, 400, and 500 response codes
- Add godoc comments to YouTubeHandler struct methods
- Include example values for all request/response properties
2025-12-19 10:41:55 -08:00
github-actions[bot]
96225d4aea chore(release): Update version to v1.4.353 2025-12-19 16:21:50 +00:00
Kayvan Sylvan
adcdc0cf0b Merge pull request #1887 from bvandevliet/feat/yt-title-and-description
feat: correct video title and added description to yt transcript api response
2025-12-19 08:19:15 -08:00
Changelog Bot
e3f9b12fde chore: incoming 1887 changelog entry 2025-12-19 08:16:18 -08:00
Bob Vandevliet
7fa4c0a030 Updated API documentation. 2025-12-19 13:23:44 +01:00
Bob Vandevliet
8a3fa9337c feat: correct video title (instead of id) and added description to yt transcript api response 2025-12-19 13:14:12 +01:00
github-actions[bot]
26ac5f3bf9 chore(release): Update version to v1.4.352 2025-12-18 23:45:28 +00:00
Kayvan Sylvan
b4226da967 Merge pull request #1886 from ksylvan/kayvan/better-new-user-setup-experience
Enhanced Onboarding and Setup Experience
2025-12-18 15:42:59 -08:00
Changelog Bot
b2d24aa5c7 chore: incoming 1886 changelog entry 2025-12-18 15:03:22 -08:00
Kayvan Sylvan
9f79877524 User Experience: implement automated first-time setup and improved configuration validation
### CHANGES

- Add automated first-time setup for patterns and strategies.
- Implement configuration validation to warn about missing required components.
- Update setup menu to group plugins into required and optional.
- Provide helpful guidance when no patterns are found in listing.
- Expand localization support for setup and error messaging across languages.
- Enhance strategy manager to reload and count installed strategies.
- Improve pattern error handling with specific guidance for empty directories.
2025-12-18 14:48:50 -08:00
Kayvan Sylvan
829c182a9d chore: update README with new interactive Swagger available in v.1.4.350 2025-12-18 10:47:10 -08:00
42 changed files with 2452 additions and 492 deletions

2
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,2 @@
github: [danielmiessler, ksylvan]
buy_me_a_coffee: kayvansylvan

View File

@@ -9,6 +9,7 @@
"Aoede",
"apikey",
"aplicar",
"Astley",
"atotto",
"Autonoe",
"azureml",

View File

@@ -1,5 +1,102 @@
# Changelog
## v1.4.360 (2025-12-23)
### PR [#1903](https://github.com/danielmiessler/Fabric/pull/1903) by [ksylvan](https://github.com/ksylvan): Update project dependencies and core SDK versions
- Update project dependencies and core SDK versions
- Upgrade AWS SDK v2 components to latest stable versions
- Update Ollama library to version 0.13.5 for improvements
- Bump Google API and GenAI dependencies to newer releases
- Refresh Cobra CLI framework and Pflag to latest versions
## v1.4.359 (2025-12-23)
### PR [#1902](https://github.com/danielmiessler/Fabric/pull/1902) by [ksylvan](https://github.com/ksylvan): Code Cleanup and Simplification
- Chore: simplify error formatting and clean up model assignment logic
- Remove redundant fmt.Sprintf calls from error formatting logic
- Simplify model assignment to always use normalized model names
- Remove unused variadic parameter from the VendorsManager Clear method
## v1.4.358 (2025-12-23)
### PR [#1901](https://github.com/danielmiessler/Fabric/pull/1901) by [orbisai0security](https://github.com/orbisai0security): sexurity fix: Ollama update: CVE-2025-63389
- Fix: resolve critical vulnerability CVE-2025-63389 (update Ollama Go library)
## v1.4.357 (2025-12-22)
### PR [#1897](https://github.com/danielmiessler/Fabric/pull/1897) by [ksylvan](https://github.com/ksylvan): feat: add MiniMax provider support to OpenAI compatible plugin
- Add MiniMax provider support to OpenAI compatible plugin
- Add MiniMax provider configuration to ProviderMap
- Set MiniMax base URL to api.minimaxi.com/v1
- Configure MiniMax with ImplementsResponses as false
- Add test case for MiniMax provider validation
### Direct commits
- Docs: add v1.4.356 release note highlighting complete i18n support
- Add v1.4.356 entry to Recent Major Features list
- Highlight full setup prompt i18n across 10 languages
- Note intelligent environment variable handling for consistency
## v1.4.356 (2025-12-22)
### PR [#1895](https://github.com/danielmiessler/Fabric/pull/1895) by [ksylvan](https://github.com/ksylvan): Localize setup process and add funding configuration
- Localize setup prompts and error messages across multiple languages
- Implement helper for localized questions with static environment keys
- Update environment variable builder to handle hyphenated plugin names
- Replace hardcoded console output with localized i18n translation strings
- Add GitHub and Buy Me a Coffee funding configuration
## v1.4.355 (2025-12-20)
### PR [#1890](https://github.com/danielmiessler/Fabric/pull/1890) by [ksylvan](https://github.com/ksylvan): Bundle yt-dlp with fabric in Nix flake, introduce slim variant
- Added yt-dlp bundling with fabric package and introduced fabric-slim variant
- Renamed original fabric package to fabricSlim and created new fabric package as symlinkJoin of fabricSlim and yt-dlp
- Added fabric-slim output for the slim variant and updated default package to point to bundled fabric
- Enhanced fabric meta description to note yt-dlp inclusion and set mainProgram to fabric in bundled package
- Added wrapper for fabric binary to include PATH in execution environment
## v1.4.354 (2025-12-19)
### PR [#1889](https://github.com/danielmiessler/Fabric/pull/1889) by [ksylvan](https://github.com/ksylvan): docs: Add a YouTube transcript endpoint to the Swagger UI
- Add `/youtube/transcript` POST endpoint to Swagger docs
- Define `YouTubeRequest` schema with URL, language, timestamps fields
- Define `YouTubeResponse` schema with transcript and metadata fields
- Add API security requirement using ApiKeyAuth
- Document 200, 400, and 500 response codes
## v1.4.353 (2025-12-19)
### PR [#1887](https://github.com/danielmiessler/Fabric/pull/1887) by [bvandevliet](https://github.com/bvandevliet): feat: correct video title and added description to yt transcript api response
- Feat: correct video title (instead of id) and added description to yt transcript api response
- Updated API documentation.
## v1.4.352 (2025-12-18)
### PR [#1886](https://github.com/danielmiessler/Fabric/pull/1886) by [ksylvan](https://github.com/ksylvan): Enhanced Onboarding and Setup Experience
- User Experience: implement automated first-time setup and improved configuration validation
- Add automated first-time setup for patterns and strategies
- Implement configuration validation to warn about missing required components
- Update setup menu to group plugins into required and optional
- Provide helpful guidance when no patterns are found in listing
### Direct commits
- Chore: update README with new interactive Swagger available in v.1.4.350
## v1.4.351 (2025-12-18)
### PR [#1882](https://github.com/danielmiessler/Fabric/pull/1882) by [bvandevliet](https://github.com/bvandevliet): Added yt-dlp package to docker image

View File

@@ -74,6 +74,8 @@ Below are the **new features and capabilities** we've added (newest first):
### Recent Major Features
- [v1.4.356](https://github.com/danielmiessler/fabric/releases/tag/v1.4.356) (Dec 22, 2025) — **Complete Internationalization**: Full i18n support for setup prompts across all 10 languages with intelligent environment variable handling—making Fabric truly accessible worldwide while maintaining configuration consistency.
- [v1.4.350](https://github.com/danielmiessler/fabric/releases/tag/v1.4.350) (Dec 18, 2025) — **Interactive API Documentation**: Adds Swagger/OpenAPI UI at `/swagger/index.html` with comprehensive REST API documentation, enhanced developer guides, and improved endpoint discoverability for easier integration.
- [v1.4.338](https://github.com/danielmiessler/fabric/releases/tag/v1.4.338) (Dec 4, 2025) — Add Abacus vendor support for Chat-LLM
models (see [RouteLLM APIs](https://abacus.ai/app/route-llm-apis)).
- [v1.4.337](https://github.com/danielmiessler/fabric/releases/tag/v1.4.337) (Dec 4, 2025) — Add "Z AI" vendor support. See the [Z AI overview](https://docs.z.ai/guides/overview/overview) page for more details.

View File

@@ -1,3 +1,3 @@
package main
var version = "v1.4.351"
var version = "v1.4.360"

Binary file not shown.

View File

@@ -214,6 +214,63 @@ const docTemplate = `{
}
}
}
},
"/youtube/transcript": {
"post": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "Retrieves the transcript of a YouTube video along with video metadata (title and description)",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"youtube"
],
"summary": "Get YouTube video transcript",
"parameters": [
{
"description": "YouTube transcript request with URL, language, and timestamp options",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/restapi.YouTubeRequest"
}
}
],
"responses": {
"200": {
"description": "Successful response with transcript and metadata",
"schema": {
"$ref": "#/definitions/restapi.YouTubeResponse"
}
},
"400": {
"description": "Bad request - invalid URL or playlist URL provided",
"schema": {
"type": "object",
"additionalProperties": {
"type": "string"
}
}
},
"500": {
"description": "Internal server error - failed to retrieve transcript or metadata",
"schema": {
"type": "object",
"additionalProperties": {
"type": "string"
}
}
}
}
}
}
},
"definitions": {
@@ -401,6 +458,54 @@ const docTemplate = `{
"type": "string"
}
}
},
"restapi.YouTubeRequest": {
"type": "object",
"required": [
"url"
],
"properties": {
"language": {
"description": "Language code for transcript (default: \"en\")",
"type": "string",
"example": "en"
},
"timestamps": {
"description": "Include timestamps in the transcript (default: false)",
"type": "boolean",
"example": false
},
"url": {
"description": "YouTube video URL (required)",
"type": "string",
"example": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
}
}
},
"restapi.YouTubeResponse": {
"type": "object",
"properties": {
"description": {
"description": "Video description from YouTube metadata",
"type": "string",
"example": "This is the video description from YouTube..."
},
"title": {
"description": "Video title from YouTube metadata",
"type": "string",
"example": "Example Video Title"
},
"transcript": {
"description": "The video transcript text",
"type": "string",
"example": "This is the video transcript..."
},
"videoId": {
"description": "YouTube video ID",
"type": "string",
"example": "dQw4w9WgXcQ"
}
}
}
},
"securityDefinitions": {

View File

@@ -278,7 +278,9 @@ Extract transcripts from YouTube videos.
```json
{
"videoId": "Video ID",
"title": "Video Title",
"description" : "Video description...",
"transcript": "Full transcript text..."
}
```
@@ -335,7 +337,9 @@ Response:
```json
{
"videoId": "dQw4w9WgXcQ",
"title": "Rick Astley - Never Gonna Give You Up (Official Video)",
"description": "The official video for “Never Gonna Give You Up” by Rick Astley...",
"transcript": "We're no strangers to love. You know the rules and so do I..."
}
```

View File

@@ -208,6 +208,63 @@
}
}
}
},
"/youtube/transcript": {
"post": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "Retrieves the transcript of a YouTube video along with video metadata (title and description)",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"youtube"
],
"summary": "Get YouTube video transcript",
"parameters": [
{
"description": "YouTube transcript request with URL, language, and timestamp options",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/restapi.YouTubeRequest"
}
}
],
"responses": {
"200": {
"description": "Successful response with transcript and metadata",
"schema": {
"$ref": "#/definitions/restapi.YouTubeResponse"
}
},
"400": {
"description": "Bad request - invalid URL or playlist URL provided",
"schema": {
"type": "object",
"additionalProperties": {
"type": "string"
}
}
},
"500": {
"description": "Internal server error - failed to retrieve transcript or metadata",
"schema": {
"type": "object",
"additionalProperties": {
"type": "string"
}
}
}
}
}
}
},
"definitions": {
@@ -395,6 +452,54 @@
"type": "string"
}
}
},
"restapi.YouTubeRequest": {
"type": "object",
"required": [
"url"
],
"properties": {
"language": {
"description": "Language code for transcript (default: \"en\")",
"type": "string",
"example": "en"
},
"timestamps": {
"description": "Include timestamps in the transcript (default: false)",
"type": "boolean",
"example": false
},
"url": {
"description": "YouTube video URL (required)",
"type": "string",
"example": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
}
}
},
"restapi.YouTubeResponse": {
"type": "object",
"properties": {
"description": {
"description": "Video description from YouTube metadata",
"type": "string",
"example": "This is the video description from YouTube..."
},
"title": {
"description": "Video title from YouTube metadata",
"type": "string",
"example": "Example Video Title"
},
"transcript": {
"description": "The video transcript text",
"type": "string",
"example": "This is the video transcript..."
},
"videoId": {
"description": "YouTube video ID",
"type": "string",
"example": "dQw4w9WgXcQ"
}
}
}
},
"securityDefinitions": {

View File

@@ -127,6 +127,42 @@ definitions:
description: '"content", "error", "complete"'
type: string
type: object
restapi.YouTubeRequest:
properties:
language:
description: 'Language code for transcript (default: "en")'
example: en
type: string
timestamps:
description: 'Include timestamps in the transcript (default: false)'
example: false
type: boolean
url:
description: YouTube video URL (required)
example: https://www.youtube.com/watch?v=dQw4w9WgXcQ
type: string
required:
- url
type: object
restapi.YouTubeResponse:
properties:
description:
description: Video description from YouTube metadata
example: This is the video description from YouTube...
type: string
title:
description: Video title from YouTube metadata
example: Example Video Title
type: string
transcript:
description: The video transcript text
example: This is the video transcript...
type: string
videoId:
description: YouTube video ID
example: dQw4w9WgXcQ
type: string
type: object
host: localhost:8080
info:
contact:
@@ -262,6 +298,44 @@ paths:
summary: Apply pattern with variables
tags:
- patterns
/youtube/transcript:
post:
consumes:
- application/json
description: Retrieves the transcript of a YouTube video along with video metadata
(title and description)
parameters:
- description: YouTube transcript request with URL, language, and timestamp
options
in: body
name: request
required: true
schema:
$ref: '#/definitions/restapi.YouTubeRequest'
produces:
- application/json
responses:
"200":
description: Successful response with transcript and metadata
schema:
$ref: '#/definitions/restapi.YouTubeResponse'
"400":
description: Bad request - invalid URL or playlist URL provided
schema:
additionalProperties:
type: string
type: object
"500":
description: Internal server error - failed to retrieve transcript or metadata
schema:
additionalProperties:
type: string
type: object
security:
- ApiKeyAuth: []
summary: Get YouTube video transcript
tags:
- youtube
securityDefinitions:
ApiKeyAuth:
in: header

View File

@@ -73,14 +73,33 @@
let
pkgs = nixpkgs.legacyPackages.${system};
goVersion = getGoVersion system;
in
{
default = self.packages.${system}.fabric;
fabric = pkgs.callPackage ./nix/pkgs/fabric {
fabricSlim = pkgs.callPackage ./nix/pkgs/fabric {
go = goVersion;
inherit self;
inherit (gomod2nix.legacyPackages.${system}) buildGoApplication;
};
fabric = pkgs.symlinkJoin {
name = "fabric-${fabricSlim.version}";
inherit (fabricSlim) version;
paths = [
fabricSlim
pkgs.yt-dlp
];
nativeBuildInputs = [ pkgs.makeWrapper ];
postBuild = ''
wrapProgram $out/bin/fabric \
--prefix PATH : $out/bin
'';
meta = fabricSlim.meta // {
description = "${fabricSlim.meta.description} (includes yt-dlp)";
mainProgram = "fabric";
};
};
in
{
default = fabric;
inherit fabric;
"fabric-slim" = fabricSlim;
inherit (gomod2nix.legacyPackages.${system}) gomod2nix;
}
);

74
go.mod
View File

@@ -5,35 +5,35 @@ go 1.25.1
require (
github.com/anthropics/anthropic-sdk-go v1.19.0
github.com/atotto/clipboard v0.1.4
github.com/aws/aws-sdk-go-v2 v1.39.0
github.com/aws/aws-sdk-go-v2/config v1.31.8
github.com/aws/aws-sdk-go-v2/service/bedrock v1.46.1
github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.40.1
github.com/aws/aws-sdk-go-v2 v1.41.0
github.com/aws/aws-sdk-go-v2/config v1.32.6
github.com/aws/aws-sdk-go-v2/service/bedrock v1.53.0
github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.47.1
github.com/gabriel-vasile/mimetype v1.4.12
github.com/gin-gonic/gin v1.11.0
github.com/go-git/go-git/v5 v5.16.2
github.com/go-shiori/go-readability v0.0.0-20250217085726-9f5bf5ca7612
github.com/go-git/go-git/v5 v5.16.4
github.com/go-shiori/go-readability v0.0.0-20251205110129-5db1dc9836f0
github.com/google/go-github/v66 v66.0.0
github.com/hasura/go-graphql-client v0.14.4
github.com/jessevdk/go-flags v1.6.1
github.com/joho/godotenv v1.5.1
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51
github.com/mattn/go-sqlite3 v1.14.28
github.com/mattn/go-sqlite3 v1.14.32
github.com/nicksnyder/go-i18n/v2 v2.6.0
github.com/ollama/ollama v0.11.7
github.com/ollama/ollama v0.13.5
github.com/openai/openai-go v1.12.0
github.com/otiai10/copy v1.14.1
github.com/pkg/errors v0.9.1
github.com/samber/lo v1.50.0
github.com/sgaunet/perplexity-go/v2 v2.8.0
github.com/spf13/cobra v1.9.1
github.com/samber/lo v1.52.0
github.com/sgaunet/perplexity-go/v2 v2.14.0
github.com/spf13/cobra v1.10.2
github.com/stretchr/testify v1.11.1
github.com/swaggo/files v1.0.1
github.com/swaggo/gin-swagger v1.6.1
github.com/swaggo/swag v1.16.6
golang.org/x/oauth2 v0.30.0
golang.org/x/oauth2 v0.34.0
golang.org/x/text v0.32.0
google.golang.org/api v0.247.0
google.golang.org/api v0.258.0
gopkg.in/yaml.v3 v3.0.1
)
@@ -41,6 +41,7 @@ require (
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.19.1 // indirect
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 // indirect
github.com/KyleBanks/depth v1.2.1 // indirect
github.com/aws/aws-sdk-go-v2/service/signin v1.0.4 // indirect
github.com/bytedance/gopkg v0.1.3 // indirect
github.com/go-openapi/jsonpointer v0.22.4 // indirect
github.com/go-openapi/jsonreference v0.21.4 // indirect
@@ -65,26 +66,26 @@ require (
require (
cloud.google.com/go v0.121.6 // indirect
cloud.google.com/go/auth v0.16.5 // indirect
cloud.google.com/go/auth v0.17.0 // indirect
cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect
cloud.google.com/go/compute/metadata v0.8.0 // indirect
cloud.google.com/go/compute/metadata v0.9.0 // indirect
dario.cat/mergo v1.0.2 // indirect
github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/ProtonMail/go-crypto v1.3.0 // indirect
github.com/andybalholm/cascadia v1.3.3 // indirect
github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de // indirect
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.1 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.18.12 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.7 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.7 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.7 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.7 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.29.3 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.34.4 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.38.4 // indirect
github.com/aws/smithy-go v1.23.0 // indirect
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.4 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.19.6 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.16 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.16 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.30.8 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.41.5 // indirect
github.com/aws/smithy-go v1.24.0 // indirect
github.com/bytedance/sonic v1.14.2 // indirect
github.com/bytedance/sonic/loader v0.4.0 // indirect
github.com/cloudflare/circl v1.6.1 // indirect
@@ -109,7 +110,7 @@ require (
github.com/google/go-querystring v1.1.0 // indirect
github.com/google/s2a-go v0.1.9 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.3.7 // indirect
github.com/googleapis/gax-go/v2 v2.15.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
@@ -126,7 +127,7 @@ require (
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/sergi/go-diff v1.4.0 // indirect
github.com/skeema/knownhosts v1.3.1 // indirect
github.com/spf13/pflag v1.0.6 // indirect
github.com/spf13/pflag v1.0.9 // indirect
github.com/tidwall/gjson v1.18.0 // indirect
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.1 // indirect
@@ -134,21 +135,20 @@ require (
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.3.1 // indirect
github.com/xanzy/ssh-agent v0.3.3 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect
go.opentelemetry.io/otel v1.36.0 // indirect
go.opentelemetry.io/otel/metric v1.36.0 // indirect
go.opentelemetry.io/otel/trace v1.36.0 // indirect
go.opentelemetry.io/otel v1.38.0 // indirect
go.opentelemetry.io/otel/metric v1.38.0 // indirect
go.opentelemetry.io/otel/trace v1.38.0 // indirect
golang.org/x/arch v0.23.0 // indirect
golang.org/x/crypto v0.46.0 // indirect
golang.org/x/exp v0.0.0-20250531010427-b6e5de432a8b // indirect
golang.org/x/net v0.48.0 // indirect
golang.org/x/sync v0.19.0 // indirect
golang.org/x/sys v0.39.0 // indirect
google.golang.org/genai v1.17.0
google.golang.org/genproto/googleapis/api v0.0.0-20250818200422-3122310a409c // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c // indirect
google.golang.org/grpc v1.74.2 // indirect
google.golang.org/genai v1.40.0
google.golang.org/genproto/googleapis/rpc v0.0.0-20251213004720-97cd9d5aeac2 // indirect
google.golang.org/grpc v1.78.0 // indirect
google.golang.org/protobuf v1.36.11 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
)

164
go.sum
View File

@@ -1,11 +1,11 @@
cloud.google.com/go v0.121.6 h1:waZiuajrI28iAf40cWgycWNgaXPO06dupuS+sgibK6c=
cloud.google.com/go v0.121.6/go.mod h1:coChdst4Ea5vUpiALcYKXEpR1S9ZgXbhEzzMcMR66vI=
cloud.google.com/go/auth v0.16.5 h1:mFWNQ2FEVWAliEQWpAdH80omXFokmrnbDhUS9cBywsI=
cloud.google.com/go/auth v0.16.5/go.mod h1:utzRfHMP+Vv0mpOkTRQoWD2q3BatTOoWbA7gCc2dUhQ=
cloud.google.com/go/auth v0.17.0 h1:74yCm7hCj2rUyyAocqnFzsAYXgJhrG26XCFimrc/Kz4=
cloud.google.com/go/auth v0.17.0/go.mod h1:6wv/t5/6rOPAX4fJiRjKkJCvswLwdet7G8+UGXt7nCQ=
cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc=
cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c=
cloud.google.com/go/compute/metadata v0.8.0 h1:HxMRIbao8w17ZX6wBnjhcDkW6lTFpgcaobyVfZWqRLA=
cloud.google.com/go/compute/metadata v0.8.0/go.mod h1:sYOGTp851OV9bOFJ9CH7elVvyzopvWQFNNghtDQ/Biw=
cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs=
cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10=
dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8=
dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.19.1 h1:5YTBM8QDVIBN3sxBil89WfdAAqDZbyJTgh688DSxX5w=
@@ -37,38 +37,40 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPd
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
github.com/aws/aws-sdk-go-v2 v1.39.0 h1:xm5WV/2L4emMRmMjHFykqiA4M/ra0DJVSWUkDyBjbg4=
github.com/aws/aws-sdk-go-v2 v1.39.0/go.mod h1:sDioUELIUO9Znk23YVmIk86/9DOpkbyyVb1i/gUNFXY=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.1 h1:i8p8P4diljCr60PpJp6qZXNlgX4m2yQFpYk+9ZT+J4E=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.1/go.mod h1:ddqbooRZYNoJ2dsTwOty16rM+/Aqmk/GOXrK8cg7V00=
github.com/aws/aws-sdk-go-v2/config v1.31.8 h1:kQjtOLlTU4m4A64TsRcqwNChhGCwaPBt+zCQt/oWsHU=
github.com/aws/aws-sdk-go-v2/config v1.31.8/go.mod h1:QPpc7IgljrKwH0+E6/KolCgr4WPLerURiU592AYzfSY=
github.com/aws/aws-sdk-go-v2/credentials v1.18.12 h1:zmc9e1q90wMn8wQbjryy8IwA6Q4XlaL9Bx2zIqdNNbk=
github.com/aws/aws-sdk-go-v2/credentials v1.18.12/go.mod h1:3VzdRDR5u3sSJRI4kYcOSIBbeYsgtVk7dG5R/U6qLWY=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.7 h1:Is2tPmieqGS2edBnmOJIbdvOA6Op+rRpaYR60iBAwXM=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.7/go.mod h1:F1i5V5421EGci570yABvpIXgRIBPb5JM+lSkHF6Dq5w=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.7 h1:UCxq0X9O3xrlENdKf1r9eRJoKz/b0AfGkpp3a7FPlhg=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.7/go.mod h1:rHRoJUNUASj5Z/0eqI4w32vKvC7atoWR0jC+IkmVH8k=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.7 h1:Y6DTZUn7ZUC4th9FMBbo8LVE+1fyq3ofw+tRwkUd3PY=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.7/go.mod h1:x3XE6vMnU9QvHN/Wrx2s44kwzV2o2g5x/siw4ZUJ9g8=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo=
github.com/aws/aws-sdk-go-v2/service/bedrock v1.46.1 h1:hZwht+1MdXlNot+A/r7SWqk0w2WVpiDUzRasdQFv1Vw=
github.com/aws/aws-sdk-go-v2/service/bedrock v1.46.1/go.mod h1:NFnqdOIaYD3MVMIlRjZ0sUzQPTWiWfES1sdalmLk5RA=
github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.40.1 h1:8GTz2t0j7pclgugdXdcdTRh6NsIfHcQEKO/1tGDHRvU=
github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.40.1/go.mod h1:TM6uf2HPJT5w1RSPGHwtHDo8XDHUSHoBrGVKqA12cAU=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1 h1:oegbebPEMA/1Jny7kvwejowCaHz1FWZAQ94WXFNCyTM=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1/go.mod h1:kemo5Myr9ac0U9JfSjMo9yHLtw+pECEHsFtJ9tqCEI8=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.7 h1:mLgc5QIgOy26qyh5bvW+nDoAppxgn3J2WV3m9ewq7+8=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.7/go.mod h1:wXb/eQnqt8mDQIQTTmcw58B5mYGxzLGZGK8PWNFZ0BA=
github.com/aws/aws-sdk-go-v2/service/sso v1.29.3 h1:7PKX3VYsZ8LUWceVRuv0+PU+E7OtQb1lgmi5vmUE9CM=
github.com/aws/aws-sdk-go-v2/service/sso v1.29.3/go.mod h1:Ql6jE9kyyWI5JHn+61UT/Y5Z0oyVJGmgmJbZD5g4unY=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.34.4 h1:e0XBRn3AptQotkyBFrHAxFB8mDhAIOfsG+7KyJ0dg98=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.34.4/go.mod h1:XclEty74bsGBCr1s0VSaA11hQ4ZidK4viWK7rRfO88I=
github.com/aws/aws-sdk-go-v2/service/sts v1.38.4 h1:PR00NXRYgY4FWHqOGx3fC3lhVKjsp1GdloDv2ynMSd8=
github.com/aws/aws-sdk-go-v2/service/sts v1.38.4/go.mod h1:Z+Gd23v97pX9zK97+tX4ppAgqCt3Z2dIXB02CtBncK8=
github.com/aws/smithy-go v1.23.0 h1:8n6I3gXzWJB2DxBDnfxgBaSX6oe0d/t10qGz7OKqMCE=
github.com/aws/smithy-go v1.23.0/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI=
github.com/aws/aws-sdk-go-v2 v1.41.0 h1:tNvqh1s+v0vFYdA1xq0aOJH+Y5cRyZ5upu6roPgPKd4=
github.com/aws/aws-sdk-go-v2 v1.41.0/go.mod h1:MayyLB8y+buD9hZqkCW3kX1AKq07Y5pXxtgB+rRFhz0=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.4 h1:489krEF9xIGkOaaX3CE/Be2uWjiXrkCH6gUX+bZA/BU=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.4/go.mod h1:IOAPF6oT9KCsceNTvvYMNHy0+kMF8akOjeDvPENWxp4=
github.com/aws/aws-sdk-go-v2/config v1.32.6 h1:hFLBGUKjmLAekvi1evLi5hVvFQtSo3GYwi+Bx4lpJf8=
github.com/aws/aws-sdk-go-v2/config v1.32.6/go.mod h1:lcUL/gcd8WyjCrMnxez5OXkO3/rwcNmvfno62tnXNcI=
github.com/aws/aws-sdk-go-v2/credentials v1.19.6 h1:F9vWao2TwjV2MyiyVS+duza0NIRtAslgLUM0vTA1ZaE=
github.com/aws/aws-sdk-go-v2/credentials v1.19.6/go.mod h1:SgHzKjEVsdQr6Opor0ihgWtkWdfRAIwxYzSJ8O85VHY=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16 h1:80+uETIWS1BqjnN9uJ0dBUaETh+P1XwFy5vwHwK5r9k=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16/go.mod h1:wOOsYuxYuB/7FlnVtzeBYRcjSRtQpAW0hCP7tIULMwo=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.16 h1:rgGwPzb82iBYSvHMHXc8h9mRoOUBZIGFgKb9qniaZZc=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.16/go.mod h1:L/UxsGeKpGoIj6DxfhOWHWQ/kGKcd4I1VncE4++IyKA=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.16 h1:1jtGzuV7c82xnqOVfx2F0xmJcOw5374L7N6juGW6x6U=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.16/go.mod h1:M2E5OQf+XLe+SZGmmpaI2yy+J326aFf6/+54PoxSANc=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 h1:WKuaxf++XKWlHWu9ECbMlha8WOEGm0OUEZqm4K/Gcfk=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4/go.mod h1:ZWy7j6v1vWGmPReu0iSGvRiise4YI5SkR3OHKTZ6Wuc=
github.com/aws/aws-sdk-go-v2/service/bedrock v1.53.0 h1:cmQBS5qaRe1yV7eL7shROYjBv/O3TJf9tJEDSiWndIA=
github.com/aws/aws-sdk-go-v2/service/bedrock v1.53.0/go.mod h1:LV2LELzMlToA6tauFUTYr0iy20Gp4TKz2vMQYaKq0Pw=
github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.47.1 h1:xryaVPvLLcCf7Y/4beWjOcWxiftorB/KDjtiYORVSNo=
github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.47.1/go.mod h1:ckSglleOJ2avj81L6vBb70nK51cnhTwvVK1SkLgFtj4=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 h1:0ryTNEdJbzUCEWkVXEXoqlXV72J5keC1GvILMOuD00E=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4/go.mod h1:HQ4qwNZh32C3CBeO6iJLQlgtMzqeG17ziAA/3KDJFow=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16 h1:oHjJHeUy0ImIV0bsrX0X91GkV5nJAyv1l1CC9lnO0TI=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16/go.mod h1:iRSNGgOYmiYwSCXxXaKb9HfOEj40+oTKn8pTxMlYkRM=
github.com/aws/aws-sdk-go-v2/service/signin v1.0.4 h1:HpI7aMmJ+mm1wkSHIA2t5EaFFv5EFYXePW30p1EIrbQ=
github.com/aws/aws-sdk-go-v2/service/signin v1.0.4/go.mod h1:C5RdGMYGlfM0gYq/tifqgn4EbyX99V15P2V3R+VHbQU=
github.com/aws/aws-sdk-go-v2/service/sso v1.30.8 h1:aM/Q24rIlS3bRAhTyFurowU8A0SMyGDtEOY/l/s/1Uw=
github.com/aws/aws-sdk-go-v2/service/sso v1.30.8/go.mod h1:+fWt2UHSb4kS7Pu8y+BMBvJF0EWx+4H0hzNwtDNRTrg=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12 h1:AHDr0DaHIAo8c9t1emrzAlVDFp+iMMKnPdYy6XO4MCE=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12/go.mod h1:GQ73XawFFiWxyWXMHWfhiomvP3tXtdNar/fi8z18sx0=
github.com/aws/aws-sdk-go-v2/service/sts v1.41.5 h1:SciGFVNZ4mHdm7gpD1dgZYnCuVdX1s+lFTg4+4DOy70=
github.com/aws/aws-sdk-go-v2/service/sts v1.41.5/go.mod h1:iW40X4QBmUxdP+fZNOpfmkdMZqsovezbAeO+Ubiv2pk=
github.com/aws/smithy-go v1.24.0 h1:LpilSUItNPFr1eY85RYgTIg5eIEPtvFbskaFcmmIUnk=
github.com/aws/smithy-go v1.24.0/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0=
github.com/bytedance/gopkg v0.1.3 h1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M=
github.com/bytedance/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=
github.com/bytedance/sonic v1.14.2 h1:k1twIoe97C1DtYUo+fZQy865IuHia4PR5RPiuGPPIIE=
@@ -110,8 +112,8 @@ github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UN
github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU=
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4=
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII=
github.com/go-git/go-git/v5 v5.16.2 h1:fT6ZIOjE5iEnkzKyxTHK1W4HGAsPhqEqiSAssSO77hM=
github.com/go-git/go-git/v5 v5.16.2/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8=
github.com/go-git/go-git/v5 v5.16.4 h1:7ajIEZHZJULcyJebDLo99bGgS0jRrOxzZG4uCk2Yb2Y=
github.com/go-git/go-git/v5 v5.16.4/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
@@ -154,8 +156,8 @@ github.com/go-playground/validator/v10 v10.29.0 h1:lQlF5VNJWNlRbRZNeOIkWElR+1LL/
github.com/go-playground/validator/v10 v10.29.0/go.mod h1:D6QxqeMlgIPuT02L66f2ccrZ7AGgHkzKmmTMZhk/Kc4=
github.com/go-shiori/dom v0.0.0-20230515143342-73569d674e1c h1:wpkoddUomPfHiOziHZixGO5ZBS73cKqVzZipfrLmO1w=
github.com/go-shiori/dom v0.0.0-20230515143342-73569d674e1c/go.mod h1:oVDCh3qjJMLVUSILBRwrm+Bc6RNXGZYtoh9xdvf1ffM=
github.com/go-shiori/go-readability v0.0.0-20250217085726-9f5bf5ca7612 h1:BYLNYdZaepitbZreRIa9xeCQZocWmy/wj4cGIH0qyw0=
github.com/go-shiori/go-readability v0.0.0-20250217085726-9f5bf5ca7612/go.mod h1:wgqthQa8SAYs0yyljVeCOQlZ027VW5CmLsbi9jWC08c=
github.com/go-shiori/go-readability v0.0.0-20251205110129-5db1dc9836f0 h1:A3B75Yp163FAIf9nLlFMl4pwIj+T3uKxfI7mbvvY2Ls=
github.com/go-shiori/go-readability v0.0.0-20251205110129-5db1dc9836f0/go.mod h1:suxK0Wpz4BM3/2+z1mnOVTIWHDiMCIOGoKDCRumSsk0=
github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=
github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/goccy/go-yaml v1.19.1 h1:3rG3+v8pkhRqoQ/88NYNMHYVGYztCOCIZ7UQhu7H+NE=
@@ -181,8 +183,8 @@ github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0=
github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM=
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/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4=
github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA=
github.com/googleapis/enterprise-certificate-proxy v0.3.7 h1:zrn2Ee/nWmHulBx5sAVrGgAa0f2/R35S4DJwfFaUPFQ=
github.com/googleapis/enterprise-certificate-proxy v0.3.7/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA=
github.com/googleapis/gax-go/v2 v2.15.0 h1:SyjDc1mGgZU5LncH8gimWo9lW1DtIfPibOG81vgd/bo=
github.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld9rcmyfL1OZhoc=
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
@@ -219,8 +221,8 @@ github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjS
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
github.com/mattn/go-sqlite3 v1.14.28 h1:ThEiQrnbtumT+QMknw63Befp/ce/nUPgBPMlRFEum7A=
github.com/mattn/go-sqlite3 v1.14.28/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
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/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -228,8 +230,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/nicksnyder/go-i18n/v2 v2.6.0 h1:C/m2NNWNiTB6SK4Ao8df5EWm3JETSTIGNXBpMJTxzxQ=
github.com/nicksnyder/go-i18n/v2 v2.6.0/go.mod h1:88sRqr0C6OPyJn0/KRNaEz1uWorjxIKP7rUUcvycecE=
github.com/ollama/ollama v0.11.7 h1:CuYjaJ/YEnvLDpJocJbbVdpdVFyGA/OP6lKFyzZD4dI=
github.com/ollama/ollama v0.11.7/go.mod h1:9+1//yWPsDE2u+l1a5mpaKrYw4VdnSsRU3ioq5BvMms=
github.com/ollama/ollama v0.13.5 h1:ulttnWgeQrXc9jVsGReIP/9MCA+pF1XYTsdwiNMeZfk=
github.com/ollama/ollama v0.13.5/go.mod h1:2VxohsKICsmUCrBjowf+luTXYiXn2Q70Cnvv5Urbzkw=
github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
github.com/openai/openai-go v1.12.0 h1:NBQCnXzqOTv5wsgNC36PrFEiskGfO5wccfCWDo9S1U0=
@@ -257,20 +259,20 @@ github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/samber/lo v1.50.0 h1:XrG0xOeHs+4FQ8gJR97zDz5uOFMW7OwFWiFVzqopKgY=
github.com/samber/lo v1.50.0/go.mod h1:RjZyNk6WSnUFRKK6EyOhsRJMqft3G+pg7dCWHQCWvsc=
github.com/samber/lo v1.52.0 h1:Rvi+3BFHES3A8meP33VPAxiBZX/Aws5RxrschYGjomw=
github.com/samber/lo v1.52.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0=
github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4/go.mod h1:C1a7PQSMz9NShzorzCiG2fk9+xuCgLkPeCvMHYR2OWg=
github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw=
github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
github.com/sgaunet/perplexity-go/v2 v2.8.0 h1:stnuVieniZMGo6qJLCV2JyR2uF7K5398YOA/ZZcgrSg=
github.com/sgaunet/perplexity-go/v2 v2.8.0/go.mod h1:MSks4RNuivCi0GqJyylhFdgSJFVEwZHjAhrf86Wkynk=
github.com/sgaunet/perplexity-go/v2 v2.14.0 h1:DRHqsyBJ81+G73ZEI6ZxRe6YfJkv3kGzvtaEAIlEpcc=
github.com/sgaunet/perplexity-go/v2 v2.14.0/go.mod h1:xaU5Ckuyy8pjw8ZYHgA3mQWlUqK4GOqn2ncvh+mkhg0=
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnBY8=
github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY=
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU=
github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4=
github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY=
github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
@@ -308,20 +310,20 @@ github.com/ugorji/go/codec v1.3.1/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2W
github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=
github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q=
go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg=
go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E=
go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE=
go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs=
go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs=
go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY=
go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis=
go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4=
go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w=
go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA=
go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8=
go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM=
go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA=
go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI=
go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E=
go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg=
go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM=
go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA=
go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE=
go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs=
go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y=
go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU=
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
@@ -359,8 +361,8 @@ golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU=
golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY=
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw=
golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -411,8 +413,8 @@ golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=
golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=
golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=
golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
@@ -423,18 +425,20 @@ golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA=
golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/api v0.247.0 h1:tSd/e0QrUlLsrwMKmkbQhYVa109qIintOls2Wh6bngc=
google.golang.org/api v0.247.0/go.mod h1:r1qZOPmxXffXg6xS5uhx16Fa/UFY8QU/K4bfKrnvovM=
google.golang.org/genai v1.17.0 h1:lXYSnWShPYjxTouxRj0zF8RsNmSF+SKo7SQ7dM35NlI=
google.golang.org/genai v1.17.0/go.mod h1:QPj5NGJw+3wEOHg+PrsWwJKvG6UC84ex5FR7qAYsN/M=
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
google.golang.org/api v0.258.0 h1:IKo1j5FBlN74fe5isA2PVozN3Y5pwNKriEgAXPOkDAc=
google.golang.org/api v0.258.0/go.mod h1:qhOMTQEZ6lUps63ZNq9jhODswwjkjYYguA7fA3TBFww=
google.golang.org/genai v1.40.0 h1:kYxyQSH+vsib8dvsgyLJzsVEIv5k3ZmHJyVqdvGncmc=
google.golang.org/genai v1.40.0/go.mod h1:A3kkl0nyBjyFlNjgxIwKq70julKbIxpSxqKO5gw/gmk=
google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuOnu87KpaYtjK5zBMLcULh7gxkCXu4=
google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s=
google.golang.org/genproto/googleapis/api v0.0.0-20250818200422-3122310a409c h1:AtEkQdl5b6zsybXcbz00j1LwNodDuH6hVifIaNqk7NQ=
google.golang.org/genproto/googleapis/api v0.0.0-20250818200422-3122310a409c/go.mod h1:ea2MjsO70ssTfCjiwHgI0ZFqcw45Ksuk2ckf9G468GA=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c h1:qXWI/sQtv5UKboZ/zUk7h+mrf/lXORyI+n9DKDAusdg=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c/go.mod h1:gw1tLEfykwDz2ET4a12jcXt4couGAm7IwsVaTy0Sflo=
google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4=
google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM=
google.golang.org/genproto/googleapis/api v0.0.0-20251029180050-ab9386a59fda h1:+2XxjfsAu6vqFxwGBRcHiMaDCuZiqXGDUDVWVtrFAnE=
google.golang.org/genproto/googleapis/api v0.0.0-20251029180050-ab9386a59fda/go.mod h1:fDMmzKV90WSg1NbozdqrE64fkuTv6mlq2zxo9ad+3yo=
google.golang.org/genproto/googleapis/rpc v0.0.0-20251213004720-97cd9d5aeac2 h1:2I6GHUeJ/4shcDpoUlLs/2WPnhg7yJwvXtqcMJt9liA=
google.golang.org/genproto/googleapis/rpc v0.0.0-20251213004720-97cd9d5aeac2/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk=
google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc=
google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U=
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

View File

@@ -283,30 +283,30 @@ func assignWithConversion(targetField, sourceField reflect.Value) error {
return nil
}
}
return fmt.Errorf("%s", fmt.Sprintf(i18n.T("cannot_convert_string"), str, targetField.Kind()))
return fmt.Errorf(i18n.T("cannot_convert_string"), str, targetField.Kind())
}
return fmt.Errorf("%s", fmt.Sprintf(i18n.T("unsupported_conversion"), sourceField.Kind(), targetField.Kind()))
return fmt.Errorf(i18n.T("unsupported_conversion"), sourceField.Kind(), targetField.Kind())
}
func loadYAMLConfig(configPath string) (*Flags, error) {
absPath, err := util.GetAbsolutePath(configPath)
if err != nil {
return nil, fmt.Errorf("%s", fmt.Sprintf(i18n.T("invalid_config_path"), err))
return nil, fmt.Errorf(i18n.T("invalid_config_path"), err)
}
data, err := os.ReadFile(absPath)
if err != nil {
if os.IsNotExist(err) {
return nil, fmt.Errorf("%s", fmt.Sprintf(i18n.T("config_file_not_found"), absPath))
return nil, fmt.Errorf(i18n.T("config_file_not_found"), absPath)
}
return nil, fmt.Errorf("%s", fmt.Sprintf(i18n.T("error_reading_config_file"), err))
return nil, fmt.Errorf(i18n.T("error_reading_config_file"), err)
}
// Use the existing Flags struct for YAML unmarshal
config := &Flags{}
if err := yaml.Unmarshal(data, config); err != nil {
return nil, fmt.Errorf("%s", fmt.Sprintf(i18n.T("error_parsing_config_file"), err))
return nil, fmt.Errorf(i18n.T("error_parsing_config_file"), err)
}
debuglog.Debug(debuglog.Detailed, "Config: %v\n", config)
@@ -324,7 +324,7 @@ func readStdin() (ret string, err error) {
sb.WriteString(line)
break
}
err = fmt.Errorf("%s", fmt.Sprintf(i18n.T("error_reading_piped_message"), readErr))
err = fmt.Errorf(i18n.T("error_reading_piped_message"), readErr)
return
} else {
sb.WriteString(line)
@@ -342,7 +342,7 @@ func validateImageFile(imagePath string) error {
// Check if file already exists
if _, err := os.Stat(imagePath); err == nil {
return fmt.Errorf("%s", fmt.Sprintf(i18n.T("image_file_already_exists"), imagePath))
return fmt.Errorf(i18n.T("image_file_already_exists"), imagePath)
}
// Check file extension
@@ -353,7 +353,7 @@ func validateImageFile(imagePath string) error {
return nil // Valid extension found
}
return fmt.Errorf("%s", fmt.Sprintf(i18n.T("invalid_image_file_extension"), ext))
return fmt.Errorf(i18n.T("invalid_image_file_extension"), ext)
}
// validateImageParameters validates image generation parameters
@@ -371,7 +371,7 @@ func validateImageParameters(imagePath, size, quality, background string, compre
validSizes := []string{"1024x1024", "1536x1024", "1024x1536", "auto"}
valid := slices.Contains(validSizes, size)
if !valid {
return fmt.Errorf("%s", fmt.Sprintf(i18n.T("invalid_image_size"), size))
return fmt.Errorf(i18n.T("invalid_image_size"), size)
}
}
@@ -380,7 +380,7 @@ func validateImageParameters(imagePath, size, quality, background string, compre
validQualities := []string{"low", "medium", "high", "auto"}
valid := slices.Contains(validQualities, quality)
if !valid {
return fmt.Errorf("%s", fmt.Sprintf(i18n.T("invalid_image_quality"), quality))
return fmt.Errorf(i18n.T("invalid_image_quality"), quality)
}
}
@@ -389,7 +389,7 @@ func validateImageParameters(imagePath, size, quality, background string, compre
validBackgrounds := []string{"opaque", "transparent"}
valid := slices.Contains(validBackgrounds, background)
if !valid {
return fmt.Errorf("%s", fmt.Sprintf(i18n.T("invalid_image_background"), background))
return fmt.Errorf(i18n.T("invalid_image_background"), background)
}
}
@@ -399,17 +399,17 @@ func validateImageParameters(imagePath, size, quality, background string, compre
// Validate compression (only for jpeg/webp)
if compression != 0 { // 0 means not set
if ext != ".jpg" && ext != ".jpeg" && ext != ".webp" {
return fmt.Errorf("%s", fmt.Sprintf(i18n.T("image_compression_jpeg_webp_only"), ext))
return fmt.Errorf(i18n.T("image_compression_jpeg_webp_only"), ext)
}
if compression < 0 || compression > 100 {
return fmt.Errorf("%s", fmt.Sprintf(i18n.T("image_compression_range_error"), compression))
return fmt.Errorf(i18n.T("image_compression_range_error"), compression)
}
}
// Validate background transparency (only for png/webp)
if background == "transparent" {
if ext != ".png" && ext != ".webp" {
return fmt.Errorf("%s", fmt.Sprintf(i18n.T("transparent_background_png_webp_only"), ext))
return fmt.Errorf(i18n.T("transparent_background_png_webp_only"), ext)
}
}

View File

@@ -30,6 +30,28 @@ func handleListingCommands(currentFlags *Flags, fabricDb *fsdb.Db, registry *cor
}
if currentFlags.ListPatterns {
// Check if patterns exist before listing
var names []string
if names, err = fabricDb.Patterns.GetNames(); err != nil {
return true, err
}
if len(names) == 0 && !currentFlags.ShellCompleteOutput {
// No patterns found - provide helpful guidance
fmt.Println("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
fmt.Println(i18n.T("patterns_not_found_header"))
fmt.Println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
fmt.Printf("\n%s\n", i18n.T("patterns_required_to_work"))
fmt.Println()
fmt.Println(i18n.T("patterns_option_run_setup"))
fmt.Printf(" %s\n", i18n.T("patterns_option_run_setup_command"))
fmt.Println()
fmt.Println(i18n.T("patterns_option_run_update"))
fmt.Printf(" %s\n", i18n.T("patterns_option_run_update_command"))
fmt.Println()
return true, nil
}
err = fabricDb.Patterns.ListNames(currentFlags.ShellCompleteOutput)
return true, err
}

View File

@@ -53,13 +53,9 @@ func (o *Chatter) Send(request *domain.ChatRequest, opts *domain.ChatOptions) (s
return
}
if opts.Model == "" {
opts.Model = o.model
} else {
// Ensure opts.Model uses the normalized name from o.model if they refer to the same model
// This handles cases where user provides "GPT-5" but we've normalized it to "gpt-5"
opts.Model = o.model
}
// Always use the normalized model name from the Chatter
// This handles cases where user provides "GPT-5" but we've normalized it to "gpt-5"
opts.Model = o.model
if opts.ModelContextLength == 0 {
opts.ModelContextLength = o.modelContextLength

View File

@@ -176,29 +176,178 @@ func (o *PluginRegistry) SaveEnvFile() (err error) {
}
func (o *PluginRegistry) Setup() (err error) {
setupQuestion := plugins.NewSetupQuestion("Enter the number of the plugin to setup")
groupsPlugins := util.NewGroupsItemsSelector("Available plugins (please configure all required plugins):",
// Check if this is a first-time setup
isFirstRun := o.isFirstTimeSetup()
if isFirstRun {
err = o.runFirstTimeSetup()
} else {
err = o.runInteractiveSetup()
}
if err != nil {
return
}
// Validate setup after completion
o.validateSetup()
return
}
// isFirstTimeSetup checks if this is a first-time setup
func (o *PluginRegistry) isFirstTimeSetup() bool {
// Check if patterns and strategies are not configured
patternsConfigured := o.PatternsLoader.IsConfigured()
strategiesConfigured := o.Strategies.IsConfigured()
hasVendor := len(o.VendorManager.Vendors) > 0
return !patternsConfigured || !strategiesConfigured || !hasVendor
}
// runFirstTimeSetup handles first-time setup with automatic pattern/strategy download
func (o *PluginRegistry) runFirstTimeSetup() (err error) {
fmt.Println("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
fmt.Println(i18n.T("setup_welcome_header"))
fmt.Println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
// Step 1: Download patterns (required, automatic)
if !o.PatternsLoader.IsConfigured() {
fmt.Printf("\n%s\n", i18n.T("setup_step_downloading_patterns"))
if err = o.PatternsLoader.Setup(); err != nil {
return fmt.Errorf(i18n.T("setup_failed_download_patterns"), err)
}
if err = o.SaveEnvFile(); err != nil {
return
}
}
// Step 2: Download strategies (required, automatic)
if !o.Strategies.IsConfigured() {
fmt.Printf("\n%s\n", i18n.T("setup_step_downloading_strategies"))
if err = o.Strategies.Setup(); err != nil {
return fmt.Errorf(i18n.T("setup_failed_download_strategies"), err)
}
if err = o.SaveEnvFile(); err != nil {
return
}
}
// Step 3: Configure AI vendor (interactive)
if len(o.VendorManager.Vendors) == 0 {
fmt.Printf("\n%s\n", i18n.T("setup_step_configure_ai_provider"))
fmt.Printf(" %s\n", i18n.T("setup_ai_provider_required"))
fmt.Printf(" %s\n", i18n.T("setup_add_more_providers_later"))
fmt.Println()
if err = o.runVendorSetup(); err != nil {
return
}
}
// Step 4: Set default vendor and model
if !o.Defaults.IsConfigured() {
fmt.Printf("\n%s\n", i18n.T("setup_step_setting_defaults"))
if err = o.Defaults.Setup(); err != nil {
return fmt.Errorf(i18n.T("setup_failed_set_defaults"), err)
}
if err = o.SaveEnvFile(); err != nil {
return
}
}
fmt.Println("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
fmt.Println(i18n.T("setup_complete_header"))
fmt.Println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
fmt.Printf("\n%s\n", i18n.T("setup_next_steps"))
fmt.Printf(" %s\n", i18n.T("setup_list_patterns"))
fmt.Printf(" %s\n", i18n.T("setup_try_pattern"))
fmt.Printf(" %s\n", i18n.T("setup_configure_more"))
fmt.Println()
return
}
// runVendorSetup helps user select and configure their first AI vendor
func (o *PluginRegistry) runVendorSetup() (err error) {
setupQuestion := plugins.NewSetupQuestion("Enter the number of the AI provider to configure")
groupsPlugins := util.NewGroupsItemsSelector(i18n.T("setup_available_ai_providers"),
func(plugin plugins.Plugin) string {
var configuredLabel string
if plugin.IsConfigured() {
configuredLabel = " (configured)"
} else {
configuredLabel = ""
}
return fmt.Sprintf("%v%v", plugin.GetSetupDescription(), configuredLabel)
return plugin.GetSetupDescription()
})
groupsPlugins.AddGroupItems("AI Vendors [at least one, required]", lo.Map(o.VendorsAll.Vendors,
groupsPlugins.AddGroupItems("", lo.Map(o.VendorsAll.Vendors,
func(vendor ai.Vendor, _ int) plugins.Plugin {
return vendor
})...)
groupsPlugins.AddGroupItems("Tools", o.CustomPatterns, o.Defaults, o.Jina, o.Language, o.PatternsLoader, o.Strategies, o.YouTube)
groupsPlugins.Print(false)
if answerErr := setupQuestion.Ask(i18n.T("setup_enter_ai_provider_number")); answerErr != nil {
return answerErr
}
if setupQuestion.Value == "" {
return fmt.Errorf("%s", i18n.T("setup_no_ai_provider_selected"))
}
number, parseErr := strconv.Atoi(setupQuestion.Value)
if parseErr != nil {
return fmt.Errorf(i18n.T("setup_invalid_selection"), setupQuestion.Value)
}
var plugin plugins.Plugin
if _, plugin, err = groupsPlugins.GetGroupAndItemByItemNumber(number); err != nil {
return
}
if pluginSetupErr := plugin.Setup(); pluginSetupErr != nil {
return pluginSetupErr
}
if err = o.SaveEnvFile(); err != nil {
return
}
if o.VendorManager.FindByName(plugin.GetName()) == nil {
if vendor, ok := plugin.(ai.Vendor); ok {
o.VendorManager.AddVendors(vendor)
}
}
return
}
// runInteractiveSetup runs the standard interactive setup menu
func (o *PluginRegistry) runInteractiveSetup() (err error) {
setupQuestion := plugins.NewSetupQuestion(i18n.T("setup_plugin_prompt"))
groupsPlugins := util.NewGroupsItemsSelector(i18n.T("setup_available_plugins"),
func(plugin plugins.Plugin) string {
var configuredLabel string
if plugin.IsConfigured() {
configuredLabel = i18n.T("plugin_configured")
} else {
configuredLabel = i18n.T("plugin_not_configured")
}
return fmt.Sprintf("%v%v", plugin.GetSetupDescription(), configuredLabel)
})
// Add vendors first under REQUIRED section
groupsPlugins.AddGroupItems(i18n.T("setup_required_configuration_header"), lo.Map(o.VendorsAll.Vendors,
func(vendor ai.Vendor, _ int) plugins.Plugin {
return vendor
})...)
// Add required tools
groupsPlugins.AddGroupItems(i18n.T("setup_required_tools"), o.Defaults, o.PatternsLoader, o.Strategies)
// Add optional tools
groupsPlugins.AddGroupItems(i18n.T("setup_optional_configuration_header"), o.CustomPatterns, o.Jina, o.Language, o.YouTube)
for {
groupsPlugins.Print(false)
if answerErr := setupQuestion.Ask("Plugin Number"); answerErr != nil {
if answerErr := setupQuestion.Ask(i18n.T("setup_plugin_number")); answerErr != nil {
break
}
@@ -237,6 +386,58 @@ func (o *PluginRegistry) Setup() (err error) {
return
}
// validateSetup checks if required components are configured and warns user
func (o *PluginRegistry) validateSetup() {
fmt.Println("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
fmt.Println(i18n.T("setup_validation_header"))
fmt.Println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
missingRequired := false
// Check AI vendor
if len(o.VendorManager.Vendors) > 0 {
fmt.Printf(" %s\n", i18n.T("setup_validation_ai_provider_configured"))
} else {
fmt.Printf(" %s\n", i18n.T("setup_validation_ai_provider_missing"))
missingRequired = true
}
// Check default model
if o.Defaults.IsConfigured() {
fmt.Printf(" %s\n", fmt.Sprintf(i18n.T("setup_validation_defaults_configured"), o.Defaults.Vendor.Value, o.Defaults.Model.Value))
} else {
fmt.Printf(" %s\n", i18n.T("setup_validation_defaults_missing"))
missingRequired = true
}
// Check patterns
if o.PatternsLoader.IsConfigured() {
fmt.Printf(" %s\n", i18n.T("setup_validation_patterns_configured"))
} else {
fmt.Printf(" %s\n", i18n.T("setup_validation_patterns_missing"))
missingRequired = true
}
// Check strategies
if o.Strategies.IsConfigured() {
fmt.Printf(" %s\n", i18n.T("setup_validation_strategies_configured"))
} else {
fmt.Printf(" %s\n", i18n.T("setup_validation_strategies_missing"))
missingRequired = true
}
fmt.Println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
if missingRequired {
fmt.Printf("\n%s\n", i18n.T("setup_validation_incomplete_warning"))
fmt.Printf(" %s\n", i18n.T("setup_validation_incomplete_help"))
fmt.Println()
} else {
fmt.Printf("\n%s\n", i18n.T("setup_validation_complete"))
fmt.Println()
}
}
func (o *PluginRegistry) SetupVendor(vendorName string) (err error) {
if err = o.VendorsAll.SetupVendor(vendorName, o.VendorManager.VendorsByName); err != nil {
return

View File

@@ -1,165 +1,289 @@
{
"html_readability_error": "verwende ursprüngliche Eingabe, da HTML-Lesbarkeit nicht angewendet werden kann",
"vendor_not_configured": "Anbieter %s ist nicht konfiguriert",
"vendor_no_transcription_support": "Anbieter %s unterstützt keine Audio-Transkription",
"transcription_model_required": "Transkriptionsmodell ist erforderlich (verwende --transcribe-model)",
"youtube_not_configured": "YouTube ist nicht konfiguriert, bitte führe das Setup-Verfahren aus",
"youtube_api_key_required": "YouTube API-Schlüssel für Kommentare und Metadaten erforderlich. Führe 'fabric --setup' aus, um zu konfigurieren",
"youtube_ytdlp_not_found": "yt-dlp wurde nicht in PATH gefunden. Bitte installiere yt-dlp, um die YouTube-Transkript-Funktionalität zu nutzen",
"youtube_invalid_url": "ungültige YouTube-URL, kann keine Video- oder Playlist-ID abrufen: '%s'",
"youtube_url_is_playlist_not_video": "URL ist eine Playlist, kein Video",
"youtube_no_video_id_found": "keine Video-ID in URL gefunden",
"youtube_rate_limit_exceeded": "YouTube-Ratenlimit überschritten. Versuche es später erneut oder verwende andere yt-dlp-Argumente wie '--sleep-requests 1', um Anfragen zu verlangsamen.",
"youtube_auth_required_bot_detection": "YouTube erfordert Authentifizierung (Bot-Erkennung). Verwende --yt-dlp-args='--cookies-from-browser BROWSER' wobei BROWSER chrome, firefox, brave usw. sein kann.",
"youtube_ytdlp_stderr_error": "Fehler beim Lesen von yt-dlp stderr",
"youtube_invalid_ytdlp_arguments": "ungültige yt-dlp-Argumente: %v",
"youtube_failed_create_temp_dir": "temporäres Verzeichnis konnte nicht erstellt werden: %v",
"youtube_no_transcript_content": "kein Transkriptinhalt in VTT-Datei gefunden",
"youtube_no_vtt_files_found": "keine VTT-Dateien im Verzeichnis gefunden",
"youtube_failed_walk_directory": "Verzeichnis konnte nicht durchlaufen werden: %v",
"youtube_error_getting_video_details": "Fehler beim Abrufen der Videodetails: %v",
"youtube_invalid_duration_string": "ungültige Dauer-Zeichenfolge: %s",
"youtube_error_getting_metadata": "Fehler beim Abrufen der Video-Metadaten: %v",
"youtube_error_parsing_duration": "Fehler beim Parsen der Videodauer: %v",
"youtube_error_getting_comments": "Fehler beim Abrufen der Kommentare: %v",
"youtube_error_saving_csv": "Fehler beim Speichern der Videos in CSV: %v",
"youtube_no_video_found_with_id": "kein Video mit ID gefunden: %s",
"youtube_invalid_timestamp_format": "ungültiges Zeitstempel-Format: %s",
"youtube_empty_seconds_string": "leere Sekunden-Zeichenfolge",
"youtube_invalid_seconds_format": "ungültiges Sekundenformat %q: %w",
"error_fetching_playlist_videos": "Fehler beim Abrufen der Playlist-Videos: %w",
"openai_api_base_url_not_configured": "API-Basis-URL für Anbieter %s nicht konfiguriert",
"openai_failed_to_create_models_url": "Modell-URL konnte nicht erstellt werden: %w",
"openai_unexpected_status_code_with_body": "unerwarteter Statuscode: %d von Anbieter %s, Antwort: %s",
"openai_unexpected_status_code_read_error_partial": "unerwarteter Statuscode: %d von Anbieter %s (Fehler beim Lesen: %v), teilweise Antwort: %s",
"openai_unexpected_status_code_read_error": "unerwarteter Statuscode: %d von Anbieter %s (Fehler beim Lesen der Antwort: %v)",
"openai_unable_to_parse_models_response": "Modell-Antwort konnte nicht geparst werden; rohe Antwort: %s",
"scraping_not_configured": "Scraping-Funktionalität ist nicht konfiguriert. Bitte richte Jina ein, um Scraping zu aktivieren",
"could_not_determine_home_dir": "konnte Benutzer-Home-Verzeichnis nicht bestimmen: %w",
"could_not_stat_env_file": "konnte .env-Datei nicht überprüfen: %w",
"could_not_create_config_dir": "konnte Konfigurationsverzeichnis nicht erstellen: %w",
"could_not_create_env_file": "konnte .env-Datei nicht erstellen: %w",
"could_not_copy_to_clipboard": "konnte nicht in die Zwischenablage kopieren: %v",
"file_already_exists_not_overwriting": "Datei %s existiert bereits, wird nicht überschrieben. Benenne die vorhandene Datei um oder wähle einen anderen Namen",
"error_creating_file": "Fehler beim Erstellen der Datei: %v",
"error_writing_to_file": "Fehler beim Schreiben in die Datei: %v",
"error_creating_audio_file": "Fehler beim Erstellen der Audio-Datei: %v",
"error_writing_audio_data": "Fehler beim Schreiben von Audio-Daten in die Datei: %v",
"tts_model_requires_audio_output": "TTS-Modell '%s' benötigt Audio-Ausgabe. Bitte gib eine Audio-Ausgabedatei mit dem -o Flag an (z.B., -o output.wav)",
"audio_output_file_specified_but_not_tts_model": "Audio-Ausgabedatei '%s' angegeben, aber Modell '%s' ist kein TTS-Modell. Bitte verwende ein TTS-Modell wie gemini-2.5-flash-preview-tts",
"file_already_exists_choose_different": "Datei %s existiert bereits. Bitte wähle einen anderen Dateinamen oder entferne die vorhandene Datei",
"no_notification_system_available": "kein Benachrichtigungssystem verfügbar",
"cannot_convert_string": "kann String %q nicht zu %v konvertieren",
"unsupported_conversion": "nicht unterstützte Konvertierung von %v zu %v",
"invalid_config_path": "ungültiger Konfigurationspfad: %w",
"config_file_not_found": "Konfigurationsdatei nicht gefunden: %s",
"error_reading_config_file": "Fehler beim Lesen der Konfigurationsdatei: %w",
"error_parsing_config_file": "Fehler beim Parsen der Konfigurationsdatei: %w",
"error_reading_piped_message": "Fehler beim Lesen der weitergeleiteten Nachricht von stdin: %w",
"image_file_already_exists": "Bilddatei existiert bereits: %s",
"invalid_image_file_extension": "ungültige Bilddatei-Erweiterung '%s'. Unterstützte Formate: .png, .jpeg, .jpg, .webp",
"image_parameters_require_image_file": "Bildparameter (--image-size, --image-quality, --image-background, --image-compression) können nur mit --image-file verwendet werden",
"invalid_image_size": "ungültige Bildgröße '%s'. Unterstützte Größen: 1024x1024, 1536x1024, 1024x1536, auto",
"invalid_image_quality": "ungültige Bildqualität '%s'. Unterstützte Qualitäten: low, medium, high, auto",
"invalid_image_background": "ungültiger Bildhintergrund '%s'. Unterstützte Hintergründe: opaque, transparent",
"image_compression_jpeg_webp_only": "Bildkomprimierung kann nur mit JPEG- und WebP-Formaten verwendet werden, nicht %s",
"image_compression_range_error": "Bildkomprimierung muss zwischen 0 und 100 liegen, erhalten: %d",
"transparent_background_png_webp_only": "transparenter Hintergrund kann nur mit PNG- und WebP-Formaten verwendet werden, nicht %s",
"available_transcription_models": "Verfügbare Transkriptionsmodelle:",
"tts_audio_generated_successfully": "TTS-Audio erfolgreich generiert und gespeichert unter: %s\n",
"fabric_command_complete": "Fabric-Befehl abgeschlossen",
"fabric_command_complete_with_pattern": "Fabric: %s abgeschlossen",
"command_completed_successfully": "Befehl erfolgreich abgeschlossen",
"output_truncated": "Ausgabe: %s...",
"output_full": "Ausgabe: %s",
"choose_pattern_from_available": "Wähle ein Muster aus den verfügbaren Mustern",
"pattern_variables_help": "Werte für Mustervariablen, z.B. -v=#role:expert -v=#points:30",
"choose_context_from_available": "Wähle einen Kontext aus den verfügbaren Kontexten",
"choose_session_from_available": "Wähle eine Sitzung aus den verfügbaren Sitzungen",
"attachment_path_or_url_help": "Anhangspfad oder URL (z.B. für OpenAI-Bilderkennungsnachrichten)",
"run_setup_for_reconfigurable_parts": "Setup für alle rekonfigurierbaren Teile von Fabric ausführen",
"set_temperature": "Temperatur festlegen",
"set_top_p": "Top P festlegen",
"stream_help": "Streaming",
"set_presence_penalty": "Präsenzstrafe festlegen",
"use_model_defaults_raw_help": "Verwende die Standardwerte des Modells, ohne Chat-Optionen (temperature, top_p usw.) zu senden. Gilt nur für OpenAI-kompatible Anbieter. Anthropic-Modelle verwenden stets eine intelligente Parameterauswahl, um modell-spezifische Anforderungen einzuhalten.",
"set_frequency_penalty": "Häufigkeitsstrafe festlegen",
"list_all_patterns": "Alle Muster auflisten",
"list_all_available_models": "Alle verfügbaren Modelle auflisten",
"list_all_contexts": "Alle Kontexte auflisten",
"list_all_sessions": "Alle Sitzungen auflisten",
"update_patterns": "Muster aktualisieren",
"messages_to_send_to_chat": "Nachrichten zum Senden an den Chat",
"copy_to_clipboard": "In Zwischenablage kopieren",
"choose_model": "Modell wählen",
"specify_vendor_for_model": "Anbieter für das ausgewählte Modell angeben (z.B., -V \"LM Studio\" -m openai/gpt-oss-20b)",
"model_context_length_ollama": "Modell-Kontextlänge (betrifft nur ollama)",
"output_to_file": "Ausgabe in Datei",
"output_entire_session": "Gesamte Sitzung (auch eine temporäre) in die Ausgabedatei ausgeben",
"number_of_latest_patterns": "Anzahl der neuesten Muster zum Auflisten",
"change_default_model": "Standardmodell ändern",
"youtube_url_help": "YouTube-Video oder Playlist-\"URL\" zum Abrufen von Transkript und Kommentaren und Senden an Chat oder Ausgabe in Konsole und Speichern in Ausgabedatei",
"prefer_playlist_over_video": "Playlist gegenüber Video bevorzugen, wenn beide IDs in der URL vorhanden sind",
"grab_transcript_from_youtube": "Transkript von YouTube-Video abrufen und an Chat senden (wird standardmäßig verwendet).",
"grab_transcript_with_timestamps": "Transkript von YouTube-Video mit Zeitstempeln abrufen und an Chat senden",
"grab_comments_from_youtube": "Kommentare von YouTube-Video abrufen und an Chat senden",
"output_video_metadata": "Video-Metadaten ausgeben",
"additional_yt_dlp_args": "Zusätzliche Argumente für yt-dlp (z.B. '--cookies-from-browser brave')",
"specify_language_code": "Sprachencode für den Chat angeben, z.B. -g=en -g=zh -g=pt-BR -g=pt-PT",
"scrape_website_url": "Website-URL zu Markdown mit Jina AI scrapen",
"search_question_jina": "Suchanfrage mit Jina AI",
"seed_for_lmm_generation": "Seed für LMM-Generierung",
"wipe_context": "Kontext löschen",
"wipe_session": "Sitzung löschen",
"print_context": "Kontext ausgeben",
"print_session": "Sitzung ausgeben",
"convert_html_readability": "HTML-Eingabe in eine saubere, lesbare Ansicht konvertieren",
"apply_variables_to_input": "Variablen auf Benutzereingabe anwenden",
"disable_pattern_variable_replacement": "Mustervariablenersetzung deaktivieren",
"show_dry_run": "Zeige, was an das Modell gesendet würde, ohne es tatsächlich zu senden",
"serve_fabric_rest_api": "Fabric REST API bereitstellen",
"serve_fabric_api_ollama_endpoints": "Fabric REST API mit ollama-Endpunkten bereitstellen",
"address_to_bind_rest_api": "Adresse zum Binden der REST API",
"api_key_secure_server_routes": "API-Schlüssel zum Sichern der Server-Routen",
"path_to_yaml_config": "Pfad zur YAML-Konfigurationsdatei",
"print_current_version": "Aktuelle Version ausgeben",
"list_all_registered_extensions": "Alle registrierten Erweiterungen auflisten",
"register_new_extension": "Neue Erweiterung aus Konfigurationsdateipfad registrieren",
"remove_registered_extension": "Registrierte Erweiterung nach Name entfernen",
"choose_strategy_from_available": "Strategie aus den verfügbaren Strategien wählen",
"list_all_strategies": "Alle Strategien auflisten",
"list_all_vendors": "Alle Anbieter auflisten",
"output_raw_list_shell_completion": "Rohe Liste ohne Kopfzeilen/Formatierung ausgeben (für Shell-Vervollständigung)",
"enable_web_search_tool": "Web-Such-Tool für unterstützte Modelle aktivieren (Anthropic, OpenAI, Gemini)",
"set_location_web_search": "Standort für Web-Suchergebnisse festlegen (z.B., 'America/Los_Angeles')",
"save_generated_image_to_file": "Generiertes Bild in angegebenem Dateipfad speichern (z.B., 'output.png')",
"image_dimensions_help": "Bildabmessungen: 1024x1024, 1536x1024, 1024x1536, auto (Standard: auto)",
"image_quality_help": "Bildqualität: low, medium, high, auto (Standard: auto)",
"compression_level_jpeg_webp": "Komprimierungslevel 0-100 für JPEG/WebP-Formate (Standard: nicht gesetzt)",
"background_type_help": "Hintergrundtyp: opaque, transparent (Standard: opaque, nur für PNG/WebP)",
"suppress_thinking_tags": "In Denk-Tags eingeschlossenen Text unterdrücken",
"start_tag_thinking_sections": "Start-Tag für Denk-Abschnitte",
"end_tag_thinking_sections": "End-Tag für Denk-Abschnitte",
"disable_openai_responses_api": "OpenAI Responses API deaktivieren (Standard: false)",
"audio_video_file_transcribe": "Audio- oder Video-Datei zum Transkribieren",
"model_for_transcription": "Modell für Transkription (getrennt vom Chat-Modell)",
"split_media_files_ffmpeg": "Audio/Video-Dateien größer als 25MB mit ffmpeg aufteilen",
"tts_voice_name": "TTS-Stimmenname für unterstützte Modelle (z.B., Kore, Charon, Puck)",
"list_gemini_tts_voices": "Alle verfügbaren Gemini TTS-Stimmen auflisten",
"list_transcription_models": "Alle verfügbaren Transkriptionsmodelle auflisten",
"send_desktop_notification": "Desktop-Benachrichtigung senden, wenn Befehl abgeschlossen ist",
"custom_notification_command": "Benutzerdefinierter Befehl für Benachrichtigungen (überschreibt eingebaute Benachrichtigungen)",
"set_reasoning_thinking_level": "Reasoning/Thinking-Level festlegen (z.B., off, low, medium, high, oder numerische Token für Anthropic oder Google Gemini)",
"set_debug_level": "Debug-Level festlegen (0=aus, 1=grundlegend, 2=detailliert, 3=Trace)",
"usage_header": "Verwendung:",
"application_options_header": "Anwendungsoptionen:",
"help_options_header": "Hilfe-Optionen:",
"help_message": "Diese Hilfenachricht anzeigen",
"options_placeholder": "[OPTIONEN]",
"available_vendors_header": "Verfügbare Anbieter:",
"available_models_header": "Verfügbare Modelle",
"no_items_found": "Keine %s",
"no_description_available": "Keine Beschreibung verfügbar",
"i18n_download_failed": "Fehler beim Herunterladen der Übersetzung für Sprache '%s': %v",
"i18n_load_failed": "Fehler beim Laden der Übersetzungsdatei: %v"
"html_readability_error": "verwende ursprüngliche Eingabe, da HTML-Lesbarkeit nicht angewendet werden kann",
"vendor_not_configured": "Anbieter %s ist nicht konfiguriert",
"vendor_no_transcription_support": "Anbieter %s unterstützt keine Audio-Transkription",
"transcription_model_required": "Transkriptionsmodell ist erforderlich (verwende --transcribe-model)",
"youtube_not_configured": "YouTube ist nicht konfiguriert, bitte führe das Setup-Verfahren aus",
"youtube_api_key_required": "YouTube API-Schlüssel für Kommentare und Metadaten erforderlich. Führe 'fabric --setup' aus, um zu konfigurieren",
"youtube_ytdlp_not_found": "yt-dlp wurde nicht in PATH gefunden. Bitte installiere yt-dlp, um die YouTube-Transkript-Funktionalität zu nutzen",
"youtube_invalid_url": "ungültige YouTube-URL, kann keine Video- oder Playlist-ID abrufen: '%s'",
"youtube_url_is_playlist_not_video": "URL ist eine Playlist, kein Video",
"youtube_no_video_id_found": "keine Video-ID in URL gefunden",
"youtube_rate_limit_exceeded": "YouTube-Ratenlimit überschritten. Versuche es später erneut oder verwende andere yt-dlp-Argumente wie '--sleep-requests 1', um Anfragen zu verlangsamen.",
"youtube_auth_required_bot_detection": "YouTube erfordert Authentifizierung (Bot-Erkennung). Verwende --yt-dlp-args='--cookies-from-browser BROWSER' wobei BROWSER chrome, firefox, brave usw. sein kann.",
"youtube_ytdlp_stderr_error": "Fehler beim Lesen von yt-dlp stderr",
"youtube_invalid_ytdlp_arguments": "ungültige yt-dlp-Argumente: %v",
"youtube_failed_create_temp_dir": "temporäres Verzeichnis konnte nicht erstellt werden: %v",
"youtube_no_transcript_content": "kein Transkriptinhalt in VTT-Datei gefunden",
"youtube_no_vtt_files_found": "keine VTT-Dateien im Verzeichnis gefunden",
"youtube_failed_walk_directory": "Verzeichnis konnte nicht durchlaufen werden: %v",
"youtube_error_getting_video_details": "Fehler beim Abrufen der Videodetails: %v",
"youtube_invalid_duration_string": "ungültige Dauer-Zeichenfolge: %s",
"youtube_error_getting_metadata": "Fehler beim Abrufen der Video-Metadaten: %v",
"youtube_error_parsing_duration": "Fehler beim Parsen der Videodauer: %v",
"youtube_error_getting_comments": "Fehler beim Abrufen der Kommentare: %v",
"youtube_error_saving_csv": "Fehler beim Speichern der Videos in CSV: %v",
"youtube_no_video_found_with_id": "kein Video mit ID gefunden: %s",
"youtube_invalid_timestamp_format": "ungültiges Zeitstempel-Format: %s",
"youtube_empty_seconds_string": "leere Sekunden-Zeichenfolge",
"youtube_invalid_seconds_format": "ungültiges Sekundenformat %q: %w",
"error_fetching_playlist_videos": "Fehler beim Abrufen der Playlist-Videos: %w",
"openai_api_base_url_not_configured": "API-Basis-URL für Anbieter %s nicht konfiguriert",
"openai_failed_to_create_models_url": "Modell-URL konnte nicht erstellt werden: %w",
"openai_unexpected_status_code_with_body": "unerwarteter Statuscode: %d von Anbieter %s, Antwort: %s",
"openai_unexpected_status_code_read_error_partial": "unerwarteter Statuscode: %d von Anbieter %s (Fehler beim Lesen: %v), teilweise Antwort: %s",
"openai_unexpected_status_code_read_error": "unerwarteter Statuscode: %d von Anbieter %s (Fehler beim Lesen der Antwort: %v)",
"openai_unable_to_parse_models_response": "Modell-Antwort konnte nicht geparst werden; rohe Antwort: %s",
"scraping_not_configured": "Scraping-Funktionalität ist nicht konfiguriert. Bitte richte Jina ein, um Scraping zu aktivieren",
"could_not_determine_home_dir": "konnte Benutzer-Home-Verzeichnis nicht bestimmen: %w",
"could_not_stat_env_file": "konnte .env-Datei nicht überprüfen: %w",
"could_not_create_config_dir": "konnte Konfigurationsverzeichnis nicht erstellen: %w",
"could_not_create_env_file": "konnte .env-Datei nicht erstellen: %w",
"could_not_copy_to_clipboard": "konnte nicht in die Zwischenablage kopieren: %v",
"file_already_exists_not_overwriting": "Datei %s existiert bereits, wird nicht überschrieben. Benenne die vorhandene Datei um oder wähle einen anderen Namen",
"error_creating_file": "Fehler beim Erstellen der Datei: %v",
"error_writing_to_file": "Fehler beim Schreiben in die Datei: %v",
"error_creating_audio_file": "Fehler beim Erstellen der Audio-Datei: %v",
"error_writing_audio_data": "Fehler beim Schreiben von Audio-Daten in die Datei: %v",
"tts_model_requires_audio_output": "TTS-Modell '%s' benötigt Audio-Ausgabe. Bitte gib eine Audio-Ausgabedatei mit dem -o Flag an (z.B., -o output.wav)",
"audio_output_file_specified_but_not_tts_model": "Audio-Ausgabedatei '%s' angegeben, aber Modell '%s' ist kein TTS-Modell. Bitte verwende ein TTS-Modell wie gemini-2.5-flash-preview-tts",
"file_already_exists_choose_different": "Datei %s existiert bereits. Bitte wähle einen anderen Dateinamen oder entferne die vorhandene Datei",
"no_notification_system_available": "kein Benachrichtigungssystem verfügbar",
"cannot_convert_string": "kann String %q nicht zu %v konvertieren",
"unsupported_conversion": "nicht unterstützte Konvertierung von %v zu %v",
"invalid_config_path": "ungültiger Konfigurationspfad: %w",
"config_file_not_found": "Konfigurationsdatei nicht gefunden: %s",
"error_reading_config_file": "Fehler beim Lesen der Konfigurationsdatei: %w",
"error_parsing_config_file": "Fehler beim Parsen der Konfigurationsdatei: %w",
"error_reading_piped_message": "Fehler beim Lesen der weitergeleiteten Nachricht von stdin: %w",
"image_file_already_exists": "Bilddatei existiert bereits: %s",
"invalid_image_file_extension": "ungültige Bilddatei-Erweiterung '%s'. Unterstützte Formate: .png, .jpeg, .jpg, .webp",
"image_parameters_require_image_file": "Bildparameter (--image-size, --image-quality, --image-background, --image-compression) können nur mit --image-file verwendet werden",
"invalid_image_size": "ungültige Bildgröße '%s'. Unterstützte Größen: 1024x1024, 1536x1024, 1024x1536, auto",
"invalid_image_quality": "ungültige Bildqualität '%s'. Unterstützte Qualitäten: low, medium, high, auto",
"invalid_image_background": "ungültiger Bildhintergrund '%s'. Unterstützte Hintergründe: opaque, transparent",
"image_compression_jpeg_webp_only": "Bildkomprimierung kann nur mit JPEG- und WebP-Formaten verwendet werden, nicht %s",
"image_compression_range_error": "Bildkomprimierung muss zwischen 0 und 100 liegen, erhalten: %d",
"transparent_background_png_webp_only": "transparenter Hintergrund kann nur mit PNG- und WebP-Formaten verwendet werden, nicht %s",
"available_transcription_models": "Verfügbare Transkriptionsmodelle:",
"tts_audio_generated_successfully": "TTS-Audio erfolgreich generiert und gespeichert unter: %s\n",
"fabric_command_complete": "Fabric-Befehl abgeschlossen",
"fabric_command_complete_with_pattern": "Fabric: %s abgeschlossen",
"command_completed_successfully": "Befehl erfolgreich abgeschlossen",
"output_truncated": "Ausgabe: %s...",
"output_full": "Ausgabe: %s",
"choose_pattern_from_available": "Wähle ein Muster aus den verfügbaren Mustern",
"pattern_variables_help": "Werte für Mustervariablen, z.B. -v=#role:expert -v=#points:30",
"choose_context_from_available": "Wähle einen Kontext aus den verfügbaren Kontexten",
"choose_session_from_available": "Wähle eine Sitzung aus den verfügbaren Sitzungen",
"attachment_path_or_url_help": "Anhangspfad oder URL (z.B. für OpenAI-Bilderkennungsnachrichten)",
"run_setup_for_reconfigurable_parts": "Setup für alle rekonfigurierbaren Teile von Fabric ausführen",
"set_temperature": "Temperatur festlegen",
"set_top_p": "Top P festlegen",
"stream_help": "Streaming",
"set_presence_penalty": "Präsenzstrafe festlegen",
"use_model_defaults_raw_help": "Verwende die Standardwerte des Modells, ohne Chat-Optionen (temperature, top_p usw.) zu senden. Gilt nur für OpenAI-kompatible Anbieter. Anthropic-Modelle verwenden stets eine intelligente Parameterauswahl, um modell-spezifische Anforderungen einzuhalten.",
"set_frequency_penalty": "Häufigkeitsstrafe festlegen",
"list_all_patterns": "Alle Muster auflisten",
"list_all_available_models": "Alle verfügbaren Modelle auflisten",
"list_all_contexts": "Alle Kontexte auflisten",
"list_all_sessions": "Alle Sitzungen auflisten",
"update_patterns": "Muster aktualisieren",
"messages_to_send_to_chat": "Nachrichten zum Senden an den Chat",
"copy_to_clipboard": "In Zwischenablage kopieren",
"choose_model": "Modell wählen",
"specify_vendor_for_model": "Anbieter für das ausgewählte Modell angeben (z.B., -V \"LM Studio\" -m openai/gpt-oss-20b)",
"model_context_length_ollama": "Modell-Kontextlänge (betrifft nur ollama)",
"output_to_file": "Ausgabe in Datei",
"output_entire_session": "Gesamte Sitzung (auch eine temporäre) in die Ausgabedatei ausgeben",
"number_of_latest_patterns": "Anzahl der neuesten Muster zum Auflisten",
"change_default_model": "Standardmodell ändern",
"youtube_url_help": "YouTube-Video oder Playlist-\"URL\" zum Abrufen von Transkript und Kommentaren und Senden an Chat oder Ausgabe in Konsole und Speichern in Ausgabedatei",
"prefer_playlist_over_video": "Playlist gegenüber Video bevorzugen, wenn beide IDs in der URL vorhanden sind",
"grab_transcript_from_youtube": "Transkript von YouTube-Video abrufen und an Chat senden (wird standardmäßig verwendet).",
"grab_transcript_with_timestamps": "Transkript von YouTube-Video mit Zeitstempeln abrufen und an Chat senden",
"grab_comments_from_youtube": "Kommentare von YouTube-Video abrufen und an Chat senden",
"output_video_metadata": "Video-Metadaten ausgeben",
"additional_yt_dlp_args": "Zusätzliche Argumente für yt-dlp (z.B. '--cookies-from-browser brave')",
"specify_language_code": "Sprachencode für den Chat angeben, z.B. -g=en -g=zh -g=pt-BR -g=pt-PT",
"scrape_website_url": "Website-URL zu Markdown mit Jina AI scrapen",
"search_question_jina": "Suchanfrage mit Jina AI",
"seed_for_lmm_generation": "Seed für LMM-Generierung",
"wipe_context": "Kontext löschen",
"wipe_session": "Sitzung löschen",
"print_context": "Kontext ausgeben",
"print_session": "Sitzung ausgeben",
"convert_html_readability": "HTML-Eingabe in eine saubere, lesbare Ansicht konvertieren",
"apply_variables_to_input": "Variablen auf Benutzereingabe anwenden",
"disable_pattern_variable_replacement": "Mustervariablenersetzung deaktivieren",
"show_dry_run": "Zeige, was an das Modell gesendet würde, ohne es tatsächlich zu senden",
"serve_fabric_rest_api": "Fabric REST API bereitstellen",
"serve_fabric_api_ollama_endpoints": "Fabric REST API mit ollama-Endpunkten bereitstellen",
"address_to_bind_rest_api": "Adresse zum Binden der REST API",
"api_key_secure_server_routes": "API-Schlüssel zum Sichern der Server-Routen",
"path_to_yaml_config": "Pfad zur YAML-Konfigurationsdatei",
"print_current_version": "Aktuelle Version ausgeben",
"list_all_registered_extensions": "Alle registrierten Erweiterungen auflisten",
"register_new_extension": "Neue Erweiterung aus Konfigurationsdateipfad registrieren",
"remove_registered_extension": "Registrierte Erweiterung nach Name entfernen",
"choose_strategy_from_available": "Strategie aus den verfügbaren Strategien wählen",
"list_all_strategies": "Alle Strategien auflisten",
"list_all_vendors": "Alle Anbieter auflisten",
"output_raw_list_shell_completion": "Rohe Liste ohne Kopfzeilen/Formatierung ausgeben (für Shell-Vervollständigung)",
"enable_web_search_tool": "Web-Such-Tool für unterstützte Modelle aktivieren (Anthropic, OpenAI, Gemini)",
"set_location_web_search": "Standort für Web-Suchergebnisse festlegen (z.B., 'America/Los_Angeles')",
"save_generated_image_to_file": "Generiertes Bild in angegebenem Dateipfad speichern (z.B., 'output.png')",
"image_dimensions_help": "Bildabmessungen: 1024x1024, 1536x1024, 1024x1536, auto (Standard: auto)",
"image_quality_help": "Bildqualität: low, medium, high, auto (Standard: auto)",
"compression_level_jpeg_webp": "Komprimierungslevel 0-100 für JPEG/WebP-Formate (Standard: nicht gesetzt)",
"background_type_help": "Hintergrundtyp: opaque, transparent (Standard: opaque, nur für PNG/WebP)",
"suppress_thinking_tags": "In Denk-Tags eingeschlossenen Text unterdrücken",
"start_tag_thinking_sections": "Start-Tag für Denk-Abschnitte",
"end_tag_thinking_sections": "End-Tag für Denk-Abschnitte",
"disable_openai_responses_api": "OpenAI Responses API deaktivieren (Standard: false)",
"audio_video_file_transcribe": "Audio- oder Video-Datei zum Transkribieren",
"model_for_transcription": "Modell für Transkription (getrennt vom Chat-Modell)",
"split_media_files_ffmpeg": "Audio/Video-Dateien größer als 25MB mit ffmpeg aufteilen",
"tts_voice_name": "TTS-Stimmenname für unterstützte Modelle (z.B., Kore, Charon, Puck)",
"list_gemini_tts_voices": "Alle verfügbaren Gemini TTS-Stimmen auflisten",
"list_transcription_models": "Alle verfügbaren Transkriptionsmodelle auflisten",
"send_desktop_notification": "Desktop-Benachrichtigung senden, wenn Befehl abgeschlossen ist",
"custom_notification_command": "Benutzerdefinierter Befehl für Benachrichtigungen (überschreibt eingebaute Benachrichtigungen)",
"set_reasoning_thinking_level": "Reasoning/Thinking-Level festlegen (z.B., off, low, medium, high, oder numerische Token für Anthropic oder Google Gemini)",
"set_debug_level": "Debug-Level festlegen (0=aus, 1=grundlegend, 2=detailliert, 3=Trace)",
"usage_header": "Verwendung:",
"application_options_header": "Anwendungsoptionen:",
"help_options_header": "Hilfe-Optionen:",
"help_message": "Diese Hilfenachricht anzeigen",
"options_placeholder": "[OPTIONEN]",
"available_vendors_header": "Verfügbare Anbieter:",
"available_models_header": "Verfügbare Modelle",
"no_items_found": "Keine %s",
"no_description_available": "Keine Beschreibung verfügbar",
"i18n_download_failed": "Fehler beim Herunterladen der Übersetzung für Sprache '%s': %v",
"i18n_load_failed": "Fehler beim Laden der Übersetzungsdatei: %v",
"setup_welcome_header": "🎉 Willkommen bei Fabric! Lass uns mit der Einrichtung beginnen.",
"setup_step_downloading_patterns": "📥 Schritt 1: Patterns werden heruntergeladen (erforderlich für Fabric)...",
"setup_step_downloading_strategies": "📥 Schritt 2: Strategien werden heruntergeladen (erforderlich für Fabric)...",
"setup_step_configure_ai_provider": "🤖 Schritt 3: KI-Anbieter konfigurieren",
"setup_ai_provider_required": "Fabric benötigt mindestens einen KI-Anbieter.",
"setup_add_more_providers_later": "Sie können später weitere Anbieter mit 'fabric --setup' hinzufügen",
"setup_step_setting_defaults": "⚙️ Schritt 4: Standard-Anbieter und -Modell werden festgelegt...",
"setup_complete_header": "✅ Einrichtung abgeschlossen! Sie können Fabric jetzt verwenden.",
"setup_next_steps": "Nächste Schritte:",
"setup_list_patterns": "• Verfügbare Patterns auflisten: fabric -l",
"setup_try_pattern": "• Ein Pattern ausprobieren: echo 'Ihr Text' | fabric --pattern summarize",
"setup_configure_more": "• Weitere Einstellungen konfigurieren: fabric --setup",
"setup_failed_download_patterns": "Fehler beim Herunterladen der Patterns: %w",
"setup_failed_download_strategies": "Fehler beim Herunterladen der Strategien: %w",
"setup_failed_set_defaults": "Fehler beim Festlegen des Standard-Anbieters und -Modells: %w",
"setup_no_ai_provider_selected": "Kein KI-Anbieter ausgewählt - mindestens einer ist erforderlich",
"setup_invalid_selection": "Ungültige Auswahl: %s",
"setup_available_ai_providers": "Verfügbare KI-Anbieter:",
"setup_enter_ai_provider_number": "KI-Anbieter-Nummer",
"setup_available_plugins": "Verfügbare Plugins:",
"setup_plugin_number": "Plugin-Nummer",
"setup_plugin_prompt": "Geben Sie die Nummer des Plugins ein, das eingerichtet werden soll",
"setup_required_configuration_header": "━━━ ERFORDERLICHE KONFIGURATION ━━━\n\nKI-Anbieter [mindestens einer erforderlich]",
"setup_required_tools": "Erforderliche Werkzeuge",
"setup_optional_configuration_header": "━━━ OPTIONALE KONFIGURATION ━━━\n\nOptionale Werkzeuge",
"setup_validation_header": "Konfigurationsstatus:",
"setup_validation_ai_provider_configured": "✓ KI-Anbieter konfiguriert",
"setup_validation_ai_provider_missing": "✗ KI-Anbieter nicht konfiguriert - Erforderlich für Fabric",
"setup_validation_defaults_configured": "✓ Standard-Anbieter/-Modell festgelegt: %s/%s",
"setup_validation_defaults_missing": "✗ Standard-Anbieter/-Modell nicht festgelegt - Erforderlich für Fabric",
"setup_validation_patterns_configured": "✓ Patterns heruntergeladen",
"setup_validation_patterns_missing": "✗ Patterns nicht gefunden - Erforderlich für Fabric",
"setup_validation_strategies_configured": "✓ Strategien heruntergeladen",
"setup_validation_strategies_missing": "✗ Strategien nicht gefunden - Erforderlich für Fabric",
"setup_validation_incomplete_warning": "⚠️ Einrichtung unvollständig! Erforderliche Komponenten fehlen.",
"setup_validation_incomplete_help": "Führen Sie 'fabric --setup' erneut aus, um fehlende Elemente zu konfigurieren,\noder 'fabric -U', um Patterns und Strategien herunterzuladen.",
"setup_validation_complete": "✓ Alle erforderlichen Komponenten konfiguriert!",
"patterns_not_found_header": "⚠️ Keine Patterns gefunden!",
"patterns_required_to_work": "Patterns sind erforderlich, damit Fabric funktioniert. Um dies zu beheben:",
"patterns_option_run_setup": "Option 1 (Empfohlen): Setup ausführen, um Patterns herunterzuladen",
"patterns_option_run_setup_command": "fabric --setup",
"patterns_option_run_update": "Option 2: Patterns direkt herunterladen/aktualisieren",
"patterns_option_run_update_command": "fabric -U",
"pattern_not_found_no_patterns": "Pattern '%s' nicht gefunden.\n\nKeine Patterns installiert! Um dies zu beheben:\n • Führen Sie 'fabric --setup' aus, um Patterns zu konfigurieren und herunterzuladen\n • Oder führen Sie 'fabric -U' aus, um Patterns direkt herunterzuladen/zu aktualisieren",
"pattern_not_found_list_available": "Pattern '%s' nicht gefunden. Führen Sie 'fabric -l' aus, um verfügbare Patterns anzuzeigen",
"plugin_configured": " ✓",
"plugin_not_configured": " ⚠️ NICHT KONFIGURIERT",
"defaults_setup_description": "Standard-KI-Anbieter und -Modell",
"defaults_model_question": "Geben Sie den Index oder den Namen Ihres Standardmodells ein",
"defaults_model_context_length_question": "Geben Sie die Kontextlänge des Modells ein",
"custom_patterns_label": "Benutzerdefinierte Patterns",
"custom_patterns_setup_description": "Benutzerdefinierte Patterns - Verzeichnis für Ihre benutzerdefinierten Patterns festlegen",
"custom_patterns_directory_question": "Geben Sie den Pfad zu Ihrem benutzerdefinierten Pattern-Verzeichnis ein",
"jina_label": "Jina AI",
"jina_setup_description": "Jina AI Service - zum Erfassen einer Webseite als sauberer, LLM-freundlicher Text",
"youtube_label": "YouTube",
"youtube_setup_description": "YouTube - zum Erfassen von Video-Transkripten (via yt-dlp) und Kommentaren/Metadaten (via YouTube API)",
"language_label": "Sprache",
"language_setup_description": "Sprache - Standard-Ausgabesprache des AI-Anbieters",
"language_output_question": "Geben Sie Ihre Standard-Ausgabesprache ein (zum Beispiel: zh_CN)",
"optional_marker": "(optional)",
"required_marker": "[erforderlich]",
"patterns_loader_label": "Pattern-Loader",
"patterns_setup_description": "Patterns lädt Patterns herunter",
"patterns_git_repo_url_label": "Git Repo URL",
"patterns_git_repo_url_question": "Geben Sie die Standard-Git-Repository-URL für die Patterns ein",
"patterns_git_repo_folder_label": "Git Repo Patterns Ordner",
"patterns_git_repo_folder_question": "Geben Sie den Standardordner im Git-Repository an, in dem die Patterns gespeichert sind",
"patterns_failed_create_temp_folder": "Fehler beim Erstellen des temporären Pattern-Ordners: %w",
"patterns_downloading": "Lade Patterns herunter und befülle %s...\\n",
"patterns_failed_download_from_git": "Fehler beim Herunterladen der Patterns aus dem Git-Repository: %w",
"patterns_saving_updated_configuration": "💾 Aktualisierte Konfiguration wird gespeichert (Pfad geändert von '%s' zu '%s')...\\n",
"patterns_failed_move_patterns": "Fehler beim Verschieben der Patterns in das Konfigurationsverzeichnis: %w",
"patterns_download_success": "✅ Patterns erfolgreich nach %s heruntergeladen und installiert\\n",
"patterns_failed_unique_file": "Fehler beim Erstellen der Datei mit eindeutigen Patterns: %w",
"patterns_failed_access_directory": "Fehler beim Zugriff auf den Pattern-Ordner '%s': %w",
"patterns_preserve_warning": "Warnung: Benutzerdefiniertes Pattern '%s' konnte nicht erhalten werden: %v\\n",
"patterns_preserved_custom_pattern": "Benutzerdefiniertes Pattern beibehalten: %s\\n",
"patterns_failed_create_temp_dir": "Fehler beim Erstellen des temporären Verzeichnisses: %w",
"patterns_cloning_repository": "Repository %s wird geklont (Pfad: %s)...\\n",
"patterns_failed_download_from_repo": "Fehler beim Herunterladen der Patterns von %s: %w",
"patterns_failed_read_temp_directory": "Fehler beim Lesen des temporären Pattern-Verzeichnisses: %w",
"patterns_no_patterns_migration_failed": "Keine Patterns im Repository unter Pfad %s gefunden und Migration fehlgeschlagen: %w",
"patterns_downloaded_temp": "%d Patterns in temporäres Verzeichnis heruntergeladen\\n",
"patterns_detected_old_path": "🔄 Alter Pattern-Pfad 'patterns' erkannt, versuche Migration zu 'data/patterns'...",
"patterns_warning_remove_test_folder": "Warnung: Der temporäre Testordner '%s' konnte nicht entfernt werden: %v\\n",
"patterns_found_new_path": "✅ %d Patterns im neuen Pfad '%s' gefunden, Konfiguration wird aktualisiert...\\n",
"patterns_failed_move_test_patterns": "Fehler beim Verschieben der Test-Patterns in den temporären Ordner: %w",
"patterns_unable_to_find_or_migrate": "Keine Patterns im aktuellen Pfad '%s' gefunden oder Migration auf neue Struktur fehlgeschlagen",
"patterns_failed_read_directory": "Fehler beim Lesen des Pattern-Verzeichnisses: %w",
"patterns_debug_included_custom_directory": "📂 Auch Patterns aus dem benutzerdefinierten Verzeichnis aufgenommen: %s\\n",
"patterns_warning_custom_directory": "Warnung: Benutzerdefiniertes Pattern-Verzeichnis %s konnte nicht gelesen werden: %v\\n",
"patterns_no_patterns_found_in_directories": "Keine Patterns in den Verzeichnissen %s und %s gefunden",
"patterns_no_patterns_found_in_directory": "Keine Patterns im Verzeichnis %s gefunden",
"patterns_failed_write_unique_file": "Fehler beim Schreiben der Datei mit eindeutigen Patterns: %w",
"patterns_unique_file_created": "📝 Datei mit eindeutigen Patterns mit %d Einträgen erstellt\\n",
"patterns_no_patterns_copied": "Keine Patterns wurden erfolgreich nach %s kopiert",
"patterns_failed_loaded_marker": "Marker-Datei '%s' konnte nicht erstellt werden: %w",
"strategies_label": "Prompt-Strategien",
"strategies_setup_description": "Strategien lädt Prompt-Strategien herunter (z. B. Chain of Thought)",
"strategies_git_repo_url_label": "Git Repo URL",
"strategies_git_repo_url_question": "Geben Sie die Standard-Git-Repository-URL für die Strategien ein",
"strategies_git_repo_folder_label": "Git Repo Strategien Ordner",
"strategies_git_repo_folder_question": "Geben Sie den Standardordner im Git-Repository an, in dem Strategien gespeichert sind",
"strategies_downloading": "Lade Strategien herunter und befülle %s...\\n",
"strategies_download_success": "✅ Strategien erfolgreich nach %s heruntergeladen und installiert\\n",
"strategies_home_dir_error": "Startverzeichnis konnte nicht ermittelt werden: %v",
"strategies_failed_create_directory": "Strategie-Verzeichnis konnte nicht erstellt werden: %w",
"strategies_cloning_repository": "Repository %s wird geklont (Pfad: %s)...\\n",
"strategies_failed_download": "Fehler beim Herunterladen der Strategien: %w",
"strategies_downloaded_count": "%d Strategien heruntergeladen\\n",
"strategies_home_dir_fallback": "Startverzeichnis konnte nicht ermittelt werden: %v, verwende stattdessen aktuelles Verzeichnis",
"strategy_not_found": "Strategie %s nicht gefunden. Führen Sie 'fabric --liststrategies' aus, um eine Liste zu erhalten",
"strategies_none_found": "Keine Strategien gefunden. Führen Sie 'fabric --setup' aus, um Strategien herunterzuladen",
"strategies_available_header": "Verfügbare Strategien:",
"plugin_enter_value": "Geben Sie Ihren %v %v ein",
"plugin_enable_bool_question": "%v %v aktivieren (true/false)",
"plugin_setup_skipped": "[%v] übersprungen\\n",
"plugin_question_bool": "%v%v (true/false, leer lassen für '%s' oder '%v' eingeben, um den Wert zu entfernen):",
"plugin_question_with_default": "%v%v (leer lassen für '%s' oder '%v' eingeben, um den Wert zu entfernen):",
"plugin_question_optional": "%v%v (leer lassen zum Überspringen):",
"plugin_invalid_boolean_value": "Ungültiger Boolescher Wert: %v",
"plugin_setting_not_valid": "%v=%v ist nicht gültig",
"plugin_invalid_bool": "Ungültiger boolescher Wert: %q"
}

View File

@@ -161,5 +161,129 @@
"no_items_found": "No %s",
"no_description_available": "No description available",
"i18n_download_failed": "Failed to download translation for language '%s': %v",
"i18n_load_failed": "Failed to load translation file: %v"
"i18n_load_failed": "Failed to load translation file: %v",
"setup_welcome_header": "🎉 Welcome to Fabric! Let's get you set up.",
"setup_step_downloading_patterns": "📥 Step 1: Downloading patterns (required for Fabric to work)...",
"setup_step_downloading_strategies": "📥 Step 2: Downloading strategies (required for Fabric to work)...",
"setup_step_configure_ai_provider": "🤖 Step 3: Configure an AI provider",
"setup_ai_provider_required": "Fabric needs at least one AI provider to work.",
"setup_add_more_providers_later": "You'll be able to add more providers later with 'fabric --setup'",
"setup_step_setting_defaults": "⚙️ Step 4: Setting default vendor and model...",
"setup_complete_header": "✅ Setup complete! You can now use Fabric.",
"setup_next_steps": "Next steps:",
"setup_list_patterns": "• List available patterns: fabric -l",
"setup_try_pattern": "• Try a pattern: echo 'your text' | fabric --pattern summarize",
"setup_configure_more": "• Configure more settings: fabric --setup",
"setup_failed_download_patterns": "failed to download patterns: %w",
"setup_failed_download_strategies": "failed to download strategies: %w",
"setup_failed_set_defaults": "failed to set default vendor and model: %w",
"setup_no_ai_provider_selected": "no AI provider selected - at least one is required",
"setup_invalid_selection": "invalid selection: %s",
"setup_available_ai_providers": "Available AI Providers:",
"setup_enter_ai_provider_number": "AI Provider Number",
"setup_available_plugins": "Available plugins:",
"setup_plugin_number": "Plugin Number",
"setup_plugin_prompt": "Enter the number of the plugin to setup",
"setup_required_configuration_header": "━━━ REQUIRED CONFIGURATION ━━━\n\nAI Vendors [at least one required]",
"setup_required_tools": "Required Tools",
"setup_optional_configuration_header": "━━━ OPTIONAL CONFIGURATION ━━━\n\nOptional Tools",
"setup_validation_header": "Configuration Status:",
"setup_validation_ai_provider_configured": "✓ AI Provider configured",
"setup_validation_ai_provider_missing": "✗ AI Provider not configured - Required for Fabric to work",
"setup_validation_defaults_configured": "✓ Default vendor/model set: %s/%s",
"setup_validation_defaults_missing": "✗ Default vendor/model not set - Required for Fabric to work",
"setup_validation_patterns_configured": "✓ Patterns downloaded",
"setup_validation_patterns_missing": "✗ Patterns not found - Required for Fabric to work",
"setup_validation_strategies_configured": "✓ Strategies downloaded",
"setup_validation_strategies_missing": "✗ Strategies not found - Required for Fabric to work",
"setup_validation_incomplete_warning": "⚠️ Setup incomplete! Missing required components.",
"setup_validation_incomplete_help": "Run 'fabric --setup' again to configure missing items,\nor run 'fabric -U' to download patterns and strategies.",
"setup_validation_complete": "✓ All required components configured!",
"patterns_not_found_header": "⚠️ No patterns found!",
"patterns_required_to_work": "Patterns are required for Fabric to work. To fix this:",
"patterns_option_run_setup": "Option 1 (Recommended): Run setup to download patterns",
"patterns_option_run_setup_command": "fabric --setup",
"patterns_option_run_update": "Option 2: Download/update patterns directly",
"patterns_option_run_update_command": "fabric -U",
"pattern_not_found_no_patterns": "pattern '%s' not found.\n\nNo patterns are installed! To fix this:\n • Run 'fabric --setup' to configure and download patterns\n • Or run 'fabric -U' to download/update patterns directly",
"pattern_not_found_list_available": "pattern '%s' not found. Run 'fabric -l' to see available patterns",
"plugin_configured": " ✓",
"plugin_not_configured": " ⚠️ NOT CONFIGURED",
"defaults_setup_description": "Default AI Vendor and Model",
"defaults_model_question": "Enter the index or the name of your default model",
"defaults_model_context_length_question": "Enter model context length",
"custom_patterns_label": "Custom Patterns",
"custom_patterns_setup_description": "Custom Patterns - Set directory for your custom patterns",
"custom_patterns_directory_question": "Enter the path to your custom patterns directory",
"jina_label": "Jina AI",
"jina_setup_description": "Jina AI Service - to grab a webpage as clean, LLM-friendly text",
"youtube_label": "YouTube",
"youtube_setup_description": "YouTube - to grab video transcripts (via yt-dlp) and comments/metadata (via YouTube API)",
"language_label": "Language",
"language_setup_description": "Language - Default AI Vendor Output Language",
"language_output_question": "Enter your default output language (for example: zh_CN)",
"optional_marker": "(optional)",
"required_marker": "[required]",
"patterns_loader_label": "Patterns Loader",
"patterns_setup_description": "Patterns - Downloads patterns",
"patterns_git_repo_url_label": "Git Repo Url",
"patterns_git_repo_url_question": "Enter the default Git repository URL for the patterns",
"patterns_git_repo_folder_label": "Git Repo Patterns Folder",
"patterns_git_repo_folder_question": "Enter the default folder in the Git repository where patterns are stored",
"patterns_failed_create_temp_folder": "failed to create temporary patterns folder: %w",
"patterns_downloading": "Downloading patterns and Populating %s...\n",
"patterns_failed_download_from_git": "failed to download patterns from git repository: %w",
"patterns_saving_updated_configuration": "💾 Saving updated configuration (path changed from '%s' to '%s')...\n",
"patterns_failed_move_patterns": "failed to move patterns to config directory: %w",
"patterns_download_success": "✅ Successfully downloaded and installed patterns to %s\n",
"patterns_failed_unique_file": "failed to create unique patterns file: %w",
"patterns_failed_access_directory": "failed to access patterns directory '%s': %w",
"patterns_preserve_warning": "Warning: failed to preserve custom pattern '%s': %v\n",
"patterns_preserved_custom_pattern": "Preserved custom pattern: %s\n",
"patterns_failed_create_temp_dir": "failed to create temp directory: %w",
"patterns_cloning_repository": "Cloning repository %s (path: %s)...\n",
"patterns_failed_download_from_repo": "failed to download patterns from %s: %w",
"patterns_failed_read_temp_directory": "failed to read temp patterns directory: %w",
"patterns_no_patterns_migration_failed": "no patterns found in repository at path %s and migration failed: %w",
"patterns_downloaded_temp": "Downloaded %d patterns to temporary directory\n",
"patterns_detected_old_path": "🔄 Detected old pattern path 'patterns', trying migration to 'data/patterns'...",
"patterns_warning_remove_test_folder": "Warning: failed to remove test temporary folder '%s': %v\n",
"patterns_found_new_path": "✅ Found %d patterns at new path '%s', updating configuration...\n",
"patterns_failed_move_test_patterns": "failed to move test patterns to temp folder: %w",
"patterns_unable_to_find_or_migrate": "unable to find patterns at current path '%s' or migrate to new structure",
"patterns_failed_read_directory": "failed to read patterns directory: %w",
"patterns_debug_included_custom_directory": "📂 Also included patterns from custom directory: %s\n",
"patterns_warning_custom_directory": "Warning: Could not read custom patterns directory %s: %v\n",
"patterns_no_patterns_found_in_directories": "no patterns found in directories %s and %s",
"patterns_no_patterns_found_in_directory": "no patterns found in directory %s",
"patterns_failed_write_unique_file": "failed to write unique patterns file: %w",
"patterns_unique_file_created": "📝 Created unique patterns file with %d patterns\n",
"patterns_no_patterns_copied": "no patterns were successfully copied to %s",
"patterns_failed_loaded_marker": "failed to create loaded marker file '%s': %w",
"strategies_label": "Prompt Strategies",
"strategies_setup_description": "Strategies - Downloads Prompting Strategies (like chain of thought)",
"strategies_git_repo_url_label": "Git Repo Url",
"strategies_git_repo_url_question": "Enter the default Git repository URL for the strategies",
"strategies_git_repo_folder_label": "Git Repo Strategies Folder",
"strategies_git_repo_folder_question": "Enter the default folder in the Git repository where strategies are stored",
"strategies_downloading": "Downloading strategies and Populating %s...\n",
"strategies_download_success": "✅ Successfully downloaded and installed strategies to %s\n",
"strategies_home_dir_error": "could not get home directory: %v",
"strategies_failed_create_directory": "failed to create strategies directory: %w",
"strategies_cloning_repository": "Cloning repository %s (path: %s)...\n",
"strategies_failed_download": "failed to download strategies: %w",
"strategies_downloaded_count": "Downloaded %d strategies\n",
"strategies_home_dir_fallback": "could not get home directory: %v, using current directory instead",
"strategy_not_found": "strategy %s not found. Please run 'fabric --liststrategies' for list",
"strategies_none_found": "no strategies found. Please run 'fabric --setup' to download strategies",
"strategies_available_header": "Available Strategies:",
"plugin_enter_value": "Enter your %v %v",
"plugin_enable_bool_question": "Enable %v %v (true/false)",
"plugin_setup_skipped": "[%v] skipped\n",
"plugin_question_bool": "%v%v (true/false, leave empty for '%s' or type '%v' to remove the value):",
"plugin_question_with_default": "%v%v (leave empty for '%s' or type '%v' to remove the value):",
"plugin_question_optional": "%v%v (leave empty to skip):",
"plugin_invalid_boolean_value": "invalid boolean value: %v",
"plugin_setting_not_valid": "%v=%v, is not valid",
"plugin_invalid_bool": "invalid bool: %q"
}

View File

@@ -161,5 +161,129 @@
"no_items_found": "No hay %s",
"no_description_available": "No hay descripción disponible",
"i18n_download_failed": "Error al descargar traducción para el idioma '%s': %v",
"i18n_load_failed": "Error al cargar archivo de traducción: %v"
"i18n_load_failed": "Error al cargar archivo de traducción: %v",
"setup_welcome_header": "🎉 ¡Bienvenido a Fabric! Vamos a configurarte.",
"setup_step_downloading_patterns": "📥 Paso 1: Descargando patrones (requeridos para que Fabric funcione)...",
"setup_step_downloading_strategies": "📥 Paso 2: Descargando estrategias (requeridas para que Fabric funcione)...",
"setup_step_configure_ai_provider": "🤖 Paso 3: Configurar un proveedor de IA",
"setup_ai_provider_required": "Fabric necesita al menos un proveedor de IA para funcionar.",
"setup_add_more_providers_later": "Podrás agregar más proveedores después con 'fabric --setup'",
"setup_step_setting_defaults": "⚙️ Paso 4: Estableciendo proveedor y modelo predeterminados...",
"setup_complete_header": "✅ ¡Configuración completa! Ya puedes usar Fabric.",
"setup_next_steps": "Próximos pasos:",
"setup_list_patterns": "• Listar patrones disponibles: fabric -l",
"setup_try_pattern": "• Probar un patrón: echo 'tu texto' | fabric --pattern summarize",
"setup_configure_more": "• Configurar más opciones: fabric --setup",
"setup_failed_download_patterns": "error al descargar patrones: %w",
"setup_failed_download_strategies": "error al descargar estrategias: %w",
"setup_failed_set_defaults": "error al establecer proveedor y modelo predeterminados: %w",
"setup_no_ai_provider_selected": "no se seleccionó proveedor de IA - se requiere al menos uno",
"setup_invalid_selection": "selección inválida: %s",
"setup_available_ai_providers": "Proveedores de IA Disponibles:",
"setup_enter_ai_provider_number": "Número de Proveedor de IA",
"setup_available_plugins": "Plugins disponibles:",
"setup_plugin_number": "Número de Plugin",
"setup_plugin_prompt": "Introduce el número del plugin a configurar",
"setup_required_configuration_header": "━━━ CONFIGURACIÓN REQUERIDA ━━━\n\nProveedores de IA [se requiere al menos uno]",
"setup_required_tools": "Herramientas Requeridas",
"setup_optional_configuration_header": "━━━ CONFIGURACIÓN OPCIONAL ━━━\n\nHerramientas Opcionales",
"setup_validation_header": "Estado de Configuración:",
"setup_validation_ai_provider_configured": "✓ Proveedor de IA configurado",
"setup_validation_ai_provider_missing": "✗ Proveedor de IA no configurado - Requerido para que Fabric funcione",
"setup_validation_defaults_configured": "✓ Proveedor/modelo predeterminado establecido: %s/%s",
"setup_validation_defaults_missing": "✗ Proveedor/modelo predeterminado no establecido - Requerido para que Fabric funcione",
"setup_validation_patterns_configured": "✓ Patrones descargados",
"setup_validation_patterns_missing": "✗ Patrones no encontrados - Requeridos para que Fabric funcione",
"setup_validation_strategies_configured": "✓ Estrategias descargadas",
"setup_validation_strategies_missing": "✗ Estrategias no encontradas - Requeridas para que Fabric funcione",
"setup_validation_incomplete_warning": "⚠️ ¡Configuración incompleta! Faltan componentes requeridos.",
"setup_validation_incomplete_help": "Ejecuta 'fabric --setup' de nuevo para configurar los elementos faltantes,\no ejecuta 'fabric -U' para descargar patrones y estrategias.",
"setup_validation_complete": "✓ ¡Todos los componentes requeridos configurados!",
"patterns_not_found_header": "⚠️ ¡No se encontraron patrones!",
"patterns_required_to_work": "Los patrones son requeridos para que Fabric funcione. Para solucionar esto:",
"patterns_option_run_setup": "Opción 1 (Recomendada): Ejecutar configuración para descargar patrones",
"patterns_option_run_setup_command": "fabric --setup",
"patterns_option_run_update": "Opción 2: Descargar/actualizar patrones directamente",
"patterns_option_run_update_command": "fabric -U",
"pattern_not_found_no_patterns": "patrón '%s' no encontrado.\n\n¡No hay patrones instalados! Para solucionar esto:\n • Ejecuta 'fabric --setup' para configurar y descargar patrones\n • O ejecuta 'fabric -U' para descargar/actualizar patrones directamente",
"pattern_not_found_list_available": "patrón '%s' no encontrado. Ejecuta 'fabric -l' para ver los patrones disponibles",
"plugin_configured": " ✓",
"plugin_not_configured": " ⚠️ NO CONFIGURADO",
"defaults_setup_description": "Proveedor y modelo de IA predeterminados",
"defaults_model_question": "Introduce el índice o el nombre de tu modelo predeterminado",
"defaults_model_context_length_question": "Introduce la longitud del contexto del modelo",
"custom_patterns_label": "Patrones personalizados",
"custom_patterns_setup_description": "Patrones personalizados - Establecer directorio para tus patrones personalizados",
"custom_patterns_directory_question": "Introduce la ruta a tu directorio de patrones personalizados",
"jina_label": "Jina AI",
"jina_setup_description": "Servicio Jina AI - para obtener una página web como texto limpio y compatible con LLM",
"youtube_label": "YouTube",
"youtube_setup_description": "YouTube - para obtener transcripciones de video (vía yt-dlp) y comentarios/metadatos (vía API de YouTube)",
"language_label": "Idioma",
"language_setup_description": "Idioma - Idioma de salida predeterminado del proveedor de IA",
"language_output_question": "Ingrese su idioma de salida predeterminado (por ejemplo: zh_CN)",
"optional_marker": "(opcional)",
"required_marker": "[obligatorio]",
"patterns_loader_label": "Cargador de patrones",
"patterns_setup_description": "Patrones - Descarga patrones",
"patterns_git_repo_url_label": "URL del repositorio Git",
"patterns_git_repo_url_question": "Introduce la URL predeterminada del repositorio Git para los patrones",
"patterns_git_repo_folder_label": "Carpeta de patrones en el repositorio Git",
"patterns_git_repo_folder_question": "Introduce la carpeta predeterminada en el repositorio Git donde se almacenan los patrones",
"patterns_failed_create_temp_folder": "no se pudo crear la carpeta temporal de patrones: %w",
"patterns_downloading": "Descargando patrones y llenando %s...\\n",
"patterns_failed_download_from_git": "error al descargar patrones del repositorio Git: %w",
"patterns_saving_updated_configuration": "💾 Guardando configuración actualizada (ruta cambiada de '%s' a '%s')...\\n",
"patterns_failed_move_patterns": "error al mover los patrones al directorio de configuración: %w",
"patterns_download_success": "✅ Patrones descargados e instalados correctamente en %s\\n",
"patterns_failed_unique_file": "error al crear el archivo de patrones únicos: %w",
"patterns_failed_access_directory": "error al acceder al directorio de patrones '%s': %w",
"patterns_preserve_warning": "Advertencia: no se pudo conservar el patrón personalizado '%s': %v\\n",
"patterns_preserved_custom_pattern": "Patrón personalizado conservado: %s\\n",
"patterns_failed_create_temp_dir": "no se pudo crear el directorio temporal: %w",
"patterns_cloning_repository": "Clonando el repositorio %s (ruta: %s)...\\n",
"patterns_failed_download_from_repo": "error al descargar patrones de %s: %w",
"patterns_failed_read_temp_directory": "error al leer el directorio temporal de patrones: %w",
"patterns_no_patterns_migration_failed": "no se encontraron patrones en el repositorio en la ruta %s y la migración falló: %w",
"patterns_downloaded_temp": "Se descargaron %d patrones al directorio temporal\\n",
"patterns_detected_old_path": "🔄 Se detectó la ruta antigua de patrones 'patterns', intentando migrar a 'data/patterns'...",
"patterns_warning_remove_test_folder": "Advertencia: no se pudo eliminar la carpeta temporal de prueba '%s': %v\\n",
"patterns_found_new_path": "✅ Se encontraron %d patrones en la nueva ruta '%s', actualizando configuración...\\n",
"patterns_failed_move_test_patterns": "error al mover los patrones de prueba al directorio temporal: %w",
"patterns_unable_to_find_or_migrate": "no se pudieron encontrar patrones en la ruta actual '%s' ni migrar a la nueva estructura",
"patterns_failed_read_directory": "error al leer el directorio de patrones: %w",
"patterns_debug_included_custom_directory": "📂 También se incluyeron patrones del directorio personalizado: %s\\n",
"patterns_warning_custom_directory": "Advertencia: no se pudo leer el directorio de patrones personalizado %s: %v\\n",
"patterns_no_patterns_found_in_directories": "no se encontraron patrones en los directorios %s y %s",
"patterns_no_patterns_found_in_directory": "no se encontraron patrones en el directorio %s",
"patterns_failed_write_unique_file": "error al escribir el archivo de patrones únicos: %w",
"patterns_unique_file_created": "📝 Archivo de patrones únicos creado con %d patrones\\n",
"patterns_no_patterns_copied": "no se copiaron patrones correctamente en %s",
"patterns_failed_loaded_marker": "no se pudo crear el archivo indicador '%s': %w",
"strategies_label": "Estrategias de prompts",
"strategies_setup_description": "Estrategias - Descarga estrategias de prompting (como chain of thought)",
"strategies_git_repo_url_label": "URL del repositorio Git",
"strategies_git_repo_url_question": "Introduce la URL predeterminada del repositorio Git para las estrategias",
"strategies_git_repo_folder_label": "Carpeta de estrategias en el repositorio Git",
"strategies_git_repo_folder_question": "Introduce la carpeta predeterminada en el repositorio Git donde se almacenan las estrategias",
"strategies_downloading": "Descargando estrategias y llenando %s...\\n",
"strategies_download_success": "✅ Estrategias descargadas e instaladas correctamente en %s\\n",
"strategies_home_dir_error": "no se pudo obtener el directorio personal: %v",
"strategies_failed_create_directory": "no se pudo crear el directorio de estrategias: %w",
"strategies_cloning_repository": "Clonando el repositorio %s (ruta: %s)...\\n",
"strategies_failed_download": "error al descargar estrategias: %w",
"strategies_downloaded_count": "Se descargaron %d estrategias\\n",
"strategies_home_dir_fallback": "no se pudo obtener el directorio personal: %v, usando el directorio actual en su lugar",
"strategy_not_found": "estrategia %s no encontrada. Ejecuta 'fabric --liststrategies' para ver la lista",
"strategies_none_found": "no se encontraron estrategias. Ejecuta 'fabric --setup' para descargar estrategias",
"strategies_available_header": "Estrategias disponibles:",
"plugin_enter_value": "Introduce tu %v %v",
"plugin_enable_bool_question": "Habilitar %v %v (true/false)",
"plugin_setup_skipped": "[%v] omitido\\n",
"plugin_question_bool": "%v%v (true/false, deja vacío para '%s' o escribe '%v' para eliminar el valor):",
"plugin_question_with_default": "%v%v (deja vacío para '%s' o escribe '%v' para eliminar el valor):",
"plugin_question_optional": "%v%v (deja vacío para omitir):",
"plugin_invalid_boolean_value": "valor booleano no válido: %v",
"plugin_setting_not_valid": "%v=%v no es válido",
"plugin_invalid_bool": "bool no válido: %q"
}

View File

@@ -161,5 +161,129 @@
"no_items_found": "هیچ %s",
"no_description_available": "توضیحی در دسترس نیست",
"i18n_download_failed": "دانلود ترجمه برای زبان '%s' ناموفق بود: %v",
"i18n_load_failed": "بارگذاری فایل ترجمه ناموفق بود: %v"
"i18n_load_failed": "بارگذاری فایل ترجمه ناموفق بود: %v",
"setup_welcome_header": "🎉 به Fabric خوش آمدید! بیایید تنظیمات را انجام دهیم.",
"setup_step_downloading_patterns": "📥 مرحله ۱: دانلود الگوها (برای کار Fabric ضروری است)...",
"setup_step_downloading_strategies": "📥 مرحله ۲: دانلود استراتژی‌ها (برای کار Fabric ضروری است)...",
"setup_step_configure_ai_provider": "🤖 مرحله ۳: پیکربندی یک ارائه‌دهنده هوش مصنوعی",
"setup_ai_provider_required": "Fabric برای کار کردن به حداقل یک ارائه‌دهنده هوش مصنوعی نیاز دارد.",
"setup_add_more_providers_later": "می‌توانید بعداً با 'fabric --setup' ارائه‌دهندگان بیشتری اضافه کنید",
"setup_step_setting_defaults": "⚙️ مرحله ۴: تنظیم ارائه‌دهنده و مدل پیش‌فرض...",
"setup_complete_header": "✅ تنظیمات کامل شد! اکنون می‌توانید از Fabric استفاده کنید.",
"setup_next_steps": "مراحل بعدی:",
"setup_list_patterns": "• نمایش الگوهای موجود: fabric -l",
"setup_try_pattern": "• امتحان یک الگو: echo 'متن شما' | fabric --pattern summarize",
"setup_configure_more": "• پیکربندی تنظیمات بیشتر: fabric --setup",
"setup_failed_download_patterns": "دانلود الگوها ناموفق بود: %w",
"setup_failed_download_strategies": "دانلود استراتژی‌ها ناموفق بود: %w",
"setup_failed_set_defaults": "تنظیم ارائه‌دهنده و مدل پیش‌فرض ناموفق بود: %w",
"setup_no_ai_provider_selected": "هیچ ارائه‌دهنده هوش مصنوعی انتخاب نشده - حداقل یکی ضروری است",
"setup_invalid_selection": "انتخاب نامعتبر: %s",
"setup_available_ai_providers": "ارائه‌دهندگان هوش مصنوعی موجود:",
"setup_enter_ai_provider_number": "شماره ارائه‌دهنده هوش مصنوعی",
"setup_available_plugins": "افزونه‌های موجود:",
"setup_plugin_number": "شماره افزونه",
"setup_plugin_prompt": "شماره افزونه‌ای را که می‌خواهید راه‌اندازی کنید وارد کنید",
"setup_required_configuration_header": "━━━ پیکربندی ضروری ━━━\n\nارائهدهندگان هوش مصنوعی [حداقل یکی ضروری است]",
"setup_required_tools": "ابزارهای ضروری",
"setup_optional_configuration_header": "━━━ پیکربندی اختیاری ━━━\n\nابزارهای اختیاری",
"setup_validation_header": "وضعیت پیکربندی:",
"setup_validation_ai_provider_configured": "✓ ارائه‌دهنده هوش مصنوعی پیکربندی شده",
"setup_validation_ai_provider_missing": "✗ ارائه‌دهنده هوش مصنوعی پیکربندی نشده - برای کار Fabric ضروری است",
"setup_validation_defaults_configured": "✓ ارائه‌دهنده/مدل پیش‌فرض تنظیم شده: %s/%s",
"setup_validation_defaults_missing": "✗ ارائه‌دهنده/مدل پیش‌فرض تنظیم نشده - برای کار Fabric ضروری است",
"setup_validation_patterns_configured": "✓ الگوها دانلود شده",
"setup_validation_patterns_missing": "✗ الگوها یافت نشد - برای کار Fabric ضروری است",
"setup_validation_strategies_configured": "✓ استراتژی‌ها دانلود شده",
"setup_validation_strategies_missing": "✗ استراتژی‌ها یافت نشد - برای کار Fabric ضروری است",
"setup_validation_incomplete_warning": "⚠️ تنظیمات ناقص! اجزای ضروری وجود ندارند.",
"setup_validation_incomplete_help": "دوباره 'fabric --setup' را اجرا کنید تا موارد ناقص را پیکربندی کنید،\nیا 'fabric -U' را برای دانلود الگوها و استراتژی‌ها اجرا کنید.",
"setup_validation_complete": "✓ تمام اجزای ضروری پیکربندی شده‌اند!",
"patterns_not_found_header": "⚠️ هیچ الگویی یافت نشد!",
"patterns_required_to_work": "الگوها برای کار Fabric ضروری هستند. برای رفع این مشکل:",
"patterns_option_run_setup": "گزینه ۱ (توصیه شده): اجرای تنظیمات برای دانلود الگوها",
"patterns_option_run_setup_command": "fabric --setup",
"patterns_option_run_update": "گزینه ۲: دانلود/به‌روزرسانی مستقیم الگوها",
"patterns_option_run_update_command": "fabric -U",
"pattern_not_found_no_patterns": "الگوی '%s' یافت نشد.\n\nهیچ الگویی نصب نشده است! برای رفع این مشکل:\n • 'fabric --setup' را برای پیکربندی و دانلود الگوها اجرا کنید\n • یا 'fabric -U' را برای دانلود/به‌روزرسانی الگوها اجرا کنید",
"pattern_not_found_list_available": "الگوی '%s' یافت نشد. برای مشاهده الگوهای موجود 'fabric -l' را اجرا کنید",
"plugin_configured": " ✓",
"plugin_not_configured": " ⚠️ پیکربندی نشده",
"defaults_setup_description": "ارائه‌دهنده و مدل هوش مصنوعی پیش‌فرض",
"defaults_model_question": "شاخص یا نام مدل پیش‌فرض خود را وارد کنید",
"defaults_model_context_length_question": "طول زمینه مدل را وارد کنید",
"custom_patterns_label": "الگوهای سفارشی",
"custom_patterns_setup_description": "الگوهای سفارشی - تنظیم دایرکتوری برای الگوهای سفارشی شما",
"custom_patterns_directory_question": "مسیر دایرکتوری الگوهای سفارشی خود را وارد کنید",
"jina_label": "Jina AI",
"jina_setup_description": "سرویس Jina AI - برای دریافت صفحه وب به‌صورت متن تمیز و سازگار با LLM",
"youtube_label": "YouTube",
"youtube_setup_description": "YouTube - برای دریافت رونوشت ویدیو (از طریق yt-dlp) و نظرات/متادیتا (از طریق API یوتیوب)",
"language_label": "زبان",
"language_setup_description": "زبان - زبان خروجی پیش‌فرض ارائه‌دهنده هوش مصنوعی",
"language_output_question": "زبان خروجی پیش‌فرض خود را وارد کنید (به عنوان مثال: zh_CN)",
"optional_marker": "(اختیاری)",
"required_marker": "[الزامی]",
"patterns_loader_label": "بارگذار الگوها",
"patterns_setup_description": "الگوها - دانلود الگوها",
"patterns_git_repo_url_label": "آدرس مخزن گیت",
"patterns_git_repo_url_question": "آدرس مخزن گیت پیش‌فرض برای الگوها را وارد کنید",
"patterns_git_repo_folder_label": "پوشه الگوها در مخزن گیت",
"patterns_git_repo_folder_question": "پوشه پیش‌فرض در مخزن گیت که الگوها در آن ذخیره می‌شوند را وارد کنید",
"patterns_failed_create_temp_folder": "ایجاد پوشه موقت الگوها ناموفق بود: %w",
"patterns_downloading": "در حال دانلود الگوها و پر کردن %s...\\n",
"patterns_failed_download_from_git": "دانلود الگوها از مخزن گیت ناموفق بود: %w",
"patterns_saving_updated_configuration": "💾 ذخیره پیکربندی به‌روزشده (مسیر از '%s' به '%s' تغییر کرد)...\\n",
"patterns_failed_move_patterns": "انتقال الگوها به شاخه پیکربندی ناموفق بود: %w",
"patterns_download_success": "✅ الگوها با موفقیت در %s دانلود و نصب شدند\\n",
"patterns_failed_unique_file": "ایجاد فایل الگوهای یکتا ناموفق بود: %w",
"patterns_failed_access_directory": "دسترسی به پوشه الگو '%s' ناموفق بود: %w",
"patterns_preserve_warning": "هشدار: الگوی سفارشی '%s' حفظ نشد: %v\\n",
"patterns_preserved_custom_pattern": "الگوی سفارشی حفظ شد: %s\\n",
"patterns_failed_create_temp_dir": "ایجاد پوشه موقت ناموفق بود: %w",
"patterns_cloning_repository": "در حال کلون کردن مخزن %s (مسیر: %s)...\\n",
"patterns_failed_download_from_repo": "دانلود الگوها از %s ناموفق بود: %w",
"patterns_failed_read_temp_directory": "خواندن پوشه موقت الگوها ناموفق بود: %w",
"patterns_no_patterns_migration_failed": "هیچ الگویی در مخزن با مسیر %s یافت نشد و مهاجرت هم ناموفق بود: %w",
"patterns_downloaded_temp": "%d الگو در پوشه موقت دانلود شد\\n",
"patterns_detected_old_path": "🔄 مسیر قدیمی الگو 'patterns' شناسایی شد، تلاش برای مهاجرت به 'data/patterns'...",
"patterns_warning_remove_test_folder": "هشدار: پوشه موقت آزمایشی '%s' حذف نشد: %v\\n",
"patterns_found_new_path": "✅ %d الگو در مسیر جدید '%s' پیدا شد، پیکربندی به‌روزرسانی می‌شود...\\n",
"patterns_failed_move_test_patterns": "انتقال الگوهای آزمایشی به پوشه موقت ناموفق بود: %w",
"patterns_unable_to_find_or_migrate": "الگویی در مسیر فعلی '%s' یافت نشد یا مهاجرت به ساختار جدید ممکن نبود",
"patterns_failed_read_directory": "خواندن پوشه الگوها ناموفق بود: %w",
"patterns_debug_included_custom_directory": "📂 الگوهای پوشه سفارشی نیز اضافه شد: %s\\n",
"patterns_warning_custom_directory": "هشدار: پوشه الگوی سفارشی %s قابل خواندن نیست: %v\\n",
"patterns_no_patterns_found_in_directories": "هیچ الگویی در پوشه‌های %s و %s پیدا نشد",
"patterns_no_patterns_found_in_directory": "هیچ الگویی در پوشه %s پیدا نشد",
"patterns_failed_write_unique_file": "نوشتن فایل الگوهای یکتا ناموفق بود: %w",
"patterns_unique_file_created": "📝 فایل الگوهای یکتا با %d الگو ایجاد شد\\n",
"patterns_no_patterns_copied": "هیچ الگویی با موفقیت به %s کپی نشد",
"patterns_failed_loaded_marker": "ایجاد فایل نشانه '%s' ناموفق بود: %w",
"strategies_label": "راهبردهای پرامپت",
"strategies_setup_description": "راهبردها - دانلود راهبردهای پرامپت (مثل chain of thought)",
"strategies_git_repo_url_label": "آدرس مخزن گیت",
"strategies_git_repo_url_question": "آدرس مخزن گیت پیش‌فرض برای راهبردها را وارد کنید",
"strategies_git_repo_folder_label": "پوشه راهبردها در مخزن گیت",
"strategies_git_repo_folder_question": "پوشه پیش‌فرض در مخزن گیت که راهبردها در آن ذخیره می‌شوند را وارد کنید",
"strategies_downloading": "در حال دانلود راهبردها و پر کردن %s...\\n",
"strategies_download_success": "✅ راهبردها با موفقیت در %s دانلود و نصب شدند\\n",
"strategies_home_dir_error": "دریافت پوشه خانگی ممکن نبود: %v",
"strategies_failed_create_directory": "ایجاد پوشه راهبردها ناموفق بود: %w",
"strategies_cloning_repository": "در حال کلون کردن مخزن %s (مسیر: %s)...\\n",
"strategies_failed_download": "دانلود راهبردها ناموفق بود: %w",
"strategies_downloaded_count": "%d راهبرد دانلود شد\\n",
"strategies_home_dir_fallback": "دریافت پوشه خانگی ممکن نبود: %v، از پوشه فعلی استفاده می‌شود",
"strategy_not_found": "راهبرد %s یافت نشد. برای مشاهده فهرست 'fabric --liststrategies' را اجرا کنید",
"strategies_none_found": "هیچ راهبردی پیدا نشد. برای دانلود راهبردها 'fabric --setup' را اجرا کنید",
"strategies_available_header": "راهبردهای موجود:",
"plugin_enter_value": "مقدار %v %v خود را وارد کنید",
"plugin_enable_bool_question": "%v %v را فعال کنید (true/false)",
"plugin_setup_skipped": "[%v] رد شد\\n",
"plugin_question_bool": "%v%v (true/false، برای '%s' خالی بگذارید یا '%v' را برای حذف مقدار بنویسید):",
"plugin_question_with_default": "%v%v (برای '%s' خالی بگذارید یا '%v' را برای حذف مقدار بنویسید):",
"plugin_question_optional": "%v%v (برای رد کردن خالی بگذارید):",
"plugin_invalid_boolean_value": "مقدار بولی نامعتبر: %v",
"plugin_setting_not_valid": "%v=%v معتبر نیست",
"plugin_invalid_bool": "مقدار bool نامعتبر: %q"
}

View File

@@ -161,5 +161,129 @@
"no_items_found": "Aucun %s",
"no_description_available": "Aucune description disponible",
"i18n_download_failed": "Échec du téléchargement de la traduction pour la langue '%s' : %v",
"i18n_load_failed": "Échec du chargement du fichier de traduction : %v"
"i18n_load_failed": "Échec du chargement du fichier de traduction : %v",
"setup_welcome_header": "🎉 Bienvenue sur Fabric ! Configurons votre installation.",
"setup_step_downloading_patterns": "📥 Étape 1 : Téléchargement des modèles (requis pour le fonctionnement de Fabric)...",
"setup_step_downloading_strategies": "📥 Étape 2 : Téléchargement des stratégies (requis pour le fonctionnement de Fabric)...",
"setup_step_configure_ai_provider": "🤖 Étape 3 : Configurer un fournisseur d'IA",
"setup_ai_provider_required": "Fabric a besoin d'au moins un fournisseur d'IA pour fonctionner.",
"setup_add_more_providers_later": "Vous pourrez ajouter d'autres fournisseurs plus tard avec 'fabric --setup'",
"setup_step_setting_defaults": "⚙️ Étape 4 : Configuration du fournisseur et du modèle par défaut...",
"setup_complete_header": "✅ Configuration terminée ! Vous pouvez maintenant utiliser Fabric.",
"setup_next_steps": "Prochaines étapes :",
"setup_list_patterns": "• Lister les modèles disponibles : fabric -l",
"setup_try_pattern": "• Essayer un modèle : echo 'votre texte' | fabric --pattern summarize",
"setup_configure_more": "• Configurer plus de paramètres : fabric --setup",
"setup_failed_download_patterns": "échec du téléchargement des modèles : %w",
"setup_failed_download_strategies": "échec du téléchargement des stratégies : %w",
"setup_failed_set_defaults": "échec de la configuration du fournisseur et du modèle par défaut : %w",
"setup_no_ai_provider_selected": "aucun fournisseur d'IA sélectionné - au moins un est requis",
"setup_invalid_selection": "sélection invalide : %s",
"setup_available_ai_providers": "Fournisseurs d'IA disponibles :",
"setup_enter_ai_provider_number": "Numéro du fournisseur d'IA",
"setup_available_plugins": "Plugins disponibles :",
"setup_plugin_number": "Numéro du plugin",
"setup_plugin_prompt": "Entrez le numéro du plugin à configurer",
"setup_required_configuration_header": "━━━ CONFIGURATION REQUISE ━━━\n\nFournisseurs d'IA [au moins un requis]",
"setup_required_tools": "Outils requis",
"setup_optional_configuration_header": "━━━ CONFIGURATION OPTIONNELLE ━━━\n\nOutils optionnels",
"setup_validation_header": "État de la configuration :",
"setup_validation_ai_provider_configured": "✓ Fournisseur d'IA configuré",
"setup_validation_ai_provider_missing": "✗ Fournisseur d'IA non configuré - Requis pour le fonctionnement de Fabric",
"setup_validation_defaults_configured": "✓ Fournisseur/modèle par défaut défini : %s/%s",
"setup_validation_defaults_missing": "✗ Fournisseur/modèle par défaut non défini - Requis pour le fonctionnement de Fabric",
"setup_validation_patterns_configured": "✓ Modèles téléchargés",
"setup_validation_patterns_missing": "✗ Modèles non trouvés - Requis pour le fonctionnement de Fabric",
"setup_validation_strategies_configured": "✓ Stratégies téléchargées",
"setup_validation_strategies_missing": "✗ Stratégies non trouvées - Requises pour le fonctionnement de Fabric",
"setup_validation_incomplete_warning": "⚠️ Configuration incomplète ! Composants requis manquants.",
"setup_validation_incomplete_help": "Exécutez à nouveau 'fabric --setup' pour configurer les éléments manquants,\nou exécutez 'fabric -U' pour télécharger les modèles et stratégies.",
"setup_validation_complete": "✓ Tous les composants requis sont configurés !",
"patterns_not_found_header": "⚠️ Aucun modèle trouvé !",
"patterns_required_to_work": "Les modèles sont requis pour le fonctionnement de Fabric. Pour résoudre ce problème :",
"patterns_option_run_setup": "Option 1 (Recommandée) : Exécuter la configuration pour télécharger les modèles",
"patterns_option_run_setup_command": "fabric --setup",
"patterns_option_run_update": "Option 2 : Télécharger/mettre à jour les modèles directement",
"patterns_option_run_update_command": "fabric -U",
"pattern_not_found_no_patterns": "modèle '%s' non trouvé.\n\nAucun modèle n'est installé ! Pour résoudre ce problème :\n • Exécutez 'fabric --setup' pour configurer et télécharger les modèles\n • Ou exécutez 'fabric -U' pour télécharger/mettre à jour les modèles directement",
"pattern_not_found_list_available": "modèle '%s' non trouvé. Exécutez 'fabric -l' pour voir les modèles disponibles",
"plugin_configured": " ✓",
"plugin_not_configured": " ⚠️ NON CONFIGURÉ",
"defaults_setup_description": "Fournisseur et modèle d'IA par défaut",
"defaults_model_question": "Saisissez l'index ou le nom de votre modèle par défaut",
"defaults_model_context_length_question": "Saisissez la longueur du contexte du modèle",
"custom_patterns_label": "Patrons personnalisés",
"custom_patterns_setup_description": "Patrons personnalisés - Définir le répertoire pour vos patrons personnalisés",
"custom_patterns_directory_question": "Saisissez le chemin vers votre répertoire de patrons personnalisés",
"jina_label": "Jina AI",
"jina_setup_description": "Service Jina AI - pour récupérer une page web sous forme de texte propre et compatible LLM",
"youtube_label": "YouTube",
"youtube_setup_description": "YouTube - pour récupérer les transcriptions vidéo (via yt-dlp) et les commentaires/métadonnées (via l'API YouTube)",
"language_label": "Langue",
"language_setup_description": "Langue - Langue de sortie par défaut du fournisseur d'IA",
"language_output_question": "Entrez votre langue de sortie par défaut (par exemple : zh_CN)",
"optional_marker": "(optionnel)",
"required_marker": "[obligatoire]",
"patterns_loader_label": "Chargeur de patrons",
"patterns_setup_description": "Patrons - Télécharge les patrons",
"patterns_git_repo_url_label": "URL du dépôt Git",
"patterns_git_repo_url_question": "Saisissez l'URL du dépôt Git par défaut pour les patrons",
"patterns_git_repo_folder_label": "Dossier des patrons dans le dépôt Git",
"patterns_git_repo_folder_question": "Saisissez le dossier par défaut du dépôt Git où sont stockés les patrons",
"patterns_failed_create_temp_folder": "impossible de créer le dossier temporaire des patrons : %w",
"patterns_downloading": "Téléchargement des patrons et remplissage de %s...\\n",
"patterns_failed_download_from_git": "échec du téléchargement des patrons depuis le dépôt Git : %w",
"patterns_saving_updated_configuration": "💾 Enregistrement de la configuration mise à jour (chemin changé de '%s' à '%s')...\\n",
"patterns_failed_move_patterns": "échec du déplacement des patrons vers le répertoire de configuration : %w",
"patterns_download_success": "✅ Patrons téléchargés et installés avec succès dans %s\\n",
"patterns_failed_unique_file": "échec de création du fichier de patrons uniques : %w",
"patterns_failed_access_directory": "impossible d'accéder au répertoire des patrons '%s' : %w",
"patterns_preserve_warning": "Avertissement : impossible de conserver le patron personnalisé '%s' : %v\\n",
"patterns_preserved_custom_pattern": "Patron personnalisé conservé : %s\\n",
"patterns_failed_create_temp_dir": "impossible de créer le répertoire temporaire : %w",
"patterns_cloning_repository": "Clonage du dépôt %s (chemin : %s)...\\n",
"patterns_failed_download_from_repo": "échec du téléchargement des patrons depuis %s : %w",
"patterns_failed_read_temp_directory": "échec de lecture du répertoire temporaire des patrons : %w",
"patterns_no_patterns_migration_failed": "aucun patron trouvé dans le dépôt au chemin %s et la migration a échoué : %w",
"patterns_downloaded_temp": "%d patrons téléchargés dans le répertoire temporaire\\n",
"patterns_detected_old_path": "🔄 Ancien chemin 'patterns' détecté, tentative de migration vers 'data/patterns'...",
"patterns_warning_remove_test_folder": "Avertissement : impossible de supprimer le dossier temporaire de test '%s' : %v\\n",
"patterns_found_new_path": "✅ %d patrons trouvés au nouveau chemin '%s', mise à jour de la configuration...\\n",
"patterns_failed_move_test_patterns": "échec du déplacement des patrons de test vers le dossier temporaire : %w",
"patterns_unable_to_find_or_migrate": "impossible de trouver des patrons au chemin actuel '%s' ou de migrer vers la nouvelle structure",
"patterns_failed_read_directory": "échec de lecture du répertoire des patrons : %w",
"patterns_debug_included_custom_directory": "📂 Patrons du répertoire personnalisé également inclus : %s\\n",
"patterns_warning_custom_directory": "Avertissement : impossible de lire le répertoire de patrons personnalisé %s : %v\\n",
"patterns_no_patterns_found_in_directories": "aucun patron trouvé dans les répertoires %s et %s",
"patterns_no_patterns_found_in_directory": "aucun patron trouvé dans le répertoire %s",
"patterns_failed_write_unique_file": "échec d'écriture du fichier de patrons uniques : %w",
"patterns_unique_file_created": "📝 Fichier de patrons uniques créé avec %d patrons\\n",
"patterns_no_patterns_copied": "aucun patron n'a été copié avec succès vers %s",
"patterns_failed_loaded_marker": "impossible de créer le fichier indicateur '%s' : %w",
"strategies_label": "Stratégies de prompt",
"strategies_setup_description": "Stratégies - Télécharge des stratégies de prompting (comme chain of thought)",
"strategies_git_repo_url_label": "URL du dépôt Git",
"strategies_git_repo_url_question": "Saisissez l'URL du dépôt Git par défaut pour les stratégies",
"strategies_git_repo_folder_label": "Dossier des stratégies dans le dépôt Git",
"strategies_git_repo_folder_question": "Saisissez le dossier par défaut du dépôt Git où sont stockées les stratégies",
"strategies_downloading": "Téléchargement des stratégies et remplissage de %s...\\n",
"strategies_download_success": "✅ Stratégies téléchargées et installées avec succès dans %s\\n",
"strategies_home_dir_error": "impossible d'obtenir le répertoire personnel : %v",
"strategies_failed_create_directory": "échec de création du répertoire des stratégies : %w",
"strategies_cloning_repository": "Clonage du dépôt %s (chemin : %s)...\\n",
"strategies_failed_download": "échec du téléchargement des stratégies : %w",
"strategies_downloaded_count": "%d stratégies téléchargées\\n",
"strategies_home_dir_fallback": "impossible d'obtenir le répertoire personnel : %v, utilisation du répertoire courant à la place",
"strategy_not_found": "stratégie %s introuvable. Exécutez 'fabric --liststrategies' pour voir la liste",
"strategies_none_found": "aucune stratégie trouvée. Exécutez 'fabric --setup' pour télécharger les stratégies",
"strategies_available_header": "Stratégies disponibles :",
"plugin_enter_value": "Saisissez votre %v %v",
"plugin_enable_bool_question": "Activer %v %v (true/false)",
"plugin_setup_skipped": "[%v] ignoré\\n",
"plugin_question_bool": "%v%v (true/false, laissez vide pour '%s' ou tapez '%v' pour supprimer la valeur) :",
"plugin_question_with_default": "%v%v (laissez vide pour '%s' ou tapez '%v' pour supprimer la valeur) :",
"plugin_question_optional": "%v%v (laissez vide pour passer) :",
"plugin_invalid_boolean_value": "valeur booléenne invalide : %v",
"plugin_setting_not_valid": "%v=%v n'est pas valide",
"plugin_invalid_bool": "booléen invalide : %q"
}

View File

@@ -161,5 +161,129 @@
"no_items_found": "Nessun %s",
"no_description_available": "Nessuna descrizione disponibile",
"i18n_download_failed": "Fallito il download della traduzione per la lingua '%s': %v",
"i18n_load_failed": "Fallito il caricamento del file di traduzione: %v"
"i18n_load_failed": "Fallito il caricamento del file di traduzione: %v",
"setup_welcome_header": "🎉 Benvenuto su Fabric! Configuriamo tutto.",
"setup_step_downloading_patterns": "📥 Passo 1: Download dei pattern (richiesti per il funzionamento di Fabric)...",
"setup_step_downloading_strategies": "📥 Passo 2: Download delle strategie (richieste per il funzionamento di Fabric)...",
"setup_step_configure_ai_provider": "🤖 Passo 3: Configura un fornitore di IA",
"setup_ai_provider_required": "Fabric necessita di almeno un fornitore di IA per funzionare.",
"setup_add_more_providers_later": "Potrai aggiungere altri fornitori in seguito con 'fabric --setup'",
"setup_step_setting_defaults": "⚙️ Passo 4: Impostazione del fornitore e del modello predefiniti...",
"setup_complete_header": "✅ Configurazione completata! Ora puoi usare Fabric.",
"setup_next_steps": "Prossimi passi:",
"setup_list_patterns": "• Elenca i pattern disponibili: fabric -l",
"setup_try_pattern": "• Prova un pattern: echo 'il tuo testo' | fabric --pattern summarize",
"setup_configure_more": "• Configura altre impostazioni: fabric --setup",
"setup_failed_download_patterns": "download dei pattern fallito: %w",
"setup_failed_download_strategies": "download delle strategie fallito: %w",
"setup_failed_set_defaults": "impostazione del fornitore e del modello predefiniti fallita: %w",
"setup_no_ai_provider_selected": "nessun fornitore di IA selezionato - almeno uno è richiesto",
"setup_invalid_selection": "selezione non valida: %s",
"setup_available_ai_providers": "Fornitori di IA disponibili:",
"setup_enter_ai_provider_number": "Numero del fornitore di IA",
"setup_available_plugins": "Plugin disponibili:",
"setup_plugin_number": "Numero del plugin",
"setup_plugin_prompt": "Inserisci il numero del plugin da configurare",
"setup_required_configuration_header": "━━━ CONFIGURAZIONE RICHIESTA ━━━\n\nFornitori di IA [almeno uno richiesto]",
"setup_required_tools": "Strumenti richiesti",
"setup_optional_configuration_header": "━━━ CONFIGURAZIONE OPZIONALE ━━━\n\nStrumenti opzionali",
"setup_validation_header": "Stato della configurazione:",
"setup_validation_ai_provider_configured": "✓ Fornitore di IA configurato",
"setup_validation_ai_provider_missing": "✗ Fornitore di IA non configurato - Richiesto per il funzionamento di Fabric",
"setup_validation_defaults_configured": "✓ Fornitore/modello predefinito impostato: %s/%s",
"setup_validation_defaults_missing": "✗ Fornitore/modello predefinito non impostato - Richiesto per il funzionamento di Fabric",
"setup_validation_patterns_configured": "✓ Pattern scaricati",
"setup_validation_patterns_missing": "✗ Pattern non trovati - Richiesti per il funzionamento di Fabric",
"setup_validation_strategies_configured": "✓ Strategie scaricate",
"setup_validation_strategies_missing": "✗ Strategie non trovate - Richieste per il funzionamento di Fabric",
"setup_validation_incomplete_warning": "⚠️ Configurazione incompleta! Componenti richiesti mancanti.",
"setup_validation_incomplete_help": "Esegui di nuovo 'fabric --setup' per configurare gli elementi mancanti,\noppure esegui 'fabric -U' per scaricare pattern e strategie.",
"setup_validation_complete": "✓ Tutti i componenti richiesti sono configurati!",
"patterns_not_found_header": "⚠️ Nessun pattern trovato!",
"patterns_required_to_work": "I pattern sono richiesti per il funzionamento di Fabric. Per risolvere:",
"patterns_option_run_setup": "Opzione 1 (Consigliata): Esegui la configurazione per scaricare i pattern",
"patterns_option_run_setup_command": "fabric --setup",
"patterns_option_run_update": "Opzione 2: Scarica/aggiorna i pattern direttamente",
"patterns_option_run_update_command": "fabric -U",
"pattern_not_found_no_patterns": "pattern '%s' non trovato.\n\nNessun pattern installato! Per risolvere:\n • Esegui 'fabric --setup' per configurare e scaricare i pattern\n • Oppure esegui 'fabric -U' per scaricare/aggiornare i pattern direttamente",
"pattern_not_found_list_available": "pattern '%s' non trovato. Esegui 'fabric -l' per vedere i pattern disponibili",
"plugin_configured": " ✓",
"plugin_not_configured": " ⚠️ NON CONFIGURATO",
"defaults_setup_description": "Fornitore e modello AI predefiniti",
"defaults_model_question": "Inserisci l'indice o il nome del tuo modello predefinito",
"defaults_model_context_length_question": "Inserisci la lunghezza del contesto del modello",
"custom_patterns_label": "Pattern personalizzati",
"custom_patterns_setup_description": "Pattern personalizzati - Imposta la directory per i tuoi pattern personalizzati",
"custom_patterns_directory_question": "Inserisci il percorso della directory dei tuoi pattern personalizzati",
"jina_label": "Jina AI",
"jina_setup_description": "Servizio Jina AI - per ottenere una pagina web come testo pulito e compatibile con LLM",
"youtube_label": "YouTube",
"youtube_setup_description": "YouTube - per ottenere trascrizioni video (tramite yt-dlp) e commenti/metadati (tramite API YouTube)",
"language_label": "Lingua",
"language_setup_description": "Lingua - Lingua di output predefinita del fornitore di IA",
"language_output_question": "Inserisci la tua lingua di output predefinita (ad esempio: zh_CN)",
"optional_marker": "(opzionale)",
"required_marker": "[obbligatorio]",
"patterns_loader_label": "Caricatore pattern",
"patterns_setup_description": "Pattern - Scarica i pattern",
"patterns_git_repo_url_label": "URL repository Git",
"patterns_git_repo_url_question": "Inserisci l'URL del repository Git predefinito per i pattern",
"patterns_git_repo_folder_label": "Cartella dei pattern nel repository Git",
"patterns_git_repo_folder_question": "Inserisci la cartella predefinita nel repository Git dove sono memorizzati i pattern",
"patterns_failed_create_temp_folder": "impossibile creare la cartella temporanea dei pattern: %w",
"patterns_downloading": "Download dei pattern e popolamento di %s...\\n",
"patterns_failed_download_from_git": "impossibile scaricare i pattern dal repository Git: %w",
"patterns_saving_updated_configuration": "💾 Salvataggio configurazione aggiornata (percorso cambiato da '%s' a '%s')...\\n",
"patterns_failed_move_patterns": "impossibile spostare i pattern nella directory di configurazione: %w",
"patterns_download_success": "✅ Pattern scaricati e installati correttamente in %s\\n",
"patterns_failed_unique_file": "impossibile creare il file dei pattern univoci: %w",
"patterns_failed_access_directory": "impossibile accedere alla directory dei pattern '%s': %w",
"patterns_preserve_warning": "Avviso: impossibile conservare il pattern personalizzato '%s': %v\\n",
"patterns_preserved_custom_pattern": "Pattern personalizzato conservato: %s\\n",
"patterns_failed_create_temp_dir": "impossibile creare la directory temporanea: %w",
"patterns_cloning_repository": "Clonazione del repository %s (percorso: %s)...\\n",
"patterns_failed_download_from_repo": "impossibile scaricare i pattern da %s: %w",
"patterns_failed_read_temp_directory": "impossibile leggere la directory temporanea dei pattern: %w",
"patterns_no_patterns_migration_failed": "nessun pattern trovato nel repository al percorso %s e migrazione non riuscita: %w",
"patterns_downloaded_temp": "%d pattern scaricati nella directory temporanea\\n",
"patterns_detected_old_path": "🔄 Rilevato vecchio percorso 'patterns', tentativo di migrazione a 'data/patterns'...",
"patterns_warning_remove_test_folder": "Avviso: impossibile rimuovere la cartella temporanea di test '%s': %v\\n",
"patterns_found_new_path": "✅ Trovati %d pattern nel nuovo percorso '%s', aggiornamento configurazione...\\n",
"patterns_failed_move_test_patterns": "impossibile spostare i pattern di test nella cartella temporanea: %w",
"patterns_unable_to_find_or_migrate": "impossibile trovare pattern nel percorso attuale '%s' o migrare alla nuova struttura",
"patterns_failed_read_directory": "impossibile leggere la directory dei pattern: %w",
"patterns_debug_included_custom_directory": "📂 Inclusi anche i pattern dalla directory personalizzata: %s\\n",
"patterns_warning_custom_directory": "Avviso: impossibile leggere la directory dei pattern personalizzata %s: %v\\n",
"patterns_no_patterns_found_in_directories": "nessun pattern trovato nelle directory %s e %s",
"patterns_no_patterns_found_in_directory": "nessun pattern trovato nella directory %s",
"patterns_failed_write_unique_file": "impossibile scrivere il file dei pattern univoci: %w",
"patterns_unique_file_created": "📝 File dei pattern univoci creato con %d pattern\\n",
"patterns_no_patterns_copied": "nessun pattern copiato correttamente in %s",
"patterns_failed_loaded_marker": "impossibile creare il file di marker '%s': %w",
"strategies_label": "Strategie di prompt",
"strategies_setup_description": "Strategie - Scarica strategie di prompting (come chain of thought)",
"strategies_git_repo_url_label": "URL repository Git",
"strategies_git_repo_url_question": "Inserisci l'URL del repository Git predefinito per le strategie",
"strategies_git_repo_folder_label": "Cartella delle strategie nel repository Git",
"strategies_git_repo_folder_question": "Inserisci la cartella predefinita nel repository Git dove sono memorizzate le strategie",
"strategies_downloading": "Download delle strategie e popolamento di %s...\\n",
"strategies_download_success": "✅ Strategie scaricate e installate correttamente in %s\\n",
"strategies_home_dir_error": "impossibile ottenere la home directory: %v",
"strategies_failed_create_directory": "impossibile creare la directory delle strategie: %w",
"strategies_cloning_repository": "Clonazione del repository %s (percorso: %s)...\\n",
"strategies_failed_download": "impossibile scaricare le strategie: %w",
"strategies_downloaded_count": "%d strategie scaricate\\n",
"strategies_home_dir_fallback": "impossibile ottenere la home directory: %v, uso la directory corrente",
"strategy_not_found": "strategia %s non trovata. Esegui 'fabric --liststrategies' per l'elenco",
"strategies_none_found": "nessuna strategia trovata. Esegui 'fabric --setup' per scaricare le strategie",
"strategies_available_header": "Strategie disponibili:",
"plugin_enter_value": "Inserisci il tuo %v %v",
"plugin_enable_bool_question": "Abilita %v %v (true/false)",
"plugin_setup_skipped": "[%v] saltato\\n",
"plugin_question_bool": "%v%v (true/false, lascia vuoto per '%s' o digita '%v' per rimuovere il valore):",
"plugin_question_with_default": "%v%v (lascia vuoto per '%s' o digita '%v' per rimuovere il valore):",
"plugin_question_optional": "%v%v (lascia vuoto per saltare):",
"plugin_invalid_boolean_value": "valore booleano non valido: %v",
"plugin_setting_not_valid": "%v=%v non è valido",
"plugin_invalid_bool": "bool non valido: %q"
}

View File

@@ -161,5 +161,129 @@
"no_items_found": "%s がありません",
"no_description_available": "説明がありません",
"i18n_download_failed": "言語 '%s' の翻訳のダウンロードに失敗しました: %v",
"i18n_load_failed": "翻訳ファイルの読み込みに失敗しました: %v"
"i18n_load_failed": "翻訳ファイルの読み込みに失敗しました: %v",
"setup_welcome_header": "🎉 Fabricへようこそセットアップを始めましょう。",
"setup_step_downloading_patterns": "📥 ステップ1: パターンをダウンロード中Fabricの動作に必要です...",
"setup_step_downloading_strategies": "📥 ステップ2: ストラテジーをダウンロード中Fabricの動作に必要です...",
"setup_step_configure_ai_provider": "🤖 ステップ3: AIプロバイダーを設定",
"setup_ai_provider_required": "Fabricを動作させるには、少なくとも1つのAIプロバイダーが必要です。",
"setup_add_more_providers_later": "'fabric --setup'で後からプロバイダーを追加できます",
"setup_step_setting_defaults": "⚙️ ステップ4: デフォルトのベンダーとモデルを設定中...",
"setup_complete_header": "✅ セットアップ完了Fabricを使用できます。",
"setup_next_steps": "次のステップ:",
"setup_list_patterns": "• 利用可能なパターンを一覧表示: fabric -l",
"setup_try_pattern": "• パターンを試す: echo 'テキスト' | fabric --pattern summarize",
"setup_configure_more": "• その他の設定: fabric --setup",
"setup_failed_download_patterns": "パターンのダウンロードに失敗しました: %w",
"setup_failed_download_strategies": "ストラテジーのダウンロードに失敗しました: %w",
"setup_failed_set_defaults": "デフォルトのベンダーとモデルの設定に失敗しました: %w",
"setup_no_ai_provider_selected": "AIプロバイダーが選択されていません - 少なくとも1つは必要です",
"setup_invalid_selection": "無効な選択: %s",
"setup_available_ai_providers": "利用可能なAIプロバイダー:",
"setup_enter_ai_provider_number": "AIプロバイダー番号",
"setup_available_plugins": "利用可能なプラグイン:",
"setup_plugin_number": "プラグイン番号",
"setup_plugin_prompt": "セットアップするプラグインの番号を入力してください",
"setup_required_configuration_header": "━━━ 必須設定 ━━━\n\nAIベンダー [少なくとも1つ必要]",
"setup_required_tools": "必須ツール",
"setup_optional_configuration_header": "━━━ オプション設定 ━━━\n\nオプションツール",
"setup_validation_header": "設定状況:",
"setup_validation_ai_provider_configured": "✓ AIプロバイダー設定済み",
"setup_validation_ai_provider_missing": "✗ AIプロバイダー未設定 - Fabricの動作に必要です",
"setup_validation_defaults_configured": "✓ デフォルトのベンダー/モデル設定済み: %s/%s",
"setup_validation_defaults_missing": "✗ デフォルトのベンダー/モデル未設定 - Fabricの動作に必要です",
"setup_validation_patterns_configured": "✓ パターンダウンロード済み",
"setup_validation_patterns_missing": "✗ パターンが見つかりません - Fabricの動作に必要です",
"setup_validation_strategies_configured": "✓ ストラテジーダウンロード済み",
"setup_validation_strategies_missing": "✗ ストラテジーが見つかりません - Fabricの動作に必要です",
"setup_validation_incomplete_warning": "⚠️ セットアップ未完了!必要なコンポーネントが不足しています。",
"setup_validation_incomplete_help": "'fabric --setup'を再度実行して不足項目を設定するか、\n'fabric -U'を実行してパターンとストラテジーをダウンロードしてください。",
"setup_validation_complete": "✓ 必要なコンポーネントがすべて設定されています!",
"patterns_not_found_header": "⚠️ パターンが見つかりません!",
"patterns_required_to_work": "Fabricを動作させるにはパターンが必要です。解決するには:",
"patterns_option_run_setup": "オプション1推奨: セットアップを実行してパターンをダウンロード",
"patterns_option_run_setup_command": "fabric --setup",
"patterns_option_run_update": "オプション2: パターンを直接ダウンロード/更新",
"patterns_option_run_update_command": "fabric -U",
"pattern_not_found_no_patterns": "パターン '%s' が見つかりません。\n\nパターンがインストールされていません解決するには:\n • 'fabric --setup'を実行してパターンを設定・ダウンロード\n • または'fabric -U'を実行してパターンをダウンロード/更新",
"pattern_not_found_list_available": "パターン '%s' が見つかりません。'fabric -l'で利用可能なパターンを確認してください",
"plugin_configured": " ✓",
"plugin_not_configured": " ⚠️ 未設定",
"defaults_setup_description": "デフォルトのAIプロバイダーとモデル",
"defaults_model_question": "デフォルトモデルのインデックスまたは名前を入力してください",
"defaults_model_context_length_question": "モデルのコンテキスト長を入力してください",
"custom_patterns_label": "カスタムパターン",
"custom_patterns_setup_description": "カスタムパターン - カスタムパターン用のディレクトリを設定",
"custom_patterns_directory_question": "カスタムパターンディレクトリのパスを入力してください",
"jina_label": "Jina AI",
"jina_setup_description": "Jina AI サービス - ウェブページをクリーンでLLMフレンドリーなテキストとして取得",
"youtube_label": "YouTube",
"youtube_setup_description": "YouTube - 動画の転写(yt-dlp経由)とコメント/メタデータ(YouTube API経由)を取得",
"language_label": "言語",
"language_setup_description": "言語 - AIプロバイダーのデフォルト出力言語",
"language_output_question": "デフォルト出力言語を入力してくださいzh_CN",
"optional_marker": "(オプション)",
"required_marker": "【必須】",
"patterns_loader_label": "パターンローダー",
"patterns_setup_description": "パターン - パターンをダウンロードします",
"patterns_git_repo_url_label": "Git リポジトリ URL",
"patterns_git_repo_url_question": "パターン用のデフォルト Git リポジトリ URL を入力してください",
"patterns_git_repo_folder_label": "Git リポジトリ内のパターンフォルダー",
"patterns_git_repo_folder_question": "パターンが格納されている Git リポジトリ内のデフォルトフォルダーを入力してください",
"patterns_failed_create_temp_folder": "一時パターンフォルダーの作成に失敗しました: %w",
"patterns_downloading": "パターンをダウンロードして %s を構成しています...\\n",
"patterns_failed_download_from_git": "Git リポジトリからパターンをダウンロードできませんでした: %w",
"patterns_saving_updated_configuration": "💾 更新された設定を保存しています (パスを '%s' から '%s' に変更)...\\n",
"patterns_failed_move_patterns": "パターンを設定ディレクトリへ移動できませんでした: %w",
"patterns_download_success": "✅ パターンを %s に正常にダウンロードしてインストールしました\\n",
"patterns_failed_unique_file": "ユニークパターンファイルの作成に失敗しました: %w",
"patterns_failed_access_directory": "パターンディレクトリ '%s' にアクセスできませんでした: %w",
"patterns_preserve_warning": "警告: カスタムパターン '%s' を保持できませんでした: %v\\n",
"patterns_preserved_custom_pattern": "カスタムパターンを保持しました: %s\\n",
"patterns_failed_create_temp_dir": "一時ディレクトリの作成に失敗しました: %w",
"patterns_cloning_repository": "リポジトリ %s をクローン中 (パス: %s)...\\n",
"patterns_failed_download_from_repo": "%s からパターンをダウンロードできませんでした: %w",
"patterns_failed_read_temp_directory": "一時パターンディレクトリの読み取りに失敗しました: %w",
"patterns_no_patterns_migration_failed": "リポジトリのパス %s にパターンが見つからず、移行にも失敗しました: %w",
"patterns_downloaded_temp": "%d 個のパターンを一時ディレクトリにダウンロードしました\\n",
"patterns_detected_old_path": "🔄 旧パス 'patterns' を検出、'data/patterns' への移行を試みます...",
"patterns_warning_remove_test_folder": "警告: テスト用の一時フォルダー '%s' を削除できませんでした: %v\\n",
"patterns_found_new_path": "✅ 新しいパス '%s' で %d 個のパターンを確認、設定を更新します...\\n",
"patterns_failed_move_test_patterns": "テストパターンを一時フォルダーへ移動できませんでした: %w",
"patterns_unable_to_find_or_migrate": "現在のパス '%s' でパターンが見つからず、新しい構成への移行もできません",
"patterns_failed_read_directory": "パターンディレクトリの読み取りに失敗しました: %w",
"patterns_debug_included_custom_directory": "📂 カスタムディレクトリのパターンも含めました: %s\\n",
"patterns_warning_custom_directory": "警告: カスタムパターンディレクトリ %s を読み取れませんでした: %v\\n",
"patterns_no_patterns_found_in_directories": "%s と %s にパターンが見つかりません",
"patterns_no_patterns_found_in_directory": "ディレクトリ %s にパターンが見つかりません",
"patterns_failed_write_unique_file": "ユニークパターンファイルの書き込みに失敗しました: %w",
"patterns_unique_file_created": "📝 %d 個のパターンでユニークパターンファイルを作成しました\\n",
"patterns_no_patterns_copied": "%s にパターンをコピーできませんでした",
"patterns_failed_loaded_marker": "マーカーファイル '%s' を作成できませんでした: %w",
"strategies_label": "プロンプト戦略",
"strategies_setup_description": "戦略 - プロンプト戦略chain of thought など)をダウンロード",
"strategies_git_repo_url_label": "Git リポジトリ URL",
"strategies_git_repo_url_question": "戦略用のデフォルト Git リポジトリ URL を入力してください",
"strategies_git_repo_folder_label": "Git リポジトリ内の戦略フォルダー",
"strategies_git_repo_folder_question": "戦略が保存されている Git リポジトリ内のデフォルトフォルダーを入力してください",
"strategies_downloading": "戦略をダウンロードして %s を構成しています...\\n",
"strategies_download_success": "✅ 戦略を %s に正常にダウンロードしてインストールしました\\n",
"strategies_home_dir_error": "ホームディレクトリを取得できませんでした: %v",
"strategies_failed_create_directory": "戦略ディレクトリを作成できませんでした: %w",
"strategies_cloning_repository": "リポジトリ %s をクローン中 (パス: %s)...\\n",
"strategies_failed_download": "戦略のダウンロードに失敗しました: %w",
"strategies_downloaded_count": "%d 件の戦略をダウンロードしました\\n",
"strategies_home_dir_fallback": "ホームディレクトリを取得できませんでした: %v、代わりにカレントディレクトリを使用します",
"strategy_not_found": "戦略 %s が見つかりません。'fabric --liststrategies' を実行して一覧を確認してください",
"strategies_none_found": "戦略が見つかりません。'fabric --setup' を実行して戦略をダウンロードしてください",
"strategies_available_header": "利用可能な戦略:",
"plugin_enter_value": "%v の %v を入力してください",
"plugin_enable_bool_question": "%v の %v を有効にしますか (true/false)",
"plugin_setup_skipped": "[%v] スキップされました\\n",
"plugin_question_bool": "%v%v (true/false、'%s' を使うには空欄のまま、値を削除するには '%v' と入力):",
"plugin_question_with_default": "%v%v ('%s' を使うには空欄のまま、値を削除するには '%v' と入力):",
"plugin_question_optional": "%v%v (スキップするには空欄のまま):",
"plugin_invalid_boolean_value": "無効なブール値です: %v",
"plugin_setting_not_valid": "%v=%v は無効です",
"plugin_invalid_bool": "無効な bool です: %q"
}

View File

@@ -161,5 +161,129 @@
"no_items_found": "Nenhum %s",
"no_description_available": "Nenhuma descrição disponível",
"i18n_download_failed": "Falha ao baixar tradução para o idioma '%s': %v",
"i18n_load_failed": "Falha ao carregar arquivo de tradução: %v"
"i18n_load_failed": "Falha ao carregar arquivo de tradução: %v",
"setup_welcome_header": "🎉 Bem-vindo ao Fabric! Vamos configurar tudo.",
"setup_step_downloading_patterns": "📥 Passo 1: Baixando padrões (necessários para o Fabric funcionar)...",
"setup_step_downloading_strategies": "📥 Passo 2: Baixando estratégias (necessárias para o Fabric funcionar)...",
"setup_step_configure_ai_provider": "🤖 Passo 3: Configurar um provedor de IA",
"setup_ai_provider_required": "O Fabric precisa de pelo menos um provedor de IA para funcionar.",
"setup_add_more_providers_later": "Você poderá adicionar mais provedores depois com 'fabric --setup'",
"setup_step_setting_defaults": "⚙️ Passo 4: Configurando provedor e modelo padrão...",
"setup_complete_header": "✅ Configuração completa! Agora você pode usar o Fabric.",
"setup_next_steps": "Próximos passos:",
"setup_list_patterns": "• Listar padrões disponíveis: fabric -l",
"setup_try_pattern": "• Experimentar um padrão: echo 'seu texto' | fabric --pattern summarize",
"setup_configure_more": "• Configurar mais opções: fabric --setup",
"setup_failed_download_patterns": "falha ao baixar padrões: %w",
"setup_failed_download_strategies": "falha ao baixar estratégias: %w",
"setup_failed_set_defaults": "falha ao configurar provedor e modelo padrão: %w",
"setup_no_ai_provider_selected": "nenhum provedor de IA selecionado - pelo menos um é necessário",
"setup_invalid_selection": "seleção inválida: %s",
"setup_available_ai_providers": "Provedores de IA Disponíveis:",
"setup_enter_ai_provider_number": "Número do Provedor de IA",
"setup_available_plugins": "Plugins disponíveis:",
"setup_plugin_number": "Número do Plugin",
"setup_plugin_prompt": "Informe o número do plugin a configurar",
"setup_required_configuration_header": "━━━ CONFIGURAÇÃO OBRIGATÓRIA ━━━\n\nProvedores de IA [pelo menos um obrigatório]",
"setup_required_tools": "Ferramentas Obrigatórias",
"setup_optional_configuration_header": "━━━ CONFIGURAÇÃO OPCIONAL ━━━\n\nFerramentas Opcionais",
"setup_validation_header": "Status da Configuração:",
"setup_validation_ai_provider_configured": "✓ Provedor de IA configurado",
"setup_validation_ai_provider_missing": "✗ Provedor de IA não configurado - Necessário para o Fabric funcionar",
"setup_validation_defaults_configured": "✓ Provedor/modelo padrão definido: %s/%s",
"setup_validation_defaults_missing": "✗ Provedor/modelo padrão não definido - Necessário para o Fabric funcionar",
"setup_validation_patterns_configured": "✓ Padrões baixados",
"setup_validation_patterns_missing": "✗ Padrões não encontrados - Necessários para o Fabric funcionar",
"setup_validation_strategies_configured": "✓ Estratégias baixadas",
"setup_validation_strategies_missing": "✗ Estratégias não encontradas - Necessárias para o Fabric funcionar",
"setup_validation_incomplete_warning": "⚠️ Configuração incompleta! Componentes necessários ausentes.",
"setup_validation_incomplete_help": "Execute 'fabric --setup' novamente para configurar itens faltantes,\nou execute 'fabric -U' para baixar padrões e estratégias.",
"setup_validation_complete": "✓ Todos os componentes necessários estão configurados!",
"patterns_not_found_header": "⚠️ Nenhum padrão encontrado!",
"patterns_required_to_work": "Padrões são necessários para o Fabric funcionar. Para resolver:",
"patterns_option_run_setup": "Opção 1 (Recomendada): Execute a configuração para baixar padrões",
"patterns_option_run_setup_command": "fabric --setup",
"patterns_option_run_update": "Opção 2: Baixar/atualizar padrões diretamente",
"patterns_option_run_update_command": "fabric -U",
"pattern_not_found_no_patterns": "padrão '%s' não encontrado.\n\nNenhum padrão instalado! Para resolver:\n • Execute 'fabric --setup' para configurar e baixar padrões\n • Ou execute 'fabric -U' para baixar/atualizar padrões diretamente",
"pattern_not_found_list_available": "padrão '%s' não encontrado. Execute 'fabric -l' para ver os padrões disponíveis",
"plugin_configured": " ✓",
"plugin_not_configured": " ⚠️ NÃO CONFIGURADO",
"defaults_setup_description": "Provedor e modelo de IA padrão",
"defaults_model_question": "Informe o índice ou o nome do seu modelo padrão",
"defaults_model_context_length_question": "Informe o comprimento do contexto do modelo",
"custom_patterns_label": "Padrões personalizados",
"custom_patterns_setup_description": "Padrões personalizados - Definir diretório para seus padrões personalizados",
"custom_patterns_directory_question": "Informe o caminho para seu diretório de padrões personalizados",
"jina_label": "Jina AI",
"jina_setup_description": "Serviço Jina AI - para obter uma página web como texto limpo e compatível com LLM",
"youtube_label": "YouTube",
"youtube_setup_description": "YouTube - para obter transcrições de vídeo (via yt-dlp) e comentários/metadados (via API do YouTube)",
"language_label": "Idioma",
"language_setup_description": "Idioma - Idioma de saída padrão do provedor de IA",
"language_output_question": "Informe o seu idioma de saída padrão (por exemplo: zh_CN)",
"optional_marker": "(opcional)",
"required_marker": "[obrigatório]",
"patterns_loader_label": "Carregador de padrões",
"patterns_setup_description": "Padrões - Baixa os padrões",
"patterns_git_repo_url_label": "URL do repositório Git",
"patterns_git_repo_url_question": "Informe a URL padrão do repositório Git para os padrões",
"patterns_git_repo_folder_label": "Pasta de padrões no repositório Git",
"patterns_git_repo_folder_question": "Informe a pasta padrão no repositório Git onde os padrões ficam armazenados",
"patterns_failed_create_temp_folder": "falha ao criar a pasta temporária de padrões: %w",
"patterns_downloading": "Baixando padrões e populando %s...\\n",
"patterns_failed_download_from_git": "falha ao baixar padrões do repositório Git: %w",
"patterns_saving_updated_configuration": "💾 Salvando configuração atualizada (caminho alterado de '%s' para '%s')...\\n",
"patterns_failed_move_patterns": "falha ao mover os padrões para o diretório de configuração: %w",
"patterns_download_success": "✅ Padrões baixados e instalados com sucesso em %s\\n",
"patterns_failed_unique_file": "falha ao criar o arquivo de padrões únicos: %w",
"patterns_failed_access_directory": "falha ao acessar o diretório de padrões '%s': %w",
"patterns_preserve_warning": "Aviso: não foi possível preservar o padrão personalizado '%s': %v\\n",
"patterns_preserved_custom_pattern": "Padrão personalizado preservado: %s\\n",
"patterns_failed_create_temp_dir": "falha ao criar diretório temporário: %w",
"patterns_cloning_repository": "Clonando repositório %s (caminho: %s)...\\n",
"patterns_failed_download_from_repo": "falha ao baixar padrões de %s: %w",
"patterns_failed_read_temp_directory": "falha ao ler o diretório temporário de padrões: %w",
"patterns_no_patterns_migration_failed": "nenhum padrão encontrado no repositório no caminho %s e a migração falhou: %w",
"patterns_downloaded_temp": "%d padrões baixados para o diretório temporário\\n",
"patterns_detected_old_path": "🔄 Caminho antigo 'patterns' detectado, tentando migrar para 'data/patterns'...",
"patterns_warning_remove_test_folder": "Aviso: não foi possível remover a pasta temporária de teste '%s': %v\\n",
"patterns_found_new_path": "✅ %d padrões encontrados no novo caminho '%s', atualizando configuração...\\n",
"patterns_failed_move_test_patterns": "falha ao mover padrões de teste para a pasta temporária: %w",
"patterns_unable_to_find_or_migrate": "não foi possível encontrar padrões no caminho atual '%s' ou migrar para a nova estrutura",
"patterns_failed_read_directory": "falha ao ler o diretório de padrões: %w",
"patterns_debug_included_custom_directory": "📂 Também incluídos os padrões do diretório personalizado: %s\\n",
"patterns_warning_custom_directory": "Aviso: não foi possível ler o diretório de padrões personalizado %s: %v\\n",
"patterns_no_patterns_found_in_directories": "nenhum padrão encontrado nos diretórios %s e %s",
"patterns_no_patterns_found_in_directory": "nenhum padrão encontrado no diretório %s",
"patterns_failed_write_unique_file": "falha ao gravar o arquivo de padrões únicos: %w",
"patterns_unique_file_created": "📝 Arquivo de padrões únicos criado com %d padrões\\n",
"patterns_no_patterns_copied": "nenhum padrão foi copiado com sucesso para %s",
"patterns_failed_loaded_marker": "falha ao criar o arquivo marcador '%s': %w",
"strategies_label": "Estratégias de prompt",
"strategies_setup_description": "Estratégias - Baixa estratégias de prompting (como chain of thought)",
"strategies_git_repo_url_label": "URL do repositório Git",
"strategies_git_repo_url_question": "Informe a URL padrão do repositório Git para as estratégias",
"strategies_git_repo_folder_label": "Pasta de estratégias no repositório Git",
"strategies_git_repo_folder_question": "Informe a pasta padrão no repositório Git onde as estratégias ficam armazenadas",
"strategies_downloading": "Baixando estratégias e populando %s...\\n",
"strategies_download_success": "✅ Estratégias baixadas e instaladas com sucesso em %s\\n",
"strategies_home_dir_error": "não foi possível obter o diretório home: %v",
"strategies_failed_create_directory": "falha ao criar diretório de estratégias: %w",
"strategies_cloning_repository": "Clonando repositório %s (caminho: %s)...\\n",
"strategies_failed_download": "falha ao baixar estratégias: %w",
"strategies_downloaded_count": "%d estratégias baixadas\\n",
"strategies_home_dir_fallback": "não foi possível obter o diretório home: %v, usando o diretório atual",
"strategy_not_found": "estratégia %s não encontrada. Execute 'fabric --liststrategies' para ver a lista",
"strategies_none_found": "nenhuma estratégia encontrada. Execute 'fabric --setup' para baixar estratégias",
"strategies_available_header": "Estratégias disponíveis:",
"plugin_enter_value": "Informe seu %v %v",
"plugin_enable_bool_question": "Ativar %v %v (true/false)",
"plugin_setup_skipped": "[%v] ignorado\\n",
"plugin_question_bool": "%v%v (true/false, deixe em branco para '%s' ou digite '%v' para remover o valor):",
"plugin_question_with_default": "%v%v (deixe em branco para '%s' ou digite '%v' para remover o valor):",
"plugin_question_optional": "%v%v (deixe em branco para pular):",
"plugin_invalid_boolean_value": "valor booleano inválido: %v",
"plugin_setting_not_valid": "%v=%v não é válido",
"plugin_invalid_bool": "bool inválido: %q"
}

View File

@@ -161,5 +161,129 @@
"no_items_found": "Nenhum %s",
"no_description_available": "Nenhuma descrição disponível",
"i18n_download_failed": "Falha ao descarregar tradução para o idioma '%s': %v",
"i18n_load_failed": "Falha ao carregar ficheiro de tradução: %v"
"i18n_load_failed": "Falha ao carregar ficheiro de tradução: %v",
"setup_welcome_header": "🎉 Bem-vindo ao Fabric! Vamos configurar tudo.",
"setup_step_downloading_patterns": "📥 Passo 1: A descarregar padrões (necessários para o Fabric funcionar)...",
"setup_step_downloading_strategies": "📥 Passo 2: A descarregar estratégias (necessárias para o Fabric funcionar)...",
"setup_step_configure_ai_provider": "🤖 Passo 3: Configurar um fornecedor de IA",
"setup_ai_provider_required": "O Fabric precisa de pelo menos um fornecedor de IA para funcionar.",
"setup_add_more_providers_later": "Poderá adicionar mais fornecedores depois com 'fabric --setup'",
"setup_step_setting_defaults": "⚙️ Passo 4: A configurar fornecedor e modelo predefinido...",
"setup_complete_header": "✅ Configuração completa! Agora pode usar o Fabric.",
"setup_next_steps": "Próximos passos:",
"setup_list_patterns": "• Listar padrões disponíveis: fabric -l",
"setup_try_pattern": "• Experimentar um padrão: echo 'o seu texto' | fabric --pattern summarize",
"setup_configure_more": "• Configurar mais opções: fabric --setup",
"setup_failed_download_patterns": "falha ao descarregar padrões: %w",
"setup_failed_download_strategies": "falha ao descarregar estratégias: %w",
"setup_failed_set_defaults": "falha ao configurar fornecedor e modelo predefinido: %w",
"setup_no_ai_provider_selected": "nenhum fornecedor de IA selecionado - pelo menos um é necessário",
"setup_invalid_selection": "seleção inválida: %s",
"setup_available_ai_providers": "Fornecedores de IA Disponíveis:",
"setup_enter_ai_provider_number": "Número do Fornecedor de IA",
"setup_available_plugins": "Plugins disponíveis:",
"setup_plugin_number": "Número do Plugin",
"setup_plugin_prompt": "Indique o número do plugin a configurar",
"setup_required_configuration_header": "━━━ CONFIGURAÇÃO OBRIGATÓRIA ━━━\n\nFornecedores de IA [pelo menos um obrigatório]",
"setup_required_tools": "Ferramentas Obrigatórias",
"setup_optional_configuration_header": "━━━ CONFIGURAÇÃO OPCIONAL ━━━\n\nFerramentas Opcionais",
"setup_validation_header": "Estado da Configuração:",
"setup_validation_ai_provider_configured": "✓ Fornecedor de IA configurado",
"setup_validation_ai_provider_missing": "✗ Fornecedor de IA não configurado - Necessário para o Fabric funcionar",
"setup_validation_defaults_configured": "✓ Fornecedor/modelo predefinido definido: %s/%s",
"setup_validation_defaults_missing": "✗ Fornecedor/modelo predefinido não definido - Necessário para o Fabric funcionar",
"setup_validation_patterns_configured": "✓ Padrões descarregados",
"setup_validation_patterns_missing": "✗ Padrões não encontrados - Necessários para o Fabric funcionar",
"setup_validation_strategies_configured": "✓ Estratégias descarregadas",
"setup_validation_strategies_missing": "✗ Estratégias não encontradas - Necessárias para o Fabric funcionar",
"setup_validation_incomplete_warning": "⚠️ Configuração incompleta! Componentes necessários em falta.",
"setup_validation_incomplete_help": "Execute 'fabric --setup' novamente para configurar itens em falta,\nou execute 'fabric -U' para descarregar padrões e estratégias.",
"setup_validation_complete": "✓ Todos os componentes necessários estão configurados!",
"patterns_not_found_header": "⚠️ Nenhum padrão encontrado!",
"patterns_required_to_work": "Padrões são necessários para o Fabric funcionar. Para resolver:",
"patterns_option_run_setup": "Opção 1 (Recomendada): Execute a configuração para descarregar padrões",
"patterns_option_run_setup_command": "fabric --setup",
"patterns_option_run_update": "Opção 2: Descarregar/atualizar padrões diretamente",
"patterns_option_run_update_command": "fabric -U",
"pattern_not_found_no_patterns": "padrão '%s' não encontrado.\n\nNenhum padrão instalado! Para resolver:\n • Execute 'fabric --setup' para configurar e descarregar padrões\n • Ou execute 'fabric -U' para descarregar/atualizar padrões diretamente",
"pattern_not_found_list_available": "padrão '%s' não encontrado. Execute 'fabric -l' para ver os padrões disponíveis",
"plugin_configured": " ✓",
"plugin_not_configured": " ⚠️ NÃO CONFIGURADO",
"defaults_setup_description": "Fornecedor e modelo de IA padrão",
"defaults_model_question": "Indique o índice ou o nome do seu modelo padrão",
"defaults_model_context_length_question": "Indique o comprimento do contexto do modelo",
"custom_patterns_label": "Padrões personalizados",
"custom_patterns_setup_description": "Padrões personalizados - Definir diretório para os seus padrões personalizados",
"custom_patterns_directory_question": "Indique o caminho para o seu diretório de padrões personalizados",
"jina_label": "Jina AI",
"jina_setup_description": "Serviço Jina AI - para obter uma página web como texto limpo e compatível com LLM",
"youtube_label": "YouTube",
"youtube_setup_description": "YouTube - para obter transcrições de vídeo (via yt-dlp) e comentários/metadados (via API do YouTube)",
"language_label": "Idioma",
"language_setup_description": "Idioma - Idioma de saída predefinido do fornecedor de IA",
"language_output_question": "Indique o seu idioma de saída predefinido (por exemplo: zh_CN)",
"optional_marker": "(opcional)",
"required_marker": "[obrigatório]",
"patterns_loader_label": "Carregador de padrões",
"patterns_setup_description": "Padrões - Transfere os padrões",
"patterns_git_repo_url_label": "URL do repositório Git",
"patterns_git_repo_url_question": "Indique o URL padrão do repositório Git para os padrões",
"patterns_git_repo_folder_label": "Pasta de padrões no repositório Git",
"patterns_git_repo_folder_question": "Indique a pasta padrão no repositório Git onde os padrões estão guardados",
"patterns_failed_create_temp_folder": "falha ao criar a pasta temporária de padrões: %w",
"patterns_downloading": "A transferir padrões e a preencher %s...\\n",
"patterns_failed_download_from_git": "falha ao transferir padrões do repositório Git: %w",
"patterns_saving_updated_configuration": "💾 A guardar a configuração actualizada (caminho alterado de '%s' para '%s')...\\n",
"patterns_failed_move_patterns": "falha ao mover os padrões para o directório de configuração: %w",
"patterns_download_success": "✅ Padrões transferidos e instalados com sucesso em %s\\n",
"patterns_failed_unique_file": "falha ao criar o ficheiro de padrões únicos: %w",
"patterns_failed_access_directory": "falha ao aceder ao directório de padrões '%s': %w",
"patterns_preserve_warning": "Aviso: não foi possível preservar o padrão personalizado '%s': %v\\n",
"patterns_preserved_custom_pattern": "Padrão personalizado preservado: %s\\n",
"patterns_failed_create_temp_dir": "falha ao criar directório temporário: %w",
"patterns_cloning_repository": "A clonar repositório %s (caminho: %s)...\\n",
"patterns_failed_download_from_repo": "falha ao transferir padrões de %s: %w",
"patterns_failed_read_temp_directory": "falha ao ler o directório temporário de padrões: %w",
"patterns_no_patterns_migration_failed": "nenhum padrão encontrado no repositório no caminho %s e a migração falhou: %w",
"patterns_downloaded_temp": "%d padrões transferidos para o directório temporário\\n",
"patterns_detected_old_path": "🔄 Caminho antigo 'patterns' detectado, a tentar migração para 'data/patterns'...",
"patterns_warning_remove_test_folder": "Aviso: não foi possível remover a pasta temporária de teste '%s': %v\\n",
"patterns_found_new_path": "✅ %d padrões encontrados no novo caminho '%s', a actualizar configuração...\\n",
"patterns_failed_move_test_patterns": "falha ao mover padrões de teste para a pasta temporária: %w",
"patterns_unable_to_find_or_migrate": "não foi possível encontrar padrões no caminho actual '%s' nem migrar para a nova estrutura",
"patterns_failed_read_directory": "falha ao ler o directório de padrões: %w",
"patterns_debug_included_custom_directory": "📂 Padrões do directório personalizado também incluídos: %s\\n",
"patterns_warning_custom_directory": "Aviso: não foi possível ler o directório de padrões personalizado %s: %v\\n",
"patterns_no_patterns_found_in_directories": "nenhum padrão encontrado nos directórios %s e %s",
"patterns_no_patterns_found_in_directory": "nenhum padrão encontrado no directório %s",
"patterns_failed_write_unique_file": "falha ao gravar o ficheiro de padrões únicos: %w",
"patterns_unique_file_created": "📝 Ficheiro de padrões únicos criado com %d padrões\\n",
"patterns_no_patterns_copied": "nenhum padrão foi copiado com sucesso para %s",
"patterns_failed_loaded_marker": "falha ao criar o ficheiro marcador '%s': %w",
"strategies_label": "Estratégias de prompt",
"strategies_setup_description": "Estratégias - Transfere estratégias de prompting (como chain of thought)",
"strategies_git_repo_url_label": "URL do repositório Git",
"strategies_git_repo_url_question": "Indique o URL padrão do repositório Git para as estratégias",
"strategies_git_repo_folder_label": "Pasta de estratégias no repositório Git",
"strategies_git_repo_folder_question": "Indique a pasta padrão no repositório Git onde as estratégias estão guardadas",
"strategies_downloading": "A transferir estratégias e a preencher %s...\\n",
"strategies_download_success": "✅ Estratégias transferidas e instaladas com sucesso em %s\\n",
"strategies_home_dir_error": "não foi possível obter o directório home: %v",
"strategies_failed_create_directory": "falha ao criar directório de estratégias: %w",
"strategies_cloning_repository": "A clonar repositório %s (caminho: %s)...\\n",
"strategies_failed_download": "falha ao transferir estratégias: %w",
"strategies_downloaded_count": "%d estratégias transferidas\\n",
"strategies_home_dir_fallback": "não foi possível obter o directório home: %v, a usar o directório actual",
"strategy_not_found": "estratégia %s não encontrada. Execute 'fabric --liststrategies' para ver a lista",
"strategies_none_found": "nenhuma estratégia encontrada. Execute 'fabric --setup' para transferir estratégias",
"strategies_available_header": "Estratégias disponíveis:",
"plugin_enter_value": "Indique o seu %v %v",
"plugin_enable_bool_question": "Ativar %v %v (true/false)",
"plugin_setup_skipped": "[%v] ignorado\\n",
"plugin_question_bool": "%v%v (true/false, deixe em branco para '%s' ou escreva '%v' para remover o valor):",
"plugin_question_with_default": "%v%v (deixe em branco para '%s' ou escreva '%v' para remover o valor):",
"plugin_question_optional": "%v%v (deixe em branco para ignorar):",
"plugin_invalid_boolean_value": "valor booleano inválido: %v",
"plugin_setting_not_valid": "%v=%v não é válido",
"plugin_invalid_bool": "bool inválido: %q"
}

View File

@@ -161,5 +161,129 @@
"no_items_found": "没有 %s",
"no_description_available": "没有可用描述",
"i18n_download_failed": "下载语言 '%s' 的翻译失败: %v",
"i18n_load_failed": "加载翻译文件失败: %v"
"i18n_load_failed": "加载翻译文件失败: %v",
"setup_welcome_header": "🎉 欢迎使用 Fabric让我们开始设置。",
"setup_step_downloading_patterns": "📥 步骤 1正在下载模式Fabric 运行所需)...",
"setup_step_downloading_strategies": "📥 步骤 2正在下载策略Fabric 运行所需)...",
"setup_step_configure_ai_provider": "🤖 步骤 3配置 AI 提供商",
"setup_ai_provider_required": "Fabric 需要至少一个 AI 提供商才能运行。",
"setup_add_more_providers_later": "您可以稍后通过 'fabric --setup' 添加更多提供商",
"setup_step_setting_defaults": "⚙️ 步骤 4正在设置默认提供商和模型...",
"setup_complete_header": "✅ 设置完成!您现在可以使用 Fabric 了。",
"setup_next_steps": "下一步:",
"setup_list_patterns": "• 列出可用模式fabric -l",
"setup_try_pattern": "• 尝试一个模式echo '您的文本' | fabric --pattern summarize",
"setup_configure_more": "• 配置更多设置fabric --setup",
"setup_failed_download_patterns": "下载模式失败:%w",
"setup_failed_download_strategies": "下载策略失败:%w",
"setup_failed_set_defaults": "设置默认提供商和模型失败:%w",
"setup_no_ai_provider_selected": "未选择 AI 提供商 - 至少需要一个",
"setup_invalid_selection": "无效的选择:%s",
"setup_available_ai_providers": "可用的 AI 提供商:",
"setup_enter_ai_provider_number": "AI 提供商编号",
"setup_available_plugins": "可用的插件:",
"setup_plugin_number": "插件编号",
"setup_plugin_prompt": "请输入要设置的插件编号",
"setup_required_configuration_header": "━━━ 必需配置 ━━━\n\nAI 提供商 [至少需要一个]",
"setup_required_tools": "必需工具",
"setup_optional_configuration_header": "━━━ 可选配置 ━━━\n\n可选工具",
"setup_validation_header": "配置状态:",
"setup_validation_ai_provider_configured": "✓ AI 提供商已配置",
"setup_validation_ai_provider_missing": "✗ AI 提供商未配置 - Fabric 运行所需",
"setup_validation_defaults_configured": "✓ 默认提供商/模型已设置:%s/%s",
"setup_validation_defaults_missing": "✗ 默认提供商/模型未设置 - Fabric 运行所需",
"setup_validation_patterns_configured": "✓ 模式已下载",
"setup_validation_patterns_missing": "✗ 未找到模式 - Fabric 运行所需",
"setup_validation_strategies_configured": "✓ 策略已下载",
"setup_validation_strategies_missing": "✗ 未找到策略 - Fabric 运行所需",
"setup_validation_incomplete_warning": "⚠️ 设置不完整!缺少必需组件。",
"setup_validation_incomplete_help": "再次运行 'fabric --setup' 配置缺失项,\n或运行 'fabric -U' 下载模式和策略。",
"setup_validation_complete": "✓ 所有必需组件已配置!",
"patterns_not_found_header": "⚠️ 未找到模式!",
"patterns_required_to_work": "Fabric 需要模式才能运行。要解决此问题:",
"patterns_option_run_setup": "选项 1推荐运行设置以下载模式",
"patterns_option_run_setup_command": "fabric --setup",
"patterns_option_run_update": "选项 2直接下载/更新模式",
"patterns_option_run_update_command": "fabric -U",
"pattern_not_found_no_patterns": "未找到模式 '%s'。\n\n未安装任何模式要解决此问题\n • 运行 'fabric --setup' 配置并下载模式\n • 或运行 'fabric -U' 直接下载/更新模式",
"pattern_not_found_list_available": "未找到模式 '%s'。运行 'fabric -l' 查看可用模式",
"plugin_configured": " ✓",
"plugin_not_configured": " ⚠️ 未配置",
"defaults_setup_description": "默认 AI 提供商和模型",
"defaults_model_question": "请输入您的默认模型的索引或名称",
"defaults_model_context_length_question": "请输入模型上下文长度",
"custom_patterns_label": "自定义模式",
"custom_patterns_setup_description": "自定义模式 - 设置您的自定义模式目录",
"custom_patterns_directory_question": "请输入您的自定义模式目录路径",
"jina_label": "Jina AI",
"jina_setup_description": "Jina AI 服务 - 将网页获取为干净、LLM 友好的文本",
"youtube_label": "YouTube",
"youtube_setup_description": "YouTube - 获取视频转录(通过 yt-dlp和评论/元数据(通过 YouTube API",
"language_label": "语言",
"language_setup_description": "语言 - AI 提供商的默认输出语言",
"language_output_question": "请输入您的默认输出语言例如zh_CN",
"optional_marker": "(可选)",
"required_marker": "(必需)",
"patterns_loader_label": "模式加载器",
"patterns_setup_description": "模式 - 下载模式",
"patterns_git_repo_url_label": "Git 仓库 URL",
"patterns_git_repo_url_question": "请输入用于模式的默认 Git 仓库 URL",
"patterns_git_repo_folder_label": "Git 仓库中的模式文件夹",
"patterns_git_repo_folder_question": "请输入存储模式的 Git 仓库默认文件夹",
"patterns_failed_create_temp_folder": "创建模式临时文件夹失败:%w",
"patterns_downloading": "正在下载模式并填充 %s...\\n",
"patterns_failed_download_from_git": "从 Git 仓库下载模式失败:%w",
"patterns_saving_updated_configuration": "💾 正在保存更新的配置(路径从 '%s' 更改为 '%s'...\\n",
"patterns_failed_move_patterns": "将模式移动到配置目录失败:%w",
"patterns_download_success": "✅ 已成功下载并安装模式到 %s\\n",
"patterns_failed_unique_file": "创建唯一模式文件失败:%w",
"patterns_failed_access_directory": "访问模式目录 '%s' 失败:%w",
"patterns_preserve_warning": "警告:未能保留自定义模式 '%s'%v\\n",
"patterns_preserved_custom_pattern": "已保留自定义模式:%s\\n",
"patterns_failed_create_temp_dir": "创建临时目录失败:%w",
"patterns_cloning_repository": "正在克隆仓库 %s路径%s...\\n",
"patterns_failed_download_from_repo": "从 %s 下载模式失败:%w",
"patterns_failed_read_temp_directory": "读取模式临时目录失败:%w",
"patterns_no_patterns_migration_failed": "在仓库路径 %s 未找到模式且迁移失败:%w",
"patterns_downloaded_temp": "已将 %d 个模式下载到临时目录\\n",
"patterns_detected_old_path": "🔄 检测到旧的模式路径“patterns”尝试迁移到“data/patterns”...",
"patterns_warning_remove_test_folder": "警告:无法删除测试临时文件夹 '%s'%v\\n",
"patterns_found_new_path": "✅ 在新路径“%s”找到 %d 个模式,正在更新配置...\\n",
"patterns_failed_move_test_patterns": "将测试模式移动到临时文件夹失败:%w",
"patterns_unable_to_find_or_migrate": "在当前路径“%s”未找到模式也无法迁移到新结构",
"patterns_failed_read_directory": "读取模式目录失败:%w",
"patterns_debug_included_custom_directory": "📂 还包含了自定义目录中的模式:%s\\n",
"patterns_warning_custom_directory": "警告:无法读取自定义模式目录 %s%v\\n",
"patterns_no_patterns_found_in_directories": "在目录 %s 和 %s 中未找到模式",
"patterns_no_patterns_found_in_directory": "在目录 %s 中未找到模式",
"patterns_failed_write_unique_file": "写入唯一模式文件失败:%w",
"patterns_unique_file_created": "📝 已创建包含 %d 个模式的唯一模式文件\\n",
"patterns_no_patterns_copied": "未能成功将模式复制到 %s",
"patterns_failed_loaded_marker": "创建标记文件 '%s' 失败:%w",
"strategies_label": "提示策略",
"strategies_setup_description": "策略 - 下载提示策略(如 chain of thought",
"strategies_git_repo_url_label": "Git 仓库 URL",
"strategies_git_repo_url_question": "请输入用于策略的默认 Git 仓库 URL",
"strategies_git_repo_folder_label": "Git 仓库中的策略文件夹",
"strategies_git_repo_folder_question": "请输入存储策略的 Git 仓库默认文件夹",
"strategies_downloading": "正在下载策略并填充 %s...\\n",
"strategies_download_success": "✅ 已成功下载并安装策略到 %s\\n",
"strategies_home_dir_error": "无法获取主目录:%v",
"strategies_failed_create_directory": "创建策略目录失败:%w",
"strategies_cloning_repository": "正在克隆仓库 %s路径%s...\\n",
"strategies_failed_download": "下载策略失败:%w",
"strategies_downloaded_count": "已下载 %d 个策略\\n",
"strategies_home_dir_fallback": "无法获取主目录:%v改用当前目录",
"strategy_not_found": "未找到策略 %s。运行 'fabric --liststrategies' 查看列表",
"strategies_none_found": "未找到任何策略。请运行 'fabric --setup' 下载策略",
"strategies_available_header": "可用的策略:",
"plugin_enter_value": "请输入您的 %v %v",
"plugin_enable_bool_question": "启用 %v %vtrue/false",
"plugin_setup_skipped": "[%v] 已跳过\\n",
"plugin_question_bool": "%v%vtrue/false留空表示使用 '%s',或输入 '%v' 清除值):",
"plugin_question_with_default": "%v%v留空表示使用 '%s',或输入 '%v' 清除值):",
"plugin_question_optional": "%v%v留空以跳过",
"plugin_invalid_boolean_value": "无效的布尔值:%v",
"plugin_setting_not_valid": "%v=%v 无效",
"plugin_invalid_bool": "无效的 bool%q"
}

View File

@@ -165,6 +165,11 @@ var ProviderMap = map[string]ProviderConfig{
BaseURL: "http://localhost:4000",
ImplementsResponses: false,
},
"MiniMax": {
Name: "MiniMax",
BaseURL: "https://api.minimaxi.com/v1",
ImplementsResponses: false,
},
"Mistral": {
Name: "Mistral",
BaseURL: "https://api.mistral.ai/v1",

View File

@@ -30,6 +30,11 @@ func TestCreateClient(t *testing.T) {
provider: "Abacus",
exists: true,
},
{
name: "Existing provider - MiniMax",
provider: "MiniMax",
exists: true,
},
{
name: "Non-existent provider",
provider: "NonExistent",

View File

@@ -35,7 +35,7 @@ func (o *VendorsManager) AddVendors(vendors ...Vendor) {
}
}
func (o *VendorsManager) Clear(vendors ...Vendor) {
func (o *VendorsManager) Clear() {
o.VendorsByName = map[string]Vendor{}
o.Vendors = []Vendor{}
o.Models = nil

View File

@@ -7,6 +7,7 @@ import (
"sort"
"strings"
"github.com/danielmiessler/fabric/internal/i18n"
"github.com/danielmiessler/fabric/internal/plugins/template"
"github.com/danielmiessler/fabric/internal/util"
)
@@ -128,7 +129,16 @@ func (o *PatternsEntity) getFromDB(name string) (ret *Pattern, err error) {
var pattern []byte
if pattern, err = os.ReadFile(patternPath); err != nil {
return
// Check if the patterns directory is empty to provide helpful error message
if os.IsNotExist(err) {
var entries []os.DirEntry
entries, _ = os.ReadDir(o.Dir)
if len(entries) == 0 || (len(entries) == 1 && entries[0].Name() == "loaded") {
// Patterns directory is empty or only has 'loaded' file
return nil, fmt.Errorf(i18n.T("pattern_not_found_no_patterns"), name)
}
}
return nil, fmt.Errorf(i18n.T("pattern_not_found_list_available"), name)
}
patternStr := string(pattern)

View File

@@ -5,6 +5,8 @@ import (
"fmt"
"os"
"strings"
"github.com/danielmiessler/fabric/internal/i18n"
)
const AnswerReset = "reset"
@@ -55,12 +57,22 @@ func (o *PluginBase) AddSetupQuestionCustom(name string, required bool, question
setting := o.AddSetting(name, required)
ret = &SetupQuestion{Setting: setting, Question: question}
if ret.Question == "" {
ret.Question = fmt.Sprintf("Enter your %v %v", o.Name, strings.ToUpper(name))
ret.Question = fmt.Sprintf(i18n.T("plugin_enter_value"), o.Name, strings.ToUpper(name))
}
o.SetupQuestions = append(o.SetupQuestions, ret)
return
}
// AddSetupQuestionWithEnvName creates a setup question with an explicit environment variable name.
// This is useful when you want the environment variable name to remain constant across languages.
// The envVarName is used for the environment variable, while the question is localized.
func (o *PluginBase) AddSetupQuestionWithEnvName(envVarName string, required bool, question string) (ret *SetupQuestion) {
setting := o.AddSetting(envVarName, required)
ret = &SetupQuestion{Setting: setting, Question: question}
o.SetupQuestions = append(o.SetupQuestions, ret)
return
}
func (o *PluginBase) AddSetupQuestionBool(name string, required bool) (ret *SetupQuestion) {
return o.AddSetupQuestionCustomBool(name, required, "")
}
@@ -70,7 +82,7 @@ func (o *PluginBase) AddSetupQuestionCustomBool(name string, required bool, ques
setting.Type = SettingTypeBool
ret = &SetupQuestion{Setting: setting, Question: question}
if ret.Question == "" {
ret.Question = fmt.Sprintf("Enable %v %v (true/false)", o.Name, strings.ToUpper(name))
ret.Question = fmt.Sprintf(i18n.T("plugin_enable_bool_question"), o.Name, strings.ToUpper(name))
}
o.SetupQuestions = append(o.SetupQuestions, ret)
return
@@ -102,7 +114,7 @@ func (o *PluginBase) Setup() (err error) {
func (o *PluginBase) SetupOrSkip() (err error) {
if err = o.Setup(); err != nil {
fmt.Printf("[%v] skipped\n", o.GetName())
fmt.Printf(i18n.T("plugin_setup_skipped"), o.GetName())
}
return
}
@@ -170,7 +182,7 @@ func ParseBool(val string) (bool, error) {
case "0", "false", "no", "off":
return false, nil
}
return false, fmt.Errorf("invalid bool: %q", val)
return false, fmt.Errorf(i18n.T("plugin_invalid_bool"), val)
}
type SetupQuestion struct {
@@ -191,13 +203,11 @@ func (o *SetupQuestion) Ask(label string) (err error) {
if v, err := ParseBool(o.Value); err == nil && v {
current = "true"
}
fmt.Printf("%v%v (true/false, leave empty for '%s' or type '%v' to remove the value):\n",
prefix, o.Question, current, AnswerReset)
fmt.Printf(i18n.T("plugin_question_bool"), prefix, o.Question, current, AnswerReset)
} else if o.Value != "" {
fmt.Printf("%v%v (leave empty for '%s' or type '%v' to remove the value):\n",
prefix, o.Question, o.Value, AnswerReset)
fmt.Printf(i18n.T("plugin_question_with_default"), prefix, o.Question, o.Value, AnswerReset)
} else {
fmt.Printf("%v%v (leave empty to skip):\n", prefix, o.Question)
fmt.Printf(i18n.T("plugin_question_optional"), prefix, o.Question)
}
var answer string
fmt.Scanln(&answer)
@@ -223,7 +233,7 @@ func (o *SetupQuestion) OnAnswerWithReset(answer string, isReset bool) (err erro
} else {
_, err := ParseBool(answer)
if err != nil {
return fmt.Errorf("invalid boolean value: %v", answer)
return fmt.Errorf(i18n.T("plugin_invalid_boolean_value"), answer)
}
o.Value = strings.ToLower(answer)
}
@@ -246,7 +256,7 @@ func (o *SetupQuestion) OnAnswerWithReset(answer string, isReset bool) (err erro
func (o *Setting) IsValidErr() (err error) {
if !o.IsValid() {
err = fmt.Errorf("%v=%v, is not valid", o.EnvVariable, o.Value)
err = fmt.Errorf(i18n.T("plugin_setting_not_valid"), o.EnvVariable, o.Value)
}
return
}
@@ -317,5 +327,8 @@ func BuildEnvVariablePrefix(name string) (ret string) {
func BuildEnvVariable(name string) string {
name = strings.TrimSpace(name)
return strings.ReplaceAll(strings.ToUpper(name), " ", "_")
name = strings.ToUpper(name)
name = strings.ReplaceAll(name, " ", "_")
name = strings.ReplaceAll(name, "-", "_")
return name
}

View File

@@ -9,6 +9,7 @@ import (
"sort"
"strings"
"github.com/danielmiessler/fabric/internal/i18n"
"github.com/danielmiessler/fabric/internal/plugins"
"github.com/danielmiessler/fabric/internal/tools/githelper"
)
@@ -26,18 +27,18 @@ func NewStrategiesManager() (sm *StrategiesManager) {
Strategies: strategies,
}
sm.PluginBase = &plugins.PluginBase{
Name: label,
SetupDescription: "Strategies - Downloads Prompting Strategies (like chain of thought) [required]",
Name: i18n.T("strategies_label"),
SetupDescription: i18n.T("strategies_setup_description") + " " + i18n.T("required_marker"),
EnvNamePrefix: plugins.BuildEnvVariablePrefix(label),
ConfigureCustom: sm.configure,
}
sm.DefaultGitRepoUrl = sm.AddSetupQuestionCustom("Git Repo Url", true,
"Enter the default Git repository URL for the strategies")
sm.DefaultGitRepoUrl = sm.AddSetupQuestionWithEnvName("Git Repo Url", true,
i18n.T("strategies_git_repo_url_question"))
sm.DefaultGitRepoUrl.Value = DefaultStrategiesGitRepoUrl
sm.DefaultFolder = sm.AddSetupQuestionCustom("Git Repo Strategies Folder", true,
"Enter the default folder in the Git repository where strategies are stored")
sm.DefaultFolder = sm.AddSetupQuestionWithEnvName("Git Repo Strategies Folder", true,
i18n.T("strategies_git_repo_folder_question"))
sm.DefaultFolder.Value = DefaultStrategiesGitRepoFolder
return
@@ -103,33 +104,39 @@ func (sm *StrategiesManager) Setup() (err error) {
if err = sm.PopulateDB(); err != nil {
return
}
// Reload strategies after downloading so IsConfigured() reflects the new state
sm.Strategies, _ = LoadAllFiles()
return
}
// PopulateDB downloads strategies from the internet and populates the strategies folder
func (sm *StrategiesManager) PopulateDB() (err error) {
stageDir, _ := getStrategyDir()
fmt.Printf("Downloading strategies and Populating %s...\n", stageDir)
strategyDir, _ := getStrategyDir()
fmt.Printf(i18n.T("strategies_downloading"), strategyDir)
fmt.Println()
fmt.Println()
if err = sm.gitCloneAndCopy(); err != nil {
return
}
fmt.Printf(i18n.T("strategies_download_success"), strategyDir)
return
}
func (sm *StrategiesManager) gitCloneAndCopy() (err error) {
homeDir, err := os.UserHomeDir()
if err != nil {
err = fmt.Errorf("could not get home directory: %v", err)
err = fmt.Errorf(i18n.T("strategies_home_dir_error"), err)
return
}
strategyDir := filepath.Join(homeDir, ".config", "fabric", "strategies")
// Create the directory if it doesn't exist
if err = os.MkdirAll(strategyDir, os.ModePerm); err != nil {
return fmt.Errorf("failed to create strategies directory: %w", err)
return fmt.Errorf(i18n.T("strategies_failed_create_directory"), err)
}
fmt.Printf(i18n.T("strategies_cloning_repository"), sm.DefaultGitRepoUrl.Value, sm.DefaultFolder.Value)
// Use the helper to fetch files
err = githelper.FetchFilesFromRepo(githelper.FetchOptions{
RepoURL: sm.DefaultGitRepoUrl.Value,
@@ -138,7 +145,19 @@ func (sm *StrategiesManager) gitCloneAndCopy() (err error) {
SingleDirectory: true,
})
if err != nil {
return fmt.Errorf("failed to download strategies: %w", err)
return fmt.Errorf(i18n.T("strategies_failed_download"), err)
}
// Count downloaded strategies
entries, readErr := os.ReadDir(strategyDir)
if readErr == nil {
strategyCount := 0
for _, entry := range entries {
if !entry.IsDir() && filepath.Ext(entry.Name()) == ".json" {
strategyCount++
}
}
fmt.Printf(i18n.T("strategies_downloaded_count"), strategyCount)
}
return nil
@@ -153,7 +172,7 @@ func (sm *StrategiesManager) configure() (err error) {
func getStrategyDir() (ret string, err error) {
homeDir, err := os.UserHomeDir()
if err != nil {
err = fmt.Errorf("could not get home directory: %v, using current directory instead", err)
err = fmt.Errorf(i18n.T("strategies_home_dir_fallback"), err)
ret = filepath.Join(".", "data/strategies")
return
}
@@ -178,7 +197,7 @@ func LoadStrategy(filename string) (*Strategy, error) {
// Try without extension
strategyPath = filepath.Join(strategyDir, filename)
if _, err := os.Stat(strategyPath); os.IsNotExist(err) {
return nil, fmt.Errorf("strategy %s not found. Please run 'fabric --liststrategies' for list", filename)
return nil, fmt.Errorf(i18n.T("strategy_not_found"), filename)
}
}
@@ -199,10 +218,10 @@ func LoadStrategy(filename string) (*Strategy, error) {
// ListStrategies prints available strategies
func (sm *StrategiesManager) ListStrategies(shellCompleteList bool) error {
if len(sm.Strategies) == 0 {
return fmt.Errorf("no strategies found. Please run 'fabric --setup' to download strategies")
return fmt.Errorf("%s", i18n.T("strategies_none_found"))
}
if !shellCompleteList {
fmt.Print("Available Strategies:\n\n")
fmt.Print(i18n.T("strategies_available_header"), "\n\n")
}
// Get all strategy names for sorting
names := []string{}

View File

@@ -12,15 +12,19 @@ type YouTubeHandler struct {
yt *youtube.YouTube
}
// YouTubeRequest represents a request to get a YouTube video transcript
type YouTubeRequest struct {
URL string `json:"url"`
Language string `json:"language"`
Timestamps bool `json:"timestamps"`
URL string `json:"url" binding:"required" example:"https://www.youtube.com/watch?v=dQw4w9WgXcQ"` // YouTube video URL (required)
Language string `json:"language,omitempty" example:"en"` // Language code for transcript (default: "en")
Timestamps bool `json:"timestamps,omitempty" example:"false"` // Include timestamps in the transcript (default: false)
}
// YouTubeResponse represents the response containing video transcript and metadata
type YouTubeResponse struct {
Transcript string `json:"transcript"`
Title string `json:"title"`
Transcript string `json:"transcript" example:"This is the video transcript..."` // The video transcript text
VideoId string `json:"videoId" example:"dQw4w9WgXcQ"` // YouTube video ID
Title string `json:"title" example:"Example Video Title"` // Video title from YouTube metadata
Description string `json:"description" example:"This is the video description from YouTube..."` // Video description from YouTube metadata
}
func NewYouTubeHandler(r *gin.Engine, registry *core.PluginRegistry) *YouTubeHandler {
@@ -29,6 +33,18 @@ func NewYouTubeHandler(r *gin.Engine, registry *core.PluginRegistry) *YouTubeHan
return handler
}
// Transcript godoc
// @Summary Get YouTube video transcript
// @Description Retrieves the transcript of a YouTube video along with video metadata (title and description)
// @Tags youtube
// @Accept json
// @Produce json
// @Param request body YouTubeRequest true "YouTube transcript request with URL, language, and timestamp options"
// @Success 200 {object} YouTubeResponse "Successful response with transcript and metadata"
// @Failure 400 {object} map[string]string "Bad request - invalid URL or playlist URL provided"
// @Failure 500 {object} map[string]string "Internal server error - failed to retrieve transcript or metadata"
// @Security ApiKeyAuth
// @Router /youtube/transcript [post]
func (h *YouTubeHandler) Transcript(c *gin.Context) {
var req YouTubeRequest
if err := c.BindJSON(&req); err != nil {
@@ -55,6 +71,20 @@ func (h *YouTubeHandler) Transcript(c *gin.Context) {
return
}
// Try to get metadata (requires valid YouTube API key), but don't fail if unavailable
// This allows the endpoint to work for transcript extraction even without API key
var metadata *youtube.VideoMetadata
var title, description string
if metadata, err = h.yt.GrabMetadata(videoID); err == nil {
// Metadata available - use title and description from API
title = metadata.Title
description = metadata.Description
} else {
// No valid API key or metadata fetch failed - fallback to videoID as title
title = videoID
description = ""
}
var transcript string
if req.Timestamps {
transcript, err = h.yt.GrabTranscriptWithTimestamps(videoID, language)
@@ -66,5 +96,5 @@ func (h *YouTubeHandler) Transcript(c *gin.Context) {
return
}
c.JSON(http.StatusOK, YouTubeResponse{Transcript: transcript, Title: videoID})
c.JSON(http.StatusOK, YouTubeResponse{Transcript: transcript, VideoId: videoID, Title: title, Description: description})
}

View File

@@ -6,6 +6,7 @@ import (
"path/filepath"
"strings"
"github.com/danielmiessler/fabric/internal/i18n"
"github.com/danielmiessler/fabric/internal/plugins"
)
@@ -14,14 +15,14 @@ func NewCustomPatterns() (ret *CustomPatterns) {
ret = &CustomPatterns{}
ret.PluginBase = &plugins.PluginBase{
Name: label,
SetupDescription: "Custom Patterns - Set directory for your custom patterns (optional)",
Name: i18n.T("custom_patterns_label"),
SetupDescription: i18n.T("custom_patterns_setup_description") + " " + i18n.T("optional_marker"),
EnvNamePrefix: plugins.BuildEnvVariablePrefix(label),
ConfigureCustom: ret.configure,
}
ret.CustomPatternsDir = ret.AddSetupQuestionCustom("Directory", false,
"Enter the path to your custom patterns directory (leave empty to skip)")
ret.CustomPatternsDir = ret.AddSetupQuestionWithEnvName("Directory", false,
i18n.T("custom_patterns_directory_question"))
return
}

View File

@@ -6,6 +6,7 @@ import (
"github.com/pkg/errors"
"github.com/danielmiessler/fabric/internal/i18n"
"github.com/danielmiessler/fabric/internal/plugins"
"github.com/danielmiessler/fabric/internal/plugins/ai"
)
@@ -15,7 +16,7 @@ func NeeDefaults(getVendorsModels func() (*ai.VendorsModels, error)) (ret *Defau
ret = &Defaults{
PluginBase: &plugins.PluginBase{
Name: vendorName,
SetupDescription: "Default AI Vendor and Model [required]",
SetupDescription: i18n.T("defaults_setup_description") + " " + i18n.T("required_marker"),
EnvNamePrefix: plugins.BuildEnvVariablePrefix(vendorName),
},
GetVendorsModels: getVendorsModels,
@@ -23,11 +24,11 @@ func NeeDefaults(getVendorsModels func() (*ai.VendorsModels, error)) (ret *Defau
ret.Vendor = ret.AddSetting("Vendor", true)
ret.Model = ret.AddSetupQuestionCustom("Model", true,
"Enter the index the name of your default model")
ret.Model = ret.AddSetupQuestionWithEnvName("Model", true,
i18n.T("defaults_model_question"))
ret.ModelContextLength = ret.AddSetupQuestionCustom("Model Context Length", false,
"Enter model context length")
ret.ModelContextLength = ret.AddSetupQuestionWithEnvName("Model Context Length", false,
i18n.T("defaults_model_context_length_question"))
return
}

View File

@@ -7,6 +7,7 @@ import (
"io"
"net/http"
"github.com/danielmiessler/fabric/internal/i18n"
"github.com/danielmiessler/fabric/internal/plugins"
)
@@ -21,8 +22,8 @@ func NewClient() (ret *Client) {
ret = &Client{
PluginBase: &plugins.PluginBase{
Name: label,
SetupDescription: "Jina AI Service - to grab a webpage as clean, LLM-friendly text",
Name: i18n.T("jina_label"),
SetupDescription: i18n.T("jina_setup_description") + " " + i18n.T("optional_marker"),
EnvNamePrefix: plugins.BuildEnvVariablePrefix(label),
},
}

View File

@@ -1,6 +1,7 @@
package lang
import (
"github.com/danielmiessler/fabric/internal/i18n"
"github.com/danielmiessler/fabric/internal/plugins"
"golang.org/x/text/language"
)
@@ -11,14 +12,14 @@ func NewLanguage() (ret *Language) {
ret = &Language{}
ret.PluginBase = &plugins.PluginBase{
Name: label,
SetupDescription: "Language - Default AI Vendor Output Language",
Name: i18n.T("language_label"),
SetupDescription: i18n.T("language_setup_description") + " " + i18n.T("optional_marker"),
EnvNamePrefix: plugins.BuildEnvVariablePrefix(label),
ConfigureCustom: ret.configure,
}
ret.DefaultLanguage = ret.AddSetupQuestionCustom("Output", false,
"Enter your default output language (for example: zh_CN)")
ret.DefaultLanguage = ret.AddSetupQuestionWithEnvName("Output", false,
i18n.T("language_output_question"))
return
}

View File

@@ -7,6 +7,7 @@ import (
"sort"
"strings"
"github.com/danielmiessler/fabric/internal/i18n"
debuglog "github.com/danielmiessler/fabric/internal/log"
"github.com/danielmiessler/fabric/internal/plugins"
"github.com/danielmiessler/fabric/internal/plugins/db/fsdb"
@@ -26,18 +27,18 @@ func NewPatternsLoader(patterns *fsdb.PatternsEntity) (ret *PatternsLoader) {
}
ret.PluginBase = &plugins.PluginBase{
Name: label,
SetupDescription: "Patterns - Downloads patterns [required]",
Name: i18n.T("patterns_loader_label"),
SetupDescription: i18n.T("patterns_setup_description") + " " + i18n.T("required_marker"),
EnvNamePrefix: plugins.BuildEnvVariablePrefix(label),
ConfigureCustom: ret.configure,
}
ret.DefaultGitRepoUrl = ret.AddSetupQuestionCustom("Git Repo Url", true,
"Enter the default Git repository URL for the patterns")
ret.DefaultGitRepoUrl = ret.AddSetupQuestionWithEnvName("Git Repo Url", true,
i18n.T("patterns_git_repo_url_question"))
ret.DefaultGitRepoUrl.Value = DefaultPatternsGitRepoUrl
ret.DefaultFolder = ret.AddSetupQuestionCustom("Git Repo Patterns Folder", true,
"Enter the default folder in the Git repository where patterns are stored")
ret.DefaultFolder = ret.AddSetupQuestionWithEnvName("Git Repo Patterns Folder", true,
i18n.T("patterns_git_repo_folder_question"))
ret.DefaultFolder.Value = DefaultPatternsGitRepoFolder
return
@@ -61,7 +62,7 @@ func (o *PatternsLoader) configure() (err error) {
// Use a consistent temp folder name regardless of the source path structure
tempDir, err := os.MkdirTemp("", "fabric-patterns-")
if err != nil {
return fmt.Errorf("failed to create temporary patterns folder: %w", err)
return fmt.Errorf(i18n.T("patterns_failed_create_temp_folder"), err)
}
o.tempPatternsFolder = tempDir
@@ -91,29 +92,30 @@ func (o *PatternsLoader) Setup() (err error) {
// PopulateDB downloads patterns from the internet and populates the patterns folder
func (o *PatternsLoader) PopulateDB() (err error) {
fmt.Printf("Downloading patterns and Populating %s...\n", o.Patterns.Dir)
fmt.Printf(i18n.T("patterns_downloading"), o.Patterns.Dir)
fmt.Println()
fmt.Println()
originalPath := o.DefaultFolder.Value
if err = o.gitCloneAndCopy(); err != nil {
return fmt.Errorf("failed to download patterns from git repository: %w", err)
return fmt.Errorf(i18n.T("patterns_failed_download_from_git"), err)
}
// If the path was migrated during gitCloneAndCopy, we need to save the updated configuration
if o.DefaultFolder.Value != originalPath {
fmt.Printf("💾 Saving updated configuration (path changed from '%s' to '%s')...\n", originalPath, o.DefaultFolder.Value)
fmt.Printf(i18n.T("patterns_saving_updated_configuration"), originalPath, o.DefaultFolder.Value)
// The configuration will be saved by the calling code after this returns successfully
}
if err = o.movePatterns(); err != nil {
return fmt.Errorf("failed to move patterns to config directory: %w", err)
return fmt.Errorf(i18n.T("patterns_failed_move_patterns"), err)
}
fmt.Printf("✅ Successfully downloaded and installed patterns to %s\n", o.Patterns.Dir)
fmt.Printf(i18n.T("patterns_download_success"), o.Patterns.Dir)
// Create the unique patterns file after patterns are successfully moved
if err = o.createUniquePatternsFile(); err != nil {
return fmt.Errorf("failed to create unique patterns file: %w", err)
return fmt.Errorf(i18n.T("patterns_failed_unique_file"), err)
}
return
@@ -128,7 +130,7 @@ func (o *PatternsLoader) PersistPatterns() (err error) {
return nil
}
// Return unexpected errors (e.g., permission issues)
return fmt.Errorf("failed to access patterns directory '%s': %w", o.Patterns.Dir, err)
return fmt.Errorf(i18n.T("patterns_failed_access_directory"), o.Patterns.Dir, err)
}
var currentPatterns []os.DirEntry
@@ -157,9 +159,9 @@ func (o *PatternsLoader) PersistPatterns() (err error) {
src := filepath.Join(o.Patterns.Dir, currentPattern.Name())
dst := filepath.Join(newPatternsFolder, currentPattern.Name())
if copyErr := copy.Copy(src, dst); copyErr != nil {
fmt.Printf("Warning: failed to preserve custom pattern '%s': %v\n", currentPattern.Name(), copyErr)
fmt.Printf(i18n.T("patterns_preserve_warning"), currentPattern.Name(), copyErr)
} else {
fmt.Printf("Preserved custom pattern: %s\n", currentPattern.Name())
fmt.Printf(i18n.T("patterns_preserved_custom_pattern"), currentPattern.Name())
}
}
}
@@ -196,13 +198,13 @@ func (o *PatternsLoader) movePatterns() (err error) {
}
if patternCount == 0 {
err = fmt.Errorf("no patterns were successfully copied to %s", o.Patterns.Dir)
err = fmt.Errorf(i18n.T("patterns_no_patterns_copied"), o.Patterns.Dir)
return
}
//create an empty file to indicate that the patterns have been updated if not exists
if _, err = os.Create(o.loadedFilePath); err != nil {
return fmt.Errorf("failed to create loaded marker file '%s': %w", o.loadedFilePath, err)
return fmt.Errorf(i18n.T("patterns_failed_loaded_marker"), o.loadedFilePath, err)
}
err = os.RemoveAll(patternsDir)
@@ -212,10 +214,10 @@ func (o *PatternsLoader) movePatterns() (err error) {
func (o *PatternsLoader) gitCloneAndCopy() (err error) {
// Create temp folder if it doesn't exist
if err = os.MkdirAll(filepath.Dir(o.tempPatternsFolder), os.ModePerm); err != nil {
return fmt.Errorf("failed to create temp directory: %w", err)
return fmt.Errorf(i18n.T("patterns_failed_create_temp_dir"), err)
}
fmt.Printf("Cloning repository %s (path: %s)...\n", o.DefaultGitRepoUrl.Value, o.DefaultFolder.Value)
fmt.Printf(i18n.T("patterns_cloning_repository"), o.DefaultGitRepoUrl.Value, o.DefaultFolder.Value)
// Try to fetch files with the current path
err = githelper.FetchFilesFromRepo(githelper.FetchOptions{
@@ -224,21 +226,21 @@ func (o *PatternsLoader) gitCloneAndCopy() (err error) {
DestDir: o.tempPatternsFolder,
})
if err != nil {
return fmt.Errorf("failed to download patterns from %s: %w", o.DefaultGitRepoUrl.Value, err)
return fmt.Errorf(i18n.T("patterns_failed_download_from_repo"), o.DefaultGitRepoUrl.Value, err)
}
// Check if patterns were downloaded
if patternCount, checkErr := o.countPatternsInDirectory(o.tempPatternsFolder); checkErr != nil {
return fmt.Errorf("failed to read temp patterns directory: %w", checkErr)
return fmt.Errorf(i18n.T("patterns_failed_read_temp_directory"), checkErr)
} else if patternCount == 0 {
// No patterns found with current path, try automatic migration
if migrationErr := o.tryPathMigration(); migrationErr != nil {
return fmt.Errorf("no patterns found in repository at path %s and migration failed: %w", o.DefaultFolder.Value, migrationErr)
return fmt.Errorf(i18n.T("patterns_no_patterns_migration_failed"), o.DefaultFolder.Value, migrationErr)
}
// Migration successful, try downloading again
return o.gitCloneAndCopy()
} else {
fmt.Printf("Downloaded %d patterns to temporary directory\n", patternCount)
fmt.Printf(i18n.T("patterns_downloaded_temp"), patternCount)
}
return nil
@@ -248,7 +250,7 @@ func (o *PatternsLoader) gitCloneAndCopy() (err error) {
func (o *PatternsLoader) tryPathMigration() (err error) {
// Check if current path is the old "patterns" path
if o.DefaultFolder.Value == "patterns" {
fmt.Println("🔄 Detected old pattern path 'patterns', trying migration to 'data/patterns'...")
fmt.Println(i18n.T("patterns_detected_old_path"))
// Try the new restructured path
newPath := "data/patterns"
@@ -256,7 +258,7 @@ func (o *PatternsLoader) tryPathMigration() (err error) {
// Clean up any existing test temp folder
if err := os.RemoveAll(testTempFolder); err != nil {
fmt.Printf("Warning: failed to remove test temporary folder '%s': %v\n", testTempFolder, err)
fmt.Printf(i18n.T("patterns_warning_remove_test_folder"), testTempFolder, err)
}
// Test if the new path works
@@ -269,7 +271,7 @@ func (o *PatternsLoader) tryPathMigration() (err error) {
if testErr == nil {
// Check if patterns exist in the new path
if patternCount, countErr := o.countPatternsInDirectory(testTempFolder); countErr == nil && patternCount > 0 {
fmt.Printf("✅ Found %d patterns at new path '%s', updating configuration...\n", patternCount, newPath)
fmt.Printf(i18n.T("patterns_found_new_path"), patternCount, newPath)
// Update the configuration
o.DefaultFolder.Value = newPath
@@ -278,7 +280,7 @@ func (o *PatternsLoader) tryPathMigration() (err error) {
if renameErr := os.Rename(testTempFolder, o.tempPatternsFolder); renameErr != nil {
// If rename fails, try copy
if copyErr := copy.Copy(testTempFolder, o.tempPatternsFolder); copyErr != nil {
return fmt.Errorf("failed to move test patterns to temp folder: %w", copyErr)
return fmt.Errorf(i18n.T("patterns_failed_move_test_patterns"), copyErr)
}
os.RemoveAll(testTempFolder)
}
@@ -291,7 +293,7 @@ func (o *PatternsLoader) tryPathMigration() (err error) {
os.RemoveAll(testTempFolder)
}
return fmt.Errorf("unable to find patterns at current path '%s' or migrate to new structure", o.DefaultFolder.Value)
return fmt.Errorf(i18n.T("patterns_unable_to_find_or_migrate"), o.DefaultFolder.Value)
}
// countPatternsInDirectory counts the number of pattern directories in a given directory
@@ -316,7 +318,7 @@ func (o *PatternsLoader) createUniquePatternsFile() (err error) {
// Read patterns from the main patterns directory
entries, err := os.ReadDir(o.Patterns.Dir)
if err != nil {
return fmt.Errorf("failed to read patterns directory: %w", err)
return fmt.Errorf(i18n.T("patterns_failed_read_directory"), err)
}
patternNamesMap := make(map[string]bool) // Use map to avoid duplicates
@@ -336,17 +338,17 @@ func (o *PatternsLoader) createUniquePatternsFile() (err error) {
patternNamesMap[entry.Name()] = true
}
}
debuglog.Log("📂 Also included patterns from custom directory: %s\n", o.Patterns.CustomPatternsDir)
debuglog.Log(i18n.T("patterns_debug_included_custom_directory"), o.Patterns.CustomPatternsDir)
} else {
debuglog.Log("Warning: Could not read custom patterns directory %s: %v\n", o.Patterns.CustomPatternsDir, customErr)
debuglog.Log(i18n.T("patterns_warning_custom_directory"), o.Patterns.CustomPatternsDir, customErr)
}
}
if len(patternNamesMap) == 0 {
if o.Patterns.CustomPatternsDir != "" {
return fmt.Errorf("no patterns found in directories %s and %s", o.Patterns.Dir, o.Patterns.CustomPatternsDir)
return fmt.Errorf(i18n.T("patterns_no_patterns_found_in_directories"), o.Patterns.Dir, o.Patterns.CustomPatternsDir)
}
return fmt.Errorf("no patterns found in directory %s", o.Patterns.Dir)
return fmt.Errorf(i18n.T("patterns_no_patterns_found_in_directory"), o.Patterns.Dir)
}
// Convert map to sorted slice
@@ -361,9 +363,9 @@ func (o *PatternsLoader) createUniquePatternsFile() (err error) {
// Join pattern names with newlines
content := strings.Join(patternNames, "\n") + "\n"
if err = os.WriteFile(o.Patterns.UniquePatternsFilePath, []byte(content), 0644); err != nil {
return fmt.Errorf("failed to write unique patterns file: %w", err)
return fmt.Errorf(i18n.T("patterns_failed_write_unique_file"), err)
}
fmt.Printf("📝 Created unique patterns file with %d patterns\n", len(patternNames))
fmt.Printf(i18n.T("patterns_unique_file_created"), len(patternNames))
return nil
}

View File

@@ -65,8 +65,8 @@ func NewYouTube() (ret *YouTube) {
ret = &YouTube{}
ret.PluginBase = &plugins.PluginBase{
Name: label,
SetupDescription: label + " - to grab video transcripts (via yt-dlp) and comments/metadata (via YouTube API)",
Name: i18n.T("youtube_label"),
SetupDescription: i18n.T("youtube_setup_description") + " " + i18n.T("optional_marker"),
EnvNamePrefix: plugins.BuildEnvVariablePrefix(label),
}

View File

@@ -5,14 +5,14 @@ schema = 3
version = "v0.121.6"
hash = "sha256-WhK5XwWOKB6sIxA5EAbEGqec3AGpx337a561gnRO3oQ="
[mod."cloud.google.com/go/auth"]
version = "v0.16.5"
hash = "sha256-E5t9E4PX/NcOnraWj9X9By5BNebhxlaIme+CKJuf750="
version = "v0.17.0"
hash = "sha256-AVNd+Ax9X5J053O6mXKDiOh75DEPXjS5WPmJFITKMrE="
[mod."cloud.google.com/go/auth/oauth2adapt"]
version = "v0.2.8"
hash = "sha256-GoXFqAbp1WO1tDj07PF5EyxDYvCBP0l0qwxY2oV2hfc="
[mod."cloud.google.com/go/compute/metadata"]
version = "v0.8.0"
hash = "sha256-8Pw77XVcDcScTWFNnKi4Ff8jF1f7PHquhErgH4FsSow="
version = "v0.9.0"
hash = "sha256-VFqQwLJKyH1zReR/XtygEHP5UkI01T9BHEL0hvXtauo="
[mod."dario.cat/mergo"]
version = "v1.0.2"
hash = "sha256-p6jdiHlLEfZES8vJnDywG4aVzIe16p0CU6iglglIweA="
@@ -44,53 +44,56 @@ schema = 3
version = "v0.1.4"
hash = "sha256-ZZ7U5X0gWOu8zcjZcWbcpzGOGdycwq0TjTFh/eZHjXk="
[mod."github.com/aws/aws-sdk-go-v2"]
version = "v1.39.0"
hash = "sha256-FouyW7EW29CPmWc+D8kzDcmxAvBY3elm9P3B0k2vFbI="
version = "v1.41.0"
hash = "sha256-cTFa0GPh/PU5mA1ZEd2n1OfY4MYJlRjiKMEt7p1jjCc="
[mod."github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream"]
version = "v1.7.1"
hash = "sha256-Oj9VQRt8ZYrBtDlDcgssa+PCfv8cmzWh2F0FfM1lrSY="
version = "v1.7.4"
hash = "sha256-ZY/Jn1p0IgDe8MONhp0RFHZmRgTBZZ5ddqXlNWEo7Ys="
[mod."github.com/aws/aws-sdk-go-v2/config"]
version = "v1.31.8"
hash = "sha256-67R/ddlBm0tYgR4E+8oEsKNZ78rCrZE3uJIgAgI7HSY="
version = "v1.32.6"
hash = "sha256-FKoxYfQdCL/3LbiVzRRWZvnoshmIPiUvEeSW71vscbg="
[mod."github.com/aws/aws-sdk-go-v2/credentials"]
version = "v1.18.12"
hash = "sha256-N4MQirXXYKPzbyDchDZwmmeP/acV5fqsdNgoWoNWfBs="
version = "v1.19.6"
hash = "sha256-Z8lkOvb+EbggC05jExwt8EH07v3W1bG2+gFAAYE/JSU="
[mod."github.com/aws/aws-sdk-go-v2/feature/ec2/imds"]
version = "v1.18.7"
hash = "sha256-bwPqR7ASZRT8a9KHKrtCKvfJHbpeXde6ugBq2BR/ERY="
version = "v1.18.16"
hash = "sha256-UcwhhFCPfs7oDe5KZQtjFQJwZZ9PccADm2S2kPxmL1I="
[mod."github.com/aws/aws-sdk-go-v2/internal/configsources"]
version = "v1.4.7"
hash = "sha256-84p6k/h3XnKzTBiDIWuG7txhCHNl93f4iSTLMhzIuL8="
version = "v1.4.16"
hash = "sha256-V8KSxmnku2liBxa0fWI7zK0vTbdsyk1gxlYgsxp0t+g="
[mod."github.com/aws/aws-sdk-go-v2/internal/endpoints/v2"]
version = "v2.7.7"
hash = "sha256-V5BpdCqY4e2xvjb40sl3t/LWdPFU6ZAjddaxwTYONB8="
version = "v2.7.16"
hash = "sha256-2FIb59SM2YKzwpXGfbRwFyPug/u5LHJHu4lu+a6WG8g="
[mod."github.com/aws/aws-sdk-go-v2/internal/ini"]
version = "v1.8.3"
hash = "sha256-naKBU7Pk57EsD/5skrh0ObRR0YhSaNRUzgqUC7CNFes="
version = "v1.8.4"
hash = "sha256-okyFQwcEqbwKwkGK5xp/VYE0fGg9cqG6AuLijIuf5xg="
[mod."github.com/aws/aws-sdk-go-v2/service/bedrock"]
version = "v1.46.1"
hash = "sha256-kU36WBlNRhP7aHx3SrW2eoKJAJ50HE9oVpmpkMTC4yo="
version = "v1.53.0"
hash = "sha256-DcGcNezcQKUrjpVIrWqwkIGa3phz4Uem70Cs4zuYpyU="
[mod."github.com/aws/aws-sdk-go-v2/service/bedrockruntime"]
version = "v1.40.1"
hash = "sha256-bDg3wG8UH4a1eLrDirRGK+v0YyZ0Tb16cpR/VluYwPw="
version = "v1.47.1"
hash = "sha256-pbIEHn7I6t9W+AkBtZQHHSb4YxVGeAZq7lTik5lys9g="
[mod."github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding"]
version = "v1.13.1"
hash = "sha256-x4xMCJ0RiLZ3u1iGnQiKz3lUnu6LWtfEy3oHsbwT9Wk="
version = "v1.13.4"
hash = "sha256-Rm6czqOnOULP080D97WQQSqkBhmN6ei1qZaTa51SRj8="
[mod."github.com/aws/aws-sdk-go-v2/service/internal/presigned-url"]
version = "v1.13.7"
hash = "sha256-aKOabaxLljpINstNlQXbi1RklL3y5OCjgNEF0X3na0I="
version = "v1.13.16"
hash = "sha256-ACVw9W+nGqp0K6Rq9yKhtrC3Yr/oLpRbz0kJbNDwvUM="
[mod."github.com/aws/aws-sdk-go-v2/service/signin"]
version = "v1.0.4"
hash = "sha256-2LEq//DhBh+waRkE6vmt86pjKQN/dCbn/qrhAdQhrVg="
[mod."github.com/aws/aws-sdk-go-v2/service/sso"]
version = "v1.29.3"
hash = "sha256-/oQiOx/QHekEDcAw9aQnKsGs+/skH51l5+brgM2zuHk="
version = "v1.30.8"
hash = "sha256-bYm2waTtLxzg0f82gBitJpoC9Q2jbdqoaNYbd88z3tA="
[mod."github.com/aws/aws-sdk-go-v2/service/ssooidc"]
version = "v1.34.4"
hash = "sha256-SnuiJBd2YZF4a5rVJJ5gZs6LWcz4sNtU+dMFkjk7Ir4="
version = "v1.35.12"
hash = "sha256-m2hboee3VLOrs6zZqMfWO9Ojpc2s4Ei1VCA/m9tf4BU="
[mod."github.com/aws/aws-sdk-go-v2/service/sts"]
version = "v1.38.4"
hash = "sha256-6r35v4bXSki/Vnsj7HG0uNmNxTVAi+6/p2YItxW1Su8="
version = "v1.41.5"
hash = "sha256-/dF+PVj7+JIm+UxsjXTFV8Q4g2hNwoURbsHHgsmZuhk="
[mod."github.com/aws/smithy-go"]
version = "v1.23.0"
hash = "sha256-75k+gn1lbQB1TzjV3HeEJeuyPPfX2huKhONXo98SUKg="
version = "v1.24.0"
hash = "sha256-ZPFhf2Yv3BQpUn3cN4wSnoO7uBki8oCisZxL6F09nnE="
[mod."github.com/bytedance/gopkg"]
version = "v0.1.3"
hash = "sha256-GyUbPfn41y/mgj0cQOa4tm+aj70C2K50VBZxZc/tcZE="
@@ -137,8 +140,8 @@ schema = 3
version = "v5.6.2"
hash = "sha256-VgbxcLkHjiSyRIfKS7E9Sn8OynCrMGUDkwFz6K2TVL4="
[mod."github.com/go-git/go-git/v5"]
version = "v5.16.2"
hash = "sha256-KdOf4KwJAJUIB/EcQH6wc7jpcABCISWur3vOTpAo+/c="
version = "v5.16.4"
hash = "sha256-y8pzypv2vAhaDRQbL1dhfvD+2s9jPcqg/EALko89gkI="
[mod."github.com/go-logr/logr"]
version = "v1.4.3"
hash = "sha256-Nnp/dEVNMxLp3RSPDHZzGbI8BkSNuZMX0I0cjWKXXLA="
@@ -188,8 +191,8 @@ schema = 3
version = "v0.0.0-20230515143342-73569d674e1c"
hash = "sha256-4lm9KZfR2XnfZU9KTG+4jqLYZqbfL74AMO4y3dKpIbg="
[mod."github.com/go-shiori/go-readability"]
version = "v0.0.0-20250217085726-9f5bf5ca7612"
hash = "sha256-yleBb+OmxLbQ0PT4yV2PNBAAE6UFxSRGGpylY8SrSqw="
version = "v0.0.0-20251205110129-5db1dc9836f0"
hash = "sha256-oDAW6bUc6W7XeJpw/xeMb8fwD7BZcpN3o/YmJTWwdfs="
[mod."github.com/goccy/go-json"]
version = "v0.10.5"
hash = "sha256-/EtlGihP0/7oInzMC5E0InZ4b5Ad3s4xOpqotloi3xw="
@@ -218,8 +221,8 @@ schema = 3
version = "v1.6.0"
hash = "sha256-VWl9sqUzdOuhW0KzQlv0gwwUQClYkmZwSydHG2sALYw="
[mod."github.com/googleapis/enterprise-certificate-proxy"]
version = "v0.3.6"
hash = "sha256-hPMF0s+X4/ul98GvVuw/ZNOupEXhIDB1yvWymZWYEbU="
version = "v0.3.7"
hash = "sha256-/HrrJAEQs9Ot5hyRY0cdJmg0uxzjuC7IbpntBhTVt8Y="
[mod."github.com/googleapis/gax-go/v2"]
version = "v2.15.0"
hash = "sha256-toGf0MpDZOwR4/naEIpcfi2aDKU0/u/9BT+lX2CmWhM="
@@ -260,8 +263,8 @@ schema = 3
version = "v0.0.20"
hash = "sha256-qhw9hWtU5wnyFyuMbKx+7RB8ckQaFQ8D+8GKPkN3HHQ="
[mod."github.com/mattn/go-sqlite3"]
version = "v1.14.28"
hash = "sha256-mskU1xki6J1Fj6ItNgY/XNetB4Ta4jufEr4+JvTd7qs="
version = "v1.14.32"
hash = "sha256-su0SoXnt5pE78t5VXFXQoH2dtP0ohWdyj3TNSZQyWE0="
[mod."github.com/modern-go/concurrent"]
version = "v0.0.0-20180306012644-bacd9c7ef1dd"
hash = "sha256-OTySieAgPWR4oJnlohaFTeK1tRaVp/b0d1rYY8xKMzo="
@@ -272,8 +275,8 @@ schema = 3
version = "v2.6.0"
hash = "sha256-UrSECFbpCIg5avJ+f3LkJy/ncZFHa4q8sDqDIQ3YZJM="
[mod."github.com/ollama/ollama"]
version = "v0.11.7"
hash = "sha256-3Wn1JWmil0aQQ2I/r398HbnUsi8ADoroqNyPziuxn/c="
version = "v0.13.5"
hash = "sha256-gr8dMdGfyXhEgO22MOmtIZEXlBrOsEecOhi/AmU5D+0="
[mod."github.com/openai/openai-go"]
version = "v1.12.0"
hash = "sha256-JHLlKvDwERPf728GUXBsKU58ODgCxcxEe9TKJTGAG1w="
@@ -302,23 +305,23 @@ schema = 3
version = "v0.57.1"
hash = "sha256-MdXc0GRVp3YuN9XFoGFOjgIcIMp7yoLqwfEikZp1i4w="
[mod."github.com/samber/lo"]
version = "v1.50.0"
hash = "sha256-KDFks82BKu39sGt0f972IyOkohV2U0r1YvsnlNLdugY="
version = "v1.52.0"
hash = "sha256-xgMsPJv3rydHH10NZU8wz/DhK2VbbR8ymivOg1ChTp0="
[mod."github.com/sergi/go-diff"]
version = "v1.4.0"
hash = "sha256-rs9NKpv/qcQEMRg7CmxGdP4HGuFdBxlpWf9LbA9wS4k="
[mod."github.com/sgaunet/perplexity-go/v2"]
version = "v2.8.0"
hash = "sha256-w1S14Jf4/6LFODREmmiJvPtkZh4Sor81Rr1PqC5pIak="
version = "v2.14.0"
hash = "sha256-yyuvp7vB4OSE9OfIsqj0TavR+synNlLQKZVT872GZnM="
[mod."github.com/skeema/knownhosts"]
version = "v1.3.1"
hash = "sha256-kjqQDzuncQNTuOYegqVZExwuOt/Z73m2ST7NZFEKixI="
[mod."github.com/spf13/cobra"]
version = "v1.9.1"
hash = "sha256-dzEqquABE3UqZmJuj99244QjvfojS8cFlsPr/MXQGj0="
version = "v1.10.2"
hash = "sha256-nbRCTFiDCC2jKK7AHi79n7urYCMP5yDZnWtNVJrDi+k="
[mod."github.com/spf13/pflag"]
version = "v1.0.6"
hash = "sha256-NjrK0FZPIfO/p2xtL1J7fOBQNTZAPZOC6Cb4aMMvhxI="
version = "v1.0.9"
hash = "sha256-YAjyYpq5BXCosVJtvYLWFG1t4gma2ylzc7ILLoj/hD8="
[mod."github.com/stretchr/testify"]
version = "v1.11.1"
hash = "sha256-sWfjkuKJyDllDEtnM8sb/pdLzPQmUYWYtmeWz/5suUc="
@@ -353,20 +356,20 @@ schema = 3
version = "v0.3.3"
hash = "sha256-l3pGB6IdzcPA/HLk93sSN6NM2pKPy+bVOoacR5RC2+c="
[mod."go.opentelemetry.io/auto/sdk"]
version = "v1.1.0"
hash = "sha256-cA9qCCu8P1NSJRxgmpfkfa5rKyn9X+Y/9FSmSd5xjyo="
version = "v1.2.1"
hash = "sha256-73bFYhnxNf4SfeQ52ebnwOWywdQbqc9lWawCcSgofvE="
[mod."go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"]
version = "v0.61.0"
hash = "sha256-4pfXD7ErXhexSynXiEEQSAkWoPwHd7PEDE3M1Zi5gLM="
[mod."go.opentelemetry.io/otel"]
version = "v1.36.0"
hash = "sha256-j8wojdCtKal3LKojanHA8KXXQ0FkbWONpO8tUxpJDko="
version = "v1.38.0"
hash = "sha256-OU4EVEGwbopbYZLDBfAelR/4yjzfV+UVp4UFt3UvkOE="
[mod."go.opentelemetry.io/otel/metric"]
version = "v1.36.0"
hash = "sha256-z6Uqi4HhUljWIYd58svKK5MqcGbpcac+/M8JeTrUtJ8="
version = "v1.38.0"
hash = "sha256-5W6Yd9nl/eyvL29e9hSfosISpxfSQcBAwkqI4htHWCg="
[mod."go.opentelemetry.io/otel/trace"]
version = "v1.36.0"
hash = "sha256-owWD9x1lp8aIJqYt058BXPUsIMHdk3RI0escso0BxwA="
version = "v1.38.0"
hash = "sha256-gNXUPmsPAw6JVH3YT/xwmRpn5QoDxyzc9kLe/5ldo0o="
[mod."go.uber.org/mock"]
version = "v0.6.0"
hash = "sha256-m11cxIbrvOowa6xj11AztzfFk86DwR6SNO1lStcKzvo="
@@ -389,8 +392,8 @@ schema = 3
version = "v0.48.0"
hash = "sha256-oZpddsiJwWCH3Aipa+XXpy7G/xHY5fEagUSok7T0bXE="
[mod."golang.org/x/oauth2"]
version = "v0.30.0"
hash = "sha256-btD7BUtQpOswusZY5qIU90uDo38buVrQ0tmmQ8qNHDg="
version = "v0.34.0"
hash = "sha256-5eqpGGxJ7FJsPmfRek6roeGmkWHBMJaWYXyz8gXJsS4="
[mod."golang.org/x/sync"]
version = "v0.19.0"
hash = "sha256-RbRZ+sKZUurOczGhhzOoY/sojTlta3H9XjL4PXX/cno="
@@ -404,20 +407,17 @@ schema = 3
version = "v0.40.0"
hash = "sha256-ksmhTnH9btXKiRbbE0KGh02nbeNqNBQKcfwvx9dE7t0="
[mod."google.golang.org/api"]
version = "v0.247.0"
hash = "sha256-UzTtydHmNqh1OXbxcN5qNKQxb5dV6h2Mo6DH4P219Ec="
version = "v0.258.0"
hash = "sha256-hxwJz4Vzh87Bc49QCndKrO+34wfzF1ORGMeF5kmk22Q="
[mod."google.golang.org/genai"]
version = "v1.17.0"
hash = "sha256-Iw09DYpWuGR8E++dsFCBs702oKJPZLBEEGv0g4a4AhA="
[mod."google.golang.org/genproto/googleapis/api"]
version = "v0.0.0-20250818200422-3122310a409c"
hash = "sha256-y94fcU6UDqtCTfcGKyFQnZU6aLdm1WhDdMWCjubaFZw="
version = "v1.40.0"
hash = "sha256-J/jDKYz2gU01AvwmFTnXUTv5HwnZbZ+nem+g0B6PdEg="
[mod."google.golang.org/genproto/googleapis/rpc"]
version = "v0.0.0-20250818200422-3122310a409c"
hash = "sha256-hbGMdlN/vwPIOJhYv6CAEnpQqTXbQ1GlXabiQUOv3sc="
version = "v0.0.0-20251213004720-97cd9d5aeac2"
hash = "sha256-I3ZNpNjKKvTq4DVNw3wLKrCuORabZ0oYj0KKhOMI/MA="
[mod."google.golang.org/grpc"]
version = "v1.74.2"
hash = "sha256-tvYMdfu/ZQZRPZNmnQI4CZpg46CM8+mD49hw0gFheGs="
version = "v1.78.0"
hash = "sha256-oKsu3+Eae5tpFOZ9K2ZzYh1FgdYdEnEIB1C+UIxSD+E="
[mod."google.golang.org/protobuf"]
version = "v1.36.11"
hash = "sha256-7W+6jntfI/awWL3JP6yQedxqP5S9o3XvPgJ2XxxsIeE="

View File

@@ -1 +1 @@
"1.4.351"
"1.4.360"