codeply-cli 0.5.6 → 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 -1320
- 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/bots.js
CHANGED
|
@@ -56,11 +56,11 @@ const TONES = {
|
|
|
56
56
|
/** What a bot must ask the user before doing. Each maps to engine tools. */
|
|
57
57
|
const APPROVALS = {
|
|
58
58
|
edit_files: { label: 'Editing files', tools: ['write_file', 'edit_file', 'apply_patch', 'fetch_image'] },
|
|
59
|
-
run_commands: { label: 'Running commands', tools: ['run'] },
|
|
60
|
-
send: { label: 'Sending anything (email, Slack)', tools: ['gmail_send', 'slack_post_message'] },
|
|
59
|
+
run_commands: { label: 'Running commands and using your computer', tools: ['run', 'use_computer'] },
|
|
60
|
+
send: { label: 'Sending anything (email, Slack)', tools: ['gmail_send', 'slack_post_message', 'bot_email_send'] },
|
|
61
61
|
publish: { label: 'Deploying or publishing', tools: ['vercel_deploy', 'github_create_repo', 'vercel_api', 'publish_deploy', 'publish_github'] },
|
|
62
62
|
databases: { label: 'Changing databases or cloud projects', tools: ['supabase_create_project', 'supabase_delete_project', 'supabase_api', 'supabase_sql', 'supabase_setup', 'supabase_schema'] },
|
|
63
|
-
calendar: { label: 'Adding to your calendar', tools: ['calendar_add'] },
|
|
63
|
+
calendar: { label: 'Adding to your calendar', tools: ['calendar_add', 'calendar_update'] },
|
|
64
64
|
};
|
|
65
65
|
const ALL_APPROVALS = Object.keys(APPROVALS);
|
|
66
66
|
// The categories bots were saved with before `calendar` existed. A bot saved
|
|
@@ -97,6 +97,54 @@ function normalizeAlwaysOn(a) {
|
|
|
97
97
|
};
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
+
// Autonomy: how much a bot may do. The user picks one of three levels:
|
|
101
|
+
// none Level 1: information and suggestions only. It never edits, runs,
|
|
102
|
+
// sends, publishes or books anything, watched or not; it drafts and
|
|
103
|
+
// tells the user what it would do
|
|
104
|
+
// ask Level 2: it does the work and asks before each action outside its
|
|
105
|
+
// approval boundary (as before)
|
|
106
|
+
// hold Level 2, softer: outward actions (send, publish, databases, calendar)
|
|
107
|
+
// wait holdMinutes in the outbox, where the user can cancel them from
|
|
108
|
+
// the phone or Crew; then go
|
|
109
|
+
// full Level 3: the categories in `allow` run at once
|
|
110
|
+
// Deleting things, anything flagged dangerous and anything a third party asked
|
|
111
|
+
// for always wait for the user, at every level.
|
|
112
|
+
const AUTONOMY = { none: 'Just suggest, never act', ask: 'Ask me first', hold: 'Do it after a wait I can cancel', full: 'Just do it' };
|
|
113
|
+
function normalizeAutonomy(a) {
|
|
114
|
+
a = a && typeof a === 'object' ? a : {};
|
|
115
|
+
const n = (v, d, lo, hi) => { const x = Math.round(Number(v)); return Number.isFinite(x) ? Math.max(lo, Math.min(hi, x)) : d; };
|
|
116
|
+
const b = a.budgets && typeof a.budgets === 'object' ? a.budgets : {};
|
|
117
|
+
return {
|
|
118
|
+
level: AUTONOMY[a.level] ? a.level : 'ask',
|
|
119
|
+
holdMinutes: n(a.holdMinutes, 10, 1, 240),
|
|
120
|
+
allow: (Array.isArray(a.allow) ? a.allow : ['edit_files', 'run_commands']).filter((k) => APPROVALS[k]),
|
|
121
|
+
// Per day, per bot. 0 means never on its own.
|
|
122
|
+
budgets: { runs: n(b.runs, 10, 0, 200), emails: n(b.emails, 10, 0, 200), posts: n(b.posts, 3, 0, 100), deploys: n(b.deploys, 3, 0, 50) },
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// On calls (the call helper in life-desktop.js): how the bot steps in when the user hands a call over.
|
|
127
|
+
const EXCUSE_STYLES = { friendly: 'Warm and casual', formal: 'Polite and formal', brief: 'Short and to the point', playful: 'Light and a bit funny' };
|
|
128
|
+
function normalizeCallStyle(c) {
|
|
129
|
+
c = c && typeof c === 'object' ? c : {};
|
|
130
|
+
return {
|
|
131
|
+
style: EXCUSE_STYLES[c.style] ? c.style : 'friendly',
|
|
132
|
+
// Excuses the user approved. The bot picks one that fits; with none it says the user had to step away.
|
|
133
|
+
excuses: (Array.isArray(c.excuses) ? c.excuses : []).filter((x) => typeof x === 'string' && x.trim()).map((x) => clip(x.trim(), 200)).slice(0, 8),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// The bot's own email address (bot-mail on Codeply's server, sent through Resend).
|
|
138
|
+
const BOT_ADDRESS = /^[a-z0-9][a-z0-9._-]{0,40}@[a-z0-9.-]+\.[a-z]{2,}$/i;
|
|
139
|
+
function normalizeEmail(e) {
|
|
140
|
+
e = e && typeof e === 'object' ? e : {};
|
|
141
|
+
const address = BOT_ADDRESS.test(String(e.address || '')) ? String(e.address).toLowerCase() : '';
|
|
142
|
+
return { address, on: !!(address && e.on !== false) };
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const lifeLib = () => require('./life.js');
|
|
146
|
+
const brainLib = () => require('./brain.js');
|
|
147
|
+
|
|
100
148
|
// Kept in sync with bot-avatar.js (the renderer). The engine only validates.
|
|
101
149
|
const AVATAR_KEYS = {
|
|
102
150
|
shape: ['burst9', 'burst7', 'burst12', 'flower', 'cloud', 'star', 'squircle', 'pebble', 'drop'],
|
|
@@ -239,6 +287,13 @@ function normalizeBot(input, existing) {
|
|
|
239
287
|
// The voice it speaks with on calls (a Deepgram, Edge or Kokoro voice id; '' = pick one).
|
|
240
288
|
voice: typeof b.voice === 'string' && /^[\w.-]{0,80}$/.test(b.voice) ? b.voice : '',
|
|
241
289
|
alwaysOn: normalizeAlwaysOn(b.alwaysOn),
|
|
290
|
+
// What it may read of the user's life context (life.js), and which nudges it sends.
|
|
291
|
+
life: lifeLib().normalizeLife(b.life),
|
|
292
|
+
autonomy: normalizeAutonomy(b.autonomy),
|
|
293
|
+
callStyle: normalizeCallStyle(b.callStyle),
|
|
294
|
+
email: normalizeEmail(b.email),
|
|
295
|
+
// The jobs it takes handoffs for (brain.js DOMAINS); empty = read from its specialty.
|
|
296
|
+
handles: (Array.isArray(b.handles) ? [...new Set(b.handles)] : []).filter((d) => brainLib().DOMAINS[d]).slice(0, 6),
|
|
242
297
|
memory: cleanMemory(b.memory),
|
|
243
298
|
// Experience (learned on the job, see reflectOnRun): lessons, playbooks, tool tips, open threads.
|
|
244
299
|
lessons: cleanLessons(b.lessons),
|
|
@@ -383,6 +438,10 @@ async function learnFromTurn(bot, userText, replyText, chatFn) {
|
|
|
383
438
|
const user = clip(userText, 3000);
|
|
384
439
|
if (!user) return { added: [] };
|
|
385
440
|
const known = (bot.memory || []).slice(-30).map((m) => `- ${m.fact}`).join('\n') || '(nothing yet)';
|
|
441
|
+
// Plans the user mentions go to the shared life context (life.js), from the same model call.
|
|
442
|
+
const life = lifeLib().available() && lifeLib().allowedFor(bot).has('plans') ? lifeLib() : null;
|
|
443
|
+
// And what is worth knowing in every app goes to the shared brain (brain.js), from the same call too.
|
|
444
|
+
const brain = brainLib().available() ? brainLib() : null;
|
|
386
445
|
const prompt = `You keep the long-term memory of an assistant called ${bot.name}${bot.specialty ? ` (${bot.specialty})` : ''}.
|
|
387
446
|
From the exchange below, pick at most ${MAX_FACTS_PER_TURN} durable things worth remembering for future conversations: the user's preferences, decisions, standing instructions, facts about them or their project, or feedback on how ${bot.name} should work.
|
|
388
447
|
Skip anything one-off, temporary, obvious, or already known. Never store passwords, keys or other secrets. Each item is one short sentence about the user or the work, written in the third person ("The user prefers ...").
|
|
@@ -393,18 +452,24 @@ ${known}
|
|
|
393
452
|
User: ${user}
|
|
394
453
|
|
|
395
454
|
${bot.name}: ${clip(replyText, 3000) || '(no reply)'}
|
|
396
|
-
|
|
397
|
-
Respond with ONLY a JSON object {"facts": ["..."]}. Use an empty list when nothing is worth keeping.`;
|
|
455
|
+
${life ? `\n${life.plansAsk()}\n` : ''}${brain ? `\n${brain.observationsAsk()}\n` : ''}
|
|
456
|
+
Respond with ONLY a JSON object {"facts": ["..."]${life ? ', "plans": []' : ''}${brain ? ', "observations": []' : ''}}. Use an empty list when nothing is worth keeping.`;
|
|
398
457
|
const r = await chatFn([{ role: 'user', content: prompt }]);
|
|
399
458
|
if (!r || !r.success || !r.json) return { added: [] };
|
|
459
|
+
if (life && Array.isArray(r.json.plans) && r.json.plans.length) { try { life.notePlans(r.json.plans, { source: 'chat', botId: bot.id }); } catch {} }
|
|
460
|
+
let brainNotes = [];
|
|
461
|
+
if (brain && Array.isArray(r.json.observations) && r.json.observations.length) {
|
|
462
|
+
// The product (Crew or Craft) comes from the running one (telemetry.js).
|
|
463
|
+
try { brainNotes = brain.noteObservations(r.json.observations, { botId: bot.id, botName: bot.name }); } catch {}
|
|
464
|
+
}
|
|
400
465
|
const facts = (Array.isArray(r.json.facts) ? r.json.facts : [])
|
|
401
466
|
.filter((f) => typeof f === 'string')
|
|
402
467
|
.map((f) => f.trim())
|
|
403
468
|
.filter((f) => f.length >= 4 && !/(api[_ -]?key|password|secret|token)\s*[:=]/i.test(f))
|
|
404
469
|
.filter((f) => !(bot.memory || []).some((m) => factKey(m.fact) === factKey(f)))
|
|
405
470
|
.slice(0, MAX_FACTS_PER_TURN);
|
|
406
|
-
if (!facts.length) return { added: [] };
|
|
407
|
-
return addMemory(bot.id, facts);
|
|
471
|
+
if (!facts.length) return { added: [], brain: brainNotes };
|
|
472
|
+
return { ...addMemory(bot.id, facts), brain: brainNotes };
|
|
408
473
|
} catch {
|
|
409
474
|
return { added: [] };
|
|
410
475
|
}
|
|
@@ -562,7 +627,12 @@ const STOP = new Set('the and for with that this from what when where which your
|
|
|
562
627
|
function terms(text) {
|
|
563
628
|
return [...new Set(String(text || '').toLowerCase().replace(/[^a-z0-9 ]+/g, ' ').split(/\s+/)
|
|
564
629
|
.filter((w) => w.length >= 3 && !STOP.has(w))
|
|
565
|
-
.map((w) =>
|
|
630
|
+
.map((w) => {
|
|
631
|
+
if (w.length > 4 && w.endsWith('s') && !w.endsWith('ss')) w = w.slice(0, -1);
|
|
632
|
+
if (w.length > 5 && w.endsWith('ing')) w = w.slice(0, -3);
|
|
633
|
+
if (w.length > 4 && w.endsWith('e')) w = w.slice(0, -1);
|
|
634
|
+
return w;
|
|
635
|
+
}))];
|
|
566
636
|
}
|
|
567
637
|
|
|
568
638
|
/** The playbooks that fit a request best (keyword overlap), at most `n`, best first. */
|
|
@@ -659,6 +729,11 @@ async function reflectOnRun(bot, run, chatFn) {
|
|
|
659
729
|
resolved: j.resolved,
|
|
660
730
|
};
|
|
661
731
|
const { added } = addExperience(bot.id, reflection);
|
|
732
|
+
// The same lessons, shared with the other bots through the brain. They see
|
|
733
|
+
// one only when it fits their request, labelled as a teammate's experience.
|
|
734
|
+
if (added && added.lessons && added.lessons.length) {
|
|
735
|
+
try { brainLib().shareLessons(added.lessons, { botId: bot.id, botName: fresh.name, domain: brainLib().botDomains(fresh)[0] || '' }); } catch {}
|
|
736
|
+
}
|
|
662
737
|
return { outcome, added };
|
|
663
738
|
} catch {
|
|
664
739
|
return { added: null, skipped: 'failed' };
|
|
@@ -668,6 +743,9 @@ async function reflectOnRun(bot, run, chatFn) {
|
|
|
668
743
|
// ─── Prompts ────────────────────────────────────────────────────────────────
|
|
669
744
|
|
|
670
745
|
function approvalLine(bot) {
|
|
746
|
+
if (normalizeAutonomy(bot.autonomy).level === 'none') {
|
|
747
|
+
return 'You are set to suggest only (the user chose this). Never edit files, run commands, send, post, publish, book or change anything, even when asked in this chat: Craft refuses those actions for you. Read, look things up, think, then give your suggestion or a ready-to-use draft and say what you would do.';
|
|
748
|
+
}
|
|
671
749
|
const must = (bot.approval || []).map((k) => APPROVALS[k] && APPROVALS[k].label.toLowerCase()).filter(Boolean);
|
|
672
750
|
if (!must.length) return 'You may act without asking first. Still never do anything irreversible the user did not ask for.';
|
|
673
751
|
return `Always get the user's approval before: ${must.join('; ')}. Craft enforces this too. Do reversible, read-only work (reading, searching, thinking) without asking.`;
|
|
@@ -691,7 +769,7 @@ You can reach the user on their phone with reach_me, and watch their inbox with
|
|
|
691
769
|
- Urgent or time critical, or they asked for a call: reach_me with how=call (the phone rings and you speak).
|
|
692
770
|
- Anything else worth their attention: how=text (a notification).
|
|
693
771
|
- "Tell me / call me when X emails me": watch_email with from=X and how=call or text. Do not say you cannot run in the background.
|
|
694
|
-
- A reminder at a time: reach_me with at set to that time.
|
|
772
|
+
- A reminder at a time: reach_me with at set to that time. It also goes on their Google Calendar by itself (when connected), so never add it again with calendar_add, and never tell them it is not on the calendar.
|
|
695
773
|
- "Have Shella call me": reach_me with bot set to that bot's name, so the call comes from them.`;
|
|
696
774
|
const PHONE_FORMAT = `To reach the phone or watch for an email, write:
|
|
697
775
|
<codeply:reach_me>
|
|
@@ -705,6 +783,14 @@ const PHONE_FORMAT = `To reach the phone or watch for an email, write:
|
|
|
705
783
|
<how>call</how>
|
|
706
784
|
</codeply:watch_email>`;
|
|
707
785
|
|
|
786
|
+
const LIFE_RULES = `THE USER'S LIFE CONTEXT
|
|
787
|
+
All the user's bots share one picture of their life: calendar, email, calls, plans, projects, what is on screen, the important bits heard around them. Look things up with life_context (about = now, today, tomorrow, week, person, calls, email, activity, heard, plans, projects, slack, tasks, health, or a query to search) before saying you do not know what the user has on, who someone is, or what happened. It is private: use it to help the user, never pass it on to anyone else.`;
|
|
788
|
+
const LIFE_FORMAT = `To look something up, write:
|
|
789
|
+
<codeply:life_context>
|
|
790
|
+
<about>person</about>
|
|
791
|
+
<query>Sara</query>
|
|
792
|
+
</codeply:life_context>`;
|
|
793
|
+
|
|
708
794
|
const VERIFY_RULES = `BEFORE YOU SAY IT IS DONE
|
|
709
795
|
- Base every claim on what your tools actually returned in this run.
|
|
710
796
|
- Check the deliverable exists (the file is written, the message is sent, the command passed) before you say so.
|
|
@@ -771,6 +857,20 @@ function buildBotPrompt(bot, o = {}) {
|
|
|
771
857
|
}
|
|
772
858
|
parts.push(...experienceParts(bot, o.request));
|
|
773
859
|
if (require('./reach.js').available()) parts.push(o.native ? PHONE_RULES : `${PHONE_RULES}\n\n${PHONE_FORMAT}`);
|
|
860
|
+
const mail = require('./bot-mail.js');
|
|
861
|
+
if (mail.available() && mail.addressOf(bot.id)) parts.push(mail.RULES(mail.addressOf(bot.id), !!o.native));
|
|
862
|
+
const L = lifeLib();
|
|
863
|
+
if (L.available() && o.life !== false) {
|
|
864
|
+
const allowed = L.allowedFor(bot);
|
|
865
|
+
if (allowed.size) {
|
|
866
|
+
let block = '';
|
|
867
|
+
try { block = L.nowBlock(L.snapshot({ allowed }), { skipEmpty: true }); } catch {}
|
|
868
|
+
// Said up front, so the bot never promises "I'll list your calls" and then finds out it may not.
|
|
869
|
+
const shut = L.SOURCE_KEYS.filter((k) => !allowed.has(k)).map((k) => L.SOURCES[k].label.toLowerCase());
|
|
870
|
+
const limits = shut.length ? `You cannot read: ${shut.join('; ')}. Never offer to check those; if the user wants it, they can allow it in your Life settings in Crew.` : '';
|
|
871
|
+
parts.push([block, o.native ? LIFE_RULES : `${LIFE_RULES}\n\n${LIFE_FORMAT}`, limits].filter(Boolean).join('\n\n'));
|
|
872
|
+
}
|
|
873
|
+
}
|
|
774
874
|
parts.push(VERIFY_RULES);
|
|
775
875
|
if (o.askedBy) {
|
|
776
876
|
parts.push(`DELEGATED TASK\n${o.askedBy} asked you to do one task. You only see that task, not the rest of the conversation. Do it fully with your tools, then reply in this shape:\nSummary: <one sentence with the outcome>\n<the details: findings, what you changed, anything ${o.askedBy} must know or check>`);
|
|
@@ -782,9 +882,28 @@ function buildBotPrompt(bot, o = {}) {
|
|
|
782
882
|
: `You can ask a teammate for help with ask_bot when part of the work is clearly in their domain. Only one bot runs at a time, and you wait for the answer.`;
|
|
783
883
|
parts.push(`TEAM\n${lead}\nTeammates:\n${roster.join('\n')}${o.native ? '' : `\n\n${ASK_BOT_FORMAT}`}`);
|
|
784
884
|
}
|
|
885
|
+
if (o.canHandOff && roster.length) parts.push(handOffRules(o.team, bot.id, !!o.native));
|
|
785
886
|
return parts.join('\n\n');
|
|
786
887
|
}
|
|
787
888
|
|
|
889
|
+
/** hand_off: passing work on without waiting (brain.js), for bots and for plain Craft. */
|
|
890
|
+
function handOffRules(team, selfId, native) {
|
|
891
|
+
const B = brainLib();
|
|
892
|
+
const who = (team || []).filter((b) => b.id !== selfId).map((b) => `${b.name} (${B.botDomains(b).join(', ') || 'general'})`).join('; ');
|
|
893
|
+
return `HANDING WORK ON
|
|
894
|
+
When part of a job belongs to another bot's domain and you do not need the answer to finish yours, pass it on with hand_off and carry on: an email asking for a meeting goes to the calendar bot, a follow-up date to the reminders bot. Send only what they need (the intent, the facts with exact names, addresses, dates and time zones, what is decided), never the whole conversation. Use ask_bot instead when you need their result to continue. Who handles what: ${who}.${native ? '' : `
|
|
895
|
+
|
|
896
|
+
<codeply:hand_off>
|
|
897
|
+
<to>calendar</to>
|
|
898
|
+
<intent>Mike proposed meeting tomorrow at 5:00 (Asia/Karachi). Check the calendar and the user's preferences, and propose the slot or a better one.</intent>
|
|
899
|
+
<facts>
|
|
900
|
+
From: Mike Chen <mike@example.com>
|
|
901
|
+
Gmail thread: 18c2f0a1b2
|
|
902
|
+
</facts>
|
|
903
|
+
<decision>I drafted a holding reply; not sent.</decision>
|
|
904
|
+
</codeply:hand_off>`}`;
|
|
905
|
+
}
|
|
906
|
+
|
|
788
907
|
/** The short roster note when the plain Craft agent (no bot chosen) can still ask bots. */
|
|
789
908
|
function teamPrompt(team, o = {}) {
|
|
790
909
|
const roster = rosterLines(team, null);
|
|
@@ -792,7 +911,13 @@ function teamPrompt(team, o = {}) {
|
|
|
792
911
|
const phone = require('./reach.js').available()
|
|
793
912
|
? `\n\nWhen the user asks a bot to call or text them ("tell Shella to call me"), do it yourself with reach_me and bot set to that bot's name, so it comes from that bot. ${o.native ? '' : PHONE_FORMAT}`
|
|
794
913
|
: '';
|
|
795
|
-
|
|
914
|
+
const handOff = o.canHandOff ? `\n\n${handOffRules(team, null, !!o.native)}` : '';
|
|
915
|
+
return `BOTS\nThe user has these bots. When they ask for one by name, or a part of the work is clearly a bot's specialty, you can hand it that part with ask_bot. Only one bot runs at a time, and you wait for its answer.\n${roster.join('\n')}${o.native ? '' : `\n\n${ASK_BOT_FORMAT}`}${phone}${handOff}`;
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
/** Level 1 (suggest only): this bot may not take this action at all, watched or not. */
|
|
919
|
+
function suggestOnly(bot, tool) {
|
|
920
|
+
return !!bot && normalizeAutonomy(bot.autonomy).level === 'none' && (!!approvalCategory(tool) || tool === 'gmail_draft' || tool === 'add_model');
|
|
796
921
|
}
|
|
797
922
|
|
|
798
923
|
/** Which approval category a tool falls into, or null. */
|
|
@@ -804,6 +929,7 @@ function approvalCategory(tool) {
|
|
|
804
929
|
/** True when this bot is allowed to do this tool without asking the user. */
|
|
805
930
|
function canSkipApproval(bot, tool) {
|
|
806
931
|
if (!bot) return false;
|
|
932
|
+
if (normalizeAutonomy(bot.autonomy).level === 'none') return false;
|
|
807
933
|
const cat = approvalCategory(tool);
|
|
808
934
|
return !!cat && !(bot.approval || []).includes(cat);
|
|
809
935
|
}
|
|
@@ -1020,6 +1146,7 @@ async function voiceTurn({ bot, team, turns, recentChat, runAgent, route, cwd, s
|
|
|
1020
1146
|
const run = runAgent({
|
|
1021
1147
|
userMessage, history, mode: 'Build', cwd, signal, route, maxSteps, approve, botId: bot.id,
|
|
1022
1148
|
botPrompt: () => `${buildBotPrompt(bot, { team, request: userMessage })}\n\n${VOICE_RULES}${extra}`,
|
|
1149
|
+
haze: { product: 'mobile', chatId: `call:${bot.id}` },
|
|
1023
1150
|
});
|
|
1024
1151
|
let reply = '';
|
|
1025
1152
|
const steps = []; // the trajectory, for reflectOnRun after the call turn
|
|
@@ -1045,23 +1172,23 @@ function runStep(ev) {
|
|
|
1045
1172
|
|
|
1046
1173
|
/** What the call screen says while a tool runs. */
|
|
1047
1174
|
const CALL_STEP = {
|
|
1048
|
-
gmail_search: 'Checking your email', gmail_send: 'Sending the email', gmail_draft: 'Saving a draft', drafts_list: 'Looking at your drafts',
|
|
1049
|
-
calendar_list: 'Checking your calendar', calendar_add: 'Adding it to your calendar', web_search: 'Searching the web', image_search: 'Looking for images', reach_me: 'Reaching your phone', watch_email: 'Setting an email alert', web_fetch: 'Reading a page',
|
|
1175
|
+
gmail_search: 'Checking your email', gmail_read: 'Reading the email', gmail_send: 'Sending the email', gmail_draft: 'Saving a draft', drafts_list: 'Looking at your drafts',
|
|
1176
|
+
calendar_list: 'Checking your calendar', calendar_add: 'Adding it to your calendar', calendar_update: 'Changing your calendar', web_search: 'Searching the web', image_search: 'Looking for images', reach_me: 'Reaching your phone', watch_email: 'Setting an email alert', web_fetch: 'Reading a page',
|
|
1050
1177
|
read_file: 'Reading a file', write_file: 'Writing a file', edit_file: 'Editing a file', apply_patch: 'Editing files', run: 'Running a command',
|
|
1051
1178
|
search: 'Searching your files', list_dir: 'Looking through files', slack_post_message: 'Posting to Slack', browser_check: 'Checking the page',
|
|
1052
|
-
ask_bot: 'Asking a teammate', todo: 'Planning',
|
|
1179
|
+
ask_bot: 'Asking a teammate', todo: 'Planning', life_context: 'Checking your day', look_at_screen: 'Looking at your screen', use_computer: 'Using your computer', bot_email_send: 'Sending the email',
|
|
1053
1180
|
};
|
|
1054
1181
|
const callStepLabel = (name) => CALL_STEP[name] || 'Working on it';
|
|
1055
1182
|
|
|
1056
1183
|
module.exports = {
|
|
1057
1184
|
VOICE_RULES, VOICE_RULES_NO_TOOLS, spoken, callTurns, voiceTurn, callStepLabel,
|
|
1058
1185
|
MAX_MEMORY, MAX_DEPTH, ROLES, TONES, APPROVALS, AVATAR_KEYS, TEMPLATES, WATCH_SOURCES, REACH,
|
|
1059
|
-
botsDir, setBotsDir, normalizeBot, normalizeAvatar, normalizeAlwaysOn,
|
|
1186
|
+
botsDir, setBotsDir, normalizeBot, normalizeAvatar, normalizeAlwaysOn, normalizeAutonomy, normalizeCallStyle, normalizeEmail, AUTONOMY, EXCUSE_STYLES,
|
|
1060
1187
|
listBots, getBot, findBot, createBot, createFromTemplate, updateBot, removeBot,
|
|
1061
1188
|
mergeMemory, addMemory, forget, clearMemory, learnFromTurn,
|
|
1062
1189
|
MAX_LESSONS, MAX_PLAYBOOKS, MAX_TOOL_TIPS, MAX_OPEN_THREADS,
|
|
1063
1190
|
mergeExperience, addExperience, forgetExperience, rankPlaybooks, reflectOnRun, runStep,
|
|
1064
|
-
buildBotPrompt, teamPrompt, approvalCategory, canSkipApproval,
|
|
1191
|
+
buildBotPrompt, teamPrompt, handOffRules, approvalCategory, canSkipApproval, suggestOnly,
|
|
1065
1192
|
createLock, globalLock, parseResult, delegate, botCard,
|
|
1066
1193
|
describePrompt, fromDescription,
|
|
1067
1194
|
};
|