@pentoshi/clai 4.14.4 → 4.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTRIBUTING.md +4 -0
- package/PROVIDERS.md +2 -0
- package/README.md +41 -5
- package/dist/agent/compaction-summary.d.ts +6 -1
- package/dist/agent/compaction-summary.js +46 -20
- package/dist/agent/compaction-summary.js.map +1 -1
- package/dist/agent/confirm-port.d.ts +3 -8
- package/dist/agent/confirm-port.js +9 -7
- package/dist/agent/confirm-port.js.map +1 -1
- package/dist/agent/context/compact-with-summary.js +55 -14
- package/dist/agent/context/compact-with-summary.js.map +1 -1
- package/dist/agent/context/compaction-recent-history.js +4 -2
- package/dist/agent/context/compaction-recent-history.js.map +1 -1
- package/dist/agent/context/compaction-user-instructions.d.ts +12 -0
- package/dist/agent/context/compaction-user-instructions.js +264 -0
- package/dist/agent/context/compaction-user-instructions.js.map +1 -0
- package/dist/agent/context/compaction-work-history.d.ts +13 -0
- package/dist/agent/context/compaction-work-history.js +150 -0
- package/dist/agent/context/compaction-work-history.js.map +1 -0
- package/dist/agent/context-manager.js +19 -5
- package/dist/agent/context-manager.js.map +1 -1
- package/dist/agent/plan-implement-compact.js +2 -1
- package/dist/agent/plan-implement-compact.js.map +1 -1
- package/dist/agent/subagents/read-only-tools.js +2 -2
- package/dist/agent/subagents/read-only-tools.js.map +1 -1
- package/dist/agent/turn/loop/stream-session.js +33 -27
- package/dist/agent/turn/loop/stream-session.js.map +1 -1
- package/dist/agent/turn/tool-execution/authorization.js +1 -1
- package/dist/agent/turn/tool-execution/authorization.js.map +1 -1
- package/dist/app/adapters/current-store-adapter.js +2 -2
- package/dist/app/adapters/current-store-adapter.js.map +1 -1
- package/dist/app/adapters/current-updates-adapter.d.ts +1 -1
- package/dist/app/adapters/current-updates-adapter.js +4 -13
- package/dist/app/adapters/current-updates-adapter.js.map +1 -1
- package/dist/app/commands/catalog.js +1 -0
- package/dist/app/commands/catalog.js.map +1 -1
- package/dist/app/controllers/session-changes.d.ts +24 -0
- package/dist/app/controllers/session-changes.js +75 -0
- package/dist/app/controllers/session-changes.js.map +1 -0
- package/dist/app/controllers/session-controller.d.ts +9 -0
- package/dist/app/controllers/session-controller.js +67 -7
- package/dist/app/controllers/session-controller.js.map +1 -1
- package/dist/app/ports/confirm-port.d.ts +4 -1
- package/dist/app/ports/persistence-port.d.ts +2 -0
- package/dist/app/ports/transcript-item.d.ts +2 -0
- package/dist/app/ports/updates-port.d.ts +1 -1
- package/dist/classic/app/ClassicApp.js +42 -33
- package/dist/classic/app/ClassicApp.js.map +1 -1
- package/dist/classic/app/action-handlers.js +7 -0
- package/dist/classic/app/action-handlers.js.map +1 -1
- package/dist/classic/app/app-wiring.d.ts +8 -1
- package/dist/classic/app/app-wiring.js +23 -4
- package/dist/classic/app/app-wiring.js.map +1 -1
- package/dist/classic/app/paint-pacing.d.ts +3 -1
- package/dist/classic/app/paint-pacing.js +9 -1
- package/dist/classic/app/paint-pacing.js.map +1 -1
- package/dist/classic/app/use-feed.js +8 -3
- package/dist/classic/app/use-feed.js.map +1 -1
- package/dist/classic/app/wiring-composer-pointer.d.ts +3 -0
- package/dist/classic/app/wiring-composer-pointer.js +22 -0
- package/dist/classic/app/wiring-composer-pointer.js.map +1 -0
- package/dist/classic/app/wiring-disclosure.d.ts +3 -0
- package/dist/classic/app/wiring-disclosure.js +31 -0
- package/dist/classic/app/wiring-disclosure.js.map +1 -0
- package/dist/classic/app/wiring-interactions.d.ts +1 -0
- package/dist/classic/app/wiring-interactions.js +16 -16
- package/dist/classic/app/wiring-interactions.js.map +1 -1
- package/dist/classic/app/wiring-jump-to-latest.d.ts +3 -0
- package/dist/classic/app/wiring-jump-to-latest.js +38 -0
- package/dist/classic/app/wiring-jump-to-latest.js.map +1 -0
- package/dist/classic/app/wiring-lifecycle.d.ts +1 -1
- package/dist/classic/app/wiring-lifecycle.js +19 -10
- package/dist/classic/app/wiring-lifecycle.js.map +1 -1
- package/dist/classic/app/wiring-selection.d.ts +1 -0
- package/dist/classic/app/wiring-selection.js +10 -1
- package/dist/classic/app/wiring-selection.js.map +1 -1
- package/dist/classic/app/wiring-types.d.ts +12 -1
- package/dist/classic/blocks/assistant-lines.js +1 -1
- package/dist/classic/blocks/assistant-lines.js.map +1 -1
- package/dist/classic/blocks/batch-lines.d.ts +1 -1
- package/dist/classic/blocks/batch-lines.js +47 -59
- package/dist/classic/blocks/batch-lines.js.map +1 -1
- package/dist/classic/blocks/block-context.d.ts +8 -1
- package/dist/classic/blocks/block-context.js.map +1 -1
- package/dist/classic/blocks/compacted-lines.d.ts +0 -1
- package/dist/classic/blocks/compacted-lines.js +12 -44
- package/dist/classic/blocks/compacted-lines.js.map +1 -1
- package/dist/classic/blocks/diff-lines.d.ts +3 -5
- package/dist/classic/blocks/diff-lines.js +113 -152
- package/dist/classic/blocks/diff-lines.js.map +1 -1
- package/dist/classic/blocks/disclosure-lines.d.ts +16 -0
- package/dist/classic/blocks/disclosure-lines.js +20 -0
- package/dist/classic/blocks/disclosure-lines.js.map +1 -0
- package/dist/classic/blocks/intro-lines.js +2 -0
- package/dist/classic/blocks/intro-lines.js.map +1 -1
- package/dist/classic/blocks/notice-lines.js +4 -16
- package/dist/classic/blocks/notice-lines.js.map +1 -1
- package/dist/classic/blocks/output-lines.d.ts +10 -0
- package/dist/classic/blocks/output-lines.js +35 -0
- package/dist/classic/blocks/output-lines.js.map +1 -0
- package/dist/classic/blocks/thinking-lines.d.ts +0 -1
- package/dist/classic/blocks/thinking-lines.js +15 -32
- package/dist/classic/blocks/thinking-lines.js.map +1 -1
- package/dist/classic/blocks/tool-label.d.ts +2 -0
- package/dist/classic/blocks/tool-label.js +8 -0
- package/dist/classic/blocks/tool-label.js.map +1 -0
- package/dist/classic/blocks/tool-lines.d.ts +3 -5
- package/dist/classic/blocks/tool-lines.js +90 -150
- package/dist/classic/blocks/tool-lines.js.map +1 -1
- package/dist/classic/blocks/turn-summary-lines.js +7 -1
- package/dist/classic/blocks/turn-summary-lines.js.map +1 -1
- package/dist/classic/blocks/user-lines.js +9 -15
- package/dist/classic/blocks/user-lines.js.map +1 -1
- package/dist/classic/bootstrap/start-classic.js +2 -0
- package/dist/classic/bootstrap/start-classic.js.map +1 -1
- package/dist/classic/chrome/Composer.d.ts +4 -2
- package/dist/classic/chrome/Composer.js +12 -6
- package/dist/classic/chrome/Composer.js.map +1 -1
- package/dist/classic/chrome/composer-controller.d.ts +3 -0
- package/dist/classic/chrome/composer-controller.js +15 -22
- package/dist/classic/chrome/composer-controller.js.map +1 -1
- package/dist/classic/chrome/composer-frame.d.ts +1 -1
- package/dist/classic/chrome/composer-frame.js +2 -1
- package/dist/classic/chrome/composer-frame.js.map +1 -1
- package/dist/classic/chrome/composer-mentions.d.ts +2 -0
- package/dist/classic/chrome/composer-mentions.js +16 -0
- package/dist/classic/chrome/composer-mentions.js.map +1 -0
- package/dist/classic/chrome/composer-pointer.d.ts +13 -0
- package/dist/classic/chrome/composer-pointer.js +22 -0
- package/dist/classic/chrome/composer-pointer.js.map +1 -0
- package/dist/classic/chrome/directory-row.d.ts +20 -2
- package/dist/classic/chrome/directory-row.js +45 -1
- package/dist/classic/chrome/directory-row.js.map +1 -1
- package/dist/classic/chrome/editor-view.js +6 -1
- package/dist/classic/chrome/editor-view.js.map +1 -1
- package/dist/classic/chrome/queue-rows.d.ts +1 -0
- package/dist/classic/chrome/queue-rows.js +12 -2
- package/dist/classic/chrome/queue-rows.js.map +1 -1
- package/dist/classic/chrome/status-rows.d.ts +1 -0
- package/dist/classic/chrome/status-rows.js +5 -4
- package/dist/classic/chrome/status-rows.js.map +1 -1
- package/dist/classic/chrome/toast-rows.js +7 -6
- package/dist/classic/chrome/toast-rows.js.map +1 -1
- package/dist/classic/feed/LiveTail.d.ts +4 -3
- package/dist/classic/feed/LiveTail.js +26 -15
- package/dist/classic/feed/LiveTail.js.map +1 -1
- package/dist/classic/feed/feed-blocks.d.ts +2 -0
- package/dist/classic/feed/feed-blocks.js +4 -2
- package/dist/classic/feed/feed-blocks.js.map +1 -1
- package/dist/classic/feed/transcript-disclosure.d.ts +6 -0
- package/dist/classic/feed/transcript-disclosure.js +9 -0
- package/dist/classic/feed/transcript-disclosure.js.map +1 -0
- package/dist/classic/feed/transcript-resources.d.ts +23 -0
- package/dist/classic/feed/transcript-resources.js +140 -0
- package/dist/classic/feed/transcript-resources.js.map +1 -0
- package/dist/classic/feed/transcript-window.js +43 -18
- package/dist/classic/feed/transcript-window.js.map +1 -1
- package/dist/classic/input/input-router.d.ts +2 -0
- package/dist/classic/input/input-router.js +6 -0
- package/dist/classic/input/input-router.js.map +1 -1
- package/dist/classic/input/raw-decoder.js +3 -2
- package/dist/classic/input/raw-decoder.js.map +1 -1
- package/dist/classic/panels/confirm-panel.js +17 -10
- package/dist/classic/panels/confirm-panel.js.map +1 -1
- package/dist/classic/panels/pager-panel.d.ts +6 -2
- package/dist/classic/panels/pager-panel.js +11 -4
- package/dist/classic/panels/pager-panel.js.map +1 -1
- package/dist/classic/panels/panel-controller.js +4 -1
- package/dist/classic/panels/panel-controller.js.map +1 -1
- package/dist/classic/panels/panel-host.js +1 -1
- package/dist/classic/panels/panel-host.js.map +1 -1
- package/dist/classic/panels/panel-wheel.js +1 -1
- package/dist/classic/panels/panel-wheel.js.map +1 -1
- package/dist/classic/render/shell-width.d.ts +0 -2
- package/dist/classic/render/shell-width.js +0 -6
- package/dist/classic/render/shell-width.js.map +1 -1
- package/dist/commands/update/detection.d.ts +20 -0
- package/dist/commands/update/detection.js +207 -0
- package/dist/commands/update/detection.js.map +1 -0
- package/dist/commands/update/download.d.ts +3 -0
- package/dist/commands/update/download.js +63 -0
- package/dist/commands/update/download.js.map +1 -0
- package/dist/commands/update/installers.d.ts +16 -5
- package/dist/commands/update/installers.js +12 -513
- package/dist/commands/update/installers.js.map +1 -1
- package/dist/commands/update/lock.d.ts +6 -0
- package/dist/commands/update/lock.js +86 -0
- package/dist/commands/update/lock.js.map +1 -0
- package/dist/commands/update/metadata.d.ts +6 -0
- package/dist/commands/update/metadata.js +36 -0
- package/dist/commands/update/metadata.js.map +1 -0
- package/dist/commands/update/native.d.ts +3 -0
- package/dist/commands/update/native.js +179 -0
- package/dist/commands/update/native.js.map +1 -0
- package/dist/commands/update/package-managers.d.ts +4 -0
- package/dist/commands/update/package-managers.js +158 -0
- package/dist/commands/update/package-managers.js.map +1 -0
- package/dist/commands/update/process.d.ts +17 -0
- package/dist/commands/update/process.js +114 -0
- package/dist/commands/update/process.js.map +1 -0
- package/dist/commands/update/source-worker.d.ts +2 -0
- package/dist/commands/update/source-worker.js +71 -0
- package/dist/commands/update/source-worker.js.map +1 -0
- package/dist/commands/update/source.d.ts +2 -0
- package/dist/commands/update/source.js +79 -0
- package/dist/commands/update/source.js.map +1 -0
- package/dist/commands/update/verification.d.ts +7 -0
- package/dist/commands/update/verification.js +73 -0
- package/dist/commands/update/verification.js.map +1 -0
- package/dist/commands/update/windows-stage.d.ts +21 -0
- package/dist/commands/update/windows-stage.js +186 -0
- package/dist/commands/update/windows-stage.js.map +1 -0
- package/dist/commands/update-install.d.ts +4 -13
- package/dist/commands/update-install.js +20 -152
- package/dist/commands/update-install.js.map +1 -1
- package/dist/commands/update.d.ts +4 -9
- package/dist/commands/update.js +51 -103
- package/dist/commands/update.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/instructions/record.d.ts +1 -1
- package/dist/instructions/record.js +3 -3
- package/dist/llm/free-client.d.ts +2 -0
- package/dist/llm/free-client.js +52 -0
- package/dist/llm/free-client.js.map +1 -0
- package/dist/llm/free.d.ts +1 -0
- package/dist/llm/free.js +77 -176
- package/dist/llm/free.js.map +1 -1
- package/dist/llm/key-rotation.d.ts +1 -0
- package/dist/llm/key-rotation.js +13 -2
- package/dist/llm/key-rotation.js.map +1 -1
- package/dist/llm/reasoning-errors.js +1 -1
- package/dist/llm/reasoning-errors.js.map +1 -1
- package/dist/llm/responses-error.d.ts +3 -0
- package/dist/llm/responses-error.js +37 -0
- package/dist/llm/responses-error.js.map +1 -0
- package/dist/llm/responses-http.js +5 -2
- package/dist/llm/responses-http.js.map +1 -1
- package/dist/llm/responses-replay.d.ts +2 -0
- package/dist/llm/responses-replay.js +37 -1
- package/dist/llm/responses-replay.js.map +1 -1
- package/dist/llm/responses-stream-events.js +3 -20
- package/dist/llm/responses-stream-events.js.map +1 -1
- package/dist/llm/responses-stream.js +2 -0
- package/dist/llm/responses-stream.js.map +1 -1
- package/dist/llm/wire/reasoning-artifacts.js +1 -1
- package/dist/llm/wire/reasoning-artifacts.js.map +1 -1
- package/dist/noninteractive/stdio-confirm-port.js +4 -3
- package/dist/noninteractive/stdio-confirm-port.js.map +1 -1
- package/dist/os/bun-runtime.js +2 -1
- package/dist/os/bun-runtime.js.map +1 -1
- package/dist/os/update-origin.d.ts +7 -0
- package/dist/os/update-origin.js +30 -0
- package/dist/os/update-origin.js.map +1 -0
- package/dist/prompts/embedded.js +2 -2
- package/dist/prompts/embedded.js.map +1 -1
- package/dist/prompts/index.js +25 -22
- package/dist/prompts/index.js.map +1 -1
- package/dist/prompts/system.agent.md +7 -1
- package/dist/prompts/system.ask.md +1 -1
- package/dist/safety/filesystem-permissions.d.ts +8 -0
- package/dist/safety/filesystem-permissions.js +38 -18
- package/dist/safety/filesystem-permissions.js.map +1 -1
- package/dist/safety/patterns.d.ts +1 -1
- package/dist/safety/patterns.js +7 -7
- package/dist/safety/patterns.js.map +1 -1
- package/dist/safety/permission-mode.js +1 -1
- package/dist/safety/permission-mode.js.map +1 -1
- package/dist/safety/shell-classification.js +1 -1
- package/dist/safety/shell-classification.js.map +1 -1
- package/dist/session-runtime/client.js +2 -1
- package/dist/session-runtime/client.js.map +1 -1
- package/dist/session-runtime/view-manager.js +1 -1
- package/dist/session-runtime/view-manager.js.map +1 -1
- package/dist/store/history/jsonl-lock.js +10 -7
- package/dist/store/history/jsonl-lock.js.map +1 -1
- package/dist/store/history/recovery.d.ts +1 -0
- package/dist/store/history/recovery.js +2 -1
- package/dist/store/history/recovery.js.map +1 -1
- package/dist/store/history/sqlite-backend.js +2 -0
- package/dist/store/history/sqlite-backend.js.map +1 -1
- package/dist/store/history.d.ts +2 -2
- package/dist/store/history.js +8 -4
- package/dist/store/history.js.map +1 -1
- package/dist/store/session-prompts.d.ts +5 -0
- package/dist/store/session-prompts.js +60 -1
- package/dist/store/session-prompts.js.map +1 -1
- package/dist/tools/definitions/aggregate.js +7 -2
- package/dist/tools/definitions/aggregate.js.map +1 -1
- package/dist/tools/definitions/fs-read.js +1 -1
- package/dist/tools/definitions/fs-read.js.map +1 -1
- package/dist/tools/fs/read-input.d.ts +1 -1
- package/dist/tools/fs/read-input.js +2 -2
- package/dist/tools/fs/read-input.js.map +1 -1
- package/dist/tools/instructions.js +8 -1
- package/dist/tools/instructions.js.map +1 -1
- package/dist/tui-v2/app/App.js +18 -7
- package/dist/tui-v2/app/App.js.map +1 -1
- package/dist/tui-v2/bootstrap/frame-pacing.d.ts +4 -0
- package/dist/tui-v2/bootstrap/frame-pacing.js +5 -0
- package/dist/tui-v2/bootstrap/frame-pacing.js.map +1 -0
- package/dist/tui-v2/bootstrap/runtime-view.js +2 -0
- package/dist/tui-v2/bootstrap/runtime-view.js.map +1 -1
- package/dist/tui-v2/bootstrap/start-tui-v2.js +2 -0
- package/dist/tui-v2/bootstrap/start-tui-v2.js.map +1 -1
- package/dist/tui-v2/components/modal/confirm-modal.d.ts +2 -0
- package/dist/tui-v2/components/modal/confirm-modal.js +21 -35
- package/dist/tui-v2/components/modal/confirm-modal.js.map +1 -1
- package/dist/tui-v2/components/overlay/overlay-host.js +1 -1
- package/dist/tui-v2/components/overlay/overlay-host.js.map +1 -1
- package/dist/tui-v2/components/pager/pager.js +4 -1
- package/dist/tui-v2/components/pager/pager.js.map +1 -1
- package/dist/tui-v2/components/plan/plan-interaction.d.ts +11 -0
- package/dist/tui-v2/components/plan/plan-interaction.js +56 -0
- package/dist/tui-v2/components/plan/plan-interaction.js.map +1 -0
- package/dist/tui-v2/components/plan/plan-view.d.ts +7 -1
- package/dist/tui-v2/components/plan/plan-view.js +78 -175
- package/dist/tui-v2/components/plan/plan-view.js.map +1 -1
- package/dist/tui-v2/components/plan/task-title.d.ts +9 -0
- package/dist/tui-v2/components/plan/task-title.js +17 -0
- package/dist/tui-v2/components/plan/task-title.js.map +1 -0
- package/dist/tui-v2/components/plan/use-task-disclosure.d.ts +25 -0
- package/dist/tui-v2/components/plan/use-task-disclosure.js +125 -0
- package/dist/tui-v2/components/plan/use-task-disclosure.js.map +1 -0
- package/dist/tui-v2/components/queue/queue-panel.js +2 -7
- package/dist/tui-v2/components/queue/queue-panel.js.map +1 -1
- package/dist/tui-v2/components/status/jump-to-latest.d.ts +7 -0
- package/dist/tui-v2/components/status/jump-to-latest.js +16 -0
- package/dist/tui-v2/components/status/jump-to-latest.js.map +1 -0
- package/dist/tui-v2/components/status/status-line.d.ts +1 -0
- package/dist/tui-v2/components/status/status-line.js +14 -4
- package/dist/tui-v2/components/status/status-line.js.map +1 -1
- package/dist/tui-v2/components/toast/toast-host.js +4 -7
- package/dist/tui-v2/components/toast/toast-host.js.map +1 -1
- package/dist/tui-v2/components/transcript/file-diff-card.d.ts +1 -0
- package/dist/tui-v2/components/transcript/file-diff-card.js +25 -11
- package/dist/tui-v2/components/transcript/file-diff-card.js.map +1 -1
- package/dist/tui-v2/components/transcript/tool-card.js +24 -20
- package/dist/tui-v2/components/transcript/tool-card.js.map +1 -1
- package/dist/tui-v2/components/transcript/transcript-row.js +6 -3
- package/dist/tui-v2/components/transcript/transcript-row.js.map +1 -1
- package/dist/tui-v2/components/transcript/transcript-scroll-port.d.ts +1 -0
- package/dist/tui-v2/components/transcript/transcript-scroll-port.js +3 -1
- package/dist/tui-v2/components/transcript/transcript-scroll-port.js.map +1 -1
- package/dist/tui-v2/components/transcript/transcript-scrollbar.js +17 -11
- package/dist/tui-v2/components/transcript/transcript-scrollbar.js.map +1 -1
- package/dist/tui-v2/components/transcript/transcript-view.js +41 -21
- package/dist/tui-v2/components/transcript/transcript-view.js.map +1 -1
- package/dist/tui-v2/composer/composer-editor.js +17 -9
- package/dist/tui-v2/composer/composer-editor.js.map +1 -1
- package/dist/tui-v2/rendering/pager-markdown.d.ts +3 -0
- package/dist/tui-v2/rendering/pager-markdown.js +3 -0
- package/dist/tui-v2/rendering/pager-markdown.js.map +1 -1
- package/dist/types.d.ts +12 -0
- package/dist/types.js.map +1 -1
- package/dist/ui/mentions/file-suggestions.js +17 -8
- package/dist/ui/mentions/file-suggestions.js.map +1 -1
- package/dist/ui-core/actions/action-id.d.ts +1 -1
- package/dist/ui-core/actions/action-id.js +7 -0
- package/dist/ui-core/actions/action-id.js.map +1 -1
- package/dist/ui-core/actions/format-shortcuts.js +9 -0
- package/dist/ui-core/actions/format-shortcuts.js.map +1 -1
- package/dist/ui-core/bootstrap/overlay-ports.js +8 -3
- package/dist/ui-core/bootstrap/overlay-ports.js.map +1 -1
- package/dist/ui-core/bootstrap/session-resume.js +1 -0
- package/dist/ui-core/bootstrap/session-resume.js.map +1 -1
- package/dist/ui-core/commands/change-commands.d.ts +4 -0
- package/dist/ui-core/commands/change-commands.js +48 -0
- package/dist/ui-core/commands/change-commands.js.map +1 -0
- package/dist/ui-core/commands/command-handlers.js +2 -0
- package/dist/ui-core/commands/command-handlers.js.map +1 -1
- package/dist/ui-core/commands/config-commands.js +12 -6
- package/dist/ui-core/commands/config-commands.js.map +1 -1
- package/dist/ui-core/commands/prompt-commands.d.ts +1 -1
- package/dist/ui-core/commands/prompt-commands.js +12 -2
- package/dist/ui-core/commands/prompt-commands.js.map +1 -1
- package/dist/ui-core/composer/arrow-intent.js +2 -0
- package/dist/ui-core/composer/arrow-intent.js.map +1 -1
- package/dist/ui-core/composer/paste-placeholder.js +2 -2
- package/dist/ui-core/composer/paste-placeholder.js.map +1 -1
- package/dist/ui-core/composer/prompt-history.d.ts +12 -0
- package/dist/ui-core/composer/prompt-history.js +75 -1
- package/dist/ui-core/composer/prompt-history.js.map +1 -1
- package/dist/ui-core/composer/saved-prompt-history.d.ts +5 -0
- package/dist/ui-core/composer/saved-prompt-history.js +33 -0
- package/dist/ui-core/composer/saved-prompt-history.js.map +1 -0
- package/dist/ui-core/controllers/overlay-controller.d.ts +1 -0
- package/dist/ui-core/controllers/overlay-controller.js.map +1 -1
- package/dist/ui-core/controllers/toast-controller.js +4 -4
- package/dist/ui-core/controllers/toast-controller.js.map +1 -1
- package/dist/ui-core/react/use-transcript-store.js +4 -2
- package/dist/ui-core/react/use-transcript-store.js.map +1 -1
- package/dist/ui-core/rendering/artifact-pager-source.d.ts +3 -0
- package/dist/ui-core/rendering/artifact-pager-source.js.map +1 -1
- package/dist/ui-core/rendering/batch-sections.d.ts +3 -2
- package/dist/ui-core/rendering/batch-sections.js +5 -5
- package/dist/ui-core/rendering/batch-sections.js.map +1 -1
- package/dist/ui-core/rendering/card-style.d.ts +2 -0
- package/dist/ui-core/rendering/card-style.js +3 -0
- package/dist/ui-core/rendering/card-style.js.map +1 -0
- package/dist/ui-core/rendering/confirmation-preview.d.ts +9 -0
- package/dist/ui-core/rendering/confirmation-preview.js +33 -0
- package/dist/ui-core/rendering/confirmation-preview.js.map +1 -0
- package/dist/ui-core/rendering/duration.d.ts +2 -1
- package/dist/ui-core/rendering/duration.js +4 -6
- package/dist/ui-core/rendering/duration.js.map +1 -1
- package/dist/ui-core/rendering/intro-header.d.ts +1 -0
- package/dist/ui-core/rendering/intro-header.js +19 -15
- package/dist/ui-core/rendering/intro-header.js.map +1 -1
- package/dist/ui-core/rendering/jump-to-latest.d.ts +1 -0
- package/dist/ui-core/rendering/jump-to-latest.js +7 -0
- package/dist/ui-core/rendering/jump-to-latest.js.map +1 -0
- package/dist/ui-core/rendering/line-change-labels.d.ts +6 -0
- package/dist/ui-core/rendering/line-change-labels.js +12 -0
- package/dist/ui-core/rendering/line-change-labels.js.map +1 -0
- package/dist/ui-core/rendering/markdown.d.ts +5 -1
- package/dist/ui-core/rendering/markdown.js +20 -5
- package/dist/ui-core/rendering/markdown.js.map +1 -1
- package/dist/ui-core/rendering/plan-view.js +24 -12
- package/dist/ui-core/rendering/plan-view.js.map +1 -1
- package/dist/ui-core/rendering/render-markdown-lines.d.ts +3 -0
- package/dist/ui-core/rendering/render-markdown-lines.js +6 -1
- package/dist/ui-core/rendering/render-markdown-lines.js.map +1 -1
- package/dist/ui-core/rendering/session-prompts-pager-source.js +2 -0
- package/dist/ui-core/rendering/session-prompts-pager-source.js.map +1 -1
- package/dist/ui-core/rendering/status-segments.js +10 -5
- package/dist/ui-core/rendering/status-segments.js.map +1 -1
- package/dist/ui-core/rendering/subagent-presentation.js +39 -11
- package/dist/ui-core/rendering/subagent-presentation.js.map +1 -1
- package/dist/ui-core/rendering/subagent-source.js +11 -48
- package/dist/ui-core/rendering/subagent-source.js.map +1 -1
- package/dist/ui-core/rendering/subagent-tool-usage.d.ts +5 -0
- package/dist/ui-core/rendering/subagent-tool-usage.js +42 -0
- package/dist/ui-core/rendering/subagent-tool-usage.js.map +1 -0
- package/dist/ui-core/rendering/task-disclosure.d.ts +19 -0
- package/dist/ui-core/rendering/task-disclosure.js +70 -0
- package/dist/ui-core/rendering/task-disclosure.js.map +1 -0
- package/dist/ui-core/rendering/tool-diff-preview.d.ts +21 -0
- package/dist/ui-core/rendering/tool-diff-preview.js +27 -0
- package/dist/ui-core/rendering/tool-diff-preview.js.map +1 -0
- package/dist/ui-core/rendering/tool-presenter.d.ts +4 -2
- package/dist/ui-core/rendering/tool-presenter.js +19 -4
- package/dist/ui-core/rendering/tool-presenter.js.map +1 -1
- package/dist/ui-core/rendering/tool-usage-label.d.ts +2 -0
- package/dist/ui-core/rendering/tool-usage-label.js +42 -0
- package/dist/ui-core/rendering/tool-usage-label.js.map +1 -0
- package/dist/ui-core/state/hydrate/classic-transcript.js +2 -0
- package/dist/ui-core/state/hydrate/classic-transcript.js.map +1 -1
- package/dist/ui-core/state/transcript/apply-app-event.js +16 -5
- package/dist/ui-core/state/transcript/apply-app-event.js.map +1 -1
- package/dist/ui-core/state/transcript-hydrate.js +1 -0
- package/dist/ui-core/state/transcript-hydrate.js.map +1 -1
- package/dist/ui-core/state/transcript-types.d.ts +4 -0
- package/dist/ui-core/state/transcript-types.js.map +1 -1
- package/dist/version.generated.d.ts +2 -2
- package/dist/version.generated.js +2 -2
- package/package.json +1 -1
- package/dist/classic/feed/ScrollbarGutter.d.ts +0 -9
- package/dist/classic/feed/ScrollbarGutter.js +0 -41
- package/dist/classic/feed/ScrollbarGutter.js.map +0 -1
- package/dist/classic/feed/scrollbar-rows.d.ts +0 -5
- package/dist/classic/feed/scrollbar-rows.js +0 -17
- package/dist/classic/feed/scrollbar-rows.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../../src/commands/update/lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { downloadBinary } from "./download.js";
|
|
2
|
+
import { mirrorBaseUrl, REPO } from "./installers.js";
|
|
3
|
+
import { throwIfCancelled } from "./process.js";
|
|
4
|
+
import { releaseVersion } from "./verification.js";
|
|
5
|
+
async function metadata(url, signal) {
|
|
6
|
+
const bytes = await downloadBinary(url, 5000, undefined, signal, 256 * 1024);
|
|
7
|
+
return JSON.parse(bytes.toString("utf8"));
|
|
8
|
+
}
|
|
9
|
+
async function releaseFrom(url, mirror, signal) {
|
|
10
|
+
try {
|
|
11
|
+
const value = await metadata(url, signal);
|
|
12
|
+
if (!value || typeof value !== "object")
|
|
13
|
+
return null;
|
|
14
|
+
const tag = mirror ? ("version" in value ? value.version : undefined) : ("tag_name" in value ? value.tag_name : undefined);
|
|
15
|
+
const version = releaseVersion(tag);
|
|
16
|
+
if (!version)
|
|
17
|
+
return null;
|
|
18
|
+
const date = "published_at" in value && typeof value.published_at === "string" ? Date.parse(value.published_at) : NaN;
|
|
19
|
+
return {
|
|
20
|
+
tag_name: `v${version}`,
|
|
21
|
+
html_url: `https://github.com/${REPO}/releases/tag/v${version}`,
|
|
22
|
+
published_at: Number.isFinite(date) ? new Date(date).toISOString() : "",
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
throwIfCancelled(signal);
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export async function fetchLatestRelease(signal) {
|
|
31
|
+
const release = await releaseFrom(`https://api.github.com/repos/${REPO}/releases/latest`, false, signal);
|
|
32
|
+
if (release || process.env.CLAI_NO_MIRROR === "1")
|
|
33
|
+
return release;
|
|
34
|
+
return releaseFrom(`${mirrorBaseUrl()}/version.json`, true, signal);
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../../src/commands/update/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAQnD,KAAK,UAAU,QAAQ,CAAC,GAAW,EAAE,MAAoB;IACvD,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC;IAC7E,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,MAAe,EAAE,MAAoB;IAC3E,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACrD,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC3H,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,MAAM,IAAI,GAAG,cAAc,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACtH,OAAO;YACL,QAAQ,EAAE,IAAI,OAAO,EAAE;YACvB,QAAQ,EAAE,sBAAsB,IAAI,kBAAkB,OAAO,EAAE;YAC/D,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE;SACxE,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAoB;IAC3D,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,gCAAgC,IAAI,kBAAkB,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACzG,IAAI,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,GAAG;QAAE,OAAO,OAAO,CAAC;IAClE,OAAO,WAAW,CAAC,GAAG,aAAa,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { type PerformUpdateOptions, type UpdateInstallResult } from "./installers.js";
|
|
2
|
+
export declare function writableDirectory(path: string, platform?: NodeJS.Platform): boolean;
|
|
3
|
+
export declare function installDirectBinary(options: PerformUpdateOptions): Promise<UpdateInstallResult>;
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { accessSync, chmodSync, constants, copyFileSync, mkdtempSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { evictSudoSession, formatSudoStdinPassword, looksLikeSudoAuthError, obtainSudoPassword } from "../../tools/sudo-session.js";
|
|
6
|
+
import { canonicalPath } from "./detection.js";
|
|
7
|
+
import { downloadBinary } from "./download.js";
|
|
8
|
+
import { currentPlatformTarget, ELEVATION_TIMEOUT_MS, mirrorBaseUrl, REPO } from "./installers.js";
|
|
9
|
+
import { runUpdateCommand, throwIfCancelled } from "./process.js";
|
|
10
|
+
import { verifyExecutable } from "./verification.js";
|
|
11
|
+
import { stageWindowsUpdate } from "./windows-stage.js";
|
|
12
|
+
function digest(bytes) {
|
|
13
|
+
return createHash("sha256").update(bytes).digest("hex");
|
|
14
|
+
}
|
|
15
|
+
export function writableDirectory(path, platform = process.platform) {
|
|
16
|
+
try {
|
|
17
|
+
if (platform === "win32") {
|
|
18
|
+
const probe = mkdtempSync(join(path, ".clai-write-probe-"));
|
|
19
|
+
rmSync(probe, { recursive: true });
|
|
20
|
+
}
|
|
21
|
+
else
|
|
22
|
+
accessSync(path, constants.W_OK | constants.X_OK);
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async function binaryChecksum(urls, options) {
|
|
30
|
+
for (const url of urls) {
|
|
31
|
+
try {
|
|
32
|
+
const value = (await downloadBinary(url, 20_000, undefined, options.signal, 4096)).toString("utf8").trim().split(/\s+/)[0];
|
|
33
|
+
if (value && /^[a-f\d]{64}$/i.test(value))
|
|
34
|
+
return value.toLowerCase();
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
if (options.signal?.aborted)
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
throw new Error("could not obtain a valid release checksum; existing installation was kept");
|
|
42
|
+
}
|
|
43
|
+
async function verifiedDownload(urls, expected, options) {
|
|
44
|
+
let failure = new Error("update download failed");
|
|
45
|
+
for (const [index, url] of urls.entries()) {
|
|
46
|
+
try {
|
|
47
|
+
const bytes = await downloadBinary(url, 120_000, (progress) => options.onProgress?.({ phase: "downloading", ...progress }), options.signal);
|
|
48
|
+
options.onProgress?.({ phase: "verifying" });
|
|
49
|
+
if (digest(bytes) !== expected)
|
|
50
|
+
throw new Error("checksum mismatch for update download");
|
|
51
|
+
return bytes;
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
throwIfCancelled(options.signal);
|
|
55
|
+
failure = error instanceof Error ? error : new Error(String(error));
|
|
56
|
+
if (index + 1 < urls.length)
|
|
57
|
+
options.log?.("Mirror unavailable or invalid; trying GitHub releases…");
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
throw failure;
|
|
61
|
+
}
|
|
62
|
+
async function authorizeReplacement(destination, options) {
|
|
63
|
+
if (options.elevation?.auth.status === "cancelled")
|
|
64
|
+
throw new Error("update cancelled before replacing the executable");
|
|
65
|
+
if (options.elevation?.auth.status === "failed")
|
|
66
|
+
throw new Error("sudo authentication failed");
|
|
67
|
+
if (options.elevation || writableDirectory(dirname(destination)) || !options.requestSecret)
|
|
68
|
+
return options.elevation;
|
|
69
|
+
const auth = await obtainSudoPassword({
|
|
70
|
+
requestSecret: options.requestSecret,
|
|
71
|
+
operation: { name: "clai.update", args: { version: options.version, destination, elevation: "sudo", action: "install verified update atomically" } },
|
|
72
|
+
title: "Administrator access",
|
|
73
|
+
prompt: `Updating clai needs admin permission to replace ${destination}. Enter your sudo password; it is sent only to sudo stdin. Esc cancels.`,
|
|
74
|
+
...(options.signal ? { signal: options.signal } : {}),
|
|
75
|
+
}, {});
|
|
76
|
+
if (auth.status === "failed")
|
|
77
|
+
throw new Error(`sudo authentication failed — could not replace ${destination}`);
|
|
78
|
+
if (auth.status === "cancelled")
|
|
79
|
+
throw new Error("update cancelled before replacing the executable");
|
|
80
|
+
return { auth };
|
|
81
|
+
}
|
|
82
|
+
async function promote(source, destination, options, elevation) {
|
|
83
|
+
const pending = `${destination}.update-${randomUUID()}`;
|
|
84
|
+
try {
|
|
85
|
+
copyFileSync(source, pending, constants.COPYFILE_EXCL);
|
|
86
|
+
chmodSync(pending, 0o755);
|
|
87
|
+
renameSync(pending, destination);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
const code = error instanceof Error && "code" in error ? error.code : undefined;
|
|
92
|
+
if (code !== "EACCES" && code !== "EPERM")
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
rmSync(pending, { force: true });
|
|
97
|
+
}
|
|
98
|
+
if (elevation?.auth.status === "cancelled")
|
|
99
|
+
throw new Error("update cancelled before replacing the executable");
|
|
100
|
+
const password = elevation?.auth.status === "granted" ? elevation.auth.password : undefined;
|
|
101
|
+
const args = password === undefined ? ["-n"] : ["-S", "-p", ""];
|
|
102
|
+
const script = 'set -eu; stage=$(mktemp "$2.update.XXXXXX"); trap \'rm -f "$stage"\' EXIT; install -m 755 "$1" "$stage"; mv -f "$stage" "$2"';
|
|
103
|
+
try {
|
|
104
|
+
await runUpdateCommand({ file: "sudo", args: [...args, "--", "sh", "-c", script, "clai-update", source, destination] }, {
|
|
105
|
+
signal: options.signal,
|
|
106
|
+
timeoutMs: password === undefined ? ELEVATION_TIMEOUT_MS : 30_000,
|
|
107
|
+
...(password === undefined ? {} : { input: formatSudoStdinPassword(password) }),
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
if (password && error instanceof Error && looksLikeSudoAuthError(error.message))
|
|
112
|
+
evictSudoSession(password);
|
|
113
|
+
throwIfCancelled(options.signal);
|
|
114
|
+
throw new Error(`needs elevated permission to replace ${destination} — run \`sudo clai update\` using this installation, or retry the admin prompt`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
export async function installDirectBinary(options) {
|
|
118
|
+
throwIfCancelled(options.signal);
|
|
119
|
+
const target = options.target ?? currentPlatformTarget();
|
|
120
|
+
const destination = canonicalPath(options.execPath ?? options.method.executablePath ?? process.execPath);
|
|
121
|
+
const base = `https://github.com/${options.repo ?? REPO}/releases/download/v${options.version}`;
|
|
122
|
+
const mirror = `${mirrorBaseUrl()}/v${options.version}`;
|
|
123
|
+
const useMirror = process.env.CLAI_NO_MIRROR !== "1";
|
|
124
|
+
const binaryUrls = useMirror ? [`${mirror}/${target.file}`, `${base}/${target.file}`] : [`${base}/${target.file}`];
|
|
125
|
+
const sums = useMirror ? [`${base}/${target.file}.sha256`, `${mirror}/${target.file}.sha256`] : [`${base}/${target.file}.sha256`];
|
|
126
|
+
const elevation = process.platform === "win32" ? undefined : await authorizeReplacement(destination, options);
|
|
127
|
+
const previous = readFileSync(destination);
|
|
128
|
+
const previousDigest = digest(previous);
|
|
129
|
+
const expected = await binaryChecksum(sums, options);
|
|
130
|
+
options.log?.(`Downloading ${target.file} (v${options.version})…`);
|
|
131
|
+
const bytes = await verifiedDownload(binaryUrls, expected, options);
|
|
132
|
+
const stage = mkdtempSync(join(tmpdir(), "clai-update-"));
|
|
133
|
+
let preserve = false;
|
|
134
|
+
try {
|
|
135
|
+
const source = join(stage, target.file);
|
|
136
|
+
const backup = join(stage, "previous-clai");
|
|
137
|
+
writeFileSync(source, bytes, { mode: 0o755 });
|
|
138
|
+
writeFileSync(backup, previous, { mode: 0o755 });
|
|
139
|
+
await verifyExecutable(source, options.version, { signal: options.signal });
|
|
140
|
+
if (digest(readFileSync(destination)) !== previousDigest)
|
|
141
|
+
throw new Error("installation changed during update; retry without other update processes");
|
|
142
|
+
throwIfCancelled(options.signal);
|
|
143
|
+
options.onProgress?.({ phase: "installing", detail: destination });
|
|
144
|
+
if (process.platform === "win32") {
|
|
145
|
+
const statusFile = await stageWindowsUpdate({ kind: "binary", source, destination, digest: expected, previousDigest, version: options.version }, { signal: options.signal, ...(options.lockFile ? { lockFile: options.lockFile, lockToken: options.lockToken } : {}) }, !writableDirectory(dirname(destination)));
|
|
146
|
+
return { ok: true, method: "binary", outcome: "staged", needsRestart: true, statusFile, message: `verified update staged; close this installation to apply it. Result: ${statusFile}` };
|
|
147
|
+
}
|
|
148
|
+
throwIfCancelled(options.signal);
|
|
149
|
+
try {
|
|
150
|
+
await promote(source, destination, { ...options, signal: undefined }, elevation);
|
|
151
|
+
if (digest(readFileSync(destination)) !== expected)
|
|
152
|
+
throw new Error("installed binary checksum mismatch");
|
|
153
|
+
const installedVersion = await verifyExecutable(destination, options.version);
|
|
154
|
+
return { ok: true, method: "binary", outcome: "applied", installedVersion, needsRestart: true, message: `installed and verified v${installedVersion} → ${destination}` };
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
let unchanged = false;
|
|
158
|
+
try {
|
|
159
|
+
unchanged = digest(readFileSync(destination)) === previousDigest;
|
|
160
|
+
}
|
|
161
|
+
catch { }
|
|
162
|
+
if (unchanged)
|
|
163
|
+
throw error;
|
|
164
|
+
try {
|
|
165
|
+
await promote(backup, destination, { ...options, signal: undefined }, elevation);
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
preserve = true;
|
|
169
|
+
throw new Error(`update verification and rollback failed for ${destination}; recovery executable retained at ${backup}`);
|
|
170
|
+
}
|
|
171
|
+
throw new Error(`update verification failed; previous executable restored: ${error instanceof Error ? error.message : String(error)}`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
finally {
|
|
175
|
+
if (!preserve)
|
|
176
|
+
rmSync(stage, { recursive: true, force: true });
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native.js","sourceRoot":"","sources":["../../../src/commands/update/native.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type InstallMethod, type PerformUpdateOptions, type UpdateInstallResult } from "./installers.js";
|
|
2
|
+
import { type UpdateCommand } from "./process.js";
|
|
3
|
+
export declare function managerUpdateCommands(method: InstallMethod, version: string, platform?: NodeJS.Platform, groupSpec?: string): readonly UpdateCommand[];
|
|
4
|
+
export declare function installViaPackageManager(options: PerformUpdateOptions): Promise<UpdateInstallResult>;
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { accessSync, constants, existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { delimiter, dirname, isAbsolute, join, posix, win32 } from "node:path";
|
|
3
|
+
import { formatSudoStdinPassword, obtainSudoPassword } from "../../tools/sudo-session.js";
|
|
4
|
+
import { PACKAGE_NAME, REPO } from "./installers.js";
|
|
5
|
+
import { writableDirectory } from "./native.js";
|
|
6
|
+
import { runUpdateCommand, throwIfCancelled, windowsCommand } from "./process.js";
|
|
7
|
+
import { installedVersionCommand, releaseVersion, verifyCommand } from "./verification.js";
|
|
8
|
+
import { stageWindowsUpdate } from "./windows-stage.js";
|
|
9
|
+
export function managerUpdateCommands(method, version, platform = process.platform, groupSpec) {
|
|
10
|
+
const api = platform === "win32" ? win32 : posix;
|
|
11
|
+
const suffix = platform === "win32" ? ".cmd" : "";
|
|
12
|
+
const file = method.managerPath ?? `${method.type}${suffix}`;
|
|
13
|
+
const spec = `${PACKAGE_NAME}@${version}`;
|
|
14
|
+
if (method.type === "brew") {
|
|
15
|
+
return [{ file: method.managerPath ?? "brew", args: ["update"] }, { file: method.managerPath ?? "brew", args: ["upgrade", `${REPO}/clai`] }];
|
|
16
|
+
}
|
|
17
|
+
if (!method.prefix)
|
|
18
|
+
throw new Error(`cannot safely target the active ${method.type} installation without its installation directory`);
|
|
19
|
+
const cwd = method.prefix;
|
|
20
|
+
if (method.type === "scoop") {
|
|
21
|
+
const env = method.scope === "global" ? { SCOOP_GLOBAL: cwd } : { SCOOP: cwd };
|
|
22
|
+
const scoop = method.managerPath ?? api.join(cwd, "apps", "scoop", "current", "bin", "scoop.ps1");
|
|
23
|
+
return [{ file: scoop, args: ["update"], env }, { file: scoop, args: ["update", "clai", ...(method.scope === "global" ? ["--global"] : [])], env }];
|
|
24
|
+
}
|
|
25
|
+
if (!method.packageRoot || !method.runtimePath)
|
|
26
|
+
throw new Error("cannot safely update an unidentified JS package installation");
|
|
27
|
+
switch (method.type) {
|
|
28
|
+
case "npm":
|
|
29
|
+
return [{ file, args: ["install", ...(method.scope === "global" ? ["--global"] : ["--save-exact"]), "--prefix", cwd, spec, "--no-audit", "--no-fund"], cwd }];
|
|
30
|
+
case "bun": {
|
|
31
|
+
const standardGlobal = method.scope === "global" && /[\\/]install[\\/]global$/.test(cwd);
|
|
32
|
+
const env = standardGlobal ? { BUN_INSTALL_GLOBAL_DIR: cwd, BUN_INSTALL_BIN: api.join(api.dirname(api.dirname(cwd)), "bin") } : undefined;
|
|
33
|
+
return [{ file: method.managerPath ?? (platform === "win32" ? "bun.exe" : "bun"), args: ["add", ...(standardGlobal ? ["--global"] : []), "--exact", spec], cwd, ...(env ? { env } : {}) }];
|
|
34
|
+
}
|
|
35
|
+
case "pnpm": {
|
|
36
|
+
if (method.scope !== "global")
|
|
37
|
+
return [{ file, args: ["add", "--save-exact", spec], cwd }];
|
|
38
|
+
const normalized = cwd.replace(/\\/g, "/");
|
|
39
|
+
const isolated = normalized.indexOf("/global/v");
|
|
40
|
+
const home = isolated >= 0 ? cwd.slice(0, isolated) : api.dirname(api.dirname(cwd));
|
|
41
|
+
const bin = isolated >= 0 ? api.join(home, "bin") : home;
|
|
42
|
+
const path = `${bin}${platform === "win32" ? ";" : ":"}${process.env.PATH ?? ""}`;
|
|
43
|
+
return [{ file, args: ["add", "--global", "--global-dir", api.join(home, "global"), groupSpec ?? spec], ...(isolated >= 0 ? { cwd } : {}), env: { PNPM_HOME: home, PNPM_SHIM_BYPASS: "1", PATH: path } }];
|
|
44
|
+
}
|
|
45
|
+
case "yarn":
|
|
46
|
+
return [{ file, args: ["--cwd", cwd, "add", "--exact", spec], cwd }];
|
|
47
|
+
default: throw new Error(`no package manager command for install method: ${method.type}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function absoluteManager(file) {
|
|
51
|
+
if (isAbsolute(file))
|
|
52
|
+
return file;
|
|
53
|
+
for (const directory of (process.env.PATH ?? "").split(delimiter)) {
|
|
54
|
+
const candidate = join(directory, file);
|
|
55
|
+
try {
|
|
56
|
+
accessSync(candidate, constants.X_OK);
|
|
57
|
+
return candidate;
|
|
58
|
+
}
|
|
59
|
+
catch { }
|
|
60
|
+
}
|
|
61
|
+
throw new Error(`could not locate ${file}; install the original package manager before updating`);
|
|
62
|
+
}
|
|
63
|
+
async function runManager(command, options) {
|
|
64
|
+
const method = options.method;
|
|
65
|
+
if (method.scope !== "global" || !method.packageRoot || writableDirectory(dirname(method.packageRoot))) {
|
|
66
|
+
await runUpdateCommand(command, { signal: options.signal, log: options.log });
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const auth = options.elevation?.auth ?? (options.requestSecret ? await obtainSudoPassword({
|
|
70
|
+
requestSecret: options.requestSecret,
|
|
71
|
+
title: "Administrator access",
|
|
72
|
+
prompt: `Updating this ${method.type} installation at ${method.packageRoot} needs sudo permission. Enter your password; Esc cancels.`,
|
|
73
|
+
operation: { name: "clai.update", args: { version: options.version, destination: method.packageRoot, manager: method.type, elevation: "sudo" } },
|
|
74
|
+
...(options.signal ? { signal: options.signal } : {}),
|
|
75
|
+
}, {}) : undefined);
|
|
76
|
+
if (auth?.status === "cancelled")
|
|
77
|
+
throw new Error("update cancelled before the package-manager operation");
|
|
78
|
+
if (auth?.status === "failed")
|
|
79
|
+
throw new Error("sudo authentication failed before the package-manager operation");
|
|
80
|
+
throwIfCancelled(options.signal);
|
|
81
|
+
const args = auth?.status === "granted" ? ["-S", "-p", ""] : ["-n"];
|
|
82
|
+
const env = { PATH: process.env.PATH ?? "", ...command.env };
|
|
83
|
+
const environment = Object.entries(env).filter((entry) => entry[1] !== undefined).map(([key, value]) => `${key}=${value}`);
|
|
84
|
+
try {
|
|
85
|
+
await runUpdateCommand({ file: "sudo", args: [...args, "--", "env", ...environment, absoluteManager(command.file), ...command.args], ...(command.cwd ? { cwd: command.cwd } : {}) }, {
|
|
86
|
+
signal: options.signal, log: options.log, ...(auth?.status === "granted" ? { input: formatSudoStdinPassword(auth.password) } : {}),
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
throwIfCancelled(options.signal);
|
|
91
|
+
throw new Error(`could not update protected ${method.type} installation at ${method.packageRoot}; retry the administrator prompt or run this installation's update with sudo: ${error instanceof Error ? error.message : String(error)}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const JS_MANAGER_ENTRIES = { npm: [["npm", "bin", "npm-cli.js"]], pnpm: [["pnpm", "bin", "pnpm.mjs"], ["pnpm", "bin", "pnpm.cjs"]], yarn: [["yarn", "bin", "yarn.js"]] };
|
|
95
|
+
function nativeManagerCommand(command, method) {
|
|
96
|
+
if (process.platform !== "win32" || !/\.cmd$/i.test(command.file))
|
|
97
|
+
return command;
|
|
98
|
+
if (method.type !== "npm" && method.type !== "pnpm" && method.type !== "yarn")
|
|
99
|
+
return command;
|
|
100
|
+
const file = absoluteManager(command.file);
|
|
101
|
+
const base = join(dirname(file), "node_modules");
|
|
102
|
+
const entries = [...JS_MANAGER_ENTRIES[method.type].map((relative) => join(base, ...relative)), join(base, "corepack", "dist", `${method.type}.js`)];
|
|
103
|
+
const entry = entries.find(existsSync);
|
|
104
|
+
const node = join(dirname(file), "node.exe");
|
|
105
|
+
const runtime = existsSync(node) ? node : method.runtimePath;
|
|
106
|
+
if (entry && runtime)
|
|
107
|
+
return { ...command, file: runtime, args: [entry, ...command.args] };
|
|
108
|
+
if (command.args.some((arg) => /%[^%]+%/.test(arg)))
|
|
109
|
+
throw new Error("cannot safely pass this Windows installation path through an unidentified .cmd wrapper; reinstall the original package manager");
|
|
110
|
+
return command;
|
|
111
|
+
}
|
|
112
|
+
function isolatedGroupSpec(method, version) {
|
|
113
|
+
if (method.type !== "pnpm" || method.scope !== "global" || !method.prefix || !/[\\/]global[\\/]v\d+[\\/]/.test(method.prefix))
|
|
114
|
+
return undefined;
|
|
115
|
+
const manifest = JSON.parse(readFileSync(join(method.prefix, "package.json"), "utf8"));
|
|
116
|
+
if (!manifest || typeof manifest !== "object" || !("dependencies" in manifest) || !manifest.dependencies || typeof manifest.dependencies !== "object" || !(PACKAGE_NAME in manifest.dependencies))
|
|
117
|
+
throw new Error("cannot safely identify clai's isolated global pnpm group");
|
|
118
|
+
const entries = Object.entries(manifest.dependencies);
|
|
119
|
+
const specs = entries.map(([name, selector]) => {
|
|
120
|
+
if (!/^(?:@[a-z0-9._-]+\/)?[a-z0-9][a-z0-9._-]*$/i.test(name) || typeof selector !== "string")
|
|
121
|
+
throw new Error("invalid isolated pnpm group dependency");
|
|
122
|
+
if (name === PACKAGE_NAME)
|
|
123
|
+
return `${name}@${version}`;
|
|
124
|
+
const installed = JSON.parse(readFileSync(join(method.prefix, "node_modules", name, "package.json"), "utf8"));
|
|
125
|
+
if (!installed || typeof installed !== "object" || !("version" in installed))
|
|
126
|
+
throw new Error(`cannot preserve bundled pnpm dependency: ${name}`);
|
|
127
|
+
const pinned = releaseVersion(installed.version);
|
|
128
|
+
if (!pinned || /^(?:file:|link:|workspace:|git|https?:)/.test(selector))
|
|
129
|
+
throw new Error(`bundled pnpm dependency ${name} needs a manual update; existing group was kept`);
|
|
130
|
+
if (selector.startsWith("npm:")) {
|
|
131
|
+
if (!("name" in installed) || typeof installed.name !== "string" || !/^(?:@[a-z0-9._-]+\/)?[a-z0-9][a-z0-9._-]*$/i.test(installed.name))
|
|
132
|
+
throw new Error("invalid bundled pnpm alias");
|
|
133
|
+
return `${name}@npm:${installed.name}@${pinned}`;
|
|
134
|
+
}
|
|
135
|
+
return `${name}@${pinned}`;
|
|
136
|
+
});
|
|
137
|
+
return specs.sort().join(",");
|
|
138
|
+
}
|
|
139
|
+
export async function installViaPackageManager(options) {
|
|
140
|
+
throwIfCancelled(options.signal);
|
|
141
|
+
const groupSpec = isolatedGroupSpec(options.method, options.version);
|
|
142
|
+
const commands = managerUpdateCommands(options.method, options.version, process.platform, groupSpec).map((command) => nativeManagerCommand(command, options.method));
|
|
143
|
+
const verification = installedVersionCommand(options.method);
|
|
144
|
+
const allowNewer = options.method.type === "brew" || options.method.type === "scoop";
|
|
145
|
+
options.onProgress?.({ phase: "installing", detail: `${options.method.type} · ${options.method.prefix ?? options.method.detail}` });
|
|
146
|
+
if (process.platform === "win32") {
|
|
147
|
+
const elevated = options.method.scope === "global" && options.method.prefix !== undefined && !writableDirectory(options.method.packageRoot ? dirname(options.method.packageRoot) : options.method.prefix);
|
|
148
|
+
const statusFile = await stageWindowsUpdate({ kind: "commands", commands: commands.map(windowsCommand), verification: windowsCommand(verification), version: options.version, allowNewer }, { signal: options.signal, ...(options.lockFile ? { lockFile: options.lockFile, lockToken: options.lockToken } : {}) }, elevated);
|
|
149
|
+
return { ok: true, method: options.method.type, outcome: "staged", needsRestart: true, statusFile, message: `update staged for this ${options.method.type} installation; close clai to apply and verify it. Result: ${statusFile}` };
|
|
150
|
+
}
|
|
151
|
+
for (const command of commands) {
|
|
152
|
+
options.log?.(`Running ${command.file} ${command.args.join(" ")}`);
|
|
153
|
+
await runManager(command, options);
|
|
154
|
+
}
|
|
155
|
+
const installedVersion = await verifyCommand(verification, options.version, {}, allowNewer);
|
|
156
|
+
return { ok: true, method: options.method.type, outcome: "applied", installedVersion, needsRestart: true, message: `updated and verified v${installedVersion} via ${options.method.type}` };
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=package-managers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-managers.js","sourceRoot":"","sources":["../../../src/commands/update/package-managers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface UpdateCommand {
|
|
2
|
+
readonly file: string;
|
|
3
|
+
readonly args: readonly string[];
|
|
4
|
+
readonly cwd?: string;
|
|
5
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
6
|
+
}
|
|
7
|
+
export interface RunOptions {
|
|
8
|
+
readonly signal?: AbortSignal | undefined;
|
|
9
|
+
readonly timeoutMs?: number;
|
|
10
|
+
readonly log?: ((line: string) => void) | undefined;
|
|
11
|
+
readonly input?: string;
|
|
12
|
+
readonly platform?: NodeJS.Platform;
|
|
13
|
+
}
|
|
14
|
+
export declare function throwIfCancelled(signal?: AbortSignal): void;
|
|
15
|
+
export declare function psQuote(value: string): string;
|
|
16
|
+
export declare function windowsCommand(command: UpdateCommand): UpdateCommand;
|
|
17
|
+
export declare function runUpdateCommand(command: UpdateCommand, options?: RunOptions): Promise<string>;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
export function throwIfCancelled(signal) {
|
|
3
|
+
if (signal?.aborted)
|
|
4
|
+
throw new Error("update cancelled");
|
|
5
|
+
}
|
|
6
|
+
export function psQuote(value) {
|
|
7
|
+
if (/[\0\r\n]/.test(value))
|
|
8
|
+
throw new Error("invalid update command argument");
|
|
9
|
+
return `'${value.replace(/'/g, "''")}'`;
|
|
10
|
+
}
|
|
11
|
+
export function windowsCommand(command) {
|
|
12
|
+
if (!/\.(?:cmd|bat|ps1)$/i.test(command.file))
|
|
13
|
+
return command;
|
|
14
|
+
if (/\.(?:cmd|bat)$/i.test(command.file) && [command.file, ...command.args].some((value) => value.includes("%"))) {
|
|
15
|
+
throw new Error("cannot safely pass percent-containing paths or arguments through an unidentified Windows command wrapper; use the original manager's Node/Bun entrypoint");
|
|
16
|
+
}
|
|
17
|
+
const invocation = `& ${psQuote(command.file)} ${command.args.map(psQuote).join(" ")}; if (-not $?) { exit 1 }; exit $LASTEXITCODE`;
|
|
18
|
+
return { ...command, file: "powershell.exe", args: ["-NoProfile", "-NonInteractive", "-Command", invocation] };
|
|
19
|
+
}
|
|
20
|
+
function killTree(child, platform, force) {
|
|
21
|
+
if (!child.pid) {
|
|
22
|
+
child.kill(force ? "SIGKILL" : "SIGTERM");
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
if (platform === "win32") {
|
|
27
|
+
const killer = spawn("taskkill.exe", ["/PID", String(child.pid), "/T", "/F"], { stdio: "ignore", windowsHide: true });
|
|
28
|
+
killer.on("error", () => child.kill("SIGKILL"));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
process.kill(-child.pid, force ? "SIGKILL" : "SIGTERM");
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
child.kill(force ? "SIGKILL" : "SIGTERM");
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function runUpdateCommand(command, options = {}) {
|
|
38
|
+
throwIfCancelled(options.signal);
|
|
39
|
+
const platform = options.platform ?? process.platform;
|
|
40
|
+
const launch = platform === "win32" ? windowsCommand(command) : command;
|
|
41
|
+
return new Promise((resolve, reject) => {
|
|
42
|
+
const child = spawn(launch.file, [...launch.args], {
|
|
43
|
+
...(launch.cwd ? { cwd: launch.cwd } : {}),
|
|
44
|
+
env: { ...process.env, ...launch.env, CI: "1" },
|
|
45
|
+
stdio: [options.input === undefined ? "ignore" : "pipe", "pipe", "pipe"],
|
|
46
|
+
detached: platform !== "win32", windowsHide: true,
|
|
47
|
+
});
|
|
48
|
+
let stdout = "";
|
|
49
|
+
let stderr = "";
|
|
50
|
+
let outLine = "";
|
|
51
|
+
let errLine = "";
|
|
52
|
+
let failure;
|
|
53
|
+
let settled = false;
|
|
54
|
+
let killTimer;
|
|
55
|
+
let stopTimer;
|
|
56
|
+
const finish = (error) => {
|
|
57
|
+
if (settled)
|
|
58
|
+
return;
|
|
59
|
+
settled = true;
|
|
60
|
+
clearTimeout(timer);
|
|
61
|
+
clearTimeout(killTimer);
|
|
62
|
+
clearTimeout(stopTimer);
|
|
63
|
+
options.signal?.removeEventListener("abort", abort);
|
|
64
|
+
if (error)
|
|
65
|
+
reject(error);
|
|
66
|
+
else
|
|
67
|
+
resolve(stdout.trim());
|
|
68
|
+
};
|
|
69
|
+
const stop = (error) => {
|
|
70
|
+
if (settled || failure)
|
|
71
|
+
return;
|
|
72
|
+
failure = error;
|
|
73
|
+
killTree(child, platform, false);
|
|
74
|
+
killTimer = setTimeout(() => killTree(child, platform, true), 1000);
|
|
75
|
+
stopTimer = setTimeout(() => finish(error), 3000);
|
|
76
|
+
};
|
|
77
|
+
const abort = () => stop(new Error("update cancelled"));
|
|
78
|
+
const timer = setTimeout(() => stop(new Error(`${command.file} timed out during update`)), options.timeoutMs ?? 600_000);
|
|
79
|
+
options.signal?.addEventListener("abort", abort, { once: true });
|
|
80
|
+
const feed = (chunk, error) => {
|
|
81
|
+
const text = chunk.toString();
|
|
82
|
+
if (error)
|
|
83
|
+
stderr = (stderr + text).slice(-16_384);
|
|
84
|
+
else
|
|
85
|
+
stdout = (stdout + text).slice(-16_384);
|
|
86
|
+
const lines = ((error ? errLine : outLine) + text).split(/\r?\n/);
|
|
87
|
+
const tail = (lines.pop() ?? "").slice(-2048);
|
|
88
|
+
if (error)
|
|
89
|
+
errLine = tail;
|
|
90
|
+
else
|
|
91
|
+
outLine = tail;
|
|
92
|
+
for (const line of lines)
|
|
93
|
+
if (line.trim())
|
|
94
|
+
options.log?.(line.slice(-2048).trimEnd());
|
|
95
|
+
};
|
|
96
|
+
child.stdout?.on("data", (data) => feed(data, false));
|
|
97
|
+
child.stderr?.on("data", (data) => feed(data, true));
|
|
98
|
+
child.on("error", (error) => finish(failure ?? new Error(`could not run ${command.file}: ${error.message}`)));
|
|
99
|
+
child.on("close", (code) => {
|
|
100
|
+
for (const line of [outLine, errLine])
|
|
101
|
+
if (line.trim())
|
|
102
|
+
options.log?.(line.trimEnd());
|
|
103
|
+
const detail = (stderr || stdout).trim().split("\n").slice(-4).join(" ");
|
|
104
|
+
finish(failure ?? (code === 0 ? undefined : new Error(`${command.file} exited with status ${code ?? "error"}${detail ? ` — ${detail}` : ""}`)));
|
|
105
|
+
});
|
|
106
|
+
if (options.signal?.aborted)
|
|
107
|
+
abort();
|
|
108
|
+
if (options.input !== undefined) {
|
|
109
|
+
child.stdin?.on("error", () => { });
|
|
110
|
+
child.stdin?.end(options.input);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../../src/commands/update/process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAiB9D,MAAM,UAAU,gBAAgB,CAAC,MAAoB;IACnD,IAAI,MAAM,EAAE,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC/E,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAsB;IACnD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IAC9D,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACjH,MAAM,IAAI,KAAK,CAAC,0JAA0J,CAAC,CAAC;IAC9K,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,+CAA+C,CAAC;IACpI,OAAO,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC;AACjH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAmB,EAAE,QAAyB,EAAE,KAAc;IAC9E,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IACtE,IAAI,CAAC;QACH,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YACtH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAsB,EAAE,UAAsB,EAAE;IAC/E,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IACtD,MAAM,MAAM,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACxE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE;YACjD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1C,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE;YAC/C,KAAK,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YACxE,QAAQ,EAAE,QAAQ,KAAK,OAAO,EAAE,WAAW,EAAE,IAAI;SAClD,CAAC,CAAC;QACH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,OAA0B,CAAC;QAC/B,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,SAAoD,CAAC;QACzD,IAAI,SAAoD,CAAC;QACzD,MAAM,MAAM,GAAG,CAAC,KAAa,EAAQ,EAAE;YACrC,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACpD,IAAI,KAAK;gBAAE,MAAM,CAAC,KAAK,CAAC,CAAC;;gBAAM,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,CAAC,KAAY,EAAQ,EAAE;YAClC,IAAI,OAAO,IAAI,OAAO;gBAAE,OAAO;YAC/B,OAAO,GAAG,KAAK,CAAC;YAChB,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;YACjC,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;YACpE,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QACpD,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,GAAS,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,0BAA0B,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,CAAC;QACzH,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,KAAc,EAAQ,EAAE;YACnD,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC9B,IAAI,KAAK;gBAAE,MAAM,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;;gBAAM,MAAM,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;YACjG,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAClE,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;YAC9C,IAAI,KAAK;gBAAE,OAAO,GAAG,IAAI,CAAC;;gBAAM,OAAO,GAAG,IAAI,CAAC;YAC/C,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,IAAI,IAAI,CAAC,IAAI,EAAE;oBAAE,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACxF,CAAC,CAAC;QACF,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QAC9D,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC7D,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,KAAK,CAAC,iBAAiB,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9G,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,KAAK,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;gBAAE,IAAI,IAAI,CAAC,IAAI,EAAE;oBAAE,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YACtF,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzE,MAAM,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,uBAAuB,IAAI,IAAI,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAClJ,CAAC,CAAC,CAAC;QACH,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;YAAE,KAAK,EAAE,CAAC;QACrC,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAChC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACnC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|