@kooka/agent-sdk 0.1.0

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.
Files changed (91) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +293 -0
  3. package/dist/abort.d.ts +2 -0
  4. package/dist/abort.d.ts.map +1 -0
  5. package/dist/abort.js +19 -0
  6. package/dist/abort.js.map +1 -0
  7. package/dist/agent/agent.d.ts +67 -0
  8. package/dist/agent/agent.d.ts.map +1 -0
  9. package/dist/agent/agent.js +1061 -0
  10. package/dist/agent/agent.js.map +1 -0
  11. package/dist/agent/constants.d.ts +6 -0
  12. package/dist/agent/constants.d.ts.map +1 -0
  13. package/dist/agent/constants.js +40 -0
  14. package/dist/agent/constants.js.map +1 -0
  15. package/dist/agent/prompts.d.ts +4 -0
  16. package/dist/agent/prompts.d.ts.map +1 -0
  17. package/dist/agent/prompts.js +31 -0
  18. package/dist/agent/prompts.js.map +1 -0
  19. package/dist/agent/reminders.d.ts +3 -0
  20. package/dist/agent/reminders.d.ts.map +1 -0
  21. package/dist/agent/reminders.js +31 -0
  22. package/dist/agent/reminders.js.map +1 -0
  23. package/dist/agent/retry.d.ts +12 -0
  24. package/dist/agent/retry.d.ts.map +1 -0
  25. package/dist/agent/retry.js +200 -0
  26. package/dist/agent/retry.js.map +1 -0
  27. package/dist/index.d.ts +49 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +50 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/llm/openaiCompatible.d.ts +23 -0
  32. package/dist/llm/openaiCompatible.d.ts.map +1 -0
  33. package/dist/llm/openaiCompatible.js +91 -0
  34. package/dist/llm/openaiCompatible.js.map +1 -0
  35. package/dist/plugins/pluginManager.d.ts +22 -0
  36. package/dist/plugins/pluginManager.d.ts.map +1 -0
  37. package/dist/plugins/pluginManager.js +171 -0
  38. package/dist/plugins/pluginManager.js.map +1 -0
  39. package/dist/plugins/types.d.ts +97 -0
  40. package/dist/plugins/types.d.ts.map +1 -0
  41. package/dist/plugins/types.js +2 -0
  42. package/dist/plugins/types.js.map +1 -0
  43. package/dist/skills.d.ts +28 -0
  44. package/dist/skills.d.ts.map +1 -0
  45. package/dist/skills.js +188 -0
  46. package/dist/skills.js.map +1 -0
  47. package/dist/tools/builtin/bash.d.ts +4 -0
  48. package/dist/tools/builtin/bash.d.ts.map +1 -0
  49. package/dist/tools/builtin/bash.js +364 -0
  50. package/dist/tools/builtin/bash.js.map +1 -0
  51. package/dist/tools/builtin/glob.d.ts +4 -0
  52. package/dist/tools/builtin/glob.d.ts.map +1 -0
  53. package/dist/tools/builtin/glob.js +87 -0
  54. package/dist/tools/builtin/glob.js.map +1 -0
  55. package/dist/tools/builtin/grep.d.ts +4 -0
  56. package/dist/tools/builtin/grep.d.ts.map +1 -0
  57. package/dist/tools/builtin/grep.js +190 -0
  58. package/dist/tools/builtin/grep.js.map +1 -0
  59. package/dist/tools/builtin/index.d.ts +15 -0
  60. package/dist/tools/builtin/index.d.ts.map +1 -0
  61. package/dist/tools/builtin/index.js +37 -0
  62. package/dist/tools/builtin/index.js.map +1 -0
  63. package/dist/tools/builtin/list.d.ts +4 -0
  64. package/dist/tools/builtin/list.d.ts.map +1 -0
  65. package/dist/tools/builtin/list.js +162 -0
  66. package/dist/tools/builtin/list.js.map +1 -0
  67. package/dist/tools/builtin/read.d.ts +4 -0
  68. package/dist/tools/builtin/read.d.ts.map +1 -0
  69. package/dist/tools/builtin/read.js +92 -0
  70. package/dist/tools/builtin/read.js.map +1 -0
  71. package/dist/tools/builtin/skill.d.ts +9 -0
  72. package/dist/tools/builtin/skill.d.ts.map +1 -0
  73. package/dist/tools/builtin/skill.js +126 -0
  74. package/dist/tools/builtin/skill.js.map +1 -0
  75. package/dist/tools/builtin/workspace.d.ts +13 -0
  76. package/dist/tools/builtin/workspace.d.ts.map +1 -0
  77. package/dist/tools/builtin/workspace.js +74 -0
  78. package/dist/tools/builtin/workspace.js.map +1 -0
  79. package/dist/tools/builtin/write.d.ts +4 -0
  80. package/dist/tools/builtin/write.d.ts.map +1 -0
  81. package/dist/tools/builtin/write.js +73 -0
  82. package/dist/tools/builtin/write.js.map +1 -0
  83. package/dist/tools/registry.d.ts +21 -0
  84. package/dist/tools/registry.d.ts.map +1 -0
  85. package/dist/tools/registry.js +150 -0
  86. package/dist/tools/registry.js.map +1 -0
  87. package/dist/types.d.ts +251 -0
  88. package/dist/types.d.ts.map +1 -0
  89. package/dist/types.js +2 -0
  90. package/dist/types.js.map +1 -0
  91. package/package.json +46 -0
