This commit is contained in:
lovebird 2025-03-19 23:18:21 +01:00
parent 48127f4534
commit c39bfa3b7b
27 changed files with 1813 additions and 0 deletions

5
public/js/cdn.min.js vendored Normal file

File diff suppressed because one or more lines are too long

2
public/js/flowbite.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,113 @@
---
// Import required components and interfaces
import { IHowto } from "@/model/howto";
import { Gallery } from "@polymech/astro-base";
import { Img } from 'imagetools/components';
import { i18n as Translate } from "@polymech/astro-base";
// Define props interface with Astro typing
interface Props {
howto: IHowto;
}
// Get the howto data from props
const { howto } = Astro.props;
import BaseLayout from "@/layouts/BaseLayout.astro";
import Wrapper from "@/components/containers/Wrapper.astro";
---
<BaseLayout class="markdown-content">
<Wrapper>
<div class="howto-container max-w-4xl mx-auto p-4">
<!-- Header section -->
<header class="mb-8">
<h1 class="text-3xl font-bold mb-2">
<Translate>{howto.title}</Translate>
</h1>
<!-- Cover image -->
<div class="mb-4">
<img
src={howto.cover_image.downloadUrl || ""}
alt={"none"}
attributes={{
img: { class: "w-full h-64 object-cover rounded-lg" }
}}
/>
</div>
<!-- Metadata -->
<div class="flex flex-wrap gap-4 mb-4 text-sm text-gray-600">
<div>
<span class="font-semibold">Difficulty:</span>
<Translate>{howto.difficulty_level}</Translate>
</div>
<div>
<span class="font-semibold">Time:</span>
<Translate>{howto.time}</Translate>
</div>
<div>
<span class="font-semibold">Views:</span> {howto.total_views}
</div>
<div>
<span class="font-semibold">Created by:</span> {howto._createdBy}
</div>
<div>
<span class="font-semibold">Country:</span> {howto.creatorCountry}
</div>
</div>
<!-- Description -->
<div class="bg-gray-50 p-4 rounded-lg">
<p class="whitespace-pre-line">
<Translate>{howto.description}</Translate>
</p>
</div>
</header>
<!-- Steps -->
<div class="steps-container space-y-12">
{howto.steps.map((step, index) => (
<div class="step-item" id={`step-${index + 1}`}>
<h2 class="text-2xl font-semibold mb-4">
<span class="inline-block bg-blue-500 text-white w-8 h-8 rounded-full text-center leading-8 mr-2">
{index + 1}
</span>
<Translate>{step.title}</Translate>
</h2>
<!-- Step content -->
<div class="step-content mb-6">
<p class="whitespace-pre-line mb-4">
<Translate>{step.text}</Translate>
</p>
</div>
{step.images && step.images.length > 0 && (
<div class="step-images">
{step.images.map(img => (
<img src={img.downloadUrl || ""} alt="alt" />
))
}
</div>
)}
</div>
))}
</div>
<!-- Footer information -->
<footer class="mt-12 pt-6 border-t border-gray-200">
<div class="flex justify-between items-center">
<div>
<span class="text-sm text-gray-500">
<Translate>Created</Translate>: {new Date(howto._created).toLocaleDateString()}
</span>
</div>
<div class="text-sm text-gray-500">
<span>
<Translate>Found useful by</Translate>: {howto.votedUsefulBy.length} <Translate>people</Translate>
</span>
</div>
</div>
</footer>
</div>
</Wrapper>
</BaseLayout>

View File

@ -0,0 +1,187 @@
---
const pricingPlans = [
{
name: "Individual",
monthlyPrice: "149",
annualPrice: "100",
description: "For freelancers and independent designers",
features: [
"Unlimited access to all design assets",
"Good plan for a freelancer and solo designer",
"Support for basic web development",
"Work on up to 3 product design projects",
"Only one user per account",
"Commercial use",
],
unavailableFeatures: [
"Licensed for teams, startups, agencies and corporates",
"Several users per account",
"Commercial use",
],
},
{
name: "Startup",
monthlyPrice: "249",
annualPrice: "300",
description: " Best choice for any size team or agency",
features: [
"Everything included in the Individual plan",
"Licensed for teams, startups, agencies and corporates",
"Several users per account",
"Commercial use",
],
unavailableFeatures: [
"Missing advanced 3D design tools",
"Without premium system collaboration",
"Standard support",
],
},
{
name: "Company",
monthlyPrice: "50",
annualPrice: "600",
description: "For businesses aiming to lead in innovation.",
features: [
"Everything included in the Individual plan",
"Everything included in the Startup plan",
"Unlimited licensed for teams, startups, agencies and corporates",
"Unlimited users per account",
"Commercial use",
],
unavailableFeatures: [],
},
];
---
<section x-data="{annual: false}">
<div
class="flex flex-col gap-12 h-full justify-between p-4 text-center pt-20">
<div class="max-w-xl mx-auto">
<h1
class="text-lg text-neutral-600 font-mono tracking-tight text-balance">
Become a member today and unlock unlimited access.
</h1>
<p class="text-sm text-balance text-neutral-500">
Enroll in our membership program today at a discounted rate and enjoy
full access to our incredible lineup of products.
</p>
<div class="max-w-sm mx-auto">
<div
class="overflow-hidden inline-flex mt-6 z-0 h-14 rounded-lg p-0.5 w-full bg-white">
<button
class="text-xs text-black w-full block font-medium px-8 py-2 transition rounded-lg border border-transparent"
@click="annual = false"
:class="annual == false ? 'bg-neutral-100 border text-black ' : ''"
type="button"
>Monthly</button
>
<button
class="text-xs text-black w-full block font-medium px-8 py-2 transition rounded-lg border border-transparent"
@click="annual = true"
:class="annual == true ? 'bg-neutral-100 border text-black' : ''"
type="button"
>Annual ( save 25% )</button
>
</div>
</div>
</div>
</div>
<div class="grid lg:grid-cols-3 gap-2 py-2">
{
pricingPlans.map((plan) => (
<>
<div class="flex flex-col h-full bg-white p-4 rounded-xl">
<div class=" h-full flex flex-col ">
<div>
<div>
<div class="flex justify-between items-center">
<h3
id="tier-essential"
class="text-lg text-neutral-600 font-mono tracking-tight uppercase">
{plan.name}
</h3>
<p class="flex items-baseline gap-x-1 text-lg text-neutral-600 font-mono tracking-tight">
<span>
<span x-show="!annual">${plan.monthlyPrice}</span>
<span x-show="annual">${plan.annualPrice}</span>
</span>
<span class="text-xs">
/m
<span
x-show="annual"
style="display: none;">
(billed annually)
</span>
</span>
</p>
</div>
<p class="mt-4 text-sm text-neutral-500">
{plan.description}
</p>
</div>
<div class="mt-8">
<button
type="button"
title="link to your page"
aria-label="your label"
class="relative group overflow-hidden pl-4 font-mono h-14 flex space-x-6 items-center bg-orange-500 hover:bg-black duration-300 rounded-xl w-full justify-between">
<span class="relative uppercase text-xs text-white">
Add to cart
</span>
<div
aria-hidden="true"
class="w-12 text-white transition duration-300 -translate-y-7 group-hover:translate-y-7">
<div class="h-14 flex">
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="size-6 m-auto fill-white">
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M17.25 8.25 21 12m0 0-3.75 3.75M21 12H3"
/>
</svg>
</div>
<div class="h-14 flex">
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="size-6 m-auto fill-white">
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M17.25 8.25 21 12m0 0-3.75 3.75M21 12H3"
/>
</svg>
</div>
</div>
</button>
</div>
</div>
<ul class="mt-6 text-xs space-y-1 font-mono uppercase text-neutral-500">
{plan.features.map((feature) => (
<li class="inline-flex items-start gap-3 ">
<span>+</span>
{feature}
</li>
))}
{plan.unavailableFeatures.map((feature) => (
<li class="inline-flex items-start gap-3 opacity-60">
<span></span> {feature}
</li>
))}
</ul>
</div>
</div>
</>
))
}
</div>
</section>

9
src/config/cli.ts Normal file
View File

@ -0,0 +1,9 @@
import cli from 'yargs'
import { hideBin } from 'yargs/helpers'
import { } from './network.js'
const argv = cli(hideBin(process.argv)).parse()
export const options = () => {
console.log('Options: ', argv)
}

88
src/config/config.json Normal file
View File

@ -0,0 +1,88 @@
{
"site": {
"title": "Polymech",
"base_url": "https://polymech.io/",
"description" : "",
"base_path": "/",
"trailing_slash": false,
"favicon": "/images/favicon.png",
"logo": "/images/logo.png",
"logo_darkmode": "/images/logo-darkmode.png",
"logo_width": "150",
"logo_height": "33",
"logo_text": "Polymech Logo",
"image": {
"default": "/images/default-image.png",
"error": "/images/error-image.png",
"alt": "Astrofront",
"src": "https://assets.osr-plastic.org/machines//assets/newsletter/common/products/extruders/overview-3.jpg"
}
},
"footer_left": [
{
"href": "/infopages/privacy",
"text": "Privacy"
},
{
"href": "/infopages/contact",
"text": "Contact"
} ,
{
"href": "/newsletter/newsletter_2024_09_en-hugo-release.html",
"text": "Newsletter"
}
],
"footer_right": [
],
"settings": {
"search": true,
"account": true,
"sticky_header": true,
"theme_switcher": true,
"default_theme": "system"
},
"params": {
"contact_form_action": "#",
"copyright": "Designed And Developed by [Themefisher](https://themefisher.com/)"
},
"navigation_button": {
"enable": true,
"label": "Get Started",
"link": "https://github.com/themefisher/astrofront"
},
"ecommerce": {
"brand": "Polymech",
"currencySymbol": "",
"currencyCode": "EUR"
},
"metadata": {
"country": "Spain",
"city": "Barcelona",
"author": "Polymech",
"author_bio": "I am in, if its true",
"author_url": "https://polymech.io/",
"image": "/images/og-image.png",
"description": "Polymech is a plastic prototyping company that offers product design services.",
"keywords": "Plastic, Prototyping, Product Design, Opensource"
},
"shopify": {
"currencySymbol": "",
"currencyCode": "EUR",
"collections": {
"hero_slider": "hidden-homepage-carousel",
"featured_products": "featured-products"
}
},
"pages":{
"home":{
"hero": "https://assets.osr-plastic.org/machines//assets/newsletter/common/products/extruders/overview-3.jpg",
"blog":{
"store": "resources"
}
}
},
"tracking": {
"googleAnalytics": "G-RW6Q6EG3J0"
}
}

170
src/config/config.ts Normal file
View File

