@build-astron-co/nimbus 0.4.1 → 0.4.3
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 +268 -89
- package/README.md +26 -567
- package/dist/src/agent/compaction-agent.js +24 -12
- package/dist/src/agent/context-manager.js +2 -1
- package/dist/src/agent/expand-files.js +2 -1
- package/dist/src/agent/loop.js +71 -33
- package/dist/src/agent/permissions.js +4 -2
- package/dist/src/agent/system-prompt.js +34 -17
- package/dist/src/app.js +1 -1
- package/dist/src/auth/keychain.js +8 -4
- package/dist/src/auth/store.js +70 -107
- package/dist/src/cli/init.js +35 -19
- package/dist/src/cli/run.js +18 -10
- package/dist/src/cli/serve.js +4 -2
- package/dist/src/cli.js +52 -11
- package/dist/src/commands/alias.js +5 -3
- package/dist/src/commands/audit/index.js +2 -1
- package/dist/src/commands/aws-terraform.js +36 -18
- package/dist/src/commands/completions.js +1 -1
- package/dist/src/commands/config.js +3 -2
- package/dist/src/commands/connect-github.js +92 -0
- package/dist/src/commands/cost/index.js +3 -2
- package/dist/src/commands/deploy.js +15 -10
- package/dist/src/commands/doctor.js +9 -6
- package/dist/src/commands/drift/index.js +2 -1
- package/dist/src/commands/export.js +5 -3
- package/dist/src/commands/generate-terraform.js +110 -2
- package/dist/src/commands/import.js +3 -3
- package/dist/src/commands/incident.js +10 -5
- package/dist/src/commands/login.js +8 -93
- package/dist/src/commands/logs.js +16 -8
- package/dist/src/commands/onboarding.js +6 -4
- package/dist/src/commands/pipeline.js +6 -3
- package/dist/src/commands/plugin.js +3 -2
- package/dist/src/commands/profile.js +27 -14
- package/dist/src/commands/questionnaire.js +1 -1
- package/dist/src/commands/rollback.js +3 -2
- package/dist/src/commands/rollout.js +5 -3
- package/dist/src/commands/runbook.js +17 -10
- package/dist/src/commands/schedule.js +10 -5
- package/dist/src/commands/status.js +2 -1
- package/dist/src/commands/team-context.js +12 -7
- package/dist/src/commands/template.js +1 -1
- package/dist/src/commands/tf/index.js +6 -3
- package/dist/src/commands/upgrade.js +5 -3
- package/dist/src/commands/version.js +6 -3
- package/dist/src/commands/watch.js +6 -3
- package/dist/src/compat/sqlite.js +5 -3
- package/dist/src/config/mode-store.js +2 -1
- package/dist/src/config/profiles.js +4 -2
- package/dist/src/config/types.js +2 -1
- package/dist/src/engine/executor.js +8 -4
- package/dist/src/engine/planner.js +9 -5
- package/dist/src/llm/providers/anthropic.js +6 -3
- package/dist/src/llm/providers/ollama.js +1 -1
- package/dist/src/llm/router.js +22 -7
- package/dist/src/nimbus.js +1 -0
- package/dist/src/sessions/manager.js +6 -3
- package/dist/src/sharing/viewer.js +2 -1
- package/dist/src/tools/file-ops.js +1 -2
- package/dist/src/tools/schemas/devops.js +197 -108
- package/dist/src/tools/schemas/standard.js +1 -1
- package/dist/src/ui/App.js +25 -13
- package/dist/src/ui/FileDiffModal.js +22 -11
- package/dist/src/ui/HelpModal.js +2 -1
- package/dist/src/ui/InputBox.js +6 -3
- package/dist/src/ui/MessageList.js +40 -20
- package/dist/src/ui/TerminalPane.js +2 -1
- package/dist/src/ui/ToolCallDisplay.js +12 -6
- package/dist/src/ui/TreePane.js +2 -1
- package/dist/src/ui/ink/index.js +37 -21
- package/dist/src/version.js +1 -1
- package/dist/src/watcher/index.js +8 -4
- package/package.json +3 -5
- package/src/__tests__/alias.test.ts +0 -133
- package/src/__tests__/app.test.ts +0 -76
- package/src/__tests__/audit.test.ts +0 -877
- package/src/__tests__/circuit-breaker.test.ts +0 -116
- package/src/__tests__/cli-run.test.ts +0 -351
- package/src/__tests__/compat-sqlite.test.ts +0 -68
- package/src/__tests__/context-manager.test.ts +0 -632
- package/src/__tests__/context.test.ts +0 -242
- package/src/__tests__/devops-terminal-gaps.test.ts +0 -718
- package/src/__tests__/doctor.test.ts +0 -48
- package/src/__tests__/enterprise.test.ts +0 -401
- package/src/__tests__/export.test.ts +0 -236
- package/src/__tests__/gap-11-18-20.test.ts +0 -958
- package/src/__tests__/generator.test.ts +0 -433
- package/src/__tests__/helm-streaming.test.ts +0 -127
- package/src/__tests__/hooks.test.ts +0 -582
- package/src/__tests__/incident.test.ts +0 -179
- package/src/__tests__/init.test.ts +0 -487
- package/src/__tests__/intent-parser.test.ts +0 -229
- package/src/__tests__/llm-router.test.ts +0 -209
- package/src/__tests__/logs.test.ts +0 -107
- package/src/__tests__/loop-errors.test.ts +0 -244
- package/src/__tests__/lsp.test.ts +0 -293
- package/src/__tests__/modes.test.ts +0 -336
- package/src/__tests__/perf-optimizations.test.ts +0 -847
- package/src/__tests__/permissions.test.ts +0 -338
- package/src/__tests__/pipeline.test.ts +0 -50
- package/src/__tests__/polish-phase3.test.ts +0 -340
- package/src/__tests__/profile.test.ts +0 -237
- package/src/__tests__/rollback.test.ts +0 -83
- package/src/__tests__/runbook.test.ts +0 -219
- package/src/__tests__/schedule.test.ts +0 -206
- package/src/__tests__/serve.test.ts +0 -275
- package/src/__tests__/sessions.test.ts +0 -322
- package/src/__tests__/sharing.test.ts +0 -340
- package/src/__tests__/snapshots.test.ts +0 -581
- package/src/__tests__/standalone-migration.test.ts +0 -199
- package/src/__tests__/state-db.test.ts +0 -334
- package/src/__tests__/status.test.ts +0 -158
- package/src/__tests__/stream-with-tools.test.ts +0 -778
- package/src/__tests__/subagents.test.ts +0 -176
- package/src/__tests__/system-prompt.test.ts +0 -248
- package/src/__tests__/terminal-gap-v2.test.ts +0 -395
- package/src/__tests__/terminal-parity.test.ts +0 -393
- package/src/__tests__/tf-apply.test.ts +0 -187
- package/src/__tests__/tool-converter.test.ts +0 -256
- package/src/__tests__/tool-schemas.test.ts +0 -602
- package/src/__tests__/tools.test.ts +0 -144
- package/src/__tests__/version-json.test.ts +0 -184
- package/src/__tests__/version.test.ts +0 -49
- package/src/__tests__/watch.test.ts +0 -129
- package/src/agent/compaction-agent.ts +0 -266
- package/src/agent/context-manager.ts +0 -499
- package/src/agent/context.ts +0 -427
- package/src/agent/deploy-preview.ts +0 -487
- package/src/agent/expand-files.ts +0 -108
- package/src/agent/index.ts +0 -68
- package/src/agent/loop.ts +0 -1998
- package/src/agent/modes.ts +0 -429
- package/src/agent/permissions.ts +0 -513
- package/src/agent/subagents/base.ts +0 -116
- package/src/agent/subagents/cost.ts +0 -51
- package/src/agent/subagents/explore.ts +0 -42
- package/src/agent/subagents/general.ts +0 -54
- package/src/agent/subagents/index.ts +0 -102
- package/src/agent/subagents/infra.ts +0 -59
- package/src/agent/subagents/security.ts +0 -69
- package/src/agent/system-prompt.ts +0 -990
- package/src/app.ts +0 -180
- package/src/audit/activity-log.ts +0 -290
- package/src/audit/compliance-checker.ts +0 -540
- package/src/audit/cost-tracker.ts +0 -318
- package/src/audit/index.ts +0 -23
- package/src/audit/security-scanner.ts +0 -641
- package/src/auth/guard.ts +0 -75
- package/src/auth/index.ts +0 -56
- package/src/auth/keychain.ts +0 -82
- package/src/auth/oauth.ts +0 -465
- package/src/auth/providers.ts +0 -470
- package/src/auth/sso.ts +0 -113
- package/src/auth/store.ts +0 -505
- package/src/auth/types.ts +0 -187
- package/src/build.ts +0 -141
- package/src/cli/index.ts +0 -16
- package/src/cli/init.ts +0 -1227
- package/src/cli/openapi-spec.ts +0 -356
- package/src/cli/run.ts +0 -628
- package/src/cli/serve-auth.ts +0 -80
- package/src/cli/serve.ts +0 -539
- package/src/cli/web.ts +0 -71
- package/src/cli.ts +0 -1728
- package/src/clients/core-engine-client.ts +0 -227
- package/src/clients/enterprise-client.ts +0 -334
- package/src/clients/generator-client.ts +0 -351
- package/src/clients/git-client.ts +0 -627
- package/src/clients/github-client.ts +0 -410
- package/src/clients/helm-client.ts +0 -504
- package/src/clients/index.ts +0 -80
- package/src/clients/k8s-client.ts +0 -497
- package/src/clients/llm-client.ts +0 -161
- package/src/clients/rest-client.ts +0 -130
- package/src/clients/service-discovery.ts +0 -38
- package/src/clients/terraform-client.ts +0 -482
- package/src/clients/tools-client.ts +0 -1843
- package/src/clients/ws-client.ts +0 -115
- package/src/commands/alias.ts +0 -100
- package/src/commands/analyze/index.ts +0 -352
- package/src/commands/apply/helm.ts +0 -473
- package/src/commands/apply/index.ts +0 -213
- package/src/commands/apply/k8s.ts +0 -454
- package/src/commands/apply/terraform.ts +0 -582
- package/src/commands/ask.ts +0 -167
- package/src/commands/audit/index.ts +0 -357
- package/src/commands/auth-cloud.ts +0 -407
- package/src/commands/auth-list.ts +0 -134
- package/src/commands/auth-profile.ts +0 -121
- package/src/commands/auth-refresh.ts +0 -187
- package/src/commands/auth-status.ts +0 -141
- package/src/commands/aws/ec2.ts +0 -501
- package/src/commands/aws/iam.ts +0 -397
- package/src/commands/aws/index.ts +0 -133
- package/src/commands/aws/lambda.ts +0 -396
- package/src/commands/aws/rds.ts +0 -439
- package/src/commands/aws/s3.ts +0 -439
- package/src/commands/aws/vpc.ts +0 -393
- package/src/commands/aws-discover.ts +0 -542
- package/src/commands/aws-terraform.ts +0 -755
- package/src/commands/azure/aks.ts +0 -376
- package/src/commands/azure/functions.ts +0 -253
- package/src/commands/azure/index.ts +0 -116
- package/src/commands/azure/storage.ts +0 -478
- package/src/commands/azure/vm.ts +0 -355
- package/src/commands/billing/index.ts +0 -256
- package/src/commands/chat.ts +0 -320
- package/src/commands/completions.ts +0 -268
- package/src/commands/config.ts +0 -372
- package/src/commands/cost/cloud-cost-estimator.ts +0 -266
- package/src/commands/cost/estimator.ts +0 -79
- package/src/commands/cost/index.ts +0 -810
- package/src/commands/cost/parsers/terraform.ts +0 -273
- package/src/commands/cost/parsers/types.ts +0 -25
- package/src/commands/cost/pricing/aws.ts +0 -544
- package/src/commands/cost/pricing/azure.ts +0 -499
- package/src/commands/cost/pricing/gcp.ts +0 -396
- package/src/commands/cost/pricing/index.ts +0 -40
- package/src/commands/demo.ts +0 -250
- package/src/commands/deploy.ts +0 -260
- package/src/commands/doctor.ts +0 -1386
- package/src/commands/drift/index.ts +0 -787
- package/src/commands/explain.ts +0 -277
- package/src/commands/export.ts +0 -146
- package/src/commands/feedback.ts +0 -389
- package/src/commands/fix.ts +0 -324
- package/src/commands/fs/index.ts +0 -402
- package/src/commands/gcp/compute.ts +0 -325
- package/src/commands/gcp/functions.ts +0 -271
- package/src/commands/gcp/gke.ts +0 -438
- package/src/commands/gcp/iam.ts +0 -344
- package/src/commands/gcp/index.ts +0 -129
- package/src/commands/gcp/storage.ts +0 -284
- package/src/commands/generate-helm.ts +0 -1249
- package/src/commands/generate-k8s.ts +0 -1508
- package/src/commands/generate-terraform.ts +0 -1202
- package/src/commands/gh/index.ts +0 -863
- package/src/commands/git/index.ts +0 -1343
- package/src/commands/helm/index.ts +0 -1126
- package/src/commands/help.ts +0 -715
- package/src/commands/history.ts +0 -149
- package/src/commands/import.ts +0 -868
- package/src/commands/incident.ts +0 -166
- package/src/commands/index.ts +0 -367
- package/src/commands/init.ts +0 -1051
- package/src/commands/k8s/index.ts +0 -1137
- package/src/commands/login.ts +0 -716
- package/src/commands/logout.ts +0 -83
- package/src/commands/logs.ts +0 -167
- package/src/commands/onboarding.ts +0 -405
- package/src/commands/pipeline.ts +0 -186
- package/src/commands/plan/display.ts +0 -279
- package/src/commands/plan/index.ts +0 -599
- package/src/commands/plugin.ts +0 -398
- package/src/commands/preview.ts +0 -452
- package/src/commands/profile.ts +0 -342
- package/src/commands/questionnaire.ts +0 -1172
- package/src/commands/resume.ts +0 -47
- package/src/commands/rollback.ts +0 -315
- package/src/commands/rollout.ts +0 -88
- package/src/commands/runbook.ts +0 -346
- package/src/commands/schedule.ts +0 -236
- package/src/commands/status.ts +0 -252
- package/src/commands/team/index.ts +0 -346
- package/src/commands/team-context.ts +0 -220
- package/src/commands/template.ts +0 -233
- package/src/commands/tf/index.ts +0 -1093
- package/src/commands/upgrade.ts +0 -607
- package/src/commands/usage/index.ts +0 -134
- package/src/commands/version.ts +0 -174
- package/src/commands/watch.ts +0 -153
- package/src/compat/index.ts +0 -2
- package/src/compat/runtime.ts +0 -12
- package/src/compat/sqlite.ts +0 -177
- package/src/config/index.ts +0 -17
- package/src/config/manager.ts +0 -530
- package/src/config/mode-store.ts +0 -62
- package/src/config/profiles.ts +0 -84
- package/src/config/safety-policy.ts +0 -358
- package/src/config/schema.ts +0 -125
- package/src/config/types.ts +0 -609
- package/src/config/workspace-state.ts +0 -53
- package/src/context/context-db.ts +0 -199
- package/src/demo/index.ts +0 -349
- package/src/demo/scenarios/full-journey.ts +0 -229
- package/src/demo/scenarios/getting-started.ts +0 -127
- package/src/demo/scenarios/helm-release.ts +0 -341
- package/src/demo/scenarios/k8s-deployment.ts +0 -194
- package/src/demo/scenarios/terraform-vpc.ts +0 -170
- package/src/demo/types.ts +0 -92
- package/src/engine/cost-estimator.ts +0 -480
- package/src/engine/diagram-generator.ts +0 -256
- package/src/engine/drift-detector.ts +0 -902
- package/src/engine/executor.ts +0 -1066
- package/src/engine/index.ts +0 -76
- package/src/engine/orchestrator.ts +0 -636
- package/src/engine/planner.ts +0 -787
- package/src/engine/safety.ts +0 -743
- package/src/engine/verifier.ts +0 -770
- package/src/enterprise/audit.ts +0 -348
- package/src/enterprise/auth.ts +0 -270
- package/src/enterprise/billing.ts +0 -822
- package/src/enterprise/index.ts +0 -17
- package/src/enterprise/teams.ts +0 -443
- package/src/generator/best-practices.ts +0 -1608
- package/src/generator/helm.ts +0 -630
- package/src/generator/index.ts +0 -37
- package/src/generator/intent-parser.ts +0 -514
- package/src/generator/kubernetes.ts +0 -976
- package/src/generator/terraform.ts +0 -1875
- package/src/history/index.ts +0 -8
- package/src/history/manager.ts +0 -250
- package/src/history/types.ts +0 -34
- package/src/hooks/config.ts +0 -432
- package/src/hooks/engine.ts +0 -392
- package/src/hooks/index.ts +0 -4
- package/src/llm/auth-bridge.ts +0 -198
- package/src/llm/circuit-breaker.ts +0 -140
- package/src/llm/config-loader.ts +0 -201
- package/src/llm/cost-calculator.ts +0 -171
- package/src/llm/index.ts +0 -8
- package/src/llm/model-aliases.ts +0 -115
- package/src/llm/provider-registry.ts +0 -63
- package/src/llm/providers/anthropic.ts +0 -462
- package/src/llm/providers/bedrock.ts +0 -477
- package/src/llm/providers/google.ts +0 -405
- package/src/llm/providers/ollama.ts +0 -767
- package/src/llm/providers/openai-compatible.ts +0 -340
- package/src/llm/providers/openai.ts +0 -328
- package/src/llm/providers/openrouter.ts +0 -338
- package/src/llm/router.ts +0 -1104
- package/src/llm/types.ts +0 -232
- package/src/lsp/client.ts +0 -298
- package/src/lsp/languages.ts +0 -119
- package/src/lsp/manager.ts +0 -294
- package/src/mcp/client.ts +0 -402
- package/src/mcp/index.ts +0 -5
- package/src/mcp/manager.ts +0 -133
- package/src/nimbus.ts +0 -233
- package/src/plugins/index.ts +0 -27
- package/src/plugins/loader.ts +0 -334
- package/src/plugins/manager.ts +0 -376
- package/src/plugins/types.ts +0 -284
- package/src/scanners/cicd-scanner.ts +0 -258
- package/src/scanners/cloud-scanner.ts +0 -466
- package/src/scanners/framework-scanner.ts +0 -469
- package/src/scanners/iac-scanner.ts +0 -388
- package/src/scanners/index.ts +0 -539
- package/src/scanners/language-scanner.ts +0 -276
- package/src/scanners/package-manager-scanner.ts +0 -277
- package/src/scanners/types.ts +0 -172
- package/src/sessions/manager.ts +0 -472
- package/src/sessions/types.ts +0 -44
- package/src/sharing/sync.ts +0 -300
- package/src/sharing/viewer.ts +0 -163
- package/src/snapshots/index.ts +0 -2
- package/src/snapshots/manager.ts +0 -530
- package/src/state/artifacts.ts +0 -147
- package/src/state/audit.ts +0 -137
- package/src/state/billing.ts +0 -240
- package/src/state/checkpoints.ts +0 -117
- package/src/state/config.ts +0 -67
- package/src/state/conversations.ts +0 -14
- package/src/state/credentials.ts +0 -154
- package/src/state/db.ts +0 -58
- package/src/state/index.ts +0 -26
- package/src/state/messages.ts +0 -115
- package/src/state/projects.ts +0 -123
- package/src/state/schema.ts +0 -236
- package/src/state/sessions.ts +0 -147
- package/src/state/teams.ts +0 -200
- package/src/telemetry.ts +0 -108
- package/src/tools/aws-ops.ts +0 -952
- package/src/tools/azure-ops.ts +0 -579
- package/src/tools/file-ops.ts +0 -615
- package/src/tools/gcp-ops.ts +0 -625
- package/src/tools/git-ops.ts +0 -773
- package/src/tools/github-ops.ts +0 -799
- package/src/tools/helm-ops.ts +0 -943
- package/src/tools/index.ts +0 -17
- package/src/tools/k8s-ops.ts +0 -819
- package/src/tools/schemas/converter.ts +0 -184
- package/src/tools/schemas/devops.ts +0 -3502
- package/src/tools/schemas/index.ts +0 -73
- package/src/tools/schemas/standard.ts +0 -1148
- package/src/tools/schemas/types.ts +0 -735
- package/src/tools/spawn-exec.ts +0 -148
- package/src/tools/terraform-ops.ts +0 -862
- package/src/types/ambient.d.ts +0 -193
- package/src/types/config.ts +0 -83
- package/src/types/drift.ts +0 -116
- package/src/types/enterprise.ts +0 -335
- package/src/types/index.ts +0 -20
- package/src/types/plan.ts +0 -44
- package/src/types/request.ts +0 -65
- package/src/types/response.ts +0 -54
- package/src/types/service.ts +0 -51
- package/src/ui/App.tsx +0 -2114
- package/src/ui/DeployPreview.tsx +0 -174
- package/src/ui/FileDiffModal.tsx +0 -162
- package/src/ui/Header.tsx +0 -131
- package/src/ui/HelpModal.tsx +0 -57
- package/src/ui/InputBox.tsx +0 -503
- package/src/ui/MessageList.tsx +0 -1032
- package/src/ui/PermissionPrompt.tsx +0 -163
- package/src/ui/StatusBar.tsx +0 -277
- package/src/ui/TerminalPane.tsx +0 -84
- package/src/ui/ToolCallDisplay.tsx +0 -643
- package/src/ui/TreePane.tsx +0 -132
- package/src/ui/chat-ui.ts +0 -850
- package/src/ui/index.ts +0 -33
- package/src/ui/ink/index.ts +0 -1444
- package/src/ui/streaming.ts +0 -176
- package/src/ui/theme.ts +0 -104
- package/src/ui/types.ts +0 -75
- package/src/utils/analytics.ts +0 -72
- package/src/utils/cost-warning.ts +0 -27
- package/src/utils/env.ts +0 -46
- package/src/utils/errors.ts +0 -69
- package/src/utils/event-bus.ts +0 -38
- package/src/utils/index.ts +0 -24
- package/src/utils/logger.ts +0 -171
- package/src/utils/rate-limiter.ts +0 -121
- package/src/utils/service-auth.ts +0 -49
- package/src/utils/validation.ts +0 -53
- package/src/version.ts +0 -4
- package/src/watcher/index.ts +0 -214
- package/src/wizard/approval.ts +0 -383
- package/src/wizard/index.ts +0 -25
- package/src/wizard/prompts.ts +0 -338
- package/src/wizard/types.ts +0 -172
- package/src/wizard/ui.ts +0 -556
- package/src/wizard/wizard.ts +0 -304
- package/tsconfig.json +0 -24
|
@@ -1,514 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Intent Parser (Embedded)
|
|
3
|
-
*
|
|
4
|
-
* Parses natural language user input to extract infrastructure intent and entities.
|
|
5
|
-
* Uses the embedded LLM router directly instead of HTTP calls to llm-service.
|
|
6
|
-
*
|
|
7
|
-
* Refactored from: services/generator-service/src/conversational/intent-parser.ts
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { logger } from '../utils';
|
|
11
|
-
import type { LLMRouter } from '../llm/router';
|
|
12
|
-
|
|
13
|
-
// ==========================================
|
|
14
|
-
// Types (inlined from conversational/types.ts)
|
|
15
|
-
// ==========================================
|
|
16
|
-
|
|
17
|
-
export interface ConversationalIntent {
|
|
18
|
-
type: 'generate' | 'modify' | 'explain' | 'help' | 'unknown';
|
|
19
|
-
confidence: number;
|
|
20
|
-
entities: IntentEntity[];
|
|
21
|
-
context?: Record<string, unknown>;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export interface IntentEntity {
|
|
25
|
-
type: string; // 'provider', 'component', 'environment', 'region', 'generation_type', etc.
|
|
26
|
-
value: string;
|
|
27
|
-
confidence: number;
|
|
28
|
-
position?: { start: number; end: number };
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export interface NLUPattern {
|
|
32
|
-
pattern: RegExp;
|
|
33
|
-
intent: string;
|
|
34
|
-
entities?: Array<{
|
|
35
|
-
type: string;
|
|
36
|
-
extractor: (match: RegExpMatchArray) => string;
|
|
37
|
-
}>;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// ==========================================
|
|
41
|
-
// Constants
|
|
42
|
-
// ==========================================
|
|
43
|
-
|
|
44
|
-
/** System prompt for LLM-based intent classification. */
|
|
45
|
-
const INTENT_PROMPT =
|
|
46
|
-
"Classify the user's infrastructure intent. Return JSON with fields: " +
|
|
47
|
-
'intent (one of: generate, modify, explain, help), confidence (number 0-1), ' +
|
|
48
|
-
'entities (array of {type: string, value: string} where type is one of: provider, component, environment, region, generation_type). ' +
|
|
49
|
-
'Return ONLY the JSON object, no markdown.';
|
|
50
|
-
|
|
51
|
-
/** Valid intent types returned by the LLM. */
|
|
52
|
-
const VALID_INTENTS = new Set(['generate', 'modify', 'explain', 'help']);
|
|
53
|
-
|
|
54
|
-
// ==========================================
|
|
55
|
-
// IntentParser Class
|
|
56
|
-
// ==========================================
|
|
57
|
-
|
|
58
|
-
export class IntentParser {
|
|
59
|
-
private patterns: NLUPattern[];
|
|
60
|
-
private router: LLMRouter | null;
|
|
61
|
-
|
|
62
|
-
constructor(router?: LLMRouter) {
|
|
63
|
-
this.patterns = this.initializePatterns();
|
|
64
|
-
this.router = router || null;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Set or update the LLM router (for lazy initialization)
|
|
69
|
-
*/
|
|
70
|
-
setRouter(router: LLMRouter): void {
|
|
71
|
-
this.router = router;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Parse user input to extract intent and entities.
|
|
76
|
-
* Attempts LLM-based classification first, falls back to regex/keyword matching.
|
|
77
|
-
*/
|
|
78
|
-
async parse(input: string): Promise<ConversationalIntent> {
|
|
79
|
-
if (this.router) {
|
|
80
|
-
try {
|
|
81
|
-
const llmResult = await this.parseWithLLM(input);
|
|
82
|
-
if (llmResult) {
|
|
83
|
-
logger.debug(
|
|
84
|
-
`Using LLM-classified intent: ${llmResult.type} (confidence: ${llmResult.confidence})`
|
|
85
|
-
);
|
|
86
|
-
return llmResult;
|
|
87
|
-
}
|
|
88
|
-
} catch (error) {
|
|
89
|
-
logger.debug(
|
|
90
|
-
`LLM intent parsing failed, falling back to heuristics: ${(error as Error).message}`
|
|
91
|
-
);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
return this.parseHeuristic(input);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Classify intent using the embedded LLM router (replaces HTTP fetch to llm-service).
|
|
100
|
-
*/
|
|
101
|
-
private async parseWithLLM(input: string): Promise<ConversationalIntent | null> {
|
|
102
|
-
if (!this.router) {
|
|
103
|
-
return null;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// Use a timeout via AbortController-like approach
|
|
107
|
-
const timeoutMs = 3_000;
|
|
108
|
-
const timeoutPromise = new Promise<never>((_, reject) =>
|
|
109
|
-
setTimeout(() => reject(new Error('LLM intent classification timed out')), timeoutMs)
|
|
110
|
-
);
|
|
111
|
-
|
|
112
|
-
const routePromise = this.router.route({
|
|
113
|
-
messages: [
|
|
114
|
-
{ role: 'system', content: INTENT_PROMPT },
|
|
115
|
-
{ role: 'user', content: input },
|
|
116
|
-
],
|
|
117
|
-
maxTokens: 512,
|
|
118
|
-
temperature: 0.1,
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
const response = await Promise.race([routePromise, timeoutPromise]);
|
|
122
|
-
|
|
123
|
-
const content = response.content;
|
|
124
|
-
if (!content) {
|
|
125
|
-
throw new Error('LLM response missing content');
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// Strip markdown code fences if present
|
|
129
|
-
const jsonStr = content
|
|
130
|
-
.replace(/^```(?:json)?\s*/i, '')
|
|
131
|
-
.replace(/\s*```\s*$/, '')
|
|
132
|
-
.trim();
|
|
133
|
-
|
|
134
|
-
const parsed: unknown = JSON.parse(jsonStr);
|
|
135
|
-
|
|
136
|
-
if (typeof parsed !== 'object' || parsed === null) {
|
|
137
|
-
throw new Error('LLM response is not an object');
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
const obj = parsed as Record<string, unknown>;
|
|
141
|
-
|
|
142
|
-
// Validate required fields
|
|
143
|
-
if (typeof obj.intent !== 'string' || typeof obj.confidence !== 'number') {
|
|
144
|
-
throw new Error('LLM response missing required fields');
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// Map intent to type, defaulting to 'unknown' for unrecognized intents
|
|
148
|
-
const intentType: ConversationalIntent['type'] = VALID_INTENTS.has(obj.intent)
|
|
149
|
-
? (obj.intent as ConversationalIntent['type'])
|
|
150
|
-
: 'unknown';
|
|
151
|
-
|
|
152
|
-
// Only use LLM result if confidence is sufficient
|
|
153
|
-
const confidence = Math.min(obj.confidence, 1);
|
|
154
|
-
|
|
155
|
-
// Parse entities
|
|
156
|
-
const entities: IntentEntity[] = [];
|
|
157
|
-
if (Array.isArray(obj.entities)) {
|
|
158
|
-
for (const entity of obj.entities) {
|
|
159
|
-
if (
|
|
160
|
-
typeof entity === 'object' &&
|
|
161
|
-
entity !== null &&
|
|
162
|
-
typeof entity.type === 'string' &&
|
|
163
|
-
typeof entity.value === 'string'
|
|
164
|
-
) {
|
|
165
|
-
entities.push({
|
|
166
|
-
type: entity.type,
|
|
167
|
-
value: entity.value,
|
|
168
|
-
confidence: 0.9,
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
return {
|
|
175
|
-
type: intentType,
|
|
176
|
-
confidence,
|
|
177
|
-
entities,
|
|
178
|
-
};
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* Parse user input using regex patterns and keyword matching (fallback).
|
|
183
|
-
*/
|
|
184
|
-
private parseHeuristic(input: string): ConversationalIntent {
|
|
185
|
-
const normalizedInput = input.toLowerCase().trim();
|
|
186
|
-
|
|
187
|
-
// Try to match patterns
|
|
188
|
-
for (const pattern of this.patterns) {
|
|
189
|
-
const match = normalizedInput.match(pattern.pattern);
|
|
190
|
-
if (match) {
|
|
191
|
-
const entities = this.extractEntities(match, pattern);
|
|
192
|
-
return {
|
|
193
|
-
type: pattern.intent as ConversationalIntent['type'],
|
|
194
|
-
confidence: this.calculateConfidence(match, normalizedInput),
|
|
195
|
-
entities,
|
|
196
|
-
};
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// No pattern matched - try keyword-based matching
|
|
201
|
-
const keywordIntent = this.matchByKeywords(normalizedInput);
|
|
202
|
-
if (keywordIntent) {
|
|
203
|
-
return keywordIntent;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
// Unknown intent
|
|
207
|
-
return {
|
|
208
|
-
type: 'unknown',
|
|
209
|
-
confidence: 0,
|
|
210
|
-
entities: [],
|
|
211
|
-
};
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
/**
|
|
215
|
-
* Extract entities from regex match
|
|
216
|
-
*/
|
|
217
|
-
private extractEntities(match: RegExpMatchArray, pattern: NLUPattern): IntentEntity[] {
|
|
218
|
-
const entities: IntentEntity[] = [];
|
|
219
|
-
|
|
220
|
-
if (!pattern.entities) {
|
|
221
|
-
return entities;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
for (const entityConfig of pattern.entities) {
|
|
225
|
-
try {
|
|
226
|
-
const value = entityConfig.extractor(match);
|
|
227
|
-
if (value) {
|
|
228
|
-
entities.push({
|
|
229
|
-
type: entityConfig.type,
|
|
230
|
-
value,
|
|
231
|
-
confidence: 0.9,
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
} catch (error) {
|
|
235
|
-
logger.error('Error extracting entity', error);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
return entities;
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
/**
|
|
243
|
-
* Calculate confidence score
|
|
244
|
-
*/
|
|
245
|
-
private calculateConfidence(match: RegExpMatchArray, input: string): number {
|
|
246
|
-
const matchedLength = match[0].length;
|
|
247
|
-
const inputLength = input.length;
|
|
248
|
-
const coverage = matchedLength / inputLength;
|
|
249
|
-
return Math.min(0.9, 0.5 + coverage * 0.4);
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* Match intent by keywords when patterns don't match
|
|
254
|
-
*/
|
|
255
|
-
private matchByKeywords(input: string): ConversationalIntent | null {
|
|
256
|
-
const generateKeywords = [
|
|
257
|
-
'create',
|
|
258
|
-
'generate',
|
|
259
|
-
'build',
|
|
260
|
-
'setup',
|
|
261
|
-
'deploy',
|
|
262
|
-
'provision',
|
|
263
|
-
'deployment',
|
|
264
|
-
'pod',
|
|
265
|
-
'statefulset',
|
|
266
|
-
'daemonset',
|
|
267
|
-
'cronjob',
|
|
268
|
-
'ingress',
|
|
269
|
-
'helm',
|
|
270
|
-
'chart',
|
|
271
|
-
'manifest',
|
|
272
|
-
];
|
|
273
|
-
const modifyKeywords = ['change', 'modify', 'update', 'edit', 'adjust', 'alter'];
|
|
274
|
-
const explainKeywords = ['explain', 'what', 'why', 'how', 'tell me about', 'describe'];
|
|
275
|
-
const helpKeywords = ['help', 'assist', 'guide', 'support'];
|
|
276
|
-
|
|
277
|
-
if (generateKeywords.some(kw => input.includes(kw))) {
|
|
278
|
-
return { type: 'generate', confidence: 0.6, entities: this.extractKeywordEntities(input) };
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
if (modifyKeywords.some(kw => input.includes(kw))) {
|
|
282
|
-
return { type: 'modify', confidence: 0.6, entities: this.extractKeywordEntities(input) };
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
if (explainKeywords.some(kw => input.includes(kw))) {
|
|
286
|
-
return { type: 'explain', confidence: 0.6, entities: this.extractKeywordEntities(input) };
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
if (helpKeywords.some(kw => input.includes(kw))) {
|
|
290
|
-
return { type: 'help', confidence: 0.7, entities: [] };
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
return null;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
/**
|
|
297
|
-
* Extract entities using keyword matching
|
|
298
|
-
*/
|
|
299
|
-
private extractKeywordEntities(input: string): IntentEntity[] {
|
|
300
|
-
const entities: IntentEntity[] = [];
|
|
301
|
-
|
|
302
|
-
// Provider extraction
|
|
303
|
-
const providers = ['aws', 'gcp', 'google cloud', 'azure'];
|
|
304
|
-
for (const provider of providers) {
|
|
305
|
-
if (input.includes(provider)) {
|
|
306
|
-
entities.push({
|
|
307
|
-
type: 'provider',
|
|
308
|
-
value: provider === 'google cloud' ? 'gcp' : provider,
|
|
309
|
-
confidence: 0.9,
|
|
310
|
-
});
|
|
311
|
-
break;
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
// K8s workload type extraction
|
|
316
|
-
const k8sWorkloads = [
|
|
317
|
-
'deployment',
|
|
318
|
-
'pod',
|
|
319
|
-
'service',
|
|
320
|
-
'ingress',
|
|
321
|
-
'namespace',
|
|
322
|
-
'statefulset',
|
|
323
|
-
'daemonset',
|
|
324
|
-
'cronjob',
|
|
325
|
-
];
|
|
326
|
-
let foundK8sWorkload = false;
|
|
327
|
-
for (const workload of k8sWorkloads) {
|
|
328
|
-
if (input.includes(workload)) {
|
|
329
|
-
entities.push({ type: 'component', value: workload, confidence: 0.8 });
|
|
330
|
-
foundK8sWorkload = true;
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
if (foundK8sWorkload) {
|
|
335
|
-
entities.push({ type: 'generation_type', value: 'kubernetes', confidence: 0.85 });
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
// Helm keyword extraction
|
|
339
|
-
const helmKeywords = ['helm chart', 'helm', 'chart', 'values.yaml'];
|
|
340
|
-
let foundHelm = false;
|
|
341
|
-
for (const keyword of helmKeywords) {
|
|
342
|
-
if (input.includes(keyword)) {
|
|
343
|
-
foundHelm = true;
|
|
344
|
-
break;
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
if (foundHelm) {
|
|
349
|
-
const existingGenType = entities.find(e => e.type === 'generation_type');
|
|
350
|
-
if (existingGenType) {
|
|
351
|
-
existingGenType.value = 'helm';
|
|
352
|
-
} else {
|
|
353
|
-
entities.push({ type: 'generation_type', value: 'helm', confidence: 0.85 });
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
// Component extraction (cloud infrastructure)
|
|
358
|
-
const components = [
|
|
359
|
-
'vpc',
|
|
360
|
-
'eks',
|
|
361
|
-
'kubernetes',
|
|
362
|
-
'k8s',
|
|
363
|
-
'rds',
|
|
364
|
-
'database',
|
|
365
|
-
's3',
|
|
366
|
-
'storage',
|
|
367
|
-
'bucket',
|
|
368
|
-
];
|
|
369
|
-
for (const component of components) {
|
|
370
|
-
if (input.includes(component)) {
|
|
371
|
-
if (foundK8sWorkload && (component === 'kubernetes' || component === 'k8s')) {
|
|
372
|
-
continue;
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
let normalizedComponent = component;
|
|
376
|
-
const genTypeEntity = entities.find(e => e.type === 'generation_type');
|
|
377
|
-
const isK8sGeneration =
|
|
378
|
-
genTypeEntity && (genTypeEntity.value === 'kubernetes' || genTypeEntity.value === 'helm');
|
|
379
|
-
|
|
380
|
-
if (component === 'k8s' || component === 'kubernetes') {
|
|
381
|
-
normalizedComponent = isK8sGeneration ? 'kubernetes' : 'eks';
|
|
382
|
-
}
|
|
383
|
-
if (component === 'database') {
|
|
384
|
-
normalizedComponent = 'rds';
|
|
385
|
-
}
|
|
386
|
-
if (component === 'storage' || component === 'bucket') {
|
|
387
|
-
normalizedComponent = 's3';
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
if (!entities.some(e => e.type === 'component' && e.value === normalizedComponent)) {
|
|
391
|
-
entities.push({ type: 'component', value: normalizedComponent, confidence: 0.8 });
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
// Environment extraction
|
|
397
|
-
const environments = ['production', 'staging', 'development', 'dev', 'prod', 'test'];
|
|
398
|
-
for (const env of environments) {
|
|
399
|
-
if (input.includes(env)) {
|
|
400
|
-
let normalizedEnv = env;
|
|
401
|
-
if (env === 'dev') {
|
|
402
|
-
normalizedEnv = 'development';
|
|
403
|
-
}
|
|
404
|
-
if (env === 'prod') {
|
|
405
|
-
normalizedEnv = 'production';
|
|
406
|
-
}
|
|
407
|
-
entities.push({ type: 'environment', value: normalizedEnv, confidence: 0.85 });
|
|
408
|
-
break;
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
// Region extraction
|
|
413
|
-
const regionPattern =
|
|
414
|
-
/\b(us-east-1|us-west-2|eu-west-1|eu-central-1|ap-southeast-1|ap-northeast-1)\b/;
|
|
415
|
-
const regionMatch = input.match(regionPattern);
|
|
416
|
-
if (regionMatch) {
|
|
417
|
-
entities.push({ type: 'region', value: regionMatch[0], confidence: 0.95 });
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
return entities;
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
/**
|
|
424
|
-
* Initialize NLU patterns
|
|
425
|
-
*/
|
|
426
|
-
private initializePatterns(): NLUPattern[] {
|
|
427
|
-
return [
|
|
428
|
-
// Generate Helm chart patterns
|
|
429
|
-
{
|
|
430
|
-
pattern: /(?:create|generate|build)\s+(?:a|an)?\s*helm\s+chart/i,
|
|
431
|
-
intent: 'generate',
|
|
432
|
-
entities: [{ type: 'generation_type', extractor: () => 'helm' }],
|
|
433
|
-
},
|
|
434
|
-
// Generate Kubernetes resource patterns
|
|
435
|
-
{
|
|
436
|
-
pattern:
|
|
437
|
-
/(?:create|generate|build|deploy)\s+(?:a|an)?\s*(deployment|pod|service|statefulset|daemonset|cronjob|ingress)/i,
|
|
438
|
-
intent: 'generate',
|
|
439
|
-
entities: [
|
|
440
|
-
{ type: 'component', extractor: match => match[1].toLowerCase() },
|
|
441
|
-
{ type: 'generation_type', extractor: () => 'kubernetes' },
|
|
442
|
-
],
|
|
443
|
-
},
|
|
444
|
-
// Generate infrastructure patterns
|
|
445
|
-
{
|
|
446
|
-
pattern:
|
|
447
|
-
/(?:create|generate|build|setup)\s+(?:a|an)?\s*(vpc|eks|rds|s3|kubernetes|k8s)(?:\s+on|\s+in)?\s+(aws|gcp|azure)?/i,
|
|
448
|
-
intent: 'generate',
|
|
449
|
-
entities: [
|
|
450
|
-
{
|
|
451
|
-
type: 'component',
|
|
452
|
-
extractor: match => {
|
|
453
|
-
const c = match[1].toLowerCase();
|
|
454
|
-
return c === 'k8s' || c === 'kubernetes' ? 'eks' : c;
|
|
455
|
-
},
|
|
456
|
-
},
|
|
457
|
-
{ type: 'provider', extractor: match => match[2]?.toLowerCase() || 'aws' },
|
|
458
|
-
],
|
|
459
|
-
},
|
|
460
|
-
{
|
|
461
|
-
pattern:
|
|
462
|
-
/(?:create|generate|build|setup)\s+(?:a|an)?\s*(production|staging|development)\s+environment/i,
|
|
463
|
-
intent: 'generate',
|
|
464
|
-
entities: [{ type: 'environment', extractor: match => match[1].toLowerCase() }],
|
|
465
|
-
},
|
|
466
|
-
{
|
|
467
|
-
pattern: /(?:i need|i want|can you create)\s+(?:a|an)?\s*(vpc|eks|rds|s3)/i,
|
|
468
|
-
intent: 'generate',
|
|
469
|
-
entities: [{ type: 'component', extractor: match => match[1].toLowerCase() }],
|
|
470
|
-
},
|
|
471
|
-
{
|
|
472
|
-
pattern: /deploy\s+(?:a|an)?\s*(.+?)\s+(?:on|to|in)\s+(aws|gcp|azure)/i,
|
|
473
|
-
intent: 'generate',
|
|
474
|
-
entities: [
|
|
475
|
-
{ type: 'component', extractor: match => match[1].toLowerCase().trim() },
|
|
476
|
-
{ type: 'provider', extractor: match => match[2].toLowerCase() },
|
|
477
|
-
],
|
|
478
|
-
},
|
|
479
|
-
// Modify patterns
|
|
480
|
-
{
|
|
481
|
-
pattern: /(?:change|modify|update|edit)\s+(?:the|my)?\s*(vpc|eks|rds|s3)/i,
|
|
482
|
-
intent: 'modify',
|
|
483
|
-
entities: [{ type: 'component', extractor: match => match[1].toLowerCase() }],
|
|
484
|
-
},
|
|
485
|
-
{
|
|
486
|
-
pattern:
|
|
487
|
-
/(?:add|enable|disable|remove)\s+(.+?)\s+(?:to|from|for|in)\s+(?:the|my)?\s*(vpc|eks|rds|s3)/i,
|
|
488
|
-
intent: 'modify',
|
|
489
|
-
entities: [
|
|
490
|
-
{ type: 'action', extractor: match => match[1].toLowerCase() },
|
|
491
|
-
{ type: 'component', extractor: match => match[2].toLowerCase() },
|
|
492
|
-
],
|
|
493
|
-
},
|
|
494
|
-
// Explain patterns
|
|
495
|
-
{
|
|
496
|
-
pattern:
|
|
497
|
-
/(?:what|explain|describe|tell me about)\s+(?:is|are)?\s*(?:a|an|the)?\s*(vpc|eks|rds|s3|terraform|kubernetes|helm|deployment|statefulset|ingress)/i,
|
|
498
|
-
intent: 'explain',
|
|
499
|
-
entities: [{ type: 'topic', extractor: match => match[1].toLowerCase() }],
|
|
500
|
-
},
|
|
501
|
-
{
|
|
502
|
-
pattern: /(?:why|how)\s+(?:do|does|should|would)\s+(?:i|we)?\s*(.+)/i,
|
|
503
|
-
intent: 'explain',
|
|
504
|
-
entities: [{ type: 'question', extractor: match => match[1].toLowerCase() }],
|
|
505
|
-
},
|
|
506
|
-
// Help patterns
|
|
507
|
-
{ pattern: /(?:help|assist|guide|support|how to)/i, intent: 'help' },
|
|
508
|
-
{
|
|
509
|
-
pattern: /(?:what can you do|what are your capabilities|show me what you can do)/i,
|
|
510
|
-
intent: 'help',
|
|
511
|
-
},
|
|
512
|
-
];
|
|
513
|
-
}
|
|
514
|
-
}
|