@ponythewhite/base-context 1.0.4 → 1.0.6

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 (61) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/base-context-runtime/pyproject.toml +1 -1
  3. package/dist/base-context-runtime/uv.lock +1 -1
  4. package/dist/build-info.json +1 -1
  5. package/dist/bundle/amazon-bedrock.js +2 -2
  6. package/dist/bundle/{bundled-modules-R5EAJ62K.js → bundled-modules-MEACET4U.js} +4 -4
  7. package/dist/bundle/{chunk-HKINIBP4.js → chunk-LFPWHI42.js} +1 -1
  8. package/dist/bundle/{chunk-BV25CVRM.js → chunk-LIZVVGHR.js} +83 -108
  9. package/dist/bundle/{chunk-XDJ56NJA.js → chunk-QKI6KEGP.js} +47 -23
  10. package/dist/bundle/{chunk-27QCJ2AZ.js → chunk-UPVDERMD.js} +0 -12
  11. package/dist/bundle/{cli-main-OUKN743U.js → cli-main-ANUJY7Y4.js} +3 -3
  12. package/dist/bundle/cli.js +1 -1
  13. package/dist/bundle/{main-QPCXSW6X.js → main-4GIKOHIT.js} +4 -4
  14. package/dist/cli/product-doctor.d.ts.map +1 -1
  15. package/dist/cli/product-doctor.js +2 -2
  16. package/dist/cli/product-doctor.js.map +1 -1
  17. package/dist/core/agent-session.d.ts.map +1 -1
  18. package/dist/core/agent-session.js +9 -3
  19. package/dist/core/agent-session.js.map +1 -1
  20. package/dist/core/canonical-context.d.ts +3 -1
  21. package/dist/core/canonical-context.d.ts.map +1 -1
  22. package/dist/core/canonical-context.js +46 -16
  23. package/dist/core/canonical-context.js.map +1 -1
  24. package/dist/core/context-epoch-copy.d.ts.map +1 -1
  25. package/dist/core/context-epoch-copy.js +1 -1
  26. package/dist/core/context-epoch-copy.js.map +1 -1
  27. package/dist/core/context-epoch.d.ts +12 -2
  28. package/dist/core/context-epoch.d.ts.map +1 -1
  29. package/dist/core/context-epoch.js +28 -12
  30. package/dist/core/context-epoch.js.map +1 -1
  31. package/dist/core/session-bootstrap.d.ts +1 -0
  32. package/dist/core/session-bootstrap.d.ts.map +1 -1
  33. package/dist/core/session-bootstrap.js +1 -1
  34. package/dist/core/session-bootstrap.js.map +1 -1
  35. package/dist/modes/interactive/components/brand-announcement.d.ts +5 -0
  36. package/dist/modes/interactive/components/brand-announcement.d.ts.map +1 -0
  37. package/dist/modes/interactive/components/brand-announcement.js +14 -0
  38. package/dist/modes/interactive/components/brand-announcement.js.map +1 -0
  39. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  40. package/dist/modes/interactive/components/settings-selector.js +9 -6
  41. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  42. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  43. package/dist/modes/interactive/interactive-mode.js +4 -4
  44. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  45. package/dist/modes/shared/startup-notices.d.ts.map +1 -1
  46. package/dist/modes/shared/startup-notices.js +1 -1
  47. package/dist/modes/shared/startup-notices.js.map +1 -1
  48. package/dist/themes/synerise-logo.d.ts +3 -0
  49. package/dist/themes/synerise-logo.d.ts.map +1 -0
  50. package/dist/themes/synerise-logo.js +9 -0
  51. package/dist/themes/synerise-logo.js.map +1 -0
  52. package/package.json +6 -6
  53. package/dist/modes/interactive/assets/clankolas.png +0 -0
  54. package/dist/modes/interactive/components/earendil-announcement.d.ts +0 -5
  55. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +0 -1
  56. package/dist/modes/interactive/components/earendil-announcement.js +0 -40
  57. package/dist/modes/interactive/components/earendil-announcement.js.map +0 -1
  58. package/dist/themes/prime-logo.d.ts +0 -9
  59. package/dist/themes/prime-logo.d.ts.map +0 -1
  60. package/dist/themes/prime-logo.js +0 -18
  61. package/dist/themes/prime-logo.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"startup-notices.d.ts","sourceRoot":"","sources":["../../../src/modes/shared/startup-notices.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAItE,MAAM,WAAW,cAAc;IAC9B,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,yBAAyB;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,eAAe,CAAC;CACjC;AAED,mEAAmE;AACnE,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,cAAc,CAAC,CAOtG;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACrD,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,eAAe,CAAC;CACjC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgBpB;AAED,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA6C1E;AAED,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAKtE;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAMpE;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE/D","sourcesContent":["/**\n * Global, environment-scoped startup notices (app update, extension updates, tmux setup).\n *\n * These are not tied to any single conversation, so they are surfaced on the agents\n * view rather than appended to a session's chat stream. The checks and styled\n * formatters live here so both the agents view and the interactive fallback render\n * identical wording.\n */\n\nimport { spawn } from \"node:child_process\";\nimport { DefaultPackageManager } from \"../../core/package-manager.js\";\nimport type { SettingsManager } from \"../../core/settings-manager.js\";\nimport { checkForNewPiVersion } from \"../../utils/version-check.js\";\nimport { theme } from \"../interactive/theme/theme.js\";\n\nexport interface StartupNotices {\n\t/** Newer Prime Agent version available, if any. */\n\tnewVersion?: string;\n\t/** Display names of extensions with available updates. */\n\tpackageUpdates: string[];\n\t/** tmux keyboard setup warning, if the current tmux config is suboptimal. */\n\ttmuxWarning?: string;\n}\n\nexport interface StartupNoticeCheckOptions {\n\tversion: string;\n\tcwd: string;\n\tagentDir: string;\n\tsettingsManager: SettingsManager;\n}\n\n/** Run every startup check in parallel and collect the results. */\nexport async function gatherStartupNotices(options: StartupNoticeCheckOptions): Promise<StartupNotices> {\n\tconst [newVersion, packageUpdates, tmuxWarning] = await Promise.all([\n\t\tcheckForNewPiVersion(options.version),\n\t\tcheckForPackageUpdates(options),\n\t\tcheckTmuxKeyboardSetup(),\n\t]);\n\treturn { newVersion, packageUpdates, tmuxWarning };\n}\n\nexport async function checkForPackageUpdates(options: {\n\tcwd: string;\n\tagentDir: string;\n\tsettingsManager: SettingsManager;\n}): Promise<string[]> {\n\tif (process.env.BASE_CONTEXT_OFFLINE) {\n\t\treturn [];\n\t}\n\n\ttry {\n\t\tconst packageManager = new DefaultPackageManager({\n\t\t\tcwd: options.cwd,\n\t\t\tagentDir: options.agentDir,\n\t\t\tsettingsManager: options.settingsManager,\n\t\t});\n\t\tconst updates = await packageManager.checkForAvailableUpdates();\n\t\treturn updates.map((update) => update.displayName);\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nexport async function checkTmuxKeyboardSetup(): Promise<string | undefined> {\n\tif (!process.env.TMUX) return undefined;\n\n\tconst runTmuxShow = (option: string): Promise<string | undefined> => {\n\t\treturn new Promise((resolve) => {\n\t\t\tconst proc = spawn(\"tmux\", [\"show\", \"-gv\", option], {\n\t\t\t\tstdio: [\"ignore\", \"pipe\", \"ignore\"],\n\t\t\t});\n\t\t\tlet stdout = \"\";\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tproc.kill();\n\t\t\t\tresolve(undefined);\n\t\t\t}, 2000);\n\n\t\t\tproc.stdout?.on(\"data\", (data) => {\n\t\t\t\tstdout += data.toString();\n\t\t\t});\n\t\t\tproc.on(\"error\", () => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tresolve(undefined);\n\t\t\t});\n\t\t\tproc.on(\"close\", (code) => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tresolve(code === 0 ? stdout.trim() : undefined);\n\t\t\t});\n\t\t});\n\t};\n\n\tconst [extendedKeys, extendedKeysFormat] = await Promise.all([\n\t\trunTmuxShow(\"extended-keys\"),\n\t\trunTmuxShow(\"extended-keys-format\"),\n\t]);\n\n\t// If we couldn't query tmux (timeout, sandbox, etc.), don't warn\n\tif (extendedKeys === undefined) return undefined;\n\n\tif (extendedKeys !== \"on\" && extendedKeys !== \"always\") {\n\t\treturn \"tmux extended-keys is off. Modified Enter keys may not work. Add `set -g extended-keys on` to ~/.tmux.conf and restart tmux.\";\n\t}\n\n\tif (extendedKeysFormat === \"xterm\") {\n\t\treturn \"tmux extended-keys-format is xterm. Pi works best with csi-u. Add `set -g extended-keys-format csi-u` to ~/.tmux.conf and restart tmux.\";\n\t}\n\n\treturn undefined;\n}\n\nexport function formatUpdateAvailableNotice(newVersion: string): string {\n\treturn (\n\t\t`${theme.bold(theme.fg(\"accent\", \"Update available:\"))} ` +\n\t\t`${theme.fg(\"muted\", `v${newVersion}. Run `)}${theme.fg(\"accent\", \"/update\")}`\n\t);\n}\n\nexport function formatPackageUpdateNotice(packages: string[]): string {\n\tconst packageList = packages.join(\", \");\n\treturn (\n\t\t`${theme.bold(theme.fg(\"warning\", \"Package updates available:\"))} ` +\n\t\t`${theme.fg(\"muted\", `${packageList}. Run `)}${theme.fg(\"accent\", \"/update --extensions\")}`\n\t);\n}\n\nexport function formatTmuxWarningNotice(message: string): string {\n\treturn theme.fg(\"warning\", `⚠ ${message}`);\n}\n"]}
