codeply-cli 0.5.5 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/THIRD_PARTY_NOTICES.md +65 -65
- package/bin/codeply.js +8 -3
- package/lib/agent.mjs +2596 -2268
- package/lib/ai.js +135 -27
- package/lib/ai.mjs +6 -6
- package/lib/apply-patch.js +217 -217
- package/lib/arity-table.json +138 -138
- package/lib/arity.js +70 -70
- package/lib/auth.mjs +6 -6
- package/lib/autopilot.js +84 -0
- package/lib/bot-mail.js +46 -0
- package/lib/bots.js +142 -15
- package/lib/brain.js +914 -0
- package/lib/call-assist.js +120 -0
- package/lib/chatgpt.js +282 -282
- package/lib/cloud-browser.mjs +143 -143
- package/lib/cloud.mjs +1396 -1312
- package/lib/commands.js +103 -103
- package/lib/computer.js +136 -0
- package/lib/design-library/assemble-artifact.mjs +21 -21
- package/lib/design-library/cleanup.mjs +45 -45
- package/lib/design-library/index.json +22379 -22379
- package/lib/design-library/make-table-data.mjs +39 -39
- package/lib/design-tools.mjs +173 -0
- package/lib/diagnostics.js +192 -192
- package/lib/dsh-acp.mjs +444 -0
- package/lib/edit-engine.js +364 -364
- package/lib/github-agent.mjs +326 -326
- package/lib/handoff.mjs +245 -0
- package/lib/history.js +78 -75
- package/lib/life-sources.js +319 -0
- package/lib/life-store.js +356 -0
- package/lib/life-triggers.js +286 -0
- package/lib/life.js +487 -0
- package/lib/mail-watch.js +3 -3
- package/lib/mcp.js +258 -258
- package/lib/native-tools.mjs +17 -5
- package/lib/oauth-connectors.js +76 -21
- package/lib/permissions.js +109 -109
- package/lib/plugins.js +356 -353
- package/lib/reach.js +67 -67
- package/lib/render-md.mjs +647 -617
- package/lib/screen.js +77 -0
- package/lib/server.mjs +458 -457
- package/lib/session-db.js +220 -220
- package/lib/share.js +208 -168
- package/lib/skills.js +4 -1
- package/lib/snapshot.js +146 -146
- package/lib/subagents.js +4 -2
- package/lib/telemetry.js +105 -105
- package/lib/terminal-hints.js +154 -154
- package/lib/textarea.mjs +264 -258
- package/lib/tools.mjs +326 -40
- package/lib/tui.mjs +1459 -1086
- package/lib/typecheck-worker.js +147 -147
- package/lib/web-tools.js +209 -209
- package/package.json +1 -1
- package/skills/SOURCE.md +58 -58
- package/skills/accessibility/SKILL.md +147 -147
- package/skills/agent-architecture-audit/SKILL.md +257 -257
- package/skills/agent-eval/SKILL.md +147 -147
- package/skills/agent-harness-construction/SKILL.md +74 -74
- package/skills/agent-introspection-debugging/SKILL.md +154 -154
- package/skills/agent-payment-x402/SKILL.md +225 -225
- package/skills/agent-self-evaluation/SKILL.md +182 -182
- package/skills/agent-self-evaluation/references/evaluation-criteria.md +71 -71
- package/skills/agent-self-evaluation/references/hook-integration.md +64 -64
- package/skills/agent-sort/SKILL.md +216 -216
- package/skills/agentic-engineering/SKILL.md +64 -64
- package/skills/agentic-os/SKILL.md +388 -388
- package/skills/ai-first-engineering/SKILL.md +52 -52
- package/skills/ai-regression-testing/SKILL.md +386 -386
- package/skills/android-clean-architecture/SKILL.md +340 -340
- package/skills/angular-developer/SKILL.md +155 -155
- package/skills/angular-developer/references/angular-animations.md +160 -160
- package/skills/angular-developer/references/angular-aria.md +410 -410
- package/skills/angular-developer/references/cli.md +86 -86
- package/skills/angular-developer/references/component-harnesses.md +59 -59
- package/skills/angular-developer/references/component-styling.md +91 -91
- package/skills/angular-developer/references/components.md +117 -117
- package/skills/angular-developer/references/creating-services.md +97 -97
- package/skills/angular-developer/references/data-resolvers.md +69 -69
- package/skills/angular-developer/references/define-routes.md +67 -67
- package/skills/angular-developer/references/defining-providers.md +72 -72
- package/skills/angular-developer/references/di-fundamentals.md +120 -120
- package/skills/angular-developer/references/e2e-testing.md +56 -56
- package/skills/angular-developer/references/effects.md +83 -83
- package/skills/angular-developer/references/hierarchical-injectors.md +43 -43
- package/skills/angular-developer/references/host-elements.md +80 -80
- package/skills/angular-developer/references/injection-context.md +63 -63
- package/skills/angular-developer/references/inputs.md +101 -101
- package/skills/angular-developer/references/linked-signal.md +59 -59
- package/skills/angular-developer/references/loading-strategies.md +61 -61
- package/skills/angular-developer/references/mcp.md +108 -108
- package/skills/angular-developer/references/navigate-to-routes.md +69 -69
- package/skills/angular-developer/references/outputs.md +86 -86
- package/skills/angular-developer/references/reactive-forms.md +122 -122
- package/skills/angular-developer/references/rendering-strategies.md +44 -44
- package/skills/angular-developer/references/resource.md +77 -77
- package/skills/angular-developer/references/route-animations.md +56 -56
- package/skills/angular-developer/references/route-guards.md +52 -52
- package/skills/angular-developer/references/router-lifecycle.md +45 -45
- package/skills/angular-developer/references/router-testing.md +87 -87
- package/skills/angular-developer/references/show-routes-with-outlets.md +68 -68
- package/skills/angular-developer/references/signal-forms.md +795 -795
- package/skills/angular-developer/references/signals-overview.md +94 -94
- package/skills/angular-developer/references/tailwind-css.md +69 -69
- package/skills/angular-developer/references/template-driven-forms.md +114 -114
- package/skills/angular-developer/references/testing-fundamentals.md +65 -65
- package/skills/api-connector-builder/SKILL.md +121 -121
- package/skills/api-design/SKILL.md +524 -524
- package/skills/architecture-decision-records/SKILL.md +180 -180
- package/skills/article-writing/SKILL.md +80 -80
- package/skills/automation-audit-ops/SKILL.md +143 -143
- package/skills/autonomous-agent-harness/SKILL.md +274 -274
- package/skills/autonomous-loops/SKILL.md +611 -611
- package/skills/backend-patterns/SKILL.md +562 -562
- package/skills/benchmark/SKILL.md +95 -95
- package/skills/benchmark-methodology/SKILL.md +191 -191
- package/skills/benchmark-optimization-loop/SKILL.md +71 -71
- package/skills/blender-motion-state-inspection/SKILL.md +165 -165
- package/skills/blueprint/SKILL.md +106 -106
- package/skills/brand-discovery/SKILL.md +145 -145
- package/skills/brand-discovery/references/10_purpose-why.md +40 -40
- package/skills/brand-discovery/references/20_positioning.md +44 -44
- package/skills/brand-discovery/references/30_audience-niche.md +52 -52
- package/skills/brand-discovery/references/40_personality-archetype.md +57 -57
- package/skills/brand-discovery/references/50_voice-tone.md +59 -59
- package/skills/brand-discovery/references/60_narrative-story.md +50 -50
- package/skills/brand-discovery/references/70_founder-tension.md +49 -49
- package/skills/brand-discovery/references/90_SYNTHESIS.md +133 -133
- package/skills/brand-voice/SKILL.md +98 -98
- package/skills/brand-voice/references/voice-profile-schema.md +55 -55
- package/skills/browser-qa/SKILL.md +105 -105
- package/skills/bun-runtime/SKILL.md +85 -85
- package/skills/canary-watch/SKILL.md +108 -108
- package/skills/carrier-relationship-management/SKILL.md +212 -212
- package/skills/cisco-ios-patterns/SKILL.md +164 -164
- package/skills/ck/SKILL.md +148 -148
- package/skills/claude-devfleet/SKILL.md +112 -112
- package/skills/click-path-audit/SKILL.md +245 -245
- package/skills/clickhouse-io/SKILL.md +445 -445
- package/skills/code-tour/SKILL.md +254 -254
- package/skills/codebase-onboarding/SKILL.md +234 -234
- package/skills/codehealth-mcp/SKILL.md +167 -167
- package/skills/codeply-taste/LICENSE +21 -0
- package/skills/codeply-taste/SKILL.md +100 -0
- package/skills/codeply-taste/SOURCE.md +10 -0
- package/skills/codeply-taste/assets/base.css +100 -0
- package/skills/codeply-taste/assets/base.js +37 -0
- package/skills/codeply-taste/library/directions.json +1078 -0
- package/skills/codeply-taste/library/heroes.json +894 -0
- package/skills/codeply-taste/library/motions.json +57 -0
- package/skills/codeply-taste/library/palettes.json +1485 -0
- package/skills/codeply-taste/library/photos.json +7240 -0
- package/skills/codeply-taste/library/sections.json +4136 -0
- package/skills/codeply-taste/library/sites.json +7274 -0
- package/skills/codeply-taste/library/type.json +2024 -0
- package/skills/codeply-taste/references/colour.md +141 -0
- package/skills/codeply-taste/references/copy.md +177 -0
- package/skills/codeply-taste/references/critique.md +171 -0
- package/skills/codeply-taste/references/imagery.md +377 -0
- package/skills/codeply-taste/references/layout.md +178 -0
- package/skills/codeply-taste/references/motion.md +292 -0
- package/skills/codeply-taste/references/research.md +306 -0
- package/skills/codeply-taste/references/tells.md +115 -0
- package/skills/codeply-taste/references/type.md +170 -0
- package/skills/codeply-taste/scripts/assets.mjs +865 -0
- package/skills/codeply-taste/scripts/draw.mjs +525 -0
- package/skills/codeply-taste/scripts/inspect.mjs +205 -0
- package/skills/codeply-taste/scripts/lib/cdp.mjs +205 -0
- package/skills/codeply-taste/scripts/lib/probe.mjs +569 -0
- package/skills/codeply-taste/scripts/lib/rules.mjs +137 -0
- package/skills/codeply-taste/scripts/lint.mjs +108 -0
- package/skills/coding-standards/SKILL.md +551 -551
- package/skills/competitive-platform-analysis/SKILL.md +214 -214
- package/skills/competitive-report-structure/SKILL.md +162 -162
- package/skills/compose-multiplatform-patterns/SKILL.md +300 -300
- package/skills/config-gc/SKILL.md +120 -120
- package/skills/configure-ecc/SKILL.md +385 -385
- package/skills/connections-optimizer/SKILL.md +190 -190
- package/skills/content-engine/SKILL.md +132 -132
- package/skills/content-hash-cache-pattern/SKILL.md +162 -162
- package/skills/context-budget/SKILL.md +136 -136
- package/skills/continuous-agent-loop/SKILL.md +46 -46
- package/skills/continuous-learning/SKILL.md +132 -132
- package/skills/continuous-learning-v2/SKILL.md +361 -361
- package/skills/contract-first/SKILL.md +287 -287
- package/skills/cost-aware-llm-pipeline/SKILL.md +184 -184
- package/skills/cost-tracking/SKILL.md +97 -97
- package/skills/council/SKILL.md +204 -204
- package/skills/cpp-coding-standards/SKILL.md +724 -724
- package/skills/cpp-testing/SKILL.md +325 -325
- package/skills/crosspost/SKILL.md +112 -112
- package/skills/csharp-testing/SKILL.md +322 -322
- package/skills/customer-billing-ops/SKILL.md +141 -141
- package/skills/customs-trade-compliance/SKILL.md +263 -263
- package/skills/dart-flutter-patterns/SKILL.md +564 -564
- package/skills/dashboard-builder/SKILL.md +109 -109
- package/skills/data-scraper-agent/SKILL.md +765 -765
- package/skills/data-throughput-accelerator/SKILL.md +74 -74
- package/skills/database-migrations/SKILL.md +430 -430
- package/skills/deep-research/SKILL.md +160 -160
- package/skills/defi-amm-security/SKILL.md +167 -167
- package/skills/delivery-gate/SKILL.md +126 -126
- package/skills/deployment-patterns/SKILL.md +428 -428
- package/skills/design-system/SKILL.md +83 -83
- package/skills/django-celery/SKILL.md +458 -458
- package/skills/django-patterns/SKILL.md +735 -735
- package/skills/django-security/SKILL.md +644 -644
- package/skills/django-tdd/SKILL.md +730 -730
- package/skills/django-verification/SKILL.md +470 -470
- package/skills/dmux-workflows/SKILL.md +192 -192
- package/skills/docker-patterns/SKILL.md +365 -365
- package/skills/documentation-lookup/SKILL.md +91 -91
- package/skills/dotnet-patterns/SKILL.md +322 -322
- package/skills/dynamic-workflow-mode/SKILL.md +124 -124
- package/skills/e2e-testing/SKILL.md +327 -327
- package/skills/ecc-guide/SKILL.md +190 -190
- package/skills/ecc-recipes/SKILL.md +149 -149
- package/skills/ecc-tools-cost-audit/SKILL.md +161 -161
- package/skills/email-ops/SKILL.md +122 -122
- package/skills/energy-procurement/SKILL.md +228 -228
- package/skills/enterprise-agent-ops/SKILL.md +51 -51
- package/skills/error-handling/SKILL.md +377 -377
- package/skills/eval-harness/SKILL.md +271 -271
- package/skills/evm-token-decimals/SKILL.md +131 -131
- package/skills/exa-search/SKILL.md +108 -108
- package/skills/fal-ai-media/SKILL.md +289 -289
- package/skills/fastapi-patterns/SKILL.md +514 -514
- package/skills/finance-billing-ops/SKILL.md +128 -128
- package/skills/flox-environments/SKILL.md +497 -497
- package/skills/flutter-dart-code-review/SKILL.md +436 -436
- package/skills/foundation-models-on-device/SKILL.md +243 -243
- package/skills/frontend-a11y/SKILL.md +446 -446
- package/skills/frontend-design-direction/SKILL.md +93 -93
- package/skills/frontend-patterns/SKILL.md +657 -657
- package/skills/frontend-slides/SKILL.md +185 -185
- package/skills/fsharp-testing/SKILL.md +281 -281
- package/skills/gan-style-harness/SKILL.md +279 -279
- package/skills/gateguard/SKILL.md +133 -133
- package/skills/generating-python-installer/SKILL.md +820 -820
- package/skills/git-workflow/SKILL.md +716 -716
- package/skills/github-ops/SKILL.md +145 -145
- package/skills/golang-patterns/SKILL.md +676 -676
- package/skills/golang-testing/SKILL.md +721 -721
- package/skills/google-workspace-ops/SKILL.md +96 -96
- package/skills/growth-log/SKILL.md +128 -128
- package/skills/healthcare-cdss-patterns/SKILL.md +246 -246
- package/skills/healthcare-emr-patterns/SKILL.md +160 -160
- package/skills/healthcare-eval-harness/SKILL.md +208 -208
- package/skills/healthcare-phi-compliance/SKILL.md +146 -146
- package/skills/hermes-imports/SKILL.md +89 -89
- package/skills/hexagonal-architecture/SKILL.md +277 -277
- package/skills/hipaa-compliance/SKILL.md +79 -79
- package/skills/homelab-network-readiness/SKILL.md +170 -170
- package/skills/homelab-network-setup/SKILL.md +130 -130
- package/skills/homelab-pihole-dns/SKILL.md +275 -275
- package/skills/homelab-vlan-segmentation/SKILL.md +312 -312
- package/skills/homelab-wireguard-vpn/SKILL.md +306 -306
- package/skills/hookify-rules/SKILL.md +128 -128
- package/skills/inherit-legacy-style/SKILL.md +157 -157
- package/skills/intent-driven-development/SKILL.md +360 -360
- package/skills/inventory-demand-planning/SKILL.md +247 -247
- package/skills/investor-materials/SKILL.md +97 -97
- package/skills/investor-outreach/SKILL.md +92 -92
- package/skills/ios-icon-gen/SKILL.md +158 -158
- package/skills/iterative-retrieval/SKILL.md +212 -212
- package/skills/ito-basket-compare/SKILL.md +64 -64
- package/skills/ito-compute/SKILL.md +129 -129
- package/skills/ito-data-atlas-agent/SKILL.md +64 -64
- package/skills/ito-market-intelligence/SKILL.md +61 -61
- package/skills/ito-trade-planner/SKILL.md +68 -68
- package/skills/java-coding-standards/SKILL.md +384 -384
- package/skills/jira-integration/SKILL.md +303 -303
- package/skills/jpa-patterns/SKILL.md +152 -152
- package/skills/knowledge-ops/SKILL.md +155 -155
- package/skills/kotlin-coroutines-flows/SKILL.md +285 -285
- package/skills/kotlin-exposed-patterns/SKILL.md +720 -720
- package/skills/kotlin-ktor-patterns/SKILL.md +690 -690
- package/skills/kotlin-patterns/SKILL.md +712 -712
- package/skills/kotlin-testing/SKILL.md +825 -825
- package/skills/kubernetes-patterns/SKILL.md +756 -756
- package/skills/laravel-patterns/SKILL.md +416 -416
- package/skills/laravel-plugin-discovery/SKILL.md +230 -230
- package/skills/laravel-security/SKILL.md +948 -948
- package/skills/laravel-tdd/SKILL.md +675 -675
- package/skills/laravel-verification/SKILL.md +180 -180
- package/skills/latency-critical-systems/SKILL.md +75 -75
- package/skills/lead-intelligence/SKILL.md +322 -322
- package/skills/liquid-glass-design/SKILL.md +279 -279
- package/skills/llm-trading-agent-security/SKILL.md +147 -147
- package/skills/logistics-exception-management/SKILL.md +222 -222
- package/skills/loop-design-check/SKILL.md +143 -143
- package/skills/mailtrap-email-integration/SKILL.md +77 -77
- package/skills/make-interfaces-feel-better/SKILL.md +152 -152
- package/skills/manim-video/SKILL.md +90 -90
- package/skills/market-research/SKILL.md +76 -76
- package/skills/marketing-campaign/SKILL.md +114 -114
- package/skills/mcp-server-patterns/SKILL.md +70 -70
- package/skills/messages-ops/SKILL.md +105 -105
- package/skills/ml-adoption-playbook/SKILL.md +57 -57
- package/skills/mle-workflow/SKILL.md +348 -348
- package/skills/motion-advanced/SKILL.md +596 -596
- package/skills/motion-foundations/SKILL.md +299 -299
- package/skills/motion-patterns/SKILL.md +434 -434
- package/skills/motion-ui/SKILL.md +576 -576
- package/skills/mysql-patterns/SKILL.md +413 -413
- package/skills/nanoclaw-repl/SKILL.md +34 -34
- package/skills/nestjs-patterns/SKILL.md +231 -231
- package/skills/netmiko-ssh-automation/SKILL.md +174 -174
- package/skills/network-bgp-diagnostics/SKILL.md +168 -168
- package/skills/network-config-validation/SKILL.md +211 -211
- package/skills/network-interface-health/SKILL.md +153 -153
- package/skills/nextjs-turbopack/SKILL.md +58 -58
- package/skills/nodejs-keccak256/SKILL.md +103 -103
- package/skills/nutrient-document-processing/SKILL.md +168 -168
- package/skills/nuxt4-patterns/SKILL.md +101 -101
- package/skills/openclaw-persona-forge/SKILL.md +289 -289
- package/skills/openclaw-persona-forge/references/avatar-style.md +124 -124
- package/skills/openclaw-persona-forge/references/boundary-rules.md +53 -53
- package/skills/openclaw-persona-forge/references/error-handling.md +53 -53
- package/skills/openclaw-persona-forge/references/identity-tension.md +48 -48
- package/skills/openclaw-persona-forge/references/naming-system.md +39 -39
- package/skills/openclaw-persona-forge/references/output-template.md +166 -166
- package/skills/opensource-pipeline/SKILL.md +256 -256
- package/skills/orch-add-feature/SKILL.md +45 -45
- package/skills/orch-build-mvp/SKILL.md +49 -49
- package/skills/orch-change-feature/SKILL.md +43 -43
- package/skills/orch-fix-defect/SKILL.md +43 -43
- package/skills/orch-pipeline/SKILL.md +121 -121
- package/skills/orch-refine-code/SKILL.md +44 -44
- package/skills/parallel-execution-optimizer/SKILL.md +74 -74
- package/skills/perl-patterns/SKILL.md +505 -505
- package/skills/perl-security/SKILL.md +504 -504
- package/skills/perl-testing/SKILL.md +476 -476
- package/skills/plan-canvas/SKILL.md +153 -153
- package/skills/plan-orchestrate/SKILL.md +263 -263
- package/skills/plankton-code-quality/SKILL.md +237 -237
- package/skills/postgres-patterns/SKILL.md +148 -148
- package/skills/prediction-market-oracle-research/SKILL.md +64 -64
- package/skills/prediction-market-risk-review/SKILL.md +61 -61
- package/skills/premium-web-design/SKILL.md +154 -154
- package/skills/prisma-patterns/SKILL.md +401 -401
- package/skills/product-capability/SKILL.md +142 -142
- package/skills/product-lens/SKILL.md +93 -93
- package/skills/production-audit/SKILL.md +207 -207
- package/skills/production-scheduling/SKILL.md +238 -238
- package/skills/project-flow-ops/SKILL.md +112 -112
- package/skills/prompt-optimizer/SKILL.md +398 -398
- package/skills/python-patterns/SKILL.md +751 -751
- package/skills/python-testing/SKILL.md +817 -817
- package/skills/pytorch-patterns/SKILL.md +397 -397
- package/skills/quality-nonconformance/SKILL.md +260 -260
- package/skills/quarkus-patterns/SKILL.md +723 -723
- package/skills/quarkus-security/SKILL.md +468 -468
- package/skills/quarkus-tdd/SKILL.md +812 -812
- package/skills/quarkus-verification/SKILL.md +480 -480
- package/skills/ralphinho-rfc-pipeline/SKILL.md +68 -68
- package/skills/react-native-patterns/SKILL.md +326 -326
- package/skills/react-patterns/SKILL.md +342 -342
- package/skills/react-performance/SKILL.md +575 -575
- package/skills/react-testing/SKILL.md +424 -424
- package/skills/recsys-pipeline-architect/SKILL.md +115 -115
- package/skills/recursive-decision-ledger/SKILL.md +81 -81
- package/skills/redis-patterns/SKILL.md +404 -404
- package/skills/regex-vs-llm-structured-text/SKILL.md +221 -221
- package/skills/remotion-video-creation/SKILL.md +43 -43
- package/skills/repo-scan/SKILL.md +79 -79
- package/skills/research-ops/SKILL.md +113 -113
- package/skills/returns-reverse-logistics/SKILL.md +240 -240
- package/skills/rules-distill/SKILL.md +265 -265
- package/skills/rust-patterns/SKILL.md +500 -500
- package/skills/rust-testing/SKILL.md +501 -501
- package/skills/safety-guard/SKILL.md +76 -76
- package/skills/santa-method/SKILL.md +307 -307
- package/skills/scientific-db-pubmed-database/SKILL.md +176 -176
- package/skills/scientific-db-uspto-database/SKILL.md +178 -178
- package/skills/scientific-pkg-gget/SKILL.md +167 -167
- package/skills/scientific-thinking-literature-review/SKILL.md +193 -193
- package/skills/scientific-thinking-scholar-evaluation/SKILL.md +161 -161
- package/skills/search-first/SKILL.md +183 -183
- package/skills/security-bounty-hunter/SKILL.md +100 -100
- package/skills/security-review/SKILL.md +504 -504
- package/skills/security-scan/SKILL.md +166 -166
- package/skills/seo/SKILL.md +155 -155
- package/skills/skill-comply/SKILL.md +59 -59
- package/skills/skill-scout/SKILL.md +141 -141
- package/skills/skill-stocktake/SKILL.md +195 -195
- package/skills/social-graph-ranker/SKILL.md +155 -155
- package/skills/social-publisher/SKILL.md +130 -130
- package/skills/springboot-patterns/SKILL.md +315 -315
- package/skills/springboot-security/SKILL.md +273 -273
- package/skills/springboot-tdd/SKILL.md +159 -159
- package/skills/springboot-verification/SKILL.md +232 -232
- package/skills/strategic-compact/SKILL.md +142 -142
- package/skills/swift-actor-persistence/SKILL.md +144 -144
- package/skills/swift-concurrency-6-2/SKILL.md +216 -216
- package/skills/swift-protocol-di-testing/SKILL.md +191 -191
- package/skills/swiftui-patterns/SKILL.md +259 -259
- package/skills/taste/SKILL.md +264 -264
- package/skills/taste/references/genre-taxonomy.md +87 -87
- package/skills/tdd-workflow/SKILL.md +583 -583
- package/skills/team-agent-orchestration/SKILL.md +111 -111
- package/skills/team-builder/SKILL.md +169 -169
- package/skills/terminal-ops/SKILL.md +110 -110
- package/skills/tinystruct-patterns/SKILL.md +279 -279
- package/skills/tinystruct-patterns/references/architecture.md +90 -90
- package/skills/tinystruct-patterns/references/data-handling.md +60 -60
- package/skills/tinystruct-patterns/references/database.md +99 -99
- package/skills/tinystruct-patterns/references/routing.md +64 -64
- package/skills/tinystruct-patterns/references/system-usage.md +97 -97
- package/skills/tinystruct-patterns/references/testing.md +72 -72
- package/skills/token-budget-advisor/SKILL.md +134 -134
- package/skills/ui-demo/SKILL.md +466 -466
- package/skills/ui-to-vue/SKILL.md +135 -135
- package/skills/uncloud/SKILL.md +344 -344
- package/skills/unified-memory/SKILL.md +170 -170
- package/skills/unified-notifications-ops/SKILL.md +188 -188
- package/skills/verification-loop/SKILL.md +129 -129
- package/skills/video-editing/SKILL.md +311 -311
- package/skills/videodb/SKILL.md +375 -375
- package/skills/visa-doc-translate/SKILL.md +117 -117
- package/skills/vite-patterns/SKILL.md +450 -450
- package/skills/vue-patterns/SKILL.md +471 -471
- package/skills/windows-desktop-e2e/SKILL.md +888 -888
- package/skills/workspace-surface-audit/SKILL.md +126 -126
- package/skills/x-api/SKILL.md +235 -235
package/lib/ai.js
CHANGED
|
@@ -45,10 +45,13 @@ const RETRY_BACKOFF_MS = [1500, 4000, 9000];
|
|
|
45
45
|
const RETRY_AFTER_CAP_MS = 30000;
|
|
46
46
|
|
|
47
47
|
// Stop must not wait out a backoff: the sleep ends the moment the signal fires.
|
|
48
|
+
// The abort listener is removed when the sleep ends normally, so a long run
|
|
49
|
+
// of retries does not pile listeners onto the run's one signal.
|
|
48
50
|
const sleep = (ms, signal) => new Promise((r) => {
|
|
49
51
|
if (signal?.aborted) return r();
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
+
const onAbort = () => { clearTimeout(t); r(); };
|
|
53
|
+
const t = setTimeout(() => { signal?.removeEventListener('abort', onAbort); r(); }, ms);
|
|
54
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
52
55
|
});
|
|
53
56
|
|
|
54
57
|
/**
|
|
@@ -234,13 +237,18 @@ function isAbortError(e) {
|
|
|
234
237
|
// This gives every attempt a hard ceiling so a stalled request surfaces as a
|
|
235
238
|
// real, retryable error instead of an indefinite silent wait.
|
|
236
239
|
const REQUEST_TIMEOUT_MS = 120_000;
|
|
240
|
+
const ANTHROPIC_TIMEOUT_MS = 300_000;
|
|
237
241
|
|
|
238
242
|
/** Combines the caller's own abort signal (Stop button) with a hard timeout into one signal to hand fetch(). */
|
|
239
243
|
function withTimeout(signal, ms = REQUEST_TIMEOUT_MS) {
|
|
240
244
|
const controller = new AbortController();
|
|
245
|
+
// One listener per request on the run's long-lived signal; cleanup() takes
|
|
246
|
+
// it off again, or a run with many model calls trips Node's
|
|
247
|
+
// MaxListenersExceededWarning (11 abort listeners) and leaks them.
|
|
248
|
+
const onAbort = () => controller.abort();
|
|
241
249
|
if (signal) {
|
|
242
250
|
if (signal.aborted) controller.abort();
|
|
243
|
-
else signal.addEventListener('abort',
|
|
251
|
+
else signal.addEventListener('abort', onAbort, { once: true });
|
|
244
252
|
}
|
|
245
253
|
const timer = setTimeout(() => controller.abort(new Error('timeout')), ms);
|
|
246
254
|
return {
|
|
@@ -249,7 +257,7 @@ function withTimeout(signal, ms = REQUEST_TIMEOUT_MS) {
|
|
|
249
257
|
// user's own Stop - callers use this to report "the request stalled"
|
|
250
258
|
// instead of silently treating a stall as if the user had cancelled it.
|
|
251
259
|
isTimeout: () => controller.signal.reason instanceof Error && controller.signal.reason.message === 'timeout',
|
|
252
|
-
cleanup: () => clearTimeout(timer),
|
|
260
|
+
cleanup: () => { clearTimeout(timer); signal?.removeEventListener('abort', onAbort); },
|
|
253
261
|
};
|
|
254
262
|
}
|
|
255
263
|
|
|
@@ -262,22 +270,25 @@ function withTimeout(signal, ms = REQUEST_TIMEOUT_MS) {
|
|
|
262
270
|
*/
|
|
263
271
|
function withIdleTimeout(signal, ms = REQUEST_TIMEOUT_MS) {
|
|
264
272
|
const controller = new AbortController();
|
|
273
|
+
const onAbort = () => controller.abort();
|
|
265
274
|
if (signal) {
|
|
266
275
|
if (signal.aborted) controller.abort();
|
|
267
|
-
else signal.addEventListener('abort',
|
|
276
|
+
else signal.addEventListener('abort', onAbort, { once: true });
|
|
268
277
|
}
|
|
278
|
+
let done = false;
|
|
269
279
|
let timer = setTimeout(() => controller.abort(new Error('timeout')), ms);
|
|
270
280
|
return {
|
|
271
281
|
signal: controller.signal,
|
|
272
|
-
|
|
282
|
+
// A no-op once cleaned up, so a late chunk cannot restart a timer nobody clears.
|
|
283
|
+
poke: () => { if (done) return; clearTimeout(timer); timer = setTimeout(() => controller.abort(new Error('timeout')), ms); },
|
|
273
284
|
isTimeout: () => controller.signal.reason instanceof Error && controller.signal.reason.message === 'timeout',
|
|
274
|
-
cleanup: () => clearTimeout(timer),
|
|
285
|
+
cleanup: () => { done = true; clearTimeout(timer); signal?.removeEventListener('abort', onAbort); },
|
|
275
286
|
};
|
|
276
287
|
}
|
|
277
288
|
|
|
278
289
|
async function chatViaProxy(messages, opts) {
|
|
279
290
|
const token = await getAccessToken();
|
|
280
|
-
if (!token) return { success: false, error: 'Not signed in. Sign in to use
|
|
291
|
+
if (!token) return { success: false, error: 'Not signed in. Sign in to use Haze 2, or pick one of your own models.' };
|
|
281
292
|
|
|
282
293
|
return withRetries(async () => {
|
|
283
294
|
let res, body;
|
|
@@ -299,6 +310,7 @@ async function chatViaProxy(messages, opts) {
|
|
|
299
310
|
signal,
|
|
300
311
|
});
|
|
301
312
|
body = await res.json().catch(() => ({}));
|
|
313
|
+
if (isTimeout()) return { retryable: true, error: 'The AI proxy stopped sending its answer partway - retrying.' };
|
|
302
314
|
} catch (e) {
|
|
303
315
|
if (isTimeout()) return { retryable: true, error: 'The request timed out with no response from the AI proxy - retrying.' };
|
|
304
316
|
if (isAbortError(e)) return { aborted: true };
|
|
@@ -478,8 +490,11 @@ async function streamingChatRequest({ url, label, model, apiKey, isLocal, messag
|
|
|
478
490
|
const isStream = (res.headers.get('content-type') || '').includes('text/event-stream');
|
|
479
491
|
|
|
480
492
|
if (!isStream) {
|
|
481
|
-
|
|
493
|
+
// The clock keeps guarding the body read: clearing it before res.json()
|
|
494
|
+
// left a server that sent headers and then went quiet hanging forever.
|
|
482
495
|
const body = await res.json().catch(() => ({}));
|
|
496
|
+
cleanup();
|
|
497
|
+
if (isTimeout()) return { retryable: true, error: `${label} stopped sending data mid-response - retrying.` };
|
|
483
498
|
if (res.ok && body.choices?.[0]) {
|
|
484
499
|
return { done: true, value: { success: true, data: body, modelUsed: body.model || model } };
|
|
485
500
|
}
|
|
@@ -516,7 +531,6 @@ async function streamingChatRequest({ url, label, model, apiKey, isLocal, messag
|
|
|
516
531
|
const toolCalls = [];
|
|
517
532
|
try {
|
|
518
533
|
for await (const chunk of res.body) {
|
|
519
|
-
poke(); // a real chunk arrived - the stream is alive, push the stall clock back out
|
|
520
534
|
buffer += Buffer.isBuffer(chunk) ? chunk.toString('utf8') : Buffer.from(chunk).toString('utf8');
|
|
521
535
|
let nlIndex;
|
|
522
536
|
while ((nlIndex = buffer.indexOf('\n')) !== -1) {
|
|
@@ -524,7 +538,12 @@ async function streamingChatRequest({ url, label, model, apiKey, isLocal, messag
|
|
|
524
538
|
buffer = buffer.slice(nlIndex + 1);
|
|
525
539
|
if (!line.startsWith('data:')) continue;
|
|
526
540
|
const payload = line.slice(5).trim();
|
|
527
|
-
if (!payload
|
|
541
|
+
if (!payload) continue;
|
|
542
|
+
// Only real data pushes the stall clock back out. Keep-alive comments
|
|
543
|
+
// (": OPENROUTER PROCESSING") used to count, so an upstream that
|
|
544
|
+
// never answered but kept pinging held the run open forever.
|
|
545
|
+
poke();
|
|
546
|
+
if (payload === '[DONE]') continue;
|
|
528
547
|
let evt;
|
|
529
548
|
try { evt = JSON.parse(payload); } catch { continue; }
|
|
530
549
|
modelUsed = evt.model || modelUsed;
|
|
@@ -663,6 +682,7 @@ async function chatViaOpenAICompatible(messages, opts, providerName, cfg) {
|
|
|
663
682
|
signal,
|
|
664
683
|
});
|
|
665
684
|
body = await res.json().catch(() => ({}));
|
|
685
|
+
if (isTimeout()) return { retryable: true, error: `${label} stopped sending its answer partway - retrying.` };
|
|
666
686
|
} catch (e) {
|
|
667
687
|
if (isTimeout()) return { retryable: true, error: `${label} timed out with no response - retrying.` };
|
|
668
688
|
if (isAbortError(e)) return { aborted: true };
|
|
@@ -793,7 +813,11 @@ async function chatViaAnthropic(messages, opts, cfg) {
|
|
|
793
813
|
}
|
|
794
814
|
|
|
795
815
|
return withRetries(async () => {
|
|
796
|
-
let res;
|
|
816
|
+
let res, body;
|
|
817
|
+
// This call is not streamed, so nothing arrives until the whole answer is
|
|
818
|
+
// ready: a longer ceiling than the others, but a ceiling. Without one a
|
|
819
|
+
// stalled connection here waited forever with no events at all.
|
|
820
|
+
const { signal, isTimeout, cleanup } = withTimeout(opts.signal, ANTHROPIC_TIMEOUT_MS);
|
|
797
821
|
try {
|
|
798
822
|
res = await fetch('https://api.anthropic.com/v1/messages', {
|
|
799
823
|
method: 'POST',
|
|
@@ -810,15 +834,18 @@ async function chatViaAnthropic(messages, opts, cfg) {
|
|
|
810
834
|
...temperatureParam(model, opts),
|
|
811
835
|
...(opts.tools ? { tools: toAnthropicTools(opts.tools) } : {}),
|
|
812
836
|
}),
|
|
813
|
-
signal
|
|
837
|
+
signal,
|
|
814
838
|
});
|
|
839
|
+
body = await res.json().catch(() => ({}));
|
|
840
|
+
if (isTimeout()) return { retryable: true, error: 'Anthropic stopped sending its answer partway - retrying.' };
|
|
815
841
|
} catch (e) {
|
|
842
|
+
if (isTimeout()) return { retryable: true, error: 'Anthropic timed out with no response - retrying.' };
|
|
816
843
|
if (isAbortError(e)) return { aborted: true };
|
|
817
844
|
return { retryable: true, error: e.message };
|
|
845
|
+
} finally {
|
|
846
|
+
cleanup();
|
|
818
847
|
}
|
|
819
848
|
|
|
820
|
-
const body = await res.json().catch(() => ({}));
|
|
821
|
-
|
|
822
849
|
if (res.ok && Array.isArray(body.content)) {
|
|
823
850
|
const text = body.content.filter((b) => b.type === 'text').map((b) => b.text).join('');
|
|
824
851
|
const message = { role: 'assistant', content: text };
|
|
@@ -960,9 +987,10 @@ async function chatViaOllamaNative(messages, opts, m) {
|
|
|
960
987
|
}
|
|
961
988
|
|
|
962
989
|
if (!res.ok) {
|
|
963
|
-
cleanup();
|
|
964
|
-
if (m.research === 'cloud' && (res.status === 401 || res.status === 403)) return { done: true, value: { success: false, error: researchMode().ERR_CLOUD_KEY } };
|
|
990
|
+
if (m.research === 'cloud' && (res.status === 401 || res.status === 403)) { cleanup(); return { done: true, value: { success: false, error: researchMode().ERR_CLOUD_KEY } }; }
|
|
965
991
|
const body = await res.json().catch(() => ({}));
|
|
992
|
+
cleanup();
|
|
993
|
+
if (isTimeout()) return { retryable: true, error: 'Ollama stopped sending data mid-response - retrying.' };
|
|
966
994
|
const msg = body.error || describeStatus(res.status);
|
|
967
995
|
const fatal = res.status === 404 || /not found|pull/i.test(String(msg));
|
|
968
996
|
if (fatal) return { done: true, value: { success: false, error: `Ollama: ${msg}${/not found/i.test(String(msg)) ? ` - run \`ollama pull ${m.model}\` first.` : ''}` } };
|
|
@@ -1223,12 +1251,11 @@ async function testModel(m) {
|
|
|
1223
1251
|
return { ok: true, ms: Date.now() - started, reply: (r.data.choices?.[0]?.message?.content || '').trim().slice(0, 80) };
|
|
1224
1252
|
}
|
|
1225
1253
|
|
|
1226
|
-
// ───
|
|
1227
|
-
//
|
|
1228
|
-
//
|
|
1229
|
-
//
|
|
1230
|
-
//
|
|
1231
|
-
// live. If the router can't be reached at all, Auto falls back to Gemma 4 31B
|
|
1254
|
+
// ─── Haze 2 (route.auto) ──────────────────────────────────────────────
|
|
1255
|
+
// Haze 2 is Codeply's hosted model: a router that picks the model for each
|
|
1256
|
+
// turn on the server, where the keys and the budgets live. The front door is
|
|
1257
|
+
// the Supabase function Codeply-App/supabase/functions/auto. If the router
|
|
1258
|
+
// can't be reached at all, the client falls back to Gemma 4 31B
|
|
1232
1259
|
// on Ollama Cloud directly (two account keys: a release build bakes
|
|
1233
1260
|
// OLLAMA_API_KEY / OLLAMA_API_KEY_FALLBACK in via scripts/embed-secrets.js;
|
|
1234
1261
|
// from source they come from ~/.codeply/config.json), then the hosted proxy.
|
|
@@ -1269,6 +1296,62 @@ function deviceId() {
|
|
|
1269
1296
|
return deviceIdCache;
|
|
1270
1297
|
}
|
|
1271
1298
|
|
|
1299
|
+
// Haze 2 routes once per user turn. Every agent step says which turn it
|
|
1300
|
+
// belongs to (opts.haze, from agent.mjs); the router decides on the first step
|
|
1301
|
+
// and keeps the same model, effort and cache for the rest of the turn. The
|
|
1302
|
+
// router's state comes back with each answer and goes out again with the next
|
|
1303
|
+
// turn of the same chat. Memory only: a restart just starts a fresh state.
|
|
1304
|
+
const hazeStates = new Map(); // chatId -> state
|
|
1305
|
+
function hazeField(h) {
|
|
1306
|
+
if (!h) return {};
|
|
1307
|
+
return {
|
|
1308
|
+
haze: {
|
|
1309
|
+
product: h.product || 'craft',
|
|
1310
|
+
surface: h.surface || 'agent', // 'voice': Haze's fast path for live voice (Haiku, no thinking)
|
|
1311
|
+
turnId: h.turnId,
|
|
1312
|
+
continuation: (h.step || 0) > 0,
|
|
1313
|
+
historyCount: h.historyCount || 0,
|
|
1314
|
+
...(h.screen ? { screen: true } : {}), // this turn carries the user's screen
|
|
1315
|
+
state: hazeStates.get(h.chatId) || undefined,
|
|
1316
|
+
},
|
|
1317
|
+
};
|
|
1318
|
+
}
|
|
1319
|
+
function keepHazeState(h, route) {
|
|
1320
|
+
if (!h || !route || !route.haze || !route.haze.state) return;
|
|
1321
|
+
hazeStates.delete(h.chatId);
|
|
1322
|
+
hazeStates.set(h.chatId, route.haze.state);
|
|
1323
|
+
if (hazeStates.size > 300) hazeStates.delete(hazeStates.keys().next().value);
|
|
1324
|
+
}
|
|
1325
|
+
|
|
1326
|
+
const localClock = (iso) => { try { return new Date(iso).toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' }); } catch { return ''; } };
|
|
1327
|
+
|
|
1328
|
+
// What Haze 2 says about its own limits, once per chat each: answers moved to
|
|
1329
|
+
// lighter models (the day's Claude allowance is used up, or Claude is down),
|
|
1330
|
+
// and a heads-up when the lighter models' 5-hour amount is nearly used.
|
|
1331
|
+
const hazeNoticed = new Map(); // chatId|what -> when it was said
|
|
1332
|
+
function hazeNotice(route, chatId = '') {
|
|
1333
|
+
if (!route) return [];
|
|
1334
|
+
const once = (key, text) => {
|
|
1335
|
+
const k = `${chatId}|${key}`;
|
|
1336
|
+
if (hazeNoticed.has(k)) return '';
|
|
1337
|
+
hazeNoticed.set(k, Date.now());
|
|
1338
|
+
if (hazeNoticed.size > 500) hazeNoticed.delete(hazeNoticed.keys().next().value);
|
|
1339
|
+
return text;
|
|
1340
|
+
};
|
|
1341
|
+
const out = [];
|
|
1342
|
+
const l = route.lighter;
|
|
1343
|
+
if (l && (l.why === 'allowance' || l.why === 'pool')) {
|
|
1344
|
+
out.push(once(`lighter|${l.resetsAt}`, `Using lighter models now: ${l.why === 'pool' ? 'Haze 2 is busy today' : 'today\'s Claude allowance is used up'}. Claude is back at ${localClock(l.resetsAt)}.`));
|
|
1345
|
+
} else if (l && l.why === 'claude-down') {
|
|
1346
|
+
out.push(once(`down|${new Date().toISOString().slice(0, 13)}`, 'Claude isn\'t answering right now, so Haze 2 used lighter models.'));
|
|
1347
|
+
}
|
|
1348
|
+
const f = route.free;
|
|
1349
|
+
if (f && f.limit && f.used >= f.limit * 0.8 && f.resetsAt) {
|
|
1350
|
+
out.push(once(`free80|${f.resetsAt}`, `You've used most of Haze 2's lighter models for now. They reset at ${localClock(f.resetsAt)}.`));
|
|
1351
|
+
}
|
|
1352
|
+
return out.filter(Boolean);
|
|
1353
|
+
}
|
|
1354
|
+
|
|
1272
1355
|
async function chatViaRouter(messages, opts) {
|
|
1273
1356
|
const token = await getAccessToken();
|
|
1274
1357
|
// A cloud run has no sign-in: its usage key (CODEPLY_TRACK_KEY) stands in for the person
|
|
@@ -1286,17 +1369,27 @@ async function chatViaRouter(messages, opts) {
|
|
|
1286
1369
|
messages: wireMessages(messages),
|
|
1287
1370
|
...(opts.tools ? { tools: opts.tools } : {}),
|
|
1288
1371
|
opts: { json: !!opts.json, maxTokens: opts.maxTokens, temperature: opts.temperature },
|
|
1372
|
+
...hazeField(opts.haze),
|
|
1289
1373
|
}),
|
|
1290
1374
|
signal,
|
|
1291
1375
|
});
|
|
1292
1376
|
body = JSON.parse((await res.text()).trim() || '{}');
|
|
1293
1377
|
} catch (e) {
|
|
1294
1378
|
if (isAbortError(e) && !isTimeout()) return { aborted: true };
|
|
1295
|
-
return { retryable: true, error: isTimeout() ? '
|
|
1379
|
+
return { retryable: true, error: isTimeout() ? 'Haze 2 took too long to answer.' : e.message };
|
|
1296
1380
|
} finally {
|
|
1297
1381
|
cleanup();
|
|
1298
1382
|
}
|
|
1299
|
-
if (body.success)
|
|
1383
|
+
if (body.success) {
|
|
1384
|
+
keepHazeState(opts.haze, body.route);
|
|
1385
|
+
return { done: true, value: { success: true, data: body.data, modelUsed: body.modelUsed, route: body.route } };
|
|
1386
|
+
}
|
|
1387
|
+
// Past the lighter models' 5-hour amount: say when it comes back, in the person's own time.
|
|
1388
|
+
if (body.limited) {
|
|
1389
|
+
const at = body.resetsAt ? localClock(body.resetsAt) : '';
|
|
1390
|
+
const error = at ? String(body.error || '').replace(/It resets in [^,.]+/, `It resets at ${at}`) : body.error;
|
|
1391
|
+
return { done: true, value: { success: false, limited: true, resetsAt: body.resetsAt || null, error: error || 'You\'ve reached Haze 2\'s limit for now.' } };
|
|
1392
|
+
}
|
|
1300
1393
|
if (body.error) return { done: true, value: { success: false, error: body.error } };
|
|
1301
1394
|
return { retryable: isTransientStatus(res.status), retryAfterMs: retryAfterMs(res), error: describeStatus(res.status) };
|
|
1302
1395
|
}, opts.signal);
|
|
@@ -1304,7 +1397,8 @@ async function chatViaRouter(messages, opts) {
|
|
|
1304
1397
|
|
|
1305
1398
|
async function chatViaAuto(messages, opts) {
|
|
1306
1399
|
const routed = await chatViaRouter(messages, opts);
|
|
1307
|
-
|
|
1400
|
+
// A limit is an answer, not an outage: no going around it on the direct route.
|
|
1401
|
+
if (routed.success || routed.aborted || routed.limited) return routed;
|
|
1308
1402
|
// The router itself is unreachable or broken: the old direct route still works.
|
|
1309
1403
|
const cfg = getConfig();
|
|
1310
1404
|
const keys = { apiKey: cfg.ollama.apiKey, apiKeyFallback: cfg.ollama.apiKeyFallback };
|
|
@@ -1444,4 +1538,18 @@ async function chatJson(messages, opts = {}) {
|
|
|
1444
1538
|
return { success: true, json: parsed, usage: r.data.usage || {}, modelUsed: r.modelUsed };
|
|
1445
1539
|
}
|
|
1446
1540
|
|
|
1447
|
-
|
|
1541
|
+
/**
|
|
1542
|
+
* Gemma 4 31B on Ollama Cloud, which can see images: what voice mode uses when
|
|
1543
|
+
* Haze 2 is on its free tier (the day's Claude allowance is used up), since
|
|
1544
|
+
* Haze's free model and the hosted proxy are text only.
|
|
1545
|
+
*/
|
|
1546
|
+
async function chatVision(messages, opts = {}) {
|
|
1547
|
+
const cfg = getConfig();
|
|
1548
|
+
const keys = { apiKey: cfg.ollama.apiKey, apiKeyFallback: cfg.ollama.apiKeyFallback };
|
|
1549
|
+
if (!keys.apiKey && !keys.apiKeyFallback) return { success: false, error: 'This build has no Gemma key for screenshots.' };
|
|
1550
|
+
const r = await chatViaOllama(messages, opts, { ollama: { ...AUTO_MODEL, ...keys, numCtx: null } });
|
|
1551
|
+
if (r && r.success && !r.modelUsed) r.modelUsed = AUTO_MODEL.model;
|
|
1552
|
+
return r;
|
|
1553
|
+
}
|
|
1554
|
+
|
|
1555
|
+
module.exports = { chatResearch, chat, chatJson, chatVision, isRateLimitError, listOllamaModels, testModel, chatCompletionsUrl, hazeNotice };
|
package/lib/ai.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { createRequire } from 'module';
|
|
2
|
-
const require = createRequire(import.meta.url);
|
|
3
|
-
|
|
4
|
-
const ai = require('../lib/ai.js');
|
|
5
|
-
export default ai;
|
|
6
|
-
export const { chat, chatJson, isRateLimitError } = ai;
|
|
1
|
+
import { createRequire } from 'module';
|
|
2
|
+
const require = createRequire(import.meta.url);
|
|
3
|
+
|
|
4
|
+
const ai = require('../lib/ai.js');
|
|
5
|
+
export default ai;
|
|
6
|
+
export const { chat, chatJson, isRateLimitError } = ai;
|