@@ -0,0 +1,91 @@
1
+ import { createOpenAICompatible } from '@ai-sdk/openai-compatible';
2
+ import { Agent, fetch as undiciFetch } from 'undici';
3
+ import { combineAbortSignals } from '../abort.js';
4
+ function normalizeBaseURL(input) {
5
+ return input.replace(/\/+$/, '');
6
+ }
7
+ function toHeaderRecord(initHeaders) {
8
+ const headers = {};
9
+ if (!initHeaders)
10
+ return headers;
11
+ if (Array.isArray(initHeaders)) {
12
+ for (const [k, v] of initHeaders)
13
+ headers[String(k)] = String(v);
14
+ return headers;
15
+ }
16
+ if (initHeaders instanceof Headers) {
17
+ for (const [k, v] of initHeaders.entries())
18
+ headers[k] = v;
19
+ return headers;
20
+ }
21
+ if (typeof initHeaders === 'object') {
22
+ Object.assign(headers, initHeaders);
23
+ }
24
+ return headers;
25
+ }
26
+ function createFetchWithStreamingDefaults(timeoutMs) {
27
+ const timeoutValue = typeof timeoutMs === 'number' && Number.isFinite(timeoutMs) && timeoutMs > 0 ? timeoutMs : 0;
28
+ const dispatcher = new Agent({ bodyTimeout: 0 });
29
+ const fetchFn = (input, init) => {
30
+ const headers = {};
31
+ Object.assign(headers, toHeaderRecord(init?.headers));
32
+ // Some OpenAI-compatible servers misbehave with compressed SSE streams.
33
+ if (!('accept-encoding' in headers) && !('Accept-Encoding' in headers)) {
34
+ headers['accept-encoding'] = 'identity';
35
+ }
36
+ const signals = [];
37
+ if (init?.signal)
38
+ signals.push(init.signal);
39
+ if (timeoutValue > 0) {
40
+ const timeoutFn = AbortSignal?.timeout;
41
+ if (typeof timeoutFn === 'function') {
42
+ signals.push(timeoutFn(timeoutValue));
43
+ }
44
+ }
45
+ const signal = signals.length > 0 ? combineAbortSignals(signals) : undefined;
46
+ return undiciFetch(input, { ...init, dispatcher, headers, signal });
47
+ };
48
+ return { fetch: fetchFn, dispose: () => dispatcher.close() };
49
+ }
50
+ export class OpenAICompatibleProvider {
51
+ id = 'openaiCompatible';
52
+ name;
53
+ baseURL;
54
+ apiKey;
55
+ defaultModelId;
56
+ timeoutMs;
57
+ provider;
58
+ fetchFn;
59
+ disposeFetch;
60
+ constructor(options) {
61
+ if (!options.baseURL?.trim()) {
62
+ throw new Error('OpenAICompatibleProvider requires baseURL');
63
+ }
64
+ this.baseURL = normalizeBaseURL(options.baseURL);
65
+ this.apiKey = options.apiKey;
66
+ this.defaultModelId = options.defaultModelId;
67
+ this.timeoutMs = options.timeoutMs;
68
+ this.name = options.name || 'OpenAI-Compatible';
69
+ const fetchWithDefaults = createFetchWithStreamingDefaults(this.timeoutMs);
70
+ this.fetchFn = fetchWithDefaults.fetch;
71
+ this.disposeFetch = fetchWithDefaults.dispose;
72
+ this.provider = createOpenAICompatible({
73
+ name: this.name,
74
+ baseURL: this.baseURL,
75
+ apiKey: this.apiKey,
76
+ fetch: this.fetchFn,
77
+ includeUsage: true,
78
+ });
79
+ }
80
+ async getModel(modelId) {
81
+ const resolved = modelId || this.defaultModelId;
82
+ if (!resolved) {
83
+ throw new Error('No model configured. Provide modelId (or defaultModelId).');
84
+ }
85
+ return this.provider.chatModel(resolved);
86
+ }
87
+ dispose() {
88
+ this.disposeFetch();
89
+ }
90
+ }
91
+ //# sourceMappingURL=openaiCompatible.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openaiCompatible.js","sourceRoot":"","sources":["../../src/llm/openaiCompatible.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { LingyunHookName, LingyunHooks, LingyunPluginToolEntry } from './types.js';
2
+ export declare class PluginManager {
3
+ private readonly options;
4
+ private loadedKey;
5
+ private loadedHooks;
6
+ private extraHooks;
7
+ private pluginTools;
8
+ constructor(options?: {
9
+ plugins?: string[];
10
+ autoDiscover?: boolean;
11
+ workspaceDirName?: string;
12
+ workspaceRoot?: string;
13
+ logger?: (message: string) => void;
14
+ });
15
+ registerHooks(id: string, hooks: LingyunHooks): {
16
+ dispose: () => void;
17
+ };
18
+ private loadPluginsIfNeeded;
19
+ getPluginTools(): Promise<LingyunPluginToolEntry[]>;
20
+ trigger<Name extends LingyunHookName, Output>(name: Name, input: unknown, output: Output): Promise<Output>;
21
+ }
22
+ //# sourceMappingURL=pluginManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginManager.d.ts","sourceRoot":"","sources":["../../src/plugins/pluginManager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAA4C,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAmGlI,qBAAa,aAAa;IAOtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAN1B,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,WAAW,CAAgC;gBAGhC,OAAO,GAAE;QACxB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;KAC/B;IAGR,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG;QAAE,OAAO,EAAE,MAAM,IAAI,CAAA;KAAE;YAWzD,mBAAmB;IA4C3B,cAAc,IAAI,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAKnD,OAAO,CAAC,IAAI,SAAS,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAejH"}
@@ -0,0 +1,171 @@
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+ import { pathToFileURL } from 'url';
4
+ function isRecord(value) {
5
+ return !!value && typeof value === 'object' && !Array.isArray(value);
6
+ }
7
+ function uniqueStrings(items) {
8
+ const out = [];
9
+ const seen = new Set();
10
+ for (const item of items) {
11
+ const v = String(item || '').trim();
12
+ if (!v || seen.has(v))
13
+ continue;
14
+ seen.add(v);
15
+ out.push(v);
16
+ }
17
+ return out;
18
+ }
19
+ async function exists(p) {
20
+ try {
21
+ await fs.stat(p);
22
+ return true;
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ async function listPluginFiles(dir) {
29
+ try {
30
+ const entries = await fs.readdir(dir, { withFileTypes: true });
31
+ return entries
32
+ .filter((ent) => ent.isFile())
33
+ .map((ent) => ent.name)
34
+ .filter((name) => /\.(cjs|mjs|js)$/i.test(name))
35
+ .map((name) => path.join(dir, name));
36
+ }
37
+ catch {
38
+ return [];
39
+ }
40
+ }
41
+ async function resolveWorkspacePluginPaths(params) {
42
+ if (!params.enabled)
43
+ return [];
44
+ if (!params.workspaceRoot)
45
+ return [];
46
+ const pluginDir = path.join(params.workspaceRoot, params.workspaceDirName, 'plugin');
47
+ if (!(await exists(pluginDir)))
48
+ return [];
49
+ return uniqueStrings(await listPluginFiles(pluginDir));
50
+ }
51
+ async function importPluginModule(spec, workspaceRoot) {
52
+ const trimmed = String(spec || '').trim();
53
+ if (!trimmed)
54
+ return null;
55
+ if (trimmed.startsWith('file://')) {
56
+ return import(trimmed);
57
+ }
58
+ const looksPath = trimmed.startsWith('.') || trimmed.startsWith('/') || trimmed.includes(path.sep);
59
+ if (looksPath) {
60
+ const resolvedPath = path.resolve(workspaceRoot || process.cwd(), trimmed);
61
+ return import(pathToFileURL(resolvedPath).href);
62
+ }
63
+ // treat as module specifier resolvable by Node
64
+ return import(trimmed);
65
+ }
66
+ function extractHooksFromModule(moduleExports, input) {
67
+ if (!moduleExports)
68
+ return [];
69
+ const out = [];
70
+ const seen = new Set();
71
+ const entries = Object.entries(moduleExports);
72
+ for (const [name, value] of entries) {
73
+ if (seen.has(value))
74
+ continue;
75
+ if (typeof value === 'function') {
76
+ seen.add(value);
77
+ out.push({ id: name, hooks: value(input) });
78
+ continue;
79
+ }
80
+ if (isRecord(value)) {
81
+ seen.add(value);
82
+ out.push({ id: name, hooks: value });
83
+ }
84
+ }
85
+ if (entries.length === 0 && typeof moduleExports === 'function') {
86
+ out.push({ id: 'default', hooks: moduleExports(input) });
87
+ }
88
+ return out;
89
+ }
90
+ export class PluginManager {
91
+ options;
92
+ loadedKey = '';
93
+ loadedHooks = [];
94
+ extraHooks = [];
95
+ pluginTools = [];
96
+ constructor(options = {}) {
97
+ this.options = options;
98
+ }
99
+ registerHooks(id, hooks) {
100
+ const entry = { id, hooks };
101
+ this.extraHooks.push(entry);
102
+ return {
103
+ dispose: () => {
104
+ const idx = this.extraHooks.indexOf(entry);
105
+ if (idx >= 0)
106
+ this.extraHooks.splice(idx, 1);
107
+ },
108
+ };
109
+ }
110
+ async loadPluginsIfNeeded() {
111
+ const plugins = this.options.plugins ?? [];
112
+ const autoDiscover = this.options.autoDiscover ?? false;
113
+ const workspaceDirName = this.options.workspaceDirName ?? '.lingyun';
114
+ const workspaceRoot = this.options.workspaceRoot;
115
+ const discovered = await resolveWorkspacePluginPaths({ enabled: autoDiscover, workspaceDirName, workspaceRoot });
116
+ const combined = uniqueStrings([...(plugins || []), ...discovered]);
117
+ const key = JSON.stringify({ combined, workspaceRoot: workspaceRoot || '' });
118
+ if (key === this.loadedKey)
119
+ return;
120
+ this.loadedKey = key;
121
+ this.loadedHooks = [];
122
+ this.pluginTools = [];
123
+ const input = {
124
+ workspaceRoot,
125
+ };
126
+ for (const spec of combined) {
127
+ try {
128
+ const module = await importPluginModule(spec, workspaceRoot);
129
+ const extracted = extractHooksFromModule(module, input);
130
+ for (const entry of extracted) {
131
+ const hooks = await Promise.resolve(entry.hooks);
132
+ if (!hooks)
133
+ continue;
134
+ const pluginId = `${spec}#${entry.id}`;
135
+ this.loadedHooks.push({ id: pluginId, hooks });
136
+ if (hooks.tool && isRecord(hooks.tool)) {
137
+ for (const [toolId, tool] of Object.entries(hooks.tool)) {
138
+ if (!toolId || !tool)
139
+ continue;
140
+ this.pluginTools.push({ pluginId, toolId, tool: tool });
141
+ }
142
+ }
143
+ }
144
+ }
145
+ catch (error) {
146
+ this.options.logger?.(`LingYun SDK: Failed to load plugin ${spec}: ${error instanceof Error ? error.message : String(error)}`);
147
+ }
148
+ }
149
+ }
150
+ async getPluginTools() {
151
+ await this.loadPluginsIfNeeded();
152
+ return [...this.pluginTools];
153
+ }
154
+ async trigger(name, input, output) {
155
+ await this.loadPluginsIfNeeded();
156
+ const all = [...this.extraHooks, ...this.loadedHooks];
157
+ for (const entry of all) {
158
+ const fn = entry.hooks?.[name];
159
+ if (typeof fn !== 'function')
160
+ continue;
161
+ try {
162
+ await fn(input, output);
163
+ }
164
+ catch (error) {
165
+ this.options.logger?.(`LingYun SDK: plugin hook error ${entry.id}.${name}: ${error instanceof Error ? error.message : String(error)}`);
166
+ }
167
+ }
168
+ return output;
169
+ }
170
+ }
171
+ //# sourceMappingURL=pluginManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginManager.js","sourceRoot":"","sources":["../../src/plugins/pluginManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ import type { ToolContext, ToolDefinition, ToolResult } from '../types.js';
2
+ export type LingyunHookName = 'experimental.chat.system.transform' | 'experimental.chat.complete' | 'chat.params' | 'experimental.chat.messages.transform' | 'permission.ask' | 'tool.execute.before' | 'tool.execute.after' | 'experimental.session.compacting' | 'experimental.text.complete';
3
+ export type LingyunPluginInput = {
4
+ workspaceRoot?: string;
5
+ gitRoot?: string;
6
+ projectId?: string;
7
+ storagePath?: string;
8
+ };
9
+ export type LingyunPluginTool = {
10
+ name?: string;
11
+ description: string;
12
+ parameters: ToolDefinition['parameters'];
13
+ metadata?: ToolDefinition['metadata'];
14
+ execute: (args: Record<string, unknown>, context: ToolContext) => Promise<ToolResult | unknown>;
15
+ };
16
+ export type HookPermissionAskInput = {
17
+ tool: string;
18
+ sessionId?: string;
19
+ callId?: string;
20
+ message?: string;
21
+ patterns?: string[];
22
+ metadata?: Record<string, unknown>;
23
+ };
24
+ export type LingyunHooks = {
25
+ tool?: Record<string, LingyunPluginTool>;
26
+ 'experimental.chat.system.transform'?: (input: {
27
+ sessionId?: string;
28
+ mode?: 'plan' | 'build';
29
+ modelId?: string;
30
+ }, output: {
31
+ system: string[];
32
+ }) => void | Promise<void>;
33
+ 'experimental.chat.complete'?: (input: {
34
+ sessionId?: string;
35
+ mode?: 'plan' | 'build';
36
+ modelId?: string;
37
+ messageId: string;
38
+ assistantText: string;
39
+ returnedText: string;
40
+ }, output: Record<string, never>) => void | Promise<void>;
41
+ 'chat.params'?: (input: {
42
+ sessionId?: string;
43
+ mode?: 'plan' | 'build';
44
+ modelId?: string;
45
+ message?: string;
46
+ }, output: {
47
+ temperature?: number;
48
+ topP?: number;
49
+ topK?: number;
50
+ options?: Record<string, unknown>;
51
+ }) => void | Promise<void>;
52
+ 'experimental.chat.messages.transform'?: (input: {
53
+ sessionId?: string;
54
+ mode?: 'plan' | 'build';
55
+ modelId?: string;
56
+ }, output: {
57
+ messages: unknown[];
58
+ }) => void | Promise<void>;
59
+ 'permission.ask'?: (input: HookPermissionAskInput, output: {
60
+ status: 'ask' | 'deny' | 'allow';
61
+ }) => void | Promise<void>;
62
+ 'tool.execute.before'?: (input: {
63
+ tool: string;
64
+ sessionId?: string;
65
+ callId: string;
66
+ }, output: {
67
+ args: unknown;
68
+ }) => void | Promise<void>;
69
+ 'tool.execute.after'?: (input: {
70
+ tool: string;
71
+ sessionId?: string;
72
+ callId: string;
73
+ }, output: {
74
+ title: string;
75
+ output: string;
76
+ metadata: Record<string, unknown>;
77
+ }) => void | Promise<void>;
78
+ 'experimental.session.compacting'?: (input: {
79
+ sessionId?: string;
80
+ }, output: {
81
+ context: string[];
82
+ prompt?: string;
83
+ }) => void | Promise<void>;
84
+ 'experimental.text.complete'?: (input: {
85
+ sessionId?: string;
86
+ messageId: string;
87
+ }, output: {
88
+ text: string;
89
+ }) => void | Promise<void>;
90
+ };
91
+ export type LingyunPluginFactory = (input: LingyunPluginInput) => LingyunHooks | Promise<LingyunHooks>;
92
+ export type LingyunPluginToolEntry = {
93
+ pluginId: string;
94
+ toolId: string;
95
+ tool: LingyunPluginTool;
96
+ };
97
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/plugins/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/plugins/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ export type SkillInfo = {
2
+ name: string;
3
+ description: string;
4
+ filePath: string;
5
+ dir: string;
6
+ source: 'workspace' | 'external';
7
+ };
8
+ export type SkillIndex = {
9
+ skills: SkillInfo[];
10
+ byName: Map<string, SkillInfo>;
11
+ scannedDirs: Array<{
12
+ input: string;
13
+ absPath: string;
14
+ status: 'ok' | 'missing' | 'skipped_external' | 'error';
15
+ reason?: string;
16
+ }>;
17
+ truncated?: boolean;
18
+ };
19
+ export declare function getSkillIndex(options: {
20
+ workspaceRoot?: string;
21
+ searchPaths: string[];
22
+ allowExternalPaths: boolean;
23
+ signal?: AbortSignal;
24
+ }): Promise<SkillIndex>;
25
+ export declare function loadSkillFile(skill: SkillInfo): Promise<{
26
+ content: string;
27
+ }>;
28
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,WAAW,GAAG,UAAU,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC/B,WAAW,EAAE,KAAK,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,IAAI,GAAG,SAAS,GAAG,kBAAkB,GAAG,OAAO,CAAC;QACxD,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAkGF,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,UAAU,CAAC,CA2GtB;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAOlF"}
package/dist/skills.js ADDED
@@ -0,0 +1,188 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { expandHome, isSubPath } from '@kooka/core';
4
+ let cache;
5
+ function resolveSkillDir(input, workspaceRoot) {
6
+ const expanded = expandHome(input);
7
+ const absPath = workspaceRoot && expanded && !path.isAbsolute(expanded)
8
+ ? path.resolve(workspaceRoot, expanded)
9
+ : path.resolve(expanded);
10
+ return {
11
+ absPath,
12
+ inWorkspace: workspaceRoot ? isSubPath(absPath, workspaceRoot) : false,
13
+ };
14
+ }
15
+ function parseFrontmatterBlock(text) {
16
+ const match = text.match(/^---\s*\r?\n([\s\S]*?)\r?\n---\s*\r?\n?/);
17
+ if (!match)
18
+ return null;
19
+ const frontmatter = match[1] ?? '';
20
+ const body = text.slice(match[0].length);
21
+ return { frontmatter, body };
22
+ }
23
+ function parseSimpleYaml(frontmatter) {
24
+ const out = {};
25
+ for (const rawLine of frontmatter.split(/\r?\n/)) {
26
+ const line = rawLine.trim();
27
+ if (!line || line.startsWith('#'))
28
+ continue;
29
+ const m = line.match(/^([A-Za-z0-9_.-]+)\s*:\s*(.*)$/);
30
+ if (!m)
31
+ continue;
32
+ const key = m[1];
33
+ let value = (m[2] ?? '').trim();
34
+ if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
35
+ value = value.slice(1, -1);
36
+ }
37
+ out[key] = value;
38
+ }
39
+ return out;
40
+ }
41
+ function parseSkillMarkdown(text) {
42
+ const fm = parseFrontmatterBlock(text);
43
+ if (!fm)
44
+ return undefined;
45
+ const data = parseSimpleYaml(fm.frontmatter);
46
+ const name = (data.name || '').trim();
47
+ const description = (data.description || '').trim();
48
+ if (!name || !description)
49
+ return undefined;
50
+ return { name, description, body: fm.body.trim() };
51
+ }
52
+ async function scanForSkillFiles(rootDir, options) {
53
+ const results = [];
54
+ const maxFiles = options.maxFiles ?? 200;
55
+ const walk = async (dir) => {
56
+ if (options.signal?.aborted)
57
+ return;
58
+ if (results.length >= maxFiles)
59
+ return;
60
+ let entries;
61
+ try {
62
+ entries = await fs.promises.readdir(dir, { withFileTypes: true });
63
+ }
64
+ catch {
65
+ return;
66
+ }
67
+ for (const entry of entries) {
68
+ if (options.signal?.aborted)
69
+ return;
70
+ if (results.length >= maxFiles)
71
+ return;
72
+ if (entry.isSymbolicLink())
73
+ continue;
74
+ const full = path.join(dir, entry.name);
75
+ if (entry.isDirectory()) {
76
+ await walk(full);
77
+ continue;
78
+ }
79
+ if (entry.isFile() && entry.name === 'SKILL.md') {
80
+ results.push(full);
81
+ }
82
+ }
83
+ };
84
+ await walk(rootDir);
85
+ return results;
86
+ }
87
+ export async function getSkillIndex(options) {
88
+ const workspaceRoot = options.workspaceRoot ? path.resolve(options.workspaceRoot) : undefined;
89
+ const searchPaths = (Array.isArray(options.searchPaths) ? options.searchPaths : [])
90
+ .map((p) => (typeof p === 'string' ? p.trim() : ''))
91
+ .filter(Boolean);
92
+ const allowExternalPaths = !!options.allowExternalPaths;
93
+ const key = JSON.stringify({
94
+ workspaceRoot: workspaceRoot ?? '',
95
+ allowExternalPaths,
96
+ searchPaths,
97
+ });
98
+ if (cache && cache.key === key && !cache.invalidated && Date.now() - cache.builtAt < 3000) {
99
+ return cache.promise;
100
+ }
101
+ const build = async () => {
102
+ const scannedDirs = [];
103
+ const byName = new Map();
104
+ const maxSkills = 200;
105
+ let truncated = false;
106
+ for (const input of searchPaths) {
107
+ if (options.signal?.aborted)
108
+ break;
109
+ const resolved = resolveSkillDir(input, workspaceRoot);
110
+ const absPath = resolved.absPath;
111
+ const isExternalDir = workspaceRoot ? !isSubPath(absPath, workspaceRoot) : path.isAbsolute(absPath);
112
+ if (isExternalDir && !allowExternalPaths) {
113
+ scannedDirs.push({
114
+ input,
115
+ absPath,
116
+ status: 'skipped_external',
117
+ reason: 'External paths disabled',
118
+ });
119
+ continue;
120
+ }
121
+ let stat;
122
+ try {
123
+ stat = await fs.promises.stat(absPath);
124
+ }
125
+ catch {
126
+ scannedDirs.push({ input, absPath, status: 'missing' });
127
+ continue;
128
+ }
129
+ if (!stat.isDirectory()) {
130
+ scannedDirs.push({ input, absPath, status: 'error', reason: 'Not a directory' });
131
+ continue;
132
+ }
133
+ scannedDirs.push({ input, absPath, status: 'ok' });
134
+ const files = await scanForSkillFiles(absPath, { signal: options.signal, maxFiles: 1000 });
135
+ files.sort((a, b) => a.localeCompare(b));
136
+ for (const filePath of files) {
137
+ if (options.signal?.aborted)
138
+ break;
139
+ if (byName.size >= maxSkills) {
140
+ truncated = true;
141
+ break;
142
+ }
143
+ let text;
144
+ try {
145
+ text = await fs.promises.readFile(filePath, 'utf8');
146
+ }
147
+ catch {
148
+ continue;
149
+ }
150
+ const parsed = parseSkillMarkdown(text);
151
+ if (!parsed)
152
+ continue;
153
+ const source = workspaceRoot && isSubPath(filePath, workspaceRoot) ? 'workspace' : 'external';
154
+ const dir = path.dirname(filePath);
155
+ byName.set(parsed.name, {
156
+ name: parsed.name,
157
+ description: parsed.description,
158
+ filePath,
159
+ dir,
160
+ source,
161
+ });
162
+ }
163
+ }
164
+ const skills = Array.from(byName.values()).sort((a, b) => a.name.localeCompare(b.name));
165
+ return {
166
+ skills,
167
+ byName,
168
+ scannedDirs,
169
+ ...(truncated ? { truncated: true } : {}),
170
+ };
171
+ };
172
+ cache = {
173
+ key,
174
+ builtAt: Date.now(),
175
+ promise: build(),
176
+ invalidated: false,
177
+ };
178
+ return cache.promise;
179
+ }
180
+ export async function loadSkillFile(skill) {
181
+ const text = await fs.promises.readFile(skill.filePath, 'utf8');
182
+ const parsed = parseSkillMarkdown(text);
183
+ if (!parsed) {
184
+ throw new Error('Invalid SKILL.md: missing frontmatter (name/description)');
185
+ }
186
+ return { content: parsed.body.trim() };
187
+ }
188
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ToolDefinition, ToolHandler } from '../../types.js';
2
+ export declare const bashTool: ToolDefinition;
3
+ export declare const bashHandler: ToolHandler;
4
+ //# sourceMappingURL=bash.d.ts.map