Extensions: skills, plugins, MCP, sub-agents; configurable keys
- Skills (SKILL.md discovery, skill tool, /skills /skill) - plugin.json exec tools with permission prompts, timeouts and workspace trust (/plugins) - MCP stdio client: JSON-RPC initialize/tools/list/tools/call, mcp__server__tool, /mcp and sidebar status - task tool with general/explore/plan and .agent/agents/*.md roles, parallel read-only runs, cancel propagation, /agents - Keymap with Ctrl+X leader, keybinds.json overrides and /keys panel - Collapsed thinking, throttled streaming Markdown, leaner tool output, parallel read-only tools - Spawn: close-on-exec pipes and a process-wide fork lock - Tests for keymap, skills, plugins, MCP, sub-agents, shell compaction; docs/plugins.md
This commit is contained in:
@@ -0,0 +1,134 @@
|
||||
#ifndef CST_KEYMAP_H
|
||||
#define CST_KEYMAP_H
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Key codes: a Unicode code point (control characters included: ctrl+a = 1),
|
||||
* a CST_K_* special key, optionally OR'ed with CST_KEY_ALT. */
|
||||
#define CST_KEY_SPECIAL 0x110000
|
||||
#define CST_KEY_ALT 0x400000
|
||||
enum {
|
||||
CST_K_UP = CST_KEY_SPECIAL,
|
||||
CST_K_DOWN,
|
||||
CST_K_LEFT,
|
||||
CST_K_RIGHT,
|
||||
CST_K_HOME,
|
||||
CST_K_END,
|
||||
CST_K_PGUP,
|
||||
CST_K_PGDN,
|
||||
CST_K_BTAB, /* shift+tab */
|
||||
CST_K_DEL,
|
||||
CST_K_INS,
|
||||
CST_K_CTRL_HOME,
|
||||
CST_K_CTRL_END,
|
||||
CST_K_CTRL_UP,
|
||||
CST_K_CTRL_DOWN,
|
||||
CST_K_ALT_UP,
|
||||
CST_K_ALT_DOWN,
|
||||
CST_K_F1, /* CST_K_F1 + n - 1 for f1..f12 */
|
||||
CST_K_LAST = CST_K_F1 + 11
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
CST_KA_NONE = 0,
|
||||
/* general */
|
||||
CST_KA_PALETTE,
|
||||
CST_KA_KEYS,
|
||||
CST_KA_MODE,
|
||||
CST_KA_APPROVAL,
|
||||
CST_KA_NEWLINE,
|
||||
CST_KA_REDRAW,
|
||||
CST_KA_QUIT,
|
||||
/* view */
|
||||
CST_KA_TOGGLE_TOOL,
|
||||
CST_KA_TOGGLE_THOUGHT,
|
||||
CST_KA_THINKING_ALL,
|
||||
CST_KA_DETAILS,
|
||||
CST_KA_TODO,
|
||||
CST_KA_SIDEBAR,
|
||||
CST_KA_SCROLL_UP,
|
||||
CST_KA_SCROLL_DOWN,
|
||||
CST_KA_LINE_UP,
|
||||
CST_KA_LINE_DOWN,
|
||||
CST_KA_TOP,
|
||||
CST_KA_BOTTOM,
|
||||
/* session */
|
||||
CST_KA_NEW_SESSION,
|
||||
CST_KA_SESSIONS,
|
||||
CST_KA_UNDO,
|
||||
CST_KA_RETRY,
|
||||
CST_KA_COMPACT,
|
||||
CST_KA_COPY,
|
||||
CST_KA_EXPORT,
|
||||
/* model */
|
||||
CST_KA_MODEL,
|
||||
CST_KA_PROVIDER,
|
||||
CST_KA_EFFORT,
|
||||
/* extensions */
|
||||
CST_KA_AGENTS,
|
||||
CST_KA_SKILLS,
|
||||
CST_KA_PLUGINS,
|
||||
CST_KA_COUNT
|
||||
} cst_key_action_t;
|
||||
|
||||
typedef struct {
|
||||
const char *name; /* keybinds.json key, e.g. "new_session" */
|
||||
const char *group; /* "General", "View", ... */
|
||||
const char *desc;
|
||||
const char *slash; /* equivalent slash command, or NULL */
|
||||
} cst_key_action_info_t;
|
||||
|
||||
const cst_key_action_info_t *cst_key_action_info(int action);
|
||||
int cst_key_action_find(const char *name); /* CST_KA_NONE when unknown */
|
||||
|
||||
/* "ctrl+p", "shift+tab", "alt+enter", "f1", "pgup", "x" → code; -1 if bad. */
|
||||
int cst_key_parse(const char *s);
|
||||
/* code → canonical name ("ctrl+x", "tab", "alt+up", ...). */
|
||||
const char *cst_key_name(int code, char *buf, size_t n);
|
||||
|
||||
#define CST_KEYMAP_MAX 128
|
||||
typedef struct {
|
||||
int action;
|
||||
int keys[2];
|
||||
int nkeys;
|
||||
int user; /* from keybinds.json */
|
||||
} cst_binding_t;
|
||||
|
||||
typedef struct {
|
||||
int leader;
|
||||
cst_binding_t b[CST_KEYMAP_MAX];
|
||||
int n;
|
||||
} cst_keymap_t;
|
||||
|
||||
void cst_keymap_defaults(cst_keymap_t *km);
|
||||
/* Apply keybinds.json text over the defaults:
|
||||
* {"leader":"ctrl+x", "palette":"ctrl+p", "new_session":["<leader> n","f2"],
|
||||
* "todo":"none"}
|
||||
* Returns 0, or -1 with a message (bad entries are skipped, the rest apply). */
|
||||
int cst_keymap_apply_json(cst_keymap_t *km, const char *json, char *err,
|
||||
size_t err_sz);
|
||||
/* Defaults + <config>/keybinds.json when present. */
|
||||
int cst_keymap_load(cst_keymap_t *km, char *err, size_t err_sz);
|
||||
|
||||
#define CST_KM_NONE 0
|
||||
#define CST_KM_MATCH 1
|
||||
#define CST_KM_PREFIX 2
|
||||
/* seq of 1 or 2 keys → CST_KM_*; *action set on a match. */
|
||||
int cst_keymap_lookup(const cst_keymap_t *km, const int *seq, int n,
|
||||
int *action);
|
||||
/* "ctrl+x n, f2" (or "" when unbound). */
|
||||
void cst_keymap_describe(const cst_keymap_t *km, int action, char *buf,
|
||||
size_t n);
|
||||
/* One line per conflict ("ctrl+o: toggle_tool, toggle_thought"); returns the
|
||||
* number of conflicts. */
|
||||
int cst_keymap_conflicts(const cst_keymap_t *km, char *buf, size_t n);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user