indusagi 0.12.19 → 0.12.21
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/README.md +16 -36
- package/dist/agent/agent-loop.d.ts +3 -9
- package/dist/agent/agent-loop.d.ts.map +1 -1
- package/dist/agent/agent-loop.js +19 -58
- package/dist/agent/agent-loop.js.map +1 -1
- package/dist/agent/agent.d.ts +9 -10
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +182 -129
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/error-handler.d.ts.map +1 -1
- package/dist/agent/error-handler.js.map +1 -1
- package/dist/agent/event-bus.d.ts.map +1 -1
- package/dist/agent/event-bus.js +1 -3
- package/dist/agent/event-bus.js.map +1 -1
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +0 -6
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/messages.d.ts +1 -1
- package/dist/agent/messages.d.ts.map +1 -1
- package/dist/agent/proxy.d.ts +1 -14
- package/dist/agent/proxy.d.ts.map +1 -1
- package/dist/agent/proxy.js +67 -148
- package/dist/agent/proxy.js.map +1 -1
- package/dist/agent/session-manager.d.ts +10 -10
- package/dist/agent/session-manager.d.ts.map +1 -1
- package/dist/agent/session-manager.js +20 -16
- package/dist/agent/session-manager.js.map +1 -1
- package/dist/agent/state-manager.d.ts +1 -1
- package/dist/agent/state-manager.d.ts.map +1 -1
- package/dist/agent/state-manager.js +1 -0
- package/dist/agent/state-manager.js.map +1 -1
- package/dist/agent/telemetry.d.ts.map +1 -1
- package/dist/agent/telemetry.js +1 -3
- package/dist/agent/telemetry.js.map +1 -1
- package/dist/agent/tools/bash.d.ts.map +1 -1
- package/dist/agent/tools/bash.js +143 -118
- package/dist/agent/tools/bash.js.map +1 -1
- package/dist/agent/tools/edit-diff.d.ts +1 -1
- package/dist/agent/tools/edit-diff.d.ts.map +1 -1
- package/dist/agent/tools/edit-diff.js +189 -175
- package/dist/agent/tools/edit-diff.js.map +1 -1
- package/dist/agent/tools/edit.d.ts.map +1 -1
- package/dist/agent/tools/edit.js +137 -121
- package/dist/agent/tools/edit.js.map +1 -1
- package/dist/agent/tools/find.d.ts.map +1 -1
- package/dist/agent/tools/find.js +100 -65
- package/dist/agent/tools/find.js.map +1 -1
- package/dist/agent/tools/grep.d.ts.map +1 -1
- package/dist/agent/tools/grep.js +126 -97
- package/dist/agent/tools/grep.js.map +1 -1
- package/dist/agent/tools/index.d.ts +53 -40
- package/dist/agent/tools/index.d.ts.map +1 -1
- package/dist/agent/tools/index.js +19 -12
- package/dist/agent/tools/index.js.map +1 -1
- package/dist/agent/tools/ls.d.ts +2 -1
- package/dist/agent/tools/ls.d.ts.map +1 -1
- package/dist/agent/tools/ls.js +145 -94
- package/dist/agent/tools/ls.js.map +1 -1
- package/dist/agent/tools/path-utils.d.ts.map +1 -1
- package/dist/agent/tools/path-utils.js +48 -29
- package/dist/agent/tools/path-utils.js.map +1 -1
- package/dist/agent/tools/process-controller.d.ts +15 -0
- package/dist/agent/tools/process-controller.d.ts.map +1 -0
- package/dist/agent/tools/process-controller.js +39 -0
- package/dist/agent/tools/process-controller.js.map +1 -0
- package/dist/agent/tools/process-manager.d.ts +60 -0
- package/dist/agent/tools/process-manager.d.ts.map +1 -0
- package/dist/agent/tools/process-manager.js +485 -0
- package/dist/agent/tools/process-manager.js.map +1 -0
- package/dist/agent/tools/process-types.d.ts +74 -0
- package/dist/agent/tools/process-types.d.ts.map +1 -0
- package/dist/agent/tools/process-types.js +7 -0
- package/dist/agent/tools/process-types.js.map +1 -0
- package/dist/agent/tools/process.d.ts +38 -0
- package/dist/agent/tools/process.d.ts.map +1 -0
- package/dist/agent/tools/process.js +360 -0
- package/dist/agent/tools/process.js.map +1 -0
- package/dist/agent/tools/read.d.ts.map +1 -1
- package/dist/agent/tools/read.js +157 -135
- package/dist/agent/tools/read.js.map +1 -1
- package/dist/agent/tools/registry.js +2 -4
- package/dist/agent/tools/registry.js.map +1 -1
- package/dist/agent/tools/teams/activity-tracker.d.ts +66 -0
- package/dist/agent/tools/teams/activity-tracker.d.ts.map +1 -0
- package/dist/agent/tools/teams/activity-tracker.js +480 -0
- package/dist/agent/tools/teams/activity-tracker.js.map +1 -0
- package/dist/agent/tools/teams/cleanup.d.ts +51 -0
- package/dist/agent/tools/teams/cleanup.d.ts.map +1 -0
- package/dist/agent/tools/teams/cleanup.js +219 -0
- package/dist/agent/tools/teams/cleanup.js.map +1 -0
- package/dist/agent/tools/teams/fs-lock.d.ts +12 -0
- package/dist/agent/tools/teams/fs-lock.d.ts.map +1 -0
- package/dist/agent/tools/teams/fs-lock.js +74 -0
- package/dist/agent/tools/teams/fs-lock.js.map +1 -0
- package/dist/agent/tools/teams/index.d.ts +12 -0
- package/dist/agent/tools/teams/index.d.ts.map +1 -0
- package/dist/agent/tools/teams/index.js +12 -0
- package/dist/agent/tools/teams/index.js.map +1 -0
- package/dist/agent/tools/teams/mailbox.d.ts +21 -0
- package/dist/agent/tools/teams/mailbox.d.ts.map +1 -0
- package/dist/agent/tools/teams/mailbox.js +106 -0
- package/dist/agent/tools/teams/mailbox.js.map +1 -0
- package/dist/agent/tools/teams/model-policy.d.ts +23 -0
- package/dist/agent/tools/teams/model-policy.d.ts.map +1 -0
- package/dist/agent/tools/teams/model-policy.js +113 -0
- package/dist/agent/tools/teams/model-policy.js.map +1 -0
- package/dist/agent/tools/teams/names.d.ts +28 -0
- package/dist/agent/tools/teams/names.d.ts.map +1 -0
- package/dist/agent/tools/teams/names.js +109 -0
- package/dist/agent/tools/teams/names.js.map +1 -0
- package/dist/agent/tools/teams/protocol.d.ts +75 -0
- package/dist/agent/tools/teams/protocol.d.ts.map +1 -0
- package/dist/agent/tools/teams/protocol.js +205 -0
- package/dist/agent/tools/teams/protocol.js.map +1 -0
- package/dist/agent/tools/teams/task-store.d.ts +89 -0
- package/dist/agent/tools/teams/task-store.d.ts.map +1 -0
- package/dist/agent/tools/teams/task-store.js +445 -0
- package/dist/agent/tools/teams/task-store.js.map +1 -0
- package/dist/agent/tools/teams/team-attach-claim.d.ts +36 -0
- package/dist/agent/tools/teams/team-attach-claim.d.ts.map +1 -0
- package/dist/agent/tools/teams/team-attach-claim.js +144 -0
- package/dist/agent/tools/teams/team-attach-claim.js.map +1 -0
- package/dist/agent/tools/teams/team-config.d.ts +55 -0
- package/dist/agent/tools/teams/team-config.d.ts.map +1 -0
- package/dist/agent/tools/teams/team-config.js +252 -0
- package/dist/agent/tools/teams/team-config.js.map +1 -0
- package/dist/agent/tools/teams/worktree.d.ts +40 -0
- package/dist/agent/tools/teams/worktree.d.ts.map +1 -0
- package/dist/agent/tools/teams/worktree.js +213 -0
- package/dist/agent/tools/teams/worktree.js.map +1 -0
- package/dist/agent/tools/todo-store.js +2 -1
- package/dist/agent/tools/todo-store.js.map +1 -1
- package/dist/agent/tools/todo.d.ts +2 -2
- package/dist/agent/tools/todo.js +2 -2
- package/dist/agent/tools/truncate.d.ts.map +1 -1
- package/dist/agent/tools/truncate.js +150 -134
- package/dist/agent/tools/truncate.js.map +1 -1
- package/dist/agent/tools/utils/hook-runner.d.ts +9 -10
- package/dist/agent/tools/utils/hook-runner.d.ts.map +1 -1
- package/dist/agent/tools/utils/hook-runner.js +18 -16
- package/dist/agent/tools/utils/hook-runner.js.map +1 -1
- package/dist/agent/tools/utils/image-resize.d.ts +1 -14
- package/dist/agent/tools/utils/image-resize.d.ts.map +1 -1
- package/dist/agent/tools/utils/image-resize.js +80 -34
- package/dist/agent/tools/utils/image-resize.js.map +1 -1
- package/dist/agent/tools/utils/mime.d.ts +0 -8
- package/dist/agent/tools/utils/mime.d.ts.map +1 -1
- package/dist/agent/tools/utils/mime.js +43 -32
- package/dist/agent/tools/utils/mime.js.map +1 -1
- package/dist/agent/tools/utils/shell.d.ts +1 -23
- package/dist/agent/tools/utils/shell.d.ts.map +1 -1
- package/dist/agent/tools/utils/shell.js +43 -86
- package/dist/agent/tools/utils/shell.js.map +1 -1
- package/dist/agent/tools/write.d.ts.map +1 -1
- package/dist/agent/tools/write.js +105 -62
- package/dist/agent/tools/write.js.map +1 -1
- package/dist/agent/types.d.ts +69 -64
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js +38 -23
- package/dist/agent/types.js.map +1 -1
- package/dist/agent.d.ts +4 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +4 -0
- package/dist/agent.js.map +1 -1
- package/dist/ai/api-registry.d.ts.map +1 -1
- package/dist/ai/api-registry.js +3 -4
- package/dist/ai/api-registry.js.map +1 -1
- package/dist/ai/cli.js +62 -82
- package/dist/ai/cli.js.map +1 -1
- package/dist/ai/env-api-keys.d.ts.map +1 -1
- package/dist/ai/env-api-keys.js +78 -81
- package/dist/ai/env-api-keys.js.map +1 -1
- package/dist/ai/index.d.ts +6 -0
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +6 -0
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/models.d.ts +7 -17
- package/dist/ai/models.d.ts.map +1 -1
- package/dist/ai/models.generated.d.ts +19 -0
- package/dist/ai/models.generated.d.ts.map +1 -1
- package/dist/ai/models.generated.js +14 -2
- package/dist/ai/models.generated.js.map +1 -1
- package/dist/ai/models.js +17 -11
- package/dist/ai/models.js.map +1 -1
- package/dist/ai/providers/amazon-bedrock.d.ts.map +1 -1
- package/dist/ai/providers/amazon-bedrock.js +319 -248
- package/dist/ai/providers/amazon-bedrock.js.map +1 -1
- package/dist/ai/providers/anthropic.d.ts.map +1 -1
- package/dist/ai/providers/anthropic.js +378 -324
- package/dist/ai/providers/anthropic.js.map +1 -1
- package/dist/ai/providers/azure-openai-responses.d.ts.map +1 -1
- package/dist/ai/providers/azure-openai-responses.js +164 -123
- package/dist/ai/providers/azure-openai-responses.js.map +1 -1
- package/dist/ai/providers/google-shared.d.ts +0 -18
- package/dist/ai/providers/google-shared.d.ts.map +1 -1
- package/dist/ai/providers/google-shared.js +224 -225
- package/dist/ai/providers/google-shared.js.map +1 -1
- package/dist/ai/providers/google-vertex.d.ts.map +1 -1
- package/dist/ai/providers/google-vertex.js +244 -226
- package/dist/ai/providers/google-vertex.js.map +1 -1
- package/dist/ai/providers/google.d.ts +3 -0
- package/dist/ai/providers/google.d.ts.map +1 -1
- package/dist/ai/providers/google.js +232 -210
- package/dist/ai/providers/google.js.map +1 -1
- package/dist/ai/providers/kimi.js +1 -0
- package/dist/ai/providers/kimi.js.map +1 -1
- package/dist/ai/providers/mock.d.ts +10 -0
- package/dist/ai/providers/mock.d.ts.map +1 -0
- package/dist/ai/providers/mock.js +64 -0
- package/dist/ai/providers/mock.js.map +1 -0
- package/dist/ai/providers/openai-codex-responses.d.ts.map +1 -1
- package/dist/ai/providers/openai-codex-responses.js +178 -133
- package/dist/ai/providers/openai-codex-responses.js.map +1 -1
- package/dist/ai/providers/openai-completions.d.ts.map +1 -1
- package/dist/ai/providers/openai-completions.js +468 -387
- package/dist/ai/providers/openai-completions.js.map +1 -1
- package/dist/ai/providers/openai-responses-shared.d.ts.map +1 -1
- package/dist/ai/providers/openai-responses-shared.js +187 -166
- package/dist/ai/providers/openai-responses-shared.js.map +1 -1
- package/dist/ai/providers/openai-responses.d.ts.map +1 -1
- package/dist/ai/providers/openai-responses.js +108 -85
- package/dist/ai/providers/openai-responses.js.map +1 -1
- package/dist/ai/providers/openai-scaffold.d.ts +4 -0
- package/dist/ai/providers/openai-scaffold.d.ts.map +1 -0
- package/dist/ai/providers/openai-scaffold.js +33 -0
- package/dist/ai/providers/openai-scaffold.js.map +1 -0
- package/dist/ai/providers/register-builtins.d.ts.map +1 -1
- package/dist/ai/providers/register-builtins.js +109 -42
- package/dist/ai/providers/register-builtins.js.map +1 -1
- package/dist/ai/providers/simple-options.js +2 -0
- package/dist/ai/providers/simple-options.js.map +1 -1
- package/dist/ai/providers/transform-messages.js +3 -9
- package/dist/ai/providers/transform-messages.js.map +1 -1
- package/dist/ai/stream.d.ts +4 -14
- package/dist/ai/stream.d.ts.map +1 -1
- package/dist/ai/stream.js +0 -36
- package/dist/ai/stream.js.map +1 -1
- package/dist/ai/types.d.ts +22 -3
- package/dist/ai/types.d.ts.map +1 -1
- package/dist/ai/types.js +154 -77
- package/dist/ai/types.js.map +1 -1
- package/dist/ai/utils/base-stream-handler.js +1 -0
- package/dist/ai/utils/base-stream-handler.js.map +1 -1
- package/dist/ai/utils/event-stream.d.ts +2 -0
- package/dist/ai/utils/event-stream.d.ts.map +1 -1
- package/dist/ai/utils/event-stream.js +22 -5
- package/dist/ai/utils/event-stream.js.map +1 -1
- package/dist/ai/utils/json-parse.d.ts +3 -0
- package/dist/ai/utils/json-parse.d.ts.map +1 -1
- package/dist/ai/utils/json-parse.js +8 -5
- package/dist/ai/utils/json-parse.js.map +1 -1
- package/dist/ai/utils/oauth/anthropic.d.ts.map +1 -1
- package/dist/ai/utils/oauth/anthropic.js +110 -65
- package/dist/ai/utils/oauth/anthropic.js.map +1 -1
- package/dist/ai/utils/oauth/github-copilot.d.ts +8 -16
- package/dist/ai/utils/oauth/github-copilot.d.ts.map +1 -1
- package/dist/ai/utils/oauth/github-copilot.js +218 -227
- package/dist/ai/utils/oauth/github-copilot.js.map +1 -1
- package/dist/ai/utils/oauth/openai-codex.d.ts +4 -2
- package/dist/ai/utils/oauth/openai-codex.d.ts.map +1 -1
- package/dist/ai/utils/oauth/openai-codex.js +221 -236
- package/dist/ai/utils/oauth/openai-codex.js.map +1 -1
- package/dist/ai/utils/oauth/pkce.d.ts +6 -5
- package/dist/ai/utils/oauth/pkce.d.ts.map +1 -1
- package/dist/ai/utils/oauth/pkce.js +24 -21
- package/dist/ai/utils/oauth/pkce.js.map +1 -1
- package/dist/ai/utils/oauth/types.d.ts +31 -12
- package/dist/ai/utils/oauth/types.d.ts.map +1 -1
- package/dist/ai/utils/oauth/types.js +10 -1
- package/dist/ai/utils/oauth/types.js.map +1 -1
- package/dist/ai/utils/overflow.d.ts.map +1 -1
- package/dist/ai/utils/overflow.js +49 -21
- package/dist/ai/utils/overflow.js.map +1 -1
- package/dist/ai/utils/provider-adapter.js +9 -0
- package/dist/ai/utils/provider-adapter.js.map +1 -1
- package/dist/ai/utils/provider-client-builder.js +1 -1
- package/dist/ai/utils/provider-client-builder.js.map +1 -1
- package/dist/ai/utils/provider-errors.js +2 -0
- package/dist/ai/utils/provider-errors.js.map +1 -1
- package/dist/ai/utils/sanitize-unicode.d.ts +0 -20
- package/dist/ai/utils/sanitize-unicode.d.ts.map +1 -1
- package/dist/ai/utils/sanitize-unicode.js +35 -17
- package/dist/ai/utils/sanitize-unicode.js.map +1 -1
- package/dist/ai/utils/stream-event-helper.js +3 -0
- package/dist/ai/utils/stream-event-helper.js.map +1 -1
- package/dist/ai/utils/stream-handler-types.js +5 -0
- package/dist/ai/utils/stream-handler-types.js.map +1 -1
- package/dist/ai/utils/streaming-state-manager.js +4 -2
- package/dist/ai/utils/streaming-state-manager.js.map +1 -1
- package/dist/ai/utils/typebox-helpers.d.ts +6 -4
- package/dist/ai/utils/typebox-helpers.d.ts.map +1 -1
- package/dist/ai/utils/typebox-helpers.js +25 -7
- package/dist/ai/utils/typebox-helpers.js.map +1 -1
- package/dist/ai/utils/validation.d.ts.map +1 -1
- package/dist/ai/utils/validation.js +67 -34
- package/dist/ai/utils/validation.js.map +1 -1
- package/dist/ai.d.ts +4 -0
- package/dist/ai.d.ts.map +1 -1
- package/dist/ai.js +4 -0
- package/dist/ai.js.map +1 -1
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +3 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/client-pool.js +3 -2
- package/dist/mcp/client-pool.js.map +1 -1
- package/dist/mcp/client.js +19 -6
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/config.d.ts +6 -6
- package/dist/mcp/config.js +17 -17
- package/dist/mcp/config.js.map +1 -1
- package/dist/mcp/errors.js +8 -0
- package/dist/mcp/errors.js.map +1 -1
- package/dist/mcp/index.d.ts +5 -5
- package/dist/mcp/index.js +5 -5
- package/dist/mcp/schema-converter.d.ts +1 -1
- package/dist/mcp/schema-converter.js +1 -1
- package/dist/mcp/server.d.ts +4 -4
- package/dist/mcp/server.js +12 -7
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tool-factory.d.ts +2 -2
- package/dist/mcp/tool-factory.js +2 -2
- package/dist/mcp.d.ts +0 -4
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +0 -4
- package/dist/mcp.js.map +1 -1
- package/dist/observability.d.ts +2 -0
- package/dist/observability.d.ts.map +1 -0
- package/dist/observability.js +2 -0
- package/dist/observability.js.map +1 -0
- package/dist/tui/autocomplete.d.ts +14 -18
- package/dist/tui/autocomplete.d.ts.map +1 -1
- package/dist/tui/autocomplete.js +290 -402
- package/dist/tui/autocomplete.js.map +1 -1
- package/dist/tui/components/box.d.ts +1 -6
- package/dist/tui/components/box.d.ts.map +1 -1
- package/dist/tui/components/box.js +98 -67
- package/dist/tui/components/box.js.map +1 -1
- package/dist/tui/components/cancellable-loader.d.ts +6 -3
- package/dist/tui/components/cancellable-loader.d.ts.map +1 -1
- package/dist/tui/components/cancellable-loader.js +8 -9
- package/dist/tui/components/cancellable-loader.js.map +1 -1
- package/dist/tui/components/editor.d.ts +18 -0
- package/dist/tui/components/editor.d.ts.map +1 -1
- package/dist/tui/components/editor.js +356 -354
- package/dist/tui/components/editor.js.map +1 -1
- package/dist/tui/components/image.d.ts +2 -0
- package/dist/tui/components/image.d.ts.map +1 -1
- package/dist/tui/components/image.js +79 -37
- package/dist/tui/components/image.js.map +1 -1
- package/dist/tui/components/input.d.ts +4 -8
- package/dist/tui/components/input.d.ts.map +1 -1
- package/dist/tui/components/input.js +236 -232
- package/dist/tui/components/input.js.map +1 -1
- package/dist/tui/components/loader.d.ts +5 -5
- package/dist/tui/components/loader.d.ts.map +1 -1
- package/dist/tui/components/loader.js +22 -19
- package/dist/tui/components/loader.js.map +1 -1
- package/dist/tui/components/markdown.d.ts +2 -32
- package/dist/tui/components/markdown.d.ts.map +1 -1
- package/dist/tui/components/markdown.js +338 -357
- package/dist/tui/components/markdown.js.map +1 -1
- package/dist/tui/components/select-list.d.ts +1 -0
- package/dist/tui/components/select-list.d.ts.map +1 -1
- package/dist/tui/components/select-list.js +83 -82
- package/dist/tui/components/select-list.js.map +1 -1
- package/dist/tui/components/settings-list.d.ts +10 -10
- package/dist/tui/components/settings-list.d.ts.map +1 -1
- package/dist/tui/components/settings-list.js +48 -40
- package/dist/tui/components/settings-list.js.map +1 -1
- package/dist/tui/components/spacer.d.ts +1 -0
- package/dist/tui/components/spacer.d.ts.map +1 -1
- package/dist/tui/components/spacer.js +20 -5
- package/dist/tui/components/spacer.js.map +1 -1
- package/dist/tui/components/text.d.ts.map +1 -1
- package/dist/tui/components/text.js +47 -20
- package/dist/tui/components/text.js.map +1 -1
- package/dist/tui/components/truncated-text.d.ts +8 -4
- package/dist/tui/components/truncated-text.d.ts.map +1 -1
- package/dist/tui/components/truncated-text.js +15 -12
- package/dist/tui/components/truncated-text.js.map +1 -1
- package/dist/tui/editor-component.d.ts +87 -23
- package/dist/tui/editor-component.d.ts.map +1 -1
- package/dist/tui/fuzzy.d.ts.map +1 -1
- package/dist/tui/fuzzy.js +101 -50
- package/dist/tui/fuzzy.js.map +1 -1
- package/dist/tui/keybindings.d.ts +3 -3
- package/dist/tui/keybindings.d.ts.map +1 -1
- package/dist/tui/keybindings.js +137 -111
- package/dist/tui/keybindings.js.map +1 -1
- package/dist/tui/keys.d.ts +46 -43
- package/dist/tui/keys.d.ts.map +1 -1
- package/dist/tui/keys.js +493 -411
- package/dist/tui/keys.js.map +1 -1
- package/dist/tui/stdin-buffer.d.ts.map +1 -1
- package/dist/tui/stdin-buffer.js +162 -159
- package/dist/tui/stdin-buffer.js.map +1 -1
- package/dist/tui/terminal-image.d.ts +10 -5
- package/dist/tui/terminal-image.d.ts.map +1 -1
- package/dist/tui/terminal-image.js +53 -51
- package/dist/tui/terminal-image.js.map +1 -1
- package/dist/tui/terminal.d.ts +4 -27
- package/dist/tui/terminal.d.ts.map +1 -1
- package/dist/tui/terminal.js +123 -121
- package/dist/tui/terminal.js.map +1 -1
- package/dist/tui/tui.d.ts +14 -1
- package/dist/tui/tui.d.ts.map +1 -1
- package/dist/tui/tui.js +185 -145
- package/dist/tui/tui.js.map +1 -1
- package/dist/tui/utils.d.ts.map +1 -1
- package/dist/tui/utils.js +235 -216
- package/dist/tui/utils.js.map +1 -1
- package/dist/tui.d.ts +4 -0
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +4 -0
- package/dist/tui.js.map +1 -1
- package/package.json +23 -43
- package/LICENSE.md +0 -22
- package/dist/agent/tools/task-types.d.ts +0 -74
- package/dist/agent/tools/task-types.d.ts.map +0 -1
- package/dist/agent/tools/task-types.js +0 -8
- package/dist/agent/tools/task-types.js.map +0 -1
- package/dist/agent/tools/task.d.ts +0 -84
- package/dist/agent/tools/task.d.ts.map +0 -1
- package/dist/agent/tools/task.js +0 -184
- package/dist/agent/tools/task.js.map +0 -1
- package/dist/memory/embedder/base.d.ts +0 -41
- package/dist/memory/embedder/base.d.ts.map +0 -1
- package/dist/memory/embedder/base.js +0 -10
- package/dist/memory/embedder/base.js.map +0 -1
- package/dist/memory/embedder/index.d.ts +0 -8
- package/dist/memory/embedder/index.d.ts.map +0 -1
- package/dist/memory/embedder/index.js +0 -6
- package/dist/memory/embedder/index.js.map +0 -1
- package/dist/memory/embedder/openai.d.ts +0 -35
- package/dist/memory/embedder/openai.d.ts.map +0 -1
- package/dist/memory/embedder/openai.js +0 -103
- package/dist/memory/embedder/openai.js.map +0 -1
- package/dist/memory/index.d.ts +0 -33
- package/dist/memory/index.d.ts.map +0 -1
- package/dist/memory/index.js +0 -31
- package/dist/memory/index.js.map +0 -1
- package/dist/memory/memory.d.ts +0 -126
- package/dist/memory/memory.d.ts.map +0 -1
- package/dist/memory/memory.js +0 -280
- package/dist/memory/memory.js.map +0 -1
- package/dist/memory/processors/base.d.ts +0 -42
- package/dist/memory/processors/base.d.ts.map +0 -1
- package/dist/memory/processors/base.js +0 -6
- package/dist/memory/processors/base.js.map +0 -1
- package/dist/memory/processors/index.d.ts +0 -16
- package/dist/memory/processors/index.d.ts.map +0 -1
- package/dist/memory/processors/index.js +0 -18
- package/dist/memory/processors/index.js.map +0 -1
- package/dist/memory/processors/message-history.d.ts +0 -35
- package/dist/memory/processors/message-history.d.ts.map +0 -1
- package/dist/memory/processors/message-history.js +0 -51
- package/dist/memory/processors/message-history.js.map +0 -1
- package/dist/memory/processors/observational-memory/index.d.ts +0 -82
- package/dist/memory/processors/observational-memory/index.d.ts.map +0 -1
- package/dist/memory/processors/observational-memory/index.js +0 -234
- package/dist/memory/processors/observational-memory/index.js.map +0 -1
- package/dist/memory/processors/observational-memory/observer-agent.d.ts +0 -64
- package/dist/memory/processors/observational-memory/observer-agent.d.ts.map +0 -1
- package/dist/memory/processors/observational-memory/observer-agent.js +0 -362
- package/dist/memory/processors/observational-memory/observer-agent.js.map +0 -1
- package/dist/memory/processors/observational-memory/reflector-agent.d.ts +0 -38
- package/dist/memory/processors/observational-memory/reflector-agent.d.ts.map +0 -1
- package/dist/memory/processors/observational-memory/reflector-agent.js +0 -213
- package/dist/memory/processors/observational-memory/reflector-agent.js.map +0 -1
- package/dist/memory/processors/observational-memory/token-counter.d.ts +0 -35
- package/dist/memory/processors/observational-memory/token-counter.d.ts.map +0 -1
- package/dist/memory/processors/observational-memory/token-counter.js +0 -90
- package/dist/memory/processors/observational-memory/token-counter.js.map +0 -1
- package/dist/memory/processors/semantic-recall.d.ts +0 -55
- package/dist/memory/processors/semantic-recall.d.ts.map +0 -1
- package/dist/memory/processors/semantic-recall.js +0 -143
- package/dist/memory/processors/semantic-recall.js.map +0 -1
- package/dist/memory/processors/working-memory.d.ts +0 -41
- package/dist/memory/processors/working-memory.d.ts.map +0 -1
- package/dist/memory/processors/working-memory.js +0 -82
- package/dist/memory/processors/working-memory.js.map +0 -1
- package/dist/memory/storage/base.d.ts +0 -288
- package/dist/memory/storage/base.d.ts.map +0 -1
- package/dist/memory/storage/base.js +0 -211
- package/dist/memory/storage/base.js.map +0 -1
- package/dist/memory/storage/index.d.ts +0 -9
- package/dist/memory/storage/index.d.ts.map +0 -1
- package/dist/memory/storage/index.js +0 -7
- package/dist/memory/storage/index.js.map +0 -1
- package/dist/memory/storage/inmemory.d.ts +0 -93
- package/dist/memory/storage/inmemory.d.ts.map +0 -1
- package/dist/memory/storage/inmemory.js +0 -646
- package/dist/memory/storage/inmemory.js.map +0 -1
- package/dist/memory/tools/working-memory.d.ts +0 -100
- package/dist/memory/tools/working-memory.d.ts.map +0 -1
- package/dist/memory/tools/working-memory.js +0 -237
- package/dist/memory/tools/working-memory.js.map +0 -1
- package/dist/memory/types.d.ts +0 -386
- package/dist/memory/types.d.ts.map +0 -1
- package/dist/memory/types.js +0 -58
- package/dist/memory/types.js.map +0 -1
- package/dist/memory/vector/base.d.ts +0 -145
- package/dist/memory/vector/base.d.ts.map +0 -1
- package/dist/memory/vector/base.js +0 -83
- package/dist/memory/vector/base.js.map +0 -1
- package/dist/memory/vector/index.d.ts +0 -8
- package/dist/memory/vector/index.d.ts.map +0 -1
- package/dist/memory/vector/index.js +0 -7
- package/dist/memory/vector/index.js.map +0 -1
- package/dist/memory/vector/inmemory.d.ts +0 -47
- package/dist/memory/vector/inmemory.d.ts.map +0 -1
- package/dist/memory/vector/inmemory.js +0 -234
- package/dist/memory/vector/inmemory.js.map +0 -1
package/dist/tui/utils.js
CHANGED
|
@@ -32,7 +32,7 @@ export const textWidthCalculator = new TextWidthCalculator();
|
|
|
32
32
|
* The tested Unicode blocks are deliberately broad to account for future
|
|
33
33
|
* Unicode additions.
|
|
34
34
|
*/
|
|
35
|
-
function
|
|
35
|
+
function looksLikeEmojiCandidate(segment) {
|
|
36
36
|
const cp = segment.codePointAt(0);
|
|
37
37
|
return ((cp >= 0x1f000 && cp <= 0x1fbff) || // Emoji and Pictograph
|
|
38
38
|
(cp >= 0x2300 && cp <= 0x23ff) || // Misc technical
|
|
@@ -43,9 +43,34 @@ function couldBeEmoji(segment) {
|
|
|
43
43
|
);
|
|
44
44
|
}
|
|
45
45
|
// Regexes for character classification (same as string-width library)
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
// Use dynamic construction to keep compatibility with ts target < es2024 while
|
|
47
|
+
// still preferring Unicode Sets (v-flag) when available at runtime.
|
|
48
|
+
function createUnicodeRegex(vPattern, uFallback) {
|
|
49
|
+
try {
|
|
50
|
+
return new RegExp(vPattern, "v");
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return new RegExp(uFallback, "u");
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const zeroWidthRegex = createUnicodeRegex("^(?:\\p{Default_Ignorable_Code_Point}|\\p{Control}|\\p{Mark}|\\p{Surrogate})+$", "^(?:\\p{Default_Ignorable_Code_Point}|\\p{Control}|\\p{Mark}|\\p{Surrogate})+$");
|
|
57
|
+
const leadingNonPrintingRegex = createUnicodeRegex("^[\\p{Default_Ignorable_Code_Point}\\p{Control}\\p{Format}\\p{Mark}\\p{Surrogate}]+", "^[\\p{Default_Ignorable_Code_Point}\\p{Control}\\p{Format}\\p{Mark}\\p{Surrogate}]+");
|
|
58
|
+
const rgiEmojiRegex = createUnicodeRegex("^\\p{RGI_Emoji}$", "^\\p{Extended_Pictographic}$");
|
|
59
|
+
const AnsiStripper = {
|
|
60
|
+
strip(text) {
|
|
61
|
+
if (!text.includes("\x1b")) {
|
|
62
|
+
return text;
|
|
63
|
+
}
|
|
64
|
+
let cleaned = text;
|
|
65
|
+
// Strip SGR codes (\x1b[...m) and cursor codes (\x1b[...G/K/H/J)
|
|
66
|
+
cleaned = cleaned.replace(/\x1b\[[0-9;]*[mGKHJ]/g, "");
|
|
67
|
+
// Strip OSC 8 hyperlinks: \x1b]8;;URL\x07 and \x1b]8;;\x07
|
|
68
|
+
cleaned = cleaned.replace(/\x1b\]8;;[^\x07]*\x07/g, "");
|
|
69
|
+
// Strip APC sequences: \x1b_...\x07 or \x1b_...\x1b\\ (cursor marker)
|
|
70
|
+
cleaned = cleaned.replace(/\x1b_[^\x07\x1b]*(?:\x07|\x1b\\)/g, "");
|
|
71
|
+
return cleaned;
|
|
72
|
+
},
|
|
73
|
+
};
|
|
49
74
|
// Cache for non-ASCII strings
|
|
50
75
|
const WIDTH_CACHE_SIZE = 512;
|
|
51
76
|
const widthCache = new Map();
|
|
@@ -54,13 +79,13 @@ const widthCache = new Map();
|
|
|
54
79
|
* Based on code from the string-width library, but includes a possible-emoji
|
|
55
80
|
* check to avoid running the RGI_Emoji regex unnecessarily.
|
|
56
81
|
*/
|
|
57
|
-
function
|
|
82
|
+
function measureClusterWidth(segment) {
|
|
58
83
|
// Zero-width clusters
|
|
59
84
|
if (zeroWidthRegex.test(segment)) {
|
|
60
85
|
return 0;
|
|
61
86
|
}
|
|
62
87
|
// Emoji check with pre-filter
|
|
63
|
-
if (
|
|
88
|
+
if (looksLikeEmojiCandidate(segment) && rgiEmojiRegex.test(segment)) {
|
|
64
89
|
return 2;
|
|
65
90
|
}
|
|
66
91
|
// Get base visible codepoint
|
|
@@ -110,18 +135,11 @@ export function visibleWidth(str) {
|
|
|
110
135
|
if (str.includes("\t")) {
|
|
111
136
|
clean = clean.replace(/\t/g, " ");
|
|
112
137
|
}
|
|
113
|
-
|
|
114
|
-
// Strip SGR codes (\x1b[...m) and cursor codes (\x1b[...G/K/H/J)
|
|
115
|
-
clean = clean.replace(/\x1b\[[0-9;]*[mGKHJ]/g, "");
|
|
116
|
-
// Strip OSC 8 hyperlinks: \x1b]8;;URL\x07 and \x1b]8;;\x07
|
|
117
|
-
clean = clean.replace(/\x1b\]8;;[^\x07]*\x07/g, "");
|
|
118
|
-
// Strip APC sequences: \x1b_...\x07 or \x1b_...\x1b\\ (used for cursor marker)
|
|
119
|
-
clean = clean.replace(/\x1b_[^\x07\x1b]*(?:\x07|\x1b\\)/g, "");
|
|
120
|
-
}
|
|
138
|
+
clean = AnsiStripper.strip(clean);
|
|
121
139
|
// Calculate width
|
|
122
140
|
let width = 0;
|
|
123
141
|
for (const { segment } of segmenter.segment(clean)) {
|
|
124
|
-
width +=
|
|
142
|
+
width += measureClusterWidth(segment);
|
|
125
143
|
}
|
|
126
144
|
// Cache result
|
|
127
145
|
if (widthCache.size >= WIDTH_CACHE_SIZE) {
|
|
@@ -180,20 +198,17 @@ export function extractAnsiCode(str, pos) {
|
|
|
180
198
|
/**
|
|
181
199
|
* Track active ANSI SGR codes to preserve styling across line breaks.
|
|
182
200
|
*/
|
|
183
|
-
class
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
this.fgColor = null; // Stores the full code like "31" or "38;5;240"
|
|
195
|
-
this.bgColor = null; // Stores the full code like "41" or "48;5;240"
|
|
196
|
-
}
|
|
201
|
+
class AnsiStateTracker {
|
|
202
|
+
// Track individual attributes separately so we can reset them specifically
|
|
203
|
+
_bold = false;
|
|
204
|
+
_dim = false;
|
|
205
|
+
italic = false;
|
|
206
|
+
underline = false;
|
|
207
|
+
blink = false;
|
|
208
|
+
inverse = false;
|
|
209
|
+
hidden = false;
|
|
210
|
+
strikethrough = false;
|
|
211
|
+
_colors = { fg: null, bg: null };
|
|
197
212
|
process(ansiCode) {
|
|
198
213
|
if (!ansiCode.endsWith("m")) {
|
|
199
214
|
return;
|
|
@@ -212,121 +227,127 @@ class AnsiCodeTracker {
|
|
|
212
227
|
const parts = params.split(";");
|
|
213
228
|
let i = 0;
|
|
214
229
|
while (i < parts.length) {
|
|
215
|
-
const code = Number.parseInt(parts[i], 10);
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
// 48;5;N (256 color bg) or 48;2;R;G;B (RGB bg)
|
|
220
|
-
if (parts[i + 1] === "5" && parts[i + 2] !== undefined) {
|
|
221
|
-
// 256 color: 38;5;N or 48;5;N
|
|
222
|
-
const colorCode = `${parts[i]};${parts[i + 1]};${parts[i + 2]}`;
|
|
223
|
-
if (code === 38) {
|
|
224
|
-
this.fgColor = colorCode;
|
|
225
|
-
}
|
|
226
|
-
else {
|
|
227
|
-
this.bgColor = colorCode;
|
|
228
|
-
}
|
|
229
|
-
i += 3;
|
|
230
|
-
continue;
|
|
231
|
-
}
|
|
232
|
-
else if (parts[i + 1] === "2" && parts[i + 4] !== undefined) {
|
|
233
|
-
// RGB color: 38;2;R;G;B or 48;2;R;G;B
|
|
234
|
-
const colorCode = `${parts[i]};${parts[i + 1]};${parts[i + 2]};${parts[i + 3]};${parts[i + 4]}`;
|
|
235
|
-
if (code === 38) {
|
|
236
|
-
this.fgColor = colorCode;
|
|
237
|
-
}
|
|
238
|
-
else {
|
|
239
|
-
this.bgColor = colorCode;
|
|
240
|
-
}
|
|
241
|
-
i += 5;
|
|
242
|
-
continue;
|
|
243
|
-
}
|
|
230
|
+
const code = Number.parseInt(parts[i] ?? "", 10);
|
|
231
|
+
if (Number.isNaN(code)) {
|
|
232
|
+
i++;
|
|
233
|
+
continue;
|
|
244
234
|
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
break;
|
|
250
|
-
case 1:
|
|
251
|
-
this.bold = true;
|
|
252
|
-
break;
|
|
253
|
-
case 2:
|
|
254
|
-
this.dim = true;
|
|
255
|
-
break;
|
|
256
|
-
case 3:
|
|
257
|
-
this.italic = true;
|
|
258
|
-
break;
|
|
259
|
-
case 4:
|
|
260
|
-
this.underline = true;
|
|
261
|
-
break;
|
|
262
|
-
case 5:
|
|
263
|
-
this.blink = true;
|
|
264
|
-
break;
|
|
265
|
-
case 7:
|
|
266
|
-
this.inverse = true;
|
|
267
|
-
break;
|
|
268
|
-
case 8:
|
|
269
|
-
this.hidden = true;
|
|
270
|
-
break;
|
|
271
|
-
case 9:
|
|
272
|
-
this.strikethrough = true;
|
|
273
|
-
break;
|
|
274
|
-
case 21:
|
|
275
|
-
this.bold = false;
|
|
276
|
-
break; // Some terminals
|
|
277
|
-
case 22:
|
|
278
|
-
this.bold = false;
|
|
279
|
-
this.dim = false;
|
|
280
|
-
break;
|
|
281
|
-
case 23:
|
|
282
|
-
this.italic = false;
|
|
283
|
-
break;
|
|
284
|
-
case 24:
|
|
285
|
-
this.underline = false;
|
|
286
|
-
break;
|
|
287
|
-
case 25:
|
|
288
|
-
this.blink = false;
|
|
289
|
-
break;
|
|
290
|
-
case 27:
|
|
291
|
-
this.inverse = false;
|
|
292
|
-
break;
|
|
293
|
-
case 28:
|
|
294
|
-
this.hidden = false;
|
|
295
|
-
break;
|
|
296
|
-
case 29:
|
|
297
|
-
this.strikethrough = false;
|
|
298
|
-
break;
|
|
299
|
-
case 39:
|
|
300
|
-
this.fgColor = null;
|
|
301
|
-
break; // Default fg
|
|
302
|
-
case 49:
|
|
303
|
-
this.bgColor = null;
|
|
304
|
-
break; // Default bg
|
|
305
|
-
default:
|
|
306
|
-
// Standard foreground colors 30-37, 90-97
|
|
307
|
-
if ((code >= 30 && code <= 37) || (code >= 90 && code <= 97)) {
|
|
308
|
-
this.fgColor = String(code);
|
|
309
|
-
}
|
|
310
|
-
// Standard background colors 40-47, 100-107
|
|
311
|
-
else if ((code >= 40 && code <= 47) || (code >= 100 && code <= 107)) {
|
|
312
|
-
this.bgColor = String(code);
|
|
313
|
-
}
|
|
314
|
-
break;
|
|
235
|
+
const consumed = this.tryConsumeColorCode(parts, i, code);
|
|
236
|
+
if (consumed > 0) {
|
|
237
|
+
i += consumed;
|
|
238
|
+
continue;
|
|
315
239
|
}
|
|
240
|
+
this.applyStandardCode(code);
|
|
316
241
|
i++;
|
|
317
242
|
}
|
|
318
243
|
}
|
|
244
|
+
tryConsumeColorCode(parts, index, code) {
|
|
245
|
+
if (code !== 38 && code !== 48) {
|
|
246
|
+
return 0;
|
|
247
|
+
}
|
|
248
|
+
if (parts[index + 1] === "5" && parts[index + 2] !== undefined) {
|
|
249
|
+
const colorCode = `${parts[index]};${parts[index + 1]};${parts[index + 2]}`;
|
|
250
|
+
if (code === 38) {
|
|
251
|
+
this._colors.fg = colorCode;
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
this._colors.bg = colorCode;
|
|
255
|
+
}
|
|
256
|
+
return 3;
|
|
257
|
+
}
|
|
258
|
+
if (parts[index + 1] === "2" && parts[index + 4] !== undefined) {
|
|
259
|
+
const colorCode = `${parts[index]};${parts[index + 1]};${parts[index + 2]};${parts[index + 3]};${parts[index + 4]}`;
|
|
260
|
+
if (code === 38) {
|
|
261
|
+
this._colors.fg = colorCode;
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
this._colors.bg = colorCode;
|
|
265
|
+
}
|
|
266
|
+
return 5;
|
|
267
|
+
}
|
|
268
|
+
return 0;
|
|
269
|
+
}
|
|
270
|
+
applyStandardCode(code) {
|
|
271
|
+
switch (code) {
|
|
272
|
+
case 0:
|
|
273
|
+
this.reset();
|
|
274
|
+
return;
|
|
275
|
+
case 1:
|
|
276
|
+
this._bold = true;
|
|
277
|
+
return;
|
|
278
|
+
case 2:
|
|
279
|
+
this._dim = true;
|
|
280
|
+
return;
|
|
281
|
+
case 3:
|
|
282
|
+
this.italic = true;
|
|
283
|
+
return;
|
|
284
|
+
case 4:
|
|
285
|
+
this.underline = true;
|
|
286
|
+
return;
|
|
287
|
+
case 5:
|
|
288
|
+
this.blink = true;
|
|
289
|
+
return;
|
|
290
|
+
case 7:
|
|
291
|
+
this.inverse = true;
|
|
292
|
+
return;
|
|
293
|
+
case 8:
|
|
294
|
+
this.hidden = true;
|
|
295
|
+
return;
|
|
296
|
+
case 9:
|
|
297
|
+
this.strikethrough = true;
|
|
298
|
+
return;
|
|
299
|
+
case 21:
|
|
300
|
+
this._bold = false;
|
|
301
|
+
return;
|
|
302
|
+
case 22:
|
|
303
|
+
this._bold = false;
|
|
304
|
+
this._dim = false;
|
|
305
|
+
return;
|
|
306
|
+
case 23:
|
|
307
|
+
this.italic = false;
|
|
308
|
+
return;
|
|
309
|
+
case 24:
|
|
310
|
+
this.underline = false;
|
|
311
|
+
return;
|
|
312
|
+
case 25:
|
|
313
|
+
this.blink = false;
|
|
314
|
+
return;
|
|
315
|
+
case 27:
|
|
316
|
+
this.inverse = false;
|
|
317
|
+
return;
|
|
318
|
+
case 28:
|
|
319
|
+
this.hidden = false;
|
|
320
|
+
return;
|
|
321
|
+
case 29:
|
|
322
|
+
this.strikethrough = false;
|
|
323
|
+
return;
|
|
324
|
+
case 39:
|
|
325
|
+
this._colors.fg = null;
|
|
326
|
+
return;
|
|
327
|
+
case 49:
|
|
328
|
+
this._colors.bg = null;
|
|
329
|
+
return;
|
|
330
|
+
default:
|
|
331
|
+
if ((code >= 30 && code <= 37) || (code >= 90 && code <= 97)) {
|
|
332
|
+
this._colors.fg = String(code);
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
if ((code >= 40 && code <= 47) || (code >= 100 && code <= 107)) {
|
|
336
|
+
this._colors.bg = String(code);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
319
340
|
reset() {
|
|
320
|
-
this.
|
|
321
|
-
this.
|
|
341
|
+
this._bold = false;
|
|
342
|
+
this._dim = false;
|
|
322
343
|
this.italic = false;
|
|
323
344
|
this.underline = false;
|
|
324
345
|
this.blink = false;
|
|
325
346
|
this.inverse = false;
|
|
326
347
|
this.hidden = false;
|
|
327
348
|
this.strikethrough = false;
|
|
328
|
-
this.
|
|
329
|
-
this.
|
|
349
|
+
this._colors.fg = null;
|
|
350
|
+
this._colors.bg = null;
|
|
330
351
|
}
|
|
331
352
|
/** Clear all state for reuse. */
|
|
332
353
|
clear() {
|
|
@@ -334,9 +355,9 @@ class AnsiCodeTracker {
|
|
|
334
355
|
}
|
|
335
356
|
getActiveCodes() {
|
|
336
357
|
const codes = [];
|
|
337
|
-
if (this.
|
|
358
|
+
if (this._bold)
|
|
338
359
|
codes.push("1");
|
|
339
|
-
if (this.
|
|
360
|
+
if (this._dim)
|
|
340
361
|
codes.push("2");
|
|
341
362
|
if (this.italic)
|
|
342
363
|
codes.push("3");
|
|
@@ -350,25 +371,25 @@ class AnsiCodeTracker {
|
|
|
350
371
|
codes.push("8");
|
|
351
372
|
if (this.strikethrough)
|
|
352
373
|
codes.push("9");
|
|
353
|
-
if (this.
|
|
354
|
-
codes.push(this.
|
|
355
|
-
if (this.
|
|
356
|
-
codes.push(this.
|
|
374
|
+
if (this._colors.fg)
|
|
375
|
+
codes.push(this._colors.fg);
|
|
376
|
+
if (this._colors.bg)
|
|
377
|
+
codes.push(this._colors.bg);
|
|
357
378
|
if (codes.length === 0)
|
|
358
379
|
return "";
|
|
359
380
|
return `\x1b[${codes.join(";")}m`;
|
|
360
381
|
}
|
|
361
382
|
hasActiveCodes() {
|
|
362
|
-
return (this.
|
|
363
|
-
this.
|
|
383
|
+
return (this._bold ||
|
|
384
|
+
this._dim ||
|
|
364
385
|
this.italic ||
|
|
365
386
|
this.underline ||
|
|
366
387
|
this.blink ||
|
|
367
388
|
this.inverse ||
|
|
368
389
|
this.hidden ||
|
|
369
390
|
this.strikethrough ||
|
|
370
|
-
this.
|
|
371
|
-
this.
|
|
391
|
+
this._colors.fg !== null ||
|
|
392
|
+
this._colors.bg !== null);
|
|
372
393
|
}
|
|
373
394
|
/**
|
|
374
395
|
* Get reset codes for attributes that need to be turned off at line end,
|
|
@@ -384,7 +405,7 @@ class AnsiCodeTracker {
|
|
|
384
405
|
return "";
|
|
385
406
|
}
|
|
386
407
|
}
|
|
387
|
-
function
|
|
408
|
+
function mergeTextIntoTracker(text, tracker) {
|
|
388
409
|
let i = 0;
|
|
389
410
|
while (i < text.length) {
|
|
390
411
|
const ansiResult = extractAnsiCode(text, i);
|
|
@@ -400,7 +421,7 @@ function updateTrackerFromText(text, tracker) {
|
|
|
400
421
|
/**
|
|
401
422
|
* Split text into words while keeping ANSI codes attached.
|
|
402
423
|
*/
|
|
403
|
-
function
|
|
424
|
+
function tokenizeTextWithAnsi(text) {
|
|
404
425
|
const tokens = [];
|
|
405
426
|
let current = "";
|
|
406
427
|
let pendingAnsi = ""; // ANSI codes waiting to be attached to next visible content
|
|
@@ -451,9 +472,7 @@ function splitIntoTokensWithAnsi(text) {
|
|
|
451
472
|
* @returns Array of wrapped lines (NOT padded to width)
|
|
452
473
|
*/
|
|
453
474
|
export class AnsiCodeManager {
|
|
454
|
-
|
|
455
|
-
this.tracker = new AnsiCodeTracker();
|
|
456
|
-
}
|
|
475
|
+
tracker = new AnsiStateTracker();
|
|
457
476
|
process(ansiCode) {
|
|
458
477
|
this.tracker.process(ansiCode);
|
|
459
478
|
}
|
|
@@ -470,6 +489,57 @@ export class TextWrapper {
|
|
|
470
489
|
}
|
|
471
490
|
}
|
|
472
491
|
export const textWrapper = new TextWrapper();
|
|
492
|
+
const TokenWrapEngine = {
|
|
493
|
+
wrap(tokens, width, tracker) {
|
|
494
|
+
const wrapped = [];
|
|
495
|
+
let currentLine = "";
|
|
496
|
+
let currentVisibleLength = 0;
|
|
497
|
+
for (const token of tokens) {
|
|
498
|
+
const tokenVisibleLength = visibleWidth(token);
|
|
499
|
+
const isWhitespace = token.trim() === "";
|
|
500
|
+
// Token itself is too long - break it character by character
|
|
501
|
+
if (tokenVisibleLength > width && !isWhitespace) {
|
|
502
|
+
if (currentLine) {
|
|
503
|
+
const lineEndReset = tracker.getLineEndReset();
|
|
504
|
+
if (lineEndReset) {
|
|
505
|
+
currentLine += lineEndReset;
|
|
506
|
+
}
|
|
507
|
+
wrapped.push(currentLine);
|
|
508
|
+
currentLine = "";
|
|
509
|
+
currentVisibleLength = 0;
|
|
510
|
+
}
|
|
511
|
+
const broken = splitLongToken(token, width, tracker);
|
|
512
|
+
wrapped.push(...broken.slice(0, -1));
|
|
513
|
+
currentLine = broken[broken.length - 1];
|
|
514
|
+
currentVisibleLength = visibleWidth(currentLine);
|
|
515
|
+
continue;
|
|
516
|
+
}
|
|
517
|
+
const totalNeeded = currentVisibleLength + tokenVisibleLength;
|
|
518
|
+
if (totalNeeded > width && currentVisibleLength > 0) {
|
|
519
|
+
let lineToWrap = currentLine.trimEnd();
|
|
520
|
+
const lineEndReset = tracker.getLineEndReset();
|
|
521
|
+
if (lineEndReset) {
|
|
522
|
+
lineToWrap += lineEndReset;
|
|
523
|
+
}
|
|
524
|
+
wrapped.push(lineToWrap);
|
|
525
|
+
if (isWhitespace) {
|
|
526
|
+
currentLine = tracker.getActiveCodes();
|
|
527
|
+
currentVisibleLength = 0;
|
|
528
|
+
}
|
|
529
|
+
else {
|
|
530
|
+
currentLine = tracker.getActiveCodes() + token;
|
|
531
|
+
currentVisibleLength = tokenVisibleLength;
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
else {
|
|
535
|
+
currentLine += token;
|
|
536
|
+
currentVisibleLength += tokenVisibleLength;
|
|
537
|
+
}
|
|
538
|
+
mergeTextIntoTracker(token, tracker);
|
|
539
|
+
}
|
|
540
|
+
return { wrapped, currentLine, currentVisibleLength };
|
|
541
|
+
},
|
|
542
|
+
};
|
|
473
543
|
export function wrapTextWithAnsi(text, width) {
|
|
474
544
|
if (!text) {
|
|
475
545
|
return [""];
|
|
@@ -478,17 +548,17 @@ export function wrapTextWithAnsi(text, width) {
|
|
|
478
548
|
// Track ANSI state across lines so styles carry over after literal newlines
|
|
479
549
|
const inputLines = text.split("\n");
|
|
480
550
|
const result = [];
|
|
481
|
-
const tracker = new
|
|
551
|
+
const tracker = new AnsiStateTracker();
|
|
482
552
|
for (const inputLine of inputLines) {
|
|
483
553
|
// Prepend active ANSI codes from previous lines (except for first line)
|
|
484
554
|
const prefix = result.length > 0 ? tracker.getActiveCodes() : "";
|
|
485
|
-
result.push(...
|
|
555
|
+
result.push(...wrapLinePreservingAnsi(prefix + inputLine, width));
|
|
486
556
|
// Update tracker with codes from this line for next iteration
|
|
487
|
-
|
|
557
|
+
mergeTextIntoTracker(inputLine, tracker);
|
|
488
558
|
}
|
|
489
559
|
return result.length > 0 ? result : [""];
|
|
490
560
|
}
|
|
491
|
-
function
|
|
561
|
+
function wrapLinePreservingAnsi(line, width) {
|
|
492
562
|
if (!line) {
|
|
493
563
|
return [""];
|
|
494
564
|
}
|
|
@@ -496,66 +566,15 @@ function wrapSingleLine(line, width) {
|
|
|
496
566
|
if (visibleLength <= width) {
|
|
497
567
|
return [line];
|
|
498
568
|
}
|
|
499
|
-
const
|
|
500
|
-
const
|
|
501
|
-
const
|
|
502
|
-
let currentLine = "";
|
|
503
|
-
let currentVisibleLength = 0;
|
|
504
|
-
for (const token of tokens) {
|
|
505
|
-
const tokenVisibleLength = visibleWidth(token);
|
|
506
|
-
const isWhitespace = token.trim() === "";
|
|
507
|
-
// Token itself is too long - break it character by character
|
|
508
|
-
if (tokenVisibleLength > width && !isWhitespace) {
|
|
509
|
-
if (currentLine) {
|
|
510
|
-
// Add specific reset for underline only (preserves background)
|
|
511
|
-
const lineEndReset = tracker.getLineEndReset();
|
|
512
|
-
if (lineEndReset) {
|
|
513
|
-
currentLine += lineEndReset;
|
|
514
|
-
}
|
|
515
|
-
wrapped.push(currentLine);
|
|
516
|
-
currentLine = "";
|
|
517
|
-
currentVisibleLength = 0;
|
|
518
|
-
}
|
|
519
|
-
// Break long token - breakLongWord handles its own resets
|
|
520
|
-
const broken = breakLongWord(token, width, tracker);
|
|
521
|
-
wrapped.push(...broken.slice(0, -1));
|
|
522
|
-
currentLine = broken[broken.length - 1];
|
|
523
|
-
currentVisibleLength = visibleWidth(currentLine);
|
|
524
|
-
continue;
|
|
525
|
-
}
|
|
526
|
-
// Check if adding this token would exceed width
|
|
527
|
-
const totalNeeded = currentVisibleLength + tokenVisibleLength;
|
|
528
|
-
if (totalNeeded > width && currentVisibleLength > 0) {
|
|
529
|
-
// Trim trailing whitespace, then add underline reset (not full reset, to preserve background)
|
|
530
|
-
let lineToWrap = currentLine.trimEnd();
|
|
531
|
-
const lineEndReset = tracker.getLineEndReset();
|
|
532
|
-
if (lineEndReset) {
|
|
533
|
-
lineToWrap += lineEndReset;
|
|
534
|
-
}
|
|
535
|
-
wrapped.push(lineToWrap);
|
|
536
|
-
if (isWhitespace) {
|
|
537
|
-
// Don't start new line with whitespace
|
|
538
|
-
currentLine = tracker.getActiveCodes();
|
|
539
|
-
currentVisibleLength = 0;
|
|
540
|
-
}
|
|
541
|
-
else {
|
|
542
|
-
currentLine = tracker.getActiveCodes() + token;
|
|
543
|
-
currentVisibleLength = tokenVisibleLength;
|
|
544
|
-
}
|
|
545
|
-
}
|
|
546
|
-
else {
|
|
547
|
-
// Add to current line
|
|
548
|
-
currentLine += token;
|
|
549
|
-
currentVisibleLength += tokenVisibleLength;
|
|
550
|
-
}
|
|
551
|
-
updateTrackerFromText(token, tracker);
|
|
552
|
-
}
|
|
569
|
+
const tracker = new AnsiStateTracker();
|
|
570
|
+
const tokens = tokenizeTextWithAnsi(line);
|
|
571
|
+
const { wrapped, currentLine } = TokenWrapEngine.wrap(tokens, width, tracker);
|
|
553
572
|
if (currentLine) {
|
|
554
573
|
// No reset at end of final line - let caller handle it
|
|
555
574
|
wrapped.push(currentLine);
|
|
556
575
|
}
|
|
557
576
|
// Trailing whitespace can cause lines to exceed the requested width
|
|
558
|
-
return wrapped.length > 0 ? wrapped.map((
|
|
577
|
+
return wrapped.length > 0 ? wrapped.map((segmentLine) => segmentLine.trimEnd()) : [""];
|
|
559
578
|
}
|
|
560
579
|
const PUNCTUATION_REGEX = /[(){}[\]<>.,;:'"!?+\-=*/\\|&%^$#@~`]/;
|
|
561
580
|
/**
|
|
@@ -570,7 +589,7 @@ export function isWhitespaceChar(char) {
|
|
|
570
589
|
export function isPunctuationChar(char) {
|
|
571
590
|
return PUNCTUATION_REGEX.test(char);
|
|
572
591
|
}
|
|
573
|
-
function
|
|
592
|
+
function splitLongToken(word, width, tracker) {
|
|
574
593
|
const lines = [];
|
|
575
594
|
let currentLine = tracker.getActiveCodes();
|
|
576
595
|
let currentWidth = 0;
|
|
@@ -612,8 +631,8 @@ function breakLongWord(word, width, tracker) {
|
|
|
612
631
|
// Skip empty graphemes to avoid issues with string-width calculation
|
|
613
632
|
if (!grapheme)
|
|
614
633
|
continue;
|
|
615
|
-
const
|
|
616
|
-
if (currentWidth +
|
|
634
|
+
const clusterWidth = visibleWidth(grapheme);
|
|
635
|
+
if (currentWidth + clusterWidth > width) {
|
|
617
636
|
// Add specific reset for underline only (preserves background)
|
|
618
637
|
const lineEndReset = tracker.getLineEndReset();
|
|
619
638
|
if (lineEndReset) {
|
|
@@ -624,7 +643,7 @@ function breakLongWord(word, width, tracker) {
|
|
|
624
643
|
currentWidth = 0;
|
|
625
644
|
}
|
|
626
645
|
currentLine += grapheme;
|
|
627
|
-
currentWidth +=
|
|
646
|
+
currentWidth += clusterWidth;
|
|
628
647
|
}
|
|
629
648
|
if (currentLine) {
|
|
630
649
|
// No reset at end of final segment - caller handles continuation
|
|
@@ -708,12 +727,12 @@ export function truncateToWidth(text, maxWidth, ellipsis = "...", pad = false) {
|
|
|
708
727
|
// Skip empty graphemes to avoid issues with string-width calculation
|
|
709
728
|
if (!grapheme)
|
|
710
729
|
continue;
|
|
711
|
-
const
|
|
712
|
-
if (currentWidth +
|
|
730
|
+
const clusterWidth = visibleWidth(grapheme);
|
|
731
|
+
if (currentWidth + clusterWidth > targetWidth) {
|
|
713
732
|
break;
|
|
714
733
|
}
|
|
715
734
|
result += grapheme;
|
|
716
|
-
currentWidth +=
|
|
735
|
+
currentWidth += clusterWidth;
|
|
717
736
|
}
|
|
718
737
|
// Add reset code before ellipsis to prevent styling leaking into it
|
|
719
738
|
const truncated = `${result}\x1b[0m${ellipsis}`;
|
|
@@ -750,7 +769,7 @@ export function sliceWithWidth(line, startCol, length, strict = false) {
|
|
|
750
769
|
while (textEnd < line.length && !extractAnsiCode(line, textEnd))
|
|
751
770
|
textEnd++;
|
|
752
771
|
for (const { segment } of segmenter.segment(line.slice(i, textEnd))) {
|
|
753
|
-
const w =
|
|
772
|
+
const w = measureClusterWidth(segment);
|
|
754
773
|
const inRange = currentCol >= startCol && currentCol < endCol;
|
|
755
774
|
const fits = !strict || currentCol + w <= endCol;
|
|
756
775
|
if (inRange && fits) {
|
|
@@ -772,7 +791,7 @@ export function sliceWithWidth(line, startCol, length, strict = false) {
|
|
|
772
791
|
return { text: result, width: resultWidth };
|
|
773
792
|
}
|
|
774
793
|
// Pooled tracker instance for extractSegments (avoids allocation per call)
|
|
775
|
-
const pooledStyleTracker = new
|
|
794
|
+
const pooledStyleTracker = new AnsiStateTracker();
|
|
776
795
|
/**
|
|
777
796
|
* Extract "before" and "after" segments from a line in a single pass.
|
|
778
797
|
* Used for overlay compositing where we need content before and after the overlay region.
|
|
@@ -806,7 +825,7 @@ export function extractSegments(line, beforeEnd, afterStart, afterLen, strictAft
|
|
|
806
825
|
while (textEnd < line.length && !extractAnsiCode(line, textEnd))
|
|
807
826
|
textEnd++;
|
|
808
827
|
for (const { segment } of segmenter.segment(line.slice(i, textEnd))) {
|
|
809
|
-
const w =
|
|
828
|
+
const w = measureClusterWidth(segment);
|
|
810
829
|
if (currentCol < beforeEnd) {
|
|
811
830
|
if (pendingAnsiBefore) {
|
|
812
831
|
before += pendingAnsiBefore;
|