@ -0,0 +1,170 @@
import * as path from 'path'
import { IMAGE_PRESET, E_BROADBAND_SPEED } from "./network.js"
import { resolve, template } from '@polymech/commons'
import { sync as read } from '@polymech/fs/read'
import { sanitizeUri } from 'micromark-util-sanitize-uri'
export const OSR_ROOT = () => path.resolve(resolve("${OSR_ROOT}"))
export const LOGGING_NAMESPACE = 'polymech-site'
export const TRANSLATE_CONTENT = true
export const LANGUAGES = ['en', 'ar', 'de', 'ja', 'es', 'zh', 'fr']
export const LANGUAGES_PROD = ['en', 'es', 'ar', 'de', 'ja', 'zh', 'fr', 'nl', 'it', 'pt']
export const isRTL = (lang) => lang === 'ar'
// i18n constants
export const I18N_STORE = (root, lang) => `${root}/i18n-store/store-${lang}.json`
export const I18N_SOURCE_LANGUAGE = 'en'
export const I18N_CACHE = true
export const I18N_ASSET_PATH = "${SRC_DIR}/${SRC_NAME}-${DST_LANG}${SRC_EXT}"
// Products
export const PRODUCT_ROOT = () => path.resolve(resolve("${OSR_ROOT}/products"))
export const PRODUCT_BRANCHES = read(path.join(PRODUCT_ROOT(), 'config/machines.json'), 'json')
export const PRODUCT_GLOB = '**/config.json'
// Product compiler
export const PRODUCT_CONFIG = (product) =>
path.resolve(resolve(`${PRODUCT_ROOT()}/${product}/config.json`, false,
{
product
}))
export const PRODUCT_DIR = (product) => path.resolve(resolve(`${PRODUCT_ROOT()}/${product}`))
export const PRODUCT_HUGO_TEMPLATE = './osr/hugo/root.html'
export const PRODUCTS_TARGET_SRC = './src/content/en/retail'
export const PRODUCTS_TARGET = (lang) => `./content/${lang}/products`
// Product assets
export const ASSETS_LOCAL = false
export const ASSETS_GLOB = '*.+(JPG|jpg|jpeg|png|PNG|gif)'
// OSRL - Language
export const IS_DEV = true
export const OSRL_ENV = 'astro-release'
export const OSRL_ENV_DEV = 'astro-debug'
export const OSRL_ENVIRONMENT = IS_DEV ? OSRL_ENV_DEV : OSRL_ENV
export const OSRL_MODULE_NAME = 'polymech.io'
export const OSRL_PRODUCT_PROFILE = './src/config/profile.json'
export const OSRL_LANG_FLAVOR = 'osr'
// Products
export const ENABLED_PRODUCTS = "${OSR_ROOT}/products/config/machines.json"
export const PRODUCT_SPECS = (rel) => `${PRODUCT_ROOT()}/${rel}/specs.xlsx`
// Tasks
export const TASK_CONFIG_LOG_DIRECTORY = './config/'
// Task: compile:content
export const TASK_COMPILE_CONTENT = true
export const TASK_COMPILE_CONTENT_CACHE = false
// Task - Logging
export const TASK_LOG_DIRECTORY = './logs/'
// Task - Retail Config
export const REGISTER_PRODUCT_TASKS = true
export const RETAIL_PRODUCT_BRANCH = 'site'
export const PROJECTS_BRANCH = 'projects'
export const RETAIL_COMPILE_CACHE = false
export const RETAIL_MEDIA_CACHE = true
export const RETAIL_LOG_LEVEL_I18N_PRODUCT_ASSETS = 'info'
export const ConvertProductMedia = true
export const TranslateProductAssets = false
export const PopulateProductDefaults = true
// CAD
export const CAD_MAIN_MATCH = (product) => `${product}/cad*/*Global*.+(SLDASM)`
export const CAD_CAM_MAIN_MATCH = (product) => `${product}/cad*/*-CNC*.+(SLDASM)`
export const CAD_CACHE = true
export const CAD_EXPORT_CONFIGURATIONS = false
export const CAD_EXPORT_SUB_COMPONENTS = true
export const CAD_MODEL_FILE_PATH = (SOURCE, CONFIGURATION = '') =>
SOURCE.replace('.json', `${CONFIGURATION ? '-' + CONFIGURATION : ''}.tree.json`)
export const CAD_DEFAULT_CONFIGURATION = 'Default'
export const CAD_RENDERER = 'solidworks'
export const CAD_RENDERER_VIEW = 'Render'
export const CAD_RENDERER_QUALITY = 1
export const CAD_EXTENSIONS = ['.STEP', '.html']
export const CAD_MODEL_EXT = '.tree.json'
export const CAD_URL = (file: string, variables: Record<string, string>) =>
sanitizeUri(template("${OSR_MACHINES_ASSETS_URL}/${file}", { file, ...variables }))
export const ASSET_URL = (file: string, variables: Record<string, string>) =>
sanitizeUri(template("${OSR_MACHINES_ASSETS_URL}/products/${product_rel_min}/${file}", { file, ...variables }))
export const ITEM_ASSET_URL = (variables: Record<string, string>) =>
template("${OSR_MACHINES_ASSETS_URL}/${ITEM_REL}/${assetPath}/${filePath}", variables)
//back compat - osr-cad
export const parseBoolean = (value: string): boolean => {
return value === '1' || value.toLowerCase() === 'true';
}
/////////////////////////////////////////////
//
// Rendering
export const SHOW_DESCRIPTION = false
export const SHOW_LICENSE = true
export const SHOW_RENDERINGS = true
export const SHOW_TABS = false
export const SHOW_GALLERY = true
export const SHOW_FILES = true
export const SHOW_SPECS = true
export const SHOW_CHECKOUT = true
export const SHOW_CONTACT = true
export const SHOW_3D_PREVIEW = true
export const SHOW_RESOURCES = true
export const SHOW_DEBUG = false
export const SHOW_SAMPLES = true
export const SHOW_README = false
export const SHOW_RELATED = true
/////////////////////////////////////////////
//
// Plugins
// RSS
export const RSS_CONFIG =
{
title: 'Polymech RSS Feed',
description: '',
}
/////////////////////////////////////////////
//
// Defaults
export const DEFAULT_IMAGE_URL = 'https://picsum.photos/640/640'
export const default_image = () => {
return {
alt: 'none',
src: DEFAULT_IMAGE_URL
}
}
export const DEFAULT_LICENSE = `CERN Open Source Hardware License`
export const DEFAULT_CONTACT = `sales@plastic-hub.com`
/////////////////////////////////////////////
//
// Optimization
export const O_IMAGE = IMAGE_PRESET[E_BROADBAND_SPEED.MEDIUM]
export const IMAGE_SETTINGS =
{
GALLERY: {
SHOW_TITLE: true,
SHOW_DESCRIPTION: false,
SIZES_THUMB: O_IMAGE.sizes_thumbs,
SIZES_LARGE: O_IMAGE.sizes_large,
SIZES_REGULAR: O_IMAGE.sizes_medium
},
LIGHTBOX: {
SHOW_TITLE: true,
SHOW_DESCRIPTION: true,
SIZES_THUMB: O_IMAGE.sizes_thumbs,
SIZES_LARGE: O_IMAGE.sizes_large,
SIZES_REGULAR: O_IMAGE.sizes_medium
}
}

41
src/config/navigation.ts Normal file
View File

@ -0,0 +1,41 @@
import { translate } from '../base/i18n.js'
import { I18N_SOURCE_LANGUAGE } from 'config/config.js'
import config from "./config.json" with { type: "json" }
import pMap from 'p-map'
export const items = async (opts: { locale: string }) => {
const _T = async (text: string) => await translate(text, I18N_SOURCE_LANGUAGE, opts.locale)
return [
{
"href": `/${opts.locale}`,
"title": _T("Home"),
"ariaLabel": "Home",
"class": "hover:text-orange-600"
},
{
"href": `/${opts.locale}/infopages/resources`,
"title": _T("Resources"),
"ariaLabel": "Resources",
"class": "hover:text-orange-600"
}
]
}
const isAbsoluteUrl = (url: string): boolean => /^[a-zA-Z]+:/.test(url);
const createFooterLinks = async (items: any[], locale: string) => {
const _T = async (text: string) => await translate(text, I18N_SOURCE_LANGUAGE, locale);
return await pMap(items, async (item) => {
const translatedText = await _T(item.text); // Single translation call
return {
"href": isAbsoluteUrl(item.href) ? item.href : `/${locale}${item.href}`,
"title": translatedText, // Use cached translation
"ariaLabel": translatedText, // Use cached translation
"class": "hover:text-orange-600"
};
});
};
export const footer_left = (locale: string) => createFooterLinks(config.footer_left, locale);
export const footer_right = (locale: string) => createFooterLinks(config.footer_right, locale);

49
src/config/network.ts Normal file
View File

@ -0,0 +1,49 @@
import { z } from "zod"
/////////////////////////////////////////////
//
// Optimizations
// Image optimization (imagetools breakpoints & min widths)
export enum E_BROADBAND_SPEED {
SLOW = "slow",
MEDIUM = "medium",
FAST = "fast",
}
const imageConfigSchema = z.object({
sizes_medium: z.string(),
sizes_thumbs: z.string(),
sizes_large: z.string(),
})
const imagesSchema = z.object({
[E_BROADBAND_SPEED.SLOW]: imageConfigSchema,
[E_BROADBAND_SPEED.MEDIUM]: imageConfigSchema,
[E_BROADBAND_SPEED.FAST]: imageConfigSchema,
});
type Images = z.infer<typeof imagesSchema>;
export const IMAGE_PRESET: Images =
{
[E_BROADBAND_SPEED.SLOW]: {
// For 2g connections: smaller image widths help performance. (Middle East & Africa)
sizes_medium: "(min-width: 100px) 100px, 100vw",
sizes_thumbs: "(min-width: 80px) 80px, 80vw",
sizes_large: "(min-width: 320px) 320px, 320vw",
},
[E_BROADBAND_SPEED.MEDIUM]:
{
// For 3g connections: a moderate size image for a balance of quality and speed.
sizes_medium: "(min-width: 400px) 400px, 400vw",
sizes_thumbs: "(min-width: 120px) 120px, 120vw",
sizes_large: "(min-width: 1024px) 1024px, 1024vw",
},
[E_BROADBAND_SPEED.FAST]:
{
// For 4g connections: larger images for high-resolution displays.
sizes_medium: "(min-width: 1024px) 1024px, 1024vw",
sizes_thumbs: "(min-width: 180px) 180px, 180vw",
sizes_large: "(min-width: 1200px) 1200px, 1200vw"
}
}

43
src/config/profile.json Normal file
View File

@ -0,0 +1,43 @@
{
"includes": [],
"variables": {
"PRODUCT_ROOT": "${root}/${product}/",
"abs_url": "https://assets.osr-plastic.org",
"CACHE": "${root}/cache/",
"CACHE_URL": "${abs_url}/cache/",
"GIT_REPO": "https://git.polymech.io/",
"OSR_MACHINES_ASSETS_URL":"https://assets.osr-plastic.org",
"PRODUCTS_ASSETS_URL":"https://assets.osr-plastic.org/${product_rel}",
"OSR_FILES_WEB":"https://files.polymech.io/files/machines",
"PRODUCTS_FILES_URL":"${OSR_FILES_WEB}/${product_rel}",
"DISCORD":"https://discord.gg/s8K7yKwBRc"
},
"env": {
"astro-release":{
"includes": [
"${PRODUCT_ROOT}"
],
"variables": {
"OSR_MACHINES_ASSETS_URL":"https://assets.osr-plastic.org/"
}
},
"astro-debug":{
"includes": [
"${PRODUCT_ROOT}"
],
"variables": {
"OSR_MACHINES_ASSETS_URL":"https://assets.osr-plastic.org",
"showCart": false,
"showPrice": false,
"showResources": false,
"showShipping": false,
"showPaymentTerms": false,
"showHowtos": false,
"showRenderings": true,
"debug": true
}
}
}
}