1
+ {"version":3,"file":"startup-notices.d.ts","sourceRoot":"","sources":["../../../src/modes/shared/startup-notices.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAItE,MAAM,WAAW,cAAc;IAC9B,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,yBAAyB;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,eAAe,CAAC;CACjC;AAED,mEAAmE;AACnE,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,cAAc,CAAC,CAOtG;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACrD,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,eAAe,CAAC;CACjC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgBpB;AAED,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA6C1E;AAED,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAKtE;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAMpE;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE/D","sourcesContent":["/**\n * Global, environment-scoped startup notices (app update, extension updates, tmux setup).\n *\n * These are not tied to any single conversation, so they are surfaced on the agents\n * view rather than appended to a session's chat stream. The checks and styled\n * formatters live here so both the agents view and the interactive fallback render\n * identical wording.\n */\n\nimport { spawn } from \"node:child_process\";\nimport { DefaultPackageManager } from \"../../core/package-manager.js\";\nimport type { SettingsManager } from \"../../core/settings-manager.js\";\nimport { checkForNewPiVersion } from \"../../utils/version-check.js\";\nimport { theme } from \"../interactive/theme/theme.js\";\n\nexport interface StartupNotices {\n\t/** Newer Prime Agent version available, if any. */\n\tnewVersion?: string;\n\t/** Display names of extensions with available updates. */\n\tpackageUpdates: string[];\n\t/** tmux keyboard setup warning, if the current tmux config is suboptimal. */\n\ttmuxWarning?: string;\n}\n\nexport interface StartupNoticeCheckOptions {\n\tversion: string;\n\tcwd: string;\n\tagentDir: string;\n\tsettingsManager: SettingsManager;\n}\n\n/** Run every startup check in parallel and collect the results. */\nexport async function gatherStartupNotices(options: StartupNoticeCheckOptions): Promise<StartupNotices> {\n\tconst [newVersion, packageUpdates, tmuxWarning] = await Promise.all([\n\t\tcheckForNewPiVersion(options.version),\n\t\tcheckForPackageUpdates(options),\n\t\tcheckTmuxKeyboardSetup(),\n\t]);\n\treturn { newVersion, packageUpdates, tmuxWarning };\n}\n\nexport async function checkForPackageUpdates(options: {\n\tcwd: string;\n\tagentDir: string;\n\tsettingsManager: SettingsManager;\n}): Promise<string[]> {\n\tif (process.env.BASE_CONTEXT_OFFLINE) {\n\t\treturn [];\n\t}\n\n\ttry {\n\t\tconst packageManager = new DefaultPackageManager({\n\t\t\tcwd: options.cwd,\n\t\t\tagentDir: options.agentDir,\n\t\t\tsettingsManager: options.settingsManager,\n\t\t});\n\t\tconst updates = await packageManager.checkForAvailableUpdates();\n\t\treturn updates.map((update) => update.displayName);\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nexport async function checkTmuxKeyboardSetup(): Promise<string | undefined> {\n\tif (!process.env.TMUX) return undefined;\n\n\tconst runTmuxShow = (option: string): Promise<string | undefined> => {\n\t\treturn new Promise((resolve) => {\n\t\t\tconst proc = spawn(\"tmux\", [\"show\", \"-gv\", option], {\n\t\t\t\tstdio: [\"ignore\", \"pipe\", \"ignore\"],\n\t\t\t});\n\t\t\tlet stdout = \"\";\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tproc.kill();\n\t\t\t\tresolve(undefined);\n\t\t\t}, 2000);\n\n\t\t\tproc.stdout?.on(\"data\", (data) => {\n\t\t\t\tstdout += data.toString();\n\t\t\t});\n\t\t\tproc.on(\"error\", () => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tresolve(undefined);\n\t\t\t});\n\t\t\tproc.on(\"close\", (code) => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tresolve(code === 0 ? stdout.trim() : undefined);\n\t\t\t});\n\t\t});\n\t};\n\n\tconst [extendedKeys, extendedKeysFormat] = await Promise.all([\n\t\trunTmuxShow(\"extended-keys\"),\n\t\trunTmuxShow(\"extended-keys-format\"),\n\t]);\n\n\t// If we couldn't query tmux (timeout, sandbox, etc.), don't warn\n\tif (extendedKeys === undefined) return undefined;\n\n\tif (extendedKeys !== \"on\" && extendedKeys !== \"always\") {\n\t\treturn \"tmux extended-keys is off. Modified Enter keys may not work. Add `set -g extended-keys on` to ~/.tmux.conf and restart tmux.\";\n\t}\n\n\tif (extendedKeysFormat === \"xterm\") {\n\t\treturn \"tmux extended-keys-format is xterm. base-context works best with csi-u. Add `set -g extended-keys-format csi-u` to ~/.tmux.conf and restart tmux.\";\n\t}\n\n\treturn undefined;\n}\n\nexport function formatUpdateAvailableNotice(newVersion: string): string {\n\treturn (\n\t\t`${theme.bold(theme.fg(\"accent\", \"Update available:\"))} ` +\n\t\t`${theme.fg(\"muted\", `v${newVersion}. Run `)}${theme.fg(\"accent\", \"/update\")}`\n\t);\n}\n\nexport function formatPackageUpdateNotice(packages: string[]): string {\n\tconst packageList = packages.join(\", \");\n\treturn (\n\t\t`${theme.bold(theme.fg(\"warning\", \"Package updates available:\"))} ` +\n\t\t`${theme.fg(\"muted\", `${packageList}. Run `)}${theme.fg(\"accent\", \"/update --extensions\")}`\n\t);\n}\n\nexport function formatTmuxWarningNotice(message: string): string {\n\treturn theme.fg(\"warning\", `⚠ ${message}`);\n}\n"]}
@@ -73,7 +73,7 @@ export async function checkTmuxKeyboardSetup() {
73
73
  return "tmux extended-keys is off. Modified Enter keys may not work. Add `set -g extended-keys on` to ~/.tmux.conf and restart tmux.";
74
74
  }
75
75
  if (extendedKeysFormat === "xterm") {
76
- return "tmux extended-keys-format is xterm. Pi works best with csi-u. Add `set -g extended-keys-format csi-u` to ~/.tmux.conf and restart tmux.";
76
+ return "tmux extended-keys-format is xterm. base-context works best with csi-u. Add `set -g extended-keys-format csi-u` to ~/.tmux.conf and restart tmux.";
77
77
  }
78
78
  return undefined;
79
79
  }
