@ponythewhite/base-context 1.0.0 → 1.0.2
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 +37 -0
- package/NOTICE +0 -5
- package/README.md +44 -27
- package/dist/NOTICE +0 -5
- package/dist/base-context-runtime/pyproject.toml +1 -1
- package/dist/base-context-runtime/src/rlm/__init__.py +7 -5
- package/dist/base-context-runtime/test/test_subagent_registry.py +28 -1
- package/dist/base-context-runtime/uv.lock +1 -1
- package/dist/build-info.json +1 -1
- package/dist/bundle/amazon-bedrock.js +21 -0
- package/dist/bundle/{anthropic-YY4S534V.js → anthropic-UV5GZDGU.js} +5 -5
- package/dist/bundle/{azure-openai-responses-JRP6MIM3.js → azure-openai-responses-WSNPXLYC.js} +6 -6
- package/dist/bundle/{bundled-modules-P5HARVZA.js → bundled-modules-PWOGKUQQ.js} +71 -16
- package/dist/bundle/chunk-27QCJ2AZ.js +2578 -0
- package/dist/bundle/{chunk-BYVP7LWV.js → chunk-44PEHPOG.js} +1916 -4689
- package/dist/bundle/{chunk-MZHTNNVA.js → chunk-4GXPNXOJ.js} +8 -0
- package/dist/bundle/{chunk-SC5KG5R4.js → chunk-DGNX7HQ3.js} +1 -7
- package/dist/bundle/{chunk-A53O363M.js → chunk-GRJFXLBM.js} +0 -1
- package/dist/bundle/chunk-HKINIBP4.js +29 -0
- package/dist/bundle/{chunk-73DCPU3D.js → chunk-IADCPVEI.js} +1019 -3427
- package/dist/bundle/{chunk-UDSW6FNG.js → chunk-KTNETTHI.js} +1 -1
- package/dist/bundle/{chunk-U7AUVG3B.js → chunk-VSIYFWYI.js} +24 -6
- package/dist/bundle/{chunk-IW77OXFS.js → chunk-W46VZFI6.js} +0 -2099
- package/dist/bundle/{cli-main-O4X7GFGY.js → cli-main-4DS7Y3PI.js} +8 -6
- package/dist/bundle/cli.js +2 -2
- package/dist/bundle/{google-AUTVGDGZ.js → google-T32FMD4G.js} +6 -6
- package/dist/bundle/{google-vertex-Q75D7RKS.js → google-vertex-56KP6I3B.js} +3 -3
- package/dist/bundle/{main-XKOW2BV6.js → main-SV7JLVEB.js} +7 -5
- package/dist/bundle/{mistral-7ESB7QUD.js → mistral-WGBMYIVU.js} +5 -5
- package/dist/bundle/{openai-codex-responses-LV3QRPN4.js → openai-codex-responses-PIV2RQ3G.js} +6 -6
- package/dist/bundle/{openai-completions-OJECLPXJ.js → openai-completions-64C3JPR4.js} +11 -22
- package/dist/bundle/{openai-responses-FN6HZMBC.js → openai-responses-UI7RSTDV.js} +6 -6
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +108 -59
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/daemon-ps.d.ts +4 -3
- package/dist/cli/daemon-ps.d.ts.map +1 -1
- package/dist/cli/daemon-ps.js +6 -1
- package/dist/cli/daemon-ps.js.map +1 -1
- package/dist/cli/product-doctor.d.ts +0 -1
- package/dist/cli/product-doctor.d.ts.map +1 -1
- package/dist/cli/product-doctor.js +6 -3
- package/dist/cli/product-doctor.js.map +1 -1
- package/dist/config.d.ts +0 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -8
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-config.d.ts +1 -2
- package/dist/core/agent-session-config.d.ts.map +1 -1
- package/dist/core/agent-session-config.js +0 -3
- package/dist/core/agent-session-config.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +5 -4
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +5 -3
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +2 -27
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +10 -6
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +107 -107
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts +8 -35
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +33 -243
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/cron-jobs.d.ts.map +1 -1
- package/dist/core/cron-jobs.js +7 -1
- package/dist/core/cron-jobs.js.map +1 -1
- package/dist/core/inference-coordinator.d.ts +6 -1
- package/dist/core/inference-coordinator.d.ts.map +1 -1
- package/dist/core/inference-coordinator.js +18 -2
- package/dist/core/inference-coordinator.js.map +1 -1
- package/dist/core/kernel/bootstrap.d.ts.map +1 -1
- package/dist/core/kernel/bootstrap.js +2 -2
- package/dist/core/kernel/bootstrap.js.map +1 -1
- package/dist/core/kernel/repl-manager.d.ts +2 -0
- package/dist/core/kernel/repl-manager.d.ts.map +1 -1
- package/dist/core/kernel/repl-manager.js +44 -1
- package/dist/core/kernel/repl-manager.js.map +1 -1
- package/dist/core/logging.d.ts +4 -3
- package/dist/core/logging.d.ts.map +1 -1
- package/dist/core/logging.js +6 -6
- package/dist/core/logging.js.map +1 -1
- package/dist/core/mcp/mcp-manager.d.ts.map +1 -1
- package/dist/core/mcp/mcp-manager.js +3 -3
- package/dist/core/mcp/mcp-manager.js.map +1 -1
- package/dist/core/model-registry.d.ts +1 -16
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +88 -196
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +2 -19
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +36 -266
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/provider-contracts.d.ts +5 -6
- package/dist/core/provider-contracts.d.ts.map +1 -1
- package/dist/core/provider-contracts.js +25 -36
- package/dist/core/provider-contracts.js.map +1 -1
- package/dist/core/provider-display-names.d.ts.map +1 -1
- package/dist/core/provider-display-names.js +0 -2
- package/dist/core/provider-display-names.js.map +1 -1
- package/dist/core/rlm-max-subagents.d.ts +32 -0
- package/dist/core/rlm-max-subagents.d.ts.map +1 -0
- package/dist/core/rlm-max-subagents.js +50 -0
- package/dist/core/rlm-max-subagents.js.map +1 -0
- package/dist/core/rlm-runtime.d.ts +3 -3
- package/dist/core/rlm-runtime.d.ts.map +1 -1
- package/dist/core/rlm-runtime.js.map +1 -1
- package/dist/core/sdk.d.ts +4 -3
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +27 -14
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/settings-manager.d.ts +3 -16
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +12 -44
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +6 -6
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/installer.mjs +2 -3
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +39 -34
- package/dist/main.js.map +1 -1
- package/dist/modes/acp/acp-mode.d.ts.map +1 -1
- package/dist/modes/acp/acp-mode.js +1 -1
- package/dist/modes/acp/acp-mode.js.map +1 -1
- package/dist/modes/agent-connection/daemon-agent-connection.d.ts +6 -2
- package/dist/modes/agent-connection/daemon-agent-connection.d.ts.map +1 -1
- package/dist/modes/agent-connection/daemon-agent-connection.js +13 -2
- package/dist/modes/agent-connection/daemon-agent-connection.js.map +1 -1
- package/dist/modes/agent-connection/in-process-agent-connection.d.ts +2 -0
- package/dist/modes/agent-connection/in-process-agent-connection.d.ts.map +1 -1
- package/dist/modes/agent-connection/in-process-agent-connection.js +6 -0
- package/dist/modes/agent-connection/in-process-agent-connection.js.map +1 -1
- package/dist/modes/agent-connection/types.d.ts +3 -0
- package/dist/modes/agent-connection/types.d.ts.map +1 -1
- package/dist/modes/agent-connection/types.js.map +1 -1
- package/dist/modes/agents-view/agents-view-mode.d.ts.map +1 -1
- package/dist/modes/agents-view/agents-view-mode.js +2 -19
- package/dist/modes/agents-view/agents-view-mode.js.map +1 -1
- package/dist/modes/daemon/daemon-mode.d.ts +5 -0
- package/dist/modes/daemon/daemon-mode.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-mode.js +107 -12
- package/dist/modes/daemon/daemon-mode.js.map +1 -1
- package/dist/modes/daemon/daemon-protocol.d.ts +194 -165
- package/dist/modes/daemon/daemon-protocol.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-protocol.js +16 -11
- package/dist/modes/daemon/daemon-protocol.js.map +1 -1
- package/dist/modes/daemon/daemon-rlm-capacity-coordinator.d.ts +19 -0
- package/dist/modes/daemon/daemon-rlm-capacity-coordinator.d.ts.map +1 -0
- package/dist/modes/daemon/daemon-rlm-capacity-coordinator.js +74 -0
- package/dist/modes/daemon/daemon-rlm-capacity-coordinator.js.map +1 -0
- package/dist/modes/daemon/daemon-rlm-capacity.d.ts +19 -0
- package/dist/modes/daemon/daemon-rlm-capacity.d.ts.map +1 -0
- package/dist/modes/daemon/daemon-rlm-capacity.js +85 -0
- package/dist/modes/daemon/daemon-rlm-capacity.js.map +1 -0
- package/dist/modes/daemon/daemon-session-summarizer.d.ts +2 -3
- package/dist/modes/daemon/daemon-session-summarizer.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-session-summarizer.js +32 -23
- package/dist/modes/daemon/daemon-session-summarizer.js.map +1 -1
- package/dist/modes/daemon/daemon-state-root.d.ts +15 -0
- package/dist/modes/daemon/daemon-state-root.d.ts.map +1 -0
- package/dist/modes/daemon/daemon-state-root.js +40 -0
- package/dist/modes/daemon/daemon-state-root.js.map +1 -0
- package/dist/modes/daemon/daemon-supervisor-ownership.d.ts +2 -0
- package/dist/modes/daemon/daemon-supervisor-ownership.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-supervisor-ownership.js +27 -0
- package/dist/modes/daemon/daemon-supervisor-ownership.js.map +1 -1
- package/dist/modes/daemon/daemon-supervisor.d.ts +10 -1
- package/dist/modes/daemon/daemon-supervisor.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-supervisor.js +213 -20
- package/dist/modes/daemon/daemon-supervisor.js.map +1 -1
- package/dist/modes/daemon/daemon-worker-protocol.d.ts +28 -1
- package/dist/modes/daemon/daemon-worker-protocol.d.ts.map +1 -1
- package/dist/modes/daemon/daemon-worker-protocol.js +16 -2
- package/dist/modes/daemon/daemon-worker-protocol.js.map +1 -1
- package/dist/modes/daemon/saved-session-catalog.d.ts.map +1 -1
- package/dist/modes/daemon/saved-session-catalog.js +2 -0
- package/dist/modes/daemon/saved-session-catalog.js.map +1 -1
- package/dist/modes/interactive/auth-flows.d.ts +0 -6
- package/dist/modes/interactive/auth-flows.d.ts.map +1 -1
- package/dist/modes/interactive/auth-flows.js +6 -126
- package/dist/modes/interactive/auth-flows.js.map +1 -1
- package/dist/modes/interactive/components/configuration-menu.d.ts +3 -0
- package/dist/modes/interactive/components/configuration-menu.d.ts.map +1 -1
- package/dist/modes/interactive/components/configuration-menu.js +13 -2
- package/dist/modes/interactive/components/configuration-menu.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +2 -2
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +0 -1
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js +0 -1
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +0 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +3 -40
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +2 -0
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +13 -2
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +2 -11
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/feature-hints.d.ts.map +1 -1
- package/dist/modes/interactive/feature-hints.js +0 -4
- package/dist/modes/interactive/feature-hints.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +3 -12
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +81 -507
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/onboarding.d.ts +0 -3
- package/dist/modes/interactive/onboarding.d.ts.map +1 -1
- package/dist/modes/interactive/onboarding.js +0 -17
- package/dist/modes/interactive/onboarding.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +4 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +82 -42
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/node/amazon-bedrock.d.ts +2 -0
- package/dist/node/amazon-bedrock.d.ts.map +1 -0
- package/dist/node/amazon-bedrock.js +6 -0
- package/dist/node/amazon-bedrock.js.map +1 -0
- package/dist/product-identity.d.ts +0 -1
- package/dist/product-identity.d.ts.map +1 -1
- package/dist/product-identity.js +0 -1
- package/dist/product-identity.js.map +1 -1
- package/docs/development.md +1 -1
- package/docs/fork-philosophy.md +4 -8
- package/docs/installation.md +83 -62
- package/docs/providers.md +23 -25
- package/docs/quickstart.md +19 -10
- package/docs/rlm-runtime.md +13 -5
- package/docs/rpc.md +4 -4
- package/docs/sdk.md +20 -11
- package/docs/sessions.md +0 -1
- package/docs/settings.md +9 -42
- package/docs/skills.md +0 -1
- package/docs/upstream-0.9.5.md +171 -0
- package/docs/usage.md +14 -10
- package/package.json +4 -4
- package/dist/core/agent-traces.d.ts +0 -149
- package/dist/core/agent-traces.d.ts.map +0 -1
- package/dist/core/agent-traces.js +0 -904
- package/dist/core/agent-traces.js.map +0 -1
- package/dist/core/prime-inference-auth.d.ts +0 -70
- package/dist/core/prime-inference-auth.d.ts.map +0 -1
- package/dist/core/prime-inference-auth.js +0 -352
- package/dist/core/prime-inference-auth.js.map +0 -1
- package/dist/core/prime-inference-model-selection.d.ts +0 -16
- package/dist/core/prime-inference-model-selection.d.ts.map +0 -1
- package/dist/core/prime-inference-model-selection.js +0 -16
- package/dist/core/prime-inference-model-selection.js.map +0 -1
- package/dist/core/prime-inference-models.d.ts +0 -6
- package/dist/core/prime-inference-models.d.ts.map +0 -1
- package/dist/core/prime-inference-models.js +0 -62
- package/dist/core/prime-inference-models.js.map +0 -1
- package/dist/core/telemetry.d.ts +0 -95
- package/dist/core/telemetry.d.ts.map +0 -1
- package/dist/core/telemetry.js +0 -637
- package/dist/core/telemetry.js.map +0 -1
- package/dist/modes/interactive/components/prime-onboarding-splash.d.ts +0 -39
- package/dist/modes/interactive/components/prime-onboarding-splash.d.ts.map +0 -1
- package/dist/modes/interactive/components/prime-onboarding-splash.js +0 -286
- package/dist/modes/interactive/components/prime-onboarding-splash.js.map +0 -1
- package/dist/modes/interactive/components/prime-team-selector.d.ts +0 -30
- package/dist/modes/interactive/components/prime-team-selector.d.ts.map +0 -1
- package/dist/modes/interactive/components/prime-team-selector.js +0 -166
- package/dist/modes/interactive/components/prime-team-selector.js.map +0 -1
- package/dist/skills/prime-intellect/SKILL.md +0 -87
- package/dist/skills/prime-intellect/references/compute.md +0 -45
- package/dist/skills/prime-intellect/references/environments.md +0 -73
- package/dist/skills/prime-intellect/references/inference.md +0 -47
- package/dist/skills/prime-intellect/references/sandboxes.md +0 -75
- package/skills/prime-intellect/SKILL.md +0 -87
- package/skills/prime-intellect/references/compute.md +0 -45
- package/skills/prime-intellect/references/environments.md +0 -73
- package/skills/prime-intellect/references/inference.md +0 -47
- package/skills/prime-intellect/references/sandboxes.md +0 -75
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/core/telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACpG,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAK7D,OAAO,EAAE,yBAAyB,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AAEhG,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAC9C,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAClC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B,MAAM,yBAAyB,GAAG,MAAM,CAAC;AACzC,MAAM,0BAA0B,GAAG,KAAK,CAAC;AA8HzC,MAAM,kBAAkB,GAAgB;IACvC,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,CAAC;IACT,SAAS,EAAE,CAAC;IACZ,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,CAAC;IACd,IAAI,EAAE;QACL,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;QACb,KAAK,EAAE,CAAC;KACR;IACD,cAAc,EAAE,CAAC;CACjB,CAAC;AAEF,SAAS,cAAc,GAAgB;IACtC,OAAO,eAAe,CAAC,kBAAkB,CAAC,CAAC;AAAA,CAC3C;AAED,SAAS,QAAQ,CAAC,MAAmB,EAAE,KAAY,EAAQ;IAC1D,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC;IAC5B,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;IAC9B,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC;IACpC,MAAM,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC;IACtC,MAAM,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,CAAC;IACxC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;IACtC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;IACxC,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;IAC9C,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;IAChD,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;IACtC,MAAM,CAAC,cAAc,EAAE,CAAC;AAAA,CACxB;AAED,SAAS,UAAU,CAAC,MAAmB,EAAE,KAAkB,EAAQ;IAClE,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC;IAC5B,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;IAC9B,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC;IACpC,MAAM,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC;IACtC,MAAM,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,CAAC;IACxC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;IACtC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;IACxC,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;IAC9C,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;IAChD,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;IACtC,MAAM,CAAC,cAAc,IAAI,KAAK,CAAC,cAAc,CAAC;AAAA,CAC9C;AAED,SAAS,oBAAoB,CAAC,KAAyB,EAAuB;IAC7E,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC;IACb,CAAC;IACD,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACtD,OAAO,KAAK,CAAC;IACd,CAAC;IACD,OAAO,SAAS,CAAC;AAAA,CACjB;AAED,MAAM,UAAU,kBAAkB,CAAC,eAAgC,EAAW;IAC7E,IAAI,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,KAAK,IAAI,EAAE,CAAC;QACrE,OAAO,KAAK,CAAC;IACd,CAAC;IACD,IAAI,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE,CAAC;QAC7D,OAAO,KAAK,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAC1E,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAC;IACjB,CAAC;IACD,OAAO,eAAe,CAAC,mBAAmB,EAAE,CAAC;AAAA,CAC7C;AAED,SAAS,gBAAgB,CAAC,KAAc,EAAmB;IAC1D,OAAO,CACN,OAAO,KAAK,KAAK,QAAQ;QACzB,4EAA4E,CAAC,IAAI,CAAC,KAAK,CAAC,CACxF,CAAC;AAAA,CACF;AAED,SAAS,kBAAkB,CAAC,IAAY,EAAsB;IAC7D,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAA4B,CAAC;QACjF,OAAO,MAAM,CAAC,OAAO,KAAK,uBAAuB,IAAI,gBAAgB,CAAC,MAAM,CAAC,cAAc,CAAC;YAC3F,CAAC,CAAC,MAAM,CAAC,cAAc;YACvB,CAAC,CAAC,SAAS,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AAAA,CACD;AAED,SAAS,6BAA6B,CAAC,IAAY,EAAE,KAAqB,EAAQ;IACjF,MAAM,aAAa,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,IAAI,UAAU,EAAE,MAAM,CAAC;IACnE,IAAI,CAAC;QACJ,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;YAC5D,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,KAAK;SACX,CAAC,CAAC;QACH,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IACjC,CAAC;YAAS,CAAC;QACV,IAAI,CAAC;YACJ,UAAU,CAAC,aAAa,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACR,gEAAgE;QACjE,CAAC;IACF,CAAC;AAAA,CACD;AAED,MAAM,UAAU,kCAAkC,CAAC,QAAgB,EAAE,QAAQ,GAAiB,UAAU,EAAU;IACjH,MAAM,IAAI,GAAG,sBAAsB,CAAC,IAAI,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAC1E,IAAI,mBAAmB,GAAG,KAAK,CAAC;IAChC,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACd,OAAO,QAAQ,CAAC;QACjB,CAAC;QACD,mBAAmB,GAAG,IAAI,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,GACT,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK;YAC7D,CAAC,CAAC,MAAM,CAAE,KAA4B,CAAC,IAAI,CAAC;YAC5C,CAAC,CAAC,SAAS,CAAC;QACd,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvB,MAAM,KAAK,CAAC;QACb,CAAC;IACF,CAAC;IAED,MAAM,cAAc,GAAG,QAAQ,EAAE,CAAC;IAClC,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IACjF,CAAC;IACD,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,KAAK,GAAmB;QAC7B,OAAO,EAAE,uBAAuB;QAChC,cAAc;KACd,CAAC;IACF,IAAI,CAAC;QACJ,IAAI,mBAAmB,EAAE,CAAC;YACzB,6BAA6B,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACP,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;gBACnD,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,KAAK;aACX,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,cAAc,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,GACT,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK;YAC7D,CAAC,CAAC,MAAM,CAAE,KAA4B,CAAC,IAAI,CAAC;YAC5C,CAAC,CAAC,SAAS,CAAC;QACd,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvB,MAAM,KAAK,CAAC;QACb,CAAC;QACD,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC;IACnD,CAAC;AAAA,CACD;AAED,MAAM,OAAO,eAAe;IAeE,OAAO;IAdnB,QAAQ,CAAqB;IAC7B,MAAM,CAAqB;IAC3B,SAAS,CAAe;IACxB,GAAG,CAAe;IAClB,QAAQ,CAAe;IACvB,SAAS,CAAS;IAClB,eAAe,CAAS;IACxB,gBAAgB,CAAS;IAClC,cAAc,CAAU;IACxB,KAAK,GAAqB,EAAE,CAAC;IAC7B,UAAU,CAAiC;IAC3C,aAAa,CAAiB;IAC9B,QAAQ,GAAG,KAAK,CAAC;IAEzB,YAA6B,OAA+B,EAAE;uBAAjC,OAAO;QACnC,IAAI,CAAC,QAAQ,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;QACvG,IAAI,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;QAClG,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QAC/C,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;QACxC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;QACnC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,UAAU,CAAC;QAC/C,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC;QACzD,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,yBAAyB,CAAC;QAC5E,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,0BAA0B,CAAC;IAAA,CAC/E;IAED,OAAO,CAAC,IAAwB,EAAE,UAA+B,EAAQ;QACxE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,OAAO;QACR,CAAC;QACD,IAAI,CAAC;YACJ,IAAI,CAAC,cAAc,KAAK,kCAAkC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YACjG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBACf,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE;gBACnB,IAAI;gBACJ,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE;gBAC7C,UAAU;aACV,CAAC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACR,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YAChB,OAAO;QACR,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACzC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO;QACR,CAAC;QACD,IAAI,CAAC,aAAa,EAAE,CAAC;IAAA,CACrB;IAEO,aAAa,GAAS;QAC7B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO;QACR,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;YAClC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;YAC5B,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;QAAA,CAClB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACzB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC;IAAA,CAC1B;IAED,KAAK,CAAC,KAAK,GAAkB;QAC5B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC7B,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,aAAa,CAAC;YACzB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACpB,CAAC;YACD,OAAO;QACR,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACrD,OAAO;QACR,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAChC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC;YACJ,MAAM,KAAK,CAAC;QACb,CAAC;gBAAS,CAAC;YACV,IAAI,IAAI,CAAC,aAAa,KAAK,KAAK,EAAE,CAAC;gBAClC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;YAChC,CAAC;QACF,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;IAAA,CACD;IAEO,KAAK,CAAC,UAAU,GAAkB;QACzC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACrD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACpD,MAAM,KAAK,GAAmB;gBAC7B,eAAe,EAAE,IAAI,CAAC,cAAc;gBACpC,MAAM;aACN,CAAC;YACF,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;IAAA,CACD;IAEO,KAAK,CAAC,IAAI,CAAC,KAAqB,EAAiB;QACxD,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAC3C,IAAI,CAAC;YACJ,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE;gBACnC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACR,cAAc,EAAE,kBAAkB;oBAClC,YAAY,EAAE,gBAAgB,OAAO,EAAE;oBACvC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;iBACtC;gBACD,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;gBAC3B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC;aAClD,CAAC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACR,oEAAoE;QACrE,CAAC;IAAA,CACD;CACD;AAED,SAAS,aAAa,CAAC,KAAa,EAAU;IAC7C,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG;QAClB,QAAQ;QACR,KAAK;QACL,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,QAAQ;QACR,KAAK;QACL,MAAM;QACN,MAAM;QACN,UAAU;QACV,OAAO;QACP,SAAS;KACT,CAAC;IACF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC;AAAA,CAChF;AAED,MAAM,UAAU,yBAAyB,CAAC,QAA4B,EAAU;IAC/E,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC1C,MAAM,UAAU,GAAG;QAClB,WAAW;QACX,QAAQ;QACR,QAAQ;QACR,OAAO;QACP,YAAY;QACZ,SAAS;QACT,QAAQ;QACR,SAAS;QACT,MAAM;QACN,KAAK;KACL,CAAC;IACF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC;AAAA,CAChF;AAED,MAAM,UAAU,qBAAqB,CACpC,MAA4B,EAC5B,oBAA6C,EACrB;IACxB,QAAQ,MAAM,EAAE,CAAC;QAChB,KAAK,QAAQ;YACZ,OAAO,oBAAoB,IAAI,QAAQ,CAAC;QACzC,KAAK,SAAS;YACb,OAAO,iBAAiB,CAAC;QAC1B,KAAK,aAAa;YACjB,OAAO,aAAa,CAAC;QACtB,KAAK,WAAW;YACf,OAAO,WAAW,CAAC;QACpB,KAAK,iBAAiB,CAAC;QACvB,KAAK,qBAAqB;YACzB,OAAO,aAAa,CAAC;QACtB,KAAK,UAAU;YACd,OAAO,UAAU,CAAC;QACnB,KAAK,OAAO;YACX,OAAO,OAAO,CAAC;QAChB;YACC,OAAO,MAAM,CAAC;IAChB,CAAC;AAAA,CACD;AAED,SAAS,cAAc,CAAC,aAAqC,EAAuB;IACnF,OAAO;QACN,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,QAAQ,EAAE;QACrB,YAAY,EAAE,IAAI,EAAE;QACpB,cAAc,EAAE,mBAAmB,EAAE;QACrC,cAAc,EAAE,aAAa;KAC7B,CAAC;AAAA,CACF;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,OAA0C,EAAiB;IAC3G,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;QAClD,OAAO;IACR,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,UAAU,CAAC;IAChD,MAAM,IAAI,GACT,OAAO,CAAC,IAAI;QACZ,IAAI,eAAe,CAAC;YACnB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,GAAG;YACH,QAAQ;SACR,CAAC,CAAC;IACJ,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE;QACpC,GAAG,cAAc,CAAC,aAAa,CAAC;QAChC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC;QAC5C,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,aAAa,EAAE,qBAAqB,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,oBAAoB,CAAC;QACtF,iBAAiB,EAAE,yBAAyB,CAAC,OAAO,CAAC,QAAQ,CAAC;KAC9D,CAAC,CAAC;IACH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;AAAA,CACnB;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAAuC,EAAiB;IACrG,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;QACrG,OAAO;IACR,CAAC;IACD,MAAM,WAAW,GAAG,8BAA8B,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAExE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,UAAU,CAAC;IAChD,MAAM,IAAI,GACT,OAAO,CAAC,IAAI;QACZ,IAAI,eAAe,CAAC;YACnB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,GAAG;YACH,QAAQ;SACR,CAAC,CAAC;IACJ,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE;QAClC,GAAG,cAAc,CAAC,aAAa,CAAC;QAChC,YAAY,EAAE,WAAW;KACzB,CAAC,CAAC;IACH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;AAAA,CACnB;AAED,SAAS,aAAa,CAAC,OAAqC,EAAiB;IAC5E,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,KAAK,OAAO,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC;IACb,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACxD,IAAI,oEAAoE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACtF,OAAO,gBAAgB,CAAC;IACzB,CAAC;IACD,IAAI,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7C,OAAO,YAAY,CAAC;IACrB,CAAC;IACD,IAAI,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,+CAA+C,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACjE,OAAO,eAAe,CAAC;IACxB,CAAC;IACD,IAAI,iCAAiC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACnD,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,gCAAgC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO,sBAAsB,CAAC;IAC/B,CAAC;IACD,OAAO,OAAO,CAAC;AAAA,CACf;AAED,SAAS,UAAU,CAAC,OAAqC,EAAmC;IAC3F,IAAI,OAAO,EAAE,UAAU,KAAK,SAAS,EAAE,CAAC;QACvC,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,KAAK,OAAO,EAAE,CAAC;QAChD,OAAO,OAAO,CAAC;IAChB,CAAC;IACD,OAAO,SAAS,CAAC;AAAA,CACjB;AAED,SAAS,gBAAgB,CAAC,KAAwB,EAAgC;IACjF,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACxE,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC;AAAA,CACrB;AAED,SAAS,eAAe,CAAC,GAAiB,EAAa;IACtD,OAAO;QACN,SAAS,EAAE,GAAG,EAAE;QAChB,UAAU,EAAE,KAAK;QACjB,cAAc,EAAE,CAAC;QACjB,iBAAiB,EAAE,CAAC;QACpB,SAAS,EAAE,CAAC;QACZ,aAAa,EAAE,CAAC;QAChB,cAAc,EAAE,CAAC;QACjB,eAAe,EAAE,CAAC;QAClB,UAAU,EAAE,CAAC;QACb,KAAK,EAAE,cAAc,EAAE;KACvB,CAAC;AAAA,CACF;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAqB,EAAE,OAAqC,EAAQ;IACzG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;QAClD,OAAO;IACR,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,UAAU,CAAC;IAChD,MAAM,IAAI,GACT,OAAO,CAAC,IAAI;QACZ,IAAI,eAAe,CAAC;YACnB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,GAAG;YACH,QAAQ;SACR,CAAC,CAAC;IACJ,MAAM,SAAS,GAAG,QAAQ,EAAE,CAAC;IAC7B,MAAM,aAAa,GAAkB;QACpC,SAAS,EAAE,GAAG,EAAE;QAChB,QAAQ,EAAE,CAAC;QACX,kBAAkB,EAAE,CAAC;QACrB,cAAc,EAAE,CAAC;QACjB,eAAe,EAAE,CAAC;QAClB,WAAW,EAAE,CAAC;QACd,aAAa,EAAE,CAAC;QAChB,eAAe,EAAE,CAAC;QAClB,KAAK,EAAE,cAAc,EAAE;KACvB,CAAC;IACF,IAAI,SAAgC,CAAC;IACrC,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAE7B,MAAM,gBAAgB,GAAG,GAAwB,EAAE,CAAC,CAAC;QACpD,GAAG,cAAc,CAAC,OAAO,CAAC,aAAa,IAAI,SAAS,CAAC;QACrD,UAAU,EAAE,SAAS;KACrB,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,GAAS,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,SAAS,CAAC;QACtB,IAAI,CAAC,GAAG,EAAE,CAAC;YACV,OAAO;QACR,CAAC;QACD,SAAS,GAAG,SAAS,CAAC;QACtB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC9C,aAAa,CAAC,QAAQ,EAAE,CAAC;QACzB,aAAa,CAAC,aAAa,IAAI,GAAG,CAAC,aAAa,CAAC;QACjD,aAAa,CAAC,eAAe,IAAI,GAAG,CAAC,eAAe,CAAC;QACrD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC3B,aAAa,CAAC,kBAAkB,EAAE,CAAC;QACpC,CAAC;aAAM,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAClC,aAAa,CAAC,eAAe,EAAE,CAAC;QACjC,CAAC;aAAM,CAAC;YACP,aAAa,CAAC,cAAc,EAAE,CAAC;QAChC,CAAC;QACD,UAAU,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC;QACxC,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE;YACnC,GAAG,gBAAgB,EAAE;YACrB,OAAO;YACP,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC;YAC/C,eAAe,EAAE,GAAG,CAAC,aAAa,IAAI,IAAI;YAC1C,oBAAoB,EAAE,GAAG,CAAC,iBAAiB,IAAI,IAAI;YACnD,gBAAgB,EAAE,GAAG,CAAC,cAAc;YACpC,oBAAoB,EAAE,GAAG,CAAC,iBAAiB;YAC3C,gBAAgB,EAAE,GAAG,CAAC,KAAK,CAAC,cAAc;YAC1C,UAAU,EAAE,GAAG,CAAC,SAAS;YACzB,eAAe,EAAE,GAAG,CAAC,aAAa;YAClC,gBAAgB,EAAE,GAAG,CAAC,cAAc;YACpC,YAAY,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK;YAC7B,aAAa,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM;YAC/B,iBAAiB,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS;YACtC,kBAAkB,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU;YACxC,YAAY,EAAE,GAAG,CAAC,KAAK,CAAC,WAAW;YACnC,gBAAgB,EAAE,GAAG,CAAC,eAAe;YACrC,WAAW,EAAE,GAAG,CAAC,UAAU;YAC3B,iBAAiB,EAAE,yBAAyB,CAAC,aAAa,EAAE,QAAQ,CAAC;YACrE,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;YAC9E,cAAc,EAAE,aAAa,CAAC,aAAa,CAAC;SAC5C,CAAC,CAAC;IAAA,CACH,CAAC;IAEF,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAElD,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QAChD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,uBAAuB;gBAC3B,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,KAAK,MAAM,CAAC;gBACzD,IAAI,CAAC,gBAAgB,IAAI,SAAS,EAAE,UAAU,EAAE,CAAC;oBAChD,WAAW,EAAE,CAAC;gBACf,CAAC;gBACD,MAAM;YACP,KAAK,aAAa;gBACjB,IAAI,SAAS,EAAE,UAAU,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBAChD,WAAW,EAAE,CAAC;gBACf,CAAC;gBACD,SAAS,KAAK,eAAe,CAAC,GAAG,CAAC,CAAC;gBACnC,SAAS,CAAC,UAAU,GAAG,KAAK,CAAC;gBAC7B,MAAM;YACP,KAAK,eAAe;gBACnB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBACnC,aAAa,CAAC,WAAW,EAAE,CAAC;gBAC7B,CAAC;gBACD,MAAM;YACP,KAAK,YAAY;gBAChB,IAAI,SAAS,EAAE,CAAC;oBACf,SAAS,CAAC,oBAAoB,GAAG,GAAG,EAAE,CAAC;oBACvC,SAAS,CAAC,kBAAkB,KAAK,SAAS,CAAC,oBAAoB,CAAC;oBAChE,SAAS,CAAC,SAAS,EAAE,CAAC;gBACvB,CAAC;gBACD,MAAM;YACP,KAAK,gBAAgB;gBACpB,IAAI,CAAC,SAAS,EAAE,CAAC;oBAChB,MAAM;gBACP,CAAC;gBACD,IAAI,SAAS,CAAC,iBAAiB,KAAK,SAAS,IAAI,SAAS,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;oBAC7F,SAAS,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC,kBAAkB,CAAC,CAAC;gBACjF,CAAC;gBACD,IACC,SAAS,CAAC,aAAa,KAAK,SAAS;oBACrC,SAAS,CAAC,kBAAkB,KAAK,SAAS;oBAC1C,KAAK,CAAC,qBAAqB,CAAC,IAAI,KAAK,YAAY;oBACjD,KAAK,CAAC,qBAAqB,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAC3C,CAAC;oBACF,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC,kBAAkB,CAAC,CAAC;gBAC7E,CAAC;gBACD,MAAM;YACP,KAAK,aAAa,EAAE,CAAC;gBACpB,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBACxC,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC;oBAC5B,MAAM;gBACP,CAAC;gBACD,SAAS,CAAC,aAAa,GAAG,OAAO,CAAC;gBAClC,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;gBACzC,IAAI,SAAS,CAAC,oBAAoB,KAAK,SAAS,EAAE,CAAC;oBAClD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC,oBAAoB,CAAC,CAAC;oBACpE,SAAS,CAAC,cAAc,IAAI,OAAO,CAAC;oBACpC,SAAS,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;oBAC7E,SAAS,CAAC,oBAAoB,GAAG,SAAS,CAAC;gBAC5C,CAAC;gBACD,MAAM;YACP,CAAC;YACD,KAAK,oBAAoB;gBACxB,IAAI,SAAS,EAAE,CAAC;oBACf,SAAS,CAAC,aAAa,EAAE,CAAC;oBAC1B,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;wBACnB,SAAS,CAAC,cAAc,EAAE,CAAC;oBAC5B,CAAC;gBACF,CAAC;gBACD,MAAM;YACP,KAAK,gBAAgB;gBACpB,IAAI,SAAS,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;oBACjD,SAAS,CAAC,eAAe,EAAE,CAAC;gBAC7B,CAAC;gBACD,MAAM;YACP,KAAK,kBAAkB;gBACtB,IAAI,SAAS,EAAE,CAAC;oBACf,SAAS,CAAC,UAAU,EAAE,CAAC;gBACxB,CAAC;gBACD,MAAM;YACP,KAAK,WAAW;gBACf,IAAI,CAAC,SAAS,EAAE,CAAC;oBAChB,MAAM;gBACP,CAAC;gBACD,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC;gBAC5B,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACvB,WAAW,EAAE,CAAC;gBACf,CAAC;gBACD,MAAM;QACR,CAAC;IAAA,CACD,CAAC,CAAC;IAEH,OAAO,CAAC,uBAAuB,CAAC,KAAK,IAAI,EAAE,CAAC;QAC3C,WAAW,EAAE,CAAC;QACd,WAAW,EAAE,CAAC;QACd,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE;YACnC,GAAG,gBAAgB,EAAE;YACrB,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,aAAa,CAAC,SAAS,CAAC;YACzD,YAAY,EAAE,aAAa,CAAC,WAAW;YACvC,SAAS,EAAE,aAAa,CAAC,QAAQ;YACjC,oBAAoB,EAAE,aAAa,CAAC,kBAAkB;YACtD,gBAAgB,EAAE,aAAa,CAAC,cAAc;YAC9C,iBAAiB,EAAE,aAAa,CAAC,eAAe;YAChD,eAAe,EAAE,aAAa,CAAC,aAAa;YAC5C,gBAAgB,EAAE,aAAa,CAAC,eAAe;YAC/C,gBAAgB,EAAE,aAAa,CAAC,KAAK,CAAC,cAAc;YACpD,YAAY,EAAE,aAAa,CAAC,KAAK,CAAC,KAAK;YACvC,aAAa,EAAE,aAAa,CAAC,KAAK,CAAC,MAAM;YACzC,iBAAiB,EAAE,aAAa,CAAC,KAAK,CAAC,SAAS;YAChD,kBAAkB,EAAE,aAAa,CAAC,KAAK,CAAC,UAAU;YAClD,YAAY,EAAE,aAAa,CAAC,KAAK,CAAC,WAAW;SAC7C,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IAAA,CACnB,CAAC,CAAC;AAAA,CACH","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { lstatSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport { arch, platform } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { AssistantMessage, Usage } from \"@ponythewhite/base-context-ai\";\nimport { detectInstallMethod, VERSION } from \"../config.js\";\nimport { assertProductStatePath } from \"../runtime-paths.js\";\nimport type { AgentSession, AgentSessionEvent } from \"./agent-session.js\";\nimport type { AgentExecutionMode } from \"./agent-session-config.js\";\nimport type { AuthCredential, AuthStatus } from \"./auth-storage.js\";\nimport type { SettingsManager } from \"./settings-manager.js\";\nimport { isBuiltinSlashCommandName, resolveBuiltinSlashCommandName } from \"./slash-commands.js\";\n\nconst TELEMETRY_STATE_FILE = \"telemetry.json\";\nconst TELEMETRY_STATE_VERSION = 1;\nconst DEFAULT_BATCH_SIZE = 10;\nconst DEFAULT_FLUSH_INTERVAL_MS = 10_000;\nconst DEFAULT_REQUEST_TIMEOUT_MS = 1_500;\n\ntype TelemetryPrimitive = string | number | boolean | null;\ntype TelemetryProperties = Record<string, TelemetryPrimitive>;\n\nexport type TelemetryEventName =\n\t| \"agent started\"\n\t| \"onboarding completed\"\n\t| \"agent command used\"\n\t| \"agent run completed\"\n\t| \"agent session ended\";\n\nexport type TelemetryExecutionMode = AgentExecutionMode | \"unknown\";\nexport type TelemetryOnboardingOutcome = \"success\" | \"error\" | \"aborted\";\nexport type TelemetryAuthCategory =\n\t| \"oauth\"\n\t| \"api_key\"\n\t| \"runtime_api_key\"\n\t| \"environment\"\n\t| \"prime_cli\"\n\t| \"models_json\"\n\t| \"fallback\"\n\t| \"stale\"\n\t| \"stored\"\n\t| \"none\";\n\nexport interface TelemetryEvent {\n\tid: string;\n\tname: TelemetryEventName;\n\ttimestamp: string;\n\tproperties: TelemetryProperties;\n}\n\nexport interface TelemetryBatch {\n\tinstallation_id: string;\n\tevents: TelemetryEvent[];\n}\n\nexport interface TelemetrySink {\n\tcapture(name: TelemetryEventName, properties: TelemetryProperties): void;\n\tflush(): Promise<void>;\n}\n\ninterface TelemetryState {\n\tversion: number;\n\tinstallationId: string;\n}\n\ninterface TelemetryClientOptions {\n\tagentDir: string;\n\tendpoint?: string;\n\t/** Dedicated analytics credential; provider inference keys are never reused. */\n\tapiKey?: string;\n\tfetch?: typeof fetch;\n\tnow?: () => number;\n\trandomId?: () => string;\n\tbatchSize?: number;\n\tflushIntervalMs?: number;\n\trequestTimeoutMs?: number;\n}\n\ninterface InstallAgentTelemetryOptions {\n\tagentDir: string;\n\tsettingsManager: SettingsManager;\n\texecutionMode?: AgentExecutionMode;\n\tsink?: TelemetrySink;\n\tnow?: () => number;\n\trandomId?: () => string;\n}\n\nexport interface CaptureOnboardingCompletedOptions {\n\tagentDir: string;\n\tsettingsManager: SettingsManager;\n\tdurationMs: number;\n\toutcome: TelemetryOnboardingOutcome;\n\tprovider?: string;\n\tauthSource?: AuthStatus[\"source\"];\n\tstoredCredentialType?: AuthCredential[\"type\"];\n\tsink?: TelemetrySink;\n\tnow?: () => number;\n\trandomId?: () => string;\n}\n\nexport interface CaptureAgentCommandUsedOptions {\n\tagentDir: string;\n\tsettingsManager: SettingsManager;\n\tcommandName: string;\n\tsink?: TelemetrySink;\n\tnow?: () => number;\n\trandomId?: () => string;\n}\n\ninterface UsageTotals extends Usage {\n\tmodelCallCount: number;\n}\n\ninterface ActiveRun {\n\tstartedAt: number;\n\tagentEnded: boolean;\n\tfirstTurnStartedAt?: number;\n\tfirstModelEventMs?: number;\n\tvisibleTtftMs?: number;\n\tcurrentTurnStartedAt?: number;\n\tmodelLatencyMs: number;\n\tmaxModelLatencyMs: number;\n\tturnCount: number;\n\ttoolCallCount: number;\n\ttoolErrorCount: number;\n\tcompactionCount: number;\n\tretryCount: number;\n\tusage: UsageTotals;\n\tlastAssistant?: AssistantMessage;\n}\n\ninterface SessionTotals {\n\tstartedAt: number;\n\trunCount: number;\n\tsuccessfulRunCount: number;\n\tfailedRunCount: number;\n\tabortedRunCount: number;\n\tpromptCount: number;\n\ttoolCallCount: number;\n\tcompactionCount: number;\n\tusage: UsageTotals;\n}\n\nconst EMPTY_USAGE_TOTALS: UsageTotals = {\n\tinput: 0,\n\toutput: 0,\n\tcacheRead: 0,\n\tcacheWrite: 0,\n\ttotalTokens: 0,\n\tcost: {\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotal: 0,\n\t},\n\tmodelCallCount: 0,\n};\n\nfunction newUsageTotals(): UsageTotals {\n\treturn structuredClone(EMPTY_USAGE_TOTALS);\n}\n\nfunction addUsage(target: UsageTotals, usage: Usage): void {\n\ttarget.input += usage.input;\n\ttarget.output += usage.output;\n\ttarget.cacheRead += usage.cacheRead;\n\ttarget.cacheWrite += usage.cacheWrite;\n\ttarget.totalTokens += usage.totalTokens;\n\ttarget.cost.input += usage.cost.input;\n\ttarget.cost.output += usage.cost.output;\n\ttarget.cost.cacheRead += usage.cost.cacheRead;\n\ttarget.cost.cacheWrite += usage.cost.cacheWrite;\n\ttarget.cost.total += usage.cost.total;\n\ttarget.modelCallCount++;\n}\n\nfunction mergeUsage(target: UsageTotals, usage: UsageTotals): void {\n\ttarget.input += usage.input;\n\ttarget.output += usage.output;\n\ttarget.cacheRead += usage.cacheRead;\n\ttarget.cacheWrite += usage.cacheWrite;\n\ttarget.totalTokens += usage.totalTokens;\n\ttarget.cost.input += usage.cost.input;\n\ttarget.cost.output += usage.cost.output;\n\ttarget.cost.cacheRead += usage.cost.cacheRead;\n\ttarget.cost.cacheWrite += usage.cost.cacheWrite;\n\ttarget.cost.total += usage.cost.total;\n\ttarget.modelCallCount += usage.modelCallCount;\n}\n\nfunction parseBooleanOverride(value: string | undefined): boolean | undefined {\n\tif (value === undefined) {\n\t\treturn undefined;\n\t}\n\tconst normalized = value.trim().toLowerCase();\n\tif ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) {\n\t\treturn true;\n\t}\n\tif ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) {\n\t\treturn false;\n\t}\n\treturn undefined;\n}\n\nexport function isTelemetryEnabled(settingsManager: SettingsManager): boolean {\n\tif (parseBooleanOverride(process.env.BASE_CONTEXT_OFFLINE) === true) {\n\t\treturn false;\n\t}\n\tif (parseBooleanOverride(process.env.DO_NOT_TRACK) === true) {\n\t\treturn false;\n\t}\n\tconst override = parseBooleanOverride(process.env.BASE_CONTEXT_TELEMETRY);\n\tif (override !== undefined) {\n\t\treturn override;\n\t}\n\treturn settingsManager.getTelemetryEnabled();\n}\n\nfunction isInstallationId(value: unknown): value is string {\n\treturn (\n\t\ttypeof value === \"string\" &&\n\t\t/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value)\n\t);\n}\n\nfunction readInstallationId(path: string): string | undefined {\n\ttry {\n\t\tconst parsed = JSON.parse(readFileSync(path, \"utf8\")) as Partial<TelemetryState>;\n\t\treturn parsed.version === TELEMETRY_STATE_VERSION && isInstallationId(parsed.installationId)\n\t\t\t? parsed.installationId\n\t\t\t: undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction writeTelemetryStateAtomically(path: string, state: TelemetryState): void {\n\tconst temporaryPath = `${path}.${process.pid}.${randomUUID()}.tmp`;\n\ttry {\n\t\twriteFileSync(temporaryPath, JSON.stringify(state, null, 2), {\n\t\t\tencoding: \"utf8\",\n\t\t\tflag: \"wx\",\n\t\t\tmode: 0o600,\n\t\t});\n\t\trenameSync(temporaryPath, path);\n\t} finally {\n\t\ttry {\n\t\t\tunlinkSync(temporaryPath);\n\t\t} catch {\n\t\t\t// The rename succeeded or the temporary file was never created.\n\t\t}\n\t}\n}\n\nexport function getOrCreateTelemetryInstallationId(agentDir: string, randomId: () => string = randomUUID): string {\n\tconst path = assertProductStatePath(join(agentDir, TELEMETRY_STATE_FILE));\n\tlet replaceInvalidState = false;\n\ttry {\n\t\tconst stats = lstatSync(path);\n\t\tif (!stats.isFile()) {\n\t\t\tthrow new Error(\"Telemetry state path must be a regular file\");\n\t\t}\n\t\tconst existing = readInstallationId(path);\n\t\tif (existing) {\n\t\t\treturn existing;\n\t\t}\n\t\treplaceInvalidState = true;\n\t} catch (error) {\n\t\tconst code =\n\t\t\ttypeof error === \"object\" && error !== null && \"code\" in error\n\t\t\t\t? String((error as { code?: unknown }).code)\n\t\t\t\t: undefined;\n\t\tif (code !== \"ENOENT\") {\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tconst installationId = randomId();\n\tif (!isInstallationId(installationId)) {\n\t\tthrow new Error(\"Telemetry installation ID generator returned an invalid UUID\");\n\t}\n\tmkdirSync(agentDir, { recursive: true });\n\tconst state: TelemetryState = {\n\t\tversion: TELEMETRY_STATE_VERSION,\n\t\tinstallationId,\n\t};\n\ttry {\n\t\tif (replaceInvalidState) {\n\t\t\twriteTelemetryStateAtomically(path, state);\n\t\t} else {\n\t\t\twriteFileSync(path, JSON.stringify(state, null, 2), {\n\t\t\t\tencoding: \"utf8\",\n\t\t\t\tflag: \"wx\",\n\t\t\t\tmode: 0o600,\n\t\t\t});\n\t\t}\n\t\treturn installationId;\n\t} catch (error) {\n\t\tconst code =\n\t\t\ttypeof error === \"object\" && error !== null && \"code\" in error\n\t\t\t\t? String((error as { code?: unknown }).code)\n\t\t\t\t: undefined;\n\t\tif (code !== \"EEXIST\") {\n\t\t\tthrow error;\n\t\t}\n\t\treturn readInstallationId(path) ?? installationId;\n\t}\n}\n\nexport class TelemetryClient implements TelemetrySink {\n\tprivate readonly endpoint: string | undefined;\n\tprivate readonly apiKey: string | undefined;\n\tprivate readonly fetchImpl: typeof fetch;\n\tprivate readonly now: () => number;\n\tprivate readonly randomId: () => string;\n\tprivate readonly batchSize: number;\n\tprivate readonly flushIntervalMs: number;\n\tprivate readonly requestTimeoutMs: number;\n\tprivate installationId?: string;\n\tprivate queue: TelemetryEvent[] = [];\n\tprivate flushTimer?: ReturnType<typeof setTimeout>;\n\tprivate flushInFlight?: Promise<void>;\n\tprivate disabled = false;\n\n\tconstructor(private readonly options: TelemetryClientOptions) {\n\t\tthis.endpoint = (options.endpoint ?? process.env.BASE_CONTEXT_TELEMETRY_ENDPOINT)?.trim() || undefined;\n\t\tthis.apiKey = (options.apiKey ?? process.env.BASE_CONTEXT_TELEMETRY_API_KEY)?.trim() || undefined;\n\t\tthis.disabled = !this.endpoint || !this.apiKey;\n\t\tthis.fetchImpl = options.fetch ?? fetch;\n\t\tthis.now = options.now ?? Date.now;\n\t\tthis.randomId = options.randomId ?? randomUUID;\n\t\tthis.batchSize = options.batchSize ?? DEFAULT_BATCH_SIZE;\n\t\tthis.flushIntervalMs = options.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS;\n\t\tthis.requestTimeoutMs = options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n\t}\n\n\tcapture(name: TelemetryEventName, properties: TelemetryProperties): void {\n\t\tif (this.disabled) {\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tthis.installationId ??= getOrCreateTelemetryInstallationId(this.options.agentDir, this.randomId);\n\t\t\tthis.queue.push({\n\t\t\t\tid: this.randomId(),\n\t\t\t\tname,\n\t\t\t\ttimestamp: new Date(this.now()).toISOString(),\n\t\t\t\tproperties,\n\t\t\t});\n\t\t} catch {\n\t\t\tthis.disabled = true;\n\t\t\tthis.queue = [];\n\t\t\treturn;\n\t\t}\n\t\tif (this.queue.length >= this.batchSize) {\n\t\t\tvoid this.flush();\n\t\t\treturn;\n\t\t}\n\t\tthis.scheduleFlush();\n\t}\n\n\tprivate scheduleFlush(): void {\n\t\tif (this.flushTimer) {\n\t\t\treturn;\n\t\t}\n\t\tthis.flushTimer = setTimeout(() => {\n\t\t\tthis.flushTimer = undefined;\n\t\t\tvoid this.flush();\n\t\t}, this.flushIntervalMs);\n\t\tthis.flushTimer.unref?.();\n\t}\n\n\tasync flush(): Promise<void> {\n\t\tif (this.flushTimer) {\n\t\t\tclearTimeout(this.flushTimer);\n\t\t\tthis.flushTimer = undefined;\n\t\t}\n\t\tif (this.flushInFlight) {\n\t\t\tawait this.flushInFlight;\n\t\t\tif (this.queue.length > 0) {\n\t\t\t\tawait this.flush();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (this.queue.length === 0 || !this.installationId) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst drain = this.drainQueue();\n\t\tthis.flushInFlight = drain;\n\t\ttry {\n\t\t\tawait drain;\n\t\t} finally {\n\t\t\tif (this.flushInFlight === drain) {\n\t\t\t\tthis.flushInFlight = undefined;\n\t\t\t}\n\t\t}\n\t\tif (this.queue.length > 0) {\n\t\t\tawait this.flush();\n\t\t}\n\t}\n\n\tprivate async drainQueue(): Promise<void> {\n\t\twhile (this.queue.length > 0 && this.installationId) {\n\t\t\tconst events = this.queue.splice(0, this.batchSize);\n\t\t\tconst batch: TelemetryBatch = {\n\t\t\t\tinstallation_id: this.installationId,\n\t\t\t\tevents,\n\t\t\t};\n\t\t\tawait this.send(batch);\n\t\t}\n\t}\n\n\tprivate async send(batch: TelemetryBatch): Promise<void> {\n\t\tif (!this.endpoint || !this.apiKey) return;\n\t\ttry {\n\t\t\tawait this.fetchImpl(this.endpoint, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"content-type\": \"application/json\",\n\t\t\t\t\t\"user-agent\": `base-context/${VERSION}`,\n\t\t\t\t\tauthorization: `Bearer ${this.apiKey}`,\n\t\t\t\t},\n\t\t\t\tredirect: \"error\",\n\t\t\t\tbody: JSON.stringify(batch),\n\t\t\t\tsignal: AbortSignal.timeout(this.requestTimeoutMs),\n\t\t\t});\n\t\t} catch {\n\t\t\t// Product analytics is best-effort and must never affect the agent.\n\t\t}\n\t}\n}\n\nfunction modelCategory(model: string): string {\n\tconst normalized = model.toLowerCase();\n\tconst categories = [\n\t\t\"claude\",\n\t\t\"gpt\",\n\t\t\"o1\",\n\t\t\"o3\",\n\t\t\"o4\",\n\t\t\"gemini\",\n\t\t\"glm\",\n\t\t\"kimi\",\n\t\t\"qwen\",\n\t\t\"deepseek\",\n\t\t\"llama\",\n\t\t\"mistral\",\n\t];\n\treturn categories.find((category) => normalized.includes(category)) ?? \"custom\";\n}\n\nexport function telemetryProviderCategory(provider: string | undefined): string {\n\tif (!provider) {\n\t\treturn \"unknown\";\n\t}\n\tconst normalized = provider.toLowerCase();\n\tconst categories = [\n\t\t\"anthropic\",\n\t\t\"openai\",\n\t\t\"google\",\n\t\t\"prime\",\n\t\t\"openrouter\",\n\t\t\"bedrock\",\n\t\t\"vertex\",\n\t\t\"mistral\",\n\t\t\"groq\",\n\t\t\"xai\",\n\t];\n\treturn categories.find((category) => normalized.includes(category)) ?? \"custom\";\n}\n\nexport function telemetryAuthCategory(\n\tsource: AuthStatus[\"source\"],\n\tstoredCredentialType?: AuthCredential[\"type\"],\n): TelemetryAuthCategory {\n\tswitch (source) {\n\t\tcase \"stored\":\n\t\t\treturn storedCredentialType ?? \"stored\";\n\t\tcase \"runtime\":\n\t\t\treturn \"runtime_api_key\";\n\t\tcase \"environment\":\n\t\t\treturn \"environment\";\n\t\tcase \"prime_cli\":\n\t\t\treturn \"prime_cli\";\n\t\tcase \"models_json_key\":\n\t\tcase \"models_json_command\":\n\t\t\treturn \"models_json\";\n\t\tcase \"fallback\":\n\t\t\treturn \"fallback\";\n\t\tcase \"stale\":\n\t\t\treturn \"stale\";\n\t\tdefault:\n\t\t\treturn \"none\";\n\t}\n}\n\nfunction baseProperties(executionMode: TelemetryExecutionMode): TelemetryProperties {\n\treturn {\n\t\tversion: VERSION,\n\t\tos_family: platform(),\n\t\tarchitecture: arch(),\n\t\tinstall_method: detectInstallMethod(),\n\t\texecution_mode: executionMode,\n\t};\n}\n\nexport async function captureOnboardingCompleted(options: CaptureOnboardingCompletedOptions): Promise<void> {\n\tif (!isTelemetryEnabled(options.settingsManager)) {\n\t\treturn;\n\t}\n\n\tconst now = options.now ?? Date.now;\n\tconst randomId = options.randomId ?? randomUUID;\n\tconst sink =\n\t\toptions.sink ??\n\t\tnew TelemetryClient({\n\t\t\tagentDir: options.agentDir,\n\t\t\tnow,\n\t\t\trandomId,\n\t\t});\n\tsink.capture(\"onboarding completed\", {\n\t\t...baseProperties(\"interactive\"),\n\t\tduration_ms: Math.max(0, options.durationMs),\n\t\toutcome: options.outcome,\n\t\tauth_category: telemetryAuthCategory(options.authSource, options.storedCredentialType),\n\t\tprovider_category: telemetryProviderCategory(options.provider),\n\t});\n\tawait sink.flush();\n}\n\nexport async function captureAgentCommandUsed(options: CaptureAgentCommandUsedOptions): Promise<void> {\n\tif (!isBuiltinSlashCommandName(options.commandName) || !isTelemetryEnabled(options.settingsManager)) {\n\t\treturn;\n\t}\n\tconst commandName = resolveBuiltinSlashCommandName(options.commandName);\n\n\tconst now = options.now ?? Date.now;\n\tconst randomId = options.randomId ?? randomUUID;\n\tconst sink =\n\t\toptions.sink ??\n\t\tnew TelemetryClient({\n\t\t\tagentDir: options.agentDir,\n\t\t\tnow,\n\t\t\trandomId,\n\t\t});\n\tsink.capture(\"agent command used\", {\n\t\t...baseProperties(\"interactive\"),\n\t\tcommand_name: commandName,\n\t});\n\tawait sink.flush();\n}\n\nfunction errorCategory(message: AssistantMessage | undefined): string | null {\n\tif (!message || message.stopReason !== \"error\") {\n\t\treturn null;\n\t}\n\tconst error = message.errorMessage?.toLowerCase() ?? \"\";\n\tif (/\\b401\\b|\\b403\\b|auth|api.?key|credential|unauthori[sz]ed|forbidden/.test(error)) {\n\t\treturn \"authentication\";\n\t}\n\tif (/\\b429\\b|rate.?limit|quota/.test(error)) {\n\t\treturn \"rate_limit\";\n\t}\n\tif (/timeout|timed out/.test(error)) {\n\t\treturn \"timeout\";\n\t}\n\tif (/context|token.*limit|too long|maximum.*length/.test(error)) {\n\t\treturn \"context_limit\";\n\t}\n\tif (/network|socket|connection|fetch/.test(error)) {\n\t\treturn \"network\";\n\t}\n\tif (/\\b5\\d\\d\\b|overload|unavailable/.test(error)) {\n\t\treturn \"provider_unavailable\";\n\t}\n\treturn \"other\";\n}\n\nfunction runOutcome(message: AssistantMessage | undefined): \"success\" | \"error\" | \"aborted\" {\n\tif (message?.stopReason === \"aborted\") {\n\t\treturn \"aborted\";\n\t}\n\tif (!message || message.stopReason === \"error\") {\n\t\treturn \"error\";\n\t}\n\treturn \"success\";\n}\n\nfunction assistantMessage(event: AgentSessionEvent): AssistantMessage | undefined {\n\tif (event.type !== \"message_end\" || event.message.role !== \"assistant\") {\n\t\treturn undefined;\n\t}\n\treturn event.message;\n}\n\nfunction createActiveRun(now: () => number): ActiveRun {\n\treturn {\n\t\tstartedAt: now(),\n\t\tagentEnded: false,\n\t\tmodelLatencyMs: 0,\n\t\tmaxModelLatencyMs: 0,\n\t\tturnCount: 0,\n\t\ttoolCallCount: 0,\n\t\ttoolErrorCount: 0,\n\t\tcompactionCount: 0,\n\t\tretryCount: 0,\n\t\tusage: newUsageTotals(),\n\t};\n}\n\nexport function installAgentTelemetry(session: AgentSession, options: InstallAgentTelemetryOptions): void {\n\tif (!isTelemetryEnabled(options.settingsManager)) {\n\t\treturn;\n\t}\n\n\tconst now = options.now ?? Date.now;\n\tconst randomId = options.randomId ?? randomUUID;\n\tconst sink =\n\t\toptions.sink ??\n\t\tnew TelemetryClient({\n\t\t\tagentDir: options.agentDir,\n\t\t\tnow,\n\t\t\trandomId,\n\t\t});\n\tconst sessionId = randomId();\n\tconst sessionTotals: SessionTotals = {\n\t\tstartedAt: now(),\n\t\trunCount: 0,\n\t\tsuccessfulRunCount: 0,\n\t\tfailedRunCount: 0,\n\t\tabortedRunCount: 0,\n\t\tpromptCount: 0,\n\t\ttoolCallCount: 0,\n\t\tcompactionCount: 0,\n\t\tusage: newUsageTotals(),\n\t};\n\tlet activeRun: ActiveRun | undefined;\n\tlet turnActionActive = false;\n\n\tconst commonProperties = (): TelemetryProperties => ({\n\t\t...baseProperties(options.executionMode ?? \"unknown\"),\n\t\tsession_id: sessionId,\n\t});\n\n\tconst finalizeRun = (): void => {\n\t\tconst run = activeRun;\n\t\tif (!run) {\n\t\t\treturn;\n\t\t}\n\t\tactiveRun = undefined;\n\t\tconst outcome = runOutcome(run.lastAssistant);\n\t\tsessionTotals.runCount++;\n\t\tsessionTotals.toolCallCount += run.toolCallCount;\n\t\tsessionTotals.compactionCount += run.compactionCount;\n\t\tif (outcome === \"success\") {\n\t\t\tsessionTotals.successfulRunCount++;\n\t\t} else if (outcome === \"aborted\") {\n\t\t\tsessionTotals.abortedRunCount++;\n\t\t} else {\n\t\t\tsessionTotals.failedRunCount++;\n\t\t}\n\t\tmergeUsage(sessionTotals.usage, run.usage);\n\t\tconst lastAssistant = run.lastAssistant;\n\t\tsink.capture(\"agent run completed\", {\n\t\t\t...commonProperties(),\n\t\t\toutcome,\n\t\t\tduration_ms: Math.max(0, now() - run.startedAt),\n\t\t\tvisible_ttft_ms: run.visibleTtftMs ?? null,\n\t\t\tfirst_model_event_ms: run.firstModelEventMs ?? null,\n\t\t\tmodel_latency_ms: run.modelLatencyMs,\n\t\t\tmax_model_latency_ms: run.maxModelLatencyMs,\n\t\t\tmodel_call_count: run.usage.modelCallCount,\n\t\t\tturn_count: run.turnCount,\n\t\t\ttool_call_count: run.toolCallCount,\n\t\t\ttool_error_count: run.toolErrorCount,\n\t\t\tinput_tokens: run.usage.input,\n\t\t\toutput_tokens: run.usage.output,\n\t\t\tcache_read_tokens: run.usage.cacheRead,\n\t\t\tcache_write_tokens: run.usage.cacheWrite,\n\t\t\ttotal_tokens: run.usage.totalTokens,\n\t\t\tcompaction_count: run.compactionCount,\n\t\t\tretry_count: run.retryCount,\n\t\t\tprovider_category: telemetryProviderCategory(lastAssistant?.provider),\n\t\t\tmodel_category: lastAssistant ? modelCategory(lastAssistant.model) : \"unknown\",\n\t\t\terror_category: errorCategory(lastAssistant),\n\t\t});\n\t};\n\n\tsink.capture(\"agent started\", commonProperties());\n\n\tconst unsubscribe = session.subscribe((event) => {\n\t\tswitch (event.type) {\n\t\t\tcase \"session_action_update\":\n\t\t\t\tturnActionActive = event.actions.active?.kind === \"turn\";\n\t\t\t\tif (!turnActionActive && activeRun?.agentEnded) {\n\t\t\t\t\tfinalizeRun();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"agent_start\":\n\t\t\t\tif (activeRun?.agentEnded && !turnActionActive) {\n\t\t\t\t\tfinalizeRun();\n\t\t\t\t}\n\t\t\t\tactiveRun ??= createActiveRun(now);\n\t\t\t\tactiveRun.agentEnded = false;\n\t\t\t\tbreak;\n\t\t\tcase \"message_start\":\n\t\t\t\tif (event.message.role === \"user\") {\n\t\t\t\t\tsessionTotals.promptCount++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"turn_start\":\n\t\t\t\tif (activeRun) {\n\t\t\t\t\tactiveRun.currentTurnStartedAt = now();\n\t\t\t\t\tactiveRun.firstTurnStartedAt ??= activeRun.currentTurnStartedAt;\n\t\t\t\t\tactiveRun.turnCount++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"message_update\":\n\t\t\t\tif (!activeRun) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (activeRun.firstModelEventMs === undefined && activeRun.firstTurnStartedAt !== undefined) {\n\t\t\t\t\tactiveRun.firstModelEventMs = Math.max(0, now() - activeRun.firstTurnStartedAt);\n\t\t\t\t}\n\t\t\t\tif (\n\t\t\t\t\tactiveRun.visibleTtftMs === undefined &&\n\t\t\t\t\tactiveRun.firstTurnStartedAt !== undefined &&\n\t\t\t\t\tevent.assistantMessageEvent.type === \"text_delta\" &&\n\t\t\t\t\tevent.assistantMessageEvent.delta.length > 0\n\t\t\t\t) {\n\t\t\t\t\tactiveRun.visibleTtftMs = Math.max(0, now() - activeRun.firstTurnStartedAt);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"message_end\": {\n\t\t\t\tconst message = assistantMessage(event);\n\t\t\t\tif (!activeRun || !message) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tactiveRun.lastAssistant = message;\n\t\t\t\taddUsage(activeRun.usage, message.usage);\n\t\t\t\tif (activeRun.currentTurnStartedAt !== undefined) {\n\t\t\t\t\tconst latency = Math.max(0, now() - activeRun.currentTurnStartedAt);\n\t\t\t\t\tactiveRun.modelLatencyMs += latency;\n\t\t\t\t\tactiveRun.maxModelLatencyMs = Math.max(activeRun.maxModelLatencyMs, latency);\n\t\t\t\t\tactiveRun.currentTurnStartedAt = undefined;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"tool_execution_end\":\n\t\t\t\tif (activeRun) {\n\t\t\t\t\tactiveRun.toolCallCount++;\n\t\t\t\t\tif (event.isError) {\n\t\t\t\t\t\tactiveRun.toolErrorCount++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"compaction_end\":\n\t\t\t\tif (activeRun && event.result && !event.aborted) {\n\t\t\t\t\tactiveRun.compactionCount++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"auto_retry_start\":\n\t\t\t\tif (activeRun) {\n\t\t\t\t\tactiveRun.retryCount++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"agent_end\":\n\t\t\t\tif (!activeRun) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tactiveRun.agentEnded = true;\n\t\t\t\tif (!turnActionActive) {\n\t\t\t\t\tfinalizeRun();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t});\n\n\tsession.registerDisposeCallback(async () => {\n\t\tunsubscribe();\n\t\tfinalizeRun();\n\t\tsink.capture(\"agent session ended\", {\n\t\t\t...commonProperties(),\n\t\t\tduration_ms: Math.max(0, now() - sessionTotals.startedAt),\n\t\t\tprompt_count: sessionTotals.promptCount,\n\t\t\trun_count: sessionTotals.runCount,\n\t\t\tsuccessful_run_count: sessionTotals.successfulRunCount,\n\t\t\tfailed_run_count: sessionTotals.failedRunCount,\n\t\t\taborted_run_count: sessionTotals.abortedRunCount,\n\t\t\ttool_call_count: sessionTotals.toolCallCount,\n\t\t\tcompaction_count: sessionTotals.compactionCount,\n\t\t\tmodel_call_count: sessionTotals.usage.modelCallCount,\n\t\t\tinput_tokens: sessionTotals.usage.input,\n\t\t\toutput_tokens: sessionTotals.usage.output,\n\t\t\tcache_read_tokens: sessionTotals.usage.cacheRead,\n\t\t\tcache_write_tokens: sessionTotals.usage.cacheWrite,\n\t\t\ttotal_tokens: sessionTotals.usage.totalTokens,\n\t\t});\n\t\tawait sink.flush();\n\t});\n}\n"]}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { type Component } from "@ponythewhite/base-context-tui";
|
|
2
|
-
interface PrimeOnboardingSplashOptions {
|
|
3
|
-
getRows?: () => number;
|
|
4
|
-
requestRender?: () => void;
|
|
5
|
-
animationIntervalMs?: number;
|
|
6
|
-
continueActionLabel?: string;
|
|
7
|
-
}
|
|
8
|
-
export declare class PrimeOnboardingSplashComponent implements Component {
|
|
9
|
-
private readonly onSelect;
|
|
10
|
-
private readonly onCancel;
|
|
11
|
-
private readonly options;
|
|
12
|
-
private frame;
|
|
13
|
-
private animationInterval?;
|
|
14
|
-
private progressMessage?;
|
|
15
|
-
constructor(onSelect: () => void, onCancel: () => void, options?: PrimeOnboardingSplashOptions);
|
|
16
|
-
invalidate(): void;
|
|
17
|
-
dispose(): void;
|
|
18
|
-
showProgress(message: string): void;
|
|
19
|
-
render(width: number): string[];
|
|
20
|
-
handleInput(keyData: string): void;
|
|
21
|
-
private formatContinueHint;
|
|
22
|
-
private formatBrandLine;
|
|
23
|
-
private renderPanel;
|
|
24
|
-
private renderLogoBlock;
|
|
25
|
-
private renderBackdrop;
|
|
26
|
-
private drawLabField;
|
|
27
|
-
private labCell;
|
|
28
|
-
private isInsideQuietZone;
|
|
29
|
-
private drawStyledText;
|
|
30
|
-
private put;
|
|
31
|
-
private renderCells;
|
|
32
|
-
private mod;
|
|
33
|
-
private visiblePartsWidth;
|
|
34
|
-
private logoQuietZone;
|
|
35
|
-
private centerParts;
|
|
36
|
-
private getTargetRows;
|
|
37
|
-
}
|
|
38
|
-
export {};
|
|
39
|
-
//# sourceMappingURL=prime-onboarding-splash.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prime-onboarding-splash.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/prime-onboarding-splash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAiD,MAAM,gCAAgC,CAAC;AAI/G,UAAU,4BAA4B;IACrC,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAyCD,qBAAa,8BAA+B,YAAW,SAAS;IAM9D,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAPzB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,iBAAiB,CAAC,CAAiC;IAC3D,OAAO,CAAC,eAAe,CAAC,CAAS;IAEjC,YACkB,QAAQ,EAAE,MAAM,IAAI,EACpB,QAAQ,EAAE,MAAM,IAAI,EACpB,OAAO,GAAE,4BAAiC,EAQ3D;IAED,UAAU,IAAI,IAAI,CAEjB;IAED,OAAO,IAAI,IAAI,CAMd;IAED,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAIlC;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAW9B;IAED,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAYjC;IAED,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,YAAY;IA0BpB,OAAO,CAAC,OAAO;IAmEf,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,GAAG;IAiBX,OAAO,CAAC,WAAW;IAmCnB,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,aAAa;CAOrB","sourcesContent":["import { type Component, getKeybindings, truncateToWidth, visibleWidth } from \"@ponythewhite/base-context-tui\";\nimport { PRIME_BUTTERFLY_LOGO } from \"../../../themes/prime-logo.js\";\nimport { type ThemeColor, theme } from \"../theme/theme.js\";\n\ninterface PrimeOnboardingSplashOptions {\n\tgetRows?: () => number;\n\trequestRender?: () => void;\n\tanimationIntervalMs?: number;\n\tcontinueActionLabel?: string;\n}\n\nconst LOGO_LINES = PRIME_BUTTERFLY_LOGO.split(\"\\n\");\nconst LOGO_WIDTH = LOGO_LINES.reduce((max, line) => Math.max(max, visibleWidth(line)), 0);\nconst ANIMATION_INTERVAL_MS = 120;\nconst LAB_FIELD_HEIGHT = 14;\nconst LAB_FIELD_MIN_WIDTH = 42;\nconst LAB_FIELD_MAX_WIDTH = 78;\n\ntype SplashTone = Extract<ThemeColor, \"accent\" | \"borderMuted\" | \"dim\" | \"mdLink\" | \"muted\" | \"text\" | \"warning\">;\n\ninterface SplashCell {\n\tchar: string;\n\ttone: SplashTone;\n\tpriority: number;\n\tbold?: boolean;\n\titalic?: boolean;\n}\n\ninterface StyledText {\n\ttext: string;\n\ttone: SplashTone;\n\tbold?: boolean;\n\titalic?: boolean;\n\ttransparentSpaces?: boolean;\n}\n\ntype PanelTextLine = StyledText[];\n\ninterface PanelLine {\n\tleft: number;\n\tparts: PanelTextLine;\n}\n\ninterface QuietZone {\n\tleft: number;\n\tright: number;\n\ttop: number;\n\tbottom: number;\n}\n\nexport class PrimeOnboardingSplashComponent implements Component {\n\tprivate frame = 0;\n\tprivate animationInterval?: ReturnType<typeof setInterval>;\n\tprivate progressMessage?: string;\n\n\tconstructor(\n\t\tprivate readonly onSelect: () => void,\n\t\tprivate readonly onCancel: () => void,\n\t\tprivate readonly options: PrimeOnboardingSplashOptions = {},\n\t) {\n\t\tif (options.requestRender) {\n\t\t\tthis.animationInterval = setInterval(() => {\n\t\t\t\tthis.frame++;\n\t\t\t\toptions.requestRender?.();\n\t\t\t}, options.animationIntervalMs ?? ANIMATION_INTERVAL_MS);\n\t\t}\n\t}\n\n\tinvalidate(): void {\n\t\t// Render output is derived from current theme.\n\t}\n\n\tdispose(): void {\n\t\tif (!this.animationInterval) {\n\t\t\treturn;\n\t\t}\n\t\tclearInterval(this.animationInterval);\n\t\tthis.animationInterval = undefined;\n\t}\n\n\tshowProgress(message: string): void {\n\t\tthis.progressMessage = message;\n\t\tthis.dispose();\n\t\tthis.options.requestRender?.();\n\t}\n\n\trender(width: number): string[] {\n\t\tconst safeWidth = Math.max(1, width);\n\t\tconst panelLines = this.renderPanel(safeWidth);\n\t\tconst targetRows = this.getTargetRows(panelLines.length);\n\t\tconst topPadding = Math.max(0, Math.floor((targetRows - panelLines.length) / 2));\n\t\tconst logoZone = this.logoQuietZone(safeWidth, topPadding, targetRows);\n\t\tconst canvas = this.renderBackdrop(safeWidth, targetRows, logoZone);\n\t\tpanelLines.forEach((line, index) => {\n\t\t\tthis.drawStyledText(canvas, line.left, topPadding + index, line.parts, 8);\n\t\t});\n\t\treturn canvas.map((line) => this.renderCells(line));\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tif (this.progressMessage) {\n\t\t\treturn;\n\t\t}\n\t\tconst kb = getKeybindings();\n\t\tif (kb.matches(keyData, \"tui.select.confirm\")) {\n\t\t\tthis.onSelect();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.onCancel();\n\t\t}\n\t}\n\n\tprivate formatContinueHint(): PanelTextLine {\n\t\tif (this.progressMessage) {\n\t\t\treturn [{ text: this.progressMessage, tone: \"muted\" }];\n\t\t}\n\t\tconst actionLabel = this.options.continueActionLabel ?? \"login with Prime Intellect\";\n\t\treturn [\n\t\t\t{ text: \"Press \", tone: \"muted\" },\n\t\t\t{ text: \"Enter\", tone: \"accent\", bold: true },\n\t\t\t{ text: ` to ${actionLabel}`, tone: \"muted\" },\n\t\t];\n\t}\n\n\tprivate formatBrandLine(): PanelTextLine {\n\t\treturn [\n\t\t\t{ text: \"Welcome to \", tone: \"text\" },\n\t\t\t{ text: \"PRIME\", tone: \"text\", bold: true },\n\t\t\t{ text: \" Agent\", tone: \"text\", italic: true },\n\t\t];\n\t}\n\n\tprivate renderPanel(width: number): PanelLine[] {\n\t\tconst lines: PanelLine[] = [];\n\n\t\tfor (const line of this.renderLogoBlock(width)) {\n\t\t\tlines.push(this.centerParts(line, width));\n\t\t}\n\t\tlines.push({ left: 0, parts: [] });\n\t\tlines.push({ left: 0, parts: [] });\n\t\tlines.push({ left: 0, parts: [] });\n\t\tlines.push(this.centerParts(this.formatBrandLine(), width));\n\t\tlines.push(this.centerParts(this.formatContinueHint(), width));\n\n\t\treturn lines;\n\t}\n\n\tprivate renderLogoBlock(width: number): PanelTextLine[] {\n\t\tconst logoWidth = Math.min(LOGO_WIDTH, width);\n\t\treturn LOGO_LINES.map((line) => {\n\t\t\tconst paddedLine = line + \" \".repeat(Math.max(0, LOGO_WIDTH - visibleWidth(line)));\n\t\t\treturn [{ text: truncateToWidth(paddedLine, logoWidth, \"\"), tone: \"text\", transparentSpaces: true }];\n\t\t});\n\t}\n\n\tprivate renderBackdrop(width: number, rows: number, quietZone: QuietZone | undefined): SplashCell[][] {\n\t\tconst canvas = Array.from({ length: rows }, () =>\n\t\t\tArray.from({ length: width }, (): SplashCell => ({ char: \" \", tone: \"dim\", priority: 0 })),\n\t\t);\n\n\t\tthis.drawLabField(canvas, width, rows, quietZone);\n\n\t\treturn canvas;\n\t}\n\n\tprivate drawLabField(canvas: SplashCell[][], width: number, rows: number, quietZone: QuietZone | undefined): void {\n\t\tif (width < LAB_FIELD_MIN_WIDTH || rows < LAB_FIELD_HEIGHT + 2) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst labWidth = Math.max(LAB_FIELD_MIN_WIDTH, Math.min(LAB_FIELD_MAX_WIDTH, width - 6));\n\t\tconst left = Math.max(0, Math.floor((width - labWidth) / 2));\n\t\tconst fieldTop = quietZone ? quietZone.top - 2 : Math.floor((rows - LAB_FIELD_HEIGHT) / 2);\n\t\tconst top = Math.max(0, Math.min(rows - LAB_FIELD_HEIGHT, fieldTop));\n\n\t\tfor (let labY = 0; labY < LAB_FIELD_HEIGHT; labY++) {\n\t\t\tfor (let labX = 0; labX < labWidth; labX++) {\n\t\t\t\tconst x = left + labX;\n\t\t\t\tconst y = top + labY;\n\t\t\t\tconst cell = this.labCell(labX, labY, labWidth);\n\t\t\t\tif (!cell) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (cell.tone === \"mdLink\" && this.isInsideQuietZone(x, y, quietZone)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tthis.put(canvas, x, y, cell.char, cell.tone, cell.priority);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate labCell(x: number, y: number, width: number): SplashCell | undefined {\n\t\tconst height = LAB_FIELD_HEIGHT;\n\t\tconst frame = this.frame;\n\t\tlet cell: SplashCell | undefined;\n\t\tconst setCell = (char: string, tone: SplashTone, priority: number) => {\n\t\t\tif (!cell || priority >= cell.priority) {\n\t\t\t\tcell = { char, tone, priority };\n\t\t\t}\n\t\t};\n\n\t\tconst hash = this.mod(x * 37 + y * 53 + frame * 11 + x * y * 3, 101);\n\t\tif (hash < 3) {\n\t\t\tsetCell(\"·\", \"dim\", 1);\n\t\t}\n\n\t\tconst centerX = Math.floor((width * 36) / 100);\n\t\tconst centerY = Math.floor((height * 54) / 100);\n\t\tconst contour = Math.abs(x - centerX) + Math.abs(y - centerY) * 4 + Math.floor(x / 6) - frame;\n\t\tif (x < Math.floor((width * 82) / 100) && this.mod(contour, 24) === 12) {\n\t\t\tsetCell((x + y) % 5 === 0 ? \"╌\" : \"·\", \"borderMuted\", 2);\n\t\t}\n\n\t\tconst horizonY = Math.floor((height * 58) / 100);\n\t\tif (y === horizonY && x % 2 === 0 && this.mod(x + frame, 13) < 2) {\n\t\t\tsetCell(\"─\", x > Math.floor((width * 60) / 100) ? \"accent\" : \"dim\", 3);\n\t\t}\n\n\t\tconst scanStart = Math.max(0, Math.floor(width / 2) - 5);\n\t\tif (x >= scanStart) {\n\t\t\tconst scanOffset = x - scanStart;\n\t\t\tif (scanOffset % 4 === 0) {\n\t\t\t\tconst scanIndex = Math.floor(scanOffset / 4);\n\t\t\t\tconst segment = this.mod(y + scanIndex * 2 + Math.floor(frame / 2), 6);\n\t\t\t\tif (y > 0 && y < height - 1 && segment < 2) {\n\t\t\t\t\tsetCell((scanIndex + y) % 4 === 0 ? \"┃\" : \"╎\", \"mdLink\", 4);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (let traceIndex = 0; traceIndex < 3; traceIndex++) {\n\t\t\tconst base =\n\t\t\t\ttraceIndex === 0\n\t\t\t\t\t? Math.floor((height * 30) / 100)\n\t\t\t\t\t: traceIndex === 1\n\t\t\t\t\t\t? Math.floor((height * 49) / 100)\n\t\t\t\t\t\t: Math.floor((height * 72) / 100);\n\t\t\tlet wave = this.mod(x * 2 + frame + traceIndex * 7, 16);\n\t\t\tif (wave > 7) {\n\t\t\t\twave = 15 - wave;\n\t\t\t}\n\t\t\tconst traceY = base + Math.trunc((wave - 3) / 2);\n\t\t\tif (y !== traceY) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (this.mod(x + frame + traceIndex * 13, 41) === 0) {\n\t\t\t\tsetCell(\"◆\", \"warning\", 5);\n\t\t\t} else if (this.mod(x + frame, 12) === 0) {\n\t\t\t\tsetCell(\"•\", \"accent\", 5);\n\t\t\t} else {\n\t\t\t\tsetCell(\"·\", \"accent\", 3);\n\t\t\t}\n\t\t}\n\n\t\treturn cell;\n\t}\n\n\tprivate isInsideQuietZone(x: number, y: number, quietZone: QuietZone | undefined): boolean {\n\t\treturn (\n\t\t\tquietZone !== undefined &&\n\t\t\tx >= quietZone.left &&\n\t\t\tx <= quietZone.right &&\n\t\t\ty >= quietZone.top &&\n\t\t\ty <= quietZone.bottom\n\t\t);\n\t}\n\n\tprivate drawStyledText(\n\t\tcanvas: SplashCell[][],\n\t\tleft: number,\n\t\ty: number,\n\t\tparts: PanelTextLine,\n\t\tpriority: number,\n\t): void {\n\t\tlet x = left;\n\t\tfor (const part of parts) {\n\t\t\tfor (const char of part.text) {\n\t\t\t\tconst width = Math.max(0, visibleWidth(char));\n\t\t\t\tif (char !== \" \" || !part.transparentSpaces) {\n\t\t\t\t\tthis.put(canvas, x, y, char, part.tone, priority, part.bold, part.italic);\n\t\t\t\t}\n\t\t\t\tx += Math.max(1, width);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate put(\n\t\tcanvas: SplashCell[][],\n\t\tx: number,\n\t\ty: number,\n\t\tchar: string,\n\t\ttone: SplashTone,\n\t\tpriority: number,\n\t\tbold = false,\n\t\titalic = false,\n\t): void {\n\t\tif (y < 0 || y >= canvas.length) return;\n\t\tconst row = canvas[y];\n\t\tif (!row || x < 0 || x >= row.length) return;\n\t\tif (row[x] && row[x].priority > priority) return;\n\t\trow[x] = { char, tone, priority, bold, italic };\n\t}\n\n\tprivate renderCells(cells: SplashCell[]): string {\n\t\tlet rendered = \"\";\n\t\tlet currentTone: SplashTone | undefined;\n\t\tlet currentBold = false;\n\t\tlet currentItalic = false;\n\t\tlet segment = \"\";\n\n\t\tconst flush = () => {\n\t\t\tif (!segment || !currentTone) return;\n\t\t\tlet styled = theme.fg(currentTone, segment);\n\t\t\tif (currentItalic) {\n\t\t\t\tstyled = theme.italic(styled);\n\t\t\t}\n\t\t\tif (currentBold) {\n\t\t\t\tstyled = theme.bold(styled);\n\t\t\t}\n\t\t\trendered += styled;\n\t\t\tsegment = \"\";\n\t\t};\n\n\t\tfor (const cell of cells) {\n\t\t\tconst bold = cell.bold === true;\n\t\t\tconst italic = cell.italic === true;\n\t\t\tif (cell.tone !== currentTone || bold !== currentBold || italic !== currentItalic) {\n\t\t\t\tflush();\n\t\t\t\tcurrentTone = cell.tone;\n\t\t\t\tcurrentBold = bold;\n\t\t\t\tcurrentItalic = italic;\n\t\t\t}\n\t\t\tsegment += cell.char;\n\t\t}\n\t\tflush();\n\t\treturn rendered;\n\t}\n\n\tprivate mod(value: number, divisor: number): number {\n\t\treturn ((value % divisor) + divisor) % divisor;\n\t}\n\n\tprivate visiblePartsWidth(parts: PanelTextLine): number {\n\t\treturn parts.reduce((sum, part) => sum + visibleWidth(part.text), 0);\n\t}\n\n\tprivate logoQuietZone(width: number, topPadding: number, rows: number): QuietZone | undefined {\n\t\tconst logoWidth = Math.min(LOGO_WIDTH, width);\n\t\tif (logoWidth < 1 || rows < 1) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst left = Math.max(0, Math.floor((width - logoWidth) / 2));\n\t\treturn {\n\t\t\tleft,\n\t\t\tright: Math.min(width - 1, left + logoWidth - 1),\n\t\t\ttop: Math.max(0, topPadding),\n\t\t\tbottom: Math.min(rows - 1, topPadding + LOGO_LINES.length - 1),\n\t\t};\n\t}\n\n\tprivate centerParts(parts: PanelTextLine, width: number): PanelLine {\n\t\tconst left = Math.max(0, Math.floor((width - this.visiblePartsWidth(parts)) / 2));\n\t\treturn { left, parts };\n\t}\n\n\tprivate getTargetRows(contentLineCount: number): number {\n\t\tconst requestedRows = this.options.getRows?.();\n\t\tif (requestedRows && Number.isFinite(requestedRows)) {\n\t\t\treturn Math.max(contentLineCount, Math.floor(requestedRows));\n\t\t}\n\t\treturn contentLineCount;\n\t}\n}\n"]}
|
|
@@ -1,286 +0,0 @@
|
|
|
1
|
-
import { getKeybindings, truncateToWidth, visibleWidth } from "@ponythewhite/base-context-tui";
|
|
2
|
-
import { PRIME_BUTTERFLY_LOGO } from "../../../themes/prime-logo.js";
|
|
3
|
-
import { theme } from "../theme/theme.js";
|
|
4
|
-
const LOGO_LINES = PRIME_BUTTERFLY_LOGO.split("\n");
|
|
5
|
-
const LOGO_WIDTH = LOGO_LINES.reduce((max, line) => Math.max(max, visibleWidth(line)), 0);
|
|
6
|
-
const ANIMATION_INTERVAL_MS = 120;
|
|
7
|
-
const LAB_FIELD_HEIGHT = 14;
|
|
8
|
-
const LAB_FIELD_MIN_WIDTH = 42;
|
|
9
|
-
const LAB_FIELD_MAX_WIDTH = 78;
|
|
10
|
-
export class PrimeOnboardingSplashComponent {
|
|
11
|
-
onSelect;
|
|
12
|
-
onCancel;
|
|
13
|
-
options;
|
|
14
|
-
frame = 0;
|
|
15
|
-
animationInterval;
|
|
16
|
-
progressMessage;
|
|
17
|
-
constructor(onSelect, onCancel, options = {}) {
|
|
18
|
-
this.onSelect = onSelect;
|
|
19
|
-
this.onCancel = onCancel;
|
|
20
|
-
this.options = options;
|
|
21
|
-
if (options.requestRender) {
|
|
22
|
-
this.animationInterval = setInterval(() => {
|
|
23
|
-
this.frame++;
|
|
24
|
-
options.requestRender?.();
|
|
25
|
-
}, options.animationIntervalMs ?? ANIMATION_INTERVAL_MS);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
invalidate() {
|
|
29
|
-
// Render output is derived from current theme.
|
|
30
|
-
}
|
|
31
|
-
dispose() {
|
|
32
|
-
if (!this.animationInterval) {
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
clearInterval(this.animationInterval);
|
|
36
|
-
this.animationInterval = undefined;
|
|
37
|
-
}
|
|
38
|
-
showProgress(message) {
|
|
39
|
-
this.progressMessage = message;
|
|
40
|
-
this.dispose();
|
|
41
|
-
this.options.requestRender?.();
|
|
42
|
-
}
|
|
43
|
-
render(width) {
|
|
44
|
-
const safeWidth = Math.max(1, width);
|
|
45
|
-
const panelLines = this.renderPanel(safeWidth);
|
|
46
|
-
const targetRows = this.getTargetRows(panelLines.length);
|
|
47
|
-
const topPadding = Math.max(0, Math.floor((targetRows - panelLines.length) / 2));
|
|
48
|
-
const logoZone = this.logoQuietZone(safeWidth, topPadding, targetRows);
|
|
49
|
-
const canvas = this.renderBackdrop(safeWidth, targetRows, logoZone);
|
|
50
|
-
panelLines.forEach((line, index) => {
|
|
51
|
-
this.drawStyledText(canvas, line.left, topPadding + index, line.parts, 8);
|
|
52
|
-
});
|
|
53
|
-
return canvas.map((line) => this.renderCells(line));
|
|
54
|
-
}
|
|
55
|
-
handleInput(keyData) {
|
|
56
|
-
if (this.progressMessage) {
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
const kb = getKeybindings();
|
|
60
|
-
if (kb.matches(keyData, "tui.select.confirm")) {
|
|
61
|
-
this.onSelect();
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
if (kb.matches(keyData, "tui.select.cancel")) {
|
|
65
|
-
this.onCancel();
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
formatContinueHint() {
|
|
69
|
-
if (this.progressMessage) {
|
|
70
|
-
return [{ text: this.progressMessage, tone: "muted" }];
|
|
71
|
-
}
|
|
72
|
-
const actionLabel = this.options.continueActionLabel ?? "login with Prime Intellect";
|
|
73
|
-
return [
|
|
74
|
-
{ text: "Press ", tone: "muted" },
|
|
75
|
-
{ text: "Enter", tone: "accent", bold: true },
|
|
76
|
-
{ text: ` to ${actionLabel}`, tone: "muted" },
|
|
77
|
-
];
|
|
78
|
-
}
|
|
79
|
-
formatBrandLine() {
|
|
80
|
-
return [
|
|
81
|
-
{ text: "Welcome to ", tone: "text" },
|
|
82
|
-
{ text: "PRIME", tone: "text", bold: true },
|
|
83
|
-
{ text: " Agent", tone: "text", italic: true },
|
|
84
|
-
];
|
|
85
|
-
}
|
|
86
|
-
renderPanel(width) {
|
|
87
|
-
const lines = [];
|
|
88
|
-
for (const line of this.renderLogoBlock(width)) {
|
|
89
|
-
lines.push(this.centerParts(line, width));
|
|
90
|
-
}
|
|
91
|
-
lines.push({ left: 0, parts: [] });
|
|
92
|
-
lines.push({ left: 0, parts: [] });
|
|
93
|
-
lines.push({ left: 0, parts: [] });
|
|
94
|
-
lines.push(this.centerParts(this.formatBrandLine(), width));
|
|
95
|
-
lines.push(this.centerParts(this.formatContinueHint(), width));
|
|
96
|
-
return lines;
|
|
97
|
-
}
|
|
98
|
-
renderLogoBlock(width) {
|
|
99
|
-
const logoWidth = Math.min(LOGO_WIDTH, width);
|
|
100
|
-
return LOGO_LINES.map((line) => {
|
|
101
|
-
const paddedLine = line + " ".repeat(Math.max(0, LOGO_WIDTH - visibleWidth(line)));
|
|
102
|
-
return [{ text: truncateToWidth(paddedLine, logoWidth, ""), tone: "text", transparentSpaces: true }];
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
renderBackdrop(width, rows, quietZone) {
|
|
106
|
-
const canvas = Array.from({ length: rows }, () => Array.from({ length: width }, () => ({ char: " ", tone: "dim", priority: 0 })));
|
|
107
|
-
this.drawLabField(canvas, width, rows, quietZone);
|
|
108
|
-
return canvas;
|
|
109
|
-
}
|
|
110
|
-
drawLabField(canvas, width, rows, quietZone) {
|
|
111
|
-
if (width < LAB_FIELD_MIN_WIDTH || rows < LAB_FIELD_HEIGHT + 2) {
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
114
|
-
const labWidth = Math.max(LAB_FIELD_MIN_WIDTH, Math.min(LAB_FIELD_MAX_WIDTH, width - 6));
|
|
115
|
-
const left = Math.max(0, Math.floor((width - labWidth) / 2));
|
|
116
|
-
const fieldTop = quietZone ? quietZone.top - 2 : Math.floor((rows - LAB_FIELD_HEIGHT) / 2);
|
|
117
|
-
const top = Math.max(0, Math.min(rows - LAB_FIELD_HEIGHT, fieldTop));
|
|
118
|
-
for (let labY = 0; labY < LAB_FIELD_HEIGHT; labY++) {
|
|
119
|
-
for (let labX = 0; labX < labWidth; labX++) {
|
|
120
|
-
const x = left + labX;
|
|
121
|
-
const y = top + labY;
|
|
122
|
-
const cell = this.labCell(labX, labY, labWidth);
|
|
123
|
-
if (!cell) {
|
|
124
|
-
continue;
|
|
125
|
-
}
|
|
126
|
-
if (cell.tone === "mdLink" && this.isInsideQuietZone(x, y, quietZone)) {
|
|
127
|
-
continue;
|
|
128
|
-
}
|
|
129
|
-
this.put(canvas, x, y, cell.char, cell.tone, cell.priority);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
labCell(x, y, width) {
|
|
134
|
-
const height = LAB_FIELD_HEIGHT;
|
|
135
|
-
const frame = this.frame;
|
|
136
|
-
let cell;
|
|
137
|
-
const setCell = (char, tone, priority) => {
|
|
138
|
-
if (!cell || priority >= cell.priority) {
|
|
139
|
-
cell = { char, tone, priority };
|
|
140
|
-
}
|
|
141
|
-
};
|
|
142
|
-
const hash = this.mod(x * 37 + y * 53 + frame * 11 + x * y * 3, 101);
|
|
143
|
-
if (hash < 3) {
|
|
144
|
-
setCell("·", "dim", 1);
|
|
145
|
-
}
|
|
146
|
-
const centerX = Math.floor((width * 36) / 100);
|
|
147
|
-
const centerY = Math.floor((height * 54) / 100);
|
|
148
|
-
const contour = Math.abs(x - centerX) + Math.abs(y - centerY) * 4 + Math.floor(x / 6) - frame;
|
|
149
|
-
if (x < Math.floor((width * 82) / 100) && this.mod(contour, 24) === 12) {
|
|
150
|
-
setCell((x + y) % 5 === 0 ? "╌" : "·", "borderMuted", 2);
|
|
151
|
-
}
|
|
152
|
-
const horizonY = Math.floor((height * 58) / 100);
|
|
153
|
-
if (y === horizonY && x % 2 === 0 && this.mod(x + frame, 13) < 2) {
|
|
154
|
-
setCell("─", x > Math.floor((width * 60) / 100) ? "accent" : "dim", 3);
|
|
155
|
-
}
|
|
156
|
-
const scanStart = Math.max(0, Math.floor(width / 2) - 5);
|
|
157
|
-
if (x >= scanStart) {
|
|
158
|
-
const scanOffset = x - scanStart;
|
|
159
|
-
if (scanOffset % 4 === 0) {
|
|
160
|
-
const scanIndex = Math.floor(scanOffset / 4);
|
|
161
|
-
const segment = this.mod(y + scanIndex * 2 + Math.floor(frame / 2), 6);
|
|
162
|
-
if (y > 0 && y < height - 1 && segment < 2) {
|
|
163
|
-
setCell((scanIndex + y) % 4 === 0 ? "┃" : "╎", "mdLink", 4);
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
for (let traceIndex = 0; traceIndex < 3; traceIndex++) {
|
|
168
|
-
const base = traceIndex === 0
|
|
169
|
-
? Math.floor((height * 30) / 100)
|
|
170
|
-
: traceIndex === 1
|
|
171
|
-
? Math.floor((height * 49) / 100)
|
|
172
|
-
: Math.floor((height * 72) / 100);
|
|
173
|
-
let wave = this.mod(x * 2 + frame + traceIndex * 7, 16);
|
|
174
|
-
if (wave > 7) {
|
|
175
|
-
wave = 15 - wave;
|
|
176
|
-
}
|
|
177
|
-
const traceY = base + Math.trunc((wave - 3) / 2);
|
|
178
|
-
if (y !== traceY) {
|
|
179
|
-
continue;
|
|
180
|
-
}
|
|
181
|
-
if (this.mod(x + frame + traceIndex * 13, 41) === 0) {
|
|
182
|
-
setCell("◆", "warning", 5);
|
|
183
|
-
}
|
|
184
|
-
else if (this.mod(x + frame, 12) === 0) {
|
|
185
|
-
setCell("•", "accent", 5);
|
|
186
|
-
}
|
|
187
|
-
else {
|
|
188
|
-
setCell("·", "accent", 3);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
return cell;
|
|
192
|
-
}
|
|
193
|
-
isInsideQuietZone(x, y, quietZone) {
|
|
194
|
-
return (quietZone !== undefined &&
|
|
195
|
-
x >= quietZone.left &&
|
|
196
|
-
x <= quietZone.right &&
|
|
197
|
-
y >= quietZone.top &&
|
|
198
|
-
y <= quietZone.bottom);
|
|
199
|
-
}
|
|
200
|
-
drawStyledText(canvas, left, y, parts, priority) {
|
|
201
|
-
let x = left;
|
|
202
|
-
for (const part of parts) {
|
|
203
|
-
for (const char of part.text) {
|
|
204
|
-
const width = Math.max(0, visibleWidth(char));
|
|
205
|
-
if (char !== " " || !part.transparentSpaces) {
|
|
206
|
-
this.put(canvas, x, y, char, part.tone, priority, part.bold, part.italic);
|
|
207
|
-
}
|
|
208
|
-
x += Math.max(1, width);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
put(canvas, x, y, char, tone, priority, bold = false, italic = false) {
|
|
213
|
-
if (y < 0 || y >= canvas.length)
|
|
214
|
-
return;
|
|
215
|
-
const row = canvas[y];
|
|
216
|
-
if (!row || x < 0 || x >= row.length)
|
|
217
|
-
return;
|
|
218
|
-
if (row[x] && row[x].priority > priority)
|
|
219
|
-
return;
|
|
220
|
-
row[x] = { char, tone, priority, bold, italic };
|
|
221
|
-
}
|
|
222
|
-
renderCells(cells) {
|
|
223
|
-
let rendered = "";
|
|
224
|
-
let currentTone;
|
|
225
|
-
let currentBold = false;
|
|
226
|
-
let currentItalic = false;
|
|
227
|
-
let segment = "";
|
|
228
|
-
const flush = () => {
|
|
229
|
-
if (!segment || !currentTone)
|
|
230
|
-
return;
|
|
231
|
-
let styled = theme.fg(currentTone, segment);
|
|
232
|
-
if (currentItalic) {
|
|
233
|
-
styled = theme.italic(styled);
|
|
234
|
-
}
|
|
235
|
-
if (currentBold) {
|
|
236
|
-
styled = theme.bold(styled);
|
|
237
|
-
}
|
|
238
|
-
rendered += styled;
|
|
239
|
-
segment = "";
|
|
240
|
-
};
|
|
241
|
-
for (const cell of cells) {
|
|
242
|
-
const bold = cell.bold === true;
|
|
243
|
-
const italic = cell.italic === true;
|
|
244
|
-
if (cell.tone !== currentTone || bold !== currentBold || italic !== currentItalic) {
|
|
245
|
-
flush();
|
|
246
|
-
currentTone = cell.tone;
|
|
247
|
-
currentBold = bold;
|
|
248
|
-
currentItalic = italic;
|
|
249
|
-
}
|
|
250
|
-
segment += cell.char;
|
|
251
|
-
}
|
|
252
|
-
flush();
|
|
253
|
-
return rendered;
|
|
254
|
-
}
|
|
255
|
-
mod(value, divisor) {
|
|
256
|
-
return ((value % divisor) + divisor) % divisor;
|
|
257
|
-
}
|
|
258
|
-
visiblePartsWidth(parts) {
|
|
259
|
-
return parts.reduce((sum, part) => sum + visibleWidth(part.text), 0);
|
|
260
|
-
}
|
|
261
|
-
logoQuietZone(width, topPadding, rows) {
|
|
262
|
-
const logoWidth = Math.min(LOGO_WIDTH, width);
|
|
263
|
-
if (logoWidth < 1 || rows < 1) {
|
|
264
|
-
return undefined;
|
|
265
|
-
}
|
|
266
|
-
const left = Math.max(0, Math.floor((width - logoWidth) / 2));
|
|
267
|
-
return {
|
|
268
|
-
left,
|
|
269
|
-
right: Math.min(width - 1, left + logoWidth - 1),
|
|
270
|
-
top: Math.max(0, topPadding),
|
|
271
|
-
bottom: Math.min(rows - 1, topPadding + LOGO_LINES.length - 1),
|
|
272
|
-
};
|
|
273
|
-
}
|
|
274
|
-
centerParts(parts, width) {
|
|
275
|
-
const left = Math.max(0, Math.floor((width - this.visiblePartsWidth(parts)) / 2));
|
|
276
|
-
return { left, parts };
|
|
277
|
-
}
|
|
278
|
-
getTargetRows(contentLineCount) {
|
|
279
|
-
const requestedRows = this.options.getRows?.();
|
|
280
|
-
if (requestedRows && Number.isFinite(requestedRows)) {
|
|
281
|
-
return Math.max(contentLineCount, Math.floor(requestedRows));
|
|
282
|
-
}
|
|
283
|
-
return contentLineCount;
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
//# sourceMappingURL=prime-onboarding-splash.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prime-onboarding-splash.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/prime-onboarding-splash.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Component, getKeybindings, truncateToWidth, visibleWidth } from \"@ponythewhite/base-context-tui\";\nimport { PRIME_BUTTERFLY_LOGO } from \"../../../themes/prime-logo.js\";\nimport { type ThemeColor, theme } from \"../theme/theme.js\";\n\ninterface PrimeOnboardingSplashOptions {\n\tgetRows?: () => number;\n\trequestRender?: () => void;\n\tanimationIntervalMs?: number;\n\tcontinueActionLabel?: string;\n}\n\nconst LOGO_LINES = PRIME_BUTTERFLY_LOGO.split(\"\\n\");\nconst LOGO_WIDTH = LOGO_LINES.reduce((max, line) => Math.max(max, visibleWidth(line)), 0);\nconst ANIMATION_INTERVAL_MS = 120;\nconst LAB_FIELD_HEIGHT = 14;\nconst LAB_FIELD_MIN_WIDTH = 42;\nconst LAB_FIELD_MAX_WIDTH = 78;\n\ntype SplashTone = Extract<ThemeColor, \"accent\" | \"borderMuted\" | \"dim\" | \"mdLink\" | \"muted\" | \"text\" | \"warning\">;\n\ninterface SplashCell {\n\tchar: string;\n\ttone: SplashTone;\n\tpriority: number;\n\tbold?: boolean;\n\titalic?: boolean;\n}\n\ninterface StyledText {\n\ttext: string;\n\ttone: SplashTone;\n\tbold?: boolean;\n\titalic?: boolean;\n\ttransparentSpaces?: boolean;\n}\n\ntype PanelTextLine = StyledText[];\n\ninterface PanelLine {\n\tleft: number;\n\tparts: PanelTextLine;\n}\n\ninterface QuietZone {\n\tleft: number;\n\tright: number;\n\ttop: number;\n\tbottom: number;\n}\n\nexport class PrimeOnboardingSplashComponent implements Component {\n\tprivate frame = 0;\n\tprivate animationInterval?: ReturnType<typeof setInterval>;\n\tprivate progressMessage?: string;\n\n\tconstructor(\n\t\tprivate readonly onSelect: () => void,\n\t\tprivate readonly onCancel: () => void,\n\t\tprivate readonly options: PrimeOnboardingSplashOptions = {},\n\t) {\n\t\tif (options.requestRender) {\n\t\t\tthis.animationInterval = setInterval(() => {\n\t\t\t\tthis.frame++;\n\t\t\t\toptions.requestRender?.();\n\t\t\t}, options.animationIntervalMs ?? ANIMATION_INTERVAL_MS);\n\t\t}\n\t}\n\n\tinvalidate(): void {\n\t\t// Render output is derived from current theme.\n\t}\n\n\tdispose(): void {\n\t\tif (!this.animationInterval) {\n\t\t\treturn;\n\t\t}\n\t\tclearInterval(this.animationInterval);\n\t\tthis.animationInterval = undefined;\n\t}\n\n\tshowProgress(message: string): void {\n\t\tthis.progressMessage = message;\n\t\tthis.dispose();\n\t\tthis.options.requestRender?.();\n\t}\n\n\trender(width: number): string[] {\n\t\tconst safeWidth = Math.max(1, width);\n\t\tconst panelLines = this.renderPanel(safeWidth);\n\t\tconst targetRows = this.getTargetRows(panelLines.length);\n\t\tconst topPadding = Math.max(0, Math.floor((targetRows - panelLines.length) / 2));\n\t\tconst logoZone = this.logoQuietZone(safeWidth, topPadding, targetRows);\n\t\tconst canvas = this.renderBackdrop(safeWidth, targetRows, logoZone);\n\t\tpanelLines.forEach((line, index) => {\n\t\t\tthis.drawStyledText(canvas, line.left, topPadding + index, line.parts, 8);\n\t\t});\n\t\treturn canvas.map((line) => this.renderCells(line));\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tif (this.progressMessage) {\n\t\t\treturn;\n\t\t}\n\t\tconst kb = getKeybindings();\n\t\tif (kb.matches(keyData, \"tui.select.confirm\")) {\n\t\t\tthis.onSelect();\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.onCancel();\n\t\t}\n\t}\n\n\tprivate formatContinueHint(): PanelTextLine {\n\t\tif (this.progressMessage) {\n\t\t\treturn [{ text: this.progressMessage, tone: \"muted\" }];\n\t\t}\n\t\tconst actionLabel = this.options.continueActionLabel ?? \"login with Prime Intellect\";\n\t\treturn [\n\t\t\t{ text: \"Press \", tone: \"muted\" },\n\t\t\t{ text: \"Enter\", tone: \"accent\", bold: true },\n\t\t\t{ text: ` to ${actionLabel}`, tone: \"muted\" },\n\t\t];\n\t}\n\n\tprivate formatBrandLine(): PanelTextLine {\n\t\treturn [\n\t\t\t{ text: \"Welcome to \", tone: \"text\" },\n\t\t\t{ text: \"PRIME\", tone: \"text\", bold: true },\n\t\t\t{ text: \" Agent\", tone: \"text\", italic: true },\n\t\t];\n\t}\n\n\tprivate renderPanel(width: number): PanelLine[] {\n\t\tconst lines: PanelLine[] = [];\n\n\t\tfor (const line of this.renderLogoBlock(width)) {\n\t\t\tlines.push(this.centerParts(line, width));\n\t\t}\n\t\tlines.push({ left: 0, parts: [] });\n\t\tlines.push({ left: 0, parts: [] });\n\t\tlines.push({ left: 0, parts: [] });\n\t\tlines.push(this.centerParts(this.formatBrandLine(), width));\n\t\tlines.push(this.centerParts(this.formatContinueHint(), width));\n\n\t\treturn lines;\n\t}\n\n\tprivate renderLogoBlock(width: number): PanelTextLine[] {\n\t\tconst logoWidth = Math.min(LOGO_WIDTH, width);\n\t\treturn LOGO_LINES.map((line) => {\n\t\t\tconst paddedLine = line + \" \".repeat(Math.max(0, LOGO_WIDTH - visibleWidth(line)));\n\t\t\treturn [{ text: truncateToWidth(paddedLine, logoWidth, \"\"), tone: \"text\", transparentSpaces: true }];\n\t\t});\n\t}\n\n\tprivate renderBackdrop(width: number, rows: number, quietZone: QuietZone | undefined): SplashCell[][] {\n\t\tconst canvas = Array.from({ length: rows }, () =>\n\t\t\tArray.from({ length: width }, (): SplashCell => ({ char: \" \", tone: \"dim\", priority: 0 })),\n\t\t);\n\n\t\tthis.drawLabField(canvas, width, rows, quietZone);\n\n\t\treturn canvas;\n\t}\n\n\tprivate drawLabField(canvas: SplashCell[][], width: number, rows: number, quietZone: QuietZone | undefined): void {\n\t\tif (width < LAB_FIELD_MIN_WIDTH || rows < LAB_FIELD_HEIGHT + 2) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst labWidth = Math.max(LAB_FIELD_MIN_WIDTH, Math.min(LAB_FIELD_MAX_WIDTH, width - 6));\n\t\tconst left = Math.max(0, Math.floor((width - labWidth) / 2));\n\t\tconst fieldTop = quietZone ? quietZone.top - 2 : Math.floor((rows - LAB_FIELD_HEIGHT) / 2);\n\t\tconst top = Math.max(0, Math.min(rows - LAB_FIELD_HEIGHT, fieldTop));\n\n\t\tfor (let labY = 0; labY < LAB_FIELD_HEIGHT; labY++) {\n\t\t\tfor (let labX = 0; labX < labWidth; labX++) {\n\t\t\t\tconst x = left + labX;\n\t\t\t\tconst y = top + labY;\n\t\t\t\tconst cell = this.labCell(labX, labY, labWidth);\n\t\t\t\tif (!cell) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (cell.tone === \"mdLink\" && this.isInsideQuietZone(x, y, quietZone)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tthis.put(canvas, x, y, cell.char, cell.tone, cell.priority);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate labCell(x: number, y: number, width: number): SplashCell | undefined {\n\t\tconst height = LAB_FIELD_HEIGHT;\n\t\tconst frame = this.frame;\n\t\tlet cell: SplashCell | undefined;\n\t\tconst setCell = (char: string, tone: SplashTone, priority: number) => {\n\t\t\tif (!cell || priority >= cell.priority) {\n\t\t\t\tcell = { char, tone, priority };\n\t\t\t}\n\t\t};\n\n\t\tconst hash = this.mod(x * 37 + y * 53 + frame * 11 + x * y * 3, 101);\n\t\tif (hash < 3) {\n\t\t\tsetCell(\"·\", \"dim\", 1);\n\t\t}\n\n\t\tconst centerX = Math.floor((width * 36) / 100);\n\t\tconst centerY = Math.floor((height * 54) / 100);\n\t\tconst contour = Math.abs(x - centerX) + Math.abs(y - centerY) * 4 + Math.floor(x / 6) - frame;\n\t\tif (x < Math.floor((width * 82) / 100) && this.mod(contour, 24) === 12) {\n\t\t\tsetCell((x + y) % 5 === 0 ? \"╌\" : \"·\", \"borderMuted\", 2);\n\t\t}\n\n\t\tconst horizonY = Math.floor((height * 58) / 100);\n\t\tif (y === horizonY && x % 2 === 0 && this.mod(x + frame, 13) < 2) {\n\t\t\tsetCell(\"─\", x > Math.floor((width * 60) / 100) ? \"accent\" : \"dim\", 3);\n\t\t}\n\n\t\tconst scanStart = Math.max(0, Math.floor(width / 2) - 5);\n\t\tif (x >= scanStart) {\n\t\t\tconst scanOffset = x - scanStart;\n\t\t\tif (scanOffset % 4 === 0) {\n\t\t\t\tconst scanIndex = Math.floor(scanOffset / 4);\n\t\t\t\tconst segment = this.mod(y + scanIndex * 2 + Math.floor(frame / 2), 6);\n\t\t\t\tif (y > 0 && y < height - 1 && segment < 2) {\n\t\t\t\t\tsetCell((scanIndex + y) % 4 === 0 ? \"┃\" : \"╎\", \"mdLink\", 4);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (let traceIndex = 0; traceIndex < 3; traceIndex++) {\n\t\t\tconst base =\n\t\t\t\ttraceIndex === 0\n\t\t\t\t\t? Math.floor((height * 30) / 100)\n\t\t\t\t\t: traceIndex === 1\n\t\t\t\t\t\t? Math.floor((height * 49) / 100)\n\t\t\t\t\t\t: Math.floor((height * 72) / 100);\n\t\t\tlet wave = this.mod(x * 2 + frame + traceIndex * 7, 16);\n\t\t\tif (wave > 7) {\n\t\t\t\twave = 15 - wave;\n\t\t\t}\n\t\t\tconst traceY = base + Math.trunc((wave - 3) / 2);\n\t\t\tif (y !== traceY) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (this.mod(x + frame + traceIndex * 13, 41) === 0) {\n\t\t\t\tsetCell(\"◆\", \"warning\", 5);\n\t\t\t} else if (this.mod(x + frame, 12) === 0) {\n\t\t\t\tsetCell(\"•\", \"accent\", 5);\n\t\t\t} else {\n\t\t\t\tsetCell(\"·\", \"accent\", 3);\n\t\t\t}\n\t\t}\n\n\t\treturn cell;\n\t}\n\n\tprivate isInsideQuietZone(x: number, y: number, quietZone: QuietZone | undefined): boolean {\n\t\treturn (\n\t\t\tquietZone !== undefined &&\n\t\t\tx >= quietZone.left &&\n\t\t\tx <= quietZone.right &&\n\t\t\ty >= quietZone.top &&\n\t\t\ty <= quietZone.bottom\n\t\t);\n\t}\n\n\tprivate drawStyledText(\n\t\tcanvas: SplashCell[][],\n\t\tleft: number,\n\t\ty: number,\n\t\tparts: PanelTextLine,\n\t\tpriority: number,\n\t): void {\n\t\tlet x = left;\n\t\tfor (const part of parts) {\n\t\t\tfor (const char of part.text) {\n\t\t\t\tconst width = Math.max(0, visibleWidth(char));\n\t\t\t\tif (char !== \" \" || !part.transparentSpaces) {\n\t\t\t\t\tthis.put(canvas, x, y, char, part.tone, priority, part.bold, part.italic);\n\t\t\t\t}\n\t\t\t\tx += Math.max(1, width);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate put(\n\t\tcanvas: SplashCell[][],\n\t\tx: number,\n\t\ty: number,\n\t\tchar: string,\n\t\ttone: SplashTone,\n\t\tpriority: number,\n\t\tbold = false,\n\t\titalic = false,\n\t): void {\n\t\tif (y < 0 || y >= canvas.length) return;\n\t\tconst row = canvas[y];\n\t\tif (!row || x < 0 || x >= row.length) return;\n\t\tif (row[x] && row[x].priority > priority) return;\n\t\trow[x] = { char, tone, priority, bold, italic };\n\t}\n\n\tprivate renderCells(cells: SplashCell[]): string {\n\t\tlet rendered = \"\";\n\t\tlet currentTone: SplashTone | undefined;\n\t\tlet currentBold = false;\n\t\tlet currentItalic = false;\n\t\tlet segment = \"\";\n\n\t\tconst flush = () => {\n\t\t\tif (!segment || !currentTone) return;\n\t\t\tlet styled = theme.fg(currentTone, segment);\n\t\t\tif (currentItalic) {\n\t\t\t\tstyled = theme.italic(styled);\n\t\t\t}\n\t\t\tif (currentBold) {\n\t\t\t\tstyled = theme.bold(styled);\n\t\t\t}\n\t\t\trendered += styled;\n\t\t\tsegment = \"\";\n\t\t};\n\n\t\tfor (const cell of cells) {\n\t\t\tconst bold = cell.bold === true;\n\t\t\tconst italic = cell.italic === true;\n\t\t\tif (cell.tone !== currentTone || bold !== currentBold || italic !== currentItalic) {\n\t\t\t\tflush();\n\t\t\t\tcurrentTone = cell.tone;\n\t\t\t\tcurrentBold = bold;\n\t\t\t\tcurrentItalic = italic;\n\t\t\t}\n\t\t\tsegment += cell.char;\n\t\t}\n\t\tflush();\n\t\treturn rendered;\n\t}\n\n\tprivate mod(value: number, divisor: number): number {\n\t\treturn ((value % divisor) + divisor) % divisor;\n\t}\n\n\tprivate visiblePartsWidth(parts: PanelTextLine): number {\n\t\treturn parts.reduce((sum, part) => sum + visibleWidth(part.text), 0);\n\t}\n\n\tprivate logoQuietZone(width: number, topPadding: number, rows: number): QuietZone | undefined {\n\t\tconst logoWidth = Math.min(LOGO_WIDTH, width);\n\t\tif (logoWidth < 1 || rows < 1) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst left = Math.max(0, Math.floor((width - logoWidth) / 2));\n\t\treturn {\n\t\t\tleft,\n\t\t\tright: Math.min(width - 1, left + logoWidth - 1),\n\t\t\ttop: Math.max(0, topPadding),\n\t\t\tbottom: Math.min(rows - 1, topPadding + LOGO_LINES.length - 1),\n\t\t};\n\t}\n\n\tprivate centerParts(parts: PanelTextLine, width: number): PanelLine {\n\t\tconst left = Math.max(0, Math.floor((width - this.visiblePartsWidth(parts)) / 2));\n\t\treturn { left, parts };\n\t}\n\n\tprivate getTargetRows(contentLineCount: number): number {\n\t\tconst requestedRows = this.options.getRows?.();\n\t\tif (requestedRows && Number.isFinite(requestedRows)) {\n\t\t\treturn Math.max(contentLineCount, Math.floor(requestedRows));\n\t\t}\n\t\treturn contentLineCount;\n\t}\n}\n"]}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { Container, type Focusable } from "@ponythewhite/base-context-tui";
|
|
2
|
-
import type { PrimeTeam } from "../../../core/prime-inference-auth.js";
|
|
3
|
-
import { type MenuViewportProvider } from "./menu-panel.js";
|
|
4
|
-
export declare class PrimeTeamSelectorComponent extends Container implements Focusable {
|
|
5
|
-
private readonly currentTeamId;
|
|
6
|
-
private readonly onSelect;
|
|
7
|
-
private readonly onCancel;
|
|
8
|
-
private readonly viewport;
|
|
9
|
-
private readonly searchInput;
|
|
10
|
-
private readonly listContainer;
|
|
11
|
-
private readonly allOptions;
|
|
12
|
-
private filteredOptions;
|
|
13
|
-
private selectedIndex;
|
|
14
|
-
private searchQuery;
|
|
15
|
-
private _focused;
|
|
16
|
-
private listLayout;
|
|
17
|
-
constructor(teams: PrimeTeam[], currentTeamId: string | undefined, onSelect: (team: PrimeTeam | null) => void, onCancel: () => void, viewport?: MenuViewportProvider);
|
|
18
|
-
get focused(): boolean;
|
|
19
|
-
set focused(value: boolean);
|
|
20
|
-
private filterOptions;
|
|
21
|
-
private getSearchText;
|
|
22
|
-
render(width: number): string[];
|
|
23
|
-
private updateList;
|
|
24
|
-
private getPrimary;
|
|
25
|
-
private getSecondary;
|
|
26
|
-
private getMeta;
|
|
27
|
-
handleInput(keyData: string): void;
|
|
28
|
-
private updateLayout;
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=prime-team-selector.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prime-team-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/prime-team-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,SAAS,EACT,KAAK,SAAS,EAKd,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uCAAuC,CAAC;AAEvE,OAAO,EAMN,KAAK,oBAAoB,EACzB,MAAM,iBAAiB,CAAC;AAWzB,qBAAa,0BAA2B,SAAQ,SAAU,YAAW,SAAS;IAiB5E,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAnB1B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkB;IAC9C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAY;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAC/C,OAAO,CAAC,eAAe,CAAoB;IAC3C,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAKf;IAEH,YACC,KAAK,EAAE,SAAS,EAAE,EACD,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,EAC1C,QAAQ,EAAE,MAAM,IAAI,EACpB,QAAQ,GAAE,oBAAyB,EA0BpD;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAGzB;IAED,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,aAAa;IAQZ,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAUvC;IAED,OAAO,CAAC,UAAU;IAqClB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,OAAO;IAKf,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAyBjC;IAED,OAAO,CAAC,YAAY;CAWpB","sourcesContent":["import {\n\tContainer,\n\ttype Focusable,\n\tfuzzyFilter,\n\tgetKeybindings,\n\tSpacer,\n\tTruncatedText,\n} from \"@ponythewhite/base-context-tui\";\nimport type { PrimeTeam } from \"../../../core/prime-inference-auth.js\";\nimport { theme } from \"../theme/theme.js\";\nimport {\n\tgetMenuListLayout,\n\tMenuList,\n\tMenuPanel,\n\tMenuRow,\n\tMenuSearchInput,\n\ttype MenuViewportProvider,\n} from \"./menu-panel.js\";\n\ntype PrimeTeamOption = {\n\ttype: \"personal\" | \"team\";\n\tteam: PrimeTeam | null;\n};\n\nconst PREFERRED_VISIBLE_TEAMS = 8;\nconst TEAM_LIST_RESERVED_ROWS = 7;\nconst TEAM_SCROLL_INDICATOR_ROWS = 1;\n\nexport class PrimeTeamSelectorComponent extends Container implements Focusable {\n\tprivate readonly searchInput: MenuSearchInput;\n\tprivate readonly listContainer: Container;\n\tprivate readonly allOptions: PrimeTeamOption[];\n\tprivate filteredOptions: PrimeTeamOption[];\n\tprivate selectedIndex = 0;\n\tprivate searchQuery = \"\";\n\tprivate _focused = false;\n\tprivate listLayout = getMenuListLayout({\n\t\tpreferredVisibleItems: PREFERRED_VISIBLE_TEAMS,\n\t\treservedRows: TEAM_LIST_RESERVED_ROWS,\n\t\tcomfortableItemRows: 3,\n\t\tcompactItemRows: 2,\n\t});\n\n\tconstructor(\n\t\tteams: PrimeTeam[],\n\t\tprivate readonly currentTeamId: string | undefined,\n\t\tprivate readonly onSelect: (team: PrimeTeam | null) => void,\n\t\tprivate readonly onCancel: () => void,\n\t\tprivate readonly viewport: MenuViewportProvider = {},\n\t) {\n\t\tsuper();\n\n\t\tthis.allOptions = [{ type: \"personal\", team: null }, ...teams.map((team) => ({ type: \"team\" as const, team }))];\n\t\tthis.filteredOptions = this.allOptions;\n\n\t\tconst panel = new MenuPanel({\n\t\t\ttitle: \"Prime Team\",\n\t\t\tsubtitle: \"Choose which account pays for Prime Inference usage.\",\n\t\t});\n\t\tthis.addChild(panel);\n\n\t\tthis.searchInput = new MenuSearchInput(\"Search teams\");\n\t\tthis.searchInput.onSubmit = () => {\n\t\t\tconst selected = this.filteredOptions[this.selectedIndex];\n\t\t\tif (selected) {\n\t\t\t\tthis.onSelect(selected.team);\n\t\t\t}\n\t\t};\n\t\tpanel.addChild(this.searchInput);\n\t\tpanel.addChild(new Spacer(1));\n\n\t\tthis.listContainer = new MenuList({ compact: () => this.listLayout.compact });\n\t\tpanel.addChild(this.listContainer);\n\t\tthis.filterOptions(\"\");\n\t}\n\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.searchInput.focused = value;\n\t}\n\n\tprivate filterOptions(query: string): void {\n\t\tconst queryChanged = query !== this.searchQuery;\n\t\tthis.searchQuery = query;\n\t\tthis.filteredOptions = query\n\t\t\t? fuzzyFilter(this.allOptions, query, (option) => this.getSearchText(option))\n\t\t\t: this.allOptions;\n\t\tthis.selectedIndex = queryChanged\n\t\t\t? 0\n\t\t\t: Math.max(0, Math.min(this.selectedIndex, Math.max(0, this.filteredOptions.length - 1)));\n\t\tthis.updateList();\n\t}\n\n\tprivate getSearchText(option: PrimeTeamOption): string {\n\t\tif (option.type === \"personal\") {\n\t\t\treturn \"personal account\";\n\t\t}\n\t\tconst team = option.team;\n\t\treturn team ? `${team.name} ${team.slug ?? \"\"} ${team.role ?? \"\"} ${team.teamId}` : \"\";\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst previousLayout = this.listLayout;\n\t\tthis.updateLayout();\n\t\tif (\n\t\t\tthis.listLayout.compact !== previousLayout.compact ||\n\t\t\tthis.listLayout.visibleItems !== previousLayout.visibleItems\n\t\t) {\n\t\t\tthis.updateList();\n\t\t}\n\t\treturn super.render(width);\n\t}\n\n\tprivate updateList(): void {\n\t\tthis.updateLayout();\n\t\tthis.listContainer.clear();\n\n\t\tconst maxVisible = this.listLayout.visibleItems;\n\t\tconst startIndex = Math.max(\n\t\t\t0,\n\t\t\tMath.min(this.selectedIndex - Math.floor(maxVisible / 2), this.filteredOptions.length - maxVisible),\n\t\t);\n\t\tconst endIndex = Math.min(startIndex + maxVisible, this.filteredOptions.length);\n\n\t\tfor (let i = startIndex; i < endIndex; i++) {\n\t\t\tconst option = this.filteredOptions[i];\n\t\t\tif (!option) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.listContainer.addChild(\n\t\t\t\tnew MenuRow({\n\t\t\t\t\tprimary: this.getPrimary(option),\n\t\t\t\t\tsecondary: this.getSecondary(option),\n\t\t\t\t\tmeta: this.getMeta(option),\n\t\t\t\t\tselected: i === this.selectedIndex,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tif (startIndex > 0 || endIndex < this.filteredOptions.length) {\n\t\t\tthis.listContainer.addChild(\n\t\t\t\tnew TruncatedText(theme.fg(\"muted\", ` (${this.selectedIndex + 1}/${this.filteredOptions.length})`), 1, 0),\n\t\t\t);\n\t\t}\n\n\t\tif (this.filteredOptions.length === 0) {\n\t\t\tthis.listContainer.addChild(new TruncatedText(theme.fg(\"muted\", \"No matching teams\"), 1, 0));\n\t\t}\n\t}\n\n\tprivate getPrimary(option: PrimeTeamOption): string {\n\t\treturn option.team?.name ?? \"Personal\";\n\t}\n\n\tprivate getSecondary(option: PrimeTeamOption): string {\n\t\tif (!option.team) {\n\t\t\treturn \"personal account\";\n\t\t}\n\t\tconst role = option.team.role?.toLowerCase() ?? \"member\";\n\t\treturn option.team.slug ? `slug: ${option.team.slug}, role: ${role}` : `role: ${role}`;\n\t}\n\n\tprivate getMeta(option: PrimeTeamOption): string {\n\t\tconst isCurrent = option.team ? option.team.teamId === this.currentTeamId : this.currentTeamId === undefined;\n\t\treturn isCurrent ? theme.fg(\"success\", \"current\") : \"\";\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getKeybindings();\n\t\tif (kb.matches(keyData, \"tui.select.up\")) {\n\t\t\tif (this.filteredOptions.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.selectedIndex = Math.max(0, this.selectedIndex - 1);\n\t\t\tthis.updateList();\n\t\t} else if (kb.matches(keyData, \"tui.select.down\")) {\n\t\t\tif (this.filteredOptions.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.selectedIndex = Math.min(this.filteredOptions.length - 1, this.selectedIndex + 1);\n\t\t\tthis.updateList();\n\t\t} else if (kb.matches(keyData, \"tui.select.confirm\")) {\n\t\t\tconst selected = this.filteredOptions[this.selectedIndex];\n\t\t\tif (selected) {\n\t\t\t\tthis.onSelect(selected.team);\n\t\t\t}\n\t\t} else if (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.onCancel();\n\t\t} else {\n\t\t\tthis.searchInput.handleInput(keyData);\n\t\t\tthis.filterOptions(this.searchInput.getValue());\n\t\t}\n\t}\n\n\tprivate updateLayout(): void {\n\t\tthis.listLayout = getMenuListLayout({\n\t\t\tgetRows: this.viewport.getRows,\n\t\t\tpreferredVisibleItems: PREFERRED_VISIBLE_TEAMS,\n\t\t\ttotalItems: this.filteredOptions.length,\n\t\t\treservedRows: TEAM_LIST_RESERVED_ROWS,\n\t\t\tcomfortableItemRows: 3,\n\t\t\tcompactItemRows: 2,\n\t\t\tscrollIndicatorRows: TEAM_SCROLL_INDICATOR_ROWS,\n\t\t});\n\t}\n}\n"]}
|