@code-yeongyu/senpi-tui 2026.8.16 → 2026.8.18
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/dist/autocomplete.d.ts.map +1 -1
- package/dist/autocomplete.js +21 -0
- package/dist/autocomplete.js.map +1 -1
- package/dist/components/editor.js +1 -1
- package/dist/components/editor.js.map +1 -1
- package/dist/dollar-invocation-autocomplete.d.ts +9 -0
- package/dist/dollar-invocation-autocomplete.d.ts.map +1 -0
- package/dist/dollar-invocation-autocomplete.js +82 -0
- package/dist/dollar-invocation-autocomplete.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AutocompleteItem, SlashCommand } from "./autocomplete.ts";
|
|
2
|
+
export interface DollarInvocationContext {
|
|
3
|
+
readonly prefix: string;
|
|
4
|
+
readonly query: string;
|
|
5
|
+
readonly skillsOnly: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function getDollarInvocationContext(textBeforeCursor: string, cursorLine: number, commands: readonly (SlashCommand | AutocompleteItem)[]): DollarInvocationContext | null;
|
|
8
|
+
export declare function getDollarInvocationSuggestions(commands: readonly (SlashCommand | AutocompleteItem)[], query: string, skillsOnly: boolean): AutocompleteItem[];
|
|
9
|
+
//# sourceMappingURL=dollar-invocation-autocomplete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dollar-invocation-autocomplete.d.ts","sourceRoot":"","sources":["../src/dollar-invocation-autocomplete.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAcxE,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC7B;AAmBD,wBAAgB,0BAA0B,CACzC,gBAAgB,EAAE,MAAM,EACxB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,SAAS,CAAC,YAAY,GAAG,gBAAgB,CAAC,EAAE,GACpD,uBAAuB,GAAG,IAAI,CA0BhC;AAED,wBAAgB,8BAA8B,CAC7C,QAAQ,EAAE,SAAS,CAAC,YAAY,GAAG,gBAAgB,CAAC,EAAE,EACtD,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,OAAO,GACjB,gBAAgB,EAAE,CAkCpB"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { fuzzyFilter } from "./fuzzy.js";
|
|
2
|
+
const SKILL_COMMAND_PREFIX = "skill:";
|
|
3
|
+
const LEADING_DOLLAR_RUN_PATTERN = /^((?:\$[a-zA-Z][a-zA-Z0-9:_-]*\s+)*)\$([a-zA-Z0-9:_-]*)$/;
|
|
4
|
+
function commandName(command) {
|
|
5
|
+
return "name" in command ? command.name : command.value;
|
|
6
|
+
}
|
|
7
|
+
function skillName(name) {
|
|
8
|
+
if (!name.startsWith(SKILL_COMMAND_PREFIX))
|
|
9
|
+
return null;
|
|
10
|
+
const value = name.slice(SKILL_COMMAND_PREFIX.length);
|
|
11
|
+
return value || null;
|
|
12
|
+
}
|
|
13
|
+
function commandDescription(command) {
|
|
14
|
+
const hint = "argumentHint" in command && command.argumentHint ? command.argumentHint : undefined;
|
|
15
|
+
const description = command.description ?? "";
|
|
16
|
+
if (hint)
|
|
17
|
+
return description ? `${hint} — ${description}` : hint;
|
|
18
|
+
return description || undefined;
|
|
19
|
+
}
|
|
20
|
+
export function getDollarInvocationContext(textBeforeCursor, cursorLine, commands) {
|
|
21
|
+
if (cursorLine !== 0)
|
|
22
|
+
return null;
|
|
23
|
+
const match = textBeforeCursor.match(LEADING_DOLLAR_RUN_PATTERN);
|
|
24
|
+
if (!match)
|
|
25
|
+
return null;
|
|
26
|
+
const knownSkills = new Set(commands.flatMap((command) => {
|
|
27
|
+
const name = skillName(commandName(command));
|
|
28
|
+
return name ? [name] : [];
|
|
29
|
+
}));
|
|
30
|
+
const precedingSkills = match[1]
|
|
31
|
+
.trim()
|
|
32
|
+
.split(/\s+/)
|
|
33
|
+
.filter(Boolean)
|
|
34
|
+
.map((token) => token.slice(1))
|
|
35
|
+
.map((name) => (name.startsWith(SKILL_COMMAND_PREFIX) ? name.slice(SKILL_COMMAND_PREFIX.length) : name));
|
|
36
|
+
if (precedingSkills.some((name) => !knownSkills.has(name)))
|
|
37
|
+
return null;
|
|
38
|
+
const rawQuery = match[2];
|
|
39
|
+
const explicitSkillNamespace = rawQuery.startsWith(SKILL_COMMAND_PREFIX);
|
|
40
|
+
return {
|
|
41
|
+
prefix: `$${rawQuery}`,
|
|
42
|
+
query: explicitSkillNamespace ? rawQuery.slice(SKILL_COMMAND_PREFIX.length) : rawQuery,
|
|
43
|
+
skillsOnly: precedingSkills.length > 0 || explicitSkillNamespace,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export function getDollarInvocationSuggestions(commands, query, skillsOnly) {
|
|
47
|
+
const items = commands.flatMap((command) => {
|
|
48
|
+
const name = commandName(command);
|
|
49
|
+
const skill = skillName(name);
|
|
50
|
+
if (skill) {
|
|
51
|
+
return [
|
|
52
|
+
{
|
|
53
|
+
kind: "skill",
|
|
54
|
+
value: `$${skill}`,
|
|
55
|
+
label: `$${skill}`,
|
|
56
|
+
searchText: skill,
|
|
57
|
+
description: commandDescription(command),
|
|
58
|
+
},
|
|
59
|
+
];
|
|
60
|
+
}
|
|
61
|
+
if (skillsOnly)
|
|
62
|
+
return [];
|
|
63
|
+
return [
|
|
64
|
+
{
|
|
65
|
+
kind: "command",
|
|
66
|
+
value: `/${name}`,
|
|
67
|
+
label: `/${name}`,
|
|
68
|
+
searchText: name,
|
|
69
|
+
description: commandDescription(command),
|
|
70
|
+
},
|
|
71
|
+
];
|
|
72
|
+
});
|
|
73
|
+
return fuzzyFilter(items, query, (item) => item.searchText)
|
|
74
|
+
.map((item, index) => ({ ...item, index }))
|
|
75
|
+
.sort((left, right) => {
|
|
76
|
+
if (left.kind !== right.kind)
|
|
77
|
+
return left.kind === "command" ? -1 : 1;
|
|
78
|
+
return left.index - right.index;
|
|
79
|
+
})
|
|
80
|
+
.map(({ index: _index, kind: _kind, searchText: _searchText, ...item }) => item);
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=dollar-invocation-autocomplete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dollar-invocation-autocomplete.js","sourceRoot":"","sources":["../src/dollar-invocation-autocomplete.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AutocompleteItem, SlashCommand } from \"./autocomplete.ts\";\nimport { fuzzyFilter } from \"./fuzzy.ts\";\n\nconst SKILL_COMMAND_PREFIX = \"skill:\";\nconst LEADING_DOLLAR_RUN_PATTERN = /^((?:\\$[a-zA-Z][a-zA-Z0-9:_-]*\\s+)*)\\$([a-zA-Z0-9:_-]*)$/;\n\ntype DollarInvocationItem = {\n\treadonly description?: string;\n\treadonly kind: \"command\" | \"skill\";\n\treadonly label: string;\n\treadonly searchText: string;\n\treadonly value: string;\n};\n\nexport interface DollarInvocationContext {\n\treadonly prefix: string;\n\treadonly query: string;\n\treadonly skillsOnly: boolean;\n}\n\nfunction commandName(command: SlashCommand | AutocompleteItem): string {\n\treturn \"name\" in command ? command.name : command.value;\n}\n\nfunction skillName(name: string): string | null {\n\tif (!name.startsWith(SKILL_COMMAND_PREFIX)) return null;\n\tconst value = name.slice(SKILL_COMMAND_PREFIX.length);\n\treturn value || null;\n}\n\nfunction commandDescription(command: SlashCommand | AutocompleteItem): string | undefined {\n\tconst hint = \"argumentHint\" in command && command.argumentHint ? command.argumentHint : undefined;\n\tconst description = command.description ?? \"\";\n\tif (hint) return description ? `${hint} — ${description}` : hint;\n\treturn description || undefined;\n}\n\nexport function getDollarInvocationContext(\n\ttextBeforeCursor: string,\n\tcursorLine: number,\n\tcommands: readonly (SlashCommand | AutocompleteItem)[],\n): DollarInvocationContext | null {\n\tif (cursorLine !== 0) return null;\n\tconst match = textBeforeCursor.match(LEADING_DOLLAR_RUN_PATTERN);\n\tif (!match) return null;\n\n\tconst knownSkills = new Set(\n\t\tcommands.flatMap((command) => {\n\t\t\tconst name = skillName(commandName(command));\n\t\t\treturn name ? [name] : [];\n\t\t}),\n\t);\n\tconst precedingSkills = match[1]\n\t\t.trim()\n\t\t.split(/\\s+/)\n\t\t.filter(Boolean)\n\t\t.map((token) => token.slice(1))\n\t\t.map((name) => (name.startsWith(SKILL_COMMAND_PREFIX) ? name.slice(SKILL_COMMAND_PREFIX.length) : name));\n\tif (precedingSkills.some((name) => !knownSkills.has(name))) return null;\n\n\tconst rawQuery = match[2];\n\tconst explicitSkillNamespace = rawQuery.startsWith(SKILL_COMMAND_PREFIX);\n\treturn {\n\t\tprefix: `$${rawQuery}`,\n\t\tquery: explicitSkillNamespace ? rawQuery.slice(SKILL_COMMAND_PREFIX.length) : rawQuery,\n\t\tskillsOnly: precedingSkills.length > 0 || explicitSkillNamespace,\n\t};\n}\n\nexport function getDollarInvocationSuggestions(\n\tcommands: readonly (SlashCommand | AutocompleteItem)[],\n\tquery: string,\n\tskillsOnly: boolean,\n): AutocompleteItem[] {\n\tconst items: DollarInvocationItem[] = commands.flatMap((command): DollarInvocationItem[] => {\n\t\tconst name = commandName(command);\n\t\tconst skill = skillName(name);\n\t\tif (skill) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tkind: \"skill\" as const,\n\t\t\t\t\tvalue: `$${skill}`,\n\t\t\t\t\tlabel: `$${skill}`,\n\t\t\t\t\tsearchText: skill,\n\t\t\t\t\tdescription: commandDescription(command),\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\t\tif (skillsOnly) return [];\n\t\treturn [\n\t\t\t{\n\t\t\t\tkind: \"command\" as const,\n\t\t\t\tvalue: `/${name}`,\n\t\t\t\tlabel: `/${name}`,\n\t\t\t\tsearchText: name,\n\t\t\t\tdescription: commandDescription(command),\n\t\t\t},\n\t\t];\n\t});\n\n\treturn fuzzyFilter(items, query, (item) => item.searchText)\n\t\t.map((item, index) => ({ ...item, index }))\n\t\t.sort((left, right) => {\n\t\t\tif (left.kind !== right.kind) return left.kind === \"command\" ? -1 : 1;\n\t\t\treturn left.index - right.index;\n\t\t})\n\t\t.map(({ index: _index, kind: _kind, searchText: _searchText, ...item }) => item);\n}\n"]}
|
package/package.json
CHANGED