@@ -1 +1 @@
1
- {"version":3,"file":"startup-notices.js","sourceRoot":"","sources":["../../../src/modes/shared/startup-notices.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Global, environment-scoped startup notices (app update, extension updates, tmux setup).\n *\n * These are not tied to any single conversation, so they are surfaced on the agents\n * view rather than appended to a session's chat stream. The checks and styled\n * formatters live here so both the agents view and the interactive fallback render\n * identical wording.\n */\n\nimport { spawn } from \"node:child_process\";\nimport { DefaultPackageManager } from \"../../core/package-manager.js\";\nimport type { SettingsManager } from \"../../core/settings-manager.js\";\nimport { checkForNewPiVersion } from \"../../utils/version-check.js\";\nimport { theme } from \"../interactive/theme/theme.js\";\n\nexport interface StartupNotices {\n\t/** Newer Prime Agent version available, if any. */\n\tnewVersion?: string;\n\t/** Display names of extensions with available updates. */\n\tpackageUpdates: string[];\n\t/** tmux keyboard setup warning, if the current tmux config is suboptimal. */\n\ttmuxWarning?: string;\n}\n\nexport interface StartupNoticeCheckOptions {\n\tversion: string;\n\tcwd: string;\n\tagentDir: string;\n\tsettingsManager: SettingsManager;\n}\n\n/** Run every startup check in parallel and collect the results. */\nexport async function gatherStartupNotices(options: StartupNoticeCheckOptions): Promise<StartupNotices> {\n\tconst [newVersion, packageUpdates, tmuxWarning] = await Promise.all([\n\t\tcheckForNewPiVersion(options.version),\n\t\tcheckForPackageUpdates(options),\n\t\tcheckTmuxKeyboardSetup(),\n\t]);\n\treturn { newVersion, packageUpdates, tmuxWarning };\n}\n\nexport async function checkForPackageUpdates(options: {\n\tcwd: string;\n\tagentDir: string;\n\tsettingsManager: SettingsManager;\n}): Promise<string[]> {\n\tif (process.env.BASE_CONTEXT_OFFLINE) {\n\t\treturn [];\n\t}\n\n\ttry {\n\t\tconst packageManager = new DefaultPackageManager({\n\t\t\tcwd: options.cwd,\n\t\t\tagentDir: options.agentDir,\n\t\t\tsettingsManager: options.settingsManager,\n\t\t});\n\t\tconst updates = await packageManager.checkForAvailableUpdates();\n\t\treturn updates.map((update) => update.displayName);\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nexport async function checkTmuxKeyboardSetup(): Promise<string | undefined> {\n\tif (!process.env.TMUX) return undefined;\n\n\tconst runTmuxShow = (option: string): Promise<string | undefined> => {\n\t\treturn new Promise((resolve) => {\n\t\t\tconst proc = spawn(\"tmux\", [\"show\", \"-gv\", option], {\n\t\t\t\tstdio: [\"ignore\", \"pipe\", \"ignore\"],\n\t\t\t});\n\t\t\tlet stdout = \"\";\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tproc.kill();\n\t\t\t\tresolve(undefined);\n\t\t\t}, 2000);\n\n\t\t\tproc.stdout?.on(\"data\", (data) => {\n\t\t\t\tstdout += data.toString();\n\t\t\t});\n\t\t\tproc.on(\"error\", () => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tresolve(undefined);\n\t\t\t});\n\t\t\tproc.on(\"close\", (code) => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tresolve(code === 0 ? stdout.trim() : undefined);\n\t\t\t});\n\t\t});\n\t};\n\n\tconst [extendedKeys, extendedKeysFormat] = await Promise.all([\n\t\trunTmuxShow(\"extended-keys\"),\n\t\trunTmuxShow(\"extended-keys-format\"),\n\t]);\n\n\t// If we couldn't query tmux (timeout, sandbox, etc.), don't warn\n\tif (extendedKeys === undefined) return undefined;\n\n\tif (extendedKeys !== \"on\" && extendedKeys !== \"always\") {\n\t\treturn \"tmux extended-keys is off. Modified Enter keys may not work. Add `set -g extended-keys on` to ~/.tmux.conf and restart tmux.\";\n\t}\n\n\tif (extendedKeysFormat === \"xterm\") {\n\t\treturn \"tmux extended-keys-format is xterm. Pi works best with csi-u. Add `set -g extended-keys-format csi-u` to ~/.tmux.conf and restart tmux.\";\n\t}\n\n\treturn undefined;\n}\n\nexport function formatUpdateAvailableNotice(newVersion: string): string {\n\treturn (\n\t\t`${theme.bold(theme.fg(\"accent\", \"Update available:\"))} ` +\n\t\t`${theme.fg(\"muted\", `v${newVersion}. Run `)}${theme.fg(\"accent\", \"/update\")}`\n\t);\n}\n\nexport function formatPackageUpdateNotice(packages: string[]): string {\n\tconst packageList = packages.join(\", \");\n\treturn (\n\t\t`${theme.bold(theme.fg(\"warning\", \"Package updates available:\"))} ` +\n\t\t`${theme.fg(\"muted\", `${packageList}. Run `)}${theme.fg(\"accent\", \"/update --extensions\")}`\n\t);\n}\n\nexport function formatTmuxWarningNotice(message: string): string {\n\treturn theme.fg(\"warning\", `⚠ ${message}`);\n}\n"]}
1
+ {"version":3,"file":"startup-notices.js","sourceRoot":"","sources":["../../../src/modes/shared/startup-notices.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Global, environment-scoped startup notices (app update, extension updates, tmux setup).\n *\n * These are not tied to any single conversation, so they are surfaced on the agents\n * view rather than appended to a session's chat stream. The checks and styled\n * formatters live here so both the agents view and the interactive fallback render\n * identical wording.\n */\n\nimport { spawn } from \"node:child_process\";\nimport { DefaultPackageManager } from \"../../core/package-manager.js\";\nimport type { SettingsManager } from \"../../core/settings-manager.js\";\nimport { checkForNewPiVersion } from \"../../utils/version-check.js\";\nimport { theme } from \"../interactive/theme/theme.js\";\n\nexport interface StartupNotices {\n\t/** Newer Prime Agent version available, if any. */\n\tnewVersion?: string;\n\t/** Display names of extensions with available updates. */\n\tpackageUpdates: string[];\n\t/** tmux keyboard setup warning, if the current tmux config is suboptimal. */\n\ttmuxWarning?: string;\n}\n\nexport interface StartupNoticeCheckOptions {\n\tversion: string;\n\tcwd: string;\n\tagentDir: string;\n\tsettingsManager: SettingsManager;\n}\n\n/** Run every startup check in parallel and collect the results. */\nexport async function gatherStartupNotices(options: StartupNoticeCheckOptions): Promise<StartupNotices> {\n\tconst [newVersion, packageUpdates, tmuxWarning] = await Promise.all([\n\t\tcheckForNewPiVersion(options.version),\n\t\tcheckForPackageUpdates(options),\n\t\tcheckTmuxKeyboardSetup(),\n\t]);\n\treturn { newVersion, packageUpdates, tmuxWarning };\n}\n\nexport async function checkForPackageUpdates(options: {\n\tcwd: string;\n\tagentDir: string;\n\tsettingsManager: SettingsManager;\n}): Promise<string[]> {\n\tif (process.env.BASE_CONTEXT_OFFLINE) {\n\t\treturn [];\n\t}\n\n\ttry {\n\t\tconst packageManager = new DefaultPackageManager({\n\t\t\tcwd: options.cwd,\n\t\t\tagentDir: options.agentDir,\n\t\t\tsettingsManager: options.settingsManager,\n\t\t});\n\t\tconst updates = await packageManager.checkForAvailableUpdates();\n\t\treturn updates.map((update) => update.displayName);\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nexport async function checkTmuxKeyboardSetup(): Promise<string | undefined> {\n\tif (!process.env.TMUX) return undefined;\n\n\tconst runTmuxShow = (option: string): Promise<string | undefined> => {\n\t\treturn new Promise((resolve) => {\n\t\t\tconst proc = spawn(\"tmux\", [\"show\", \"-gv\", option], {\n\t\t\t\tstdio: [\"ignore\", \"pipe\", \"ignore\"],\n\t\t\t});\n\t\t\tlet stdout = \"\";\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tproc.kill();\n\t\t\t\tresolve(undefined);\n\t\t\t}, 2000);\n\n\t\t\tproc.stdout?.on(\"data\", (data) => {\n\t\t\t\tstdout += data.toString();\n\t\t\t});\n\t\t\tproc.on(\"error\", () => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tresolve(undefined);\n\t\t\t});\n\t\t\tproc.on(\"close\", (code) => {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tresolve(code === 0 ? stdout.trim() : undefined);\n\t\t\t});\n\t\t});\n\t};\n\n\tconst [extendedKeys, extendedKeysFormat] = await Promise.all([\n\t\trunTmuxShow(\"extended-keys\"),\n\t\trunTmuxShow(\"extended-keys-format\"),\n\t]);\n\n\t// If we couldn't query tmux (timeout, sandbox, etc.), don't warn\n\tif (extendedKeys === undefined) return undefined;\n\n\tif (extendedKeys !== \"on\" && extendedKeys !== \"always\") {\n\t\treturn \"tmux extended-keys is off. Modified Enter keys may not work. Add `set -g extended-keys on` to ~/.tmux.conf and restart tmux.\";\n\t}\n\n\tif (extendedKeysFormat === \"xterm\") {\n\t\treturn \"tmux extended-keys-format is xterm. base-context works best with csi-u. Add `set -g extended-keys-format csi-u` to ~/.tmux.conf and restart tmux.\";\n\t}\n\n\treturn undefined;\n}\n\nexport function formatUpdateAvailableNotice(newVersion: string): string {\n\treturn (\n\t\t`${theme.bold(theme.fg(\"accent\", \"Update available:\"))} ` +\n\t\t`${theme.fg(\"muted\", `v${newVersion}. Run `)}${theme.fg(\"accent\", \"/update\")}`\n\t);\n}\n\nexport function formatPackageUpdateNotice(packages: string[]): string {\n\tconst packageList = packages.join(\", \");\n\treturn (\n\t\t`${theme.bold(theme.fg(\"warning\", \"Package updates available:\"))} ` +\n\t\t`${theme.fg(\"muted\", `${packageList}. Run `)}${theme.fg(\"accent\", \"/update --extensions\")}`\n\t);\n}\n\nexport function formatTmuxWarningNotice(message: string): string {\n\treturn theme.fg(\"warning\", `⚠ ${message}`);\n}\n"]}
@@ -0,0 +1,3 @@
1
+ /** Synerise wordmark for the base-context startup header. */
2
+ export declare const SYNERISE_LOGO = " #### # # # # ##### #### ##### #### #####\n# # # ## # # # # # # #\n ### # # # # #### #### # ### ####\n # # # ## # # # # # #\n#### # # # ##### # # ##### #### #####\n\nSynerise base-context";
3
+ //# sourceMappingURL=synerise-logo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synerise-logo.d.ts","sourceRoot":"","sources":["../../src/themes/synerise-logo.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,eAAO,MAAM,aAAa,wQAMJ,CAAC","sourcesContent":["/** Synerise wordmark for the base-context startup header. */\nexport const SYNERISE_LOGO = ` #### # # # # ##### #### ##### #### #####\n# # # ## # # # # # # #\n ### # # # # #### #### # ### ####\n # # # ## # # # # # #\n#### # # # ##### # # ##### #### #####\n\nSynerise base-context`;\n"]}
@@ -0,0 +1,9 @@
1
+ /** Synerise wordmark for the base-context startup header. */
2
+ export const SYNERISE_LOGO = ` #### # # # # ##### #### ##### #### #####
3
+ # # # ## # # # # # # #
4
+ ### # # # # #### #### # ### ####
5
+ # # # ## # # # # # #
6
+ #### # # # ##### # # ##### #### #####
7
+
8
+ Synerise base-context`;
9
+ //# sourceMappingURL=synerise-logo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synerise-logo.js","sourceRoot":"","sources":["../../src/themes/synerise-logo.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;sBAMP,CAAC","sourcesContent":["/** Synerise wordmark for the base-context startup header. */\nexport const SYNERISE_LOGO = ` #### # # # # ##### #### ##### #### #####\n# # # ## # # # # # # #\n ### # # # # #### #### # ### ####\n # # # ## # # # # # #\n#### # # # ##### # # ##### #### #####\n\nSynerise base-context`;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ponythewhite/base-context",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "Synerise base-context: a coding and research agent with durable context and a persistent Python REPL",
5
5
  "type": "module",
