@kindgi/cli 0.0.0-bootstrap.0 → 0.1.1
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 +201 -0
- package/README.md +738 -1
- package/dist/build/apt.d.ts +16 -0
- package/dist/build/apt.d.ts.map +1 -0
- package/dist/build/apt.js +50 -0
- package/dist/build/apt.js.map +1 -0
- package/dist/build/bundle.d.ts +48 -0
- package/dist/build/bundle.d.ts.map +1 -0
- package/dist/build/bundle.js +125 -0
- package/dist/build/bundle.js.map +1 -0
- package/dist/build/containerfile.d.ts +27 -0
- package/dist/build/containerfile.d.ts.map +1 -0
- package/dist/build/containerfile.js +197 -0
- package/dist/build/containerfile.js.map +1 -0
- package/dist/build/context-files.d.ts +24 -0
- package/dist/build/context-files.d.ts.map +1 -0
- package/dist/build/context-files.js +99 -0
- package/dist/build/context-files.js.map +1 -0
- package/dist/build/defaults.d.ts +66 -0
- package/dist/build/defaults.d.ts.map +1 -0
- package/dist/build/defaults.js +597 -0
- package/dist/build/defaults.js.map +1 -0
- package/dist/build/envelope.d.ts +72 -0
- package/dist/build/envelope.d.ts.map +1 -0
- package/dist/build/envelope.js +76 -0
- package/dist/build/envelope.js.map +1 -0
- package/dist/build/host-install.d.ts +100 -0
- package/dist/build/host-install.d.ts.map +1 -0
- package/dist/build/host-install.js +443 -0
- package/dist/build/host-install.js.map +1 -0
- package/dist/build/image-config.d.ts +32 -0
- package/dist/build/image-config.d.ts.map +1 -0
- package/dist/build/image-config.js +129 -0
- package/dist/build/image-config.js.map +1 -0
- package/dist/build/integrity.d.ts +51 -0
- package/dist/build/integrity.d.ts.map +1 -0
- package/dist/build/integrity.js +75 -0
- package/dist/build/integrity.js.map +1 -0
- package/dist/build/node-image.d.ts +18 -0
- package/dist/build/node-image.d.ts.map +1 -0
- package/dist/build/node-image.js +46 -0
- package/dist/build/node-image.js.map +1 -0
- package/dist/build/pack-root.d.ts +69 -0
- package/dist/build/pack-root.d.ts.map +1 -0
- package/dist/build/pack-root.js +102 -0
- package/dist/build/pack-root.js.map +1 -0
- package/dist/build/poetry-requirements.d.ts +5 -0
- package/dist/build/poetry-requirements.d.ts.map +1 -0
- package/dist/build/poetry-requirements.js +8 -0
- package/dist/build/poetry-requirements.js.map +1 -0
- package/dist/build/python-image.d.ts +40 -0
- package/dist/build/python-image.d.ts.map +1 -0
- package/dist/build/python-image.js +197 -0
- package/dist/build/python-image.js.map +1 -0
- package/dist/build/runners.d.ts +259 -0
- package/dist/build/runners.d.ts.map +1 -0
- package/dist/build/runners.js +4 -0
- package/dist/build/runners.js.map +1 -0
- package/dist/build/version-specifier.d.ts +2 -0
- package/dist/build/version-specifier.d.ts.map +1 -0
- package/dist/build/version-specifier.js +70 -0
- package/dist/build/version-specifier.js.map +1 -0
- package/dist/cli-package.d.ts +15 -0
- package/dist/cli-package.d.ts.map +1 -0
- package/dist/cli-package.js +37 -0
- package/dist/cli-package.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +26 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/adapters.d.ts +3 -0
- package/dist/commands/adapters.d.ts.map +1 -0
- package/dist/commands/adapters.js +148 -0
- package/dist/commands/adapters.js.map +1 -0
- package/dist/commands/agents.d.ts +3 -0
- package/dist/commands/agents.d.ts.map +1 -0
- package/dist/commands/agents.js +82 -0
- package/dist/commands/agents.js.map +1 -0
- package/dist/commands/approvals.d.ts +3 -0
- package/dist/commands/approvals.d.ts.map +1 -0
- package/dist/commands/approvals.js +92 -0
- package/dist/commands/approvals.js.map +1 -0
- package/dist/commands/artifacts.d.ts +3 -0
- package/dist/commands/artifacts.d.ts.map +1 -0
- package/dist/commands/artifacts.js +87 -0
- package/dist/commands/artifacts.js.map +1 -0
- package/dist/commands/auth.d.ts +25 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +283 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/build.d.ts +46 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +902 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/capabilities.d.ts +3 -0
- package/dist/commands/capabilities.d.ts.map +1 -0
- package/dist/commands/capabilities.js +38 -0
- package/dist/commands/capabilities.js.map +1 -0
- package/dist/commands/conversations.d.ts +3 -0
- package/dist/commands/conversations.d.ts.map +1 -0
- package/dist/commands/conversations.js +75 -0
- package/dist/commands/conversations.js.map +1 -0
- package/dist/commands/deploy.d.ts +7 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +697 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/dev.d.ts +43 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +1110 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/env.d.ts +27 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +816 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/feedback.d.ts +33 -0
- package/dist/commands/feedback.d.ts.map +1 -0
- package/dist/commands/feedback.js +374 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/flows.d.ts +3 -0
- package/dist/commands/flows.d.ts.map +1 -0
- package/dist/commands/flows.js +60 -0
- package/dist/commands/flows.js.map +1 -0
- package/dist/commands/guardrails.d.ts +3 -0
- package/dist/commands/guardrails.d.ts.map +1 -0
- package/dist/commands/guardrails.js +89 -0
- package/dist/commands/guardrails.js.map +1 -0
- package/dist/commands/health.d.ts +8 -0
- package/dist/commands/health.d.ts.map +1 -0
- package/dist/commands/health.js +40 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/helpers.d.ts +48 -0
- package/dist/commands/helpers.d.ts.map +1 -0
- package/dist/commands/helpers.js +110 -0
- package/dist/commands/helpers.js.map +1 -0
- package/dist/commands/index.d.ts +7 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +90 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +46 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +454 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/key.d.ts +3 -0
- package/dist/commands/key.d.ts.map +1 -0
- package/dist/commands/key.js +322 -0
- package/dist/commands/key.js.map +1 -0
- package/dist/commands/mcp.d.ts +43 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +433 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/memory.d.ts +3 -0
- package/dist/commands/memory.d.ts.map +1 -0
- package/dist/commands/memory.js +82 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/observations.d.ts +3 -0
- package/dist/commands/observations.d.ts.map +1 -0
- package/dist/commands/observations.js +27 -0
- package/dist/commands/observations.js.map +1 -0
- package/dist/commands/proposals.d.ts +3 -0
- package/dist/commands/proposals.d.ts.map +1 -0
- package/dist/commands/proposals.js +116 -0
- package/dist/commands/proposals.js.map +1 -0
- package/dist/commands/provenance.d.ts +3 -0
- package/dist/commands/provenance.d.ts.map +1 -0
- package/dist/commands/provenance.js +53 -0
- package/dist/commands/provenance.js.map +1 -0
- package/dist/commands/providers.d.ts +3 -0
- package/dist/commands/providers.d.ts.map +1 -0
- package/dist/commands/providers.js +212 -0
- package/dist/commands/providers.js.map +1 -0
- package/dist/commands/reviewers.d.ts +3 -0
- package/dist/commands/reviewers.d.ts.map +1 -0
- package/dist/commands/reviewers.js +78 -0
- package/dist/commands/reviewers.js.map +1 -0
- package/dist/commands/runs.d.ts +3 -0
- package/dist/commands/runs.d.ts.map +1 -0
- package/dist/commands/runs.js +223 -0
- package/dist/commands/runs.js.map +1 -0
- package/dist/commands/secrets.d.ts +18 -0
- package/dist/commands/secrets.d.ts.map +1 -0
- package/dist/commands/secrets.js +702 -0
- package/dist/commands/secrets.js.map +1 -0
- package/dist/commands/skills.d.ts +64 -0
- package/dist/commands/skills.d.ts.map +1 -0
- package/dist/commands/skills.js +430 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/test.d.ts +5 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +181 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/commands/tokens.d.ts +3 -0
- package/dist/commands/tokens.d.ts.map +1 -0
- package/dist/commands/tokens.js +33 -0
- package/dist/commands/tokens.js.map +1 -0
- package/dist/commands/tools.d.ts +3 -0
- package/dist/commands/tools.d.ts.map +1 -0
- package/dist/commands/tools.js +162 -0
- package/dist/commands/tools.js.map +1 -0
- package/dist/commands/types.d.ts +54 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +4 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/commands/unwired.d.ts +22 -0
- package/dist/commands/unwired.d.ts.map +1 -0
- package/dist/commands/unwired.js +52 -0
- package/dist/commands/unwired.js.map +1 -0
- package/dist/commands/version.d.ts +8 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/version.js +41 -0
- package/dist/commands/version.js.map +1 -0
- package/dist/config.d.ts +42 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +83 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +162 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +45 -0
- package/dist/context.js.map +1 -0
- package/dist/deploy/defaults.d.ts +14 -0
- package/dist/deploy/defaults.d.ts.map +1 -0
- package/dist/deploy/defaults.js +37 -0
- package/dist/deploy/defaults.js.map +1 -0
- package/dist/deploy/envelope-loader.d.ts +24 -0
- package/dist/deploy/envelope-loader.d.ts.map +1 -0
- package/dist/deploy/envelope-loader.js +141 -0
- package/dist/deploy/envelope-loader.js.map +1 -0
- package/dist/deploy/post.d.ts +48 -0
- package/dist/deploy/post.d.ts.map +1 -0
- package/dist/deploy/post.js +210 -0
- package/dist/deploy/post.js.map +1 -0
- package/dist/deploy/response.d.ts +42 -0
- package/dist/deploy/response.d.ts.map +1 -0
- package/dist/deploy/response.js +128 -0
- package/dist/deploy/response.js.map +1 -0
- package/dist/deploy/runners.d.ts +218 -0
- package/dist/deploy/runners.d.ts.map +1 -0
- package/dist/deploy/runners.js +4 -0
- package/dist/deploy/runners.js.map +1 -0
- package/dist/dev/bundler.d.ts +10 -0
- package/dist/dev/bundler.d.ts.map +1 -0
- package/dist/dev/bundler.js +235 -0
- package/dist/dev/bundler.js.map +1 -0
- package/dist/dev/defaults.d.ts +140 -0
- package/dist/dev/defaults.d.ts.map +1 -0
- package/dist/dev/defaults.js +709 -0
- package/dist/dev/defaults.js.map +1 -0
- package/dist/dev/dev-only-imports.d.ts +15 -0
- package/dist/dev/dev-only-imports.d.ts.map +1 -0
- package/dist/dev/dev-only-imports.js +57 -0
- package/dist/dev/dev-only-imports.js.map +1 -0
- package/dist/dev/docker-compose.dev.yml +68 -0
- package/dist/dev/index-child.d.ts +2 -0
- package/dist/dev/index-child.d.ts.map +1 -0
- package/dist/dev/index-child.js +53 -0
- package/dist/dev/index-child.js.map +1 -0
- package/dist/dev/pack-code.d.ts +36 -0
- package/dist/dev/pack-code.d.ts.map +1 -0
- package/dist/dev/pack-code.js +129 -0
- package/dist/dev/pack-code.js.map +1 -0
- package/dist/dev/pack-env.d.ts +13 -0
- package/dist/dev/pack-env.d.ts.map +1 -0
- package/dist/dev/pack-env.js +36 -0
- package/dist/dev/pack-env.js.map +1 -0
- package/dist/dev/pack-service.d.ts +40 -0
- package/dist/dev/pack-service.d.ts.map +1 -0
- package/dist/dev/pack-service.js +189 -0
- package/dist/dev/pack-service.js.map +1 -0
- package/dist/dev/paths.d.ts +22 -0
- package/dist/dev/paths.d.ts.map +1 -0
- package/dist/dev/paths.js +35 -0
- package/dist/dev/paths.js.map +1 -0
- package/dist/dev/postgres-container.d.ts +77 -0
- package/dist/dev/postgres-container.d.ts.map +1 -0
- package/dist/dev/postgres-container.js +346 -0
- package/dist/dev/postgres-container.js.map +1 -0
- package/dist/dev/python-builder.d.ts +16 -0
- package/dist/dev/python-builder.d.ts.map +1 -0
- package/dist/dev/python-builder.js +122 -0
- package/dist/dev/python-builder.js.map +1 -0
- package/dist/dev/register.d.ts +71 -0
- package/dist/dev/register.d.ts.map +1 -0
- package/dist/dev/register.js +54 -0
- package/dist/dev/register.js.map +1 -0
- package/dist/dev/runners.d.ts +312 -0
- package/dist/dev/runners.d.ts.map +1 -0
- package/dist/dev/runners.js +4 -0
- package/dist/dev/runners.js.map +1 -0
- package/dist/dev/runtime-container.d.ts +71 -0
- package/dist/dev/runtime-container.d.ts.map +1 -0
- package/dist/dev/runtime-container.js +173 -0
- package/dist/dev/runtime-container.js.map +1 -0
- package/dist/dev/runtime-env.d.ts +62 -0
- package/dist/dev/runtime-env.d.ts.map +1 -0
- package/dist/dev/runtime-env.js +100 -0
- package/dist/dev/runtime-env.js.map +1 -0
- package/dist/dev/runtime-image.d.ts +26 -0
- package/dist/dev/runtime-image.d.ts.map +1 -0
- package/dist/dev/runtime-image.js +44 -0
- package/dist/dev/runtime-image.js.map +1 -0
- package/dist/dev/runtime-registry.d.ts +73 -0
- package/dist/dev/runtime-registry.d.ts.map +1 -0
- package/dist/dev/runtime-registry.js +111 -0
- package/dist/dev/runtime-registry.js.map +1 -0
- package/dist/env/defaults.d.ts +3 -0
- package/dist/env/defaults.d.ts.map +1 -0
- package/dist/env/defaults.js +22 -0
- package/dist/env/defaults.js.map +1 -0
- package/dist/env/pack-env-plan.d.ts +70 -0
- package/dist/env/pack-env-plan.d.ts.map +1 -0
- package/dist/env/pack-env-plan.js +236 -0
- package/dist/env/pack-env-plan.js.map +1 -0
- package/dist/env/parser.d.ts +9 -0
- package/dist/env/parser.d.ts.map +1 -0
- package/dist/env/parser.js +11 -0
- package/dist/env/parser.js.map +1 -0
- package/dist/env/project-env.d.ts +34 -0
- package/dist/env/project-env.d.ts.map +1 -0
- package/dist/env/project-env.js +45 -0
- package/dist/env/project-env.js.map +1 -0
- package/dist/env/runners.d.ts +22 -0
- package/dist/env/runners.d.ts.map +1 -0
- package/dist/env/runners.js +4 -0
- package/dist/env/runners.js.map +1 -0
- package/dist/env/writer.d.ts +7 -0
- package/dist/env/writer.d.ts.map +1 -0
- package/dist/env/writer.js +9 -0
- package/dist/env/writer.js.map +1 -0
- package/dist/errors.d.ts +31 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +111 -0
- package/dist/errors.js.map +1 -0
- package/dist/help.d.ts +5 -0
- package/dist/help.d.ts.map +1 -0
- package/dist/help.js +61 -0
- package/dist/help.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/init/augment-scaffolder.d.ts +86 -0
- package/dist/init/augment-scaffolder.d.ts.map +1 -0
- package/dist/init/augment-scaffolder.js +538 -0
- package/dist/init/augment-scaffolder.js.map +1 -0
- package/dist/init/dependency-specs.d.ts +58 -0
- package/dist/init/dependency-specs.d.ts.map +1 -0
- package/dist/init/dependency-specs.js +153 -0
- package/dist/init/dependency-specs.js.map +1 -0
- package/dist/init/gitignore-patcher.d.ts +23 -0
- package/dist/init/gitignore-patcher.d.ts.map +1 -0
- package/dist/init/gitignore-patcher.js +103 -0
- package/dist/init/gitignore-patcher.js.map +1 -0
- package/dist/init/mode-detect.d.ts +34 -0
- package/dist/init/mode-detect.d.ts.map +1 -0
- package/dist/init/mode-detect.js +115 -0
- package/dist/init/mode-detect.js.map +1 -0
- package/dist/init/package-json-patcher.d.ts +36 -0
- package/dist/init/package-json-patcher.d.ts.map +1 -0
- package/dist/init/package-json-patcher.js +128 -0
- package/dist/init/package-json-patcher.js.map +1 -0
- package/dist/init/pnpm-workspace-patcher.d.ts +55 -0
- package/dist/init/pnpm-workspace-patcher.d.ts.map +1 -0
- package/dist/init/pnpm-workspace-patcher.js +248 -0
- package/dist/init/pnpm-workspace-patcher.js.map +1 -0
- package/dist/init/pyproject-patcher.d.ts +56 -0
- package/dist/init/pyproject-patcher.d.ts.map +1 -0
- package/dist/init/pyproject-patcher.js +324 -0
- package/dist/init/pyproject-patcher.js.map +1 -0
- package/dist/init/python-augment.d.ts +22 -0
- package/dist/init/python-augment.d.ts.map +1 -0
- package/dist/init/python-augment.js +300 -0
- package/dist/init/python-augment.js.map +1 -0
- package/dist/init/template-files.d.ts +18 -0
- package/dist/init/template-files.d.ts.map +1 -0
- package/dist/init/template-files.js +53 -0
- package/dist/init/template-files.js.map +1 -0
- package/dist/key/defaults.d.ts +3 -0
- package/dist/key/defaults.d.ts.map +1 -0
- package/dist/key/defaults.js +60 -0
- package/dist/key/defaults.js.map +1 -0
- package/dist/key/fingerprint.d.ts +6 -0
- package/dist/key/fingerprint.d.ts.map +1 -0
- package/dist/key/fingerprint.js +25 -0
- package/dist/key/fingerprint.js.map +1 -0
- package/dist/key/paths.d.ts +30 -0
- package/dist/key/paths.d.ts.map +1 -0
- package/dist/key/paths.js +51 -0
- package/dist/key/paths.js.map +1 -0
- package/dist/key/runners.d.ts +60 -0
- package/dist/key/runners.d.ts.map +1 -0
- package/dist/key/runners.js +4 -0
- package/dist/key/runners.js.map +1 -0
- package/dist/main.d.ts +113 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +199 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp/launcher.d.ts +143 -0
- package/dist/mcp/launcher.d.ts.map +1 -0
- package/dist/mcp/launcher.js +393 -0
- package/dist/mcp/launcher.js.map +1 -0
- package/dist/mcp/preset-loader.d.ts +29 -0
- package/dist/mcp/preset-loader.d.ts.map +1 -0
- package/dist/mcp/preset-loader.js +217 -0
- package/dist/mcp/preset-loader.js.map +1 -0
- package/dist/mcp/preset-types.d.ts +71 -0
- package/dist/mcp/preset-types.d.ts.map +1 -0
- package/dist/mcp/preset-types.js +4 -0
- package/dist/mcp/preset-types.js.map +1 -0
- package/dist/mcp/presets/README.md +68 -0
- package/dist/mcp/presets/postgres.json +15 -0
- package/dist/output.d.ts +26 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +46 -0
- package/dist/output.js.map +1 -0
- package/dist/pack-config.d.ts +37 -0
- package/dist/pack-config.d.ts.map +1 -0
- package/dist/pack-config.js +65 -0
- package/dist/pack-config.js.map +1 -0
- package/dist/package-manager.d.ts +33 -0
- package/dist/package-manager.d.ts.map +1 -0
- package/dist/package-manager.js +129 -0
- package/dist/package-manager.js.map +1 -0
- package/dist/parse.d.ts +88 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +100 -0
- package/dist/parse.js.map +1 -0
- package/dist/providers/preset-loader.d.ts +47 -0
- package/dist/providers/preset-loader.d.ts.map +1 -0
- package/dist/providers/preset-loader.js +107 -0
- package/dist/providers/preset-loader.js.map +1 -0
- package/dist/providers/presets/anthropic.json +47 -0
- package/dist/providers/presets/gemini.json +40 -0
- package/dist/reference.d.ts +28 -0
- package/dist/reference.d.ts.map +1 -0
- package/dist/reference.js +52 -0
- package/dist/reference.js.map +1 -0
- package/dist/sdk-package.d.ts +9 -0
- package/dist/sdk-package.d.ts.map +1 -0
- package/dist/sdk-package.js +20 -0
- package/dist/sdk-package.js.map +1 -0
- package/dist/sdk-skills/kindgi-authoring-agents/SKILL.md +252 -0
- package/dist/sdk-skills/kindgi-authoring-flows/SKILL.md +302 -0
- package/dist/sdk-skills/kindgi-authoring-guardrails/SKILL.md +297 -0
- package/dist/sdk-skills/kindgi-authoring-mcp-servers/SKILL.md +289 -0
- package/dist/sdk-skills/kindgi-authoring-providers/SKILL.md +705 -0
- package/dist/sdk-skills/kindgi-authoring-tools/SKILL.md +298 -0
- package/dist/sdk-skills/kindgi-framework-feedback/SKILL.md +211 -0
- package/dist/sdk-skills/kindgi-getting-started/SKILL.md +189 -0
- package/dist/sdk-skills/kindgi-python-authoring-agents/SKILL.md +205 -0
- package/dist/sdk-skills/kindgi-python-authoring-flows/SKILL.md +325 -0
- package/dist/sdk-skills/kindgi-python-authoring-guardrails/SKILL.md +176 -0
- package/dist/sdk-skills/kindgi-python-authoring-tools/SKILL.md +305 -0
- package/dist/sdk-skills/kindgi-python-getting-started/SKILL.md +242 -0
- package/dist/stop-signal.d.ts +15 -0
- package/dist/stop-signal.d.ts.map +1 -0
- package/dist/stop-signal.js +16 -0
- package/dist/stop-signal.js.map +1 -0
- package/dist/templates/minimal/.nvmrc +1 -0
- package/dist/templates/minimal/AGENTS.md +23 -0
- package/dist/templates/minimal/README.md.tmpl +69 -0
- package/dist/templates/minimal/agents/.gitkeep +0 -0
- package/dist/templates/minimal/flows/.gitkeep +0 -0
- package/dist/templates/minimal/gitignore +8 -0
- package/dist/templates/minimal/guardrails/.gitkeep +0 -0
- package/dist/templates/minimal/kindgi.config.ts.tmpl +44 -0
- package/dist/templates/minimal/package.json.tmpl +25 -0
- package/dist/templates/minimal/pnpm-workspace.yaml +8 -0
- package/dist/templates/minimal/tools/.gitkeep +0 -0
- package/dist/templates/minimal/tsconfig.json.tmpl +27 -0
- package/dist/templates/minimal/vitest.config.ts.tmpl +14 -0
- package/dist/templates/python/AGENTS.md +30 -0
- package/dist/templates/python/README.md.tmpl +56 -0
- package/dist/templates/python/agents/echo_agent.py.tmpl +23 -0
- package/dist/templates/python/flows/echo_flow.py.tmpl +17 -0
- package/dist/templates/python/gitignore +9 -0
- package/dist/templates/python/guardrails/response_not_empty.py.tmpl +27 -0
- package/dist/templates/python/pyproject.toml.tmpl +42 -0
- package/dist/templates/python/tests/test_tools.py.tmpl +22 -0
- package/dist/templates/python/tools/echo.py.tmpl +27 -0
- package/dist/templates/python/tools/greet.py.tmpl +20 -0
- package/dist/templates/sample/.nvmrc +1 -0
- package/dist/templates/sample/AGENTS.md +23 -0
- package/dist/templates/sample/README.md.tmpl +85 -0
- package/dist/templates/sample/agents/echo-agent/index.ts.tmpl +34 -0
- package/dist/templates/sample/flows/echo-flow/index.ts.tmpl +59 -0
- package/dist/templates/sample/gitignore +8 -0
- package/dist/templates/sample/guardrails/response-not-empty/index.ts.tmpl +58 -0
- package/dist/templates/sample/kindgi.config.ts.tmpl +41 -0
- package/dist/templates/sample/package.json.tmpl +25 -0
- package/dist/templates/sample/pnpm-workspace.yaml +8 -0
- package/dist/templates/sample/tools/echo/index.test.ts.tmpl +31 -0
- package/dist/templates/sample/tools/echo/index.ts.tmpl +37 -0
- package/dist/templates/sample/tools/fetch-httpbin/index.ts.tmpl +60 -0
- package/dist/templates/sample/tools/greet/index.ts.tmpl +35 -0
- package/dist/templates/sample/tsconfig.json.tmpl +27 -0
- package/dist/templates/sample/vitest.config.ts.tmpl +14 -0
- package/dist/terminal-input.d.ts +17 -0
- package/dist/terminal-input.d.ts.map +1 -0
- package/dist/terminal-input.js +88 -0
- package/dist/terminal-input.js.map +1 -0
- package/dist/test/defaults.d.ts +3 -0
- package/dist/test/defaults.d.ts.map +1 -0
- package/dist/test/defaults.js +104 -0
- package/dist/test/defaults.js.map +1 -0
- package/dist/test/runners.d.ts +60 -0
- package/dist/test/runners.d.ts.map +1 -0
- package/dist/test/runners.js +4 -0
- package/dist/test/runners.js.map +1 -0
- package/dist/version-info.d.ts +9 -0
- package/dist/version-info.d.ts.map +1 -0
- package/dist/version-info.js +27 -0
- package/dist/version-info.js.map +1 -0
- package/dist/write-fully.d.ts +13 -0
- package/dist/write-fully.d.ts.map +1 -0
- package/dist/write-fully.js +17 -0
- package/dist/write-fully.js.map +1 -0
- package/package.json +63 -4
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
+
/**
|
|
4
|
+
* The bundled Postgres with plain `docker`, for a Docker engine without
|
|
5
|
+
* `docker compose` (common on a bare Linux engine). `kindgi dev` starts
|
|
6
|
+
* the same container the compose file defines, read from that file:
|
|
7
|
+
*
|
|
8
|
+
* - the same names: the container (`kindgi-dev_postgres`), its data
|
|
9
|
+
* volume (`kindgi-dev_postgres-data`) and the network (`kindgi-dev`),
|
|
10
|
+
* so the data is shared whichever way it was started;
|
|
11
|
+
* - the same image, environment, command, healthcheck, and the port
|
|
12
|
+
* published to a random host port on loopback (`127.0.0.1`): the
|
|
13
|
+
* password is a fixed dev one, so the database must not be reachable
|
|
14
|
+
* from the LAN;
|
|
15
|
+
* - the compose project's labels on what it creates, so
|
|
16
|
+
* `docker compose -p kindgi-dev` (`up --no-recreate`, `port`,
|
|
17
|
+
* `down -v`) takes them as its own once compose is installed.
|
|
18
|
+
*
|
|
19
|
+
* An existing container is reused as it is, whichever way it was
|
|
20
|
+
* started: started if stopped, never recreated or removed, since
|
|
21
|
+
* another `kindgi dev` may be using it.
|
|
22
|
+
*/
|
|
23
|
+
import { parse as parseYaml } from 'yaml';
|
|
24
|
+
import { docker } from './runtime-container.js';
|
|
25
|
+
/** The service keys the plain-docker start carries over; any other is refused. */
|
|
26
|
+
const SERVICE_KEYS = new Set([
|
|
27
|
+
'image',
|
|
28
|
+
'container_name',
|
|
29
|
+
'environment',
|
|
30
|
+
'command',
|
|
31
|
+
'volumes',
|
|
32
|
+
'ports',
|
|
33
|
+
'healthcheck',
|
|
34
|
+
]);
|
|
35
|
+
function isRecord(value) {
|
|
36
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
37
|
+
}
|
|
38
|
+
function isStringList(value) {
|
|
39
|
+
return Array.isArray(value) && value.every((v) => typeof v === 'string');
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The container `service` defines in a compose file, for `docker run`.
|
|
43
|
+
* Strict: a key or shape the plain-docker start can't carry over throws,
|
|
44
|
+
* so the two ways of starting it never drift apart silently.
|
|
45
|
+
*/
|
|
46
|
+
export function postgresSpecFromCompose(composeYaml, project, service = 'postgres') {
|
|
47
|
+
const unsupported = (what) => new Error(`the compose file's ${service} service: ${what}, which a plain docker start can't carry over`);
|
|
48
|
+
const file = parseYaml(composeYaml);
|
|
49
|
+
if (!isRecord(file) || !isRecord(file.services))
|
|
50
|
+
throw unsupported('no services');
|
|
51
|
+
const svc = file.services[service];
|
|
52
|
+
if (!isRecord(svc))
|
|
53
|
+
throw unsupported('not defined');
|
|
54
|
+
for (const key of Object.keys(svc)) {
|
|
55
|
+
if (!SERVICE_KEYS.has(key))
|
|
56
|
+
throw unsupported(`sets \`${key}\``);
|
|
57
|
+
}
|
|
58
|
+
if (typeof svc.image !== 'string')
|
|
59
|
+
throw unsupported('no image');
|
|
60
|
+
if (typeof svc.container_name !== 'string')
|
|
61
|
+
throw unsupported('no container_name');
|
|
62
|
+
const environment = {};
|
|
63
|
+
if (svc.environment !== undefined) {
|
|
64
|
+
if (!isRecord(svc.environment))
|
|
65
|
+
throw unsupported('environment is not a map');
|
|
66
|
+
for (const [name, value] of Object.entries(svc.environment)) {
|
|
67
|
+
if (typeof value !== 'string' && typeof value !== 'number' && typeof value !== 'boolean') {
|
|
68
|
+
throw unsupported(`environment ${name} has no value`);
|
|
69
|
+
}
|
|
70
|
+
environment[name] = String(value);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const command = svc.command ?? [];
|
|
74
|
+
if (!isStringList(command))
|
|
75
|
+
throw unsupported('command is not a list of strings');
|
|
76
|
+
if (!isStringList(svc.volumes) || svc.volumes.length !== 1) {
|
|
77
|
+
throw unsupported('not exactly one volume');
|
|
78
|
+
}
|
|
79
|
+
const mount = svc.volumes[0] ?? '';
|
|
80
|
+
const [volumeKey, target, ...rest] = mount.split(':');
|
|
81
|
+
const volumes = isRecord(file.volumes) ? file.volumes : {};
|
|
82
|
+
const volumeDef = volumes[volumeKey ?? ''];
|
|
83
|
+
if (volumeKey === undefined ||
|
|
84
|
+
target === undefined ||
|
|
85
|
+
rest.length > 0 ||
|
|
86
|
+
volumeDef === undefined) {
|
|
87
|
+
throw unsupported(`volume ${mount} is not a named volume`);
|
|
88
|
+
}
|
|
89
|
+
const volumeName = isRecord(volumeDef) && typeof volumeDef.name === 'string'
|
|
90
|
+
? volumeDef.name
|
|
91
|
+
: `${project}_${volumeKey}`;
|
|
92
|
+
// `5432` or `127.0.0.1::5432`: a random host port, on one address or all.
|
|
93
|
+
const published = isStringList(svc.ports) && svc.ports.length === 1
|
|
94
|
+
? /^(?:(\d{1,3}(?:\.\d{1,3}){3})::)?(\d+)$/.exec(svc.ports[0] ?? '')
|
|
95
|
+
: null;
|
|
96
|
+
if (published === null) {
|
|
97
|
+
throw unsupported('not exactly one port published to a random host port');
|
|
98
|
+
}
|
|
99
|
+
const hostIp = published[1];
|
|
100
|
+
const port = Number(published[2]);
|
|
101
|
+
const networks = isRecord(file.networks) ? file.networks : {};
|
|
102
|
+
for (const key of Object.keys(networks)) {
|
|
103
|
+
if (key !== 'default')
|
|
104
|
+
throw unsupported(`network ${key}`);
|
|
105
|
+
}
|
|
106
|
+
const defaultNetwork = networks.default;
|
|
107
|
+
const networkName = isRecord(defaultNetwork) && typeof defaultNetwork.name === 'string'
|
|
108
|
+
? defaultNetwork.name
|
|
109
|
+
: `${project}_default`;
|
|
110
|
+
const hc = svc.healthcheck;
|
|
111
|
+
if (!isRecord(hc))
|
|
112
|
+
throw unsupported('no healthcheck');
|
|
113
|
+
const test = hc.test;
|
|
114
|
+
const healthCommand = typeof test === 'string'
|
|
115
|
+
? test
|
|
116
|
+
: isStringList(test) && test.length === 2 && test[0] === 'CMD-SHELL'
|
|
117
|
+
? test[1]
|
|
118
|
+
: undefined;
|
|
119
|
+
if (healthCommand === undefined)
|
|
120
|
+
throw unsupported('healthcheck test is not CMD-SHELL');
|
|
121
|
+
for (const key of Object.keys(hc)) {
|
|
122
|
+
if (!['test', 'interval', 'timeout', 'retries', 'start_period'].includes(key)) {
|
|
123
|
+
throw unsupported(`healthcheck sets \`${key}\``);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const duration = (key) => {
|
|
127
|
+
const value = hc[key];
|
|
128
|
+
if (value === undefined)
|
|
129
|
+
return undefined;
|
|
130
|
+
if (typeof value !== 'string')
|
|
131
|
+
throw unsupported(`healthcheck ${key} is not a duration`);
|
|
132
|
+
return value;
|
|
133
|
+
};
|
|
134
|
+
if (hc.retries !== undefined && typeof hc.retries !== 'number') {
|
|
135
|
+
throw unsupported('healthcheck retries is not a number');
|
|
136
|
+
}
|
|
137
|
+
const interval = duration('interval');
|
|
138
|
+
const timeout = duration('timeout');
|
|
139
|
+
const startPeriod = duration('start_period');
|
|
140
|
+
return {
|
|
141
|
+
project,
|
|
142
|
+
service,
|
|
143
|
+
name: svc.container_name,
|
|
144
|
+
image: svc.image,
|
|
145
|
+
environment,
|
|
146
|
+
command,
|
|
147
|
+
volume: { key: volumeKey, name: volumeName, target },
|
|
148
|
+
network: { key: 'default', name: networkName },
|
|
149
|
+
port,
|
|
150
|
+
...(hostIp !== undefined && { hostIp }),
|
|
151
|
+
healthcheck: {
|
|
152
|
+
command: healthCommand,
|
|
153
|
+
...(interval !== undefined && { interval }),
|
|
154
|
+
...(timeout !== undefined && { timeout }),
|
|
155
|
+
...(typeof hc.retries === 'number' && { retries: hc.retries }),
|
|
156
|
+
...(startPeriod !== undefined && { startPeriod }),
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* The compose project's labels for the container: compose finds a
|
|
162
|
+
* project's containers by them. The config hash is left empty, so compose
|
|
163
|
+
* takes the definition as changed: `--no-recreate` reuses the container,
|
|
164
|
+
* and only a recreate asked for (`--recreate-services`) replaces it.
|
|
165
|
+
*/
|
|
166
|
+
function containerLabels(spec) {
|
|
167
|
+
return [
|
|
168
|
+
`com.docker.compose.project=${spec.project}`,
|
|
169
|
+
`com.docker.compose.service=${spec.service}`,
|
|
170
|
+
'com.docker.compose.oneoff=False',
|
|
171
|
+
'com.docker.compose.container-number=1',
|
|
172
|
+
'com.docker.compose.config-hash=',
|
|
173
|
+
];
|
|
174
|
+
}
|
|
175
|
+
function labelArgs(labels) {
|
|
176
|
+
return labels.flatMap((label) => ['--label', label]);
|
|
177
|
+
}
|
|
178
|
+
/** The `docker run` arguments for the container the compose file defines. */
|
|
179
|
+
export function postgresRunArgs(spec) {
|
|
180
|
+
const args = ['run', '--detach', '--name', spec.name, ...labelArgs(containerLabels(spec))];
|
|
181
|
+
// On the project's network under its service name, as compose attaches it.
|
|
182
|
+
args.push('--network', spec.network.name, '--network-alias', spec.service);
|
|
183
|
+
args.push('--volume', `${spec.volume.name}:${spec.volume.target}`);
|
|
184
|
+
// `127.0.0.1::5432`: a random host port, on loopback only when the
|
|
185
|
+
// compose file says so (a fixed dev password stays off the LAN).
|
|
186
|
+
args.push('--publish', spec.hostIp === undefined ? String(spec.port) : `${spec.hostIp}::${spec.port}`);
|
|
187
|
+
for (const [name, value] of Object.entries(spec.environment)) {
|
|
188
|
+
args.push('--env', `${name}=${value}`);
|
|
189
|
+
}
|
|
190
|
+
const hc = spec.healthcheck;
|
|
191
|
+
args.push('--health-cmd', hc.command);
|
|
192
|
+
if (hc.interval !== undefined)
|
|
193
|
+
args.push('--health-interval', hc.interval);
|
|
194
|
+
if (hc.timeout !== undefined)
|
|
195
|
+
args.push('--health-timeout', hc.timeout);
|
|
196
|
+
if (hc.retries !== undefined)
|
|
197
|
+
args.push('--health-retries', String(hc.retries));
|
|
198
|
+
if (hc.startPeriod !== undefined)
|
|
199
|
+
args.push('--health-start-period', hc.startPeriod);
|
|
200
|
+
args.push(spec.image, ...spec.command);
|
|
201
|
+
return args;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* The host port in `docker port` / `docker compose port` output
|
|
205
|
+
* (`0.0.0.0:51741`, or `[::]:51741`); `undefined` when there is none.
|
|
206
|
+
*/
|
|
207
|
+
export function hostPortOf(portOutput) {
|
|
208
|
+
const line = portOutput.trim().split('\n')[0] ?? '';
|
|
209
|
+
const port = Number(line.slice(line.lastIndexOf(':') + 1));
|
|
210
|
+
return Number.isInteger(port) && port > 0 ? port : undefined;
|
|
211
|
+
}
|
|
212
|
+
function lastLines(text, n = 5) {
|
|
213
|
+
return text.trim().split('\n').slice(-n).join('\n');
|
|
214
|
+
}
|
|
215
|
+
function failure(command, outcome) {
|
|
216
|
+
const detail = lastLines(outcome.stderr);
|
|
217
|
+
return `\`${command}\` failed (exit ${outcome.code ?? 'spawn error'})${detail === '' ? '' : `: ${detail}`}`;
|
|
218
|
+
}
|
|
219
|
+
/** Create the network or volume when it's missing; an existing one is used as it is. */
|
|
220
|
+
async function ensureResource(kind, name, labels, run) {
|
|
221
|
+
if ((await run([kind, 'inspect', name])).code === 0)
|
|
222
|
+
return undefined;
|
|
223
|
+
const created = await run([kind, 'create', ...labelArgs(labels), name]);
|
|
224
|
+
if (created.code === 0)
|
|
225
|
+
return undefined;
|
|
226
|
+
// Another kindgi dev made it meanwhile.
|
|
227
|
+
if ((await run([kind, 'inspect', name])).code === 0)
|
|
228
|
+
return undefined;
|
|
229
|
+
return failure(`docker ${kind} create ${name}`, created);
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* The container's status (`docker container inspect`), or `missing`; an
|
|
233
|
+
* error when docker can't tell.
|
|
234
|
+
*/
|
|
235
|
+
async function containerStatus(name, run) {
|
|
236
|
+
const inspected = await run(['container', 'inspect', '--format', '{{.State.Status}}', name]);
|
|
237
|
+
if (inspected.code === 0)
|
|
238
|
+
return { status: inspected.stdout.trim() };
|
|
239
|
+
if (inspected.code !== null && /no such (container|object)/i.test(inspected.stderr)) {
|
|
240
|
+
return { status: 'missing' };
|
|
241
|
+
}
|
|
242
|
+
return { error: failure(`docker container inspect ${name}`, inspected) };
|
|
243
|
+
}
|
|
244
|
+
/** Reuse an existing container as it is: start it when it's stopped. */
|
|
245
|
+
async function reuseContainer(name, status, run) {
|
|
246
|
+
if (status === 'running' || status === 'restarting')
|
|
247
|
+
return { kind: 'reused', container: 'running' };
|
|
248
|
+
if (status === 'created' || status === 'exited') {
|
|
249
|
+
const started = await run(['start', name]);
|
|
250
|
+
return started.code === 0
|
|
251
|
+
? { kind: 'reused', container: 'started' }
|
|
252
|
+
: { kind: 'error', message: failure(`docker start ${name}`, started) };
|
|
253
|
+
}
|
|
254
|
+
if (status === 'paused') {
|
|
255
|
+
return {
|
|
256
|
+
kind: 'error',
|
|
257
|
+
message: `${name} is paused: unpause it (docker unpause ${name}), then run kindgi dev again`,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
return { kind: 'error', message: `${name} is ${status}` };
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Wait until the container is healthy (or running, without a
|
|
264
|
+
* healthcheck), as `docker compose up --wait` does; an error when it
|
|
265
|
+
* turns unhealthy or stops.
|
|
266
|
+
*/
|
|
267
|
+
async function waitHealthy(name, run, wait) {
|
|
268
|
+
const deadline = Date.now() + wait.timeoutMs;
|
|
269
|
+
const format = '{{.State.Status}} {{if .State.Health}}{{.State.Health.Status}}{{end}}';
|
|
270
|
+
for (;;) {
|
|
271
|
+
const inspected = await run(['container', 'inspect', '--format', format, name]);
|
|
272
|
+
if (inspected.code !== 0)
|
|
273
|
+
return failure(`docker container inspect ${name}`, inspected);
|
|
274
|
+
const [status, health] = inspected.stdout.trim().split(/\s+/);
|
|
275
|
+
if (status === 'running' && (health === undefined || health === 'healthy'))
|
|
276
|
+
return undefined;
|
|
277
|
+
const stopped = status === 'exited' || status === 'dead';
|
|
278
|
+
if (stopped || health === 'unhealthy' || Date.now() > deadline) {
|
|
279
|
+
const what = stopped
|
|
280
|
+
? `stopped while starting (${status})`
|
|
281
|
+
: health === 'unhealthy'
|
|
282
|
+
? 'is unhealthy'
|
|
283
|
+
: `wasn't healthy after ${Math.round(wait.timeoutMs / 1000)}s`;
|
|
284
|
+
const logs = await run(['logs', '--tail', '15', name]);
|
|
285
|
+
const tail = lastLines(`${logs.stdout}\n${logs.stderr}`, 15);
|
|
286
|
+
return `${name} ${what}${tail === '' ? '' : `:\n${tail}`}`;
|
|
287
|
+
}
|
|
288
|
+
await new Promise((r) => setTimeout(r, wait.pollMs));
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Start the container `spec` defines with plain `docker`, wait until it's
|
|
293
|
+
* healthy, and read its host port back:
|
|
294
|
+
*
|
|
295
|
+
* - none exists: create the network and the volume when missing, then
|
|
296
|
+
* `docker run` it;
|
|
297
|
+
* - it exists, whichever way it was started: reuse it as it is, and
|
|
298
|
+
* start it when it's stopped. It is never recreated or removed.
|
|
299
|
+
*/
|
|
300
|
+
export async function startPostgresContainer(spec, run = docker, wait = {}) {
|
|
301
|
+
const found = await containerStatus(spec.name, run);
|
|
302
|
+
if ('error' in found)
|
|
303
|
+
return { kind: 'error', message: found.error };
|
|
304
|
+
let status = found.status;
|
|
305
|
+
let container;
|
|
306
|
+
if (status === 'missing') {
|
|
307
|
+
const project = `com.docker.compose.project=${spec.project}`;
|
|
308
|
+
const network = await ensureResource('network', spec.network.name, [project, `com.docker.compose.network=${spec.network.key}`], run);
|
|
309
|
+
if (network !== undefined)
|
|
310
|
+
return { kind: 'error', message: network };
|
|
311
|
+
const volume = await ensureResource('volume', spec.volume.name, [project, `com.docker.compose.volume=${spec.volume.key}`], run);
|
|
312
|
+
if (volume !== undefined)
|
|
313
|
+
return { kind: 'error', message: volume };
|
|
314
|
+
const created = await run(postgresRunArgs(spec));
|
|
315
|
+
if (created.code === 0) {
|
|
316
|
+
container = 'created';
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
// Another kindgi dev made it meanwhile: reuse that one.
|
|
320
|
+
const again = await containerStatus(spec.name, run);
|
|
321
|
+
if ('error' in again || again.status === 'missing') {
|
|
322
|
+
return { kind: 'error', message: failure(`docker run --name ${spec.name}`, created) };
|
|
323
|
+
}
|
|
324
|
+
status = again.status;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
if (container === undefined) {
|
|
328
|
+
const reused = await reuseContainer(spec.name, status, run);
|
|
329
|
+
if (reused.kind === 'error')
|
|
330
|
+
return reused;
|
|
331
|
+
container = reused.container;
|
|
332
|
+
}
|
|
333
|
+
const unhealthy = await waitHealthy(spec.name, run, {
|
|
334
|
+
timeoutMs: wait.timeoutMs ?? 120_000,
|
|
335
|
+
pollMs: wait.pollMs ?? 500,
|
|
336
|
+
});
|
|
337
|
+
if (unhealthy !== undefined)
|
|
338
|
+
return { kind: 'error', message: unhealthy };
|
|
339
|
+
const published = await run(['port', spec.name, String(spec.port)]);
|
|
340
|
+
const port = published.code === 0 ? hostPortOf(published.stdout) : undefined;
|
|
341
|
+
if (port === undefined) {
|
|
342
|
+
return { kind: 'error', message: failure(`docker port ${spec.name} ${spec.port}`, published) };
|
|
343
|
+
}
|
|
344
|
+
return { kind: 'ok', port, container };
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=postgres-container.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-container.js","sourceRoot":"","sources":["../../src/dev/postgres-container.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { watch } from 'node:fs';
|
|
2
|
+
import type { PackBuilder } from './runners.js';
|
|
3
|
+
export interface PythonPackBuilderOptions {
|
|
4
|
+
readonly packDir: string;
|
|
5
|
+
/** The pack's interpreter (an argv prefix). */
|
|
6
|
+
readonly python: readonly [string, ...string[]];
|
|
7
|
+
/** The pack's environment. */
|
|
8
|
+
readonly env: () => Promise<Readonly<Record<string, string>>>;
|
|
9
|
+
readonly debounceMs?: number;
|
|
10
|
+
/** Test seam: `node:fs.watch`. */
|
|
11
|
+
readonly watchFs?: typeof watch;
|
|
12
|
+
}
|
|
13
|
+
/** Whether a change to `relPath` (relative to the pack root) is a change to the pack's code. */
|
|
14
|
+
export declare function isPythonSourceChange(relPath: string): boolean;
|
|
15
|
+
export declare function createPythonPackBuilder(options: PythonPackBuilderOptions): PackBuilder;
|
|
16
|
+
//# sourceMappingURL=python-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-builder.d.ts","sourceRoot":"","sources":["../../src/dev/python-builder.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAkB,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhD,OAAO,KAAK,EAAa,WAAW,EAAE,MAAM,cAAc,CAAC;AAgC3D,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,+CAA+C;IAC/C,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAChD,8BAA8B;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC9D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,kCAAkC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACjC;AAED,gGAAgG;AAChG,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAM7D;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,GAAG,WAAW,CAmEtF"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
+
/**
|
|
4
|
+
* The `PackBuilder` of a Python pack. Python runs its sources, so a build
|
|
5
|
+
* produces no bundles (an empty bundle map); what it does is the job the
|
|
6
|
+
* bundler's parse does for a Node pack: compile every `.py` file under the
|
|
7
|
+
* pack root with the pack's own interpreter and report syntax errors
|
|
8
|
+
* located `file:line:col`. A build with errors leaves the previous pack
|
|
9
|
+
* service and index in place, as a bundle error does.
|
|
10
|
+
*
|
|
11
|
+
* The watch covers any `.py` file under the pack root — shared modules
|
|
12
|
+
* outside the discovery folders included — and `pyproject.toml`.
|
|
13
|
+
*/
|
|
14
|
+
import { spawn } from 'node:child_process';
|
|
15
|
+
import { watch } from 'node:fs';
|
|
16
|
+
const SKIPPED_DIRS = ['__pycache__', 'node_modules', 'venv', 'site-packages'];
|
|
17
|
+
const DEFAULT_DEBOUNCE_MS = 150;
|
|
18
|
+
/**
|
|
19
|
+
* Compiles every source under the pack root (argv[1]); prints a JSON list of
|
|
20
|
+
* `{file, line, col, message}` for the ones that don't. Self-contained:
|
|
21
|
+
* nothing of the pack is imported.
|
|
22
|
+
*/
|
|
23
|
+
const COMPILE_SCRIPT = `
|
|
24
|
+
import json, os, sys
|
|
25
|
+
root = sys.argv[1]
|
|
26
|
+
skip = set(${JSON.stringify(SKIPPED_DIRS)})
|
|
27
|
+
errors = []
|
|
28
|
+
for dirpath, dirnames, filenames in os.walk(root):
|
|
29
|
+
dirnames[:] = sorted(d for d in dirnames if not d.startswith(".") and d not in skip)
|
|
30
|
+
for name in sorted(filenames):
|
|
31
|
+
if not name.endswith(".py") or name.startswith("."):
|
|
32
|
+
continue
|
|
33
|
+
path = os.path.join(dirpath, name)
|
|
34
|
+
rel = os.path.relpath(path, root).replace(os.sep, "/")
|
|
35
|
+
try:
|
|
36
|
+
with open(path, "rb") as f:
|
|
37
|
+
compile(f.read(), rel, "exec", dont_inherit=True)
|
|
38
|
+
except SyntaxError as e:
|
|
39
|
+
errors.append({"file": rel, "line": e.lineno or 0, "col": e.offset or 0, "message": f"{type(e).__name__}: {e.msg}"})
|
|
40
|
+
except (ValueError, OSError) as e:
|
|
41
|
+
errors.append({"file": rel, "line": 0, "col": 0, "message": f"{type(e).__name__}: {e}"})
|
|
42
|
+
print(json.dumps(errors))
|
|
43
|
+
`;
|
|
44
|
+
/** Whether a change to `relPath` (relative to the pack root) is a change to the pack's code. */
|
|
45
|
+
export function isPythonSourceChange(relPath) {
|
|
46
|
+
const segments = relPath.split(/[\\/]/);
|
|
47
|
+
const dirs = segments.slice(0, -1);
|
|
48
|
+
if (dirs.some((s) => s.startsWith('.') || SKIPPED_DIRS.includes(s)))
|
|
49
|
+
return false;
|
|
50
|
+
const name = segments[segments.length - 1] ?? '';
|
|
51
|
+
return relPath === 'pyproject.toml' || (name.endsWith('.py') && !name.startsWith('.'));
|
|
52
|
+
}
|
|
53
|
+
export function createPythonPackBuilder(options) {
|
|
54
|
+
const watchFs = options.watchFs ?? watch;
|
|
55
|
+
let watcher;
|
|
56
|
+
let timer;
|
|
57
|
+
async function build() {
|
|
58
|
+
const [program, ...prefix] = options.python;
|
|
59
|
+
const env = await options.env();
|
|
60
|
+
const run = await new Promise((resolve) => {
|
|
61
|
+
const child = spawn(program, [...prefix, '-c', COMPILE_SCRIPT, options.packDir], {
|
|
62
|
+
env,
|
|
63
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
64
|
+
});
|
|
65
|
+
let stdout = '';
|
|
66
|
+
let stderr = '';
|
|
67
|
+
child.stdout.on('data', (chunk) => {
|
|
68
|
+
stdout += chunk.toString('utf8');
|
|
69
|
+
});
|
|
70
|
+
child.stderr.on('data', (chunk) => {
|
|
71
|
+
stderr += chunk.toString('utf8');
|
|
72
|
+
});
|
|
73
|
+
child.once('error', (cause) => resolve({ code: null, stdout, stderr: cause.message }));
|
|
74
|
+
child.once('close', (code) => resolve({ code, stdout, stderr }));
|
|
75
|
+
});
|
|
76
|
+
let errors;
|
|
77
|
+
try {
|
|
78
|
+
errors = JSON.parse(run.stdout.trim().split('\n').pop() ?? '');
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return {
|
|
82
|
+
kind: 'err',
|
|
83
|
+
errors: [
|
|
84
|
+
`the pack's Python could not check the sources (${run.code}): ${run.stderr.trim()}`,
|
|
85
|
+
],
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
if (errors.length > 0) {
|
|
89
|
+
return {
|
|
90
|
+
kind: 'err',
|
|
91
|
+
errors: errors.map((e) => `${e.file}:${e.line}:${e.col}: ${e.message}`),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
return { kind: 'ok', bundleMap: {} };
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
build,
|
|
98
|
+
async watch(onBuild) {
|
|
99
|
+
if (watcher !== undefined)
|
|
100
|
+
return;
|
|
101
|
+
watcher = watchFs(options.packDir, { recursive: true }, (_event, filename) => {
|
|
102
|
+
if (filename === null || !isPythonSourceChange(filename.toString()))
|
|
103
|
+
return;
|
|
104
|
+
if (timer !== undefined)
|
|
105
|
+
clearTimeout(timer);
|
|
106
|
+
timer = setTimeout(() => {
|
|
107
|
+
timer = undefined;
|
|
108
|
+
void build().then(onBuild);
|
|
109
|
+
}, options.debounceMs ?? DEFAULT_DEBOUNCE_MS);
|
|
110
|
+
});
|
|
111
|
+
},
|
|
112
|
+
// New or removed files need no entry list: the next build sees what is there.
|
|
113
|
+
syncEntries: () => Promise.resolve(false),
|
|
114
|
+
async dispose() {
|
|
115
|
+
if (timer !== undefined)
|
|
116
|
+
clearTimeout(timer);
|
|
117
|
+
watcher?.close();
|
|
118
|
+
watcher = undefined;
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=python-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-builder.js","sourceRoot":"","sources":["../../src/dev/python-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registration bridge — reports the four pack primitives from the
|
|
3
|
+
* parsed `index.json` produced by `runIndexer`. This is a pure
|
|
4
|
+
* read-side reporter: the api-server's disk bindings serve
|
|
5
|
+
* tool / agent / guardrail / flow manifests directly from disk, so
|
|
6
|
+
* the CLI doesn't need to POST anything for these primitives.
|
|
7
|
+
*
|
|
8
|
+
* Kept as a boundary so `dev.ts` still gets a `RegistrationReport`
|
|
9
|
+
* shape for boot + watch-tick summaries. Prod deploy path (when
|
|
10
|
+
* `kindgi deploy` lands) will bring back the transformation +
|
|
11
|
+
* POST loop this file used to contain, likely in a dedicated
|
|
12
|
+
* server-side helper rather than the CLI.
|
|
13
|
+
*/
|
|
14
|
+
import type { KindgiClient } from '@kindgi/client';
|
|
15
|
+
import type { AgentId, FlowId, GuardrailId, Semver, ToolId } from '@kindgi/types';
|
|
16
|
+
export interface RegistrationOutcome {
|
|
17
|
+
readonly kind: 'tool' | 'guardrail' | 'agent' | 'flow';
|
|
18
|
+
readonly id: string;
|
|
19
|
+
readonly ok: boolean;
|
|
20
|
+
readonly message?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Non-fatal advisory the CLI surfaces even when `ok === true`.
|
|
23
|
+
* Currently unused: it used to carry the "bump version to
|
|
24
|
+
* publish local edits" nudge on `already-registered` outcomes,
|
|
25
|
+
* but the authoring-tools skill (v0.3.0) explicitly
|
|
26
|
+
* teaches "don't bump on save" — the advice contradicted itself
|
|
27
|
+
* and fired every watch tick regardless of whether the primitive
|
|
28
|
+
* had actually changed. Kept on the interface for future
|
|
29
|
+
* drift-detection use (compare stored vs. local hash → warn only
|
|
30
|
+
* on real drift).
|
|
31
|
+
*/
|
|
32
|
+
readonly warning?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface RegistrationReport {
|
|
35
|
+
readonly registered: RegistrationOutcome[];
|
|
36
|
+
readonly failed: RegistrationOutcome[];
|
|
37
|
+
}
|
|
38
|
+
export interface RegisterInputs {
|
|
39
|
+
readonly index: unknown;
|
|
40
|
+
readonly apiUrl: string;
|
|
41
|
+
readonly token: string;
|
|
42
|
+
readonly client: KindgiClient;
|
|
43
|
+
readonly fetchImpl: typeof fetch;
|
|
44
|
+
/**
|
|
45
|
+
* Tenant's Default project id, resolved by `kindgi dev` from
|
|
46
|
+
* `RunningApiServer.defaultProjectId`. Included in every POST body
|
|
47
|
+
* because tools/agents/guardrails/flows routes require it.
|
|
48
|
+
* Without this, all registrations fail with
|
|
49
|
+
* `bad-input: projectId is required`.
|
|
50
|
+
*/
|
|
51
|
+
readonly projectId: string;
|
|
52
|
+
/**
|
|
53
|
+
* Absolute path to the pack root. Used to resolve indexer-emitted
|
|
54
|
+
* relative `modulePath` / `checkModulePath` into absolute paths
|
|
55
|
+
* before they land in `codeArtifactRef.modulePath` — the sandbox
|
|
56
|
+
* worker imports them by absolute path, so relative-to-pack won't
|
|
57
|
+
* resolve after the api-server process (a different cwd) picks
|
|
58
|
+
* them up.
|
|
59
|
+
*/
|
|
60
|
+
readonly packDir: string;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Register every primitive in the parsed index into the running
|
|
64
|
+
* api-server. Never throws; per-primitive failures land in
|
|
65
|
+
* `report.failed`. Idempotent-friendly: `409 tool-already-registered`
|
|
66
|
+
* outcomes are treated as success — dev mode is meant to be safe to
|
|
67
|
+
* re-run after a save.
|
|
68
|
+
*/
|
|
69
|
+
export declare function registerFromIndex(inputs: RegisterInputs): Promise<RegistrationReport>;
|
|
70
|
+
export type { AgentId, FlowId, GuardrailId, Semver, ToolId };
|
|
71
|
+
//# sourceMappingURL=register.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/dev/register.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAElF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC;IACvD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,UAAU,EAAE,mBAAmB,EAAE,CAAC;IAC3C,QAAQ,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,KAAK,CAAC;IACjC;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AASD;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA6C3F;AAKD,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
+
/**
|
|
4
|
+
* Register every primitive in the parsed index into the running
|
|
5
|
+
* api-server. Never throws; per-primitive failures land in
|
|
6
|
+
* `report.failed`. Idempotent-friendly: `409 tool-already-registered`
|
|
7
|
+
* outcomes are treated as success — dev mode is meant to be safe to
|
|
8
|
+
* re-run after a save.
|
|
9
|
+
*/
|
|
10
|
+
export async function registerFromIndex(inputs) {
|
|
11
|
+
const idx = (inputs.index ?? {});
|
|
12
|
+
const registered = [];
|
|
13
|
+
const failed = [];
|
|
14
|
+
// All four pack primitives are served from disk in dev — the api-
|
|
15
|
+
// server's disk bindings (tools, agents, guardrails, flows) read
|
|
16
|
+
// `index.json` directly. POSTing them
|
|
17
|
+
// here would round-trip to read-only endpoints. Reporting as
|
|
18
|
+
// `from-disk` `ok` outcomes so the boot / watch-tick summary line
|
|
19
|
+
// still shows accurate counts.
|
|
20
|
+
for (const rawTool of idx.tools ?? []) {
|
|
21
|
+
registered.push({
|
|
22
|
+
kind: 'tool',
|
|
23
|
+
id: String(rawTool.id ?? '(unknown-tool)'),
|
|
24
|
+
ok: true,
|
|
25
|
+
message: 'from-disk',
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
for (const rawInv of idx.guardrails ?? []) {
|
|
29
|
+
registered.push({
|
|
30
|
+
kind: 'guardrail',
|
|
31
|
+
id: String(rawInv.id ?? '(unknown-guardrail)'),
|
|
32
|
+
ok: true,
|
|
33
|
+
message: 'from-disk',
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
for (const rawAgent of idx.agents ?? []) {
|
|
37
|
+
registered.push({
|
|
38
|
+
kind: 'agent',
|
|
39
|
+
id: String(rawAgent.id ?? '(unknown-agent)'),
|
|
40
|
+
ok: true,
|
|
41
|
+
message: 'from-disk',
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
for (const rawGraph of idx.flows ?? []) {
|
|
45
|
+
registered.push({
|
|
46
|
+
kind: 'flow',
|
|
47
|
+
id: String(rawGraph.id ?? '(unknown-flow)'),
|
|
48
|
+
ok: true,
|
|
49
|
+
message: 'from-disk',
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return { registered, failed };
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=register.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/dev/register.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AA2EjC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAsB;IAC5D,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAe,CAAC;IAC/C,MAAM,UAAU,GAA0B,EAAE,CAAC;IAC7C,MAAM,MAAM,GAA0B,EAAE,CAAC;IAEzC,kEAAkE;IAClE,iEAAiE;IACjE,sCAAsC;IACtC,6DAA6D;IAC7D,kEAAkE;IAClE,+BAA+B;IAC/B,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QACtC,UAAU,CAAC,IAAI,CAAC;YACd,IAAI,EAAE,MAAM;YACZ,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,gBAAgB,CAAC;YAC1C,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,WAAW;SACrB,CAAC,CAAC;IACL,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;QAC1C,UAAU,CAAC,IAAI,CAAC;YACd,IAAI,EAAE,WAAW;YACjB,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,qBAAqB,CAAC;YAC9C,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,WAAW;SACrB,CAAC,CAAC;IACL,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACxC,UAAU,CAAC,IAAI,CAAC;YACd,IAAI,EAAE,OAAO;YACb,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,iBAAiB,CAAC;YAC5C,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,WAAW;SACrB,CAAC,CAAC;IACL,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QACvC,UAAU,CAAC,IAAI,CAAC;YACd,IAAI,EAAE,MAAM;YACZ,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,gBAAgB,CAAC;YAC3C,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,WAAW;SACrB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;AAChC,CAAC"}
|