@ponythewhite/base-context 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/NOTICE +0 -5
  3. package/README.md +44 -27
  4. package/dist/NOTICE +0 -5
  5. package/dist/base-context-runtime/pyproject.toml +1 -1
  6. package/dist/base-context-runtime/src/rlm/__init__.py +7 -5
  7. package/dist/base-context-runtime/test/test_subagent_registry.py +28 -1
  8. package/dist/base-context-runtime/uv.lock +1 -1
  9. package/dist/build-info.json +1 -1
  10. package/dist/bundle/amazon-bedrock.js +21 -0
  11. package/dist/bundle/{anthropic-YY4S534V.js → anthropic-UV5GZDGU.js} +5 -5
  12. package/dist/bundle/{azure-openai-responses-JRP6MIM3.js → azure-openai-responses-WSNPXLYC.js} +6 -6
  13. package/dist/bundle/{bundled-modules-P5HARVZA.js → bundled-modules-TXUMJ2XQ.js} +71 -16
  14. package/dist/bundle/chunk-27QCJ2AZ.js +2578 -0
  15. package/dist/bundle/{chunk-MZHTNNVA.js → chunk-4GXPNXOJ.js} +8 -0
  16. package/dist/bundle/{chunk-SC5KG5R4.js → chunk-DGNX7HQ3.js} +1 -7
  17. package/dist/bundle/{chunk-A53O363M.js → chunk-GRJFXLBM.js} +0 -1
  18. package/dist/bundle/chunk-HKINIBP4.js +29 -0
  19. package/dist/bundle/{chunk-UDSW6FNG.js → chunk-KTNETTHI.js} +1 -1
  20. package/dist/bundle/{chunk-BYVP7LWV.js → chunk-S3INFPZZ.js} +1861 -4662
  21. package/dist/bundle/{chunk-73DCPU3D.js → chunk-V3L54UD6.js} +1019 -3427
  22. package/dist/bundle/{chunk-U7AUVG3B.js → chunk-VSIYFWYI.js} +24 -6
  23. package/dist/bundle/{chunk-IW77OXFS.js → chunk-W46VZFI6.js} +0 -2099
  24. package/dist/bundle/{cli-main-O4X7GFGY.js → cli-main-BYMSRPH6.js} +8 -6
  25. package/dist/bundle/cli.js +2 -2
  26. package/dist/bundle/{google-AUTVGDGZ.js → google-T32FMD4G.js} +6 -6
  27. package/dist/bundle/{google-vertex-Q75D7RKS.js → google-vertex-56KP6I3B.js} +3 -3
  28. package/dist/bundle/{main-XKOW2BV6.js → main-ODOYCEQC.js} +7 -5
  29. package/dist/bundle/{mistral-7ESB7QUD.js → mistral-WGBMYIVU.js} +5 -5
  30. package/dist/bundle/{openai-codex-responses-LV3QRPN4.js → openai-codex-responses-PIV2RQ3G.js} +6 -6
  31. package/dist/bundle/{openai-completions-OJECLPXJ.js → openai-completions-64C3JPR4.js} +11 -22
  32. package/dist/bundle/{openai-responses-FN6HZMBC.js → openai-responses-UI7RSTDV.js} +6 -6
  33. package/dist/cli/args.d.ts.map +1 -1
  34. package/dist/cli/args.js +108 -59
  35. package/dist/cli/args.js.map +1 -1
  36. package/dist/cli/daemon-ps.d.ts +4 -3
  37. package/dist/cli/daemon-ps.d.ts.map +1 -1
  38. package/dist/cli/daemon-ps.js +6 -1
  39. package/dist/cli/daemon-ps.js.map +1 -1
  40. package/dist/cli/product-doctor.d.ts +0 -1
  41. package/dist/cli/product-doctor.d.ts.map +1 -1
  42. package/dist/cli/product-doctor.js +6 -3
  43. package/dist/cli/product-doctor.js.map +1 -1
  44. package/dist/config.d.ts +0 -3
  45. package/dist/config.d.ts.map +1 -1
  46. package/dist/config.js +0 -8
  47. package/dist/config.js.map +1 -1
  48. package/dist/core/agent-session-config.d.ts +1 -2
  49. package/dist/core/agent-session-config.d.ts.map +1 -1
  50. package/dist/core/agent-session-config.js +0 -3
  51. package/dist/core/agent-session-config.js.map +1 -1
  52. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  53. package/dist/core/agent-session-runtime.js +5 -4
  54. package/dist/core/agent-session-runtime.js.map +1 -1
  55. package/dist/core/agent-session-services.d.ts +5 -3
  56. package/dist/core/agent-session-services.d.ts.map +1 -1
  57. package/dist/core/agent-session-services.js +2 -27
  58. package/dist/core/agent-session-services.js.map +1 -1
  59. package/dist/core/agent-session.d.ts +10 -6
  60. package/dist/core/agent-session.d.ts.map +1 -1
  61. package/dist/core/agent-session.js +107 -107
  62. package/dist/core/agent-session.js.map +1 -1
  63. package/dist/core/auth-storage.d.ts +8 -35
  64. package/dist/core/auth-storage.d.ts.map +1 -1
  65. package/dist/core/auth-storage.js +33 -243
  66. package/dist/core/auth-storage.js.map +1 -1
  67. package/dist/core/cron-jobs.d.ts.map +1 -1
  68. package/dist/core/cron-jobs.js +7 -1
  69. package/dist/core/cron-jobs.js.map +1 -1
  70. package/dist/core/inference-coordinator.d.ts +6 -1
  71. package/dist/core/inference-coordinator.d.ts.map +1 -1
  72. package/dist/core/inference-coordinator.js +18 -2
  73. package/dist/core/inference-coordinator.js.map +1 -1
  74. package/dist/core/kernel/bootstrap.d.ts.map +1 -1
  75. package/dist/core/kernel/bootstrap.js +2 -2
  76. package/dist/core/kernel/bootstrap.js.map +1 -1
  77. package/dist/core/kernel/repl-manager.d.ts +2 -0
  78. package/dist/core/kernel/repl-manager.d.ts.map +1 -1
  79. package/dist/core/kernel/repl-manager.js +44 -1
  80. package/dist/core/kernel/repl-manager.js.map +1 -1
  81. package/dist/core/logging.d.ts +4 -3
  82. package/dist/core/logging.d.ts.map +1 -1
  83. package/dist/core/logging.js +6 -6
  84. package/dist/core/logging.js.map +1 -1
  85. package/dist/core/mcp/mcp-manager.d.ts.map +1 -1
  86. package/dist/core/mcp/mcp-manager.js +3 -3
  87. package/dist/core/mcp/mcp-manager.js.map +1 -1
  88. package/dist/core/model-registry.d.ts +1 -16
  89. package/dist/core/model-registry.d.ts.map +1 -1
  90. package/dist/core/model-registry.js +88 -196
  91. package/dist/core/model-registry.js.map +1 -1
  92. package/dist/core/model-resolver.d.ts +2 -19
  93. package/dist/core/model-resolver.d.ts.map +1 -1
  94. package/dist/core/model-resolver.js +36 -266
  95. package/dist/core/model-resolver.js.map +1 -1
  96. package/dist/core/provider-contracts.d.ts +5 -6
  97. package/dist/core/provider-contracts.d.ts.map +1 -1
  98. package/dist/core/provider-contracts.js +25 -36
  99. package/dist/core/provider-contracts.js.map +1 -1
  100. package/dist/core/provider-display-names.d.ts.map +1 -1
  101. package/dist/core/provider-display-names.js +0 -2
  102. package/dist/core/provider-display-names.js.map +1 -1
  103. package/dist/core/rlm-max-subagents.d.ts +32 -0
  104. package/dist/core/rlm-max-subagents.d.ts.map +1 -0
  105. package/dist/core/rlm-max-subagents.js +50 -0
  106. package/dist/core/rlm-max-subagents.js.map +1 -0
  107. package/dist/core/rlm-runtime.d.ts +3 -3
  108. package/dist/core/rlm-runtime.d.ts.map +1 -1
  109. package/dist/core/rlm-runtime.js.map +1 -1
  110. package/dist/core/sdk.d.ts +4 -3
  111. package/dist/core/sdk.d.ts.map +1 -1
  112. package/dist/core/sdk.js +27 -14
  113. package/dist/core/sdk.js.map +1 -1
  114. package/dist/core/settings-manager.d.ts +3 -16
  115. package/dist/core/settings-manager.d.ts.map +1 -1
  116. package/dist/core/settings-manager.js +12 -44
  117. package/dist/core/settings-manager.js.map +1 -1
  118. package/dist/core/slash-commands.d.ts.map +1 -1
  119. package/dist/core/slash-commands.js +6 -6
  120. package/dist/core/slash-commands.js.map +1 -1
  121. package/dist/index.d.ts +1 -1
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/index.js.map +1 -1
  124. package/dist/installer.mjs +2 -3
  125. package/dist/main.d.ts.map +1 -1
  126. package/dist/main.js +39 -34
  127. package/dist/main.js.map +1 -1
  128. package/dist/modes/acp/acp-mode.d.ts.map +1 -1
  129. package/dist/modes/acp/acp-mode.js +1 -1
  130. package/dist/modes/acp/acp-mode.js.map +1 -1
  131. package/dist/modes/agent-connection/daemon-agent-connection.d.ts +6 -2
  132. package/dist/modes/agent-connection/daemon-agent-connection.d.ts.map +1 -1
  133. package/dist/modes/agent-connection/daemon-agent-connection.js +13 -2
  134. package/dist/modes/agent-connection/daemon-agent-connection.js.map +1 -1
  135. package/dist/modes/agent-connection/in-process-agent-connection.d.ts +2 -0
  136. package/dist/modes/agent-connection/in-process-agent-connection.d.ts.map +1 -1
  137. package/dist/modes/agent-connection/in-process-agent-connection.js +6 -0
  138. package/dist/modes/agent-connection/in-process-agent-connection.js.map +1 -1
  139. package/dist/modes/agent-connection/types.d.ts +3 -0
  140. package/dist/modes/agent-connection/types.d.ts.map +1 -1
  141. package/dist/modes/agent-connection/types.js.map +1 -1
  142. package/dist/modes/agents-view/agents-view-mode.d.ts.map +1 -1
  143. package/dist/modes/agents-view/agents-view-mode.js +2 -19
  144. package/dist/modes/agents-view/agents-view-mode.js.map +1 -1
  145. package/dist/modes/daemon/daemon-mode.d.ts +5 -0
  146. package/dist/modes/daemon/daemon-mode.d.ts.map +1 -1
  147. package/dist/modes/daemon/daemon-mode.js +107 -12
  148. package/dist/modes/daemon/daemon-mode.js.map +1 -1
  149. package/dist/modes/daemon/daemon-protocol.d.ts +194 -165
  150. package/dist/modes/daemon/daemon-protocol.d.ts.map +1 -1
  151. package/dist/modes/daemon/daemon-protocol.js +16 -11
  152. package/dist/modes/daemon/daemon-protocol.js.map +1 -1
  153. package/dist/modes/daemon/daemon-rlm-capacity-coordinator.d.ts +19 -0
  154. package/dist/modes/daemon/daemon-rlm-capacity-coordinator.d.ts.map +1 -0
  155. package/dist/modes/daemon/daemon-rlm-capacity-coordinator.js +74 -0
  156. package/dist/modes/daemon/daemon-rlm-capacity-coordinator.js.map +1 -0
  157. package/dist/modes/daemon/daemon-rlm-capacity.d.ts +19 -0
  158. package/dist/modes/daemon/daemon-rlm-capacity.d.ts.map +1 -0
  159. package/dist/modes/daemon/daemon-rlm-capacity.js +85 -0
  160. package/dist/modes/daemon/daemon-rlm-capacity.js.map +1 -0
  161. package/dist/modes/daemon/daemon-session-summarizer.d.ts +2 -3
  162. package/dist/modes/daemon/daemon-session-summarizer.d.ts.map +1 -1
  163. package/dist/modes/daemon/daemon-session-summarizer.js +32 -23
  164. package/dist/modes/daemon/daemon-session-summarizer.js.map +1 -1
  165. package/dist/modes/daemon/daemon-state-root.d.ts +15 -0
  166. package/dist/modes/daemon/daemon-state-root.d.ts.map +1 -0
  167. package/dist/modes/daemon/daemon-state-root.js +40 -0
  168. package/dist/modes/daemon/daemon-state-root.js.map +1 -0
  169. package/dist/modes/daemon/daemon-supervisor-ownership.d.ts +2 -0
  170. package/dist/modes/daemon/daemon-supervisor-ownership.d.ts.map +1 -1
  171. package/dist/modes/daemon/daemon-supervisor-ownership.js +27 -0
  172. package/dist/modes/daemon/daemon-supervisor-ownership.js.map +1 -1
  173. package/dist/modes/daemon/daemon-supervisor.d.ts +10 -1
  174. package/dist/modes/daemon/daemon-supervisor.d.ts.map +1 -1
  175. package/dist/modes/daemon/daemon-supervisor.js +213 -20
  176. package/dist/modes/daemon/daemon-supervisor.js.map +1 -1
  177. package/dist/modes/daemon/daemon-worker-protocol.d.ts +28 -1
  178. package/dist/modes/daemon/daemon-worker-protocol.d.ts.map +1 -1
  179. package/dist/modes/daemon/daemon-worker-protocol.js +16 -2
  180. package/dist/modes/daemon/daemon-worker-protocol.js.map +1 -1
  181. package/dist/modes/daemon/saved-session-catalog.d.ts.map +1 -1
  182. package/dist/modes/daemon/saved-session-catalog.js +2 -0
  183. package/dist/modes/daemon/saved-session-catalog.js.map +1 -1
  184. package/dist/modes/interactive/auth-flows.d.ts +0 -6
  185. package/dist/modes/interactive/auth-flows.d.ts.map +1 -1
  186. package/dist/modes/interactive/auth-flows.js +6 -126
  187. package/dist/modes/interactive/auth-flows.js.map +1 -1
  188. package/dist/modes/interactive/components/configuration-menu.d.ts +3 -0
  189. package/dist/modes/interactive/components/configuration-menu.d.ts.map +1 -1
  190. package/dist/modes/interactive/components/configuration-menu.js +13 -2
  191. package/dist/modes/interactive/components/configuration-menu.js.map +1 -1
  192. package/dist/modes/interactive/components/footer.d.ts +1 -1
  193. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  194. package/dist/modes/interactive/components/footer.js +2 -2
  195. package/dist/modes/interactive/components/footer.js.map +1 -1
  196. package/dist/modes/interactive/components/index.d.ts +0 -1
  197. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  198. package/dist/modes/interactive/components/index.js +0 -1
  199. package/dist/modes/interactive/components/index.js.map +1 -1
  200. package/dist/modes/interactive/components/login-dialog.d.ts +0 -1
  201. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  202. package/dist/modes/interactive/components/login-dialog.js +3 -40
  203. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  204. package/dist/modes/interactive/components/model-selector.d.ts +2 -0
  205. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  206. package/dist/modes/interactive/components/model-selector.js +13 -2
  207. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  208. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  209. package/dist/modes/interactive/components/oauth-selector.js +2 -11
  210. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  211. package/dist/modes/interactive/feature-hints.d.ts.map +1 -1
  212. package/dist/modes/interactive/feature-hints.js +0 -4
  213. package/dist/modes/interactive/feature-hints.js.map +1 -1
  214. package/dist/modes/interactive/interactive-mode.d.ts +3 -12
  215. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  216. package/dist/modes/interactive/interactive-mode.js +81 -507
  217. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  218. package/dist/modes/interactive/onboarding.d.ts +0 -3
  219. package/dist/modes/interactive/onboarding.d.ts.map +1 -1
  220. package/dist/modes/interactive/onboarding.js +0 -17
  221. package/dist/modes/interactive/onboarding.js.map +1 -1
  222. package/dist/modes/rpc/rpc-client.d.ts +2 -1
  223. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  224. package/dist/modes/rpc/rpc-client.js +24 -11
  225. package/dist/modes/rpc/rpc-client.js.map +1 -1
  226. package/dist/node/amazon-bedrock.d.ts +2 -0
  227. package/dist/node/amazon-bedrock.d.ts.map +1 -0
  228. package/dist/node/amazon-bedrock.js +6 -0
  229. package/dist/node/amazon-bedrock.js.map +1 -0
  230. package/dist/product-identity.d.ts +0 -1
  231. package/dist/product-identity.d.ts.map +1 -1
  232. package/dist/product-identity.js +0 -1
  233. package/dist/product-identity.js.map +1 -1
  234. package/docs/development.md +1 -1
  235. package/docs/fork-philosophy.md +4 -8
  236. package/docs/installation.md +83 -62
  237. package/docs/providers.md +23 -25
  238. package/docs/quickstart.md +19 -10
  239. package/docs/rlm-runtime.md +13 -5
  240. package/docs/rpc.md +4 -4
  241. package/docs/sdk.md +20 -11
  242. package/docs/sessions.md +0 -1
  243. package/docs/settings.md +9 -42
  244. package/docs/skills.md +0 -1
  245. package/docs/upstream-0.9.5.md +171 -0
  246. package/docs/usage.md +14 -10
  247. package/package.json +4 -4
  248. package/dist/core/agent-traces.d.ts +0 -149
  249. package/dist/core/agent-traces.d.ts.map +0 -1
  250. package/dist/core/agent-traces.js +0 -904
  251. package/dist/core/agent-traces.js.map +0 -1
  252. package/dist/core/prime-inference-auth.d.ts +0 -70
  253. package/dist/core/prime-inference-auth.d.ts.map +0 -1
  254. package/dist/core/prime-inference-auth.js +0 -352
  255. package/dist/core/prime-inference-auth.js.map +0 -1
  256. package/dist/core/prime-inference-model-selection.d.ts +0 -16
  257. package/dist/core/prime-inference-model-selection.d.ts.map +0 -1
  258. package/dist/core/prime-inference-model-selection.js +0 -16
  259. package/dist/core/prime-inference-model-selection.js.map +0 -1
  260. package/dist/core/prime-inference-models.d.ts +0 -6
  261. package/dist/core/prime-inference-models.d.ts.map +0 -1
  262. package/dist/core/prime-inference-models.js +0 -62
  263. package/dist/core/prime-inference-models.js.map +0 -1
  264. package/dist/core/telemetry.d.ts +0 -95
  265. package/dist/core/telemetry.d.ts.map +0 -1
  266. package/dist/core/telemetry.js +0 -637
  267. package/dist/core/telemetry.js.map +0 -1
  268. package/dist/modes/interactive/components/prime-onboarding-splash.d.ts +0 -39
  269. package/dist/modes/interactive/components/prime-onboarding-splash.d.ts.map +0 -1
  270. package/dist/modes/interactive/components/prime-onboarding-splash.js +0 -286
  271. package/dist/modes/interactive/components/prime-onboarding-splash.js.map +0 -1
  272. package/dist/modes/interactive/components/prime-team-selector.d.ts +0 -30
  273. package/dist/modes/interactive/components/prime-team-selector.d.ts.map +0 -1
  274. package/dist/modes/interactive/components/prime-team-selector.js +0 -166
  275. package/dist/modes/interactive/components/prime-team-selector.js.map +0 -1
  276. package/dist/skills/prime-intellect/SKILL.md +0 -87
  277. package/dist/skills/prime-intellect/references/compute.md +0 -45
  278. package/dist/skills/prime-intellect/references/environments.md +0 -73
  279. package/dist/skills/prime-intellect/references/inference.md +0 -47
  280. package/dist/skills/prime-intellect/references/sandboxes.md +0 -75
  281. package/skills/prime-intellect/SKILL.md +0 -87
  282. package/skills/prime-intellect/references/compute.md +0 -45
  283. package/skills/prime-intellect/references/environments.md +0 -73
  284. package/skills/prime-intellect/references/inference.md +0 -47
  285. 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":"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","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"]}