@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
package/src/sharing/sync.ts
DELETED
|
@@ -1,300 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Session Sharing — Generate share IDs and sync session data
|
|
3
|
-
*
|
|
4
|
-
* Provides local sharing via the nimbus serve API.
|
|
5
|
-
* Shares are persisted to the SQLite `shares` table so they survive restarts.
|
|
6
|
-
* For hosted sharing via Supabase, the astron-landing web UI handles
|
|
7
|
-
* the sync directly using its existing Supabase integration.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { getConversation as _getConversation } from '../state/conversations';
|
|
11
|
-
import { SessionManager as _SessionManager } from '../sessions/manager';
|
|
12
|
-
import type { LLMMessage } from '../llm/types';
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Dependency overrides for testing. Set these before calling shareSession/etc.
|
|
16
|
-
* In production code these remain undefined and the real implementations are used.
|
|
17
|
-
*/
|
|
18
|
-
export const _deps = {
|
|
19
|
-
getConversation: undefined as ((id: string) => any) | undefined,
|
|
20
|
-
getSessionManager: undefined as (() => { get: (id: string) => any }) | undefined,
|
|
21
|
-
getDb: undefined as (() => any) | undefined,
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
function getConversation(id: string) {
|
|
25
|
-
return (_deps.getConversation ?? _getConversation)(id);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function getSessionManager() {
|
|
29
|
-
return _deps.getSessionManager ? _deps.getSessionManager() : _SessionManager.getInstance();
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/** A shared session snapshot. */
|
|
33
|
-
export interface SharedSession {
|
|
34
|
-
/** Unique share ID. */
|
|
35
|
-
id: string;
|
|
36
|
-
/** Session ID this share was created from. */
|
|
37
|
-
sessionId: string;
|
|
38
|
-
/** Session name. */
|
|
39
|
-
name: string;
|
|
40
|
-
/** Conversation messages at time of sharing. */
|
|
41
|
-
messages: LLMMessage[];
|
|
42
|
-
/** Model used. */
|
|
43
|
-
model: string;
|
|
44
|
-
/** Session mode. */
|
|
45
|
-
mode: string;
|
|
46
|
-
/** Total cost. */
|
|
47
|
-
costUSD: number;
|
|
48
|
-
/** Total tokens used. */
|
|
49
|
-
tokenCount: number;
|
|
50
|
-
/** When the share was created. */
|
|
51
|
-
createdAt: string;
|
|
52
|
-
/** When the share expires (30-day TTL). */
|
|
53
|
-
expiresAt: string;
|
|
54
|
-
/** Whether this is a live-updating share. */
|
|
55
|
-
isLive: boolean;
|
|
56
|
-
/** Access token for write access (optional). */
|
|
57
|
-
writeToken?: string;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Lazily import the DB to avoid circular dependency.
|
|
62
|
-
*/
|
|
63
|
-
function getDb() {
|
|
64
|
-
if (_deps.getDb) {
|
|
65
|
-
return _deps.getDb();
|
|
66
|
-
}
|
|
67
|
-
try {
|
|
68
|
-
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
69
|
-
const { getDb: _getDb } = require('../state/db');
|
|
70
|
-
return _getDb();
|
|
71
|
-
} catch {
|
|
72
|
-
return null;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Generate a short, URL-safe share ID.
|
|
78
|
-
*/
|
|
79
|
-
function generateShareId(): string {
|
|
80
|
-
const bytes = crypto.getRandomValues(new Uint8Array(9));
|
|
81
|
-
return btoa(String.fromCharCode(...bytes))
|
|
82
|
-
.replace(/\+/g, '-')
|
|
83
|
-
.replace(/\//g, '_')
|
|
84
|
-
.replace(/=/g, '');
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Generate a secure write token for controlling write access.
|
|
89
|
-
*/
|
|
90
|
-
function generateWriteToken(): string {
|
|
91
|
-
return crypto.randomUUID();
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Create a share for a session.
|
|
96
|
-
*/
|
|
97
|
-
export function shareSession(
|
|
98
|
-
sessionId: string,
|
|
99
|
-
options?: {
|
|
100
|
-
isLive?: boolean;
|
|
101
|
-
ttlDays?: number;
|
|
102
|
-
}
|
|
103
|
-
): SharedSession | null {
|
|
104
|
-
const sessionManager = getSessionManager();
|
|
105
|
-
const session = sessionManager.get(sessionId);
|
|
106
|
-
if (!session) {
|
|
107
|
-
return null;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
const conversation = getConversation(sessionId);
|
|
111
|
-
if (!conversation) {
|
|
112
|
-
return null;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
const ttlDays = options?.ttlDays ?? 30;
|
|
116
|
-
const now = new Date();
|
|
117
|
-
const expiresAt = new Date(now.getTime() + ttlDays * 24 * 60 * 60 * 1000);
|
|
118
|
-
|
|
119
|
-
const shared: SharedSession = {
|
|
120
|
-
id: generateShareId(),
|
|
121
|
-
sessionId,
|
|
122
|
-
name: session.name,
|
|
123
|
-
messages: conversation.messages,
|
|
124
|
-
model: session.model,
|
|
125
|
-
mode: session.mode,
|
|
126
|
-
costUSD: session.costUSD,
|
|
127
|
-
tokenCount: session.tokenCount,
|
|
128
|
-
createdAt: now.toISOString(),
|
|
129
|
-
expiresAt: expiresAt.toISOString(),
|
|
130
|
-
isLive: options?.isLive ?? false,
|
|
131
|
-
writeToken: generateWriteToken(),
|
|
132
|
-
};
|
|
133
|
-
|
|
134
|
-
// Persist to SQLite
|
|
135
|
-
const db = getDb();
|
|
136
|
-
if (db) {
|
|
137
|
-
try {
|
|
138
|
-
db.run(
|
|
139
|
-
`INSERT INTO shares (id, session_id, name, messages, model, mode, cost_usd, token_count, is_live, write_token, created_at, expires_at)
|
|
140
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
141
|
-
[
|
|
142
|
-
shared.id,
|
|
143
|
-
shared.sessionId,
|
|
144
|
-
shared.name,
|
|
145
|
-
JSON.stringify(shared.messages),
|
|
146
|
-
shared.model,
|
|
147
|
-
shared.mode,
|
|
148
|
-
shared.costUSD,
|
|
149
|
-
shared.tokenCount,
|
|
150
|
-
shared.isLive ? 1 : 0,
|
|
151
|
-
shared.writeToken,
|
|
152
|
-
shared.createdAt,
|
|
153
|
-
shared.expiresAt,
|
|
154
|
-
]
|
|
155
|
-
);
|
|
156
|
-
} catch {
|
|
157
|
-
// Non-critical — share is still returned but won't survive restart
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
return shared;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Convert a raw SQLite row to a SharedSession object.
|
|
166
|
-
*/
|
|
167
|
-
function rowToSharedSession(row: any, includeWriteToken = false): SharedSession {
|
|
168
|
-
const result: SharedSession = {
|
|
169
|
-
id: row.id,
|
|
170
|
-
sessionId: row.session_id,
|
|
171
|
-
name: row.name,
|
|
172
|
-
messages: JSON.parse(row.messages),
|
|
173
|
-
model: row.model || '',
|
|
174
|
-
mode: row.mode || '',
|
|
175
|
-
costUSD: row.cost_usd || 0,
|
|
176
|
-
tokenCount: row.token_count || 0,
|
|
177
|
-
createdAt: row.created_at,
|
|
178
|
-
expiresAt: row.expires_at,
|
|
179
|
-
isLive: !!row.is_live,
|
|
180
|
-
};
|
|
181
|
-
if (includeWriteToken) {
|
|
182
|
-
result.writeToken = row.write_token;
|
|
183
|
-
}
|
|
184
|
-
return result;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
/**
|
|
188
|
-
* Get a shared session by share ID.
|
|
189
|
-
* If the share is live, refresh the messages from the current session.
|
|
190
|
-
*/
|
|
191
|
-
export function getSharedSession(shareId: string): SharedSession | null {
|
|
192
|
-
const db = getDb();
|
|
193
|
-
if (!db) {
|
|
194
|
-
return null;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
try {
|
|
198
|
-
const now = new Date().toISOString();
|
|
199
|
-
const row = db
|
|
200
|
-
.query(`SELECT * FROM shares WHERE id = ? AND expires_at > ?`)
|
|
201
|
-
.get(shareId, now) as any;
|
|
202
|
-
|
|
203
|
-
if (!row) {
|
|
204
|
-
return null;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
const shared = rowToSharedSession(row);
|
|
208
|
-
|
|
209
|
-
// Refresh messages for live shares
|
|
210
|
-
if (shared.isLive) {
|
|
211
|
-
const conversation = getConversation(shared.sessionId);
|
|
212
|
-
if (conversation) {
|
|
213
|
-
shared.messages = conversation.messages;
|
|
214
|
-
// Update stored messages
|
|
215
|
-
try {
|
|
216
|
-
db.run(`UPDATE shares SET messages = ? WHERE id = ?`, [
|
|
217
|
-
JSON.stringify(shared.messages),
|
|
218
|
-
shareId,
|
|
219
|
-
]);
|
|
220
|
-
} catch {
|
|
221
|
-
/* non-critical */
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
return shared;
|
|
227
|
-
} catch {
|
|
228
|
-
return null;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
/**
|
|
233
|
-
* List all active shares.
|
|
234
|
-
*/
|
|
235
|
-
export function listShares(): SharedSession[] {
|
|
236
|
-
const db = getDb();
|
|
237
|
-
if (!db) {
|
|
238
|
-
return [];
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
try {
|
|
242
|
-
// Clean up expired shares first
|
|
243
|
-
const now = new Date().toISOString();
|
|
244
|
-
db.run(`DELETE FROM shares WHERE expires_at <= ?`, [now]);
|
|
245
|
-
|
|
246
|
-
const rows = db
|
|
247
|
-
.query(
|
|
248
|
-
`SELECT id, session_id, name, messages, model, mode, cost_usd, token_count, is_live, created_at, expires_at
|
|
249
|
-
FROM shares ORDER BY created_at DESC`
|
|
250
|
-
)
|
|
251
|
-
.all() as any[];
|
|
252
|
-
|
|
253
|
-
return rows.map(row => rowToSharedSession(row));
|
|
254
|
-
} catch {
|
|
255
|
-
return [];
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
/**
|
|
260
|
-
* Delete a share.
|
|
261
|
-
*/
|
|
262
|
-
export function deleteShare(shareId: string): boolean {
|
|
263
|
-
const db = getDb();
|
|
264
|
-
if (!db) {
|
|
265
|
-
return false;
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
try {
|
|
269
|
-
const result = db.run(`DELETE FROM shares WHERE id = ?`, [shareId]);
|
|
270
|
-
return result.changes > 0;
|
|
271
|
-
} catch {
|
|
272
|
-
return false;
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
/**
|
|
277
|
-
* Get the share URL for a shared session.
|
|
278
|
-
*/
|
|
279
|
-
export function getShareUrl(shareId: string, baseUrl?: string): string {
|
|
280
|
-
const base = baseUrl ?? 'http://localhost:6001';
|
|
281
|
-
return `${base}/nimbus/share/${shareId}`;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
/**
|
|
285
|
-
* Clean up expired shares.
|
|
286
|
-
*/
|
|
287
|
-
export function cleanupExpiredShares(): number {
|
|
288
|
-
const db = getDb();
|
|
289
|
-
if (!db) {
|
|
290
|
-
return 0;
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
try {
|
|
294
|
-
const now = new Date().toISOString();
|
|
295
|
-
const result = db.run(`DELETE FROM shares WHERE expires_at <= ?`, [now]);
|
|
296
|
-
return result.changes;
|
|
297
|
-
} catch {
|
|
298
|
-
return 0;
|
|
299
|
-
}
|
|
300
|
-
}
|
package/src/sharing/viewer.ts
DELETED
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Minimal HTML viewer for shared sessions.
|
|
3
|
-
*
|
|
4
|
-
* Generates a standalone HTML page that can be served by nimbus serve
|
|
5
|
-
* for viewing shared sessions when the Web UI is not available.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { SharedSession } from './sync';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Generate a standalone HTML page for viewing a shared session.
|
|
12
|
-
*/
|
|
13
|
-
export function generateShareViewer(shared: SharedSession): string {
|
|
14
|
-
const messagesHtml = shared.messages
|
|
15
|
-
.filter(m => m.role === 'user' || m.role === 'assistant')
|
|
16
|
-
.map(m => {
|
|
17
|
-
const isUser = m.role === 'user';
|
|
18
|
-
const bgColor = isUser ? '#3b82f6' : '#1e293b';
|
|
19
|
-
const align = isUser ? 'flex-end' : 'flex-start';
|
|
20
|
-
const content =
|
|
21
|
-
typeof m.content === 'string'
|
|
22
|
-
? escapeHtml(m.content)
|
|
23
|
-
: escapeHtml(JSON.stringify(m.content));
|
|
24
|
-
|
|
25
|
-
return `
|
|
26
|
-
<div style="display:flex;justify-content:${align};margin:8px 0">
|
|
27
|
-
<div style="max-width:75%;padding:12px 16px;border-radius:16px;background:${bgColor};color:#e2e8f0;font-size:14px;line-height:1.6;white-space:pre-wrap;word-break:break-word">
|
|
28
|
-
${content}
|
|
29
|
-
</div>
|
|
30
|
-
</div>`;
|
|
31
|
-
})
|
|
32
|
-
.join('\n');
|
|
33
|
-
|
|
34
|
-
return `<!DOCTYPE html>
|
|
35
|
-
<html lang="en">
|
|
36
|
-
<head>
|
|
37
|
-
<meta charset="UTF-8">
|
|
38
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
39
|
-
<title>Nimbus Session: ${escapeHtml(shared.name)}</title>
|
|
40
|
-
<style>
|
|
41
|
-
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
42
|
-
body {
|
|
43
|
-
background: #0a0e1a;
|
|
44
|
-
color: #e2e8f0;
|
|
45
|
-
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
46
|
-
min-height: 100vh;
|
|
47
|
-
}
|
|
48
|
-
.header {
|
|
49
|
-
border-bottom: 1px solid rgba(255,255,255,0.1);
|
|
50
|
-
padding: 16px 24px;
|
|
51
|
-
display: flex;
|
|
52
|
-
align-items: center;
|
|
53
|
-
gap: 12px;
|
|
54
|
-
}
|
|
55
|
-
.logo { color: #22d3ee; font-weight: bold; font-size: 18px; }
|
|
56
|
-
.title { color: #94a3b8; font-size: 14px; }
|
|
57
|
-
.meta { color: #64748b; font-size: 12px; margin-left: auto; }
|
|
58
|
-
.messages { max-width: 800px; margin: 0 auto; padding: 24px; }
|
|
59
|
-
.badge {
|
|
60
|
-
display: inline-block; padding: 2px 8px; border-radius: 9999px;
|
|
61
|
-
font-size: 11px; font-weight: 500; background: rgba(34,211,238,0.1);
|
|
62
|
-
color: #22d3ee; border: 1px solid rgba(34,211,238,0.2);
|
|
63
|
-
}
|
|
64
|
-
.footer {
|
|
65
|
-
border-top: 1px solid rgba(255,255,255,0.1);
|
|
66
|
-
padding: 16px 24px; text-align: center;
|
|
67
|
-
color: #64748b; font-size: 12px;
|
|
68
|
-
}
|
|
69
|
-
</style>
|
|
70
|
-
</head>
|
|
71
|
-
<body>
|
|
72
|
-
<div class="header">
|
|
73
|
-
<span class="logo">Nimbus</span>
|
|
74
|
-
<span class="title">${escapeHtml(shared.name)}</span>
|
|
75
|
-
<span class="badge">${escapeHtml(shared.mode)}</span>
|
|
76
|
-
${shared.isLive ? '<span class="badge" style="background:rgba(16,185,129,0.1);color:#10b981;border-color:rgba(16,185,129,0.2)">LIVE</span>' : ''}
|
|
77
|
-
<span class="meta">${shared.model} • $${shared.costUSD.toFixed(4)} • ${shared.tokenCount.toLocaleString()} tokens</span>
|
|
78
|
-
</div>
|
|
79
|
-
<div class="messages">
|
|
80
|
-
${messagesHtml}
|
|
81
|
-
</div>
|
|
82
|
-
<div class="footer">
|
|
83
|
-
Shared via Nimbus • Created ${new Date(shared.createdAt).toLocaleString()} • Expires ${new Date(shared.expiresAt).toLocaleString()}
|
|
84
|
-
</div>
|
|
85
|
-
</body>
|
|
86
|
-
</html>`;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/** Escape HTML special characters. */
|
|
90
|
-
function escapeHtml(text: string): string {
|
|
91
|
-
return text
|
|
92
|
-
.replace(/&/g, '&')
|
|
93
|
-
.replace(/</g, '<')
|
|
94
|
-
.replace(/>/g, '>')
|
|
95
|
-
.replace(/"/g, '"')
|
|
96
|
-
.replace(/'/g, ''');
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// ---------------------------------------------------------------------------
|
|
100
|
-
// Gap 4: Runbook / Session Export
|
|
101
|
-
// ---------------------------------------------------------------------------
|
|
102
|
-
|
|
103
|
-
export interface RunbookMessage {
|
|
104
|
-
role: 'user' | 'assistant' | 'system';
|
|
105
|
-
content: string;
|
|
106
|
-
timestamp?: Date;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
export interface RunbookSession {
|
|
110
|
-
id?: string;
|
|
111
|
-
model?: string;
|
|
112
|
-
mode?: string;
|
|
113
|
-
costUSD?: number;
|
|
114
|
-
tokenCount?: number;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Format a chat session as a Markdown runbook for team documentation.
|
|
119
|
-
*
|
|
120
|
-
* Produces a self-contained `.md` file with:
|
|
121
|
-
* - Session metadata header (model, date, mode, cost)
|
|
122
|
-
* - Each user message as a `## User` section
|
|
123
|
-
* - Each assistant message as an `## Agent` section
|
|
124
|
-
* - Tool calls as collapsible `<details>` blocks
|
|
125
|
-
* - System messages skipped (they are implementation details)
|
|
126
|
-
*/
|
|
127
|
-
export function formatSessionAsRunbook(
|
|
128
|
-
messages: RunbookMessage[],
|
|
129
|
-
session?: RunbookSession
|
|
130
|
-
): string {
|
|
131
|
-
const date = new Date().toISOString().slice(0, 19).replace('T', ' ');
|
|
132
|
-
const lines: string[] = [
|
|
133
|
-
'# Nimbus Session Runbook',
|
|
134
|
-
'',
|
|
135
|
-
'| Field | Value |',
|
|
136
|
-
'|-------|-------|',
|
|
137
|
-
`| Date | ${date} |`,
|
|
138
|
-
`| Model | ${session?.model ?? 'default'} |`,
|
|
139
|
-
`| Mode | ${session?.mode ?? 'build'} |`,
|
|
140
|
-
`| Tokens | ${session?.tokenCount?.toLocaleString() ?? 'N/A'} |`,
|
|
141
|
-
`| Cost | $${session?.costUSD?.toFixed(4) ?? '0.0000'} |`,
|
|
142
|
-
'',
|
|
143
|
-
'---',
|
|
144
|
-
'',
|
|
145
|
-
];
|
|
146
|
-
|
|
147
|
-
for (const msg of messages) {
|
|
148
|
-
if (msg.role === 'system') continue;
|
|
149
|
-
|
|
150
|
-
const heading = msg.role === 'user' ? '## User' : '## Agent';
|
|
151
|
-
lines.push(heading);
|
|
152
|
-
lines.push('');
|
|
153
|
-
|
|
154
|
-
// Preserve code blocks; escape HTML outside them
|
|
155
|
-
const content = msg.content.trim();
|
|
156
|
-
lines.push(content);
|
|
157
|
-
lines.push('');
|
|
158
|
-
lines.push('---');
|
|
159
|
-
lines.push('');
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
return lines.join('\n');
|
|
163
|
-
}
|
package/src/snapshots/index.ts
DELETED