Skip to content
wiki.fftac.org

Spiralist Prompt Workbench - Source Excerpt 78

Back to Spiralist Prompt Workbench

Summary

This source excerpt preserves a bounded section of Spiralist/wp-content/themes/spiralist/assets/js/spiralist-prompt-workbench.js so readers can inspect the evidence without opening the full source file.

**Source path:** Spiralist/wp-content/themes/spiralist/assets/js/spiralist-prompt-workbench.js

lines.forEach((line) => {
        const clean = line.trim();
        if (clean === '## Spiralist AI Matrix Repair Addendum') {
          skipping = true;
          return;
        }
        if (skipping && /^##\s+/.test(clean)) {
          skipping = false;
        }
        if (!skipping) {
          filtered.push(line);
        }
      });

      return filtered.join('\n').trim();
    };
    const buildPersonaLabRepairAddendum = (rows) => {
      const repairs = rows
        .filter((row) => row.status === 'Review' && row.repair)
        .map((row) => `- ${row.repair}`);

      if (!repairs.length) {
        return '';
      }

      return [
        '## Spiralist AI Matrix Repair Addendum',
        'These local browser fixes were added from the Advanced Persona Validation Matrix. Review them before copy, package export, sharing, or long-memory use.',
        '',
        ...repairs,
      ].join('\n');
    };
    const runPersonaLabRepair = (button) => {
      let prompt = getCurrentPrompt();
      if (!prompt) {
        prompt = applyPersonaLabTuning(button, { focusOutput: false, skipScroll: true });
      }

      prompt = toCleanString(prompt || getCurrentPrompt(), 50000);
      if (!prompt) {
        setStatus(t('portablePromptPersonaLabRepairUnavailable', 'Build a Spiralist AI prompt before applying matrix fixes.'));
        return false;
      }

      const basePrompt = stripPersonaLabRepairAddendum(prompt);
      const matrix = buildPersonaLabValidationMatrix(basePrompt.toLowerCase(), Boolean(basePrompt));
      const addendum = buildPersonaLabRepairAddendum(matrix.rows);

      if (!addendum) {
        showPortablePromptCheck(
          'Spiralist AI Persona Lab',
          t('portablePromptPersonaLabRepairClean', 'No missing matrix fixes found. Review the prompt normally.')
        );
        return false;
      }

      const repaired = `${basePrompt}\n\n${addendum}`.trim();
      setOutputText(repaired);
      manualEdited = true;
      setPromptReady(true);
      setEditStatus(t('portablePromptPersonaLabRepairEdited', 'Matrix fixes added to the editable prompt. Copy, download, AI links, and saves use this repaired text.'));
      setPersonaLabPackageState(button, '');
      if (testOutput) {
        testOutput.textContent = buildPersonaLabLocalCheckReport(repaired, 'Spiralist AI Persona Lab', getPersonaLabStressSuiteId(button));
        testOutput.hidden = false;
        testOutput.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
      }
      setStatus(t('portablePromptPersonaLabRepairApplied', 'Spiralist AI matrix fixes applied to the editable prompt.'));
      updatePersonaLabWorkflow();

      return true;
    };
    const writeClipboard = async (text, successMessage) => {
      await copyText(text);
      setStatus(successMessage);
    };
    const copyPrompt = () => {
      const prompt = getCurrentPrompt();
      if (!prompt) {
        return;
      }

      const failureMessage = builder.dataset.copyFailure || t('portablePromptCopyFailed', 'Copy failed.');
      runAction(
        async () => {
          const message = builder.dataset.copySuccess || t('portablePromptCopied', 'Prompt copied.');
          await writeClipboard(prompt, message);
          setAiStatus(t('portablePromptAiCopied', 'Prompt copied. Open a chat tool, paste or review the prefilled text, then send manually.'));
        },
        {
          context: 'portable-prompt-copy',
          fallback: failureMessage,
          onError: () => setStatus(failureMessage),
        }
      );
    };
    const copyPersonaLabPrompt = (button) => {
      const failureMessage = t('portablePromptPersonaLabCopyFailed', 'Spiralist AI persona prompt copy failed.');
      runAction(
        async () => {
          let prompt = getCurrentPrompt();
          if (!prompt) {
            prompt = applyPersonaLabTuning(button, { focusOutput: false, skipScroll: true });
          }

          prompt = toCleanString(prompt || getCurrentPrompt(), 50000);
          if (!prompt) {
            setStatus(t('portablePromptPersonaLabCopyUnavailable', 'Build a Spiralist AI persona prompt before copying it.'));
            return;
          }

          await writeClipboard(prompt, t('portablePromptPersonaLabCopied', 'Spiralist AI persona prompt copied.'));
          savePersonaLabHistory(prompt, 'Copied prompt', button);
          setAiStatus(t('portablePromptAiCopied', 'Prompt copied. Open a chat tool, paste or review the prefilled text, then send manually.'));
          updatePersonaLabWorkflow();
        },
        {
          context: 'portable-prompt-persona-lab-copy',
          fallback: failureMessage,
          onError: () => setStatus(failureMessage),
        }
      );
    };
    const openPromptInAi = (targetId) => {
      const prompt = getCurrentPrompt();
      if (!prompt) {
        setAiStatus(t('portablePromptAiUnavailable', 'Build a prompt before opening an AI chat tool.'));
        return;
      }

      const result = buildAiPromptUrl(targetId, prompt);
      if (!result.ok || !result.target || !result.url) {
        setAiStatus(t('portablePromptAiUnsupported', 'That AI target is not configured. Copy the prompt and paste it manually.'));
        return;
      }

      window.open(result.url, '_blank', 'noopener,noreferrer');
      runAction(async () => {
        await copyText(prompt);
        const message = result.prefilled
          ? t('portablePromptAiOpenedPrefilled', `${result.target.label} opened with a short prefilled prompt. The prompt was copied too; review before sending.`)
          : t('portablePromptAiOpenedPasteOnly', `${result.target.label} opened. The prompt was copied; paste and review it before sending.`);
        setStatus(message);
        setAiStatus(message);
      }, {
        context: 'portable-prompt-open-ai',
        fallback: t('portablePromptAiCopyFailed', 'AI chat opened, but copy failed. Select the prompt block and copy it manually.'),
        onError: () => setAiStatus(t('portablePromptAiCopyFailed', 'AI chat opened, but copy failed. Select the prompt block and copy it manually.')),
      });
    };
    const copyShareLink = () => {
      const link = updateShareUrl(getPromptState(), true);
      if (!link) {
        return;
      }

      if (shareInput) {
        shareInput.select();
      }

      const failureMessage = builder.dataset.linkFailure || t('portablePromptLinkCopyFailed', 'Copy failed.');
      runAction(
        () => writeClipboard(link, builder.dataset.linkSuccess || t('portablePromptLinkCopied', 'Share link copied.')),
        {
          context: 'portable-prompt-share-copy',
          fallback: failureMessage,
          onError: () => setStatus(failureMessage),
        }
      );
    };
    const downloadTextFile = (content, filename, type = 'text/plain;charset=utf-8') => {
      const blob = new Blob([content + '\n'], { type });
      const url = URL.createObjectURL(blob);
      const link = document.createElement('a');
      link.href = url;
      link.download = filename;
      document.body.appendChild(link);
      link.click();
      link.remove();
      URL.revokeObjectURL(url);
    };
    const downloadPrompt = () => {
      const prompt = getCurrentPrompt();
      if (!prompt) {
        return;
      }

      downloadTextFile(prompt, builder.dataset.downloadFilename || 'spiralist-portable-prompt.txt');
      setStatus(t('portablePromptDownloaded', 'Prompt downloaded.'));
    };
    const downloadPersonaLabCard = (button) => {
      let prompt = getCurrentPrompt();
      if (!prompt) {
        prompt = applyPersonaLabTuning(button, { focusOutput: false, skipScroll: true });
      }

      prompt = toCleanString(prompt || getCurrentPrompt(), 50000);
      if (!prompt) {
        setStatus(t('portablePromptPersonaLabCardUnavailable', 'Build a Spiralist AI prompt before downloading a persona card.'));
        return;
      }

      const title = extractPromptTitle(prompt, 'Spiralist AI Persona Card');
      const filename = `spiralist-ai-persona-card-${toSlug(title, 'persona-card')}.md`;
      downloadTextFile(buildPersonaLabCard(prompt, button), filename, 'text/markdown;charset=utf-8');
      savePersonaLabHistory(prompt, 'Markdown card exported', button);
      setPersonaLabPackageState(button, 'Card downloaded');
      setStatus(t('portablePromptPersonaLabCardDownloaded', 'Spiralist AI persona card downloaded.'));
    };
    const downloadPersonaLabPackage = (button) => {
      runAction(async () => {
        let prompt = getCurrentPrompt();
        if (!prompt) {
          prompt = applyPersonaLabTuning(button, { focusOutput: false, skipScroll: true });
        }

        prompt = toCleanString(prompt || getCurrentPrompt(), 50000);
        if (!prompt) {
          setStatus(t('portablePromptPersonaLabPackageUnavailable', 'Build a Spiralist AI prompt before downloading a personality pack.'));
          return;
        }