opencode-snippets 2.1.6 → 2.2.1
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/README.md +8 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +162 -22
- package/dist/index.js.map +1 -1
- package/dist/src/config.d.ts +0 -2
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +1 -12
- package/dist/src/config.js.map +1 -1
- package/dist/src/constants.d.ts +1 -1
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.js +2 -2
- package/dist/src/constants.js.map +1 -1
- package/dist/src/hook-types.d.ts +4 -0
- package/dist/src/hook-types.d.ts.map +1 -1
- package/dist/src/notification.d.ts +3 -1
- package/dist/src/notification.d.ts.map +1 -1
- package/dist/src/notification.js +73 -1
- package/dist/src/notification.js.map +1 -1
- package/dist/src/shell.d.ts +2 -7
- package/dist/src/shell.d.ts.map +1 -1
- package/dist/src/shell.js +5 -4
- package/dist/src/shell.js.map +1 -1
- package/dist/src/skill-loader.d.ts +1 -0
- package/dist/src/skill-loader.d.ts.map +1 -1
- package/dist/src/skill-loader.js +12 -0
- package/dist/src/skill-loader.js.map +1 -1
- package/dist/src/tui-search.d.ts.map +1 -1
- package/dist/src/tui-search.js +22 -4
- package/dist/src/tui-search.js.map +1 -1
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.jsx +44 -94
- package/dist/tui.jsx.map +1 -1
- package/package.json +1 -1
- package/skill/snippets/SKILL.md +38 -7
package/dist/src/notification.js
CHANGED
|
@@ -7,11 +7,12 @@ import { logger } from "./logger.js";
|
|
|
7
7
|
* @param sessionId - The current session ID
|
|
8
8
|
* @param text - The text to display
|
|
9
9
|
*/
|
|
10
|
-
export async function sendIgnoredMessage(client, sessionId, text) {
|
|
10
|
+
export async function sendIgnoredMessage(client, sessionId, text, messageId) {
|
|
11
11
|
try {
|
|
12
12
|
await client.session.prompt({
|
|
13
13
|
path: { id: sessionId },
|
|
14
14
|
body: {
|
|
15
|
+
messageID: messageId,
|
|
15
16
|
noReply: true,
|
|
16
17
|
parts: [{ type: "text", text, ignored: true }],
|
|
17
18
|
},
|
|
@@ -23,4 +24,75 @@ export async function sendIgnoredMessage(client, sessionId, text) {
|
|
|
23
24
|
});
|
|
24
25
|
}
|
|
25
26
|
}
|
|
27
|
+
export async function deleteSessionMessage(client, serverUrl, sessionId, messageId) {
|
|
28
|
+
try {
|
|
29
|
+
const session = client.session;
|
|
30
|
+
const sdkResponse = await session.deleteMessage?.({
|
|
31
|
+
sessionID: sessionId,
|
|
32
|
+
messageID: messageId,
|
|
33
|
+
});
|
|
34
|
+
if (sdkResponse)
|
|
35
|
+
return sdkResponse.data !== false;
|
|
36
|
+
const legacySession = client.session;
|
|
37
|
+
const legacyResponse = await legacySession._client?.delete?.({
|
|
38
|
+
url: "/session/{id}/message/{messageID}",
|
|
39
|
+
path: { id: sessionId, messageID: messageId },
|
|
40
|
+
});
|
|
41
|
+
if (legacyResponse)
|
|
42
|
+
return legacyResponse.data !== false;
|
|
43
|
+
const url = new URL(`/session/${encodeURIComponent(sessionId)}/message/${encodeURIComponent(messageId)}`, serverUrl);
|
|
44
|
+
const fetchResponse = await fetch(url, {
|
|
45
|
+
method: "DELETE",
|
|
46
|
+
signal: AbortSignal.timeout(1000),
|
|
47
|
+
});
|
|
48
|
+
if (fetchResponse.ok)
|
|
49
|
+
return true;
|
|
50
|
+
logger.debug("Failed to delete ignored message", {
|
|
51
|
+
messageId,
|
|
52
|
+
status: fetchResponse.status,
|
|
53
|
+
statusText: fetchResponse.statusText,
|
|
54
|
+
});
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
logger.debug("Failed to delete ignored message", {
|
|
59
|
+
messageId,
|
|
60
|
+
error: error instanceof Error ? error.message : String(error),
|
|
61
|
+
});
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export async function deleteSessionPart(client, serverUrl, sessionId, messageId, partId) {
|
|
66
|
+
try {
|
|
67
|
+
const legacySession = client.session;
|
|
68
|
+
const legacyResponse = await legacySession._client?.delete?.({
|
|
69
|
+
url: "/session/{id}/message/{messageID}/part/{partID}",
|
|
70
|
+
path: { id: sessionId, messageID: messageId, partID: partId },
|
|
71
|
+
});
|
|
72
|
+
if (legacyResponse)
|
|
73
|
+
return legacyResponse.data !== false;
|
|
74
|
+
const url = new URL(`/session/${encodeURIComponent(sessionId)}/message/${encodeURIComponent(messageId)}/part/${encodeURIComponent(partId)}`, serverUrl);
|
|
75
|
+
const fetchResponse = await fetch(url, {
|
|
76
|
+
method: "DELETE",
|
|
77
|
+
signal: AbortSignal.timeout(1000),
|
|
78
|
+
});
|
|
79
|
+
if (fetchResponse.ok)
|
|
80
|
+
return true;
|
|
81
|
+
logger.debug("Failed to delete ignored message part", {
|
|
82
|
+
messageId,
|
|
83
|
+
partId,
|
|
84
|
+
status: fetchResponse.status,
|
|
85
|
+
statusText: fetchResponse.statusText,
|
|
86
|
+
});
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
logger.debug("Failed to delete ignored message part", {
|
|
91
|
+
messageId,
|
|
92
|
+
partId,
|
|
93
|
+
error: error instanceof Error ? error.message : String(error),
|
|
94
|
+
});
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
26
98
|
//# sourceMappingURL=notification.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification.js","sourceRoot":"","sources":["../../src/notification.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAsB,EACtB,SAAiB,EACjB,IAAY;
|
|
1
|
+
{"version":3,"file":"notification.js","sourceRoot":"","sources":["../../src/notification.ts"],"names":[],"mappings":"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"}
|
package/dist/src/shell.d.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Executes shell commands in text using !`command` syntax
|
|
2
|
+
* Executes shell commands in text using !`command` or !>`command` syntax
|
|
3
3
|
*
|
|
4
4
|
* @param text - The text containing shell commands to execute
|
|
5
5
|
* @param ctx - The plugin context (with Bun shell)
|
|
6
|
-
* @param options - Shell execution options
|
|
7
6
|
* @returns The text with shell commands replaced by their output
|
|
8
7
|
*/
|
|
9
8
|
export type ShellContext = {
|
|
@@ -20,9 +19,5 @@ export type ShellContext = {
|
|
|
20
19
|
};
|
|
21
20
|
};
|
|
22
21
|
};
|
|
23
|
-
export
|
|
24
|
-
/** Hide the command prefix in output, showing only the result */
|
|
25
|
-
hideCommandInOutput?: boolean;
|
|
26
|
-
}
|
|
27
|
-
export declare function executeShellCommands(text: string, ctx: ShellContext, options?: ShellOptions): Promise<string>;
|
|
22
|
+
export declare function executeShellCommands(text: string, ctx: ShellContext): Promise<string>;
|
|
28
23
|
//# sourceMappingURL=shell.d.ts.map
|
package/dist/src/shell.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/shell.ts"],"names":[],"mappings":"AAGA
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/shell.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,CAAC,EAAE,CACD,QAAQ,EAAE,oBAAoB,EAC9B,GAAG,IAAI,EAAE,OAAO,EAAE,KACf;QACH,KAAK,EAAE,MAAM;YACX,OAAO,EAAE,MAAM,OAAO,CAAC;gBACrB,MAAM,EAAE;oBAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;iBAAE,CAAC;gBACnC,MAAM,EAAE;oBAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;iBAAE,CAAC;aACpC,CAAC,CAAC;SACJ,CAAC;KACH,CAAC;CACH,CAAC;AAEF,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAgC3F"}
|
package/dist/src/shell.js
CHANGED
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import { PATTERNS } from "./constants.js";
|
|
2
2
|
import { logger } from "./logger.js";
|
|
3
|
-
export async function executeShellCommands(text, ctx
|
|
3
|
+
export async function executeShellCommands(text, ctx) {
|
|
4
4
|
let result = text;
|
|
5
|
-
const hideCommand = options.hideCommandInOutput ?? false;
|
|
6
5
|
// Reset regex state (global flag requires this)
|
|
7
6
|
PATTERNS.SHELL_COMMAND.lastIndex = 0;
|
|
8
7
|
// Find all shell command matches
|
|
9
8
|
const matches = [...text.matchAll(PATTERNS.SHELL_COMMAND)];
|
|
10
9
|
// Execute each command and replace in text
|
|
11
10
|
for (const match of matches) {
|
|
12
|
-
const
|
|
11
|
+
const showCommand = match[1] === "!>";
|
|
12
|
+
const cmd = match[2];
|
|
13
13
|
const _placeholder = match[0];
|
|
14
14
|
try {
|
|
15
15
|
const output = await ctx.$ `${{ raw: cmd }}`.quiet().nothrow();
|
|
16
16
|
const text = `${output.stdout.toString()}${output.stderr.toString()}`.trim();
|
|
17
|
-
|
|
17
|
+
// `!>` preserves command provenance when the model should see what just ran.
|
|
18
|
+
const replacement = showCommand ? `$ ${cmd}\n--> ${text}` : text;
|
|
18
19
|
result = result.replace(_placeholder, replacement);
|
|
19
20
|
}
|
|
20
21
|
catch (error) {
|
package/dist/src/shell.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAuBrC,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAAY,EAAE,GAAiB;IACxE,IAAI,MAAM,GAAG,IAAI,CAAC;IAElB,gDAAgD;IAChD,QAAQ,CAAC,aAAa,CAAC,SAAS,GAAG,CAAC,CAAC;IAErC,iCAAiC;IACjC,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;IAE3D,2CAA2C;IAC3C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;QACtC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAE9B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,CAAA,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC;YAC9D,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;YAC7E,6EAA6E;YAC7E,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,GAAG,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACjE,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,yCAAyC;YACzC,mDAAmD;YACnD,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE;gBAC5C,OAAO,EAAE,GAAG;gBACZ,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-loader.d.ts","sourceRoot":"","sources":["../../src/skill-loader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"skill-loader.d.ts","sourceRoot":"","sources":["../../src/skill-loader.ts"],"names":[],"mappings":"AAUA;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC7B,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAsFD;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,aAAa,CAAC,CA0BxB;AA2ED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAErF"}
|
package/dist/src/skill-loader.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { readdir, stat } from "node:fs/promises";
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
3
|
import { dirname, join, resolve } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
4
5
|
import { importCjs } from "./cjs-interop.js";
|
|
5
6
|
const matter = await importCjs("gray-matter");
|
|
6
7
|
import { logger } from "./logger.js";
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = dirname(__filename);
|
|
7
10
|
/**
|
|
8
11
|
* OpenCode skill directory patterns.
|
|
9
12
|
*
|
|
@@ -43,6 +46,9 @@ function getProjectSkillDirs(projectDir) {
|
|
|
43
46
|
join(projectDir, ".agents", "skills"),
|
|
44
47
|
];
|
|
45
48
|
}
|
|
49
|
+
function getBundledSkillDirs() {
|
|
50
|
+
return [join(__dirname, "..", "..", "skill")];
|
|
51
|
+
}
|
|
46
52
|
async function exists(path) {
|
|
47
53
|
try {
|
|
48
54
|
await stat(path);
|
|
@@ -82,6 +88,12 @@ async function getProjectSearchRoots(projectDir) {
|
|
|
82
88
|
*/
|
|
83
89
|
export async function loadSkills(projectDir, options = {}) {
|
|
84
90
|
const skills = new Map();
|
|
91
|
+
// Bundled plugin skills should participate in the same registry used by runtime
|
|
92
|
+
// expansion and TUI autocomplete. Load them first so user/global/project skills can
|
|
93
|
+
// still override shipped defaults with the same name.
|
|
94
|
+
for (const dir of options.bundledSkillDirs || getBundledSkillDirs()) {
|
|
95
|
+
await loadFromDirectory(dir, skills, "global");
|
|
96
|
+
}
|
|
85
97
|
// Load from global directories first
|
|
86
98
|
for (const dir of getGlobalSkillDirs(options.homeDir)) {
|
|
87
99
|
await loadFromDirectory(dir, skills, "global");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-loader.js","sourceRoot":"","sources":["../../src/skill-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,MAAM,GAAG,MAAM,SAAS,CAA+B,aAAa,CAAC,CAAC;AAE5E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"skill-loader.js","sourceRoot":"","sources":["../../src/skill-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui-search.d.ts","sourceRoot":"","sources":["../../src/tui-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"tui-search.d.ts","sourceRoot":"","sources":["../../src/tui-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB;AA6ED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,CAgBpF;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,CAgB5E;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ5E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAE/D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,CA0B9E"}
|
package/dist/src/tui-search.js
CHANGED
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
function normalizeSearchText(input) {
|
|
2
2
|
return input.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
3
3
|
}
|
|
4
|
+
function isSubsequence(input, query) {
|
|
5
|
+
if (!query)
|
|
6
|
+
return true;
|
|
7
|
+
let i = 0;
|
|
8
|
+
for (const c of input) {
|
|
9
|
+
if (c !== query[i])
|
|
10
|
+
continue;
|
|
11
|
+
i += 1;
|
|
12
|
+
if (i === query.length)
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
4
17
|
function scoreText(input, query) {
|
|
5
18
|
const raw = input.toLowerCase();
|
|
6
19
|
const needle = query.toLowerCase();
|
|
@@ -18,6 +31,8 @@ function scoreText(input, query) {
|
|
|
18
31
|
return 4;
|
|
19
32
|
if (compactNeedle && compact.includes(compactNeedle))
|
|
20
33
|
return 5;
|
|
34
|
+
if (compactNeedle && isSubsequence(compact, compactNeedle))
|
|
35
|
+
return 6;
|
|
21
36
|
return Number.POSITIVE_INFINITY;
|
|
22
37
|
}
|
|
23
38
|
function scoreSnippet(snippet, query) {
|
|
@@ -29,9 +44,9 @@ function scoreSnippet(snippet, query) {
|
|
|
29
44
|
return score;
|
|
30
45
|
const needle = query.toLowerCase();
|
|
31
46
|
if (description.startsWith(needle))
|
|
32
|
-
return 6;
|
|
33
|
-
if (description.includes(needle))
|
|
34
47
|
return 7;
|
|
48
|
+
if (description.includes(needle))
|
|
49
|
+
return 8;
|
|
35
50
|
return Number.POSITIVE_INFINITY;
|
|
36
51
|
}
|
|
37
52
|
function sourceRank(item) {
|
|
@@ -49,9 +64,9 @@ function scoreSkill(skill, query) {
|
|
|
49
64
|
return score;
|
|
50
65
|
const needle = query.toLowerCase();
|
|
51
66
|
if (description.startsWith(needle))
|
|
52
|
-
return 6;
|
|
53
|
-
if (description.includes(needle))
|
|
54
67
|
return 7;
|
|
68
|
+
if (description.includes(needle))
|
|
69
|
+
return 8;
|
|
55
70
|
return Number.POSITIVE_INFINITY;
|
|
56
71
|
}
|
|
57
72
|
export function filterSnippets(snippets, query) {
|
|
@@ -92,6 +107,9 @@ export function matchedAliases(snippet, query) {
|
|
|
92
107
|
const needle = query.trim();
|
|
93
108
|
if (!needle)
|
|
94
109
|
return [];
|
|
110
|
+
const exact = snippet.aliases.filter((alias) => alias === needle);
|
|
111
|
+
if (exact.length > 0)
|
|
112
|
+
return exact;
|
|
95
113
|
return snippet.aliases.filter((alias) => Number.isFinite(scoreText(alias, needle)));
|
|
96
114
|
}
|
|
97
115
|
export function snippetDescription(snippet) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui-search.js","sourceRoot":"","sources":["../../src/tui-search.ts"],"names":[],"mappings":"AAQA,SAAS,mBAAmB,CAAC,KAAa;IACxC,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,SAAS,CAAC,KAAa,EAAE,KAAa;IAC7C,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,aAAa,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAEjD,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,CAAC,CAAC;IAC7B,IAAI,aAAa,IAAI,OAAO,KAAK,aAAa;QAAE,OAAO,CAAC,CAAC;IACzD,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,CAAC;IACrC,IAAI,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,CAAC,CAAC;IACjE,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,CAAC;IACnC,IAAI,aAAa,IAAI,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;QAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"tui-search.js","sourceRoot":"","sources":["../../src/tui-search.ts"],"names":[],"mappings":"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"}
|
package/dist/tui.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../tui.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAGV,eAAe,EAGhB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../tui.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAGV,eAAe,EAGhB,MAAM,yBAAyB,CAAC;AAs9BjC,QAAA,MAAM,MAAM,EAAE,eAAe,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAG3C,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
package/dist/tui.jsx
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { RGBA } from "@opentui/core";
|
|
4
4
|
import { useKeyboard } from "@opentui/solid";
|
|
5
|
-
import { createEffect, createMemo, createResource, createSignal, Index, onCleanup, Show, } from "solid-js";
|
|
5
|
+
import { createEffect, createMemo, createResource, createSignal, Index, onCleanup, onMount, Show, } from "solid-js";
|
|
6
6
|
import { CONFIG } from "./src/constants.js";
|
|
7
7
|
import { ensureSnippetsDir, listSnippets, loadSnippets } from "./src/loader.js";
|
|
8
8
|
import { addPendingDraft } from "./src/pending-drafts.js";
|
|
@@ -180,6 +180,17 @@ function toPromptInfo(prompt, input) {
|
|
|
180
180
|
function setPromptInput(prompt, input) {
|
|
181
181
|
prompt.set(toPromptInfo(prompt, input));
|
|
182
182
|
}
|
|
183
|
+
function isSubmitKey(evt) {
|
|
184
|
+
return (evt.name === "return" ||
|
|
185
|
+
evt.name === "linefeed" ||
|
|
186
|
+
evt.name === "enter" ||
|
|
187
|
+
evt.raw === "\r" ||
|
|
188
|
+
evt.raw === "\n" ||
|
|
189
|
+
evt.sequence === "\r" ||
|
|
190
|
+
evt.sequence === "\n" ||
|
|
191
|
+
evt.raw === "\x1bOM" ||
|
|
192
|
+
evt.sequence === "\x1bOM");
|
|
193
|
+
}
|
|
183
194
|
async function getSnippets(api) {
|
|
184
195
|
const registry = await loadSnippets(api.state.path.directory);
|
|
185
196
|
return sortSnippets(listSnippets(registry));
|
|
@@ -268,20 +279,6 @@ function PromptWithSnippetAutocomplete(props) {
|
|
|
268
279
|
props.api.renderer.requestRender();
|
|
269
280
|
}, 175);
|
|
270
281
|
};
|
|
271
|
-
const handlePromptSubmit = () => {
|
|
272
|
-
if (dialogBlockingInput()) {
|
|
273
|
-
return;
|
|
274
|
-
}
|
|
275
|
-
const ref = prompt();
|
|
276
|
-
if (ref && isReloadCommand(ref.current.input)) {
|
|
277
|
-
executeReloadInPrompt(props.api, ref, () => {
|
|
278
|
-
syncPromptInput(ref, "");
|
|
279
|
-
setDismissed(undefined);
|
|
280
|
-
}, refreshSnippetOptions);
|
|
281
|
-
return;
|
|
282
|
-
}
|
|
283
|
-
props.onSubmit?.();
|
|
284
|
-
};
|
|
285
282
|
const recordMouseMove = (x, y) => {
|
|
286
283
|
const last = lastMousePos();
|
|
287
284
|
if (last?.x === x && last.y === y) {
|
|
@@ -322,16 +319,6 @@ function PromptWithSnippetAutocomplete(props) {
|
|
|
322
319
|
}));
|
|
323
320
|
return [...snippetOptions, ...skillOptions];
|
|
324
321
|
};
|
|
325
|
-
const canCreateForQuery = (value) => {
|
|
326
|
-
const q = value.trim();
|
|
327
|
-
if (snippets.loading || skills.loading)
|
|
328
|
-
return false;
|
|
329
|
-
if (!q)
|
|
330
|
-
return false;
|
|
331
|
-
if (!normalizeSnippetName(q))
|
|
332
|
-
return false;
|
|
333
|
-
return optionsForQuery(q).length === 0;
|
|
334
|
-
};
|
|
335
322
|
const schedulePromptSync = () => {
|
|
336
323
|
const ref = prompt();
|
|
337
324
|
if (!ref)
|
|
@@ -488,66 +475,6 @@ function PromptWithSnippetAutocomplete(props) {
|
|
|
488
475
|
}, refreshSnippetOptions);
|
|
489
476
|
},
|
|
490
477
|
},
|
|
491
|
-
{
|
|
492
|
-
title: "Accept snippet autocomplete",
|
|
493
|
-
value: "snippets.accept",
|
|
494
|
-
keybind: "input_submit",
|
|
495
|
-
category: "Prompt",
|
|
496
|
-
hidden: true,
|
|
497
|
-
enabled: ref.focused,
|
|
498
|
-
onSelect() {
|
|
499
|
-
if (isReloadCommand(ref.current.input)) {
|
|
500
|
-
executeReloadInPrompt(props.api, ref, () => {
|
|
501
|
-
syncPromptInput(ref, "");
|
|
502
|
-
setDismissed(undefined);
|
|
503
|
-
}, refreshSnippetOptions);
|
|
504
|
-
return;
|
|
505
|
-
}
|
|
506
|
-
if (dialogBlockingInput()) {
|
|
507
|
-
return;
|
|
508
|
-
}
|
|
509
|
-
const current = findTrailingHashtagTrigger(ref.current.input);
|
|
510
|
-
if (!current || dismissed() === current.token) {
|
|
511
|
-
ref.submit();
|
|
512
|
-
return;
|
|
513
|
-
}
|
|
514
|
-
const live = optionsForQuery(current.query.trim());
|
|
515
|
-
const index = Math.min(selected(), Math.max(live.length - 1, 0));
|
|
516
|
-
if (syncingPrompt()) {
|
|
517
|
-
if (live.length > 0) {
|
|
518
|
-
chooseItem(live[index] ?? live[0]);
|
|
519
|
-
return;
|
|
520
|
-
}
|
|
521
|
-
if (canCreateForQuery(current.query)) {
|
|
522
|
-
void createSnippetDraft(current.query);
|
|
523
|
-
return;
|
|
524
|
-
}
|
|
525
|
-
ref.submit();
|
|
526
|
-
return;
|
|
527
|
-
}
|
|
528
|
-
// Prefer the rendered dropdown state so Enter follows what the user can see.
|
|
529
|
-
if (visible()) {
|
|
530
|
-
const rendered = options();
|
|
531
|
-
if (rendered.length > 0) {
|
|
532
|
-
const index = Math.min(selected(), rendered.length - 1);
|
|
533
|
-
chooseItem(rendered[index] ?? rendered[0]);
|
|
534
|
-
return;
|
|
535
|
-
}
|
|
536
|
-
}
|
|
537
|
-
if (snippets.loading || skills.loading) {
|
|
538
|
-
return;
|
|
539
|
-
}
|
|
540
|
-
if (live.length > 0) {
|
|
541
|
-
chooseItem(live[index] ?? live[0]);
|
|
542
|
-
return;
|
|
543
|
-
}
|
|
544
|
-
if (canCreateForQuery(current.query)) {
|
|
545
|
-
void createSnippetDraft(current.query);
|
|
546
|
-
return;
|
|
547
|
-
}
|
|
548
|
-
ref.submit();
|
|
549
|
-
},
|
|
550
|
-
},
|
|
551
478
|
]);
|
|
552
479
|
}, 0);
|
|
553
480
|
onCleanup(() => {
|
|
@@ -609,6 +536,35 @@ function PromptWithSnippetAutocomplete(props) {
|
|
|
609
536
|
})();
|
|
610
537
|
}}/>));
|
|
611
538
|
};
|
|
539
|
+
const acceptVisibleAutocomplete = () => {
|
|
540
|
+
const total = options().length;
|
|
541
|
+
const actionable = total > 0 || canCreate();
|
|
542
|
+
if (!visible() || !actionable)
|
|
543
|
+
return false;
|
|
544
|
+
if (total > 0) {
|
|
545
|
+
choose(selected());
|
|
546
|
+
}
|
|
547
|
+
else if (canCreate()) {
|
|
548
|
+
void createSnippetDraft();
|
|
549
|
+
}
|
|
550
|
+
return true;
|
|
551
|
+
};
|
|
552
|
+
onMount(() => {
|
|
553
|
+
const submitAutocomplete = (evt) => {
|
|
554
|
+
if (!isSubmitKey(evt))
|
|
555
|
+
return;
|
|
556
|
+
if (dialogBlockingInput())
|
|
557
|
+
return;
|
|
558
|
+
if (!acceptVisibleAutocomplete())
|
|
559
|
+
return;
|
|
560
|
+
evt.preventDefault();
|
|
561
|
+
evt.stopPropagation();
|
|
562
|
+
};
|
|
563
|
+
props.api.renderer.keyInput.prependListener("keypress", submitAutocomplete);
|
|
564
|
+
onCleanup(() => {
|
|
565
|
+
props.api.renderer.keyInput.removeListener("keypress", submitAutocomplete);
|
|
566
|
+
});
|
|
567
|
+
});
|
|
612
568
|
useKeyboard((evt) => {
|
|
613
569
|
const ref = prompt();
|
|
614
570
|
const name = evt.name?.toLowerCase();
|
|
@@ -657,15 +613,9 @@ function PromptWithSnippetAutocomplete(props) {
|
|
|
657
613
|
evt.stopPropagation();
|
|
658
614
|
return;
|
|
659
615
|
}
|
|
660
|
-
if (name === "tab") {
|
|
661
|
-
if (!
|
|
616
|
+
if (name === "tab" || name === "return" || name === "linefeed" || name === "enter") {
|
|
617
|
+
if (!acceptVisibleAutocomplete())
|
|
662
618
|
return;
|
|
663
|
-
if (total > 0) {
|
|
664
|
-
choose(selected());
|
|
665
|
-
}
|
|
666
|
-
else if (canCreate()) {
|
|
667
|
-
void createSnippetDraft();
|
|
668
|
-
}
|
|
669
619
|
evt.preventDefault();
|
|
670
620
|
evt.stopPropagation();
|
|
671
621
|
return;
|
|
@@ -751,7 +701,7 @@ function PromptWithSnippetAutocomplete(props) {
|
|
|
751
701
|
</scrollbox>
|
|
752
702
|
</box>
|
|
753
703
|
</Show>
|
|
754
|
-
<props.api.ui.Prompt sessionID={props.sessionID} workspaceID={props.workspaceID} visible={props.visible} disabled={props.disabled || dialogBlockingInput()} onSubmit={
|
|
704
|
+
<props.api.ui.Prompt sessionID={props.sessionID} workspaceID={props.workspaceID} visible={props.visible} disabled={props.disabled || dialogBlockingInput()} onSubmit={props.onSubmit} placeholders={props.placeholders} ref={bind} right={props.right}/>
|
|
755
705
|
</box>);
|
|
756
706
|
}
|
|
757
707
|
const tui = async (api) => {
|