@sema-agent/core
Version:
Stateless, task-oriented AI agent core
66 lines (65 loc) • 2.95 kB
JavaScript
export const SHELL_WORD_ROLES = Object.freeze([
"control_prefix",
"group",
"block",
"compound_open",
"loop_list_head",
"loop_iterates",
"loop_condition",
"loop_end",
"definition",
"background",
"case_arms",
"timer",
"scope_open",
"scope_close",
"scope_switch",
"stripped_prefix",
"stripped_standalone",
"opaque",
"rule_reserved",
"base_mover",
"stack_mover",
"stack_editor",
]);
const ROWS = [
["!", "control_prefix", "stripped_prefix", "rule_reserved"],
["if", "control_prefix", "compound_open", "scope_open", "stripped_prefix", "rule_reserved"],
["then", "control_prefix", "stripped_prefix", "rule_reserved"],
["elif", "control_prefix", "scope_switch", "stripped_prefix", "rule_reserved"],
["else", "control_prefix", "scope_switch", "stripped_prefix", "rule_reserved"],
["while", "control_prefix", "compound_open", "loop_condition", "scope_open", "stripped_prefix", "rule_reserved"],
["until", "control_prefix", "compound_open", "loop_condition", "scope_open", "stripped_prefix", "rule_reserved"],
["do", "control_prefix", "stripped_prefix", "rule_reserved"],
["time", "control_prefix", "timer", "rule_reserved"],
["{", "group", "compound_open", "scope_open", "stripped_standalone", "rule_reserved"],
["}", "group", "scope_close", "stripped_standalone", "rule_reserved"],
["for", "block", "compound_open", "loop_list_head", "loop_iterates", "scope_open", "opaque", "rule_reserved"],
["select", "block", "compound_open", "loop_list_head", "scope_open", "opaque", "rule_reserved"],
["case", "block", "compound_open", "case_arms", "scope_open", "opaque", "rule_reserved"],
["esac", "block", "scope_close", "stripped_standalone", "rule_reserved"],
["fi", "block", "scope_close", "stripped_standalone", "rule_reserved"],
["done", "block", "loop_end", "scope_close", "stripped_standalone", "rule_reserved"],
["function", "block", "definition", "opaque", "rule_reserved"],
["coproc", "block", "background", "opaque", "rule_reserved"],
["]]", "block", "stripped_standalone", "rule_reserved"],
["in", "block", "opaque", "rule_reserved"],
["[[", "block", "compound_open", "rule_reserved"],
["((", "rule_reserved"],
["))", "rule_reserved"],
["cd", "base_mover"],
["pushd", "base_mover", "stack_mover"],
["popd", "base_mover", "stack_mover"],
["dirs", "stack_editor"],
];
const PROJECTIONS = new Map(SHELL_WORD_ROLES.map((role) => [role, new Set(ROWS.filter(([, ...roles]) => roles.includes(role)).map(([word]) => word))]));
export function shellWordsOf(role) {
return PROJECTIONS.get(role);
}
export function shellWordRolesOf(word) {
const row = ROWS.find(([w]) => w === word);
return row === undefined ? [] : SHELL_WORD_ROLES.filter((role) => row.includes(role));
}
export function shellWordTable() {
return ROWS.map(([word]) => word);
}