Filemedium importancesource

tag.tsx

commands/tag/tag.tsx

215
Lines
20999
Bytes
1
Exports
14
Imports
10
Keywords

What this is

This page documents one file from the repository and includes its full source so you can read it without leaving the docs site.

Beginner explanation

This file lives in the command layer. It likely turns a user action into concrete program behavior.

How it is used

Start from the exports list and related files. Those are the easiest clues for where this file fits into the system.

Expert explanation

Architecturally, this file intersects with commands. It contains 215 lines, 14 detected imports, and 1 detected exports.

Important relationships

Detected exports

  • call

Keywords

ondonenormalizedtagelsereactoncanceltagnameargsdisplaysystemchalk

Detected imports

  • react/compiler-runtime
  • chalk
  • crypto
  • react
  • ../../bootstrap/state.js
  • ../../commands.js
  • ../../components/CustomSelect/select.js
  • ../../components/design-system/Dialog.js
  • ../../constants/xml.js
  • ../../ink.js
  • ../../services/analytics/index.js
  • ../../types/command.js
  • ../../utils/sanitization.js
  • ../../utils/sessionStorage.js

Source notes

This page embeds the full file contents. Small or leaf files are still indexed honestly instead of being over-explained.

Open parent directory

Full source

import { c as _c } from "react/compiler-runtime";
import chalk from 'chalk';
import type { UUID } from 'crypto';
import * as React from 'react';
import { getSessionId } from '../../bootstrap/state.js';
import type { CommandResultDisplay } from '../../commands.js';
import { Select } from '../../components/CustomSelect/select.js';
import { Dialog } from '../../components/design-system/Dialog.js';
import { COMMON_HELP_ARGS, COMMON_INFO_ARGS } from '../../constants/xml.js';
import { Box, Text } from '../../ink.js';
import { logEvent } from '../../services/analytics/index.js';
import type { LocalJSXCommandOnDone } from '../../types/command.js';
import { recursivelySanitizeUnicode } from '../../utils/sanitization.js';
import { getCurrentSessionTag, getTranscriptPath, saveTag } from '../../utils/sessionStorage.js';
function ConfirmRemoveTag(t0) {
  const $ = _c(11);
  const {
    tagName,
    onConfirm,
    onCancel
  } = t0;
  const t1 = `Current tag: #${tagName}`;
  let t2;
  if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
    t2 = <Text>This will remove the tag from the current session.</Text>;
    $[0] = t2;
  } else {
    t2 = $[0];
  }
  let t3;
  if ($[1] !== onCancel || $[2] !== onConfirm) {
    t3 = value => value === "yes" ? onConfirm() : onCancel();
    $[1] = onCancel;
    $[2] = onConfirm;
    $[3] = t3;
  } else {
    t3 = $[3];
  }
  let t4;
  if ($[4] === Symbol.for("react.memo_cache_sentinel")) {
    t4 = [{
      label: "Yes, remove tag",
      value: "yes"
    }, {
      label: "No, keep tag",
      value: "no"
    }];
    $[4] = t4;
  } else {
    t4 = $[4];
  }
  let t5;
  if ($[5] !== t3) {
    t5 = <Box flexDirection="column" gap={1}>{t2}<Select onChange={t3} options={t4} /></Box>;
    $[5] = t3;
    $[6] = t5;
  } else {
    t5 = $[6];
  }
  let t6;
  if ($[7] !== onCancel || $[8] !== t1 || $[9] !== t5) {
    t6 = <Dialog title="Remove tag?" subtitle={t1} onCancel={onCancel} color="warning">{t5}</Dialog>;
    $[7] = onCancel;
    $[8] = t1;
    $[9] = t5;
    $[10] = t6;
  } else {
    t6 = $[10];
  }
  return t6;
}
function ToggleTagAndClose(t0) {
  const $ = _c(17);
  const {
    tagName,
    onDone
  } = t0;
  const [showConfirm, setShowConfirm] = React.useState(false);
  const [sessionId, setSessionId] = React.useState(null);
  let t1;
  if ($[0] !== tagName) {
    t1 = recursivelySanitizeUnicode(tagName).trim();
    $[0] = tagName;
    $[1] = t1;
  } else {
    t1 = $[1];
  }
  const normalizedTag = t1;
  let t2;
  let t3;
  if ($[2] !== normalizedTag || $[3] !== onDone) {
    t2 = () => {
      const id = getSessionId() as UUID;
      if (!id) {
        onDone("No active session to tag", {
          display: "system"
        });
        return;
      }
      if (!normalizedTag) {
        onDone("Tag name cannot be empty", {
          display: "system"
        });
        return;
      }
      setSessionId(id);
      const currentTag = getCurrentSessionTag(id);
      if (currentTag === normalizedTag) {
        logEvent("tengu_tag_command_remove_prompt", {});
        setShowConfirm(true);
      } else {
        const isReplacing = !!currentTag;
        logEvent("tengu_tag_command_add", {
          is_replacing: isReplacing
        });
        (async () => {
          const fullPath = getTranscriptPath();
          await saveTag(id, normalizedTag, fullPath);
          onDone(`Tagged session with ${chalk.cyan(`#${normalizedTag}`)}`, {
            display: "system"
          });
        })();
      }
    };
    t3 = [normalizedTag, onDone];
    $[2] = normalizedTag;
    $[3] = onDone;
    $[4] = t2;
    $[5] = t3;
  } else {
    t2 = $[4];
    t3 = $[5];
  }
  React.useEffect(t2, t3);
  if (showConfirm && sessionId) {
    let t4;
    if ($[6] !== normalizedTag || $[7] !== onDone || $[8] !== sessionId) {
      t4 = async () => {
        logEvent("tengu_tag_command_remove_confirmed", {});
        const fullPath_0 = getTranscriptPath();
        await saveTag(sessionId, "", fullPath_0);
        onDone(`Removed tag ${chalk.cyan(`#${normalizedTag}`)}`, {
          display: "system"
        });
      };
      $[6] = normalizedTag;
      $[7] = onDone;
      $[8] = sessionId;
      $[9] = t4;
    } else {
      t4 = $[9];
    }
    let t5;
    if ($[10] !== normalizedTag || $[11] !== onDone) {
      t5 = () => {
        logEvent("tengu_tag_command_remove_cancelled", {});
        onDone(`Kept tag ${chalk.cyan(`#${normalizedTag}`)}`, {
          display: "system"
        });
      };
      $[10] = normalizedTag;
      $[11] = onDone;
      $[12] = t5;
    } else {
      t5 = $[12];
    }
    let t6;
    if ($[13] !== normalizedTag || $[14] !== t4 || $[15] !== t5) {
      t6 = <ConfirmRemoveTag tagName={normalizedTag} onConfirm={t4} onCancel={t5} />;
      $[13] = normalizedTag;
      $[14] = t4;
      $[15] = t5;
      $[16] = t6;
    } else {
      t6 = $[16];
    }
    return t6;
  }
  return null;
}
function ShowHelp(t0) {
  const $ = _c(3);
  const {
    onDone
  } = t0;
  let t1;
  let t2;
  if ($[0] !== onDone) {
    t1 = () => {
      onDone("Usage: /tag <tag-name>\n\nToggle a searchable tag on the current session.\nRun the same command again to remove the tag.\nTags are displayed after the branch name in /resume and can be searched with /.\n\nExamples:\n  /tag bugfix        # Add tag\n  /tag bugfix        # Remove tag (toggle)\n  /tag feature-auth\n  /tag wip", {
        display: "system"
      });
    };
    t2 = [onDone];
    $[0] = onDone;
    $[1] = t1;
    $[2] = t2;
  } else {
    t1 = $[1];
    t2 = $[2];
  }
  React.useEffect(t1, t2);
  return null;
}
export async function call(onDone: LocalJSXCommandOnDone, _context: unknown, args?: string): Promise<React.ReactNode> {
  args = args?.trim() || '';
  if (COMMON_INFO_ARGS.includes(args) || COMMON_HELP_ARGS.includes(args)) {
    return <ShowHelp onDone={onDone} />;
  }
  if (!args) {
    return <ShowHelp onDone={onDone} />;
  }
  return <ToggleTagAndClose tagName={args} onDone={onDone} />;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjaGFsayIsIlVVSUQiLCJSZWFjdCIsImdldFNlc3Npb25JZCIsIkNvbW1hbmRSZXN1bHREaXNwbGF5IiwiU2VsZWN0IiwiRGlhbG9nIiwiQ09NTU9OX0hFTFBfQVJHUyIsIkNPTU1PTl9JTkZPX0FSR1MiLCJCb3giLCJUZXh0IiwibG9nRXZlbnQiLCJMb2NhbEpTWENvbW1hbmRPbkRvbmUiLCJyZWN1cnNpdmVseVNhbml0aXplVW5pY29kZSIsImdldEN1cnJlbnRTZXNzaW9uVGFnIiwiZ2V0VHJhbnNjcmlwdFBhdGgiLCJzYXZlVGFnIiwiQ29uZmlybVJlbW92ZVRhZyIsInQwIiwiJCIsIl9jIiwidGFnTmFtZSIsIm9uQ29uZmlybSIsIm9uQ2FuY2VsIiwidDEiLCJ0MiIsIlN5bWJvbCIsImZvciIsInQzIiwidmFsdWUiLCJ0NCIsImxhYmVsIiwidDUiLCJ0NiIsIlRvZ2dsZVRhZ0FuZENsb3NlIiwib25Eb25lIiwic2hvd0NvbmZpcm0iLCJzZXRTaG93Q29uZmlybSIsInVzZVN0YXRlIiwic2Vzc2lvbklkIiwic2V0U2Vzc2lvbklkIiwidHJpbSIsIm5vcm1hbGl6ZWRUYWciLCJpZCIsImRpc3BsYXkiLCJjdXJyZW50VGFnIiwiaXNSZXBsYWNpbmciLCJpc19yZXBsYWNpbmciLCJmdWxsUGF0aCIsImN5YW4iLCJ1c2VFZmZlY3QiLCJmdWxsUGF0aF8wIiwiU2hvd0hlbHAiLCJjYWxsIiwiX2NvbnRleHQiLCJhcmdzIiwiUHJvbWlzZSIsIlJlYWN0Tm9kZSIsImluY2x1ZGVzIl0sInNvdXJjZXMiOlsidGFnLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5pbXBvcnQgdHlwZSB7IFVVSUQgfSBmcm9tICdjcnlwdG8nXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGdldFNlc3Npb25JZCB9IGZyb20gJy4uLy4uL2Jvb3RzdHJhcC9zdGF0ZS5qcydcbmltcG9ydCB0eXBlIHsgQ29tbWFuZFJlc3VsdERpc3BsYXkgfSBmcm9tICcuLi8uLi9jb21tYW5kcy5qcydcbmltcG9ydCB7IFNlbGVjdCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvQ3VzdG9tU2VsZWN0L3NlbGVjdC5qcydcbmltcG9ydCB7IERpYWxvZyB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvZGVzaWduLXN5c3RlbS9EaWFsb2cuanMnXG5pbXBvcnQgeyBDT01NT05fSEVMUF9BUkdTLCBDT01NT05fSU5GT19BUkdTIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL3htbC5qcydcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7IGxvZ0V2ZW50IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYW5hbHl0aWNzL2luZGV4LmpzJ1xuaW1wb3J0IHR5cGUgeyBMb2NhbEpTWENvbW1hbmRPbkRvbmUgfSBmcm9tICcuLi8uLi90eXBlcy9jb21tYW5kLmpzJ1xuaW1wb3J0IHsgcmVjdXJzaXZlbHlTYW5pdGl6ZVVuaWNvZGUgfSBmcm9tICcuLi8uLi91dGlscy9zYW5pdGl6YXRpb24uanMnXG5pbXBvcnQge1xuICBnZXRDdXJyZW50U2Vzc2lvblRhZyxcbiAgZ2V0VHJhbnNjcmlwdFBhdGgsXG4gIHNhdmVUYWcsXG59IGZyb20gJy4uLy4uL3V0aWxzL3Nlc3Npb25TdG9yYWdlLmpzJ1xuXG5mdW5jdGlvbiBDb25maXJtUmVtb3ZlVGFnKHtcbiAgdGFnTmFtZSxcbiAgb25Db25maXJtLFxuICBvbkNhbmNlbCxcbn06IHtcbiAgdGFnTmFtZTogc3RyaW5nXG4gIG9uQ29uZmlybTogKCkgPT4gdm9pZFxuICBvbkNhbmNlbDogKCkgPT4gdm9pZFxufSk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIHJldHVybiAoXG4gICAgPERpYWxvZ1xuICAgICAgdGl0bGU9XCJSZW1vdmUgdGFnP1wiXG4gICAgICBzdWJ0aXRsZT17YEN1cnJlbnQgdGFnOiAjJHt0YWdOYW1lfWB9XG4gICAgICBvbkNhbmNlbD17b25DYW5jZWx9XG4gICAgICBjb2xvcj1cIndhcm5pbmdcIlxuICAgID5cbiAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIGdhcD17MX0+XG4gICAgICAgIDxUZXh0PlRoaXMgd2lsbCByZW1vdmUgdGhlIHRhZyBmcm9tIHRoZSBjdXJyZW50IHNlc3Npb24uPC9UZXh0PlxuICAgICAgICA8U2VsZWN0PCd5ZXMnIHwgJ25vJz5cbiAgICAgICAgICBvbkNoYW5nZT17dmFsdWUgPT4gKHZhbHVlID09PSAneWVzJyA/IG9uQ29uZmlybSgpIDogb25DYW5jZWwoKSl9XG4gICAgICAgICAgb3B0aW9ucz17W1xuICAgICAgICAgICAgeyBsYWJlbDogJ1llcywgcmVtb3ZlIHRhZycsIHZhbHVlOiAneWVzJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ05vLCBrZWVwIHRhZycsIHZhbHVlOiAnbm8nIH0sXG4gICAgICAgICAgXX1cbiAgICAgICAgLz5cbiAgICAgIDwvQm94PlxuICAgIDwvRGlhbG9nPlxuICApXG59XG5cbmZ1bmN0aW9uIFRvZ2dsZVRhZ0FuZENsb3NlKHtcbiAgdGFnTmFtZSxcbiAgb25Eb25lLFxufToge1xuICB0YWdOYW1lOiBzdHJpbmdcbiAgb25Eb25lOiAoXG4gICAgcmVzdWx0Pzogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IGRpc3BsYXk/OiBDb21tYW5kUmVzdWx0RGlzcGxheSB9LFxuICApID0+IHZvaWRcbn0pOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCBbc2hvd0NvbmZpcm0sIHNldFNob3dDb25maXJtXSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbc2Vzc2lvbklkLCBzZXRTZXNzaW9uSWRdID0gUmVhY3QudXNlU3RhdGU8VVVJRCB8IG51bGw+KG51bGwpXG4gIC8vIFNhbml0aXplIHVuaWNvZGUgdG8gcHJldmVudCBoaWRkZW4gY2hhcmFjdGVyIGF0dGFja3MgYW5kIG5vcm1hbGl6ZVxuICBjb25zdCBub3JtYWxpemVkVGFnID0gcmVjdXJzaXZlbHlTYW5pdGl6ZVVuaWNvZGUodGFnTmFtZSkudHJpbSgpXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBpZCA9IGdldFNlc3Npb25JZCgpIGFzIFVVSURcblxuICAgIGlmICghaWQpIHtcbiAgICAgIG9uRG9uZSgnTm8gYWN0aXZlIHNlc3Npb24gdG8gdGFnJywgeyBkaXNwbGF5OiAnc3lzdGVtJyB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFub3JtYWxpemVkVGFnKSB7XG4gICAgICBvbkRvbmUoJ1RhZyBuYW1lIGNhbm5vdCBiZSBlbXB0eScsIHsgZGlzcGxheTogJ3N5c3RlbScgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHNldFNlc3Npb25JZChpZClcbiAgICBjb25zdCBjdXJyZW50VGFnID0gZ2V0Q3VycmVudFNlc3Npb25UYWcoaWQpXG5cbiAgICAvLyBJZiBzYW1lIHRhZyBleGlzdHMsIHNob3cgY29uZmlybWF0aW9uIGRpYWxvZ1xuICAgIGlmIChjdXJyZW50VGFnID09PSBub3JtYWxpemVkVGFnKSB7XG4gICAgICBsb2dFdmVudCgndGVuZ3VfdGFnX2NvbW1hbmRfcmVtb3ZlX3Byb21wdCcsIHt9KVxuICAgICAgc2V0U2hvd0NvbmZpcm0odHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQWRkIHRoZSBuZXcgdGFnIGRpcmVjdGx5XG4gICAgICBjb25zdCBpc1JlcGxhY2luZyA9ICEhY3VycmVudFRhZ1xuICAgICAgbG9nRXZlbnQoJ3Rlbmd1X3RhZ19jb21tYW5kX2FkZCcsIHsgaXNfcmVwbGFjaW5nOiBpc1JlcGxhY2luZyB9KVxuICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBmdWxsUGF0aCA9IGdldFRyYW5zY3JpcHRQYXRoKClcbiAgICAgICAgYXdhaXQgc2F2ZVRhZyhpZCwgbm9ybWFsaXplZFRhZywgZnVsbFBhdGgpXG4gICAgICAgIG9uRG9uZShgVGFnZ2VkIHNlc3Npb24gd2l0aCAke2NoYWxrLmN5YW4oYCMke25vcm1hbGl6ZWRUYWd9YCl9YCwge1xuICAgICAgICAgIGRpc3BsYXk6ICdzeXN0ZW0nLFxuICAgICAgICB9KVxuICAgICAgfSkoKVxuICAgIH1cbiAgfSwgW25vcm1hbGl6ZWRUYWcsIG9uRG9uZV0pXG5cbiAgaWYgKHNob3dDb25maXJtICYmIHNlc3Npb25JZCkge1xuICAgIHJldHVybiAoXG4gICAgICA8Q29uZmlybVJlbW92ZVRhZ1xuICAgICAgICB0YWdOYW1lPXtub3JtYWxpemVkVGFnfVxuICAgICAgICBvbkNvbmZpcm09e2FzeW5jICgpID0+IHtcbiAgICAgICAgICBsb2dFdmVudCgndGVuZ3VfdGFnX2NvbW1hbmRfcmVtb3ZlX2NvbmZpcm1lZCcsIHt9KVxuICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gZ2V0VHJhbnNjcmlwdFBhdGgoKVxuICAgICAgICAgIGF3YWl0IHNhdmVUYWcoc2Vzc2lvbklkLCAnJywgZnVsbFBhdGgpXG4gICAgICAgICAgb25Eb25lKGBSZW1vdmVkIHRhZyAke2NoYWxrLmN5YW4oYCMke25vcm1hbGl6ZWRUYWd9YCl9YCwge1xuICAgICAgICAgICAgZGlzcGxheTogJ3N5c3RlbScsXG4gICAgICAgICAgfSlcbiAgICAgICAgfX1cbiAgICAgICAgb25DYW5jZWw9eygpID0+IHtcbiAgICAgICAgICBsb2dFdmVudCgndGVuZ3VfdGFnX2NvbW1hbmRfcmVtb3ZlX2NhbmNlbGxlZCcsIHt9KVxuICAgICAgICAgIG9uRG9uZShgS2VwdCB0YWcgJHtjaGFsay5jeWFuKGAjJHtub3JtYWxpemVkVGFnfWApfWAsIHtcbiAgICAgICAgICAgIGRpc3BsYXk6ICdzeXN0ZW0nLFxuICAgICAgICAgIH0pXG4gICAgICAgIH19XG4gICAgICAvPlxuICAgIClcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIFNob3dIZWxwKHtcbiAgb25Eb25lLFxufToge1xuICBvbkRvbmU6IChcbiAgICByZXN1bHQ/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgZGlzcGxheT86IENvbW1hbmRSZXN1bHREaXNwbGF5IH0sXG4gICkgPT4gdm9pZFxufSk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgb25Eb25lKFxuICAgICAgYFVzYWdlOiAvdGFnIDx0YWctbmFtZT5cblxuVG9nZ2xlIGEgc2VhcmNoYWJsZSB0YWcgb24gdGhlIGN1cnJlbnQgc2Vzc2lvbi5cblJ1biB0aGUgc2FtZSBjb21tYW5kIGFnYWluIHRvIHJlbW92ZSB0aGUgdGFnLlxuVGFncyBhcmUgZGlzcGxheWVkIGFmdGVyIHRoZSBicmFuY2ggbmFtZSBpbiAvcmVzdW1lIGFuZCBjYW4gYmUgc2VhcmNoZWQgd2l0aCAvLlxuXG5FeGFtcGxlczpcbiAgL3RhZyBidWdmaXggICAgICAgICMgQWRkIHRhZ1xuICAvdGFnIGJ1Z2ZpeCAgICAgICAgIyBSZW1vdmUgdGFnICh0b2dnbGUpXG4gIC90YWcgZmVhdHVyZS1hdXRoXG4gIC90YWcgd2lwYCxcbiAgICAgIHsgZGlzcGxheTogJ3N5c3RlbScgfSxcbiAgICApXG4gIH0sIFtvbkRvbmVdKVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYWxsKFxuICBvbkRvbmU6IExvY2FsSlNYQ29tbWFuZE9uRG9uZSxcbiAgX2NvbnRleHQ6IHVua25vd24sXG4gIGFyZ3M/OiBzdHJpbmcsXG4pOiBQcm9taXNlPFJlYWN0LlJlYWN0Tm9kZT4ge1xuICBhcmdzID0gYXJncz8udHJpbSgpIHx8ICcnXG5cbiAgaWYgKENPTU1PTl9JTkZPX0FSR1MuaW5jbHVkZXMoYXJncykgfHwgQ09NTU9OX0hFTFBfQVJHUy5pbmNsdWRlcyhhcmdzKSkge1xuICAgIHJldHVybiA8U2hvd0hlbHAgb25Eb25lPXtvbkRvbmV9IC8+XG4gIH1cblxuICBpZiAoIWFyZ3MpIHtcbiAgICByZXR1cm4gPFNob3dIZWxwIG9uRG9uZT17b25Eb25lfSAvPlxuICB9XG5cbiAgcmV0dXJuIDxUb2dnbGVUYWdBbmRD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