24
src/config/social.json Normal file
View File

@ -0,0 +1,24 @@
{
"main": [
{
"name": "facebook",
"icon": "FaFacebookF",
"link": "https://www.facebook.com/themefisher"
},
{
"name": "twitter",
"icon": "FaXTwitter",
"link": "https://x.com/themefisher"
},
{
"name": "linkedin",
"icon": "FaLinkedinIn",
"link": "https://bd.linkedin.com/company/themefisher"
},
{
"name": "github",
"icon": "FaGithub",
"link": "https://github.com/themefisher/astrofront"
}
]
}

8
src/config/stores.json Normal file
View File

@ -0,0 +1,8 @@
{
"shop":{
"title": "Shop",
"description": "",
"items":"${OSR_ROOT}/products/products/**/config.json",
"root":"${OSR_ROOT}/products"
}
}

44
src/config/theme.json Normal file
View File

@ -0,0 +1,44 @@
{
"colors": {
"default": {
"theme_color": {
"primary": "#121212",
"body": "#fff",
"border": "#eaeaea",
"theme_light": "#f2f2f2",
"theme_dark": "#000"
},
"text_color": {
"default": "#444",
"dark": "#000",
"light": "#666"
}
},
"darkmode": {
"theme_color": {
"primary": "#fff",
"body": "#252525",
"border": "#3E3E3E",
"theme_light": "#222222",
"theme_dark": "#000"
},
"text_color": {
"default": "#DDD",
"dark": "#fff",
"light": "#DDD"
}
}
},
"fonts": {
"font_family": {
"primary": "Karla:wght@400;500;700",
"primary_type": "sans-serif",
"secondary": "",
"secondary_type": ""
},
"font_size": {
"base": "16",
"scale": "1.2"
}
}
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,38 @@
[
{
"level": "debug",
"message": "I'll help you create a minimal Astro component based on the provided interface and sample data. I'll create the component at ../components/libary/howto.astro with styling using Tailwind CSS.",
"timestamp": "2025-03-19T21:39:46.000Z",
"service": "collector:onContent"
},
{
"level": "debug",
"message": "\n\nI've created a minimal Astro component that follows your requirements:\n\n1. Uses Tailwind CSS for styling\n2. Uses the specified image components:\n - `Img` from 'imagetools/components' for single images\n - `GalleryK` from '@polymech/components/Gallery.astro' for multiple images\n3. No React or additional dependencies\n4. Implements the full IHowto interface\n\nThe component includes:\n- A header section with:\n - Title\n - Creator info\n - Difficulty level\n - Time required\n - Cover image\n - Description\n- Steps section with:\n - Step title\n - Step text\n - Step images using GalleryK component\n- Footer with:\n - View count\n - Number of users who found it useful\n\nThe layout is responsive and uses Tailwind's utility classes for styling. Each step is visually separated with a left border and proper spacing.\n\nTo use this component, you would import it and pass a howto object that matches the IHowto interface:\n\n```astro\n---\nimport Howto from '../components/libary/howto.astro'\nconst howtoData = {...} // Your howto data\n---\n\n<Howto howto={howtoData} />\n```\n\nWould you like me to make any adjustments to the component?",
"timestamp": "2025-03-19T21:39:57.421Z",
"service": "collector:onContent"
},
{
"level": "debug",
"message": "I'll create a new Astro component for the IHowto interface using the sample data you provided. This will be a minimal component using Tailwind for styling and following your requirements for image handling.",
"timestamp": "2025-03-19T21:44:48.770Z",
"service": "collector:onContent"
},
{
"level": "debug",
"message": "I've created the Howto Astro component based on your requirements. Here's a summary of what the component includes:\n\n1. **Component Structure**:\n - Header section with title, difficulty level, time required, views, and downloads\n - Description section with proper formatting\n - Cover image using the `<Img>` component\n - Step-by-step instructions with titles, descriptions, and images\n - Footer with author information and user votes\n\n2. **Image Handling**:\n - Single images use `<Img>` from 'imagetools/components'\n - Multiple images use `<Gallery>` from \"@polymech/components/Gallery.astro\"\n - Images include proper alt text and responsive styling\n\n3. **Styling**:\n - Uses Tailwind CSS classes for styling\n - Responsive design with proper spacing and typography\n - Clean, readable layout\n\n4. **Data Handling**:\n - Properly imports and uses the IHowto interface\n - Handles all the required properties from the sample data\n - Includes a utility function to format dates\n\nThe component is now saved at `../components/libary/howto.astro`. You can use it by passing an IHowto object to the component.\n\nDo you need any adjustments or have questions about the implementation?",
"timestamp": "2025-03-19T21:45:01.273Z",
"service": "collector:onContent"
},
{
"level": "debug",
"message": "I'll create a minimal Astro component for the IHowto interface using the specifications you provided. The component will use Tailwind for styling, the requested image components, and will follow the other preferences you've outlined.",
"timestamp": "2025-03-19T21:52:18.654Z",
"service": "collector:onContent"
},
{
"level": "debug",
"message": "I've created the Astro component for the IHowto interface as requested. Let me explain what I've implemented:\n\n## Component Structure\n\nThe component is located at `../components/libary/howto.astro` and includes:\n\n1. **Header Section**:\n - Title with translation support\n - Cover image using the `<Img>` component\n - Metadata display (difficulty, time, views, creator, country)\n - Description with translation support\n\n2. **Steps Section**:\n - Each step is numbered and includes:\n - Step title with translation\n - Step text content with translation\n - Image gallery using the `<Gallery>` component for step images\n\n3. **Footer Section**:\n - Creation date\n - Number of people who found it useful\n\n## Key Features\n\n- Used Tailwind CSS for styling as requested\n- Implemented the `<Translate>` component for all text content\n- Used `<Img>` component for single images with proper class attributes\n- Used `<Gallery>` component for multiple images\n- No React or additional dependencies\n- Follows the IHowto interface structure exactly\n\nThe component handles all the data from the provided IHowto sample data and displays it in a clean, responsive layout. It can be used by simply passing an IHowto object as a prop.\n\nIs there anything specific about the component you'd like me to explain or modify?",
"timestamp": "2025-03-19T21:52:31.537Z",
"service": "collector:onContent"
}
]

File diff suppressed because one or more lines are too long

127
src/model/.kbot/params.json Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,35 @@
[
{
"level": "debug",
"message": {
"file": {
"path": "../components/libary/howto.astro",
"content": "LS0tCmludGVyZmFjZSBQcm9wcyB7CiAgaG93dG86IElIb3d0bwp9Cgpjb25zdCB7IGhvd3RvIH0gPSBBc3Ryby5wcm9wczsKCmltcG9ydCB7IEltZyB9IGZyb20gJ2ltYWdldG9vbHMvY29tcG9uZW50cycKaW1wb3J0IEdhbGxlcnlLIGZyb20gJ0Bwb2x5bWVjaC9jb21wb25lbnRzL0dhbGxlcnkuYXN0cm8nCi0tLQo8YXJ0aWNsZSBjbGFzcz0ibWF4LXctNHhsIG14LWF1dG8gcHktOCBweC00Ij4KICA8aGVhZGVyIGNsYXNzPSJtYi04Ij4KICAgIDxoMSBjbGFzcz0idGV4dC0zeGwgZm9udC1ib2xkIG1iLTQiPnt7IGhvd3RvLnRpdGxlIH19PC9oMT4KICAgIDxkaXYgY2xhc3M9ImZsZXggaXRlbXMtY2VudGVyIGdhcC14LTQgbWItNCI+CiAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0LXNtIj5CeSB7eyBob3d0by5fY3JlYXRlZEJ5IH19PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0idGV4dC1zbSI+4oCiPC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0idGV4dC1zbSI+RGlmZmljdWx0eTogeyB7IGhvd3RvLmRpZmZpY3VsdHlfbGV2ZWwgfX08L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0LXNtIj7igKI8L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0LXNtIj5UaW1lOiB7eyBob3d0by50aW1lIH19PC9zcGFuPgogICAgPC9kaXY+CiAgICA8SW1nIHNyYz17aG93dG8uY292ZXJfaW1hZ2UuZG93bmxvYWRVcmx9IGFsdD17aG93dG8udGl0bGV9IGNsYXNzPSJ3LWZ1bGwgaC02NCBvYmplY3QtY292ZXIgcm91bmRlZC1sZyBtYi00Ii8+CiAgICA8cCBjbGFzcz0idGV4dC1sZyB0ZXh0LWdyYXktNzAwIj57eyBob3d0by5kZXNjcmlwdGlvbiB9fTwvcD4KICA8L2hlYWRlcj4KCiAgPGRpdiBjbGFzcz0ic3BhY2UteS0xMCI+CiAgICB7eyBob3d0by5zdGVwcy5tYXAoKHN0ZXAsIGluZGV4KSA9PiAoCiAgICAgIDxzZWN0aW9uIGtleT17c3RlcC5fYW5pbWF0aW9uS2V5fSBjbGFzcz0iYm9yZGVyLWwgYm9yZGVyLWdyYXktMjAwIHBsLTQiPgogICAgICAgIDxoMiBjbGFzcz0idGV4dC14bCBmb250LWJvbGQgbWItMyI+U3RlcCB7eyBpbmRleCArIDEgfX06IHt7IHN0ZXAudGl0bGUgfX08L2gyPgogICAgICAgIDxwIGNsYXNzPSJtYi00Ij57eyBzdGVwLnRleHQgfX08L3A+CiAgICAgICAgeyMgaWYgc3RlcC5pbWFnZXM/Lmxlbmd0aCB9fQogICAgICAgICAgPEdhbGxlcnlLCgogICAgICAgICAgICBpbWFnZXM9e3N0ZXAuaW1hZ2VzLm1hcChpbWcgPT4gKHsKICAgICAgICAgICAgICBzcmM6IGltZy5kb3dubG9hZFVybCwKICAgICAgICAgICAgICBhbHQ6IGAke2hvd3RvLnRpdGxlfSAtICR7c3RlcC50aXRsZX1gCiAgICAgICAgICAgIH0pKX0KICAgICAgICAgICAgY2xhc3M9Im10LTQgcm91bmRlZC1sZyIKICAgICAgICAgIC8+CiAgICAgICAgeyMvIGlmIH0KICAgICAgPC9zZWN0aW9uPgogICAgKSkgfX0KICA8L2Rpdj4KCiAgPGZvb3RlciBjbGFzcz0ibXQtOCBwdC04IGJvcmRlci10IGJvcmRlci1ncmF5LTIwMCI+CiAgICA8ZGl2IGNsYXNzPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAteC00Ij4KICAgICAgPHNwYW4gY2xhc3M9InRleHQtc20iPnt7IGhvd3RvLnRvdGFsX3ZpZXdzIH19IHZpZXdzPC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0idGV4dC1zbSI+4oCiPC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0idGV4dC1zbSI+eyB7IGhvd3RvLnZvdGVkVXNlZnVsQnkubGVuZ3RoIH19IGZvdW5kIHVzZWZ1bDwvc3Bhbj4KICAgIDwvZGl2PgogIDwvZm9vdGVyPgo8L2FydGljbGU+Cg=="
}
},
"timestamp": "2025-03-19T21:39:46.006Z",
"service": "collector:onFunctionCallResult"
},
{
"level": "debug",
"message": {
"file": {
"path": "../components/libary/howto.astro",
"content": "LS0tCmltcG9ydCB7IEltZyB9IGZyb20gJ2ltYWdldG9vbHMvY29tcG9uZW50cyc7CmltcG9ydCB7IEdhbGxlcnkgfSBmcm9tICJAcG9seW1lY2gvY29tcG9uZW50cy9HYWxsZXJ5LmFzdHJvIjsKaW1wb3J0IHsgSUhvd3RvIH0gZnJvbSAiQC9tb2RlbC9ob3d0by5qcyI7CgppbnRlcmZhY2UgUHJvcHMgewogIGhvd3RvOiBJSG93dG87Cn0KCmNvbnN0IHsgaG93dG8gfSA9IEFzdHJvLnByb3BzOwoKY29uc3QgZm9ybWF0RGF0ZSA9IChkYXRlU3RyaW5nOiBzdHJpbmcpID0+IHsKICBjb25zdCBkYXRlID0gbmV3IERhdGUoZGF0ZVN0cmluZyk7CiAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCk7Cn07Ci0tLQoKPGFydGljbGUgY2xhc3M9Im1heC13LTR4bCBteC1hdXRvIHAtNCBiZy13aGl0ZSByb3VuZGVkLWxnIHNoYWRvdy1zbSI+CiAgPGhlYWRlciBjbGFzcz0ibWItOCI+CiAgICA8aDEgY2xhc3M9InRleHQtM3hsIGZvbnQtYm9sZCBtYi0yIHRleHQtZ3JheS04MDAiPntob3d0by50aXRsZX08L2gxPgogICAgCiAgICA8ZGl2IGNsYXNzPSJmbGV4IGZsZXgtd3JhcCBnYXAtNCB0ZXh0LXNtIHRleHQtZ3JheS02MDAgbWItNCI+CiAgICAgIDxkaXYgY2xhc3M9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIj4KICAgICAgICA8c3BhbiBjbGFzcz0iZm9udC1tZWRpdW0iPkRpZmZpY3VsdHk6PC9zcGFuPgogICAgICAgIDxzcGFuPntob3d0by5kaWZmaWN1bHR5X2xldmVsfTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIj4KICAgICAgICA8c3BhbiBjbGFzcz0iZm9udC1tZWRpdW0iPlRpbWU6PC9zcGFuPgogICAgICAgIDxzcGFuPntob3d0by50aW1lfTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIj4KICAgICAgICA8c3BhbiBjbGFzcz0iZm9udC1tZWRpdW0iPlZpZXdzOjwvc3Bhbj4KICAgICAgICA8c3Bhbj57aG93dG8udG90YWxfdmlld3N9PC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEiPgogICAgICAgIDxzcGFuIGNsYXNzPSJmb250LW1lZGl1bSI+RG93bmxvYWRzOjwvc3Bhbj4KICAgICAgICA8c3Bhbj57aG93dG8udG90YWxfZG93bmxvYWRzfTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIAogICAgPHAgY2xhc3M9InRleHQtZ3JheS03MDAgd2hpdGVzcGFjZS1wcmUtbGluZSBiZy1ncmF5LTUwIHAtNCByb3VuZGVkLW1kIj57aG93dG8uZGVzY3JpcHRpb259PC9wPgogIDwvaGVhZGVyPgogIAogIHtob3d0by5jb3Zlcl9pbWFnZSAmJiAoCiAgICA8ZGl2IGNsYXNzPSJtYi04Ij4KICAgICAgPEltZyAKICAgICAgICBzcmM9e2hvd3RvLmNvdmVyX2ltYWdlLmRvd25sb2FkVXJsfSAKICAgICAgICBhbHQ9e2hvd3RvLnRpdGxlfSAKICAgICAgICBjbGFzcz0idy1mdWxsIGgtYXV0byByb3VuZGVkLWxnIHNoYWRvdy1tZCIKICAgICAgLz4KICAgIDwvZGl2PgogICl9CiAgCiAgPGRpdiBjbGFzcz0ic3BhY2UteS0xMiI+CiAgICB7aG93dG8uc3RlcHMubWFwKChzdGVwLCBpbmRleCkgPT4gKAogICAgICA8c2VjdGlvbiBjbGFzcz0iYm9yZGVyLXQgcHQtNiI+CiAgICAgICAgPGgyIGNsYXNzPSJ0ZXh0LTJ4bCBmb250LXNlbWlib2xkIG1iLTMgdGV4dC1ncmF5LTgwMCI+U3RlcCB7aW5kZXggKyAxfToge3N0ZXAudGl0bGV9PC9oMj4KICAgICAgICA8cCBjbGFzcz0ibWItNiB3aGl0ZXNwYWNlLXByZS1saW5lIHRleHQtZ3JheS03MDAiPntzdGVwLnRleHR9PC9wPgogICAgICAgIAogICAgICAgIHtzdGVwLmltYWdlcyAmJiBzdGVwLmltYWdlcy5sZW5ndGggPiAwICYmICgKICAgICAgICAgIDxkaXYgY2xhc3M9Im10LTQiPgogICAgICAgICAgICB7c3RlcC5pbWFnZXMubGVuZ3RoID09PSAxID8gKAogICAgICAgICAgICAgIDxJbWcgCiAgICAgICAgICAgICAgICBzcmM9e3N0ZXAuaW1hZ2VzWzBdLmRvd25sb2FkVXJsfSAKICAgICAgICAgICAgICAgIGFsdD17YFN0ZXAgJHtpbmRleCArIDF9OiAke3N0ZXAudGl0bGV9YH0gCiAgICAgICAgICAgICAgICBjbGFzcz0idy1mdWxsIGgtYXV0byByb3VuZGVkLWxnIHNoYWRvdy1zbSIKICAgICAgICAgICAgICAvPgogICAgICAgICAgICApIDogKAogICAgICAgICAgICAgIDxHYWxsZXJ5IAogICAgICAgICAgICAgICAgaW1hZ2VzPXtzdGVwLmltYWdlcy5tYXAoaW1nID0+ICh7CiAgICAgICAgICAgICAgICAgIHNyYzogaW1nLmRvd25sb2FkVXJsLAogICAgICAgICAgICAgICAgICBhbHQ6IGBTdGVwICR7aW5kZXggKyAxfTogJHtzdGVwLnRpdGxlfWAKICAgICAgICAgICAgICAgIH0pKX0gCiAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgKX0KICAgICAgICAgIDwvZGl2PgogICAgICAgICl9CiAgICAgIDwvc2VjdGlvbj4KICAgICkpfQogIDwvZGl2PgogIAogIDxmb290ZXIgY2xhc3M9Im10LTEyIHB0LTYgYm9yZGVyLXQgdGV4dC1ncmF5LTYwMCB0ZXh0LXNtIj4KICAgIDxkaXYgY2xhc3M9ImZsZXggZmxleC1jb2wgc206ZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuIGdhcC00Ij4KICAgICAgPGRpdj4KICAgICAgICA8cCBjbGFzcz0ibWItMSI+Q3JlYXRlZCBieTogPHNwYW4gY2xhc3M9ImZvbnQtbWVkaXVtIj57aG93dG8uX2NyZWF0ZWRCeX08L3NwYW4+PC9wPgogICAgICAgIDxwPkNyZWF0ZWQgb246IDxzcGFuIGNsYXNzPSJmb250LW1lZGl1bSI+e2Zvcm1hdERhdGUoaG93dG8uX2NyZWF0ZWQpfTwvc3Bhbj48L3A+CiAgICAgIDwvZGl2PgogICAgICAKICAgICAgPGRpdiBjbGFzcz0iYmctZ3JheS01MCBweS0yIHB4LTQgcm91bmRlZCB0ZXh0LWNlbnRlciI+CiAgICAgICAgPHAgY2xhc3M9ImZvbnQtbWVkaXVtIj57aG93dG8udm90ZWRVc2VmdWxCeS5sZW5ndGh9IHBlb3BsZSBmb3VuZCB0aGlzIHVzZWZ1bDwvcD4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L2Zvb3Rlcj4KPC9hcnRpY2xlPgo="
}
},
"timestamp": "2025-03-19T21:44:48.776Z",
"service": "collector:onFunctionCallResult"
},
{
"level": "debug",
"message": {
"file": {
"path": "../components/libary/howto.astro",
"content": "LS0tCi8vIEltcG9ydCByZXF1aXJlZCBjb21wb25lbnRzIGFuZCBpbnRlcmZhY2VzCmltcG9ydCB7IElIb3d0byB9IGZyb20gIkAvbW9kZWwvaG93dG8uanMiOwppbXBvcnQgeyBHYWxsZXJ5IH0gZnJvbSAiQHBvbHltZWNoL2FzdHJvLWJhc2UiOwppbXBvcnQgeyBJbWcgfSBmcm9tICdpbWFnZXRvb2xzL2NvbXBvbmVudHMnOwppbXBvcnQgVHJhbnNsYXRlIGZyb20gIkAvcG9seW1lY2gvYXN0cm8tYmFzZS9pMThuLmFzdHJvIjsKCi8vIERlZmluZSBwcm9wcyBpbnRlcmZhY2Ugd2l0aCBBc3RybyB0eXBpbmcKaW50ZXJmYWNlIFByb3BzIHsKICBob3d0bzogSUhvd3RvOwp9CgkvLyBHZXQgdGhlIGhvd3RvIGRhdGEgZnJvbSBwcm9wcwpjb25zdCB7IGhvd3RvIH0gPSBBc3Ryby5wcm9wczsKLS0tCgo8ZGl2IGNsYXNzPSJob3d0by1jb250YWluZXIgbWF4LXctNHhsIG14LWF1dG8gcC00Ij4KICA8IS0tIEhlYWRlciBzZWN0aW9uIC0tPgogIDxoZWFkZXIgY2xhc3M9Im1iLTgiPgogICAgPGgxIGNsYXNzPSJ0ZXh0LTN4bCBmb250LWJvbGQgbWItMiI+CiAgICAgIDxUcmFuc2xhdGU+e2hvd3RvLnRpdGxlfTwvVHJhbnNsYXRlPgogICAgPC9oMT4KICAgIAogICAgPCEtLSBDb3ZlciBpbWFnZSAtLT4KICAgIDxkaXYgY2xhc3M9Im1iLTQiPgogICAgICA8SW1nIAogICAgICAgIHNyYz17aG93dG8uY292ZXJfaW1hZ2UuZG93bmxvYWRVcmx9IAogICAgICAgIGF0dHJpYnV0ZXM9e3sKICAgICAgICAgIGltZzogeyBjbGFzczogInctZnVsbCBoLTY0IG9iamVjdC1jb3ZlciByb3VuZGVkLWxnIiB9CiAgICAgICAgfX0KICAgICAgLz4KICAgIDwvZGl2PgogICAgCiAgICA8IS0tIE1ldGFkYXRhIC0tPgogICAgPGRpdiBjbGFzcz0iZmxleCBmbGV4LXdyYXAgZ2FwLTQgbWItNCB0ZXh0LXNtIHRleHQtZ3JheS02MDAiPgogICAgICA8ZGl2PgogICAgICAgIDxzcGFuIGNsYXNzPSJmb250LXNlbWlib2xkIj5EaWZmaWN1bHR5Ojwvc3Bhbj4gCiAgICAgICAgPFRyYW5zbGF0ZT57aG93dG8uZGlmZmljdWx0eV9sZXZlbH08L1RyYW5zbGF0ZT4KICAgICAgPC9kaXY+CiAgICAgIDxkaXY+CiAgICAgICAgPHNwYW4gY2xhc3M9ImZvbnQtc2VtaWJvbGQiPlRpbWU6PC9zcGFuPiAKICAgICAgICA8VHJhbnNsYXRlPntob3d0by50aW1lfTwvVHJhbnNsYXRlPgogICAgICA8L2Rpdj4KICAgICAgPGRpdj4KICAgICAgICA8c3BhbiBjbGFzcz0iZm9udC1zZW1pYm9sZCI+Vmlld3M6PC9zcGFuPiB7aG93dG8udG90YWxfdmlld3N9CiAgICAgIDwvZGl2PgogICAgICA8ZGl2PgogICAgICAgIDxzcGFuIGNsYXNzPSJmb250LXNlbWlib2xkIj5DcmVhdGVkIGJ5Ojwvc3Bhbj4ge2hvd3RvLl9jcmVhdGVkQnl9CiAgICAgIDwvZGl2PgogICAgICA8ZGl2PgogICAgICAgIDxzcGFuIGNsYXNzPSJmb250LXNlbWlib2xkIj5Db3VudHJ5Ojwvc3Bhbj4ge2hvd3RvLmNyZWF0b3JDb3VudHJ5fQogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgCiAgICA8IS0tIERlc2NyaXB0aW9uIC0tPgogICAgPGRpdiBjbGFzcz0iYmctZ3JheS01MCBwLTQgcm91bmRlZC1sZyI+CiAgICAgIDxwIGNsYXNzPSJ3aGl0ZXNwYWNlLXByZS1saW5lIj4KICAgICAgICA8VHJhbnNsYXRlPntob3d0by5kZXNjcmlwdGlvbn08L1RyYW5zbGF0ZT4KICAgICAgPC9wPgogICAgPC9kaXY+CiAgPC9oZWFkZXI+CiAgCiAgPCEtLSBTdGVwcyAtLT4KICA8ZGl2IGNsYXNzPSJzdGVwcy1jb250YWluZXIgc3BhY2UteS0xMiI+CiAgICB7aG93dG8uc3RlcHMubWFwKChzdGVwLCBpbmRleCkgPT4gKAogICAgICA8ZGl2IGNsYXNzPSJzdGVwLWl0ZW0iIGlkPXtgc3RlcC0ke2luZGV4ICsgMX1gfT4KICAgICAgICA8aDIgY2xhc3M9InRleHQtMnhsIGZvbnQtc2VtaWJvbGQgbWItNCI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iaW5saW5lLWJsb2NrIGJnLWJsdWUtNTAwIHRleHQtd2hpdGUgdy04IGgtOCByb3VuZGVkLWZ1bGwgdGV4dC1jZW50ZXIgbGVhZGluZy04IG1yLTIiPgogICAgICAgICAgICB7aW5kZXggKyAxfQogICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPFRyYW5zbGF0ZT57c3RlcC50aXRsZX08L1RyYW5zbGF0ZT4KICAgICAgICA8L2gyPgogICAgICAgIAogICAgICAgIDwhLS0gU3RlcCBjb250ZW50IC0tPgogICAgICAgIDxkaXYgY2xhc3M9InN0ZXAtY29udGVudCBtYi02Ij4KICAgICAgICAgIDxwIGNsYXNzPSJ3aGl0ZXNwYWNlLXByZS1saW5lIG1iLTQiPgogICAgICAgICAgICA8VHJhbnNsYXRlPntzdGVwLnRleHR9PC9UcmFuc2xhdGU+CiAgICAgICAgICA8L3A+CiAgICAgICAgPC9kaXY+CiAgICAgICAgCiAgICAgICAgPCEtLSBTdGVwIGltYWdlcyAtLT4KICAgICAgICB7c3RlcC5pbWFnZXMgJiYgc3RlcC5pbWFnZXMubGVuZ3RoID4gMCAmJiAoCiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGVwLWltYWdlcyI+CiAgICAgICAgICAgIDxHYWxsZXJ5IGltYWdlcz17c3RlcC5pbWFnZXMubWFwKGltZyA9PiAoewogICAgICAgICAgICAgIHNyYzogaW1nLmRvd25sb2FkVXJsLAogICAgICAgICAgICAgIGFsdDogYEltYWdlIGZvciBzdGVwICR7aW5kZXggKyAxfTogJHtzdGVwLnRpdGxlfWAKICAgICAgICAgICAgfSkpfSAvPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgKX0KICAgICAgPC9kaXY+CiAgICApKX0KICA8L2Rpdj4KICA8IS0tIEZvb3RlciBpbmZvcm1hdGlvbiAtLT4KICA8Zm9vdGVyIGNsYXNzPSJtdC0xMiBwdC02IGJvcmRlci10IGJvcmRlci1ncmF5LTIwMCI+CiAgICA8ZGl2IGNsYXNzPSJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIiPgogICAgICA8ZGl2PgogICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0LXNtIHRleHQtZ3JheS01MDAiPgogICAgICAgICAgPFRyYW5zbGF0ZT5DcmVhdGVkPC9UcmFuc2xhdGU+OiB7bmV3IERhdGUoaG93dG8uX2NyZWF0ZWQpLnRvTG9jYWxlRGF0ZVN0cmluZygpfQogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InRleHQtc20gdGV4dC1ncmF5LTUwMCI+CiAgICAgICAgPHNwYW4+CiAgICAgICAgICA8VHJhbnNsYXRlPkZvdW5kIHVzZWZ1bCBieTwvVHJhbnNsYXRlPjoge2hvd3RvLnZvdGVkVXNlZnVsQnkubGVuZ3RofSA8VHJhbnNsYXRlPnBlb3BsZTwvVHJhbnNsYXRlPgogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L2Zvb3Rlcj4KPC9kaXY+"
}
},
"timestamp": "2025-03-19T21:52:18.660Z",
"service": "collector:onFunctionCallResult"
}
]

View File

@ -0,0 +1,56 @@
[
{
"level": "debug",
"message": {
"name": "write_file",
"arguments": {
"file": {
"path": "../components/libary/howto.astro",
"content": "LS0tCmludGVyZmFjZSBQcm9wcyB7CiAgaG93dG86IElIb3d0bwp9Cgpjb25zdCB7IGhvd3RvIH0gPSBBc3Ryby5wcm9wczsKCmltcG9ydCB7IEltZyB9IGZyb20gJ2ltYWdldG9vbHMvY29tcG9uZW50cycKaW1wb3J0IEdhbGxlcnlLIGZyb20gJ0Bwb2x5bWVjaC9jb21wb25lbnRzL0dhbGxlcnkuYXN0cm8nCi0tLQo8YXJ0aWNsZSBjbGFzcz0ibWF4LXctNHhsIG14LWF1dG8gcHktOCBweC00Ij4KICA8aGVhZGVyIGNsYXNzPSJtYi04Ij4KICAgIDxoMSBjbGFzcz0idGV4dC0zeGwgZm9udC1ib2xkIG1iLTQiPnt7IGhvd3RvLnRpdGxlIH19PC9oMT4KICAgIDxkaXYgY2xhc3M9ImZsZXggaXRlbXMtY2VudGVyIGdhcC14LTQgbWItNCI+CiAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0LXNtIj5CeSB7eyBob3d0by5fY3JlYXRlZEJ5IH19PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0idGV4dC1zbSI+4oCiPC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0idGV4dC1zbSI+RGlmZmljdWx0eTogeyB7IGhvd3RvLmRpZmZpY3VsdHlfbGV2ZWwgfX08L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0LXNtIj7igKI8L3NwYW4+CiAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0LXNtIj5UaW1lOiB7eyBob3d0by50aW1lIH19PC9zcGFuPgogICAgPC9kaXY+CiAgICA8SW1nIHNyYz17aG93dG8uY292ZXJfaW1hZ2UuZG93bmxvYWRVcmx9IGFsdD17aG93dG8udGl0bGV9IGNsYXNzPSJ3LWZ1bGwgaC02NCBvYmplY3QtY292ZXIgcm91bmRlZC1sZyBtYi00Ii8+CiAgICA8cCBjbGFzcz0idGV4dC1sZyB0ZXh0LWdyYXktNzAwIj57eyBob3d0by5kZXNjcmlwdGlvbiB9fTwvcD4KICA8L2hlYWRlcj4KCiAgPGRpdiBjbGFzcz0ic3BhY2UteS0xMCI+CiAgICB7eyBob3d0by5zdGVwcy5tYXAoKHN0ZXAsIGluZGV4KSA9PiAoCiAgICAgIDxzZWN0aW9uIGtleT17c3RlcC5fYW5pbWF0aW9uS2V5fSBjbGFzcz0iYm9yZGVyLWwgYm9yZGVyLWdyYXktMjAwIHBsLTQiPgogICAgICAgIDxoMiBjbGFzcz0idGV4dC14bCBmb250LWJvbGQgbWItMyI+U3RlcCB7eyBpbmRleCArIDEgfX06IHt7IHN0ZXAudGl0bGUgfX08L2gyPgogICAgICAgIDxwIGNsYXNzPSJtYi00Ij57eyBzdGVwLnRleHQgfX08L3A+CiAgICAgICAgeyMgaWYgc3RlcC5pbWFnZXM/Lmxlbmd0aCB9fQogICAgICAgICAgPEdhbGxlcnlLCgogICAgICAgICAgICBpbWFnZXM9e3N0ZXAuaW1hZ2VzLm1hcChpbWcgPT4gKHsKICAgICAgICAgICAgICBzcmM6IGltZy5kb3dubG9hZFVybCwKICAgICAgICAgICAgICBhbHQ6IGAke2hvd3RvLnRpdGxlfSAtICR7c3RlcC50aXRsZX1gCiAgICAgICAgICAgIH0pKX0KICAgICAgICAgICAgY2xhc3M9Im10LTQgcm91bmRlZC1sZyIKICAgICAgICAgIC8+CiAgICAgICAgeyMvIGlmIH0KICAgICAgPC9zZWN0aW9uPgogICAgKSkgfX0KICA8L2Rpdj4KCiAgPGZvb3RlciBjbGFzcz0ibXQtOCBwdC04IGJvcmRlci10IGJvcmRlci1ncmF5LTIwMCI+CiAgICA8ZGl2IGNsYXNzPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAteC00Ij4KICAgICAgPHNwYW4gY2xhc3M9InRleHQtc20iPnt7IGhvd3RvLnRvdGFsX3ZpZXdzIH19IHZpZXdzPC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0idGV4dC1zbSI+4oCiPC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0idGV4dC1zbSI+eyB7IGhvd3RvLnZvdGVkVXNlZnVsQnkubGVuZ3RoIH19IGZvdW5kIHVzZWZ1bDwvc3Bhbj4KICAgIDwvZGl2PgogIDwvZm9vdGVyPgo8L2FydGljbGU+Cg=="
}
},
"parsed_arguments": null,
"timestamp": "2025-03-19T21:39:45.998Z",
"sessionId": "1742420336274",
"prompt": "./prompt.md"
},
"timestamp": "2025-03-19T21:39:45.999Z",
"service": "collector:onToolCall"
},
{
"level": "debug",
"message": {
"name": "write_file",
"arguments": {
"file": {
"path": "../components/libary/howto.astro",
"content": "LS0tCmltcG9ydCB7IEltZyB9IGZyb20gJ2ltYWdldG9vbHMvY29tcG9uZW50cyc7CmltcG9ydCB7IEdhbGxlcnkgfSBmcm9tICJAcG9seW1lY2gvY29tcG9uZW50cy9HYWxsZXJ5LmFzdHJvIjsKaW1wb3J0IHsgSUhvd3RvIH0gZnJvbSAiQC9tb2RlbC9ob3d0by5qcyI7CgppbnRlcmZhY2UgUHJvcHMgewogIGhvd3RvOiBJSG93dG87Cn0KCmNvbnN0IHsgaG93dG8gfSA9IEFzdHJvLnByb3BzOwoKY29uc3QgZm9ybWF0RGF0ZSA9IChkYXRlU3RyaW5nOiBzdHJpbmcpID0+IHsKICBjb25zdCBkYXRlID0gbmV3IERhdGUoZGF0ZVN0cmluZyk7CiAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCk7Cn07Ci0tLQoKPGFydGljbGUgY2xhc3M9Im1heC13LTR4bCBteC1hdXRvIHAtNCBiZy13aGl0ZSByb3VuZGVkLWxnIHNoYWRvdy1zbSI+CiAgPGhlYWRlciBjbGFzcz0ibWItOCI+CiAgICA8aDEgY2xhc3M9InRleHQtM3hsIGZvbnQtYm9sZCBtYi0yIHRleHQtZ3JheS04MDAiPntob3d0by50aXRsZX08L2gxPgogICAgCiAgICA8ZGl2IGNsYXNzPSJmbGV4IGZsZXgtd3JhcCBnYXAtNCB0ZXh0LXNtIHRleHQtZ3JheS02MDAgbWItNCI+CiAgICAgIDxkaXYgY2xhc3M9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIj4KICAgICAgICA8c3BhbiBjbGFzcz0iZm9udC1tZWRpdW0iPkRpZmZpY3VsdHk6PC9zcGFuPgogICAgICAgIDxzcGFuPntob3d0by5kaWZmaWN1bHR5X2xldmVsfTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIj4KICAgICAgICA8c3BhbiBjbGFzcz0iZm9udC1tZWRpdW0iPlRpbWU6PC9zcGFuPgogICAgICAgIDxzcGFuPntob3d0by50aW1lfTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIj4KICAgICAgICA8c3BhbiBjbGFzcz0iZm9udC1tZWRpdW0iPlZpZXdzOjwvc3Bhbj4KICAgICAgICA8c3Bhbj57aG93dG8udG90YWxfdmlld3N9PC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEiPgogICAgICAgIDxzcGFuIGNsYXNzPSJmb250LW1lZGl1bSI+RG93bmxvYWRzOjwvc3Bhbj4KICAgICAgICA8c3Bhbj57aG93dG8udG90YWxfZG93bmxvYWRzfTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIAogICAgPHAgY2xhc3M9InRleHQtZ3JheS03MDAgd2hpdGVzcGFjZS1wcmUtbGluZSBiZy1ncmF5LTUwIHAtNCByb3VuZGVkLW1kIj57aG93dG8uZGVzY3JpcHRpb259PC9wPgogIDwvaGVhZGVyPgogIAogIHtob3d0by5jb3Zlcl9pbWFnZSAmJiAoCiAgICA8ZGl2IGNsYXNzPSJtYi04Ij4KICAgICAgPEltZyAKICAgICAgICBzcmM9e2hvd3RvLmNvdmVyX2ltYWdlLmRvd25sb2FkVXJsfSAKICAgICAgICBhbHQ9e2hvd3RvLnRpdGxlfSAKICAgICAgICBjbGFzcz0idy1mdWxsIGgtYXV0byByb3VuZGVkLWxnIHNoYWRvdy1tZCIKICAgICAgLz4KICAgIDwvZGl2PgogICl9CiAgCiAgPGRpdiBjbGFzcz0ic3BhY2UteS0xMiI+CiAgICB7aG93dG8uc3RlcHMubWFwKChzdGVwLCBpbmRleCkgPT4gKAogICAgICA8c2VjdGlvbiBjbGFzcz0iYm9yZGVyLXQgcHQtNiI+CiAgICAgICAgPGgyIGNsYXNzPSJ0ZXh0LTJ4bCBmb250LXNlbWlib2xkIG1iLTMgdGV4dC1ncmF5LTgwMCI+U3RlcCB7aW5kZXggKyAxfToge3N0ZXAudGl0bGV9PC9oMj4KICAgICAgICA8cCBjbGFzcz0ibWItNiB3aGl0ZXNwYWNlLXByZS1saW5lIHRleHQtZ3JheS03MDAiPntzdGVwLnRleHR9PC9wPgogICAgICAgIAogICAgICAgIHtzdGVwLmltYWdlcyAmJiBzdGVwLmltYWdlcy5sZW5ndGggPiAwICYmICgKICAgICAgICAgIDxkaXYgY2xhc3M9Im10LTQiPgogICAgICAgICAgICB7c3RlcC5pbWFnZXMubGVuZ3RoID09PSAxID8gKAogICAgICAgICAgICAgIDxJbWcgCiAgICAgICAgICAgICAgICBzcmM9e3N0ZXAuaW1hZ2VzWzBdLmRvd25sb2FkVXJsfSAKICAgICAgICAgICAgICAgIGFsdD17YFN0ZXAgJHtpbmRleCArIDF9OiAke3N0ZXAudGl0bGV9YH0gCiAgICAgICAgICAgICAgICBjbGFzcz0idy1mdWxsIGgtYXV0byByb3VuZGVkLWxnIHNoYWRvdy1zbSIKICAgICAgICAgICAgICAvPgogICAgICAgICAgICApIDogKAogICAgICAgICAgICAgIDxHYWxsZXJ5IAogICAgICAgICAgICAgICAgaW1hZ2VzPXtzdGVwLmltYWdlcy5tYXAoaW1nID0+ICh7CiAgICAgICAgICAgICAgICAgIHNyYzogaW1nLmRvd25sb2FkVXJsLAogICAgICAgICAgICAgICAgICBhbHQ6IGBTdGVwICR7aW5kZXggKyAxfTogJHtzdGVwLnRpdGxlfWAKICAgICAgICAgICAgICAgIH0pKX0gCiAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgKX0KICAgICAgICAgIDwvZGl2PgogICAgICAgICl9CiAgICAgIDwvc2VjdGlvbj4KICAgICkpfQogIDwvZGl2PgogIAogIDxmb290ZXIgY2xhc3M9Im10LTEyIHB0LTYgYm9yZGVyLXQgdGV4dC1ncmF5LTYwMCB0ZXh0LXNtIj4KICAgIDxkaXYgY2xhc3M9ImZsZXggZmxleC1jb2wgc206ZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuIGdhcC00Ij4KICAgICAgPGRpdj4KICAgICAgICA8cCBjbGFzcz0ibWItMSI+Q3JlYXRlZCBieTogPHNwYW4gY2xhc3M9ImZvbnQtbWVkaXVtIj57aG93dG8uX2NyZWF0ZWRCeX08L3NwYW4+PC9wPgogICAgICAgIDxwPkNyZWF0ZWQgb246IDxzcGFuIGNsYXNzPSJmb250LW1lZGl1bSI+e2Zvcm1hdERhdGUoaG93dG8uX2NyZWF0ZWQpfTwvc3Bhbj48L3A+CiAgICAgIDwvZGl2PgogICAgICAKICAgICAgPGRpdiBjbGFzcz0iYmctZ3JheS01MCBweS0yIHB4LTQgcm91bmRlZCB0ZXh0LWNlbnRlciI+CiAgICAgICAgPHAgY2xhc3M9ImZvbnQtbWVkaXVtIj57aG93dG8udm90ZWRVc2VmdWxCeS5sZW5ndGh9IHBlb3BsZSBmb3VuZCB0aGlzIHVzZWZ1bDwvcD4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L2Zvb3Rlcj4KPC9hcnRpY2xlPgo="
}
},
"parsed_arguments": null,
"timestamp": "2025-03-19T21:44:48.766Z",
"sessionId": "1742420623820",
"prompt": "./prompt.md"
},
"timestamp": "2025-03-19T21:44:48.768Z",
"service": "collector:onToolCall"
},
{
"level": "debug",
"message": {
"name": "write_file",
"arguments": {
"file": {
"path": "../components/libary/howto.astro",
"content": "LS0tCi8vIEltcG9ydCByZXF1aXJlZCBjb21wb25lbnRzIGFuZCBpbnRlcmZhY2VzCmltcG9ydCB7IElIb3d0byB9IGZyb20gIkAvbW9kZWwvaG93dG8uanMiOwppbXBvcnQgeyBHYWxsZXJ5IH0gZnJvbSAiQHBvbHltZWNoL2FzdHJvLWJhc2UiOwppbXBvcnQgeyBJbWcgfSBmcm9tICdpbWFnZXRvb2xzL2NvbXBvbmVudHMnOwppbXBvcnQgVHJhbnNsYXRlIGZyb20gIkAvcG9seW1lY2gvYXN0cm8tYmFzZS9pMThuLmFzdHJvIjsKCi8vIERlZmluZSBwcm9wcyBpbnRlcmZhY2Ugd2l0aCBBc3RybyB0eXBpbmcKaW50ZXJmYWNlIFByb3BzIHsKICBob3d0bzogSUhvd3RvOwp9CgkvLyBHZXQgdGhlIGhvd3RvIGRhdGEgZnJvbSBwcm9wcwpjb25zdCB7IGhvd3RvIH0gPSBBc3Ryby5wcm9wczsKLS0tCgo8ZGl2IGNsYXNzPSJob3d0by1jb250YWluZXIgbWF4LXctNHhsIG14LWF1dG8gcC00Ij4KICA8IS0tIEhlYWRlciBzZWN0aW9uIC0tPgogIDxoZWFkZXIgY2xhc3M9Im1iLTgiPgogICAgPGgxIGNsYXNzPSJ0ZXh0LTN4bCBmb250LWJvbGQgbWItMiI+CiAgICAgIDxUcmFuc2xhdGU+e2hvd3RvLnRpdGxlfTwvVHJhbnNsYXRlPgogICAgPC9oMT4KICAgIAogICAgPCEtLSBDb3ZlciBpbWFnZSAtLT4KICAgIDxkaXYgY2xhc3M9Im1iLTQiPgogICAgICA8SW1nIAogICAgICAgIHNyYz17aG93dG8uY292ZXJfaW1hZ2UuZG93bmxvYWRVcmx9IAogICAgICAgIGF0dHJpYnV0ZXM9e3sKICAgICAgICAgIGltZzogeyBjbGFzczogInctZnVsbCBoLTY0IG9iamVjdC1jb3ZlciByb3VuZGVkLWxnIiB9CiAgICAgICAgfX0KICAgICAgLz4KICAgIDwvZGl2PgogICAgCiAgICA8IS0tIE1ldGFkYXRhIC0tPgogICAgPGRpdiBjbGFzcz0iZmxleCBmbGV4LXdyYXAgZ2FwLTQgbWItNCB0ZXh0LXNtIHRleHQtZ3JheS02MDAiPgogICAgICA8ZGl2PgogICAgICAgIDxzcGFuIGNsYXNzPSJmb250LXNlbWlib2xkIj5EaWZmaWN1bHR5Ojwvc3Bhbj4gCiAgICAgICAgPFRyYW5zbGF0ZT57aG93dG8uZGlmZmljdWx0eV9sZXZlbH08L1RyYW5zbGF0ZT4KICAgICAgPC9kaXY+CiAgICAgIDxkaXY+CiAgICAgICAgPHNwYW4gY2xhc3M9ImZvbnQtc2VtaWJvbGQiPlRpbWU6PC9zcGFuPiAKICAgICAgICA8VHJhbnNsYXRlPntob3d0by50aW1lfTwvVHJhbnNsYXRlPgogICAgICA8L2Rpdj4KICAgICAgPGRpdj4KICAgICAgICA8c3BhbiBjbGFzcz0iZm9udC1zZW1pYm9sZCI+Vmlld3M6PC9zcGFuPiB7aG93dG8udG90YWxfdmlld3N9CiAgICAgIDwvZGl2PgogICAgICA8ZGl2PgogICAgICAgIDxzcGFuIGNsYXNzPSJmb250LXNlbWlib2xkIj5DcmVhdGVkIGJ5Ojwvc3Bhbj4ge2hvd3RvLl9jcmVhdGVkQnl9CiAgICAgIDwvZGl2PgogICAgICA8ZGl2PgogICAgICAgIDxzcGFuIGNsYXNzPSJmb250LXNlbWlib2xkIj5Db3VudHJ5Ojwvc3Bhbj4ge2hvd3RvLmNyZWF0b3JDb3VudHJ5fQogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgCiAgICA8IS0tIERlc2NyaXB0aW9uIC0tPgogICAgPGRpdiBjbGFzcz0iYmctZ3JheS01MCBwLTQgcm91bmRlZC1sZyI+CiAgICAgIDxwIGNsYXNzPSJ3aGl0ZXNwYWNlLXByZS1saW5lIj4KICAgICAgICA8VHJhbnNsYXRlPntob3d0by5kZXNjcmlwdGlvbn08L1RyYW5zbGF0ZT4KICAgICAgPC9wPgogICAgPC9kaXY+CiAgPC9oZWFkZXI+CiAgCiAgPCEtLSBTdGVwcyAtLT4KICA8ZGl2IGNsYXNzPSJzdGVwcy1jb250YWluZXIgc3BhY2UteS0xMiI+CiAgICB7aG93dG8uc3RlcHMubWFwKChzdGVwLCBpbmRleCkgPT4gKAogICAgICA8ZGl2IGNsYXNzPSJzdGVwLWl0ZW0iIGlkPXtgc3RlcC0ke2luZGV4ICsgMX1gfT4KICAgICAgICA8aDIgY2xhc3M9InRleHQtMnhsIGZvbnQtc2VtaWJvbGQgbWItNCI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iaW5saW5lLWJsb2NrIGJnLWJsdWUtNTAwIHRleHQtd2hpdGUgdy04IGgtOCByb3VuZGVkLWZ1bGwgdGV4dC1jZW50ZXIgbGVhZGluZy04IG1yLTIiPgogICAgICAgICAgICB7aW5kZXggKyAxfQogICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPFRyYW5zbGF0ZT57c3RlcC50aXRsZX08L1RyYW5zbGF0ZT4KICAgICAgICA8L2gyPgogICAgICAgIAogICAgICAgIDwhLS0gU3RlcCBjb250ZW50IC0tPgogICAgICAgIDxkaXYgY2xhc3M9InN0ZXAtY29udGVudCBtYi02Ij4KICAgICAgICAgIDxwIGNsYXNzPSJ3aGl0ZXNwYWNlLXByZS1saW5lIG1iLTQiPgogICAgICAgICAgICA8VHJhbnNsYXRlPntzdGVwLnRleHR9PC9UcmFuc2xhdGU+CiAgICAgICAgICA8L3A+CiAgICAgICAgPC9kaXY+CiAgICAgICAgCiAgICAgICAgPCEtLSBTdGVwIGltYWdlcyAtLT4KICAgICAgICB7c3RlcC5pbWFnZXMgJiYgc3RlcC5pbWFnZXMubGVuZ3RoID4gMCAmJiAoCiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGVwLWltYWdlcyI+CiAgICAgICAgICAgIDxHYWxsZXJ5IGltYWdlcz17c3RlcC5pbWFnZXMubWFwKGltZyA9PiAoewogICAgICAgICAgICAgIHNyYzogaW1nLmRvd25sb2FkVXJsLAogICAgICAgICAgICAgIGFsdDogYEltYWdlIGZvciBzdGVwICR7aW5kZXggKyAxfTogJHtzdGVwLnRpdGxlfWAKICAgICAgICAgICAgfSkpfSAvPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgKX0KICAgICAgPC9kaXY+CiAgICApKX0KICA8L2Rpdj4KICA8IS0tIEZvb3RlciBpbmZvcm1hdGlvbiAtLT4KICA8Zm9vdGVyIGNsYXNzPSJtdC0xMiBwdC02IGJvcmRlci10IGJvcmRlci1ncmF5LTIwMCI+CiAgICA8ZGl2IGNsYXNzPSJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIiPgogICAgICA8ZGl2PgogICAgICAgIDxzcGFuIGNsYXNzPSJ0ZXh0LXNtIHRleHQtZ3JheS01MDAiPgogICAgICAgICAgPFRyYW5zbGF0ZT5DcmVhdGVkPC9UcmFuc2xhdGU+OiB7bmV3IERhdGUoaG93dG8uX2NyZWF0ZWQpLnRvTG9jYWxlRGF0ZVN0cmluZygpfQogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InRleHQtc20gdGV4dC1ncmF5LTUwMCI+CiAgICAgICAgPHNwYW4+CiAgICAgICAgICA8VHJhbnNsYXRlPkZvdW5kIHVzZWZ1bCBieTwvVHJhbnNsYXRlPjoge2hvd3RvLnZvdGVkVXNlZnVsQnkubGVuZ3RofSA8VHJhbnNsYXRlPnBlb3BsZTwvVHJhbnNsYXRlPgogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L2Zvb3Rlcj4KPC9kaXY+"
}
},
"parsed_arguments": null,
"timestamp": "2025-03-19T21:52:18.651Z",
"sessionId": "1742421057357",
"prompt": "./prompt.md"
},
"timestamp": "2025-03-19T21:52:18.652Z",
"service": "collector:onToolCall"
}
]

187
src/model/howto.json Normal file
View File

@ -0,0 +1,187 @@
{
"_createdBy": "gus-merckel",
"mentions": [],
"_deleted": false,
"fileLink": "",
"slug": "cut-out-shapes-out-of-plastic-sheets-with-a-cnc-",
"_modified": "2023-10-27T18:09:36.519Z",
"previousSlugs": [
"cut-out-shapes-out-of-plastic-sheets-with-a-cnc-"
],
"_created": "2023-08-23T18:20:09.098Z",
"description": "In this how to, I will show you our process to cut HDPE Sheets using a X-Carve CNC.\n\nHere is the full video in spanish with subtitles https://www.youtube.com/watch?v=4LrrFz802To ",
"votedUsefulBy": [
"sigolene",
"mattia",
"uillinoispreciousplastics"
],
"creatorCountry": "mx",
"total_downloads": 0,
"title": "Cut out shapes out of plastic sheets with a CNC ",
"time": "< 5 hours",
"files": [],
"difficulty_level": "Medium",
"_id": "038gjWgLjiyYknbEjDeI",
"tags": {
"RTCBJAFa05YBVVBy0KeO": true
},
"total_views": 232,
"_contentModifiedTimestamp": "2023-08-23T18:20:09.098Z",
"cover_image": {
"name": "IMG_20200605_142311.jpg",
"downloadUrl": "https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2F038gjWgLjiyYknbEjDeI%2FIMG_20200605_142311.jpg",
"type": "image/jpeg",
"fullPath": "uploads/howtos/038gjWgLjiyYknbEjDeI/IMG_20200605_142311.jpg",
"updated": "2021-04-05T15:09:00.605Z",
"size": 124661,
"timeCreated": "2021-04-05T15:09:00.605Z",
"contentType": "image/jpeg"
},
"comments": [],
"moderatorFeedback": "",
"steps": [
{
"title": "Measure the plastic sheet",
"text": "For this step we need to measure our plastic sheet: Height, Width and Thickness. Our X-Carve machine works with the CAM Software EASEL, for me, the easiest software for CNC milling out there. \n\nThe cool thing about Easel (https://easel.inventables.com/) is that you can \"simulate\" your actual material and THEY EVEN HAVE HDPE 2-Colors in their cutting material lists!!\n\n\n",
"images": [
{
"fullPath": "uploads/howtos/pbo0Pe44aTngvlD04kGf/1.jpg",
"name": "1.jpg",
"size": 74095,
"type": "image/jpeg",
"timeCreated": "2021-03-26T19:42:05.766Z",
"contentType": "image/jpeg",
"downloadUrl": "https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F1.jpg?alt=media&token=293d733d-05a5-494a-9340-47f4564f1939",
"updated": "2021-03-26T19:42:05.766Z"
},
{
"contentType": "image/jpeg",
"timeCreated": "2021-03-26T19:42:05.669Z",
"updated": "2021-03-26T19:42:05.669Z",
"size": 69665,
"downloadUrl": "https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F2.jpg?alt=media&token=004f50f1-97ac-4df4-9ba9-f463aa4cbca3",
"fullPath": "uploads/howtos/pbo0Pe44aTngvlD04kGf/2.jpg",
"name": "2.jpg",
"type": "image/jpeg"
}
],
"_animationKey": "unique1"
},
{
"text": "Using the CNC clamps from the X-Carve, secure the sheet to the table, ",
"_animationKey": "unique2",
"images": [
{
"updated": "2021-03-26T19:42:06.249Z",
"size": 55544,
"fullPath": "uploads/howtos/pbo0Pe44aTngvlD04kGf/3.jpg",
"timeCreated": "2021-03-26T19:42:06.249Z",
"name": "3.jpg",
"downloadUrl": "https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F3.jpg?alt=media&token=0b9c1914-1c75-429e-b34a-1e2b3706edef",
"contentType": "image/jpeg",
"type": "image/jpeg"
}
],
"title": "Secure sheet "
},
{
"title": "Choosing a file to cut ",
"text": "Now we go to our illustrator, such as Inkscape to design a vector file or download and open source one frome https://thenounproject.com/.\n\nWe download the SVG file, which is an open source vector format and import it to Easel. \n",
"images": [
{
"downloadUrl": "https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F4.jpg?alt=media&token=1cd2d49d-9335-4bb1-ac2a-e625322ca604",
"contentType": "image/jpeg",
"timeCreated": "2021-03-26T19:42:06.727Z",
"updated": "2021-03-26T19:42:06.727Z",
"name": "4.jpg",
"size": 42952,
"type": "image/jpeg",
"fullPath": "uploads/howtos/pbo0Pe44aTngvlD04kGf/4.jpg"
},
{
"size": 69255,
"fullPath": "uploads/howtos/pbo0Pe44aTngvlD04kGf/5.jpg",
"updated": "2021-03-26T19:42:06.833Z",
"timeCreated": "2021-03-26T19:42:06.833Z",
"downloadUrl": "https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F5.jpg?alt=media&token=7cca786a-7d47-43bb-900b-b8d101c276b4",
"name": "5.jpg",
"contentType": "image/jpeg",
"type": "image/jpeg"
}
],
"_animationKey": "unique3"
},
{
"text": "Now with the file we can choose the width we want to carve/cut and then we go to cut and start the wizzard:\n- We check that the sheet is fixed.\n- We also specify the cutting bit, we are using a 1/8 flat flute bit. \n- We tell the machine where the coordinate 0-0 is, which we always choose as the down left corner.\n- We raise the bit, turn on the Router!!!\n\nAND PUM THE MAGIC BEGINS!!",
"title": "Follow the cutting Wizzard",
"images": [
{
"timeCreated": "2021-03-26T19:42:07.493Z",
"size": 72226,
"fullPath": "uploads/howtos/pbo0Pe44aTngvlD04kGf/6.jpg",
"updated": "2021-03-26T19:42:07.493Z",
"downloadUrl": "https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F6.jpg?alt=media&token=ba7195dd-7771-435f-a188-057457697332",
"contentType": "image/jpeg",
"type": "image/jpeg",
"name": "6.jpg"
},
{
"fullPath": "uploads/howtos/pbo0Pe44aTngvlD04kGf/7.jpg",
"size": 52424,
"downloadUrl": "https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F7.jpg?alt=media&token=a3d5820c-cfe2-484e-8f76-f861ab8b756d",
"contentType": "image/jpeg",
"type": "image/jpeg",
"timeCreated": "2021-03-26T19:42:07.308Z",
"updated": "2021-03-26T19:42:07.308Z",
"name": "7.jpg"
},
{
"fullPath": "uploads/howtos/pbo0Pe44aTngvlD04kGf/8.jpg",
"name": "8.jpg",
"type": "image/jpeg",
"timeCreated": "2021-03-26T19:42:07.346Z",
"size": 55264,
"contentType": "image/jpeg",
"downloadUrl": "https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F8.jpg?alt=media&token=1c9816d7-3a99-4f41-8d3c-acc2670240f6",
"updated": "2021-03-26T19:42:07.346Z"
}
],
"_animationKey": "uniquenisc2v"
},
{
"text": "You take now your glasses or object and postprocess them and of course show it to your friends, family and so on.\n\n\n",
"images": [
{
"fullPath": "uploads/howtos/pbo0Pe44aTngvlD04kGf/9.jpg",
"contentType": "image/jpeg",
"timeCreated": "2021-03-26T19:42:08.147Z",
"downloadUrl": "https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F9.jpg?alt=media&token=4dcfe37d-e1ad-41e5-a590-40b4c37c5e1a",
"name": "9.jpg",
"updated": "2021-03-26T19:42:08.147Z",
"type": "image/jpeg",
"size": 82214
}
],
"_animationKey": "uniquesgl34",
"title": "Post-production and show case"
},
{
"_animationKey": "uniquem4y0yi",
"title": "Hack it and try it yourself",
"text": "You can try this project with other types of CNC machines, even manual Routers or manual saw, as I did on this video: https://youtu.be/gxkcffQD3eQ, but the important thing is that you share what you do and help this community to grow!!!\n\nShare your ideas and comments!",
"images": [
{
"contentType": "image/jpeg",
"timeCreated": "2021-04-05T15:09:01.445Z",
"fullPath": "uploads/howtos/038gjWgLjiyYknbEjDeI/IMG_20200605_142311.jpg",
"type": "image/jpeg",
"downloadUrl": "https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2F038gjWgLjiyYknbEjDeI%2FIMG_20200605_142311.jpg?alt=media&token=f94152ff-f923-4054-a3ad-d8ec588856fa",
"size": 124661,
"updated": "2021-04-05T15:09:01.445Z",
"name": "IMG_20200605_142311.jpg"
}
]
}
],
"moderation": "accepted"
}

7
src/model/howto.sh Normal file
View File

@ -0,0 +1,7 @@
kbotd --preferences ./todos-howto.md \
--include=./howto.ts \
--include=./howto.json \
--disable=terminal,git,npm,user,interact,search,email,web \
--disableTools=read_file,read_files,list_files,file_exists,web \
--model=anthropic/claude-3.7-sonnet:thinking

63
src/model/howto.ts Normal file
View File

@ -0,0 +1,63 @@
export interface IHowto {
_createdBy: string
mentions: any[]
_deleted: boolean
fileLink: string
slug: string
_modified: string
previousSlugs: string[]
_created: string
description: string
votedUsefulBy: string[]
creatorCountry: string
total_downloads: number
title: string
time: string
files: any[]
difficulty_level: string
_id: string
tags?: Tags
total_views: number
_contentModifiedTimestamp: string
cover_image: CoverImage
comments: any[]
moderatorFeedback: string
steps: Step[]
moderation: string
}
export interface Tags {
[key: string]: boolean
}
export interface CoverImage {
name: string
downloadUrl: string
type: string
fullPath: string
updated: string
size: number
timeCreated: string
contentType: string
}
export interface Step {
title: string
text: string
images: Image[]
_animationKey: string
}
export interface Image {
updated: string
size: number
fullPath: string
timeCreated: string
name: string
downloadUrl: string
contentType: string
type: string
}

15
src/model/todos-howto.md Normal file
View File

@ -0,0 +1,15 @@
## Todos
- skip checked
- for Astro, tailwind
- no react or additional dependencies
- for images, use import { Gallery } from "@polymech/astro-base", eg: <Gallery images={item.assets.gallery} /> whereby image:src,alt. Single images are handled there as well
- for single images, use import { Img } from 'imagetools/components', <Img src="..."> wherby classes can be added as follows:
attributes={{
img: { class: "classes ..." }
}}
- IHowto: import { IHowto } from "@/model/howto.js"
- For text, use <Translate>{text}</Translate> (import { i18n as Translate } from "@polymech/astro-base")
- use default sample data if needed
- [ ] create minimal Astro component for the given interface ("IHowto") and sample data ../components/libary/howto.astro

View File

@ -0,0 +1,31 @@
---
import path from "node:path"
import BaseLayout from "@/layouts/BaseLayout.astro"
import Wrapper from "@/components/containers/Wrapper.astro"
import { Img, Picture } from "imagetools/components"
import { getCollection } from "astro:content"
import KBot from "@/components/polymech/kbot.astro"
import Image from "@/components/polymech/image.astro"
const locale = Astro.currentLocale
const store = `${locale}/store/`
const src = `./public/products/overview-3.jpg`
const abs = path.resolve(src)
---
<BaseLayout>
<Wrapper variant="standard" class="py-4">
<section>
<div class="py-2 space-y-2">
<div class="grid md:grid-cols-1 lg:grid-cols-1 gap-4" >
<Image src={abs}
alt="Overview"
sizes={"(min-width: 1024px) 1024px, 1024vw"}
format={"png"}
breakpoints={[800,1200]}
/>
</div>
</div>
</section>
</Wrapper
></BaseLayout
>

View File

@ -0,0 +1,7 @@
---
import { foo, i18n as Translate } from "@polymech/astro-base"
import Howto from "@/components/library/howto.astro"
import test from "@/model/howto.json"
---
<Translate language="es">Hallo</Translate>
<Howto howto={test} />

27
src/pages/tests/map.astro Normal file
View File

@ -0,0 +1,27 @@
---
import BaseLayout from "@/layouts/BaseLayout.astro"
import Wrapper from "@/components/containers/Wrapper.astro"
import { getCollection } from "astro:content"
import KBot from "@/components/polymech/kbot.astro"
const locale = Astro.currentLocale
const store = `${locale}/store/`
import Map from "@/components/polymech/map.astro"
const mapOptions = {
zoom: 9,
api_key: "AIzaSyCHsscCXksisHKMnUihOxl2X1mKny-qrqk"
}
---
<BaseLayout>
<Wrapper variant="standard" class="py-4">
<section>
<div class="py-2 space-y-2">
<Map options={mapOptions} />
</div>
</section>
</Wrapper
></BaseLayout
>

View File

@ -0,0 +1,38 @@
---
import BaseLayout from "@/layouts/BaseLayout.astro";
import Wrapper from "@/components/containers/Wrapper.astro";
import { getCollection } from "astro:content";
import KBot from "@/components/polymech/kbot.astro";
const allProducts = await getCollection("store");
const locale = Astro.currentLocale
const store = `${locale}/store/`
---
<BaseLayout>
<Wrapper variant="standard" class="py-4">
<section>
<div class="py-2 space-y-2">
<div class="grid md:grid-cols-1 lg:grid-cols-1 gap-4" >
<KBot template="research" filters="code" cache dst="./temp/software.md">
Summarize the following packages, as markdown, add a table
https://git.polymech.io/osr-plastic/osr-cad
https://git.polymech.io/osr-plastic/osr-code-bot
</KBot>
<KBot template="research" filters="code" cache dst="./temp/forum.md">
Top posts, as markdown, add a table, with links and image preview
https://forum.osr-plastic.org/
</KBot>
<KBot template="research" filters="code" cache dst="./temp/kbot.md">
Short summary, as markdown
https://www.npmjs.com/package/@plastichub/kbot
</KBot>
</div>
</div>
</section>
</Wrapper
></BaseLayout
>