6
6
  "bin": {
@@ -29,8 +29,8 @@
29
29
  "dev": "tsgo -p tsconfig.build.json --watch --preserveWatchOutput",
30
30
  "build": "tsgo -p tsconfig.build.json && shx chmod +x dist/cli.js && npm run copy-assets && npm run bundle",
31
31
  "build:binary": "npm --prefix ../.. run build:source && bun build --compile ./dist/bun/cli.js --outfile dist/base-context && npm run copy-binary-assets",
32
- "copy-assets": "shx mkdir -p dist/modes/interactive/theme && shx cp src/modes/interactive/theme/*.json dist/modes/interactive/theme/ && shx mkdir -p dist/modes/interactive/assets && shx cp src/modes/interactive/assets/*.png dist/modes/interactive/assets/ && shx mkdir -p dist/core/export-html/vendor && shx cp src/core/export-html/template.html src/core/export-html/template.css src/core/export-html/template.js dist/core/export-html/ && shx cp src/core/export-html/vendor/*.js dist/core/export-html/vendor/ && node scripts/copy-runtime.mjs && shx rm -rf dist/skills && shx cp -r skills dist/skills",
33
- "copy-binary-assets": "shx cp package.json dist/ && shx cp README.md dist/ && shx cp CHANGELOG.md dist/ && shx mkdir -p dist/theme && shx cp src/modes/interactive/theme/*.json dist/theme/ && shx mkdir -p dist/assets && shx cp src/modes/interactive/assets/*.png dist/assets/ && shx mkdir -p dist/export-html/vendor && shx cp src/core/export-html/template.html dist/export-html/ && shx cp src/core/export-html/vendor/*.js dist/export-html/vendor/ && shx cp -r docs dist/ && shx cp -r examples dist/ && shx cp ../../node_modules/@silvia-odwyer/photon-node/photon_rs_bg.wasm dist/ && shx rm -rf dist/skills && shx cp -r skills dist/skills",
32
+ "copy-assets": "shx mkdir -p dist/modes/interactive/theme && shx cp src/modes/interactive/theme/*.json dist/modes/interactive/theme/ && shx mkdir -p dist/core/export-html/vendor && shx cp src/core/export-html/template.html src/core/export-html/template.css src/core/export-html/template.js dist/core/export-html/ && shx cp src/core/export-html/vendor/*.js dist/core/export-html/vendor/ && node scripts/copy-runtime.mjs && shx rm -rf dist/skills && shx cp -r skills dist/skills",
33
+ "copy-binary-assets": "shx cp package.json dist/ && shx cp README.md dist/ && shx cp CHANGELOG.md dist/ && shx mkdir -p dist/theme && shx cp src/modes/interactive/theme/*.json dist/theme/ && shx mkdir -p dist/export-html/vendor && shx cp src/core/export-html/template.html dist/export-html/ && shx cp src/core/export-html/vendor/*.js dist/export-html/vendor/ && shx cp -r docs dist/ && shx cp -r examples dist/ && shx cp ../../node_modules/@silvia-odwyer/photon-node/photon_rs_bg.wasm dist/ && shx rm -rf dist/skills && shx cp -r skills dist/skills",
34
34
  "test": "vitest --run",
35
35
  "test:ci": "tsx src/core/kernel/bootstrap-cli.ts && vitest --run --exclude test/daemon-supervisor-process.test.ts",
36
36
  "test:process": "vitest --run test/daemon-supervisor-process.test.ts",
@@ -42,9 +42,9 @@
42
42
  },
