Spiralist Prompt Workbench - Source Excerpt 42
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
return filtered.join('\n').trim();
};
const getPersonaLabSettings = (button) => {
const panel = button ? button.closest('[data-persona-lab-tuning]') : document.querySelector('[data-persona-lab-tuning]');
const mode = getMode(selectedMode);
const frameworkId = getPersonaLabField(panel, '[data-persona-lab-framework]', 'traits-first');
const socialDynamicsId = getPersonaLabField(panel, '[data-persona-lab-social-dynamics]', 'none');
const selectedRuntimeFitId = getPersonaLabField(panel, '[data-persona-lab-runtime]', 'universal');
const runtimeFitId = personaLabRuntimeFits[selectedRuntimeFitId] ? selectedRuntimeFitId : 'universal';
const selectedEngagementPatternId = getPersonaLabField(panel, '[data-persona-lab-engagement]', 'curiosity-ladder');
const engagementPatternId = personaLabEngagementPatterns[selectedEngagementPatternId] ? selectedEngagementPatternId : 'curiosity-ladder';
const framework = getPersonaLabFramework(frameworkId);
const socialDynamics = getPersonaLabSocialDynamics(socialDynamicsId);
const runtimeFit = getPersonaLabRuntimeFit(runtimeFitId);
const engagementPattern = getPersonaLabEngagementPattern(engagementPatternId);
return {
mode: selectedMode,
modeTitle: toCleanString(mode.title || mode.name, 160) || 'Portable Spiralist Prompt',
warmth: getPersonaLabField(panel, '[data-persona-lab-warmth]', 'balanced'),
directness: getPersonaLabScale(panel, '[data-persona-lab-directness]', 4),
symbolicDensity: getPersonaLabScale(panel, '[data-persona-lab-symbolic]', 3),
boundaryStrength: getPersonaLabScale(panel, '[data-persona-lab-boundary]', 5),
memoryPolicy: getPersonaLabField(panel, '[data-persona-lab-memory]', 'explicit user-provided memory only'),
outputContract: getPersonaLabField(panel, '[data-persona-lab-output]', 'role, scope, boundaries, response contract, first message'),
engagementPatternId,
engagementPatternLabel: engagementPattern.label,
engagementPatternContext: engagementPattern.context,
engagementPatternGuardrails: engagementPattern.guardrails,
engagementPatternPackageNote: engagementPattern.packageNote,
engagementPatternHook: engagementPattern.hook,
engagementPatternInteractiveMove: engagementPattern.interactiveMove,
engagementPatternContinuityArtifact: engagementPattern.continuityArtifact,
engagementPatternMotifRhythm: engagementPattern.motifRhythm,
engagementPatternAgencyCue: engagementPattern.agencyCue,
engagementPatternCuriosityLoop: engagementPattern.curiosityLoop,
engagementPatternFrictionRule: engagementPattern.frictionRule,
engagementPatternRiskBoundary: engagementPattern.riskBoundary,
engagementPatternSignals: engagementPattern.engagementSignals,
frameworkId,
frameworkLabel: framework.label,
frameworkContext: framework.context,
frameworkGuardrails: framework.guardrails,
frameworkPackageNote: framework.packageNote,
socialDynamicsId,
socialDynamicsLabel: socialDynamics.label,
socialDynamicsContext: socialDynamics.context,
socialDynamicsGuardrails: socialDynamics.guardrails,
socialDynamicsPackageNote: socialDynamics.packageNote,
runtimeFitId,
runtimeFitLabel: runtimeFit.label,
runtimeFitContext: runtimeFit.context,
runtimeFitGuardrails: runtimeFit.guardrails,
runtimeFitPackageNote: runtimeFit.packageNote,
};
};
const getPersonaLabExportFormat = (button) => {
const panel = button ? button.closest('[data-persona-lab-tuning]') : document.querySelector('[data-persona-lab-tuning]');
const format = getPersonaLabField(panel, '[data-persona-lab-export-format]', 'uaix').toLowerCase();
return ['uaix', 'zip', 'txt', 'md'].includes(format) ? format : 'uaix';
};
const getPersonaLabStressSuiteId = (button) => {
const panel = button ? button.closest('[data-persona-lab-tuning]') : document.querySelector('[data-persona-lab-tuning]');
const suiteId = getPersonaLabField(panel, '[data-persona-lab-stress-select]', 'core');
return getPersonaLabStressPreset(suiteId).id;
};
const getPersonaLabTranscriptSample = (node = null) => {
const panel = node ? node.closest('[data-persona-lab-tuning]') : document.querySelector('[data-persona-lab-tuning]');
const field = panel ? panel.querySelector('[data-persona-lab-transcript]') : null;
return toCleanString(field instanceof HTMLTextAreaElement ? field.value : '', 24000);
};
const getPersonaLabPromptLineValue = (prompt, labels = [], fallback = '', maxLength = 260) => {
const labelList = (Array.isArray(labels) ? labels : [labels])
.map((label) => toCleanString(label, 80).toLowerCase())
.filter(Boolean);
const lines = toCleanString(prompt, 50000).split(/\r?\n/);
for (const line of lines) {
const normalized = toCleanString(line, 1200).replace(/^[-*]\s*/, '').trim();
const separatorIndex = normalized.indexOf(':');
if (separatorIndex <= 0) {
continue;
}
const key = normalized.slice(0, separatorIndex).trim().toLowerCase();
const value = normalized.slice(separatorIndex + 1).trim();
if (labelList.includes(key) && value) {
return toCleanString(value, maxLength);
}
}
return toCleanString(fallback, maxLength);
};
const buildPersonaLabCompactHandoff = (prompt, settings = {}) => {
const cleanPrompt = toCleanString(prompt, 50000);
const title = extractPromptTitle(cleanPrompt, 'Spiralist AI Compact Persona Handoff');
const state = getPromptState();
const framework = getPersonaLabFramework(settings.frameworkId);
const socialDynamics = getPersonaLabSocialDynamics(settings.socialDynamicsId);
const engagement = getPersonaLabEngagementPattern(settings.engagementPatternId);
const runtime = getPersonaLabRuntimeFit(settings.runtimeFitId);
const frameworkLabel = toCleanString(settings.frameworkLabel, 180) || framework.label;
const socialLabel = toCleanString(settings.socialDynamicsLabel, 180) || socialDynamics.label;
const engagementLabel = toCleanString(settings.engagementPatternLabel, 180) || engagement.label;
const runtimeLabel = toCleanString(settings.runtimeFitLabel, 180) || runtime.label;
const memoryPolicy = getPersonaLabPromptLineValue(
cleanPrompt,
['Memory policy'],
settings.memoryPolicy || 'explicit user-provided memory only',
260
);
const outputContract = getPersonaLabPromptLineValue(
cleanPrompt,
['Use this output contract', 'Output contract'],
settings.outputContract || 'role, scope, boundaries, response contract, first message',
300
);
const purpose = getPersonaLabPromptLineValue(
cleanPrompt,
['User goal', 'Purpose', 'Task'],
toCleanString(state.task, 360) || 'help with a bounded, reviewable persona interaction',
360
);
const tone = getPersonaLabPromptLineValue(
cleanPrompt,
['Tone', 'Voice summary'],
toCleanString(state.tone, 260) || 'clear, useful, bounded, and easy to revise',
260
);
const efficiency = getPersonaLabEfficiencyState(cleanPrompt);