Running formatting, linting, and type checking...

> pi-monorepo@0.0.3 check
> biome check --write . && npm run check --workspaces --if-present && tsgo --noEmit

Checked 284 files in 157ms. No fixes applied.

> @mariozechner/pi-agent-core@0.27.2 check
> tsgo --noEmit

> @mariozechner/pi-ai@0.27.2 check
> biome check --write . && tsgo --noEmit

Checked 44 files in 42ms. No fixes applied.

> @mariozechner/pi-coding-agent@0.27.2 check
> tsgo --noEmit && tsgo -p tsconfig.examples.json

> @mariozechner/pi-mom@0.27.2 check
> biome check --write . && tsgo --noEmit

Checked 16 files in 17ms. No fixes applied.

> @mariozechner/pi@0.27.2 check
> biome check --write .

Checked 10 files in 18ms. No fixes applied.

> @mariozechner/pi-proxy@0.27.2 check
> biome check --write .

Checked 3 files in 4ms. No fixes applied.

> @mariozechner/pi-tui@0.27.2 check
> biome check --write . && tsgo --noEmit

Checked 27 files in 26ms. No fixes applied.

> @mariozechner/pi-web-ui@0.27.2 check
> tsgo --noEmit && cd example && tsgo --noEmit

> pi-web-ui-example@1.15.2 check
> tsgo --noEmit

✅ All pre-commit checks passed!
[main 81b10f2] List all provider keys in README settings example
 2 files changed, 21 insertions(+), 14 deletions(-)
To https://github.com/badlogic/pi-mono.git
   541758f..81b10f2  main -> main


Done.


alright, open a new issue "Untangle OAuth/API key mess" with label coding-agent, and describe the curernt mess, what problems it has (global state), and a possible concise, simple refactor


bash

cd /Users/badlogic/workspaces/pi-mono && gh issue create --title "Untangle OAuth/API key mess" --label "pkg:coding-agent" --body '## Current State

API key resolution is scattered across multiple layers with global state:

1. **`@mariozechner/pi-ai` (`stream.ts`)**: Global `apiKeys` Map + `setApiKey()`/`getApiKey()` + `resolveApiKey()` that checks OAuth
2. **`@mariozechner/pi-ai` (`oauth/storage.ts`)**: Global `currentBackend` for OAuth storage, configured via `setOAuthStorage()`
3. **`coding-agent` (`model-config.ts`)**: `getApiKeyForModel()` that checks custom providers, OAuth, then delegates to ai package
4. **`coding-agent` (`sdk.ts`)**: `defaultGetApiKey()` that checks settings.json first, then `getApiKeyForModel()`
5. **`coding-agent` (`agent-session.ts`)**: Injected `resolveApiKey` to use settings-aware resolver

## Problems

1. **Global state breaks multi-session**: If you call `createAgentSession()` multiple times with different `getApiKey` options, the global state in ai package is shared
2. **Inconsistent resolution**: Model discovery in `model-config.ts` uses `getApiKeyForModel()` directly, which does not check settings.json apiKeys (fixed partially by using `hasApiKey` helper in `sdk.ts`)
3. **OAuth storage is global**: `setOAuthStorage()` affects all sessions in the process
4. **Confusing layering**: Hard to understand which function checks what and in which order

## Proposed Refactor

1. **Remove global state from ai package**: `stream()`/`streamSimple()` should require explicit `apiKey` parameter, no fallback to global map or env vars
2. **Move all key resolution to coding-agent**: Create a single `ApiKeyResolver` class/interface that handles:
   - Settings.json apiKeys
   - Custom providers from models.json
   - OAuth credentials
   - Environment variables
3. **Pass resolver explicitly**: `createAgentSession()` creates the resolver, passes it to `AgentSession`, and uses it for model discovery
4. **OAuth storage per-session**: Pass storage backend to resolver instead of global `setOAuthStorage()`

This makes the ai package a pure streaming library with no global state, and consolidates all key resolution logic in coding-agent where it belongs.'


Done. Created issue #296 describing the current mess and proposed refactor.


ok, do a release


cd /Users/badlogic/workspaces/pi-mono && npm run version:patch