43
43
  "dependencies": {
44
44
  "@agentclientprotocol/sdk": "^1.3.0",
45
- "@ponythewhite/base-context-agent": "1.0.4",
46
- "@ponythewhite/base-context-ai": "1.0.4",
47
- "@ponythewhite/base-context-tui": "1.0.4",
45
+ "@ponythewhite/base-context-agent": "1.0.6",
46
+ "@ponythewhite/base-context-ai": "1.0.6",
47
+ "@ponythewhite/base-context-tui": "1.0.6",
48
48
  "@silvia-odwyer/photon-node": "^0.3.4",
49
49
  "chalk": "^5.5.0",
50
50
  "cli-highlight": "^2.1.11",
@@ -1,5 +0,0 @@
1
- import { Container } from "@ponythewhite/base-context-tui";
2
- export declare class EarendilAnnouncementComponent extends Container {
3
- constructor();
4
- }
5
- //# sourceMappingURL=earendil-announcement.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"earendil-announcement.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/earendil-announcement.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAuB,MAAM,gCAAgC,CAAC;AAyBhF,qBAAa,6BAA8B,SAAQ,SAAS;IAC3D,cAwBC;CACD","sourcesContent":["import * as fs from \"node:fs\";\nimport { Container, Image, Spacer, Text } from \"@ponythewhite/base-context-tui\";\nimport { getBundledInteractiveAssetPath } from \"../../../config.js\";\nimport { theme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\n\nconst BLOG_URL = \"https://mariozechner.at/posts/2026-04-08-ive-sold-out/\";\nconst IMAGE_FILENAME = \"clankolas.png\";\n\nlet cachedImageBase64: string | undefined;\nlet attemptedImageLoad = false;\n\nfunction loadImageBase64(): string | undefined {\n\tif (attemptedImageLoad) {\n\t\treturn cachedImageBase64;\n\t}\n\n\tattemptedImageLoad = true;\n\ttry {\n\t\tcachedImageBase64 = fs.readFileSync(getBundledInteractiveAssetPath(IMAGE_FILENAME)).toString(\"base64\");\n\t} catch {\n\t\tcachedImageBase64 = undefined;\n\t}\n\treturn cachedImageBase64;\n}\n\nexport class EarendilAnnouncementComponent extends Container {\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.addChild(new DynamicBorder((text) => theme.fg(\"accent\", text)));\n\t\tthis.addChild(new Text(theme.bold(theme.fg(\"accent\", \"pi has joined Earendil\")), 1, 0));\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"muted\", \"Read the blog post:\"), 1, 0));\n\t\tthis.addChild(new Text(theme.fg(\"mdLink\", BLOG_URL), 1, 0));\n\t\tthis.addChild(new Spacer(1));\n\n\t\tconst imageBase64 = loadImageBase64();\n\t\tif (imageBase64) {\n\t\t\tthis.addChild(\n\t\t\t\tnew Image(\n\t\t\t\t\timageBase64,\n\t\t\t\t\t\"image/png\",\n\t\t\t\t\t{ fallbackColor: (text) => theme.fg(\"muted\", text) },\n\t\t\t\t\t{ maxWidthCells: 56, filename: IMAGE_FILENAME, fallbackOnly: true },\n\t\t\t\t),\n\t\t\t);\n\t\t\tthis.addChild(new Spacer(1));\n\t\t}\n\n\t\tthis.addChild(new DynamicBorder((text) => theme.fg(\"accent\", text)));\n\t}\n}\n"]}
@@ -1,40 +0,0 @@
1
- import * as fs from "node:fs";
2
- import { Container, Image, Spacer, Text } from "@ponythewhite/base-context-tui";
3
- import { getBundledInteractiveAssetPath } from "../../../config.js";
4
- import { theme } from "../theme/theme.js";
5
- import { DynamicBorder } from "./dynamic-border.js";
6
- const BLOG_URL = "https://mariozechner.at/posts/2026-04-08-ive-sold-out/";
7
- const IMAGE_FILENAME = "clankolas.png";
8
- let cachedImageBase64;
9
- let attemptedImageLoad = false;
10
- function loadImageBase64() {
11
- if (attemptedImageLoad) {
12
- return cachedImageBase64;
13
- }
14
- attemptedImageLoad = true;
15
- try {
16
- cachedImageBase64 = fs.readFileSync(getBundledInteractiveAssetPath(IMAGE_FILENAME)).toString("base64");
17
- }
18
- catch {
19
- cachedImageBase64 = undefined;
20
- }
21
- return cachedImageBase64;
22
- }
23
- export class EarendilAnnouncementComponent extends Container {
24
- constructor() {
25
- super();
26
- this.addChild(new DynamicBorder((text) => theme.fg("accent", text)));
27
- this.addChild(new Text(theme.bold(theme.fg("accent", "pi has joined Earendil")), 1, 0));
28
- this.addChild(new Spacer(1));
29
- this.addChild(new Text(theme.fg("muted", "Read the blog post:"), 1, 0));
30
- this.addChild(new Text(theme.fg("mdLink", BLOG_URL), 1, 0));
31
- this.addChild(new Spacer(1));
32
- const imageBase64 = loadImageBase64();
33
- if (imageBase64) {
34
- this.addChild(new Image(imageBase64, "image/png", { fallbackColor: (text) => theme.fg("muted", text) }, { maxWidthCells: 56, filename: IMAGE_FILENAME, fallbackOnly: true }));
35
- this.addChild(new Spacer(1));
36
- }
37
- this.addChild(new DynamicBorder((text) => theme.fg("accent", text)));
38
- }
39
- }
40
- //# sourceMappingURL=earendil-announcement.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"earendil-announcement.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/earendil-announcement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,QAAQ,GAAG,wDAAwD,CAAC;AAC1E,MAAM,cAAc,GAAG,eAAe,CAAC;AAEvC,IAAI,iBAAqC,CAAC;AAC1C,IAAI,kBAAkB,GAAG,KAAK,CAAC;AAE/B,SAAS,eAAe,GAAuB;IAC9C,IAAI,kBAAkB,EAAE,CAAC;QACxB,OAAO,iBAAiB,CAAC;IAC1B,CAAC;IAED,kBAAkB,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC;QACJ,iBAAiB,GAAG,EAAE,CAAC,YAAY,CAAC,8BAA8B,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACxG,CAAC;IAAC,MAAM,CAAC;QACR,iBAAiB,GAAG,SAAS,CAAC;IAC/B,CAAC;IACD,OAAO,iBAAiB,CAAC;AAAA,CACzB;AAED,MAAM,OAAO,6BAA8B,SAAQ,SAAS;IAC3D,cAAc;QACb,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxF,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7B,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;QACtC,IAAI,WAAW,EAAE,CAAC;YACjB,IAAI,CAAC,QAAQ,CACZ,IAAI,KAAK,CACR,WAAW,EACX,WAAW,EACX,EAAE,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,EACpD,EAAE,aAAa,EAAE,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,IAAI,EAAE,CACnE,CACD,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAAA,CACrE;CACD","sourcesContent":["import * as fs from \"node:fs\";\nimport { Container, Image, Spacer, Text } from \"@ponythewhite/base-context-tui\";\nimport { getBundledInteractiveAssetPath } from \"../../../config.js\";\nimport { theme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\n\nconst BLOG_URL = \"https://mariozechner.at/posts/2026-04-08-ive-sold-out/\";\nconst IMAGE_FILENAME = \"clankolas.png\";\n\nlet cachedImageBase64: string | undefined;\nlet attemptedImageLoad = false;\n\nfunction loadImageBase64(): string | undefined {\n\tif (attemptedImageLoad) {\n\t\treturn cachedImageBase64;\n\t}\n\n\tattemptedImageLoad = true;\n\ttry {\n\t\tcachedImageBase64 = fs.readFileSync(getBundledInteractiveAssetPath(IMAGE_FILENAME)).toString(\"base64\");\n\t} catch {\n\t\tcachedImageBase64 = undefined;\n\t}\n\treturn cachedImageBase64;\n}\n\nexport class EarendilAnnouncementComponent extends Container {\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.addChild(new DynamicBorder((text) => theme.fg(\"accent\", text)));\n\t\tthis.addChild(new Text(theme.bold(theme.fg(\"accent\", \"pi has joined Earendil\")), 1, 0));\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"muted\", \"Read the blog post:\"), 1, 0));\n\t\tthis.addChild(new Text(theme.fg(\"mdLink\", BLOG_URL), 1, 0));\n\t\tthis.addChild(new Spacer(1));\n\n\t\tconst imageBase64 = loadImageBase64();\n\t\tif (imageBase64) {\n\t\t\tthis.addChild(\n\t\t\t\tnew Image(\n\t\t\t\t\timageBase64,\n\t\t\t\t\t\"image/png\",\n\t\t\t\t\t{ fallbackColor: (text) => theme.fg(\"muted\", text) },\n\t\t\t\t\t{ maxWidthCells: 56, filename: IMAGE_FILENAME, fallbackOnly: true },\n\t\t\t\t),\n\t\t\t);\n\t\t\tthis.addChild(new Spacer(1));\n\t\t}\n\n\t\tthis.addChild(new DynamicBorder((text) => theme.fg(\"accent\", text)));\n\t}\n}\n"]}
@@ -1,9 +0,0 @@
1
- /**
2
- * Pre-rendered ASCII versions of the Prime butterfly mark.
3
- *
4
- * Source: assets/brand/prime-butterfly.svg
5
- * Re-render at any width: `uv run scripts/render-logo.py --width N`
6
- */
7
- /** ~10 rows × 32 cols. The default brand mark — half-block butterfly, splash-ready. */
8
- export declare const PRIME_BUTTERFLY_LOGO = " \u2584\u2584\u2588\u2588\u2588\u2580\n \u2584\u2584\u2584\u2584\u2584 \u2584\u2588\u2588\u2588\u2588\u2588\u2580\n \u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2584\u2588\u2588\u2588\u2588\u2588\u2588\u2580\n \u2584\u2588\u2588\u2588\u2580\u2588\u2588\u2588\u2584 \u2584\u2588\u2588\u2588\u2580\u2584\u2588\u2588\u2580\n \u2588\u2588\u2588 \u2584\u2588\u2588\u2588\u2588\u2584\u2584\u2584\u2588\u2588\u2588\u2588\u2580\u2584\u2584\u2588\u2588\n \u2580\u2588\u2588 \u2580\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2580\u2580\u2580\u2580\u2580\u2580\n \u2584\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2580\u2580 \u2584\u2588\u2588\u2588\n \u2588\u2588\u2588\u2588\u2588 \u2580\u2588\u2584\u2584\u2584\u2588\u2588\u2588\u2588\u2588\u2580\n\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2584 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2580\n\u2580\u2588\u2588\u2588\u2580\u2580 \u2588\u2588\u2588\u2588\u2588\u2580";
9
- //# sourceMappingURL=prime-logo.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prime-logo.d.ts","sourceRoot":"","sources":["../../src/themes/prime-logo.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,0FAAuF;AACvF,eAAO,MAAM,oBAAoB,q/BAShB,CAAC","sourcesContent":["/**\n * Pre-rendered ASCII versions of the Prime butterfly mark.\n *\n * Source: assets/brand/prime-butterfly.svg\n * Re-render at any width: `uv run scripts/render-logo.py --width N`\n */\n\n/** ~10 rows × 32 cols. The default brand mark — half-block butterfly, splash-ready. */\nexport const PRIME_BUTTERFLY_LOGO = ` ▄▄███▀\n ▄▄▄▄▄ ▄█████▀\n ██████▄ ▄██████▀\n ▄███▀███▄ ▄███▀▄██▀\n ███ ▄████▄▄▄████▀▄▄██\n ▀██ ▀█████████▀▀▀▀▀▀\n ▄██ ██████▀▀ ▄███\n █████ ▀█▄▄▄█████▀\n███████▄ ████████▀\n▀███▀▀ █████▀`;\n"]}
@@ -1,18 +0,0 @@
1
- /**
2
- * Pre-rendered ASCII versions of the Prime butterfly mark.
3
- *
4
- * Source: assets/brand/prime-butterfly.svg
5
- * Re-render at any width: `uv run scripts/render-logo.py --width N`
6
- */
7
- /** ~10 rows × 32 cols. The default brand mark — half-block butterfly, splash-ready. */
8
- export const PRIME_BUTTERFLY_LOGO = ` ▄▄███▀
9
- ▄▄▄▄▄ ▄█████▀
10
- ██████▄ ▄██████▀
11
- ▄███▀███▄ ▄███▀▄██▀
12
- ███ ▄████▄▄▄████▀▄▄██
13
- ▀██ ▀█████████▀▀▀▀▀▀
14
- ▄██ ██████▀▀ ▄███
15
- █████ ▀█▄▄▄█████▀
16
- ███████▄ ████████▀
17
- ▀███▀▀ █████▀`;
18
- //# sourceMappingURL=prime-logo.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prime-logo.js","sourceRoot":"","sources":["../../src/themes/prime-logo.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,0FAAuF;AACvF,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;yCASnB,CAAC","sourcesContent":["/**\n * Pre-rendered ASCII versions of the Prime butterfly mark.\n *\n * Source: assets/brand/prime-butterfly.svg\n * Re-render at any width: `uv run scripts/render-logo.py --width N`\n */\n\n/** ~10 rows × 32 cols. The default brand mark — half-block butterfly, splash-ready. */\nexport const PRIME_BUTTERFLY_LOGO = ` ▄▄███▀\n ▄▄▄▄▄ ▄█████▀\n ██████▄ ▄██████▀\n ▄███▀███▄ ▄███▀▄██▀\n ███ ▄████▄▄▄████▀▄▄██\n ▀██ ▀█████████▀▀▀▀▀▀\n ▄██ ██████▀▀ ▄███\n █████ ▀█▄▄▄█████▀\n███████▄ ████████▀\n▀███▀▀ █████▀`;\n"]}