@rotifer/playground 0.8.1 → 0.8.6
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/CHANGELOG.md +46 -11
- package/README.md +92 -58
- package/README.zh.md +90 -49
- package/dist/cloud/auth.d.ts +9 -3
- package/dist/cloud/auth.d.ts.map +1 -1
- package/dist/cloud/auth.js +28 -13
- package/dist/cloud/auth.js.map +1 -1
- package/dist/cloud/client.d.ts +4 -3
- package/dist/cloud/client.d.ts.map +1 -1
- package/dist/cloud/client.js +139 -68
- package/dist/cloud/client.js.map +1 -1
- package/dist/cloud/types.d.ts +3 -0
- package/dist/cloud/types.d.ts.map +1 -1
- package/dist/cloud/types.js.map +1 -1
- package/dist/commands/agent-create.d.ts +20 -0
- package/dist/commands/agent-create.d.ts.map +1 -1
- package/dist/commands/agent-create.js +91 -80
- package/dist/commands/agent-create.js.map +1 -1
- package/dist/commands/agent-list.d.ts.map +1 -1
- package/dist/commands/agent-list.js +27 -24
- package/dist/commands/agent-list.js.map +1 -1
- package/dist/commands/agent-run.d.ts +24 -0
- package/dist/commands/agent-run.d.ts.map +1 -1
- package/dist/commands/agent-run.js +166 -44
- package/dist/commands/agent-run.js.map +1 -1
- package/dist/commands/api-key.d.ts +3 -0
- package/dist/commands/api-key.d.ts.map +1 -0
- package/dist/commands/api-key.js +235 -0
- package/dist/commands/api-key.js.map +1 -0
- package/dist/commands/arena-list.d.ts.map +1 -1
- package/dist/commands/arena-list.js +113 -97
- package/dist/commands/arena-list.js.map +1 -1
- package/dist/commands/arena-submit.d.ts.map +1 -1
- package/dist/commands/arena-submit.js +114 -37
- package/dist/commands/arena-submit.js.map +1 -1
- package/dist/commands/arena-watch.d.ts.map +1 -1
- package/dist/commands/arena-watch.js +59 -87
- package/dist/commands/arena-watch.js.map +1 -1
- package/dist/commands/compare.d.ts.map +1 -1
- package/dist/commands/compare.js +40 -50
- package/dist/commands/compare.js.map +1 -1
- package/dist/commands/compile.d.ts.map +1 -1
- package/dist/commands/compile.js +80 -58
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/hello.d.ts +3 -0
- package/dist/commands/hello.d.ts.map +1 -0
- package/dist/commands/hello.js +575 -0
- package/dist/commands/hello.js.map +1 -0
- package/dist/commands/info.d.ts.map +1 -1
- package/dist/commands/info.js +130 -40
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +39 -60
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +35 -9
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +111 -58
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +23 -10
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/network.d.ts.map +1 -1
- package/dist/commands/network.js +48 -67
- package/dist/commands/network.js.map +1 -1
- package/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +152 -53
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/reputation.js +84 -85
- package/dist/commands/reputation.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +32 -12
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/scan.d.ts.map +1 -1
- package/dist/commands/scan.js +8 -9
- package/dist/commands/scan.js.map +1 -1
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +80 -54
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/self-update.d.ts +7 -0
- package/dist/commands/self-update.d.ts.map +1 -0
- package/dist/commands/self-update.js +187 -0
- package/dist/commands/self-update.js.map +1 -0
- package/dist/commands/stats.d.ts.map +1 -1
- package/dist/commands/stats.js +20 -26
- package/dist/commands/stats.js.map +1 -1
- package/dist/commands/test.d.ts.map +1 -1
- package/dist/commands/test.js +104 -79
- package/dist/commands/test.js.map +1 -1
- package/dist/commands/user-config.d.ts +3 -0
- package/dist/commands/user-config.d.ts.map +1 -0
- package/dist/commands/user-config.js +82 -0
- package/dist/commands/user-config.js.map +1 -0
- package/dist/commands/versions.d.ts.map +1 -1
- package/dist/commands/versions.js +46 -33
- package/dist/commands/versions.js.map +1 -1
- package/dist/commands/vg.d.ts.map +1 -1
- package/dist/commands/vg.js +65 -63
- package/dist/commands/vg.js.map +1 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +33 -23
- package/dist/commands/whoami.js.map +1 -1
- package/dist/commands/wrap.d.ts.map +1 -1
- package/dist/commands/wrap.js +57 -40
- package/dist/commands/wrap.js.map +1 -1
- package/dist/index.js +61 -1
- package/dist/index.js.map +1 -1
- package/dist/publish/pre-publish-check.d.ts +15 -0
- package/dist/publish/pre-publish-check.d.ts.map +1 -0
- package/dist/publish/pre-publish-check.js +228 -0
- package/dist/publish/pre-publish-check.js.map +1 -0
- package/dist/runtime/domain-failover.d.ts +1 -1
- package/dist/runtime/domain-failover.js +1 -1
- package/dist/runtime/network-gateway.d.ts +1 -1
- package/dist/runtime/network-gateway.d.ts.map +1 -1
- package/dist/runtime/network-gateway.js +10 -10
- package/dist/runtime/network-gateway.js.map +1 -1
- package/dist/scanner/scanner.js +3 -3
- package/dist/scanner/scanner.js.map +1 -1
- package/dist/utils/binding.d.ts +1 -0
- package/dist/utils/binding.d.ts.map +1 -1
- package/dist/utils/binding.js +37 -15
- package/dist/utils/binding.js.map +1 -1
- package/dist/utils/content-hash.d.ts +3 -0
- package/dist/utils/content-hash.d.ts.map +1 -0
- package/dist/utils/content-hash.js +25 -0
- package/dist/utils/content-hash.js.map +1 -0
- package/dist/utils/detect-source-language.d.ts +20 -0
- package/dist/utils/detect-source-language.d.ts.map +1 -0
- package/dist/utils/detect-source-language.js +83 -0
- package/dist/utils/detect-source-language.js.map +1 -0
- package/dist/utils/display.d.ts +44 -1
- package/dist/utils/display.d.ts.map +1 -1
- package/dist/utils/display.js +443 -14
- package/dist/utils/display.js.map +1 -1
- package/dist/utils/domain-suggest.d.ts.map +1 -1
- package/dist/utils/domain-suggest.js +3 -3
- package/dist/utils/domain-suggest.js.map +1 -1
- package/dist/utils/javy-compiler.d.ts.map +1 -1
- package/dist/utils/javy-compiler.js +10 -3
- package/dist/utils/javy-compiler.js.map +1 -1
- package/dist/utils/open-browser.d.ts +7 -3
- package/dist/utils/open-browser.d.ts.map +1 -1
- package/dist/utils/open-browser.js +15 -4
- package/dist/utils/open-browser.js.map +1 -1
- package/dist/utils/palette.d.ts +49 -0
- package/dist/utils/palette.d.ts.map +1 -0
- package/dist/utils/palette.js +80 -0
- package/dist/utils/palette.js.map +1 -0
- package/dist/utils/private-fs.d.ts +3 -0
- package/dist/utils/private-fs.d.ts.map +1 -0
- package/dist/utils/private-fs.js +25 -0
- package/dist/utils/private-fs.js.map +1 -0
- package/dist/utils/project-root.d.ts +2 -0
- package/dist/utils/project-root.d.ts.map +1 -0
- package/dist/utils/project-root.js +49 -0
- package/dist/utils/project-root.js.map +1 -0
- package/dist/utils/run-logger.d.ts +24 -0
- package/dist/utils/run-logger.d.ts.map +1 -0
- package/dist/utils/run-logger.js +70 -0
- package/dist/utils/run-logger.js.map +1 -0
- package/dist/utils/sandbox-defaults.d.ts +9 -0
- package/dist/utils/sandbox-defaults.d.ts.map +1 -0
- package/dist/utils/sandbox-defaults.js +12 -0
- package/dist/utils/sandbox-defaults.js.map +1 -0
- package/dist/utils/update-check.d.ts +20 -0
- package/dist/utils/update-check.d.ts.map +1 -0
- package/dist/utils/update-check.js +155 -0
- package/dist/utils/update-check.js.map +1 -0
- package/dist/utils/user-config.d.ts +10 -0
- package/dist/utils/user-config.d.ts.map +1 -0
- package/dist/utils/user-config.js +54 -0
- package/dist/utils/user-config.js.map +1 -0
- package/dist/utils/validate-gene-name.d.ts +7 -0
- package/dist/utils/validate-gene-name.d.ts.map +1 -0
- package/dist/utils/validate-gene-name.js +28 -0
- package/dist/utils/validate-gene-name.js.map +1 -0
- package/genes/genesis-code-format/phenotype.json +4 -3
- package/genes/genesis-file-read/phenotype.json +4 -3
- package/genes/genesis-l0-constraint/phenotype.json +4 -3
- package/genes/genesis-web-search/phenotype.json +5 -4
- package/genes/genesis-web-search-lite/phenotype.json +4 -3
- package/package.json +35 -8
- package/scripts/postinstall.js +38 -0
- package/dist/errors/formatter.d.ts +0 -25
- package/dist/errors/formatter.d.ts.map +0 -1
- package/dist/errors/formatter.js +0 -43
- package/dist/errors/formatter.js.map +0 -1
- package/genes/academic-writer/.cloud-manifest.json +0 -6
- package/genes/academic-writer/.gene-manifest.json +0 -8
- package/genes/academic-writer/SKILL.md +0 -274
- package/genes/academic-writer/phenotype.json +0 -28
- package/genes/ai-components/.cloud-manifest.json +0 -6
- package/genes/ai-components/.gene-manifest.json +0 -8
- package/genes/ai-components/SKILL.md +0 -381
- package/genes/ai-components/phenotype.json +0 -28
- package/genes/algorithmic-art/.cloud-manifest.json +0 -6
- package/genes/algorithmic-art/.gene-manifest.json +0 -8
- package/genes/algorithmic-art/SKILL.md +0 -405
- package/genes/algorithmic-art/phenotype.json +0 -28
- package/genes/answer-synthesizer/.cloud-manifest.json +0 -6
- package/genes/answer-synthesizer/index.ts +0 -194
- package/genes/answer-synthesizer/phenotype.json +0 -61
- package/genes/api-designer/.cloud-manifest.json +0 -6
- package/genes/api-designer/.gene-manifest.json +0 -8
- package/genes/api-designer/SKILL.md +0 -456
- package/genes/api-designer/phenotype.json +0 -28
- package/genes/auto-coder/.cloud-manifest.json +0 -6
- package/genes/auto-coder/.gene-manifest.json +0 -8
- package/genes/auto-coder/SKILL.md +0 -400
- package/genes/auto-coder/phenotype.json +0 -28
- package/genes/auto-writer/.cloud-manifest.json +0 -6
- package/genes/auto-writer/.gene-manifest.json +0 -8
- package/genes/auto-writer/SKILL.md +0 -361
- package/genes/auto-writer/phenotype.json +0 -28
- package/genes/brand-personality/.cloud-manifest.json +0 -6
- package/genes/brand-personality/.gene-manifest.json +0 -8
- package/genes/brand-personality/SKILL.md +0 -549
- package/genes/brand-personality/phenotype.json +0 -28
- package/genes/business-writer/.cloud-manifest.json +0 -6
- package/genes/business-writer/.gene-manifest.json +0 -8
- package/genes/business-writer/SKILL.md +0 -448
- package/genes/business-writer/phenotype.json +0 -28
- package/genes/citation-manager/.cloud-manifest.json +0 -6
- package/genes/citation-manager/.gene-manifest.json +0 -8
- package/genes/citation-manager/SKILL.md +0 -279
- package/genes/citation-manager/index.ts +0 -162
- package/genes/citation-manager/package.json +0 -1
- package/genes/citation-manager/phenotype.json +0 -50
- package/genes/code-complexity/.cloud-manifest.json +0 -6
- package/genes/code-complexity/README.md +0 -35
- package/genes/code-complexity/index.ts +0 -101
- package/genes/code-complexity/phenotype.json +0 -34
- package/genes/copywriter/.cloud-manifest.json +0 -6
- package/genes/copywriter/.gene-manifest.json +0 -8
- package/genes/copywriter/SKILL.md +0 -329
- package/genes/copywriter/phenotype.json +0 -28
- package/genes/creative-writer/.cloud-manifest.json +0 -6
- package/genes/creative-writer/.gene-manifest.json +0 -8
- package/genes/creative-writer/SKILL.md +0 -356
- package/genes/creative-writer/phenotype.json +0 -28
- package/genes/data-modeler/.cloud-manifest.json +0 -6
- package/genes/data-modeler/.gene-manifest.json +0 -8
- package/genes/data-modeler/SKILL.md +0 -486
- package/genes/data-modeler/phenotype.json +0 -28
- package/genes/debugger/.cloud-manifest.json +0 -6
- package/genes/debugger/.gene-manifest.json +0 -8
- package/genes/debugger/SKILL.md +0 -416
- package/genes/debugger/phenotype.json +0 -28
- package/genes/design-tokens/.cloud-manifest.json +0 -6
- package/genes/design-tokens/.gene-manifest.json +0 -8
- package/genes/design-tokens/SKILL.md +0 -222
- package/genes/design-tokens/index.ts +0 -128
- package/genes/design-tokens/package.json +0 -1
- package/genes/design-tokens/phenotype.json +0 -1
- package/genes/devops-automator/.cloud-manifest.json +0 -6
- package/genes/devops-automator/.gene-manifest.json +0 -8
- package/genes/devops-automator/SKILL.md +0 -490
- package/genes/devops-automator/phenotype.json +0 -28
- package/genes/doc-coauthoring/.cloud-manifest.json +0 -6
- package/genes/doc-coauthoring/.gene-manifest.json +0 -8
- package/genes/doc-coauthoring/SKILL.md +0 -375
- package/genes/doc-coauthoring/phenotype.json +0 -28
- package/genes/doc-retrieval/.cloud-manifest.json +0 -6
- package/genes/doc-retrieval/index.ts +0 -134
- package/genes/doc-retrieval/phenotype.json +0 -54
- package/genes/docs-writer/.cloud-manifest.json +0 -6
- package/genes/docs-writer/.gene-manifest.json +0 -8
- package/genes/docs-writer/SKILL.md +0 -492
- package/genes/docs-writer/phenotype.json +0 -28
- package/genes/evolve-life/.cloud-manifest.json +0 -6
- package/genes/evolve-life/.compile-result.json +0 -12
- package/genes/evolve-life/README.md +0 -52
- package/genes/evolve-life/gene.ir.wasm +0 -0
- package/genes/evolve-life/gene.wasm +0 -0
- package/genes/evolve-life/index.ts +0 -255
- package/genes/evolve-life/phenotype.json +0 -129
- package/genes/evolve-life-bitwise/.cloud-manifest.json +0 -6
- package/genes/evolve-life-bitwise/.compile-result.json +0 -12
- package/genes/evolve-life-bitwise/gene.ir.wasm +0 -0
- package/genes/evolve-life-bitwise/gene.wasm +0 -0
- package/genes/evolve-life-bitwise/index.ts +0 -273
- package/genes/evolve-life-bitwise/phenotype.json +0 -129
- package/genes/evolve-life-sparse/.cloud-manifest.json +0 -6
- package/genes/evolve-life-sparse/.compile-result.json +0 -12
- package/genes/evolve-life-sparse/gene.ir.wasm +0 -0
- package/genes/evolve-life-sparse/gene.wasm +0 -0
- package/genes/evolve-life-sparse/index.ts +0 -236
- package/genes/evolve-life-sparse/phenotype.json +0 -129
- package/genes/fact-checker/.cloud-manifest.json +0 -6
- package/genes/fact-checker/.gene-manifest.json +0 -8
- package/genes/fact-checker/SKILL.md +0 -373
- package/genes/fact-checker/phenotype.json +0 -28
- package/genes/git-workflow/.cloud-manifest.json +0 -6
- package/genes/git-workflow/.gene-manifest.json +0 -8
- package/genes/git-workflow/SKILL.md +0 -407
- package/genes/git-workflow/phenotype.json +0 -28
- package/genes/grammar-checker/.cloud-manifest.json +0 -6
- package/genes/grammar-checker/.gene-manifest.json +0 -8
- package/genes/grammar-checker/SKILL.md +0 -194
- package/genes/grammar-checker/index.ts +0 -168
- package/genes/grammar-checker/package.json +0 -1
- package/genes/grammar-checker/phenotype.json +0 -52
- package/genes/guard-balanced/.gene-manifest.json +0 -8
- package/genes/guard-balanced/phenotype.json +0 -105
- package/genes/guard-balanced/system-prompt.md +0 -23
- package/genes/guard-strict/.gene-manifest.json +0 -8
- package/genes/guard-strict/phenotype.json +0 -107
- package/genes/guard-strict/system-prompt.md +0 -18
- package/genes/json-validator/.cloud-manifest.json +0 -6
- package/genes/json-validator/README.md +0 -42
- package/genes/json-validator/index.ts +0 -112
- package/genes/json-validator/phenotype.json +0 -42
- package/genes/license-advisor/.cloud-manifest.json +0 -6
- package/genes/license-advisor/.gene-manifest.json +0 -8
- package/genes/license-advisor/SKILL.md +0 -117
- package/genes/license-advisor/phenotype.json +0 -28
- package/genes/logic-architect/.cloud-manifest.json +0 -6
- package/genes/logic-architect/.gene-manifest.json +0 -8
- package/genes/logic-architect/SKILL.md +0 -451
- package/genes/logic-architect/phenotype.json +0 -28
- package/genes/markdown-formatter/.cloud-manifest.json +0 -6
- package/genes/markdown-formatter/README.md +0 -34
- package/genes/markdown-formatter/index.ts +0 -86
- package/genes/markdown-formatter/phenotype.json +0 -32
- package/genes/orch/.cloud-manifest.json +0 -6
- package/genes/orch/.gene-manifest.json +0 -8
- package/genes/orch/SKILL.md +0 -504
- package/genes/orch/phenotype.json +0 -28
- package/genes/particle-barneshut/.cloud-manifest.json +0 -6
- package/genes/particle-barneshut/.compile-result.json +0 -12
- package/genes/particle-barneshut/README.md +0 -55
- package/genes/particle-barneshut/gene.ir.wasm +0 -0
- package/genes/particle-barneshut/gene.wasm +0 -0
- package/genes/particle-barneshut/index.ts +0 -486
- package/genes/particle-barneshut/phenotype.json +0 -137
- package/genes/particle-brute/.cloud-manifest.json +0 -6
- package/genes/particle-brute/.compile-result.json +0 -12
- package/genes/particle-brute/README.md +0 -55
- package/genes/particle-brute/gene.ir.wasm +0 -0
- package/genes/particle-brute/gene.wasm +0 -0
- package/genes/particle-brute/index.ts +0 -277
- package/genes/particle-brute/phenotype.json +0 -137
- package/genes/particle-spatial/.cloud-manifest.json +0 -6
- package/genes/particle-spatial/.compile-result.json +0 -12
- package/genes/particle-spatial/README.md +0 -53
- package/genes/particle-spatial/gene.ir.wasm +0 -0
- package/genes/particle-spatial/gene.wasm +0 -0
- package/genes/particle-spatial/index.ts +0 -352
- package/genes/particle-spatial/phenotype.json +0 -137
- package/genes/performance-optimizer/.cloud-manifest.json +0 -6
- package/genes/performance-optimizer/.gene-manifest.json +0 -8
- package/genes/performance-optimizer/SKILL.md +0 -480
- package/genes/performance-optimizer/phenotype.json +0 -28
- package/genes/plagiarism-checker/.cloud-manifest.json +0 -6
- package/genes/plagiarism-checker/.gene-manifest.json +0 -8
- package/genes/plagiarism-checker/SKILL.md +0 -342
- package/genes/plagiarism-checker/phenotype.json +0 -28
- package/genes/product-manager/.cloud-manifest.json +0 -6
- package/genes/product-manager/.gene-manifest.json +0 -8
- package/genes/product-manager/SKILL.md +0 -249
- package/genes/product-manager/phenotype.json +0 -28
- package/genes/project-reviewer/.cloud-manifest.json +0 -6
- package/genes/project-reviewer/.gene-manifest.json +0 -8
- package/genes/project-reviewer/SKILL.md +0 -312
- package/genes/project-reviewer/phenotype.json +0 -28
- package/genes/prompt-engineer/.cloud-manifest.json +0 -6
- package/genes/prompt-engineer/.gene-manifest.json +0 -8
- package/genes/prompt-engineer/SKILL.md +0 -411
- package/genes/prompt-engineer/phenotype.json +0 -28
- package/genes/prompt-review-perf/.gene-manifest.json +0 -8
- package/genes/prompt-review-perf/phenotype.json +0 -61
- package/genes/prompt-review-perf/system-prompt.md +0 -22
- package/genes/prompt-review-readability/.gene-manifest.json +0 -8
- package/genes/prompt-review-readability/phenotype.json +0 -60
- package/genes/prompt-review-readability/system-prompt.md +0 -21
- package/genes/prompt-review-security/.gene-manifest.json +0 -8
- package/genes/prompt-review-security/phenotype.json +0 -60
- package/genes/prompt-review-security/system-prompt.md +0 -21
- package/genes/readability-analyzer/.cloud-manifest.json +0 -6
- package/genes/readability-analyzer/.gene-manifest.json +0 -8
- package/genes/readability-analyzer/SKILL.md +0 -357
- package/genes/readability-analyzer/index.ts +0 -123
- package/genes/readability-analyzer/package.json +0 -1
- package/genes/readability-analyzer/phenotype.json +0 -35
- package/genes/rotifer-protocol/SKILL.md +0 -121
- package/genes/rule-router-frequency/.gene-manifest.json +0 -8
- package/genes/rule-router-frequency/phenotype.json +0 -76
- package/genes/rule-router-frequency/system-prompt.md +0 -26
- package/genes/rule-router-relevance/.gene-manifest.json +0 -8
- package/genes/rule-router-relevance/phenotype.json +0 -76
- package/genes/rule-router-relevance/system-prompt.md +0 -29
- package/genes/security-auditor/.cloud-manifest.json +0 -6
- package/genes/security-auditor/.gene-manifest.json +0 -8
- package/genes/security-auditor/SKILL.md +0 -494
- package/genes/security-auditor/phenotype.json +0 -28
- package/genes/seo-optimizer/.cloud-manifest.json +0 -6
- package/genes/seo-optimizer/.gene-manifest.json +0 -8
- package/genes/seo-optimizer/SKILL.md +0 -327
- package/genes/seo-optimizer/index.ts +0 -206
- package/genes/seo-optimizer/package.json +0 -1
- package/genes/seo-optimizer/phenotype.json +0 -1
- package/genes/source-linker/.cloud-manifest.json +0 -6
- package/genes/source-linker/index.ts +0 -88
- package/genes/source-linker/phenotype.json +0 -45
- package/genes/style-optimizer/.cloud-manifest.json +0 -6
- package/genes/style-optimizer/.gene-manifest.json +0 -8
- package/genes/style-optimizer/SKILL.md +0 -285
- package/genes/style-optimizer/phenotype.json +0 -28
- package/genes/tech-lead/.cloud-manifest.json +0 -6
- package/genes/tech-lead/.gene-manifest.json +0 -8
- package/genes/tech-lead/SKILL.md +0 -451
- package/genes/tech-lead/phenotype.json +0 -28
- package/genes/test-wrap/.cloud-manifest.json +0 -6
- package/genes/test-wrap/.gene-manifest.json +0 -8
- package/genes/test-wrap/phenotype.json +0 -28
- package/genes/testing-strategist/.cloud-manifest.json +0 -6
- package/genes/testing-strategist/.gene-manifest.json +0 -8
- package/genes/testing-strategist/SKILL.md +0 -500
- package/genes/testing-strategist/phenotype.json +0 -28
- package/genes/text-summarizer/.cloud-manifest.json +0 -6
- package/genes/text-summarizer/README.md +0 -34
- package/genes/text-summarizer/index.ts +0 -122
- package/genes/text-summarizer/phenotype.json +0 -32
- package/genes/tone-analyzer/.cloud-manifest.json +0 -6
- package/genes/tone-analyzer/.gene-manifest.json +0 -8
- package/genes/tone-analyzer/SKILL.md +0 -410
- package/genes/tone-analyzer/phenotype.json +0 -28
- package/genes/translator/.cloud-manifest.json +0 -6
- package/genes/translator/.gene-manifest.json +0 -8
- package/genes/translator/SKILL.md +0 -355
- package/genes/translator/phenotype.json +0 -28
- package/genes/ui-components/.cloud-manifest.json +0 -6
- package/genes/ui-components/.gene-manifest.json +0 -8
- package/genes/ui-components/SKILL.md +0 -467
- package/genes/ui-components/phenotype.json +0 -28
- package/genes/uiux-designer/.cloud-manifest.json +0 -6
- package/genes/uiux-designer/.gene-manifest.json +0 -8
- package/genes/uiux-designer/SKILL.md +0 -353
- package/genes/uiux-designer/phenotype.json +0 -28
- package/genes/url-extractor/.cloud-manifest.json +0 -6
- package/genes/url-extractor/README.md +0 -37
- package/genes/url-extractor/index.ts +0 -86
- package/genes/url-extractor/phenotype.json +0 -48
- package/genes/ux-patterns/.cloud-manifest.json +0 -6
- package/genes/ux-patterns/.gene-manifest.json +0 -8
- package/genes/ux-patterns/SKILL.md +0 -872
- package/genes/ux-patterns/phenotype.json +0 -28
- package/genes/web3-components/.cloud-manifest.json +0 -6
- package/genes/web3-components/.gene-manifest.json +0 -8
- package/genes/web3-components/SKILL.md +0 -390
- package/genes/web3-components/phenotype.json +0 -28
package/dist/cloud/auth.d.ts
CHANGED
|
@@ -12,9 +12,15 @@ export declare function isLoggedIn(): boolean;
|
|
|
12
12
|
export declare function requireAuth(): Promise<CloudCredentials>;
|
|
13
13
|
export declare function generateCodeVerifier(): string;
|
|
14
14
|
export declare function generateCodeChallenge(verifier: string): string;
|
|
15
|
+
export declare const OAUTH_CALLBACK_HOST = "127.0.0.1";
|
|
16
|
+
export declare function buildOAuthCallbackUrl(port: number, path?: string): string;
|
|
15
17
|
/**
|
|
16
|
-
* Start a local
|
|
17
|
-
*
|
|
18
|
+
* Start a local OAuth callback server on a random port (127.0.0.1:0).
|
|
19
|
+
* Returns the bound port immediately so the caller can construct the auth URL,
|
|
20
|
+
* plus a promise that resolves when the callback arrives.
|
|
18
21
|
*/
|
|
19
|
-
export declare function
|
|
22
|
+
export declare function startOAuthCallbackServer(): Promise<{
|
|
23
|
+
port: number;
|
|
24
|
+
waitForCallback: Promise<string>;
|
|
25
|
+
}>;
|
|
20
26
|
//# sourceMappingURL=auth.d.ts.map
|
package/dist/cloud/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/cloud/auth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAe,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/cloud/auth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAe,MAAM,YAAY,CAAC;AAoChE,wBAAgB,eAAe,IAAI,gBAAgB,GAAG,IAAI,CAazD;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CA4C1D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAM7D;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAMvC;AAED,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAS7D;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAE/C,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAoB,GAAG,MAAM,CAEtF;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;CAClC,CAAC,CAwED"}
|
package/dist/cloud/auth.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OAUTH_CALLBACK_HOST = void 0;
|
|
3
4
|
exports.loadCredentials = loadCredentials;
|
|
4
5
|
exports.refreshTokenIfNeeded = refreshTokenIfNeeded;
|
|
5
6
|
exports.saveCredentials = saveCredentials;
|
|
@@ -8,17 +9,17 @@ exports.isLoggedIn = isLoggedIn;
|
|
|
8
9
|
exports.requireAuth = requireAuth;
|
|
9
10
|
exports.generateCodeVerifier = generateCodeVerifier;
|
|
10
11
|
exports.generateCodeChallenge = generateCodeChallenge;
|
|
11
|
-
exports.
|
|
12
|
+
exports.buildOAuthCallbackUrl = buildOAuthCallbackUrl;
|
|
13
|
+
exports.startOAuthCallbackServer = startOAuthCallbackServer;
|
|
12
14
|
const node_fs_1 = require("node:fs");
|
|
13
15
|
const node_path_1 = require("node:path");
|
|
14
16
|
const node_http_1 = require("node:http");
|
|
15
17
|
const node_crypto_1 = require("node:crypto");
|
|
16
18
|
const types_js_1 = require("./types.js");
|
|
19
|
+
const private_fs_js_1 = require("../utils/private-fs.js");
|
|
17
20
|
const ROTIFER_HOME = (0, node_path_1.join)(process.env.HOME || process.env.USERPROFILE || "/tmp", ".rotifer");
|
|
18
21
|
function ensureRotiferHome() {
|
|
19
|
-
|
|
20
|
-
(0, node_fs_1.mkdirSync)(ROTIFER_HOME, { recursive: true });
|
|
21
|
-
}
|
|
22
|
+
(0, private_fs_js_1.ensurePrivateDir)(ROTIFER_HOME);
|
|
22
23
|
}
|
|
23
24
|
function credentialsPath() {
|
|
24
25
|
return (0, node_path_1.join)(ROTIFER_HOME, types_js_1.CREDENTIALS_FILE);
|
|
@@ -105,6 +106,7 @@ function saveCredentials(creds) {
|
|
|
105
106
|
(0, node_fs_1.writeFileSync)(credentialsPath(), JSON.stringify(creds, null, 2) + "\n", {
|
|
106
107
|
mode: 0o600,
|
|
107
108
|
});
|
|
109
|
+
(0, private_fs_js_1.tightenPrivateFile)(credentialsPath());
|
|
108
110
|
}
|
|
109
111
|
function clearCredentials() {
|
|
110
112
|
const path = credentialsPath();
|
|
@@ -130,14 +132,26 @@ function generateCodeVerifier() {
|
|
|
130
132
|
function generateCodeChallenge(verifier) {
|
|
131
133
|
return (0, node_crypto_1.createHash)("sha256").update(verifier).digest("base64url");
|
|
132
134
|
}
|
|
135
|
+
exports.OAUTH_CALLBACK_HOST = "127.0.0.1";
|
|
136
|
+
function buildOAuthCallbackUrl(port, path = "/callback") {
|
|
137
|
+
return `http://${exports.OAUTH_CALLBACK_HOST}:${port}${path}`;
|
|
138
|
+
}
|
|
133
139
|
/**
|
|
134
|
-
* Start a local
|
|
135
|
-
*
|
|
140
|
+
* Start a local OAuth callback server on a random port (127.0.0.1:0).
|
|
141
|
+
* Returns the bound port immediately so the caller can construct the auth URL,
|
|
142
|
+
* plus a promise that resolves when the callback arrives.
|
|
136
143
|
*/
|
|
137
|
-
function
|
|
144
|
+
async function startOAuthCallbackServer() {
|
|
138
145
|
return new Promise((resolve, reject) => {
|
|
146
|
+
let callbackResolve;
|
|
147
|
+
let callbackReject;
|
|
148
|
+
const waitForCallback = new Promise((res, rej) => {
|
|
149
|
+
callbackResolve = res;
|
|
150
|
+
callbackReject = rej;
|
|
151
|
+
});
|
|
139
152
|
const server = (0, node_http_1.createServer)((req, res) => {
|
|
140
|
-
const
|
|
153
|
+
const boundPort = server.address()?.port || 0;
|
|
154
|
+
const url = new URL(req.url || "/", buildOAuthCallbackUrl(boundPort));
|
|
141
155
|
if (url.pathname === "/callback/token") {
|
|
142
156
|
const token = url.searchParams.get("access_token");
|
|
143
157
|
const refresh = url.searchParams.get("refresh_token");
|
|
@@ -147,7 +161,7 @@ function waitForOAuthCallback(port = 9876) {
|
|
|
147
161
|
"<p>You can close this window and return to the terminal.</p>" +
|
|
148
162
|
"</body></html>");
|
|
149
163
|
server.close();
|
|
150
|
-
|
|
164
|
+
callbackResolve(`implicit:${token}:${refresh || ""}`);
|
|
151
165
|
return;
|
|
152
166
|
}
|
|
153
167
|
}
|
|
@@ -158,7 +172,7 @@ function waitForOAuthCallback(port = 9876) {
|
|
|
158
172
|
"<p>You can close this window and return to the terminal.</p>" +
|
|
159
173
|
"</body></html>");
|
|
160
174
|
server.close();
|
|
161
|
-
|
|
175
|
+
callbackResolve(code);
|
|
162
176
|
}
|
|
163
177
|
else {
|
|
164
178
|
res.writeHead(200, { "Content-Type": "text/html" });
|
|
@@ -178,15 +192,16 @@ if (window.location.hash) {
|
|
|
178
192
|
</script><noscript>Enable JavaScript to complete login.</noscript></body></html>`);
|
|
179
193
|
}
|
|
180
194
|
});
|
|
181
|
-
server.listen(
|
|
182
|
-
|
|
195
|
+
server.listen(0, exports.OAUTH_CALLBACK_HOST, () => {
|
|
196
|
+
const addr = server.address();
|
|
197
|
+
resolve({ port: addr.port, waitForCallback });
|
|
183
198
|
});
|
|
184
199
|
server.on("error", (err) => {
|
|
185
200
|
reject(new Error(`Failed to start callback server: ${err.message}`));
|
|
186
201
|
});
|
|
187
202
|
setTimeout(() => {
|
|
188
203
|
server.close();
|
|
189
|
-
|
|
204
|
+
callbackReject(new Error("Login timed out after 120 seconds"));
|
|
190
205
|
}, 120_000);
|
|
191
206
|
});
|
|
192
207
|
}
|
package/dist/cloud/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/cloud/auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/cloud/auth.ts"],"names":[],"mappings":";;;AAwCA,0CAaC;AAOD,oDA4CC;AAED,0CAMC;AAED,4CAMC;AAED,gCAEC;AAED,kCASC;AAED,oDAEC;AAED,sDAEC;AAID,sDAEC;AAOD,4DA2EC;AAvOD,qCAAkE;AAClE,yCAAiC;AACjC,yCAAyC;AACzC,6CAAsD;AAEtD,yCAIoB;AACpB,0DAA8E;AAE9E,MAAM,YAAY,GAAG,IAAA,gBAAI,EACvB,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,MAAM,EACrD,UAAU,CACX,CAAC;AAEF,SAAS,iBAAiB;IACxB,IAAA,gCAAgB,EAAC,YAAY,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,IAAA,gBAAI,EAAC,YAAY,EAAE,2BAAgB,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,sBAAsB;IAC7B,MAAM,UAAU,GAAG,IAAA,gBAAI,EAAC,YAAY,EAAE,4BAAiB,CAAC,CAAC;IACzD,IAAI,IAAA,oBAAU,EAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,UAAU,EAAE,OAAO,CAAC,CAAgB,CAAC;QACtE,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB;QACpB,CAAC;IACH,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,iCAAsB;QAChC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE;KAClD,CAAC;AACJ,CAAC;AAED,SAAgB,eAAe;IAC7B,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,CAAC,IAAA,oBAAU,EAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,IAAI,EAAE,OAAO,CAAC,CAAqB,CAAC;QACzE,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACpD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,oBAAoB;IACxC,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,CAAC,IAAA,oBAAU,EAAC,IAAI,CAAC;QAAE,OAAO;IAE9B,IAAI,IAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,IAAI,EAAE,OAAO,CAAC,CAAqB,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO;IAC9D,IAAI,CAAC,IAAI,CAAC,aAAa;QAAE,OAAO;IAEhC,MAAM,MAAM,GAAG,sBAAsB,EAAE,CAAC;IACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,GAAG,QAAQ,yCAAyC,EACpD;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,MAAM,CAAC,OAAO;aACvB;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;SAC5D,CACF,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO;QAEpB,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAwB,CAAC;QACzD,MAAM,QAAQ,GAAqB;YACjC,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa;YACzD,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAE,MAAM,CAAC,UAAqB,IAAI,IAAI,CAAC,GAAG,IAAI;YACvE,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC;QACF,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,6DAA6D;IAC/D,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAAC,KAAuB;IACrD,iBAAiB,EAAE,CAAC;IACpB,IAAA,uBAAa,EAAC,eAAe,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;QACtE,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;IACH,IAAA,kCAAkB,EAAC,eAAe,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,SAAgB,gBAAgB;IAC9B,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,IAAA,oBAAU,EAAC,IAAI,CAAC,EAAE,CAAC;QACrB,IAAA,uBAAa,EAAC,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED,SAAgB,UAAU;IACxB,OAAO,eAAe,EAAE,KAAK,IAAI,CAAC;AACpC,CAAC;AAEM,KAAK,UAAU,WAAW;IAC/B,MAAM,oBAAoB,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,2CAA2C,CAC5C,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,oBAAoB;IAClC,OAAO,IAAA,yBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED,SAAgB,qBAAqB,CAAC,QAAgB;IACpD,OAAO,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AACnE,CAAC;AAEY,QAAA,mBAAmB,GAAG,WAAW,CAAC;AAE/C,SAAgB,qBAAqB,CAAC,IAAY,EAAE,OAAe,WAAW;IAC5E,OAAO,UAAU,2BAAmB,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;AACxD,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,wBAAwB;IAI5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,eAAwC,CAAC;QAC7C,IAAI,cAAuC,CAAC;QAC5C,MAAM,eAAe,GAAG,IAAI,OAAO,CAAS,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACvD,eAAe,GAAG,GAAG,CAAC;YACtB,cAAc,GAAG,GAAG,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAA,wBAAY,EAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACvC,MAAM,SAAS,GAAI,MAAM,CAAC,OAAO,EAAuB,EAAE,IAAI,IAAI,CAAC,CAAC;YACpE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC;YAEtE,IAAI,GAAG,CAAC,QAAQ,KAAK,iBAAiB,EAAE,CAAC;gBACvC,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBACnD,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;gBACtD,IAAI,KAAK,EAAE,CAAC;oBACV,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;oBACpD,GAAG,CAAC,GAAG,CACL,wCAAwC;wBACtC,8DAA8D;wBAC9D,gBAAgB,CACnB,CAAC;oBACF,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,eAAe,CAAC,YAAY,KAAK,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC;oBACtD,OAAO;gBACT,CAAC;YACH,CAAC;YAED,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,IAAI,EAAE,CAAC;gBACT,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;gBACpD,GAAG,CAAC,GAAG,CACL,wCAAwC;oBACtC,8DAA8D;oBAC9D,gBAAgB,CACnB,CAAC;gBACF,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,eAAe,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;gBACpD,GAAG,CAAC,GAAG,CAAC;;;;;;;;;;;;;iFAaiE,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,2BAAmB,EAAE,GAAG,EAAE;YACzC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAsB,CAAC;YAClD,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzB,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,cAAc,CAAC,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC;QACjE,CAAC,EAAE,OAAO,CAAC,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/cloud/client.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export declare function listGenes(options: {
|
|
|
9
9
|
page?: number;
|
|
10
10
|
perPage?: number;
|
|
11
11
|
}): Promise<CloudGeneListResponse>;
|
|
12
|
-
export declare function getGene(
|
|
12
|
+
export declare function getGene(idOrName: string): Promise<CloudGene>;
|
|
13
13
|
export declare function publishGene(opts: {
|
|
14
14
|
name: string;
|
|
15
15
|
domain: string;
|
|
@@ -18,6 +18,7 @@ export declare function publishGene(opts: {
|
|
|
18
18
|
description: string;
|
|
19
19
|
phenotype: Record<string, unknown>;
|
|
20
20
|
wasmBytes: Buffer | null;
|
|
21
|
+
contentHash: string;
|
|
21
22
|
readme?: string | null;
|
|
22
23
|
changelog?: string | null;
|
|
23
24
|
}): Promise<CloudGene & {
|
|
@@ -25,7 +26,7 @@ export declare function publishGene(opts: {
|
|
|
25
26
|
}>;
|
|
26
27
|
export declare function unpublishGene(id: string): Promise<void>;
|
|
27
28
|
export declare function downloadGeneWasm(wasmUrl: string): Promise<Buffer>;
|
|
28
|
-
export declare function trackDownload(geneId: string): Promise<void>;
|
|
29
|
+
export declare function trackDownload(geneId: string, source?: "cli" | "mcp" | "api" | "web"): Promise<void>;
|
|
29
30
|
export declare function arenaSubmit(geneId: string, fitness: FitnessReport): Promise<CloudArenaEntry>;
|
|
30
31
|
export declare function arenaRankings(options: {
|
|
31
32
|
domain?: string;
|
|
@@ -72,7 +73,7 @@ export interface GeneStatsResponse {
|
|
|
72
73
|
last_30d: number;
|
|
73
74
|
last_90d: number;
|
|
74
75
|
}
|
|
75
|
-
export declare function getGeneStats(
|
|
76
|
+
export declare function getGeneStats(idOrName: string): Promise<GeneStatsResponse>;
|
|
76
77
|
export interface ComputeLogEntry {
|
|
77
78
|
id: string;
|
|
78
79
|
compute_type: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/cloud/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/cloud/client.ts"],"names":[],"mappings":"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"}
|
package/dist/cloud/client.js
CHANGED
|
@@ -18,6 +18,7 @@ exports.getContributionMetrics = getContributionMetrics;
|
|
|
18
18
|
exports.getReputationLeaderboard = getReputationLeaderboard;
|
|
19
19
|
const node_fs_1 = require("node:fs");
|
|
20
20
|
const node_path_1 = require("node:path");
|
|
21
|
+
const node_crypto_1 = require("node:crypto");
|
|
21
22
|
const types_js_1 = require("./types.js");
|
|
22
23
|
const auth_js_1 = require("./auth.js");
|
|
23
24
|
const ROTIFER_HOME = (0, node_path_1.join)(process.env.HOME || process.env.USERPROFILE || "/tmp", ".rotifer");
|
|
@@ -46,7 +47,7 @@ function storageUrl(path) {
|
|
|
46
47
|
const base = config.endpoint.replace(/\/+$/, "");
|
|
47
48
|
return `${base}/storage/v1${path}`;
|
|
48
49
|
}
|
|
49
|
-
function authHeaders(
|
|
50
|
+
function authHeaders(isTokenRequired = false) {
|
|
50
51
|
const config = loadCloudConfig();
|
|
51
52
|
const headers = {
|
|
52
53
|
"Content-Type": "application/json",
|
|
@@ -56,7 +57,7 @@ function authHeaders(requireToken = false) {
|
|
|
56
57
|
if (creds) {
|
|
57
58
|
headers["Authorization"] = `Bearer ${creds.access_token}`;
|
|
58
59
|
}
|
|
59
|
-
else if (
|
|
60
|
+
else if (isTokenRequired) {
|
|
60
61
|
throw new Error("Not logged in. Run 'rotifer login' first.");
|
|
61
62
|
}
|
|
62
63
|
return headers;
|
|
@@ -76,44 +77,27 @@ async function handleResponse(res) {
|
|
|
76
77
|
}
|
|
77
78
|
return res.json();
|
|
78
79
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
80
|
+
function normalizeSearchSort(sort) {
|
|
81
|
+
const requested = (sort || "newest").toLowerCase();
|
|
82
|
+
switch (requested) {
|
|
83
|
+
case "newest":
|
|
84
|
+
case "relevance":
|
|
85
|
+
case "downloads":
|
|
86
|
+
case "reputation":
|
|
87
|
+
return requested;
|
|
88
|
+
case "popular":
|
|
89
|
+
return "downloads";
|
|
90
|
+
case "fitness":
|
|
91
|
+
throw new Error("Cloud search cannot sort by F(g). Use '--sort reputation' or 'rotifer arena list --cloud' for fitness-based rankings.");
|
|
92
|
+
default:
|
|
93
|
+
throw new Error(`Unsupported sort order '${sort}'. Use one of: newest, relevance, popular, downloads, reputation.`);
|
|
88
94
|
}
|
|
89
|
-
return [...map.values()].sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());
|
|
90
95
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
params.set("published", "eq.true");
|
|
94
|
-
params.set("select", "id,name,domain,version,fidelity,description,wasm_size,downloads,reputation_score,created_at,updated_at,profiles(username)");
|
|
95
|
-
params.set("order", "created_at.desc");
|
|
96
|
-
if (options.domain)
|
|
97
|
-
params.set("domain", `eq.${options.domain}`);
|
|
98
|
-
if (options.fidelity)
|
|
99
|
-
params.set("fidelity", `eq.${options.fidelity}`);
|
|
100
|
-
if (options.query)
|
|
101
|
-
params.set("or", `(name.ilike.*${options.query}*,description.ilike.*${options.query}*)`);
|
|
102
|
-
const limit = options.perPage || 20;
|
|
103
|
-
const fetchLimit = limit * 3;
|
|
104
|
-
params.set("limit", String(fetchLimit));
|
|
105
|
-
params.set("offset", "0");
|
|
106
|
-
const res = await fetch(apiUrl(`/genes?${params}`), {
|
|
107
|
-
headers: {
|
|
108
|
-
...authHeaders(),
|
|
109
|
-
Prefer: "count=exact",
|
|
110
|
-
},
|
|
111
|
-
});
|
|
112
|
-
const data = await handleResponse(res);
|
|
113
|
-
const allGenes = data.map((row) => ({
|
|
96
|
+
function mapSearchGene(row) {
|
|
97
|
+
return {
|
|
114
98
|
id: row.id,
|
|
115
99
|
name: row.name,
|
|
116
|
-
owner: row.
|
|
100
|
+
owner: row.owner_username || "unknown",
|
|
117
101
|
domain: row.domain,
|
|
118
102
|
version: row.version,
|
|
119
103
|
fidelity: row.fidelity,
|
|
@@ -121,28 +105,97 @@ async function listGenes(options) {
|
|
|
121
105
|
phenotype: {},
|
|
122
106
|
wasm_url: null,
|
|
123
107
|
wasm_size: row.wasm_size || 0,
|
|
108
|
+
wasm_hash: row.wasm_hash ?? null,
|
|
109
|
+
content_hash: row.content_hash ?? null,
|
|
124
110
|
downloads: row.downloads || 0,
|
|
125
111
|
fitness: null,
|
|
126
112
|
reputation_score: row.reputation_score ?? null,
|
|
127
113
|
created_at: row.created_at,
|
|
128
114
|
updated_at: row.updated_at,
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
function parseExactSearchTotal(rows) {
|
|
118
|
+
const raw = rows[0]?.total_count;
|
|
119
|
+
if (raw == null)
|
|
120
|
+
return null;
|
|
121
|
+
const parsed = typeof raw === "number" ? raw : parseInt(String(raw), 10);
|
|
122
|
+
return Number.isFinite(parsed) && parsed >= 0 ? parsed : null;
|
|
123
|
+
}
|
|
124
|
+
async function fetchSearchGenes(body) {
|
|
125
|
+
const res = await fetch(apiUrl("/rpc/search_genes"), {
|
|
126
|
+
method: "POST",
|
|
127
|
+
headers: authHeaders(),
|
|
128
|
+
body: JSON.stringify(body),
|
|
129
|
+
});
|
|
130
|
+
return handleResponse(res);
|
|
131
|
+
}
|
|
132
|
+
async function listGenes(options) {
|
|
133
|
+
const limit = Number.isFinite(options.perPage) && options.perPage > 0
|
|
134
|
+
? Math.min(Math.floor(options.perPage), 100)
|
|
135
|
+
: 20;
|
|
136
|
+
const page = Number.isFinite(options.page) && options.page > 0
|
|
137
|
+
? Math.floor(options.page)
|
|
138
|
+
: 1;
|
|
132
139
|
const offset = (page - 1) * limit;
|
|
133
|
-
const
|
|
134
|
-
|
|
140
|
+
const sort = normalizeSearchSort(options.sort);
|
|
141
|
+
const query = options.query?.trim() || null;
|
|
142
|
+
const requestBody = {
|
|
143
|
+
p_query: query,
|
|
144
|
+
p_domain: options.domain || null,
|
|
145
|
+
p_fidelity: options.fidelity || null,
|
|
146
|
+
p_sort: sort,
|
|
147
|
+
p_limit: limit,
|
|
148
|
+
p_offset: offset,
|
|
149
|
+
};
|
|
150
|
+
const rows = await fetchSearchGenes(requestBody);
|
|
151
|
+
const genes = rows.map(mapSearchGene);
|
|
152
|
+
let total = parseExactSearchTotal(rows);
|
|
153
|
+
let isTotalExact = total != null;
|
|
154
|
+
if (!isTotalExact) {
|
|
155
|
+
if (rows.length === 0 && page === 1) {
|
|
156
|
+
total = 0;
|
|
157
|
+
isTotalExact = true;
|
|
158
|
+
}
|
|
159
|
+
else if (rows.length < limit) {
|
|
160
|
+
total = offset + rows.length;
|
|
161
|
+
isTotalExact = true;
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
const countRows = await fetchSearchGenes({ ...requestBody, p_limit: 1, p_offset: 0 });
|
|
165
|
+
total = parseExactSearchTotal(countRows);
|
|
166
|
+
isTotalExact = total != null;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
genes,
|
|
171
|
+
total: total ?? offset + rows.length,
|
|
172
|
+
page,
|
|
173
|
+
per_page: limit,
|
|
174
|
+
total_exact: isTotalExact,
|
|
175
|
+
};
|
|
135
176
|
}
|
|
136
|
-
async function getGene(
|
|
177
|
+
async function getGene(idOrName) {
|
|
178
|
+
const isUuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(idOrName);
|
|
179
|
+
const isContentHash = /^[0-9a-f]{64}$/i.test(idOrName);
|
|
137
180
|
const params = new URLSearchParams();
|
|
138
|
-
|
|
181
|
+
if (isUuid) {
|
|
182
|
+
params.set("id", `eq.${idOrName}`);
|
|
183
|
+
}
|
|
184
|
+
else if (isContentHash) {
|
|
185
|
+
params.set("content_hash", `eq.${idOrName}`);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
params.set("name", `eq.${idOrName}`);
|
|
189
|
+
params.set("order", "created_at.desc");
|
|
190
|
+
params.set("limit", "1");
|
|
191
|
+
}
|
|
139
192
|
params.set("select", "*, profiles(username)");
|
|
140
193
|
const res = await fetch(apiUrl(`/genes?${params}`), {
|
|
141
194
|
headers: authHeaders(),
|
|
142
195
|
});
|
|
143
196
|
const data = await handleResponse(res);
|
|
144
197
|
if (data.length === 0)
|
|
145
|
-
throw new Error(`Gene '${
|
|
198
|
+
throw new Error(`Gene '${idOrName}' not found`);
|
|
146
199
|
const row = data[0];
|
|
147
200
|
const config = loadCloudConfig();
|
|
148
201
|
const wasmUrl = row.wasm_path
|
|
@@ -159,6 +212,8 @@ async function getGene(id) {
|
|
|
159
212
|
phenotype: row.phenotype || {},
|
|
160
213
|
wasm_url: wasmUrl,
|
|
161
214
|
wasm_size: row.wasm_size || 0,
|
|
215
|
+
wasm_hash: row.wasm_hash ?? null,
|
|
216
|
+
content_hash: row.content_hash ?? null,
|
|
162
217
|
downloads: row.downloads || 0,
|
|
163
218
|
fitness: null,
|
|
164
219
|
reputation_score: row.reputation_score ?? null,
|
|
@@ -171,11 +226,20 @@ async function publishGene(opts) {
|
|
|
171
226
|
const creds = (0, auth_js_1.loadCredentials)();
|
|
172
227
|
if (!creds)
|
|
173
228
|
throw new Error("Not logged in. Run 'rotifer login' first.");
|
|
229
|
+
const existCheck = await fetch(apiUrl(`/genes?owner_id=eq.${creds.user.id}&name=eq.${opts.name}&version=eq.${opts.version}&select=id,published`), { headers: authHeaders() });
|
|
230
|
+
const existData = existCheck.ok ? (await existCheck.json()) : [];
|
|
231
|
+
const isUpdate = existData.length > 0;
|
|
232
|
+
if (isUpdate && existData[0].published) {
|
|
233
|
+
throw new Error(`Version ${opts.version} of '${opts.name}' is already published and immutable. ` +
|
|
234
|
+
`Bump the version number in phenotype.json to publish a new version.`);
|
|
235
|
+
}
|
|
174
236
|
let wasmPath = null;
|
|
175
237
|
let wasmSize = 0;
|
|
238
|
+
let wasmHash = null;
|
|
176
239
|
if (opts.wasmBytes) {
|
|
177
240
|
wasmPath = `${creds.user.id}/${opts.name}/${opts.version}/gene.ir.wasm`;
|
|
178
241
|
wasmSize = opts.wasmBytes.length;
|
|
242
|
+
wasmHash = (0, node_crypto_1.createHash)("sha256").update(opts.wasmBytes).digest("hex");
|
|
179
243
|
const uploadRes = await fetch(storageUrl(`/object/gene-wasm/${wasmPath}`), {
|
|
180
244
|
method: "POST",
|
|
181
245
|
headers: {
|
|
@@ -191,9 +255,6 @@ async function publishGene(opts) {
|
|
|
191
255
|
throw new Error(`Failed to upload WASM: ${err}`);
|
|
192
256
|
}
|
|
193
257
|
}
|
|
194
|
-
const existCheck = await fetch(apiUrl(`/genes?owner_id=eq.${creds.user.id}&name=eq.${opts.name}&version=eq.${opts.version}&select=id`), { headers: authHeaders() });
|
|
195
|
-
const existData = existCheck.ok ? (await existCheck.json()) : [];
|
|
196
|
-
const isUpdate = existData.length > 0;
|
|
197
258
|
let previousVersionId = null;
|
|
198
259
|
if (!isUpdate) {
|
|
199
260
|
const prevCheck = await fetch(apiUrl(`/genes?owner_id=eq.${creds.user.id}&name=eq.${opts.name}&select=id&order=created_at.desc&limit=1`), { headers: authHeaders() });
|
|
@@ -215,6 +276,8 @@ async function publishGene(opts) {
|
|
|
215
276
|
phenotype: opts.phenotype,
|
|
216
277
|
wasm_path: wasmPath,
|
|
217
278
|
wasm_size: wasmSize,
|
|
279
|
+
wasm_hash: wasmHash,
|
|
280
|
+
content_hash: opts.contentHash,
|
|
218
281
|
published: true,
|
|
219
282
|
};
|
|
220
283
|
if (opts.readme)
|
|
@@ -223,11 +286,11 @@ async function publishGene(opts) {
|
|
|
223
286
|
body.changelog = changelog;
|
|
224
287
|
if (previousVersionId)
|
|
225
288
|
body.previous_version_id = previousVersionId;
|
|
226
|
-
const res = await fetch(apiUrl("/genes
|
|
289
|
+
const res = await fetch(apiUrl("/genes"), {
|
|
227
290
|
method: "POST",
|
|
228
291
|
headers: {
|
|
229
292
|
...authHeaders(true),
|
|
230
|
-
Prefer: "return=representation
|
|
293
|
+
Prefer: "return=representation",
|
|
231
294
|
},
|
|
232
295
|
body: JSON.stringify(body),
|
|
233
296
|
});
|
|
@@ -246,6 +309,8 @@ async function publishGene(opts) {
|
|
|
246
309
|
? `${loadCloudConfig().endpoint}/storage/v1/object/public/gene-wasm/${wasmPath}`
|
|
247
310
|
: null,
|
|
248
311
|
wasm_size: row.wasm_size,
|
|
312
|
+
wasm_hash: row.wasm_hash ?? null,
|
|
313
|
+
content_hash: row.content_hash ?? null,
|
|
249
314
|
downloads: 0,
|
|
250
315
|
fitness: null,
|
|
251
316
|
reputation_score: row.reputation_score ?? null,
|
|
@@ -255,6 +320,10 @@ async function publishGene(opts) {
|
|
|
255
320
|
};
|
|
256
321
|
}
|
|
257
322
|
async function unpublishGene(id) {
|
|
323
|
+
const geneRes = await fetch(apiUrl(`/genes?id=eq.${id}&select=wasm_path,owner_id`), {
|
|
324
|
+
headers: authHeaders(),
|
|
325
|
+
});
|
|
326
|
+
const geneData = geneRes.ok ? (await geneRes.json()) : [];
|
|
258
327
|
const res = await fetch(apiUrl(`/genes?id=eq.${id}`), {
|
|
259
328
|
method: "PATCH",
|
|
260
329
|
headers: {
|
|
@@ -267,6 +336,16 @@ async function unpublishGene(id) {
|
|
|
267
336
|
const err = await res.text();
|
|
268
337
|
throw new Error(`Failed to unpublish gene: ${err}`);
|
|
269
338
|
}
|
|
339
|
+
if (geneData.length > 0 && geneData[0].wasm_path) {
|
|
340
|
+
try {
|
|
341
|
+
await fetch(storageUrl(`/object/${geneData[0].wasm_path}`), {
|
|
342
|
+
method: "DELETE",
|
|
343
|
+
headers: authHeaders(true),
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
catch { /* WASM cleanup is best-effort */ }
|
|
347
|
+
}
|
|
348
|
+
// Reputation recompute after unpublish is handled by server-side triggers (service_role only)
|
|
270
349
|
}
|
|
271
350
|
async function downloadGeneWasm(wasmUrl) {
|
|
272
351
|
const res = await fetch(wasmUrl);
|
|
@@ -275,12 +354,12 @@ async function downloadGeneWasm(wasmUrl) {
|
|
|
275
354
|
const arrayBuf = await res.arrayBuffer();
|
|
276
355
|
return Buffer.from(arrayBuf);
|
|
277
356
|
}
|
|
278
|
-
async function trackDownload(geneId) {
|
|
357
|
+
async function trackDownload(geneId, source = "cli") {
|
|
279
358
|
try {
|
|
280
359
|
const res = await fetch(apiUrl("/rpc/track_download"), {
|
|
281
360
|
method: "POST",
|
|
282
361
|
headers: authHeaders(),
|
|
283
|
-
body: JSON.stringify({ p_gene_id: geneId }),
|
|
362
|
+
body: JSON.stringify({ p_gene_id: geneId, p_source: source }),
|
|
284
363
|
});
|
|
285
364
|
if (!res.ok) {
|
|
286
365
|
const body = await res.text().catch(() => "");
|
|
@@ -302,7 +381,6 @@ async function arenaSubmit(geneId, fitness) {
|
|
|
302
381
|
success_rate: fitness.success_rate,
|
|
303
382
|
latency_score: fitness.latency_score,
|
|
304
383
|
resource_efficiency: fitness.resource_efficiency,
|
|
305
|
-
total_calls: 1,
|
|
306
384
|
};
|
|
307
385
|
const res = await fetch(apiUrl("/arena_entries"), {
|
|
308
386
|
method: "POST",
|
|
@@ -378,16 +456,9 @@ async function getGeneReputation(geneId) {
|
|
|
378
456
|
});
|
|
379
457
|
const data = await handleResponse(res);
|
|
380
458
|
if (data.length === 0) {
|
|
381
|
-
// No reputation computed yet — compute on the fly via RPC
|
|
382
|
-
const rpcRes = await fetch(apiUrl("/rpc/compute_gene_reputation"), {
|
|
383
|
-
method: "POST",
|
|
384
|
-
headers: authHeaders(),
|
|
385
|
-
body: JSON.stringify({ p_gene_id: geneId }),
|
|
386
|
-
});
|
|
387
|
-
const score = await handleResponse(rpcRes);
|
|
388
459
|
return {
|
|
389
460
|
gene_name: geneId,
|
|
390
|
-
score,
|
|
461
|
+
score: 0,
|
|
391
462
|
arena_score: 0,
|
|
392
463
|
usage_score: 0,
|
|
393
464
|
stability_score: 0,
|
|
@@ -414,14 +485,8 @@ async function getDeveloperReputation(userId) {
|
|
|
414
485
|
});
|
|
415
486
|
const data = await handleResponse(res);
|
|
416
487
|
if (data.length === 0) {
|
|
417
|
-
const rpcRes = await fetch(apiUrl("/rpc/compute_developer_reputation"), {
|
|
418
|
-
method: "POST",
|
|
419
|
-
headers: authHeaders(),
|
|
420
|
-
body: JSON.stringify({ p_user_id: userId }),
|
|
421
|
-
});
|
|
422
|
-
const score = await handleResponse(rpcRes);
|
|
423
488
|
return {
|
|
424
|
-
score,
|
|
489
|
+
score: 0,
|
|
425
490
|
genes_published: 0,
|
|
426
491
|
total_downloads: 0,
|
|
427
492
|
arena_wins: 0,
|
|
@@ -457,7 +522,13 @@ async function listGeneVersions(owner, name) {
|
|
|
457
522
|
created_at: row.created_at,
|
|
458
523
|
}));
|
|
459
524
|
}
|
|
460
|
-
async function getGeneStats(
|
|
525
|
+
async function getGeneStats(idOrName) {
|
|
526
|
+
const isUuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(idOrName);
|
|
527
|
+
let geneId = idOrName;
|
|
528
|
+
if (!isUuid) {
|
|
529
|
+
const gene = await getGene(idOrName);
|
|
530
|
+
geneId = gene.id;
|
|
531
|
+
}
|
|
461
532
|
const res = await fetch(apiUrl("/rpc/get_gene_stats"), {
|
|
462
533
|
method: "POST",
|
|
463
534
|
headers: authHeaders(),
|