> pi-monorepo@0.0.3 version:patch
> npm version patch -ws --no-git-tag-version && node scripts/sync-versions.js && rm -rf node_modules packages/*/node_modules package-lock.json && npm install

@mariozechner/pi-agent-core
v0.27.3
@mariozechner/pi-ai
v0.27.3
@mariozechner/pi-coding-agent
v0.27.3
@mariozechner/pi-mom
v0.27.3
@mariozechner/pi
v0.27.3
@mariozechner/pi-proxy
v0.27.3
@mariozechner/pi-tui
v0.27.3
@mariozechner/pi-web-ui
v0.27.3
pi-web-ui-example
v1.15.3

added 19 packages, removed 14 packages, and changed 9 packages in 450ms

87 packages are looking for funding
  run `npm fund` for details
Current versions:
  @mariozechner/pi: 0.27.3
  @mariozechner/pi-agent-core: 0.27.3
  @mariozechner/pi-ai: 0.27.3
  @mariozechner/pi-coding-agent: 0.27.3
  @mariozechner/pi-mom: 0.27.3
  @mariozechner/pi-proxy: 0.27.3
  @mariozechner/pi-tui: 0.27.3
  @mariozechner/pi-web-ui: 0.27.3

✅ All packages at same version (lockstep)

@mariozechner/pi-agent-core:
  @mariozechner/pi-ai: ^0.27.2 → ^0.27.3

@mariozechner/pi-agent-core:
  @mariozechner/pi-tui: ^0.27.2 → ^0.27.3

@mariozechner/pi-coding-agent:
  @mariozechner/pi-agent-core: ^0.27.2 → ^0.27.3

@mariozechner/pi-coding-agent:
  @mariozechner/pi-ai: ^0.27.2 → ^0.27.3

@mariozechner/pi-coding-agent:
  @mariozechner/pi-tui: ^0.27.2 → ^0.27.3

@mariozechner/pi-mom:
  @mariozechner/pi-agent-core: ^0.27.2 → ^0.27.3

@mariozechner/pi-mom:
  @mariozechner/pi-ai: ^0.27.2 → ^0.27.3

@mariozechner/pi-mom:
  @mariozechner/pi-coding-agent: ^0.27.2 → ^0.27.3

@mariozechner/pi:
  @mariozechner/pi-agent-core: ^0.27.2 → ^0.27.3

@mariozechner/pi-web-ui:
  @mariozechner/pi-ai: ^0.27.2 → ^0.27.3

@mariozechner/pi-web-ui:
  @mariozechner/pi-tui: ^0.27.2 → ^0.27.3

✅ Updated 11 dependency version(s)
npm warn deprecated node-domexception@1.0.0: Use your platform's native DOMException instead

> pi-monorepo@0.0.3 prepare
> husky

added 389 packages, and audited 399 packages in 44s

87 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities


# Changelog

## [Unreleased]

### Added

- **API keys in settings.json**: Store API keys in `~/.pi/agent/settings.json` under the `apiKeys` field (e.g., `{ "apiKeys": { "anthropic": "sk-..." } }`). Settings keys take priority over environment variables. ([#295](https://github.com/badlogic/pi-mono/issues/295))

### Fixed

- **Allow startup without API keys**: Interactive mode no longer throws when no API keys are configured. Users can now start the agent and use `/login` to authenticate. ([#288](https://github.com/badlogic/pi-mono/issues/288))
- **`--system-prompt` file path support**: The `--system-prompt` argument now correctly resolves file paths (like `--append-system-prompt` already did). ([#287](https://github.com/badlogic/pi-mono/pull/287) by [@scutifer](https://github.com/scutifer))

## [0.27.2] - 2025-12-23

### Added

- **Skip conversation restore on branch**: Hooks can return `{ skipConversationRestore: true }` from `before_branch` to create the branched session file without restoring conversation messages. Useful for checkpoint hooks that restore files separately. ([#286](https://github.com/badlogic/pi-mono/pull/286) by [@nicobarray](https://github.com/nicobarray))

## [0.27.1] - 2025-12-22

[806 more lines in file. Use offset=21 to continue]


edit

# Changelog

## [Unreleased]

### Added

- **API keys in settings.json**: Store API keys in `~/.pi/agent/settings.json` under the `apiKeys` field (e.g., `{ "apiKeys": { "anthropic": "sk-..." } }`). Settings keys take priority over environment variables. ([#295](https://github.com/badlogic/pi-mono/issues/295))

### Fixed

- **Allow startup without API keys**: Interactive mode no longer throws when no API keys are configured. Users can now start the agent and use `/login` to authenticate. ([#288](https://github.com/badlogic/pi-mono/issues/288))
- **`--system-prompt` file path support**: The `--system-prompt` argument now correctly resolves file paths (like `--append-system-prompt` already did). ([#287](https://github.com/badlogic/pi-mono/pull/287) by [@scutifer](https://github.com/scutifer))

# Changelog

## [Unreleased]

## [0.27.3] - 2025-12-24

### Added

- **API keys in settings.json**: Store API keys in `~/.pi/agent/settings.json` under the `apiKeys` field (e.g., `{ "apiKeys": { "anthropic": "sk-..." } }`). Settings keys take priority over environment variables. ([#295](https://github.com/badlogic/pi-mono/issues/295))

### Fixed

- **Allow startup without API keys**: Interactive mode no longer throws when no API keys are configured. Users can now start the agent and use `/login` to authenticate. ([#288](https://github.com/badlogic/pi-mono/issues/288))
- **`--system-prompt` file path support**: The `--system-prompt` argument now correctly resolves file paths (like `--append-system-prompt` already did). ([#287](https://github.com/badlogic/pi-mono/pull/287) by [@scutifer](https://github.com/scutifer))


Successfully replaced text in /Users/badlogic/workspaces/pi-mono/packages/coding-agent/CHANGELOG.md. Changed 800 characters to 826 characters.

   1 # Changelog
   2
   3 ## [Unreleased]
   4
+  5 ## [0.27.3] - 2025-12-24
+  6
   5 ### Added
   6
   7 - **API keys in settings.json**: Store API keys in `~/.pi/agent/settings.json` under the `apiKeys` field (e.g., `{ "apiKeys": { "anthropic": "sk-..." } }`). Settings keys take priority over environment variables. ([#295](https://github.com/badlogic/pi-mono/issues/295))
   8
     ...


bash

cd /Users/badlogic/workspaces/pi-mono && git add -A && git commit -m "Release v0.27.3" && git tag v0.27.3 && git push origin main && git push origin v0.27.3


Running formatting, linting, and type checking...

> pi-monorepo@0.0.3 check
> biome check --write . && npm run check --workspaces --if-present && tsgo --noEmit

Checked 284 files in 157ms. No fixes applied.

> @mariozechner/pi-agent-core@0.27.3 check
> tsgo --noEmit

> @mariozechner/pi-ai@0.27.3 check
> biome check --write . && tsgo --noEmit

Checked 44 files in 42ms. No fixes applied.

> @mariozechner/pi-coding-agent@0.27.3 check
> tsgo --noEmit && tsgo -p tsconfig.examples.json

> @mariozechner/pi-mom@0.27.3 check
> biome check --write . && tsgo --noEmit

Checked 16 files in 17ms. No fixes applied.

> @mariozechner/pi@0.27.3 check
> biome check --write .

Checked 10 files in 16ms. No fixes applied.

> @mariozechner/pi-proxy@0.27.3 check
> biome check --write .

Checked 3 files in 3ms. No fixes applied.

> @mariozechner/pi-tui@0.27.3 check
> biome check --write . && tsgo --noEmit

Checked 27 files in 25ms. No fixes applied.

> @mariozechner/pi-web-ui@0.27.3 check
> tsgo --noEmit && cd example && tsgo --noEmit

> pi-web-ui-example@1.15.3 check
> tsgo --noEmit

✅ All pre-commit checks passed!
[main f8619c1] Release v0.27.3
 11 files changed, 59 insertions(+), 57 deletions(-)
To https://github.com/badlogic/pi-mono.git
   81b10f2..f8619c1  main -> main
To https://github.com/badlogic/pi-mono.git
 * [new tag]         v0.27.3 -> v0.27.3


cd /Users/badlogic/workspaces/pi-mono && npm run publish 2>&1


npm notice 83.6kB dist/core/agent-session.js.map
npm notice 1.7kB dist/core/bash-executor.d.ts
npm notice 6.6kB dist/core/bash-executor.d.ts.map
npm notice 5.3kB dist/core/bash-executor.js
npm notice 9.7kB dist/core/bash-executor.js.map
npm notice 3.8kB dist/core/compaction.d.ts
npm notice 18.3kB dist/core/compaction.d.ts.map
npm notice 15.2kB dist/core/compaction.js
npm notice 27.0kB dist/core/compaction.js.map
npm notice 350B dist/core/custom-tools/index.d.ts
npm notice 715B dist/core/custom-tools/index.d.ts.map
npm notice 140B dist/core/custom-tools/index.js
npm notice 567B dist/core/custom-tools/index.js.map
npm notice 1.2kB dist/core/custom-tools/loader.d.ts
npm notice 10.5kB dist/core/custom-tools/loader.d.ts.map
npm notice 9.7kB dist/core/custom-tools/loader.js
npm notice 18.3kB dist/core/custom-tools/loader.js.map
npm notice 4.9kB dist/core/custom-tools/types.d.ts
npm notice 7.6kB dist/core/custom-tools/types.d.ts.map
npm notice 236B dist/core/custom-tools/types.js
npm notice 5.1kB dist/core/custom-tools/types.js.map
npm notice 683B dist/core/export-html.d.ts
npm notice 37.1kB dist/core/export-html.d.ts.map
npm notice 34.8kB dist/core/export-html.js
npm notice 59.5kB dist/core/export-html.js.map
npm notice 916B dist/core/hooks/index.d.ts
npm notice 1.8kB dist/core/hooks/index.d.ts.map
npm notice 368B dist/core/hooks/index.js
npm notice 1.4kB dist/core/hooks/index.js.map
npm notice 1.6kB dist/core/hooks/loader.d.ts
npm notice 8.7kB dist/core/hooks/loader.d.ts.map
npm notice 6.1kB dist/core/hooks/loader.js
npm notice 13.1kB dist/core/hooks/loader.js.map
npm notice 2.2kB dist/core/hooks/runner.d.ts
npm notice 9.5kB dist/core/hooks/runner.d.ts.map
npm notice 7.7kB dist/core/hooks/runner.js
npm notice 14.7kB dist/core/hooks/runner.js.map
npm notice 736B dist/core/hooks/tool-wrapper.d.ts
npm notice 3.4kB dist/core/hooks/tool-wrapper.d.ts.map
npm notice 2.7kB dist/core/hooks/tool-wrapper.js
npm notice 4.6kB dist/core/hooks/tool-wrapper.js.map
npm notice 9.9kB dist/core/hooks/types.d.ts
npm notice 17.4kB dist/core/hooks/types.d.ts.map
npm notice 776B dist/core/hooks/types.js
npm notice 12.3kB dist/core/hooks/types.js.map
npm notice 828B dist/core/index.d.ts
npm notice 1.6kB dist/core/index.d.ts.map
npm notice 336B dist/core/index.js
npm notice 1.2kB dist/core/index.js.map
npm notice 1.4kB dist/core/messages.d.ts
npm notice 4.2kB dist/core/messages.d.ts.map
npm notice 2.5kB dist/core/messages.js
npm notice 5.0kB dist/core/messages.js.map
npm notice 1.9kB dist/core/model-config.d.ts
npm notice 16.1kB dist/core/model-config.d.ts.map
npm notice 14.7kB dist/core/model-config.js
npm notice 27.0kB dist/core/model-config.js.map
npm notice 2.9kB dist/core/model-resolver.d.ts
npm notice 14.6kB dist/core/model-resolver.d.ts.map
npm notice 12.3kB dist/core/model-resolver.js
npm notice 22.8kB dist/core/model-resolver.js.map
npm notice 1.7kB dist/core/oauth/index.d.ts
npm notice 5.1kB dist/core/oauth/index.d.ts.map
npm notice 3.0kB dist/core/oauth/index.js
npm notice 6.0kB dist/core/oauth/index.js.map
npm notice 8.2kB dist/core/sdk.d.ts
npm notice 26.8kB dist/core/sdk.d.ts.map
npm notice 18.1kB dist/core/sdk.js
npm notice 36.2kB dist/core/sdk.js.map
npm notice 3.5kB dist/core/session-manager.d.ts
npm notice 17.8kB dist/core/session-manager.d.ts.map
npm notice 13.9kB dist/core/session-manager.js
npm notice 28.5kB dist/core/session-manager.js.map
npm notice 4.0kB dist/core/settings-manager.d.ts
npm notice 16.2kB dist/core/settings-manager.d.ts.map
npm notice 9.6kB dist/core/settings-manager.js
npm notice 21.3kB dist/core/settings-manager.js.map
npm notice 1.6kB dist/core/skills.d.ts
npm notice 13.8kB dist/core/skills.d.ts.map
npm notice 11.7kB dist/core/skills.js
npm notice 23.0kB dist/core/skills.js.map
npm notice 1.3kB dist/core/slash-commands.d.ts
npm notice 7.7kB dist/core/slash-commands.d.ts.map
npm notice 6.6kB dist/core/slash-commands.js
npm notice 12.7kB dist/core/slash-commands.js.map
npm notice 1.9kB dist/core/system-prompt.d.ts
npm notice 11.9kB dist/core/system-prompt.d.ts.map
npm notice 9.4kB dist/core/system-prompt.js
npm notice 17.7kB dist/core/system-prompt.js.map
npm notice 248B dist/core/timings.d.ts
npm notice 1.0kB dist/core/timings.d.ts.map
npm notice 757B dist/core/timings.js
npm notice 1.7kB dist/core/timings.js.map
npm notice 848B dist/core/tools/bash.d.ts
npm notice 8.3kB dist/core/tools/bash.d.ts.map
npm notice 8.8kB dist/core/tools/bash.js
npm notice 13.9kB dist/core/tools/bash.js.map
npm notice 708B dist/core/tools/edit.d.ts
npm notice 9.2kB dist/core/tools/edit.d.ts.map
npm notice 9.8kB dist/core/tools/edit.js
npm notice 15.8kB dist/core/tools/edit.js.map
npm notice 1.0kB dist/core/tools/find.d.ts
npm notice 7.7kB dist/core/tools/find.d.ts.map
npm notice 8.2kB dist/core/tools/find.js
npm notice 12.8kB dist/core/tools/find.js.map
npm notice 1.8kB dist/core/tools/grep.d.ts
npm notice 11.7kB dist/core/tools/grep.d.ts.map
npm notice 12.6kB dist/core/tools/grep.js
npm notice 20.4kB dist/core/tools/grep.js.map
npm notice 3.5kB dist/core/tools/index.d.ts
npm notice 3.7kB dist/core/tools/index.d.ts.map
npm notice 2.1kB dist/core/tools/index.js
npm notice 4.5kB dist/core/tools/index.js.map
npm notice 905B dist/core/tools/ls.d.ts
npm notice 5.4kB dist/core/tools/ls.d.ts.map
npm notice 5.3kB dist/core/tools/ls.js
npm notice 9.0kB dist/core/tools/ls.js.map
npm notice 355B dist/core/tools/path-utils.d.ts
npm notice 2.0kB dist/core/tools/path-utils.d.ts.map
npm notice 1.6kB dist/core/tools/path-utils.js
npm notice 3.3kB dist/core/tools/path-utils.js.map
npm notice 985B dist/core/tools/read.d.ts
npm notice 8.0kB dist/core/tools/read.d.ts.map
npm notice 8.2kB dist/core/tools/read.js
npm notice 12.6kB dist/core/tools/read.js.map
npm notice 2.7kB dist/core/tools/truncate.d.ts
npm notice 9.4kB dist/core/tools/truncate.d.ts.map
npm notice 7.0kB dist/core/tools/truncate.js
npm notice 13.6kB dist/core/tools/truncate.js.map
npm notice 614B dist/core/tools/write.d.ts
npm notice 3.4kB dist/core/tools/write.d.ts.map
npm notice 3.1kB dist/core/tools/write.js
npm notice 5.3kB dist/core/tools/write.js.map
npm notice 3.4kB dist/index.d.ts
npm notice 6.7kB dist/index.d.ts.map
npm notice 2.2kB dist/index.js
npm notice 5.7kB dist/index.js.map
npm notice 284B dist/main.d.ts
npm notice 13.4kB dist/main.d.ts.map
npm notice 12.6kB dist/main.js
npm notice 25.5kB dist/main.js.map
npm notice 438B dist/modes/index.d.ts
npm notice 851B dist/modes/index.d.ts.map
npm notice 290B dist/modes/index.js
npm notice 739B dist/modes/index.js.map
npm notice 891B dist/modes/interactive/components/armin.d.ts
npm notice 13.2kB dist/modes/interactive/components/armin.d.ts.map
npm notice 12.5kB dist/modes/interactive/components/armin.js
npm notice 26.1kB dist/modes/interactive/components/armin.js.map
npm notice 524B dist/modes/interactive/components/assistant-message.d.ts
npm notice 4.0kB dist/modes/interactive/components/assistant-message.d.ts.map
npm notice 3.5kB dist/modes/interactive/components/assistant-message.js
npm notice 6.7kB dist/modes/interactive/components/assistant-message.js.map
npm notice 1.1kB dist/modes/interactive/components/bash-execution.d.ts
npm notice 7.5kB dist/modes/interactive/components/bash-execution.d.ts.map
npm notice 6.3kB dist/modes/interactive/components/bash-execution.js
npm notice 12.3kB dist/modes/interactive/components/bash-execution.js.map
npm notice 568B dist/modes/interactive/components/compaction.d.ts
npm notice 2.2kB dist/modes/interactive/components/compaction.d.ts.map
npm notice 1.7kB dist/modes/interactive/components/compaction.js
npm notice 3.2kB dist/modes/interactive/components/compaction.js.map
npm notice 496B dist/modes/interactive/components/custom-editor.d.ts
npm notice 2.8kB dist/modes/interactive/components/custom-editor.d.ts.map
npm notice 2.2kB dist/modes/interactive/components/custom-editor.js
npm notice 4.0kB dist/modes/interactive/components/custom-editor.js.map
npm notice 474B dist/modes/interactive/components/diff.d.ts
npm notice 5.4kB dist/modes/interactive/components/diff.d.ts.map
npm notice 5.1kB dist/modes/interactive/components/diff.js
npm notice 9.7kB dist/modes/interactive/components/diff.js.map
npm notice 356B dist/modes/interactive/components/dynamic-border.d.ts
npm notice 1.0kB dist/modes/interactive/components/dynamic-border.d.ts.map
npm notice 453B dist/modes/interactive/components/dynamic-border.js
npm notice 1.2kB dist/modes/interactive/components/dynamic-border.js.map
npm notice 1.1kB dist/modes/interactive/components/footer.d.ts
npm notice 11.1kB dist/modes/interactive/components/footer.d.ts.map
npm notice 10.8kB dist/modes/interactive/components/footer.js
npm notice 18.9kB dist/modes/interactive/components/footer.js.map
npm notice 444B dist/modes/interactive/components/hook-input.d.ts
npm notice 2.1kB dist/modes/interactive/components/hook-input.d.ts.map
npm notice 1.5kB dist/modes/interactive/components/hook-input.js
npm notice 3.3kB dist/modes/interactive/components/hook-input.js.map
npm notice 578B dist/modes/interactive/components/hook-selector.d.ts
npm notice 3.3kB dist/modes/interactive/components/hook-selector.d.ts.map
npm notice 2.7kB dist/modes/interactive/components/hook-selector.js
npm notice 5.6kB dist/modes/interactive/components/hook-selector.js.map
npm notice 1.1kB dist/modes/interactive/components/model-selector.d.ts
npm notice 9.4kB dist/modes/interactive/components/model-selector.d.ts.map
npm notice 7.9kB dist/modes/interactive/components/model-selector.js
npm notice 15.9kB dist/modes/interactive/components/model-selector.js.map
npm notice 575B dist/modes/interactive/components/oauth-selector.d.ts
npm notice 4.6kB dist/modes/interactive/components/oauth-selector.d.ts.map
npm notice 3.9kB dist/modes/interactive/components/oauth-selector.js
npm notice 7.9kB dist/modes/interactive/components/oauth-selector.js.map
npm notice 435B dist/modes/interactive/components/queue-mode-selector.d.ts
npm notice 2.1kB dist/modes/interactive/components/queue-mode-selector.d.ts.map
npm notice 1.5kB dist/modes/interactive/components/queue-mode-selector.js
npm notice 3.0kB dist/modes/interactive/components/queue-mode-selector.js.map
npm notice 1.0kB dist/modes/interactive/components/session-selector.d.ts
npm notice 7.8kB dist/modes/interactive/components/session-selector.d.ts.map
npm notice 6.7kB dist/modes/interactive/components/session-selector.js
npm notice 13.4kB dist/modes/interactive/components/session-selector.js.map
npm notice 407B dist/modes/interactive/components/show-images-selector.d.ts
npm notice 1.8kB dist/modes/interactive/components/show-images-selector.d.ts.map
npm notice 1.3kB dist/modes/interactive/components/show-images-selector.js
npm notice 2.6kB dist/modes/interactive/components/show-images-selector.js.map
npm notice 443B dist/modes/interactive/components/theme-selector.d.ts
npm notice 2.2kB dist/modes/interactive/components/theme-selector.d.ts.map
npm notice 1.6kB dist/modes/interactive/components/theme-selector.js
npm notice 3.3kB dist/modes/interactive/components/theme-selector.js.map
npm notice 518B dist/modes/interactive/components/thinking-selector.d.ts
npm notice 2.4kB dist/modes/interactive/components/thinking-selector.d.ts.map
npm notice 1.7kB dist/modes/interactive/components/thinking-selector.js
npm notice 3.5kB dist/modes/interactive/components/thinking-selector.js.map
npm notice 1.4kB dist/modes/interactive/components/tool-execution.d.ts
npm notice 21.9kB dist/modes/interactive/components/tool-execution.d.ts.map
npm notice 21.6kB dist/modes/interactive/components/tool-execution.js
npm notice 41.0kB dist/modes/interactive/components/tool-execution.js.map
npm notice 947B dist/modes/interactive/components/user-message-selector.d.ts
npm notice 6.1kB dist/modes/interactive/components/user-message-selector.d.ts.map
npm notice 4.9kB dist/modes/interactive/components/user-message-selector.js
npm notice 9.9kB dist/modes/interactive/components/user-message-selector.js.map
npm notice 254B dist/modes/interactive/components/user-message.d.ts
npm notice 992B dist/modes/interactive/components/user-message.d.ts.map
npm notice 677B dist/modes/interactive/components/user-message.js
npm notice 1.5kB dist/modes/interactive/components/user-message.js.map
npm notice 1.2kB dist/modes/interactive/components/visual-truncate.d.ts
npm notice 2.2kB dist/modes/interactive/components/visual-truncate.d.ts.map
npm notice 1.6kB dist/modes/interactive/components/visual-truncate.js
npm notice 2.7kB dist/modes/interactive/components/visual-truncate.js.map
npm notice 4.9kB dist/modes/interactive/interactive-mode.d.ts
npm notice 76.6kB dist/modes/interactive/interactive-mode.d.ts.map
npm notice 75.5kB dist/modes/interactive/interactive-mode.js
npm notice 140.3kB dist/modes/interactive/interactive-mode.js.map
npm notice 1.7kB dist/modes/interactive/theme/dark.json
npm notice 1.7kB dist/modes/interactive/theme/light.json
npm notice 7.0kB dist/modes/interactive/theme/theme-schema.json
npm notice 2.6kB dist/modes/interactive/theme/theme.d.ts
npm notice 28.4kB dist/modes/interactive/theme/theme.d.ts.map
npm notice 23.6kB dist/modes/interactive/theme/theme.js
npm notice 49.5kB dist/modes/interactive/theme/theme.js.map
npm notice 932B dist/modes/print-mode.d.ts
npm notice 4.4kB dist/modes/print-mode.d.ts.map
npm notice 3.9kB dist/modes/print-mode.js
npm notice 6.6kB dist/modes/print-mode.js.map
npm notice 5.4kB dist/modes/rpc/rpc-client.d.ts
npm notice 18.1kB dist/modes/rpc/rpc-client.d.ts.map
npm notice 12.3kB dist/modes/rpc/rpc-client.js
npm notice 25.0kB dist/modes/rpc/rpc-client.js.map
npm notice 961B dist/modes/rpc/rpc-mode.d.ts
npm notice 14.6kB dist/modes/rpc/rpc-mode.d.ts.map
npm notice 14.8kB dist/modes/rpc/rpc-mode.js
npm notice 25.2kB dist/modes/rpc/rpc-mode.js.map
npm notice 6.4kB dist/modes/rpc/rpc-types.d.ts
npm notice 15.1kB dist/modes/rpc/rpc-types.d.ts.map
npm notice 211B dist/modes/rpc/rpc-types.js
npm notice 7.7kB dist/modes/rpc/rpc-types.js.map
npm notice 722B dist/utils/changelog.d.ts
npm notice 3.5kB dist/utils/changelog.d.ts.map
npm notice 3.0kB dist/utils/changelog.js
npm notice 5.6kB dist/utils/changelog.js.map
npm notice 100B dist/utils/clipboard.d.ts
npm notice 1.1kB dist/utils/clipboard.d.ts.map
npm notice 983B dist/utils/clipboard.js
npm notice 1.9kB dist/utils/clipboard.js.map
npm notice 287B dist/utils/fuzzy.d.ts
npm notice 3.4kB dist/utils/fuzzy.d.ts.map
npm notice 3.1kB dist/utils/fuzzy.js
npm notice 5.8kB dist/utils/fuzzy.js.map
npm notice 138B dist/utils/mime.d.ts
npm notice 1.1kB dist/utils/mime.d.ts.map
npm notice 915B dist/utils/mime.js
npm notice 1.9kB dist/utils/mime.js.map
npm notice 808B dist/utils/shell.d.ts
npm notice 4.7kB dist/utils/shell.d.ts.map
npm notice 4.4kB dist/utils/shell.js
npm notice 7.5kB dist/utils/shell.js.map
npm notice 211B dist/utils/tools-manager.d.ts
npm notice 7.5kB dist/utils/tools-manager.d.ts.map
npm notice 6.9kB dist/utils/tools-manager.js
npm notice 13.9kB dist/utils/tools-manager.js.map
npm notice 12.2kB docs/custom-tools.md
npm notice 24.1kB docs/hooks.md
npm notice 21.2kB docs/rpc.md
npm notice 22.8kB docs/sdk.md
npm notice 3.5kB docs/session.md
npm notice 8.6kB docs/skills.md
npm notice 15.7kB docs/theme.md
npm notice 528B examples/custom-tools/hello/index.ts
npm notice 2.5kB examples/custom-tools/question/index.ts
npm notice 2.9kB examples/custom-tools/README.md
npm notice 4.2kB examples/custom-tools/subagent/agents.ts
npm notice 896B examples/custom-tools/subagent/agents/planner.md
npm notice 933B examples/custom-tools/subagent/agents/reviewer.md
npm notice 1.3kB examples/custom-tools/subagent/agents/scout.md
npm notice 664B examples/custom-tools/subagent/agents/worker.md
npm notice 494B examples/custom-tools/subagent/commands/implement-and-review.md
npm notice 579B examples/custom-tools/subagent/commands/implement.md
npm notice 496B examples/custom-tools/subagent/commands/scout-and-plan.md
npm notice 33.1kB examples/custom-tools/subagent/index.ts
npm notice 5.8kB examples/custom-tools/subagent/README.md
npm notice 6.2kB examples/custom-tools/todo/index.ts
npm notice 1.6kB examples/hooks/auto-commit-on-exit.ts
npm notice 1.6kB examples/hooks/confirm-destructive.ts
npm notice 1.4kB examples/hooks/dirty-repo-guard.ts
npm notice 886B examples/hooks/file-trigger.ts
npm notice 1.3kB examples/hooks/git-checkpoint.ts
npm notice 1.0kB examples/hooks/permission-gate.ts
npm notice 797B examples/hooks/protected-paths.ts
npm notice 2.9kB examples/hooks/README.md
npm notice 755B examples/README.md
npm notice 621B examples/sdk/01-minimal.ts
npm notice 1.0kB examples/sdk/02-custom-model.ts
npm notice 1.3kB examples/sdk/03-custom-prompt.ts
npm notice 1.3kB examples/sdk/04-skills.ts
npm notice 3.0kB examples/sdk/05-tools.ts
npm notice 1.7kB examples/sdk/06-hooks.ts
npm notice 901B examples/sdk/07-context-files.ts
npm notice 1.0kB examples/sdk/08-slash-commands.ts
npm notice 1.4kB examples/sdk/09-api-keys-and-oauth.ts
npm notice 1.1kB examples/sdk/10-settings.ts
npm notice 1.6kB examples/sdk/11-sessions.ts
npm notice 2.6kB examples/sdk/12-full-control.ts
npm notice 4.1kB examples/sdk/README.md
npm notice 2.0kB package.json
npm notice Tarball Details
npm notice name: @mariozechner/pi-coding-agent
npm notice version: 0.27.3
npm notice filename: mariozechner-pi-coding-agent-0.27.3.tgz
npm notice package size: 562.9 kB
npm notice unpacked size: 2.9 MB
npm notice shasum: 635371c07b57dd9c0b8d950aedd3bd0ca347e756
npm notice integrity: sha512-oO+IL14bEcnth[...]msKY4eIIRoOxw==
npm notice total files: 353
npm notice
npm notice Publishing to https://registry.npmjs.org/ with tag latest and public access
+ @mariozechner/pi-coding-agent@0.27.3

> @mariozechner/pi-mom@0.27.3 prepublishOnly
> npm run clean && npm run build

> @mariozechner/pi-mom@0.27.3 clean
> rm -rf dist

> @mariozechner/pi-mom@0.27.3 build
> tsgo -p tsconfig.build.json && chmod +x dist/main.js

npm notice
npm notice 📦  @mariozechner/pi-mom@0.27.3
npm notice Tarball Contents
npm notice 11.0kB CHANGELOG.md
npm notice 20.2kB README.md
npm notice 795B dist/agent.d.ts
npm notice 33.7kB dist/agent.d.ts.map
npm notice 32.5kB dist/agent.js
npm notice 56.0kB dist/agent.js.map
npm notice 4.6kB dist/context.d.ts
npm notice 22.3kB dist/context.d.ts.map
npm notice 18.8kB dist/context.js
npm notice 33.7kB dist/context.js.map
npm notice 131B dist/download.d.ts
npm notice 3.9kB dist/download.d.ts.map
npm notice 3.5kB dist/download.js
npm notice 7.3kB dist/download.js.map
npm notice 1.4kB dist/events.d.ts
npm notice 12.7kB dist/events.d.ts.map
npm notice 11.0kB dist/events.js
npm notice 21.6kB dist/events.js.map
npm notice 2.1kB dist/log.d.ts
npm notice 11.9kB dist/log.d.ts.map
npm notice 8.9kB dist/log.js
npm notice 20.0kB dist/log.js.map
npm notice 65B dist/main.d.ts
npm notice 11.7kB dist/main.d.ts.map
npm notice 11.5kB dist/main.js
npm notice 22.2kB dist/main.js.map
npm notice 955B dist/sandbox.d.ts
npm notice 7.2kB dist/sandbox.d.ts.map
npm notice 6.1kB dist/sandbox.js
npm notice 12.6kB dist/sandbox.js.map
npm notice 4.0kB dist/slack.d.ts
npm notice 24.2kB dist/slack.d.ts.map
npm notice 17.9kB dist/slack.js
npm notice 36.7kB dist/slack.js.map
npm notice 1.8kB dist/store.d.ts
npm notice 8.6kB dist/store.d.ts.map
npm notice 6.4kB dist/store.js
npm notice 12.8kB dist/store.js.map
npm notice 524B dist/tools/attach.d.ts
npm notice 2.1kB dist/tools/attach.d.ts.map
npm notice 1.4kB dist/tools/attach.js
npm notice 3.0kB dist/tools/attach.js.map
npm notice 491B dist/tools/bash.d.ts
npm notice 4.4kB dist/tools/bash.d.ts.map
npm notice 3.9kB dist/tools/bash.js
npm notice 7.0kB dist/tools/bash.js.map
npm notice 499B dist/tools/edit.d.ts
npm notice 6.0kB dist/tools/edit.d.ts.map
npm notice 5.9kB dist/tools/edit.js
npm notice 10.8kB dist/tools/edit.js.map
npm notice 263B dist/tools/index.d.ts
npm notice 977B dist/tools/index.d.ts.map
npm notice 524B dist/tools/index.js
npm notice 1.2kB dist/tools/index.js.map
npm notice 574B dist/tools/read.d.ts
npm notice 6.9kB dist/tools/read.d.ts.map
npm notice 6.5kB dist/tools/read.js
npm notice 11.5kB dist/tools/read.js.map
npm notice 2.3kB dist/tools/truncate.d.ts
npm notice 8.3kB dist/tools/truncate.d.ts.map
npm notice 6.4kB dist/tools/truncate.js
npm notice 12.3kB dist/tools/truncate.js.map
npm notice 453B dist/tools/write.d.ts
npm notice 2.2kB dist/tools/write.d.ts.map
npm notice 1.6kB dist/tools/write.js
npm notice 3.3kB dist/tools/write.js.map
npm notice 1.3kB package.json
npm notice Tarball Details
npm notice name: @mariozechner/pi-mom
npm notice version: 0.27.3
npm notice filename: mariozechner-pi-mom-0.27.3.tgz
npm notice package size: 138.8 kB
npm notice unpacked size: 635.3 kB
npm notice shasum: df065ccdb4b0238dd2627061d984ea393dc8e581
npm notice integrity: sha512-1gBJ9LXCs6m21[...]CJc03O0/fzP7g==
npm notice total files: 67
npm notice
npm notice Publishing to https://registry.npmjs.org/ with tag latest and public access
+ @mariozechner/pi-mom@0.27.3

> @mariozechner/pi@0.27.3 prepublishOnly
> npm run clean && npm run build

> @mariozechner/pi@0.27.3 clean
> rm -rf dist

> @mariozechner/pi@0.27.3 build
> tsgo -p tsconfig.build.json && chmod +x dist/cli.js && cp src/models.json dist/ && cp -r scripts dist/

npm notice
npm notice 📦  @mariozechner/pi@0.27.3
npm notice Tarball Contents
npm notice 16.0kB README.md
npm notice 64B dist/cli.d.ts
npm notice 13.0kB dist/cli.d.ts.map
npm notice 14.4kB dist/cli.js
npm notice 23.6kB dist/cli.js.map
npm notice 969B dist/commands/models.d.ts
npm notice 27.2kB dist/commands/models.d.ts.map
npm notice 27.3kB dist/commands/models.js
npm notice 52.6kB dist/commands/models.js.map
npm notice 540B dist/commands/pods.d.ts
npm notice 7.2kB dist/commands/pods.d.ts.map
npm notice 6.9kB dist/commands/pods.js
npm notice 14.2kB dist/commands/pods.js.map
npm notice 227B dist/commands/prompt.d.ts
npm notice 3.8kB dist/commands/prompt.d.ts.map
npm notice 2.8kB dist/commands/prompt.js
npm notice 5.4kB dist/commands/prompt.js.map
npm notice 452B dist/config.d.ts
npm notice 2.6kB dist/config.d.ts.map
npm notice 2.1kB dist/config.js
npm notice 5.0kB dist/config.js.map
npm notice 63B dist/index.d.ts
npm notice 201B dist/index.d.ts.map
npm notice 85B dist/index.js
npm notice 212B dist/index.js.map
npm notice 649B dist/model-configs.d.ts
npm notice 3.2kB dist/model-configs.d.ts.map
npm notice 2.4kB dist/model-configs.js
npm notice 5.2kB dist/model-configs.js.map
npm notice 7.3kB dist/models.json
npm notice 2.0kB dist/scripts/model_run.sh
npm notice 11.2kB dist/scripts/pod_setup.sh
npm notice 772B dist/ssh.d.ts
npm notice 4.4kB dist/ssh.d.ts.map
npm notice 3.9kB dist/ssh.js
npm notice 8.1kB dist/ssh.js.map
npm notice 466B dist/types.d.ts
npm notice 1.2kB dist/types.d.ts.map
npm notice 76B dist/types.js
npm notice 693B dist/types.js.map
npm notice 857B package.json
npm notice 2.0kB scripts/model_run.sh
npm notice 11.2kB scripts/pod_setup.sh
npm notice Tarball Details
npm notice name: @mariozechner/pi
npm notice version: 0.27.3
npm notice filename: mariozechner-pi-0.27.3.tgz
npm notice package size: 61.4 kB
npm notice unpacked size: 292.6 kB
npm notice shasum: c7d50b8e9d0187da13edfcfba5cbc2f55d398323
npm notice integrity: sha512-3QeC4KXv89lh7[...]vH9AMU+O3Z84g==
npm notice total files: 43
npm notice
npm notice Publishing to https://registry.npmjs.org/ with tag latest and public access
+ @mariozechner/pi@0.27.3
npm notice
npm notice 📦  @mariozechner/pi-proxy@0.27.3
npm notice Tarball Contents
npm notice 1.5kB README.md
npm notice 64B dist/cli.d.ts
npm notice 100B dist/cli.d.ts.map
npm notice 458B dist/cli.js
npm notice 1.1kB dist/cli.js.map
npm notice 208B dist/cors-proxy.d.ts
npm notice 180B dist/cors-proxy.d.ts.map
npm notice 2.4kB dist/cors-proxy.js
npm notice 4.7kB dist/cors-proxy.js.map
npm notice 86B dist/index.d.ts
npm notice 145B dist/index.d.ts.map
npm notice 84B dist/index.js
npm notice 219B dist/index.js.map
npm notice 580B package.json
npm notice 424B src/cli.ts
npm notice 1.9kB src/cors-proxy.ts
npm notice 51B src/index.ts
npm notice 134B tsconfig.json
npm notice Tarball Details
npm notice name: @mariozechner/pi-proxy
npm notice version: 0.27.3
npm notice filename: mariozechner-pi-proxy-0.27.3.tgz
npm notice package size: 4.4 kB
npm notice unpacked size: 14.3 kB
npm notice shasum: bf9273c01cffa6cc7ba7a46830701c265221a7ce
npm notice integrity: sha512-MXHV4p0V6a9vc[...]zLHt0zAKOokHg==
npm notice total files: 18
npm notice
npm notice Publishing to https://registry.npmjs.org/ with tag latest and public access
+ @mariozechner/pi-proxy@0.27.3

> @mariozechner/pi-tui@0.27.3 prepublishOnly
> npm run clean && npm run build

> @mariozechner/pi-tui@0.27.3 clean
> rm -rf dist

> @mariozechner/pi-tui@0.27.3 build
> tsgo -p tsconfig.build.json

npm notice
npm notice 📦  @mariozechner/pi-tui@0.27.3
npm notice Tarball Contents
npm notice 7.9kB README.md
npm notice 1.7kB dist/autocomplete.d.ts
npm notice 21.7kB dist/autocomplete.d.ts.map
npm notice 20.3kB dist/autocomplete.js
npm notice 35.7kB dist/autocomplete.js.map
npm notice 777B dist/components/box.d.ts
npm notice 4.4kB dist/components/box.d.ts.map
npm notice 3.4kB dist/components/box.js
npm notice 7.0kB dist/components/box.js.map
npm notice 2.8kB dist/components/editor.d.ts
npm notice 48.6kB dist/components/editor.d.ts.map
npm notice 49.1kB dist/components/editor.js
npm notice 86.4kB dist/components/editor.js.map
npm notice 733B dist/components/image.d.ts
npm notice 3.4kB dist/components/image.d.ts.map
npm notice 2.2kB dist/components/image.js
npm notice 4.7kB dist/components/image.js.map
npm notice 551B dist/components/input.d.ts
npm notice 9.6kB dist/components/input.d.ts.map
npm notice 9.5kB dist/components/input.js
npm notice 17.4kB dist/components/input.js.map
npm notice 658B dist/components/loader.d.ts
npm notice 2.2kB dist/components/loader.d.ts.map
npm notice 1.4kB dist/components/loader.js
npm notice 3.0kB dist/components/loader.js.map
npm notice 2.9kB dist/components/markdown.d.ts
npm notice 24.5kB dist/components/markdown.d.ts.map
npm notice 22.8kB dist/components/markdown.js
npm notice 41.8kB dist/components/markdown.js.map
npm notice 1.1kB dist/components/select-list.d.ts
npm notice 8.2kB dist/components/select-list.d.ts.map
npm notice 7.0kB dist/components/select-list.js
npm notice 13.1kB dist/components/select-list.js.map
npm notice 335B dist/components/spacer.d.ts
npm notice 978B dist/components/spacer.d.ts.map
npm notice 480B dist/components/spacer.js
npm notice 1.2kB dist/components/spacer.js.map
npm notice 632B dist/components/text.d.ts
npm notice 4.3kB dist/components/text.d.ts.map
npm notice 3.4kB dist/components/text.js
npm notice 6.7kB dist/components/text.js.map
npm notice 403B dist/components/truncated-text.d.ts
npm notice 2.5kB dist/components/truncated-text.d.ts.map
npm notice 1.9kB dist/components/truncated-text.js
npm notice 3.8kB dist/components/truncated-text.js.map
npm notice 1.8kB dist/index.d.ts
npm notice 3.7kB dist/index.d.ts.map
npm notice 1.6kB dist/index.js
npm notice 3.6kB dist/index.js.map
npm notice 7.2kB dist/keys.d.ts
npm notice 19.1kB dist/keys.d.ts.map
npm notice 15.5kB dist/keys.js
npm notice 28.0kB dist/keys.js.map
npm notice 2.1kB dist/terminal-image.d.ts
npm notice 11.6kB dist/terminal-image.d.ts.map
npm notice 8.9kB dist/terminal-image.js
npm notice 19.6kB dist/terminal-image.js.map
npm notice 962B dist/terminal.d.ts
npm notice 4.8kB dist/terminal.d.ts.map
npm notice 2.7kB dist/terminal.js
npm notice 6.2kB dist/terminal.js.map
npm notice 1.8kB dist/tui.d.ts
npm notice 12.7kB dist/tui.d.ts.map
npm notice 11.3kB dist/tui.js
npm notice 20.4kB dist/tui.js.map
npm notice 1.6kB dist/utils.d.ts
npm notice 17.4kB dist/utils.d.ts.map
npm notice 18.1kB dist/utils.js
npm notice 31.4kB dist/utils.js.map
npm notice 1.2kB package.json
npm notice Tarball Details
npm notice name: @mariozechner/pi-tui
npm notice version: 0.27.3
npm notice filename: mariozechner-pi-tui-0.27.3.tgz
npm notice package size: 136.2 kB
npm notice unpacked size: 746.1 kB
npm notice shasum: 42a4dde8070a997c669e4c8d08e075325e836e45
npm notice integrity: sha512-4pnvhkxoLMyCT[...]im1uvIACAH8Ew==
npm notice total files: 70
npm notice
npm notice Publishing to https://registry.npmjs.org/ with tag latest and public access
+ @mariozechner/pi-tui@0.27.3
npm notice
npm notice 📦  @mariozechner/pi-web-ui@0.27.3
npm notice Tarball Contents
npm notice 7.9kB README.md
npm notice 2.0kB dist/agent/agent.d.ts
npm notice 2.0kB dist/agent/agent.d.ts.map
npm notice 11.0kB dist/agent/agent.js
npm notice 9.7kB dist/agent/agent.js.map
npm notice 807B dist/agent/transports/AppTransport.d.ts
npm notice 561B dist/agent/transports/AppTransport.d.ts.map
npm notice 15.9kB dist/agent/transports/AppTransport.js
npm notice 9.7kB dist/agent/transports/AppTransport.js.map
npm notice 138B dist/agent/transports/index.d.ts
npm notice 192B dist/agent/transports/index.d.ts.map
npm notice 136B dist/agent/transports/index.js
npm notice 190B dist/agent/transports/index.js.map
npm notice 765B dist/agent/transports/ProviderTransport.d.ts
npm notice 535B dist/agent/transports/ProviderTransport.d.ts.map
npm notice 2.2kB dist/agent/transports/ProviderTransport.js
npm notice 2.1kB dist/agent/transports/ProviderTransport.js.map
npm notice 1.1kB dist/agent/transports/proxy-types.d.ts
npm notice 1.3kB dist/agent/transports/proxy-types.d.ts.map
npm notice 50B dist/agent/transports/proxy-types.js
npm notice 137B dist/agent/transports/proxy-types.js.map
npm notice 722B dist/agent/transports/types.d.ts
npm notice 785B dist/agent/transports/types.d.ts.map
npm notice 44B dist/agent/transports/types.js
npm notice 125B dist/agent/transports/types.js.map
npm notice 382B dist/agent/types.d.ts
npm notice 481B dist/agent/types.d.ts.map
npm notice 44B dist/agent/types.js
npm notice 111B dist/agent/types.js.map
npm notice 86.2kB dist/app.css
npm notice 1.3kB dist/ChatPanel.d.ts
npm notice 1.1kB dist/ChatPanel.d.ts.map
npm notice 8.4kB dist/ChatPanel.js
npm notice 5.7kB dist/ChatPanel.js.map
npm notice 1.5kB dist/components/AgentInterface.d.ts
npm notice 1.4kB dist/components/AgentInterface.d.ts.map
npm notice 13.2kB dist/components/AgentInterface.js
npm notice 9.2kB dist/components/AgentInterface.js.map
npm notice 455B dist/components/AttachmentTile.d.ts
npm notice 428B dist/components/AttachmentTile.d.ts.map
npm notice 4.6kB dist/components/AttachmentTile.js
npm notice 2.5kB dist/components/AttachmentTile.js.map
npm notice 396B dist/components/ConsoleBlock.d.ts
npm notice 380B dist/components/ConsoleBlock.d.ts.map
npm notice 3.2kB dist/components/ConsoleBlock.js
npm notice 2.0kB dist/components/ConsoleBlock.js.map
npm notice 666B dist/components/CustomProviderCard.d.ts
npm notice 659B dist/components/CustomProviderCard.d.ts.map
npm notice 4.0kB dist/components/CustomProviderCard.js
npm notice 2.6kB dist/components/CustomProviderCard.js.map
npm notice 520B dist/components/ExpandableSection.d.ts
npm notice 396B dist/components/ExpandableSection.d.ts.map
npm notice 2.5kB dist/components/ExpandableSection.js
npm notice 1.3kB dist/components/ExpandableSection.js.map
npm notice 929B dist/components/Input.d.ts
npm notice 1.1kB dist/components/Input.d.ts.map
npm notice 2.5kB dist/components/Input.js
npm notice 1.8kB dist/components/Input.js.map
npm notice 664B dist/components/message-renderer-registry.d.ts
npm notice 691B dist/components/message-renderer-registry.d.ts.map
npm notice 430B dist/components/message-renderer-registry.js
npm notice 537B dist/components/message-renderer-registry.js.map
npm notice 1.5kB dist/components/MessageEditor.d.ts
npm notice 1.4kB dist/components/MessageEditor.d.ts.map
npm notice 15.4kB dist/components/MessageEditor.js
npm notice 11.2kB dist/components/MessageEditor.js.map
npm notice 559B dist/components/MessageList.d.ts
npm notice 573B dist/components/MessageList.d.ts.map
npm notice 3.8kB dist/components/MessageList.js
npm notice 2.5kB dist/components/MessageList.js.map
npm notice 2.4kB dist/components/Messages.d.ts
npm notice 1.9kB dist/components/Messages.d.ts.map
npm notice 10.3kB dist/components/Messages.js
npm notice 7.4kB dist/components/Messages.js.map
npm notice 477B dist/components/ProviderKeyInput.d.ts
npm notice 440B dist/components/ProviderKeyInput.d.ts.map
npm notice 6.2kB dist/components/ProviderKeyInput.js
npm notice 4.6kB dist/components/ProviderKeyInput.js.map
npm notice 1.2kB dist/components/sandbox/ArtifactsRuntimeProvider.d.ts
npm notice 977B dist/components/sandbox/ArtifactsRuntimeProvider.d.ts.map
npm notice 7.9kB dist/components/sandbox/ArtifactsRuntimeProvider.js
npm notice 5.7kB dist/components/sandbox/ArtifactsRuntimeProvider.js.map
npm notice 691B dist/components/sandbox/AttachmentsRuntimeProvider.d.ts
npm notice 480B dist/components/sandbox/AttachmentsRuntimeProvider.d.ts.map
npm notice 2.5kB dist/components/sandbox/AttachmentsRuntimeProvider.js
npm notice 2.1kB dist/components/sandbox/AttachmentsRuntimeProvider.js.map
npm notice 1.2kB dist/components/sandbox/ConsoleRuntimeProvider.d.ts
npm notice 896B dist/components/sandbox/ConsoleRuntimeProvider.d.ts.map
npm notice 6.0kB dist/components/sandbox/ConsoleRuntimeProvider.js
npm notice 4.2kB dist/components/sandbox/ConsoleRuntimeProvider.js.map
npm notice 1.0kB dist/components/sandbox/FileDownloadRuntimeProvider.d.ts
npm notice 702B dist/components/sandbox/FileDownloadRuntimeProvider.d.ts.map
npm notice 3.9kB dist/components/sandbox/FileDownloadRuntimeProvider.js
npm notice 2.5kB dist/components/sandbox/FileDownloadRuntimeProvider.js.map
npm notice 789B dist/components/sandbox/RuntimeMessageBridge.d.ts
npm notice 470B dist/components/sandbox/RuntimeMessageBridge.d.ts.map
npm notice 2.5kB dist/components/sandbox/RuntimeMessageBridge.js
npm notice 765B dist/components/sandbox/RuntimeMessageBridge.js.map
npm notice 2.5kB dist/components/sandbox/RuntimeMessageRouter.d.ts
npm notice 909B dist/components/sandbox/RuntimeMessageRouter.d.ts.map
npm notice 6.8kB dist/components/sandbox/RuntimeMessageRouter.js
npm notice 3.9kB dist/components/sandbox/RuntimeMessageRouter.js.map
npm notice 2.2kB dist/components/sandbox/SandboxRuntimeProvider.d.ts
npm notice 653B dist/components/sandbox/SandboxRuntimeProvider.d.ts.map
npm notice 61B dist/components/sandbox/SandboxRuntimeProvider.js
npm notice 161B dist/components/sandbox/SandboxRuntimeProvider.js.map
npm notice 3.4kB dist/components/SandboxedIframe.d.ts
npm notice 1.6kB dist/components/SandboxedIframe.d.ts.map
npm notice 21.9kB dist/components/SandboxedIframe.js
npm notice 12.7kB dist/components/SandboxedIframe.js.map
npm notice 751B dist/components/StreamingMessageContainer.d.ts
npm notice 726B dist/components/StreamingMessageContainer.d.ts.map
npm notice 4.9kB dist/components/StreamingMessageContainer.js
npm notice 2.8kB dist/components/StreamingMessageContainer.js.map
npm notice 383B dist/components/ThinkingBlock.d.ts
npm notice 362B dist/components/ThinkingBlock.d.ts.map
npm notice 2.4kB dist/components/ThinkingBlock.js
npm notice 1.2kB dist/components/ThinkingBlock.js.map
npm notice 590B dist/dialogs/ApiKeyPromptDialog.d.ts
npm notice 486B dist/dialogs/ApiKeyPromptDialog.d.ts.map
npm notice 3.0kB dist/dialogs/ApiKeyPromptDialog.js
npm notice 2.0kB dist/dialogs/ApiKeyPromptDialog.js.map
npm notice 1.1kB dist/dialogs/AttachmentOverlay.d.ts
npm notice 964B dist/dialogs/AttachmentOverlay.d.ts.map
npm notice 22.8kB dist/dialogs/AttachmentOverlay.js
npm notice 15.3kB dist/dialogs/AttachmentOverlay.js.map
npm notice 963B dist/dialogs/CustomProviderDialog.d.ts
npm notice 882B dist/dialogs/CustomProviderDialog.d.ts.map
npm notice 10.0kB dist/dialogs/CustomProviderDialog.js
npm notice 7.7kB dist/dialogs/CustomProviderDialog.js.map
npm notice 1.1kB dist/dialogs/ModelSelector.d.ts
npm notice 945B dist/dialogs/ModelSelector.d.ts.map
npm notice 13.6kB dist/dialogs/ModelSelector.js
npm notice 10.2kB dist/dialogs/ModelSelector.js.map
npm notice 630B dist/dialogs/PersistentStorageDialog.d.ts
npm notice 450B dist/dialogs/PersistentStorageDialog.d.ts.map
npm notice 5.9kB dist/dialogs/PersistentStorageDialog.js
npm notice 3.1kB dist/dialogs/PersistentStorageDialog.js.map
npm notice 698B dist/dialogs/ProvidersModelsTab.d.ts
npm notice 536B dist/dialogs/ProvidersModelsTab.d.ts.map
npm notice 7.7kB dist/dialogs/ProvidersModelsTab.js
npm notice 5.5kB dist/dialogs/ProvidersModelsTab.js.map
npm notice 717B dist/dialogs/SessionListDialog.d.ts
npm notice 637B dist/dialogs/SessionListDialog.d.ts.map
npm notice 6.1kB dist/dialogs/SessionListDialog.js
npm notice 4.0kB dist/dialogs/SessionListDialog.js.map
npm notice 965B dist/dialogs/SettingsDialog.d.ts
npm notice 775B dist/dialogs/SettingsDialog.d.ts.map
npm notice 7.8kB dist/dialogs/SettingsDialog.js
npm notice 5.0kB dist/dialogs/SettingsDialog.js.map
npm notice 5.5kB dist/index.d.ts
npm notice 3.6kB dist/index.d.ts.map
npm notice 4.7kB dist/index.js
npm notice 3.0kB dist/index.js.map
npm notice 4.6kB dist/prompts/prompts.d.ts
npm notice 383B dist/prompts/prompts.d.ts.map
npm notice 10.8kB dist/prompts/prompts.js
npm notice 954B dist/prompts/prompts.js.map
npm notice 1.3kB dist/storage/app-storage.d.ts
npm notice 954B dist/storage/app-storage.d.ts.map
npm notice 1.1kB dist/storage/app-storage.js
npm notice 855B dist/storage/app-storage.js.map
npm notice 1.3kB dist/storage/backends/indexeddb-storage-backend.d.ts
npm notice 1.4kB dist/storage/backends/indexeddb-storage-backend.d.ts.map
npm notice 6.8kB dist/storage/backends/indexeddb-storage-backend.js
npm notice 6.7kB dist/storage/backends/indexeddb-storage-backend.js.map
npm notice 771B dist/storage/store.d.ts
npm notice 370B dist/storage/store.d.ts.map
npm notice 701B dist/storage/store.js
npm notice 462B dist/storage/store.js.map
npm notice 968B dist/storage/stores/custom-providers-store.d.ts
npm notice 994B dist/storage/stores/custom-providers-store.d.ts.map
npm notice 1.0kB dist/storage/stores/custom-providers-store.js
npm notice 1.1kB dist/storage/stores/custom-providers-store.js.map
npm notice 518B dist/storage/stores/provider-keys-store.d.ts
npm notice 600B dist/storage/stores/provider-keys-store.d.ts.map
npm notice 773B dist/storage/stores/provider-keys-store.js
npm notice 864B dist/storage/stores/provider-keys-store.js.map
npm notice 1.4kB dist/storage/stores/sessions-store.d.ts
npm notice 1.2kB dist/storage/stores/sessions-store.d.ts.map
npm notice 3.9kB dist/storage/stores/sessions-store.js
npm notice 3.7kB dist/storage/stores/sessions-store.js.map
npm notice 476B dist/storage/stores/settings-store.d.ts
npm notice 588B dist/storage/stores/settings-store.d.ts.map
npm notice 744B dist/storage/stores/settings-store.js
npm notice 840B dist/storage/stores/settings-store.js.map
npm notice 5.6kB dist/storage/types.d.ts
npm notice 3.4kB dist/storage/types.d.ts.map
npm notice 44B dist/storage/types.js
npm notice 113B dist/storage/types.js.map
npm notice 397B dist/tools/artifacts/ArtifactElement.d.ts
npm notice 402B dist/tools/artifacts/ArtifactElement.d.ts.map
npm notice 295B dist/tools/artifacts/ArtifactElement.js
npm notice 322B dist/tools/artifacts/ArtifactElement.js.map
npm notice 244B dist/tools/artifacts/ArtifactPill.d.ts
npm notice 312B dist/tools/artifacts/ArtifactPill.d.ts.map
npm notice 847B dist/tools/artifacts/ArtifactPill.js
npm notice 704B dist/tools/artifacts/ArtifactPill.js.map
npm notice 697B dist/tools/artifacts/artifacts-tool-renderer.d.ts
npm notice 620B dist/tools/artifacts/artifacts-tool-renderer.d.ts.map
npm notice 11.6kB dist/tools/artifacts/artifacts-tool-renderer.js
npm notice 8.7kB dist/tools/artifacts/artifacts-tool-renderer.js.map
npm notice 2.3kB dist/tools/artifacts/artifacts.d.ts
npm notice 1.6kB dist/tools/artifacts/artifacts.d.ts.map
npm notice 27.6kB dist/tools/artifacts/artifacts.js
npm notice 20.8kB dist/tools/artifacts/artifacts.js.map
npm notice 489B dist/tools/artifacts/Console.d.ts
npm notice 509B dist/tools/artifacts/Console.d.ts.map
npm notice 3.8kB dist/tools/artifacts/Console.js
npm notice 2.7kB dist/tools/artifacts/Console.js.map
npm notice 723B dist/tools/artifacts/DocxArtifact.d.ts
npm notice 671B dist/tools/artifacts/DocxArtifact.d.ts.map
npm notice 7.0kB dist/tools/artifacts/DocxArtifact.js
npm notice 4.0kB dist/tools/artifacts/DocxArtifact.js.map
npm notice 783B dist/tools/artifacts/ExcelArtifact.d.ts
npm notice 720B dist/tools/artifacts/ExcelArtifact.d.ts.map
npm notice 9.2kB dist/tools/artifacts/ExcelArtifact.js
npm notice 6.6kB dist/tools/artifacts/ExcelArtifact.js.map
npm notice 619B dist/tools/artifacts/GenericArtifact.d.ts
npm notice 582B dist/tools/artifacts/GenericArtifact.d.ts.map
npm notice 4.1kB dist/tools/artifacts/GenericArtifact.js
npm notice 2.4kB dist/tools/artifacts/GenericArtifact.js.map
npm notice 1.1kB dist/tools/artifacts/HtmlArtifact.d.ts
npm notice 912B dist/tools/artifacts/HtmlArtifact.d.ts.map
npm notice 8.0kB dist/tools/artifacts/HtmlArtifact.js
npm notice 5.4kB dist/tools/artifacts/HtmlArtifact.js.map
npm notice 636B dist/tools/artifacts/ImageArtifact.d.ts
npm notice 597B dist/tools/artifacts/ImageArtifact.d.ts.map
npm notice 4.2kB dist/tools/artifacts/ImageArtifact.js
npm notice 2.8kB dist/tools/artifacts/ImageArtifact.js.map
npm notice 453B dist/tools/artifacts/index.d.ts
npm notice 459B dist/tools/artifacts/index.d.ts.map
npm notice 414B dist/tools/artifacts/index.js
npm notice 429B dist/tools/artifacts/index.js.map
npm notice 663B dist/tools/artifacts/MarkdownArtifact.d.ts
npm notice 549B dist/tools/artifacts/MarkdownArtifact.d.ts.map
npm notice 3.2kB dist/tools/artifacts/MarkdownArtifact.js
npm notice 2.0kB dist/tools/artifacts/MarkdownArtifact.js.map
npm notice 805B dist/tools/artifacts/PdfArtifact.d.ts
npm notice 740B dist/tools/artifacts/PdfArtifact.d.ts.map
npm notice 6.9kB dist/tools/artifacts/PdfArtifact.js
npm notice 5.4kB dist/tools/artifacts/PdfArtifact.js.map
npm notice 588B dist/tools/artifacts/SvgArtifact.d.ts
npm notice 511B dist/tools/artifacts/SvgArtifact.d.ts.map
npm notice 3.1kB dist/tools/artifacts/SvgArtifact.js
npm notice 2.1kB dist/tools/artifacts/SvgArtifact.js.map
npm notice 628B dist/tools/artifacts/TextArtifact.d.ts
npm notice 531B dist/tools/artifacts/TextArtifact.d.ts.map
npm notice 4.1kB dist/tools/artifacts/TextArtifact.js
npm notice 3.0kB dist/tools/artifacts/TextArtifact.js.map
npm notice 990B dist/tools/extract-document.d.ts
npm notice 731B dist/tools/extract-document.d.ts.map
npm notice 10.3kB dist/tools/extract-document.js
npm notice 6.5kB dist/tools/extract-document.js.map
npm notice 772B dist/tools/index.d.ts
npm notice 576B dist/tools/index.d.ts.map
npm notice 1.4kB dist/tools/index.js
npm notice 1.0kB dist/tools/index.js.map
npm notice 1.8kB dist/tools/javascript-repl.d.ts
npm notice 1.4kB dist/tools/javascript-repl.d.ts.map
npm notice 10.3kB dist/tools/javascript-repl.js
npm notice 8.6kB dist/tools/javascript-repl.js.map
npm notice 1.2kB dist/tools/renderer-registry.d.ts
npm notice 837B dist/tools/renderer-registry.d.ts.map
npm notice 4.3kB dist/tools/renderer-registry.js
npm notice 3.1kB dist/tools/renderer-registry.js.map
npm notice 425B dist/tools/renderers/BashRenderer.d.ts
npm notice 452B dist/tools/renderers/BashRenderer.d.ts.map
npm notice 1.6kB dist/tools/renderers/BashRenderer.js
npm notice 1.5kB dist/tools/renderers/BashRenderer.js.map
npm notice 453B dist/tools/renderers/CalculateRenderer.d.ts
npm notice 464B dist/tools/renderers/CalculateRenderer.d.ts.map
npm notice 1.9kB dist/tools/renderers/CalculateRenderer.js
npm notice 1.7kB dist/tools/renderers/CalculateRenderer.js.map
npm notice 356B dist/tools/renderers/DefaultRenderer.d.ts
npm notice 397B dist/tools/renderers/DefaultRenderer.d.ts.map
npm notice 3.1kB dist/tools/renderers/DefaultRenderer.js
npm notice 2.3kB dist/tools/renderers/DefaultRenderer.js.map
npm notice 477B dist/tools/renderers/GetCurrentTimeRenderer.d.ts
npm notice 487B dist/tools/renderers/GetCurrentTimeRenderer.d.ts.map
npm notice 2.9kB dist/tools/renderers/GetCurrentTimeRenderer.js
npm notice 2.4kB dist/tools/renderers/GetCurrentTimeRenderer.js.map
npm notice 426B dist/tools/types.d.ts
npm notice 487B dist/tools/types.d.ts.map
npm notice 44B dist/tools/types.js
npm notice 111B dist/tools/types.js.map
npm notice 606B dist/utils/attachment-utils.d.ts
npm notice 527B dist/utils/attachment-utils.d.ts.map
npm notice 16.3kB dist/utils/attachment-utils.js
npm notice 13.8kB dist/utils/attachment-utils.js.map
npm notice 166B dist/utils/auth-token.d.ts
npm notice 204B dist/utils/auth-token.d.ts.map
npm notice 688B dist/utils/auth-token.js
npm notice 742B dist/utils/auth-token.js.map
npm notice 328B dist/utils/format.d.ts
npm notice 366B dist/utils/format.d.ts.map
npm notice 1.5kB dist/utils/format.js
npm notice 2.0kB dist/utils/format.js.map
npm notice 24.4kB dist/utils/i18n.d.ts
npm notice 6.1kB dist/utils/i18n.d.ts.map
npm notice 23.4kB dist/utils/i18n.js
npm notice 9.8kB dist/utils/i18n.js.map
npm notice 1.9kB dist/utils/model-discovery.d.ts
npm notice 880B dist/utils/model-discovery.d.ts.map
npm notice 9.6kB dist/utils/model-discovery.js
npm notice 7.0kB dist/utils/model-discovery.js.map
npm notice 1.4kB dist/utils/proxy-utils.d.ts
npm notice 527B dist/utils/proxy-utils.d.ts.map
npm notice 3.1kB dist/utils/proxy-utils.js
npm notice 1.7kB dist/utils/proxy-utils.js.map
npm notice 9.3kB dist/utils/test-sessions.d.ts
npm notice 547B dist/utils/test-sessions.d.ts.map
npm notice 154.8kB dist/utils/test-sessions.js
npm notice 38.5kB dist/utils/test-sessions.js.map
npm notice 422B example/index.html
npm notice 561B example/package.json
npm notice 1.7kB example/README.md
npm notice 30B example/src/app.css
npm notice 3.6kB example/src/custom-messages.ts
npm notice 11.9kB example/src/main.ts
npm notice 5.8kB example/src/test-sessions.ts
npm notice 580B example/tsconfig.json
npm notice 144B example/vite.config.ts
npm notice 1.6kB package.json
npm notice 2.2kB scripts/count-prompt-tokens.ts
npm notice 10.2kB src/agent/agent.ts
npm notice 11.2kB src/agent/transports/AppTransport.ts
npm notice 103B src/agent/transports/index.ts
npm notice 2.3kB src/agent/transports/ProviderTransport.ts
npm notice 906B src/agent/transports/proxy-types.ts
npm notice 902B src/agent/transports/types.ts
npm notice 298B src/agent/types.ts
npm notice 1.6kB src/app.css
npm notice 7.3kB src/ChatPanel.ts
npm notice 11.7kB src/components/AgentInterface.ts
npm notice 3.6kB src/components/AttachmentTile.ts
npm notice 2.2kB src/components/ConsoleBlock.ts
npm notice 3.0kB src/components/CustomProviderCard.ts
npm notice 1.5kB src/components/ExpandableSection.ts
npm notice 3.2kB src/components/Input.ts
npm notice 954B src/components/message-renderer-registry.ts
npm notice 12.0kB src/components/MessageEditor.ts
npm notice 2.8kB src/components/MessageList.ts
npm notice 9.2kB src/components/Messages.ts
npm notice 4.4kB src/components/ProviderKeyInput.ts
npm notice 6.3kB src/components/sandbox/ArtifactsRuntimeProvider.ts
npm notice 2.2kB src/components/sandbox/AttachmentsRuntimeProvider.ts
npm notice 5.0kB src/components/sandbox/ConsoleRuntimeProvider.ts
npm notice 3.3kB src/components/sandbox/FileDownloadRuntimeProvider.ts
npm notice 2.7kB src/components/sandbox/RuntimeMessageBridge.ts
npm notice 6.6kB src/components/sandbox/RuntimeMessageRouter.ts
npm notice 2.0kB src/components/sandbox/SandboxRuntimeProvider.ts
npm notice 19.6kB src/components/SandboxedIframe.ts
npm notice 3.6kB src/components/StreamingMessageContainer.ts
npm notice 1.5kB src/components/ThinkingBlock.ts
npm notice 2.0kB src/dialogs/ApiKeyPromptDialog.ts
npm notice 18.9kB src/dialogs/AttachmentOverlay.ts
npm notice 8.5kB src/dialogs/CustomProviderDialog.ts
npm notice 11.0kB src/dialogs/ModelSelector.ts
npm notice 4.5kB src/dialogs/PersistentStorageDialog.ts
npm notice 6.8kB src/dialogs/ProvidersModelsTab.ts
npm notice 4.9kB src/dialogs/SessionListDialog.ts
npm notice 6.2kB src/dialogs/SettingsDialog.ts
npm notice 5.7kB src/index.ts
npm notice 10.8kB src/prompts/prompts.ts
npm notice 1.7kB src/storage/app-storage.ts
npm notice 6.1kB src/storage/backends/indexeddb-storage-backend.ts
npm notice 868B src/storage/store.ts
npm notice 1.9kB src/storage/stores/custom-providers-store.ts
npm notice 837B src/storage/stores/provider-keys-store.ts
npm notice 3.9kB src/storage/stores/sessions-store.ts
npm notice 789B src/storage/stores/settings-store.ts
npm notice 5.2kB src/storage/types.ts
npm notice 410B src/tools/artifacts/ArtifactElement.ts
npm notice 889B src/tools/artifacts/ArtifactPill.ts
npm notice 10.4kB src/tools/artifacts/artifacts-tool-renderer.ts
npm notice 23.9kB src/tools/artifacts/artifacts.ts
npm notice 3.0kB src/tools/artifacts/Console.ts
npm notice 5.7kB src/tools/artifacts/DocxArtifact.ts
npm notice 7.1kB src/tools/artifacts/ExcelArtifact.ts
npm notice 3.2kB src/tools/artifacts/GenericArtifact.ts
npm notice 6.9kB src/tools/artifacts/HtmlArtifact.ts
npm notice 3.2kB src/tools/artifacts/ImageArtifact.ts
npm notice 418B src/tools/artifacts/index.ts
npm notice 2.4kB src/tools/artifacts/MarkdownArtifact.ts
npm notice 5.4kB src/tools/artifacts/PdfArtifact.ts
npm notice 2.3kB src/tools/artifacts/SvgArtifact.ts
npm notice 3.1kB src/tools/artifacts/TextArtifact.ts
npm notice 9.3kB src/tools/extract-document.ts
npm notice 1.5kB src/tools/index.ts
npm notice 9.9kB src/tools/javascript-repl.ts
npm notice 4.3kB src/tools/renderer-registry.ts
npm notice 1.7kB src/tools/renderers/BashRenderer.ts
npm notice 1.9kB src/tools/renderers/CalculateRenderer.ts
npm notice 2.8kB src/tools/renderers/DefaultRenderer.ts
npm notice 2.7kB src/tools/renderers/GetCurrentTimeRenderer.ts
npm notice 442B src/tools/types.ts
npm notice 14.2kB src/utils/attachment-utils.ts
npm notice 647B src/utils/auth-token.ts
npm notice 1.4kB src/utils/format.ts
npm notice 27.8kB src/utils/i18n.ts
npm notice 8.3kB src/utils/model-discovery.ts
npm notice 2.9kB src/utils/proxy-utils.ts
npm notice 128.7kB src/utils/test-sessions.ts
npm notice 501B tsconfig.build.json
npm notice 118B tsconfig.json
npm notice Tarball Details
npm notice name: @mariozechner/pi-web-ui
npm notice version: 0.27.3
npm notice filename: mariozechner-pi-web-ui-0.27.3.tgz
npm notice package size: 364.1 kB
npm notice unpacked size: 1.8 MB
npm notice shasum: d82256baa00e4365788bbee984eaa4ad0f069e64
npm notice integrity: sha512-BswpdNFC6Le28[...]G1ZwyOBwYlNPQ==
npm notice total files: 406
npm notice
npm notice Publishing to https://registry.npmjs.org/ with tag latest and public access
+ @mariozechner/pi-web-ui@0.27.3
npm notice
npm notice 📦  pi-web-ui-example@1.15.3
npm notice Tarball Contents
npm notice 1.7kB README.md
npm notice 422B index.html
npm notice 561B package.json
npm notice 30B src/app.css
npm notice 3.6kB src/custom-messages.ts
npm notice 11.9kB src/main.ts
npm notice 5.8kB src/test-sessions.ts
npm notice 580B tsconfig.json
npm notice 144B vite.config.ts
npm notice Tarball Details
npm notice name: pi-web-ui-example
npm notice version: 1.15.3
npm notice filename: pi-web-ui-example-1.15.3.tgz
npm notice package size: 7.8 kB
npm notice unpacked size: 24.7 kB
npm notice shasum: cdcef46465253633fe77c8f595c5d8096e636281
npm notice integrity: sha512-bCjph4wK6Fxv5[...]UvdNQtiHyCaZw==
npm notice total files: 9
npm notice
npm warn publish Skipping workspace pi-web-ui-example, marked as private

[Showing lines 446-1520 of 1520 (50.0KB limit). Full output: /var/folders/49/l4171l3n219_xwq30fmyzr8w0000gn/T/pi-bash-e5a84f2117a989ec.log]


Released v0.27.3 to npm.


how was markdown rendering added? vendored marked?


cd /Users/badlogic/workspaces/pi-mono && grep -rn "marked\|markdown" packages/coding-agent/src/core/export-html.ts | head -20


packages/coding-agent/src/core/export-html.ts:4:import { marked } from "marked";
packages/coding-agent/src/core/export-html.ts:325:/** Render markdown to HTML server-side with TUI-style code block formatting. */
packages/coding-agent/src/core/export-html.ts:328:	const renderer = new marked.Renderer();
packages/coding-agent/src/core/export-html.ts:341:	// Configure marked for safe rendering
packages/coding-agent/src/core/export-html.ts:342:	marked.setOptions({
packages/coding-agent/src/core/export-html.ts:347:	// Parse markdown (marked escapes HTML by default in newer versions)
packages/coding-agent/src/core/export-html.ts:348:	return marked.parse(text, { renderer }) as string;
packages/coding-agent/src/core/export-html.ts:752:		// Render text as markdown (server-side)
packages/coding-agent/src/core/export-html.ts:754:			html += `<div class="markdown-content">${renderMarkdown(textContent)}</div>`;
packages/coding-agent/src/core/export-html.ts:764:				// Render markdown server-side
packages/coding-agent/src/core/export-html.ts:765:				html += `<div class="assistant-text markdown-content">${renderMarkdown(content.text)}</div>`;
packages/coding-agent/src/core/export-html.ts:1030:        .markdown-content h1, .markdown-content h2, .markdown-content h3,
packages/coding-agent/src/core/export-html.ts:1031:        .markdown-content h4, .markdown-content h5, .markdown-content h6 {
packages/coding-agent/src/core/export-html.ts:1036:        .markdown-content h1 { font-size: 1.4em; text-decoration: underline; }
packages/coding-agent/src/core/export-html.ts:1037:        .markdown-content h2 { font-size: 1.2em; }
packages/coding-agent/src/core/export-html.ts:1038:        .markdown-content h3 { font-size: 1.1em; }
packages/coding-agent/src/core/export-html.ts:1039:        .markdown-content p { margin: 0.5em 0; }
packages/coding-agent/src/core/export-html.ts:1040:        .markdown-content a { color: ${colors.mdLink}; text-decoration: underline; }
packages/coding-agent/src/core/export-html.ts:1041:        .markdown-content a:hover { opacity: 0.8; }
packages/coding-agent/src/core/export-html.ts:1042:        .markdown-content code {


cd /Users/badlogic/workspaces/pi-mono && grep "marked" packages/coding-agent/package.json


"marked": "^15.0.12"


It's using the `marked` package (npm dependency), not vendored. It's imported at the top of `export-html.ts` and used to render markdown server-side during HTML export.


ah good, can we also add syntax highlighting like we do in @packages/coding-agent/src/modes/interactive/components/tool-execution.ts for e.g. the read tool or @packages/coding-agent/src/modes/interactive/components/assistant-message.ts and @packages/coding-agent/src/modes/interactive/components/user-message.ts ?


Let me check how syntax highlighting is done in those files:

cd /Users/badlogic/workspaces/pi-mono && grep -n "highlight\|shiki\|Shiki" packages/coding-agent/src/modes/interactive/components/tool-execution.ts | head -20


16:import { getLanguageFromPath, highlightCode, theme } from "../theme/theme.js";
340:				const lines = lang ? highlightCode(replaceTabs(output), lang) : output.split("\n");
388:					? highlightCode(replaceTabs(fileContent), lang)


oh, and it would also be nice to display compaction events as expandable blocks, like we do in the tui (probably in @packages/coding-agent/src/modes/interactive/interactive-mode.ts )


cd /Users/badlogic/workspaces/pi-mono && grep -n "highlightCode\|shiki" packages/coding-agent/src/modes/interactive/theme/theme.ts | head -20


675:export function highlightCode(code: string, lang?: string): string[] {
777:		highlightCode: (code: string, lang?: string): string[] => {


/**
 * Highlight code with syntax coloring based on file extension or language.
 * Returns array of highlighted lines.
 */
export function highlightCode(code: string, lang?: string): string[] {
	// Validate language before highlighting to avoid stderr spam from cli-highlight
	const validLang = lang && supportsLanguage(lang) ? lang : undefined;
	const opts = {
		language: validLang,
		ignoreIllegals: true,
		theme: getCliHighlightTheme(theme),
	};
	try {
		return highlight(code, opts).split("\n");
	} catch {
		return code.split("\n");
	}
}

/**
 * Get language identifier from file path extension.
 */
export function getLanguageFromPath(filePath: string): string | undefined {
	const ext = filePath.split(".").pop()?.toLowerCase();
	if (!ext) return undefined;

	const extToLang: Record<string, string> = {
		ts: "typescript",
		tsx: "typescript",
		js: "javascript",
		jsx: "javascript",
		mjs: "javascript",
		cjs: "javascript",
		py: "python",
		rb: "ruby",
		rs: "rust",
		go: "go",
		java: "java",
		kt: "kotlin",
		swift: "swift",
		c: "c",
		h: "c",
		cpp: "cpp",
		cc: "cpp",
		cxx: "cpp",
		hpp: "cpp",
		cs: "csharp",
		php: "php",
		sh: "bash",

[91 more lines in file. Use offset=720 to continue]


cd /Users/badlogic/workspaces/pi-mono && grep -n "cli-highlight" packages/coding-agent/package.json


46:		"cli-highlight": "^2.1.11",


Now let me check how compaction is displayed in the TUI:

cd /Users/badlogic/workspaces/pi-mono && grep -n "compaction\|Compaction" packages/coding-agent/src/modes/interactive/interactive-mode.ts | head -20


36:	getLatestCompactionEntry,
49:import { CompactionComponent } from "./components/compaction.js";
112:	// Auto-compaction state
113:	private autoCompactionLoader: Loader | null = null;
114:	private autoCompactionEscapeHandler?: () => void;
158:		this.footer.setAutoCompactEnabled(session.autoCompactionEnabled);
176:			{ name: "autocompact", description: "Toggle automatic context compaction" },
736:			// Block input during compaction
911:			case "auto_compaction_start": {
912:				// Disable submit to preserve editor text during compaction
914:				// Set up escape to abort auto-compaction
915:				this.autoCompactionEscapeHandler = this.editor.onEscape;
917:					this.session.abortCompaction();
922:				this.autoCompactionLoader = new Loader(
928:				this.statusContainer.addChild(this.autoCompactionLoader);
933:			case "auto_compaction_end": {
937:				if (this.autoCompactionEscapeHandler) {
938:					this.editor.onEscape = this.autoCompactionEscapeHandler;
939:					this.autoCompactionEscapeHandler = undefined;
942:				if (this.autoCompactionLoader) {


import { Container, Markdown, Spacer, Text } from "@mariozechner/pi-tui";
import { getMarkdownTheme, theme } from "../theme/theme.js";

/**
 * Component that renders a compaction indicator with collapsed/expanded state.
 * Collapsed: shows "Context compacted from X tokens"
 * Expanded: shows the full summary rendered as markdown (like a user message)
 */
export class CompactionComponent extends Container {
	private expanded = false;
	private tokensBefore: number;
	private summary: string;

	constructor(tokensBefore: number, summary: string) {
		super();
		this.tokensBefore = tokensBefore;
		this.summary = summary;
		this.updateDisplay();
	}

	setExpanded(expanded: boolean): void {
		this.expanded = expanded;
		this.updateDisplay();
	}

	private updateDisplay(): void {
		this.clear();

		if (this.expanded) {
			// Show header + summary as markdown (like user message)
			this.addChild(new Spacer(1));
			const header = `**Context compacted from ${this.tokensBefore.toLocaleString()} tokens**\n\n`;
			this.addChild(
				new Markdown(header + this.summary, 1, 1, getMarkdownTheme(), {
					bgColor: (text: string) => theme.bg("userMessageBg", text),
					color: (text: string) => theme.fg("userMessageText", text),
				}),
			);
			this.addChild(new Spacer(1));
		} else {
			// Collapsed: simple text in warning color with token count
			const tokenStr = this.tokensBefore.toLocaleString();
			this.addChild(
				new Text(
					theme.fg("warning", `Earlier messages compacted from ${tokenStr} tokens (ctrl+o to expand)`),
					1,
					1,
				),
			);
		}
	}
}


Now let me check how compaction events are currently handled in export-html.ts:

cd /Users/badlogic/workspaces/pi-mono && grep -n "compaction\|Compaction" packages/coding-agent/src/core/export-html.ts


29:interface CompactionEvent {
30:	type: "compaction";
36:type SessionEvent = MessageEvent | ModelChangeEvent | CompactionEvent;
457:			case "compaction":
459:					type: "compaction",
808:function formatCompaction(event: CompactionEvent): string {
813:	return `

814:

816:

817:				▶
818:				Context compacted from ${event.tokensBefore.toLocaleString()} tokens
819:				(click to expand summary)
822:

823:

824:
Summary sent to model

825:
${summaryHtml}

878:			case "compaction":
879:				messagesHtml += formatCompaction(event);
913:	const compactionBg = isLight ? "rgb(255, 248, 220)" : "rgb(60, 55, 35)";
970:        .compaction-container { background: ${compactionBg}; border-radius: 4px; overflow: hidden; }
971:        .compaction-header { padding: 12px 16px; cursor: pointer; }
972:        .compaction-header:hover { background: rgba(${isLight ? "0, 0, 0" : "255, 255, 255"}, 0.05); }
973:        .compaction-header-row { display: flex; align-items: center; gap: 8px; }
974:        .compaction-toggle { color: ${colors.borderAccent}; font-size: 10px; transition: transform 0.2s; }
975:        .compaction-container.expanded .compaction-toggle { transform: rotate(90deg); }
976:        .compaction-title { color: ${colors.text}; font-weight: bold; }
977:        .compaction-hint { color: ${colors.dim}; font-size: 11px; }
978:        .compaction-content { display: none; padding: 0 16px 16px 16px; }
979:        .compaction-container.expanded .compaction-content { display: block; }
980:        .compaction-summary { background: rgba(0, 0, 0, 0.1); border-radius: 4px; padding: 12px; }
981:        .compaction-summary-header { font-weight: bold; color: ${colors.borderAccent}; margin-bottom: 8px; font-size: 11px; }
982:        .compaction-summary-content { color: ${colors.text}; white-space: pre-wrap; word-wrap: break-word; }


Good, compaction is already handled in export-html.ts with expandable blocks. Now let me look at how syntax highlighting could be added. The issue is that `cli-highlight` is terminal-specific (outputs ANSI codes). For HTML, we need a different approach. Let me check if there's a highlight.js we can use:

cd /Users/badlogic/workspaces/pi-mono && grep -n "highlight.js\|hljs" packages/coding-agent/package.json


(no output)

Command exited with code 1


cd /Users/badlogic/workspaces/pi-mono && cat packages/coding-agent/node_modules/cli-highlight/package.json | grep -A5 '"dependencies"'


cat: packages/coding-agent/node_modules/cli-highlight/package.json: No such file or directory

Command exited with code 1


cd /Users/badlogic/workspaces/pi-mono && cat node_modules/cli-highlight/package.json 2>/dev/null | grep -A5 '"dependencies"' || echo "not found"


  "dependencies": {
    "chalk": "^4.0.0",
    "highlight.js": "^10.7.1",
    "mz": "^2.4.0",
    "parse5": "^5.1.1",
    "parse5-htmlparser2-tree-adapter": "^6.0.0",


`cli-highlight` uses `highlight.js` under the hood. We can use highlight.js directly for HTML output. Let me check what's currently in export-html.ts for code blocks:

cd /Users/badlogic/workspaces/pi-mono && grep -n "code-block\|pre>\|<code" packages/coding-agent/src/core/export-html.ts | head -30


333:			'
' +
334:			`<div class="code-block-header">\`\`\`${language}
` +
335:			`<pre><code>${escaped}</code></pre>` +
336:			'
```
' +
678:			html += `<div class="tool-output"><pre>${escapeHtml(JSON.stringify(args, null, 2))}</pre></div>`;
1063:        .code-block-wrapper {
1066:        .code-block-header {
1070:        .code-block-footer {


/** Render markdown to HTML server-side with TUI-style code block formatting. */
function renderMarkdown(text: string): string {
	// Custom renderer for code blocks to match TUI style
	const renderer = new marked.Renderer();
	renderer.code = ({ text: code, lang }: { text: string; lang?: string }) => {
		const language = lang || "";
		const escaped = escapeHtml(code);
		return (
			'
' +
			`<div class="code-block-header">\`\`\`${language}
` +
			`<pre><code>${escaped}</code></pre>` +
			'
```
' +
			"
"
		);
	};

	// Configure marked for safe rendering
	marked.setOptions({
		breaks: true,
		gfm: true,
	});

	// Parse markdown (marked escapes HTML by default in newer versions)
	return marked.parse(text, { renderer }) as string;
}

function formatExpandableOutput(lines: string[], maxLines: number): string {
	const displayLines = lines.slice(0, maxLines);
	const remaining = lines.length - maxLines;

[898 more lines in file. Use offset=355 to continue]


Now I understand the structure. I'll add highlight.js for syntax highlighting in the HTML export. Let me create the implementation:


import type { AgentState } from "@mariozechner/pi-agent-core";
import type { AssistantMessage, ImageContent, Message, ToolResultMessage, UserMessage } from "@mariozechner/pi-ai";
import { existsSync, readFileSync, writeFileSync } from "fs";
import { marked } from "marked";
import { homedir } from "os";
import * as path from "path";
import { basename } from "path";
import { APP_NAME, getCustomThemesDir, getThemesDir, VERSION } from "../config.js";
import { type BashExecutionMessage, isBashExecutionMessage } from "./messages.js";
import type { SessionManager } from "./session-manager.js";

// ============================================================================
// Types
// ============================================================================

interface MessageEvent {
	type: "message";
	message: Message;
	timestamp?: number;
}

interface ModelChangeEvent {
	type: "model_change";
	provider: string;
	modelId: string;
	timestamp?: number;
}

interface CompactionEvent {
	type: "compaction";

[1222 more lines in file. Use offset=31 to continue]


edit

import type { AgentState } from "@mariozechner/pi-agent-core";
import type { AssistantMessage, ImageContent, Message, ToolResultMessage, UserMessage } from "@mariozechner/pi-ai";
import { existsSync, readFileSync, writeFileSync } from "fs";
import { marked } from "marked";
import { homedir } from "os";
import * as path from "path";
import { basename } from "path";
import { APP_NAME, getCustomThemesDir, getThemesDir, VERSION } from "../config.js";

import type { AgentState } from "@mariozechner/pi-agent-core";
import type { AssistantMessage, ImageContent, Message, ToolResultMessage, UserMessage } from "@mariozechner/pi-ai";
import { existsSync, readFileSync, writeFileSync } from "fs";
import hljs from "highlight.js";
import { marked } from "marked";
import { homedir } from "os";
import * as path from "path";
import { basename } from "path";
import { APP_NAME, getCustomThemesDir, getThemesDir, VERSION } from "../config.js";


Successfully replaced text in /Users/badlogic/workspaces/pi-mono/packages/coding-agent/src/core/export-html.ts. Changed 450 characters to 483 characters.

    1 import type { AgentState } from "@mariozechner/pi-agent-core";
    2 import type { AssistantMessage, ImageContent, Message, ToolResultMessage, UserMessage } from "@mariozechner/pi-ai";
    3 import { existsSync, readFileSync, writeFileSync } from "fs";
+   4 import hljs from "highlight.js";
    4 import { marked } from "marked";
    5 import { homedir } from "os";
    6 import * as path from "path";
    7 import { basename } from "path";
      ...


Now let me add a helper function for syntax highlighting and update the code block renderer:


}

function formatTimestamp(timestamp: number | string | undefined): string {
	if (!timestamp) return "";
	const date = new Date(typeof timestamp === "string" ? timestamp : timestamp);
	return date.toLocaleTimeString(undefined, { hour: "2-digit", minute: "2-digit", second: "2-digit" });
}

/** Render markdown to HTML server-side with TUI-style code block formatting. */
function renderMarkdown(text: string): string {
	// Custom renderer for code blocks to match TUI style
	const renderer = new marked.Renderer();
	renderer.code = ({ text: code, lang }: { text: string; lang?: string }) => {
		const language = lang || "";
		const escaped = escapeHtml(code);
		return (
			'
' +
			`<div class="code-block-header">\`\`\`${language}
` +
			`<pre><code>${escaped}</code></pre>` +
			'
```
' +
			"
"
		);
	};

	// Configure marked for safe rendering
	marked.setOptions({
		breaks: true,
		gfm: true,
	});

	// Parse markdown (marked escapes HTML by default in newer versions)
	return marked.parse(text, { renderer }) as string;
}

function formatExpandableOutput(lines: string[], maxLines: number): string {
	const displayLines = lines.slice(0, maxLines);
	const remaining = lines.length - maxLines;

	if (remaining > 0) {
		let out = '
';
		out += '
';
		for (const line of displayLines) {
			out += `<div>${escapeHtml(replaceTabs(line))}</div>`;
		}
		out += `<div class="expand-hint">... (${remaining} more lines) - click to expand</div>`;

[891 more lines in file. Use offset=363 to continue]


/** Render markdown to HTML server-side with TUI-style code block formatting. */
function renderMarkdown(text: string): string {
	// Custom renderer for code blocks to match TUI style
	const renderer = new marked.Renderer();
	renderer.code = ({ text: code, lang }: { text: string; lang?: string }) => {
		const language = lang || "";
		const escaped = escapeHtml(code);
		return (
			'
' +
			`<div class="code-block-header">\`\`\`${language}
` +
			`<pre><code>${escaped}</code></pre>` +
			'
```
' +
			"
"
		);
	};

	// Configure marked for safe rendering
	marked.setOptions({
		breaks: true,
		gfm: true,
	});

	// Parse markdown (marked escapes HTML by default in newer versions)
	return marked.parse(text, { renderer }) as string;
}

/** Highlight code using highlight.js. Returns HTML with syntax highlighting spans. */
function highlightCode(code: string, lang?: string): string {
	if (!lang) {
		return escapeHtml(code);
	}
	try {
		// Check if language is supported
		if (hljs.getLanguage(lang)) {
			return hljs.highlight(code, { language: lang, ignoreIllegals: true }).value;
		}
		// Try common aliases
		const aliases: Record<string, string> = {
			ts: "typescript",
			js: "javascript",
			py: "python",
			rb: "ruby",
			sh: "bash",
			yml: "yaml",
			md: "markdown",
		};
		const aliasedLang = aliases[lang];
		if (aliasedLang && hljs.getLanguage(aliasedLang)) {
			return hljs.highlight(code, { language: aliasedLang, ignoreIllegals: true }).value;
		}
	} catch {
		// Fall through to escaped output
	}
	return escapeHtml(code);
}

/** Get language from file path extension. */
function getLanguageFromPath(filePath: string): string | undefined {
	const ext = filePath.split(".").pop()?.toLowerCase();
	if (!ext) return undefined;

	const extToLang: Record<string, string> = {
		ts: "typescript",
		tsx: "typescript",
		js: "javascript",
		jsx: "javascript",
		mjs: "javascript",
		cjs: "javascript",
		py: "python",
		rb: "ruby",
		rs: "rust",
		go: "go",
		java: "java",
		kt: "kotlin",
		swift: "swift",
		c: "c",
		h: "c",
		cpp: "cpp",
		cc: "cpp",
		cxx: "cpp",
		hpp: "cpp",
		cs: "csharp",
		php: "php",
		sh: "bash",
		bash: "bash",
		zsh: "bash",
		fish: "bash",
		ps1: "powershell",
		sql: "sql",
		html: "html",
		htm: "html",
		xml: "xml",
		css: "css",
		scss: "scss",
		sass: "scss",
		less: "less",
		json: "json",
		yaml: "yaml",
		yml: "yaml",
		toml: "toml",
		ini: "ini",
		md: "markdown",
		markdown: "markdown",
		dockerfile: "dockerfile",
		makefile: "makefile",
		cmake: "cmake",
		lua: "lua",
		r: "r",
		scala: "scala",
		clj: "clojure",
		cljs: "clojure",
		ex: "elixir",
		exs: "elixir",
		erl: "erlang",
		hrl: "erlang",
		hs: "haskell",
		ml: "ocaml",
		mli: "ocaml",
		fs: "fsharp",
		fsx: "fsharp",
		vue: "vue",
		svelte: "xml",
		tf: "hcl",
		hcl: "hcl",
		proto: "protobuf",
		graphql: "graphql",
		gql: "graphql",
	};

	return extToLang[ext];
}

/** Render markdown to HTML server-side with TUI-style code block formatting and syntax highlighting. */
function renderMarkdown(text: string): string {
	// Custom renderer for code blocks to match TUI style
	const renderer = new marked.Renderer();
	renderer.code = ({ text: code, lang }: { text: string; lang?: string }) => {
		const language = lang || "";
		const highlighted = highlightCode(code, lang);
		return (
			'
' +
			`<div class="code-block-header">\`\`\`${language}
` +
			`<pre><code class="hljs">${highlighted}</code></pre>` +
			'
```
' +
			"
"
		);
	};

	// Configure marked for safe rendering
	marked.setOptions({
		breaks: true,
		gfm: true,
	});

	// Parse markdown (marked escapes HTML by default in newer versions)
	return marked.parse(text, { renderer }) as string;
}


Successfully replaced text in /Users/badlogic/workspaces/pi-mono/packages/coding-agent/src/core/export-html.ts. Changed 814 characters to 3028 characters.

...
  322 	const date = new Date(typeof timestamp === "string" ? timestamp : timestamp);
  323 	return date.toLocaleTimeString(undefined, { hour: "2-digit", minute: "2-digit", second: "2-digit" });
  324 }
  325
- 326 /** Render markdown to HTML server-side with TUI-style code block formatting. */
+ 326 /** Highlight code using highlight.js. Returns HTML with syntax highlighting spans. */
+ 327 function highlightCode(code: string, lang?: string): string {
+ 328 	if (!lang) {
+ 329 		return escapeHtml(code);
+ 330 	}
+ 331 	try {
+ 332 		// Check if language is supported
+ 333 		if (hljs.getLanguage(lang)) {
+ 334 			return hljs.highlight(code, { language: lang, ignoreIllegals: true }).value;
+ 335 		}
+ 336 		// Try common aliases
+ 337 		const aliases: Record<string, string> = {
+ 338 			ts: "typescript",
+ 339 			js: "javascript",
+ 340 			py: "python",
+ 341 			rb: "ruby",
+ 342 			sh: "bash",
+ 343 			yml: "yaml",
+ 344 			md: "markdown",
+ 345 		};
+ 346 		const aliasedLang = aliases[lang];
+ 347 		if (aliasedLang && hljs.getLanguage(aliasedLang)) {
+ 348 			return hljs.highlight(code, { language: aliasedLang, ignoreIllegals: true }).value;
+ 349 		}
+ 350 	} catch {
+ 351 		// Fall through to escaped output
+ 352 	}
+ 353 	return escapeHtml(code);
+ 354 }
+ 355
+ 356 /** Get language from file path extension. */
+ 357 function getLanguageFromPath(filePath: string): string | undefined {
+ 358 	const ext = filePath.split(".").pop()?.toLowerCase();
+ 359 	if (!ext) return undefined;
+ 360
+ 361 	const extToLang: Record<string, string> = {
+ 362 		ts: "typescript",
+ 363 		tsx: "typescript",
+ 364 		js: "javascript",
+ 365 		jsx: "javascript",
+ 366 		mjs: "javascript",
+ 367 		cjs: "javascript",
+ 368 		py: "python",
+ 369 		rb: "ruby",
+ 370 		rs: "rust",
+ 371 		go: "go",
+ 372 		java: "java",
+ 373 		kt: "kotlin",
+ 374 		swift: "swift",
+ 375 		c: "c",
+ 376 		h: "c",
+ 377 		cpp: "cpp",
+ 378 		cc: "cpp",
+ 379 		cxx: "cpp",
+ 380 		hpp: "cpp",
+ 381 		cs: "csharp",
+ 382 		php: "php",
+ 383 		sh: "bash",
+ 384 		bash: "bash",
+ 385 		zsh: "bash",
+ 386 		fish: "bash",
+ 387 		ps1: "powershell",
+ 388 		sql: "sql",
+ 389 		html: "html",
+ 390 		htm: "html",
+ 391 		xml: "xml",
+ 392 		css: "css",
+ 393 		scss: "scss",
+ 394 		sass: "scss",
+ 395 		less: "less",
+ 396 		json: "json",
+ 397 		yaml: "yaml",
+ 398 		yml: "yaml",
+ 399 		toml: "toml",
+ 400 		ini: "ini",
+ 401 		md: "markdown",
+ 402 		markdown: "markdown",
+ 403 		dockerfile: "dockerfile",
+ 404 		makefile: "makefile",
+ 405 		cmake: "cmake",
+ 406 		lua: "lua",
+ 407 		r: "r",
+ 408 		scala: "scala",
+ 409 		clj: "clojure",
+ 410 		cljs: "clojure",
+ 411 		ex: "elixir",
+ 412 		exs: "elixir",
+ 413 		erl: "erlang",
+ 414 		hrl: "erlang",
+ 415 		hs: "haskell",
+ 416 		ml: "ocaml",
+ 417 		mli: "ocaml",
+ 418 		fs: "fsharp",
+ 419 		fsx: "fsharp",
+ 420 		vue: "vue",
+ 421 		svelte: "xml",
+ 422 		tf: "hcl",
+ 423 		hcl: "hcl",
+ 424 		proto: "protobuf",
+ 425 		graphql: "graphql",
+ 426 		gql: "graphql",
+ 427 	};
+ 428
+ 429 	return extToLang[ext];
+ 430 }
+ 431
+ 432 /** Render markdown to HTML server-side with TUI-style code block formatting and syntax highlighting. */
  327 function renderMarkdown(text: string): string {
  328 	// Custom renderer for code blocks to match TUI style
  329 	const renderer = new marked.Renderer();
  330 	renderer.code = ({ text: code, lang }: { text: string; lang?: string }) => {
  331 		const language = lang || "";
- 332 		const escaped = escapeHtml(code);
+ 438 		const highlighted = highlightCode(code, lang);
  333 		return (
  334 			'
' +
  335 			`<div class="code-block-header">\`\`\`${language}
` +
- 336 			`<pre><code>${escaped}</code></pre>` +
+ 442 			`<pre><code class="hljs">${highlighted}</code></pre>` +
  337 			'
```
' +
  338 			"
"
  339 		);
  340 	};
      ...


Now let me find where tool outputs (like read tool) are rendered and add syntax highlighting there:

bash

cd /Users/badlogic/workspaces/pi-mono && grep -n "formatToolCall\|read\|write\|edit" packages/coding-agent/src/core/export-html.ts | head -30


3:import { existsSync, readFileSync, writeFileSync } from "fs";
131:			return JSON.parse(readFileSync(builtinPath, "utf-8")) as ThemeJson;
142:			return JSON.parse(readFileSync(customPath, "utf-8")) as ThemeJson;
710:		case "read": {
723:			html = `<div class="tool-header"><span class="tool-name">read</span> <span class="tool-path">${pathHtml}</span></div>`;
733:		case "write": {
738:			html = `<div class="tool-header"><span class="tool-name">write</span> <span class="tool-path">${escapeHtml(path || "...")}</span>`;
756:		case "edit": {
758:			html = `<div class="tool-header"><span class="tool-name">edit</span> <span class="tool-path">${escapeHtml(path || "...")}</span></div>`;
1303:	const content = readFileSync(sessionFile, "utf8");
1325:	writeFileSync(outputPath, html, "utf8");
1344:	const content = readFileSync(inputPath, "utf8");
1356:	writeFileSync(outputPath, html, "utf8");


}
			}
			break;
		}

		case "read": {
			const filePath = shortenPath((args?.file_path as string) || (args?.path as string) || "");
			const offset = args?.offset as number | undefined;
			const limit = args?.limit as number | undefined;

			// Build path display with offset/limit suffix
			let pathHtml = escapeHtml(filePath || "...");
			if (offset !== undefined || limit !== undefined) {
				const startLine = offset ?? 1;
				const endLine = limit !== undefined ? startLine + limit - 1 : "";
				pathHtml += `<span class="line-numbers">:${startLine}${endLine ? `-${endLine}` : ""}</span>`;
			}

			html = `<div class="tool-header"><span class="tool-name">read</span> <span class="tool-path">${pathHtml}</span></div>`;
			if (result) {
				const output = getTextOutput();
				if (output) {
					html += formatExpandableOutput(output.split("\n"), 10);
				}
			}
			break;
		}

		case "write": {
			const path = shortenPath((args?.file_path as string) || (args?.path as string) || "");
			const fileContent = (args?.content as string) || "";
			const lines = fileContent ? fileContent.split("\n") : [];

			html = `<div class="tool-header"><span class="tool-name">write</span> <span class="tool-path">${escapeHtml(path || "...")}</span>`;
			if (lines.length > 10) {
				html += ` <span class="line-count">(${lines.length} lines)</span>`;
			}
			html += "
";

			if (fileContent) {
				html += formatExpandableOutput(lines, 10);
			}
			if (result) {
				const output = getTextOutput().trim();
				if (output) {
					html += `<div class="tool-output"><div>${escapeHtml(output)}</div></div>`;
				}
			}
			break;
		}

		case "edit": {
			const path = shortenPath((args?.file_path as string) || (args?.path as string) || "");
			html = `<div class="tool-header"><span class="tool-name">edit</span> <span class="tool-path">${escapeHtml(path || "...")}</span></div>`;

			if (result?.details?.diff) {
				const diffLines = result.details.diff.split("\n");
				html += '
';
				for (const line of diffLines) {
					if (line.startsWith("+")) {
						html += `<div class="diff-line-new">${escapeHtml(line)}</div>`;
					} else if (line.startsWith("-")) {
						html += `<div class="diff-line-old">${escapeHtml(line)}</div>`;
					} else {
						html += `<div class="diff-line-context">${escapeHtml(line)}</div>`;
					}
				}
				html += "
";
			}
			if (result) {
				const output = getTextOutput().trim();
				if (output) {
					html += `<div class="tool-output"><div>${escapeHtml(output)}</div></div>`;
				}
			}
			break;
		}

		default: {
			html = `<div class="tool-header"><span class="tool-name">${escapeHtml(toolName)}</span></div>`;

[575 more lines in file. Use offset=785 to continue]


Now let me update the `formatExpandableOutput` function to support syntax highlighting and update the read/write/edit handlers:


);
	};

	// Configure marked for safe rendering
	marked.setOptions({
		breaks: true,
		gfm: true,
	});

	// Parse markdown (marked escapes HTML by default in newer versions)
	return marked.parse(text, { renderer }) as string;
}

function formatExpandableOutput(lines: string[], maxLines: number): string {
	const displayLines = lines.slice(0, maxLines);
	const remaining = lines.length - maxLines;

	if (remaining > 0) {
		let out = '
';
		out += '
';
		for (const line of displayLines) {
			out += `<div>${escapeHtml(replaceTabs(line))}</div>`;
		}
		out += `<div class="expand-hint">... (${remaining} more lines) - click to expand</div>`;
		out += "
";
		out += '
';
		for (const line of lines) {
			out += `<div>${escapeHtml(replaceTabs(line))}</div>`;
		}
		out += "

";
		return out;
	}

	let out = '
';
	for (const line of displayLines) {
		out += `<div>${escapeHtml(replaceTabs(line))}</div>`;
	}
	out += "
";
	return out;
}

// ============================================================================
// Parsing functions
// ============================================================================

function parseSessionManagerFormat(lines: string[]): ParsedSessionData {
	const data: ParsedSessionData = {
		sessionId: "unknown",
		timestamp: new Date().toISOString(),
		modelsUsed: new Set(),

[865 more lines in file. Use offset=495 to continue]


edit

function formatExpandableOutput(lines: string[], maxLines: number): string {
	const displayLines = lines.slice(0, maxLines);
	const remaining = lines.length - maxLines;

	if (remaining > 0) {
		let out = '
';
		out += '
';
		for (const line of displayLines) {
			out += `<div>${escapeHtml(replaceTabs(line))}</div>`;
		}
		out += `<div class="expand-hint">... (${remaining} more lines) - click to expand</div>`;
		out += "
";
		out += '
';
		for (const line of lines) {
			out += `<div>${escapeHtml(replaceTabs(line))}</div>`;
		}
		out += "

";
		return out;
	}

	let out = '
';
	for (const line of displayLines) {
		out += `<div>${escapeHtml(replaceTabs(line))}</div>`;
	}
	out += "
";
	return out;
}

function formatExpandableOutput(lines: string[], maxLines: number, lang?: string): string {
	const displayLines = lines.slice(0, maxLines);
	const remaining = lines.length - maxLines;

	// If language is provided, highlight the entire code block
	if (lang) {
		const code = lines.join("\n");
		const highlighted = highlightCode(code, lang);

		if (remaining > 0) {
			// For expandable, we need preview and full versions
			const previewCode = displayLines.join("\n");
			const previewHighlighted = highlightCode(previewCode, lang);

			let out = '
';
			out += `<div class="output-preview"><pre><code class="hljs">${previewHighlighted}</code></pre>`;
			out += `<div class="expand-hint">... (${remaining} more lines) - click to expand</div>`;
			out += "
";
			out += `<div class="output-full"><pre><code class="hljs">${highlighted}</code></pre></div></div>`;
			return out;
		}

		return `<div class="tool-output"><pre><code class="hljs">${highlighted}</code></pre></div>`;
	}

	// No language - plain text output
	if (remaining > 0) {
		let out = '
';
		out += '
';
		for (const line of displayLines) {
			out += `<div>${escapeHtml(replaceTabs(line))}</div>`;
		}
		out += `<div class="expand-hint">... (${remaining} more lines) - click to expand</div>`;
		out += "
";
		out += '
';
		for (const line of lines) {
			out += `<div>${escapeHtml(replaceTabs(line))}</div>`;
		}
		out += "

";
		return out;
	}

	let out = '
';
	for (const line of displayLines) {
		out += `<div>${escapeHtml(replaceTabs(line))}</div>`;
	}
	out += "
";
	return out;
}


Successfully replaced text in /Users/badlogic/workspaces/pi-mono/packages/coding-agent/src/core/export-html.ts. Changed 878 characters to 1810 characters.

...
  454 	// Parse markdown (marked escapes HTML by default in newer versions)
  455 	return marked.parse(text, { renderer }) as string;
  456 }
  457
- 458 function formatExpandableOutput(lines: string[], maxLines: number): string {
+ 458 function formatExpandableOutput(lines: string[], maxLines: number, lang?: string): string {
  459 	const displayLines = lines.slice(0, maxLines);
  460 	const remaining = lines.length - maxLines;
  461
+ 462 	// If language is provided, highlight the entire code block
+ 463 	if (lang) {
+ 464 		const code = lines.join("\n");
+ 465 		const highlighted = highlightCode(code, lang);
+ 466
+ 467 		if (remaining > 0) {
+ 468 			// For expandable, we need preview and full versions
+ 469 			const previewCode = displayLines.join("\n");
+ 470 			const previewHighlighted = highlightCode(previewCode, lang);
+ 471
+ 472 			let out = '
';
+ 473 			out += `<div class="output-preview"><pre><code class="hljs">${previewHighlighted}</code></pre>`;
+ 474 			out += `<div class="expand-hint">... (${remaining} more lines) - click to expand</div>`;
+ 475 			out += "
";
+ 476 			out += `<div class="output-full"><pre><code class="hljs">${highlighted}</code></pre></div></div>`;
+ 477 			return out;
+ 478 		}
+ 479
+ 480 		return `<div class="tool-output"><pre><code class="hljs">${highlighted}</code></pre></div>`;
+ 481 	}
+ 482
+ 483 	// No language - plain text output
  462 	if (remaining > 0) {
  463 		let out = '
';
  464 		out += '
';
  465 		for (const line of displayLines) {
      ...


Now update the read/write tool handlers to pass the language:


}
			}
			break;
		}

		case "write": {
			const path = shortenPath((args?.file_path as string) || (args?.path as string) || "");
			const fileContent = (args?.content as string) || "";
			const lines = fileContent ? fileContent.split("\n") : [];

			html = `<div class="tool-header"><span class="tool-name">write</span> <span class="tool-path">${escapeHtml(path || "...")}</span>`;
			if (lines.length > 10) {
				html += ` <span class="line-count">(${lines.length} lines)</span>`;
			}
			html += "
";

			if (fileContent) {
				html += formatExpandableOutput(lines, 10);
			}
			if (result) {
				const output = getTextOutput().trim();
				if (output) {
					html += `<div class="tool-output"><div>${escapeHtml(output)}</div></div>`;
				}
			}
			break;
		}

		case "edit": {
			const path = shortenPath((args?.file_path as string) || (args?.path as string) || "");
			html = `<div class="tool-header"><span class="tool-name">edit</span> <span class="tool-path">${escapeHtml(path || "...")}</span></div>`;

			if (result?.details?.diff) {
				const diffLines = result.details.diff.split("\n");
				html += '
';
				for (const line of diffLines) {
					if (line.startsWith("+")) {
						html += `<div class="diff-line-new">${escapeHtml(line)}</div>`;
					} else if (line.startsWith("-")) {
						html += `<div class="diff-line-old">${escapeHtml(line)}</div>`;
					} else {
						html += `<div class="diff-line-context">${escapeHtml(line)}</div>`;
					}
				}
				html += "
";
			}
			if (result) {
				const output = getTextOutput().trim();
				if (output) {
					html += `<div class="tool-output"><div>${escapeHtml(output)}</div></div>`;
				}
			}
			break;
		}

		default: {
			html = `<div class="tool-header"><span class="tool-name">${escapeHtml(toolName)}</span></div>`;
			html += `<div class="tool-output"><pre>${escapeHtml(JSON.stringify(args, null, 2))}</pre></div>`;
			if (result) {
				const output = getTextOutput();

[572 more lines in file. Use offset=810 to continue]


		case "bash": {
			const command = (args?.command as string) || "";
			html = `<div class="tool-command">$ ${escapeHtml(command || "...")}</div>`;
			if (result) {
				const output = getTextOutput().trim();
				if (output) {
					html += formatExpandableOutput(output.split("\n"), 5);
				}
			}
			break;
		}

		case "read": {
			const filePath = shortenPath((args?.file_path as string) || (args?.path as string) || "");
			const offset = args?.offset as number | undefined;
			const limit = args?.limit as number | undefined;

			// Build path display with offset/limit suffix
			let pathHtml = escapeHtml(filePath || "...");
			if (offset !== undefined || limit !== undefined) {
				const startLine = offset ?? 1;
				const endLine = limit !== undefined ? startLine + limit - 1 : "";
				pathHtml += `<span class="line-numbers">:${startLine}${endLine ? `-${endLine}` : ""}</span>`;
			}

			html = `<div class="tool-header"><span class="tool-name">read</span> <span class="tool-path">${pathHtml}</span></div>`;
			if (result) {
				const output = getTextOutput();
				if (output) {
					html += formatExpandableOutput(output.split("\n"), 10);
				}
			}
			break;
		}

[627 more lines in file. Use offset=755 to continue]