@harness-kernel/skills 0.0.0 → 0.5.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.
- package/README.md +73 -1
- package/dist/chunk-6XTSIVQV.js +219 -0
- package/dist/chunk-6XTSIVQV.js.map +1 -0
- package/dist/chunk-BF5PYWY6.js +55 -0
- package/dist/chunk-BF5PYWY6.js.map +1 -0
- package/dist/chunk-FUZYYJJU.js +57 -0
- package/dist/chunk-FUZYYJJU.js.map +1 -0
- package/dist/chunk-L3KCYHUW.js +24 -0
- package/dist/chunk-L3KCYHUW.js.map +1 -0
- package/dist/chunk-SIAWNALF.js +196 -0
- package/dist/chunk-SIAWNALF.js.map +1 -0
- package/dist/chunk-TC7PNGST.js +41 -0
- package/dist/chunk-TC7PNGST.js.map +1 -0
- package/dist/chunk-THKBSLCD.js +84 -0
- package/dist/chunk-THKBSLCD.js.map +1 -0
- package/dist/events.d.ts +70 -0
- package/dist/events.js +15 -0
- package/dist/events.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.js +94 -0
- package/dist/index.js.map +1 -0
- package/dist/logs.d.ts +46 -0
- package/dist/logs.js +13 -0
- package/dist/logs.js.map +1 -0
- package/dist/provider.d.ts +20 -0
- package/dist/provider.js +13 -0
- package/dist/provider.js.map +1 -0
- package/dist/registry.d.ts +26 -0
- package/dist/registry.js +9 -0
- package/dist/registry.js.map +1 -0
- package/dist/skill.d.ts +22 -0
- package/dist/skill.js +7 -0
- package/dist/skill.js.map +1 -0
- package/dist/state.d.ts +55 -0
- package/dist/state.js +26 -0
- package/dist/state.js.map +1 -0
- package/dist/tools.d.ts +70 -0
- package/dist/tools.js +23 -0
- package/dist/tools.js.map +1 -0
- package/package.json +48 -10
- package/index.d.ts +0 -1
- package/index.js +0 -1
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SkillActivatedEvent,
|
|
3
|
+
SkillActivationRequestedEvent,
|
|
4
|
+
SkillDeactivatedEvent
|
|
5
|
+
} from "./chunk-FUZYYJJU.js";
|
|
6
|
+
import {
|
|
7
|
+
SkillActivatedLog,
|
|
8
|
+
SkillActivationRequestedLog,
|
|
9
|
+
SkillDeactivatedLog
|
|
10
|
+
} from "./chunk-TC7PNGST.js";
|
|
11
|
+
import {
|
|
12
|
+
toSkillRegistry
|
|
13
|
+
} from "./chunk-BF5PYWY6.js";
|
|
14
|
+
|
|
15
|
+
// src/state.ts
|
|
16
|
+
var DEFAULT_SKILL_STATE_KEY = "skills";
|
|
17
|
+
function nowIso() {
|
|
18
|
+
return (/* @__PURE__ */ new Date()).toISOString();
|
|
19
|
+
}
|
|
20
|
+
function stateKey(options) {
|
|
21
|
+
return options?.stateKey?.trim() || DEFAULT_SKILL_STATE_KEY;
|
|
22
|
+
}
|
|
23
|
+
function isRecord(value) {
|
|
24
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
25
|
+
}
|
|
26
|
+
function readSharedState(sessionOrState) {
|
|
27
|
+
if (isRecord(sessionOrState) && isRecord(sessionOrState.state) && typeof sessionOrState.state.get === "function") {
|
|
28
|
+
return sessionOrState.state.get();
|
|
29
|
+
}
|
|
30
|
+
return sessionOrState;
|
|
31
|
+
}
|
|
32
|
+
function normalizeActiveSkill(key, value) {
|
|
33
|
+
if (!isRecord(value)) return void 0;
|
|
34
|
+
const storedKey = typeof value.key === "string" && value.key.trim() ? value.key.trim() : key;
|
|
35
|
+
const activatedAt = typeof value.activatedAt === "string" && value.activatedAt.trim() ? value.activatedAt : nowIso();
|
|
36
|
+
return {
|
|
37
|
+
key: storedKey,
|
|
38
|
+
activatedAt,
|
|
39
|
+
...typeof value.activatedByToolCallId === "string" && value.activatedByToolCallId.trim() ? { activatedByToolCallId: value.activatedByToolCallId } : {},
|
|
40
|
+
...typeof value.reason === "string" && value.reason.trim() ? { reason: value.reason } : {}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function skillCatalogEntry(skill, options) {
|
|
44
|
+
return toSkillRegistry([skill]).catalog(options)[0];
|
|
45
|
+
}
|
|
46
|
+
function getSkillState(sessionOrState, options) {
|
|
47
|
+
const sharedState = readSharedState(sessionOrState);
|
|
48
|
+
const raw = sharedState[stateKey(options)];
|
|
49
|
+
if (!isRecord(raw) || !isRecord(raw.active)) return { active: {} };
|
|
50
|
+
const active = {};
|
|
51
|
+
for (const [key, value] of Object.entries(raw.active)) {
|
|
52
|
+
const normalized = normalizeActiveSkill(key, value);
|
|
53
|
+
if (normalized) active[key] = normalized;
|
|
54
|
+
}
|
|
55
|
+
return { active };
|
|
56
|
+
}
|
|
57
|
+
function setSkillState(session, state, options) {
|
|
58
|
+
session.state.update({
|
|
59
|
+
[stateKey(options)]: {
|
|
60
|
+
active: { ...state.active }
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
function listAvailableSkills(registry, options) {
|
|
65
|
+
return toSkillRegistry(registry).catalog(options);
|
|
66
|
+
}
|
|
67
|
+
function listActiveSkills(sessionOrState, registry, options) {
|
|
68
|
+
const skillState = getSkillState(sessionOrState, options);
|
|
69
|
+
return toSkillRegistry(registry).list().filter((skill) => Boolean(skillState.active[skill.key])).map((skill) => ({ ...skillCatalogEntry(skill, options), active: true }));
|
|
70
|
+
}
|
|
71
|
+
function listInactiveSkills(sessionOrState, registry, options) {
|
|
72
|
+
const skillState = getSkillState(sessionOrState, options);
|
|
73
|
+
return toSkillRegistry(registry).list().filter((skill) => !skillState.active[skill.key]).map((skill) => ({ ...skillCatalogEntry(skill, options), active: false }));
|
|
74
|
+
}
|
|
75
|
+
function isSkillActive(sessionOrState, key, options) {
|
|
76
|
+
return Boolean(getSkillState(sessionOrState, options).active[key]);
|
|
77
|
+
}
|
|
78
|
+
async function activateSkill(session, registry, input, options) {
|
|
79
|
+
const key = input.key.trim();
|
|
80
|
+
const skills = toSkillRegistry(registry);
|
|
81
|
+
const skill = skills.get(key);
|
|
82
|
+
const alreadyActive = isSkillActive(session, key, options);
|
|
83
|
+
const known = Boolean(skill);
|
|
84
|
+
await session.events.emit(SkillActivationRequestedEvent, {
|
|
85
|
+
key,
|
|
86
|
+
...input.reason ? { reason: input.reason } : {},
|
|
87
|
+
known,
|
|
88
|
+
alreadyActive
|
|
89
|
+
});
|
|
90
|
+
session.log.emit(SkillActivationRequestedLog, {
|
|
91
|
+
skillKey: key,
|
|
92
|
+
known,
|
|
93
|
+
alreadyActive,
|
|
94
|
+
reason: input.reason
|
|
95
|
+
});
|
|
96
|
+
if (!skill) {
|
|
97
|
+
return {
|
|
98
|
+
ok: false,
|
|
99
|
+
key,
|
|
100
|
+
known: false,
|
|
101
|
+
alreadyActive,
|
|
102
|
+
code: "skill.unknown",
|
|
103
|
+
availableSkills: skills.catalog({ includeToolNames: true })
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
let active = getSkillState(session, options).active[key];
|
|
107
|
+
if (!active) {
|
|
108
|
+
active = {
|
|
109
|
+
key,
|
|
110
|
+
activatedAt: nowIso(),
|
|
111
|
+
...session.toolCall?.id ? { activatedByToolCallId: session.toolCall.id } : {},
|
|
112
|
+
...input.reason ? { reason: input.reason } : {}
|
|
113
|
+
};
|
|
114
|
+
const current = getSkillState(session, options);
|
|
115
|
+
setSkillState(session, {
|
|
116
|
+
active: {
|
|
117
|
+
...current.active,
|
|
118
|
+
[key]: active
|
|
119
|
+
}
|
|
120
|
+
}, options);
|
|
121
|
+
}
|
|
122
|
+
await session.events.emit(SkillActivatedEvent, {
|
|
123
|
+
key,
|
|
124
|
+
...skill.label ? { label: skill.label } : {},
|
|
125
|
+
...input.reason ? { reason: input.reason } : {},
|
|
126
|
+
alreadyActive,
|
|
127
|
+
...active.activatedByToolCallId ? { activatedByToolCallId: active.activatedByToolCallId } : {}
|
|
128
|
+
});
|
|
129
|
+
session.log.emit(SkillActivatedLog, {
|
|
130
|
+
skillKey: key,
|
|
131
|
+
label: skill.label,
|
|
132
|
+
alreadyActive
|
|
133
|
+
});
|
|
134
|
+
return {
|
|
135
|
+
ok: true,
|
|
136
|
+
key,
|
|
137
|
+
known: true,
|
|
138
|
+
alreadyActive,
|
|
139
|
+
skill: skillCatalogEntry(skill, { includeToolNames: true }),
|
|
140
|
+
active
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
async function deactivateSkill(session, registry, input, options) {
|
|
144
|
+
const key = input.key.trim();
|
|
145
|
+
const skills = toSkillRegistry(registry);
|
|
146
|
+
const skill = skills.get(key);
|
|
147
|
+
if (!skill) {
|
|
148
|
+
return {
|
|
149
|
+
ok: false,
|
|
150
|
+
key,
|
|
151
|
+
known: false,
|
|
152
|
+
alreadyInactive: true,
|
|
153
|
+
code: "skill.unknown",
|
|
154
|
+
availableSkills: skills.catalog({ includeToolNames: true })
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
const current = getSkillState(session, options);
|
|
158
|
+
const alreadyInactive = !current.active[key];
|
|
159
|
+
if (!alreadyInactive) {
|
|
160
|
+
const nextActive = { ...current.active };
|
|
161
|
+
delete nextActive[key];
|
|
162
|
+
setSkillState(session, { active: nextActive }, options);
|
|
163
|
+
}
|
|
164
|
+
await session.events.emit(SkillDeactivatedEvent, {
|
|
165
|
+
key,
|
|
166
|
+
...skill.label ? { label: skill.label } : {},
|
|
167
|
+
...input.reason ? { reason: input.reason } : {},
|
|
168
|
+
alreadyInactive,
|
|
169
|
+
...session.toolCall?.id ? { deactivatedByToolCallId: session.toolCall.id } : {}
|
|
170
|
+
});
|
|
171
|
+
session.log.emit(SkillDeactivatedLog, {
|
|
172
|
+
skillKey: key,
|
|
173
|
+
label: skill.label,
|
|
174
|
+
alreadyInactive
|
|
175
|
+
});
|
|
176
|
+
return {
|
|
177
|
+
ok: true,
|
|
178
|
+
key,
|
|
179
|
+
known: true,
|
|
180
|
+
alreadyInactive,
|
|
181
|
+
skill: skillCatalogEntry(skill, { includeToolNames: true })
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export {
|
|
186
|
+
DEFAULT_SKILL_STATE_KEY,
|
|
187
|
+
getSkillState,
|
|
188
|
+
setSkillState,
|
|
189
|
+
listAvailableSkills,
|
|
190
|
+
listActiveSkills,
|
|
191
|
+
listInactiveSkills,
|
|
192
|
+
isSkillActive,
|
|
193
|
+
activateSkill,
|
|
194
|
+
deactivateSkill
|
|
195
|
+
};
|
|
196
|
+
//# sourceMappingURL=chunk-SIAWNALF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/state.ts"],"sourcesContent":["import type {\n AgentActionSession,\n AgentReadSession,\n AgentSharedState,\n} from \"@harness-kernel/core\";\nimport type { HarnessSkill } from \"./skill.js\";\nimport {\n type SkillCatalogEntry,\n type SkillCatalogOptions,\n type SkillRegistry,\n toSkillRegistry,\n} from \"./registry.js\";\nimport {\n SkillActivatedEvent,\n SkillActivationRequestedEvent,\n SkillDeactivatedEvent,\n} from \"./events.js\";\nimport {\n SkillActivatedLog,\n SkillActivationRequestedLog,\n SkillDeactivatedLog,\n} from \"./logs.js\";\n\nexport const DEFAULT_SKILL_STATE_KEY = \"skills\";\n\nexport interface SkillStateOptions {\n stateKey?: string;\n}\n\nexport interface ActiveSkillState {\n key: string;\n activatedAt: string;\n activatedByToolCallId?: string;\n reason?: string;\n}\n\nexport interface SkillState {\n active: Record<string, ActiveSkillState>;\n}\n\nexport type SkillErrorCode = \"skill.unknown\" | \"skill.required\";\n\nexport interface SkillActivationResult {\n ok: boolean;\n key: string;\n known: boolean;\n alreadyActive: boolean;\n skill?: SkillCatalogEntry;\n active?: ActiveSkillState;\n code?: \"skill.unknown\";\n availableSkills?: SkillCatalogEntry[];\n}\n\nexport interface SkillDeactivationResult {\n ok: boolean;\n key: string;\n known: boolean;\n alreadyInactive: boolean;\n skill?: SkillCatalogEntry;\n code?: \"skill.unknown\";\n availableSkills?: SkillCatalogEntry[];\n}\n\nexport interface SkillToolOptions extends SkillStateOptions {}\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction stateKey(options?: SkillStateOptions): string {\n return options?.stateKey?.trim() || DEFAULT_SKILL_STATE_KEY;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction readSharedState(sessionOrState: AgentReadSession | AgentSharedState): AgentSharedState {\n if (\n isRecord(sessionOrState)\n && isRecord(sessionOrState.state)\n && typeof sessionOrState.state.get === \"function\"\n ) {\n return sessionOrState.state.get() as AgentSharedState;\n }\n return sessionOrState as AgentSharedState;\n}\n\nfunction normalizeActiveSkill(key: string, value: unknown): ActiveSkillState | undefined {\n if (!isRecord(value)) return undefined;\n const storedKey = typeof value.key === \"string\" && value.key.trim() ? value.key.trim() : key;\n const activatedAt = typeof value.activatedAt === \"string\" && value.activatedAt.trim()\n ? value.activatedAt\n : nowIso();\n return {\n key: storedKey,\n activatedAt,\n ...(typeof value.activatedByToolCallId === \"string\" && value.activatedByToolCallId.trim()\n ? { activatedByToolCallId: value.activatedByToolCallId }\n : {}),\n ...(typeof value.reason === \"string\" && value.reason.trim() ? { reason: value.reason } : {}),\n };\n}\n\nfunction skillCatalogEntry(skill: HarnessSkill, options?: SkillCatalogOptions): SkillCatalogEntry {\n return toSkillRegistry([skill]).catalog(options)[0]!;\n}\n\nexport function getSkillState(\n sessionOrState: AgentReadSession | AgentSharedState,\n options?: SkillStateOptions,\n): SkillState {\n const sharedState = readSharedState(sessionOrState);\n const raw = sharedState[stateKey(options)];\n if (!isRecord(raw) || !isRecord(raw.active)) return { active: {} };\n\n const active: Record<string, ActiveSkillState> = {};\n for (const [key, value] of Object.entries(raw.active)) {\n const normalized = normalizeActiveSkill(key, value);\n if (normalized) active[key] = normalized;\n }\n return { active };\n}\n\nexport function setSkillState(\n session: AgentActionSession,\n state: SkillState,\n options?: SkillStateOptions,\n): void {\n session.state.update({\n [stateKey(options)]: {\n active: { ...state.active },\n },\n } as Partial<AgentSharedState>);\n}\n\nexport function listAvailableSkills(\n registry: SkillRegistry | HarnessSkill[],\n options?: SkillCatalogOptions,\n): SkillCatalogEntry[] {\n return toSkillRegistry(registry).catalog(options);\n}\n\nexport function listActiveSkills(\n sessionOrState: AgentReadSession | AgentSharedState,\n registry: SkillRegistry | HarnessSkill[],\n options?: SkillCatalogOptions & SkillStateOptions,\n): SkillCatalogEntry[] {\n const skillState = getSkillState(sessionOrState, options);\n return toSkillRegistry(registry)\n .list()\n .filter((skill) => Boolean(skillState.active[skill.key]))\n .map((skill) => ({ ...skillCatalogEntry(skill, options), active: true }));\n}\n\nexport function listInactiveSkills(\n sessionOrState: AgentReadSession | AgentSharedState,\n registry: SkillRegistry | HarnessSkill[],\n options?: SkillCatalogOptions & SkillStateOptions,\n): SkillCatalogEntry[] {\n const skillState = getSkillState(sessionOrState, options);\n return toSkillRegistry(registry)\n .list()\n .filter((skill) => !skillState.active[skill.key])\n .map((skill) => ({ ...skillCatalogEntry(skill, options), active: false }));\n}\n\nexport function isSkillActive(\n sessionOrState: AgentReadSession | AgentSharedState,\n key: string,\n options?: SkillStateOptions,\n): boolean {\n return Boolean(getSkillState(sessionOrState, options).active[key]);\n}\n\nexport async function activateSkill(\n session: AgentActionSession,\n registry: SkillRegistry | HarnessSkill[],\n input: { key: string; reason?: string },\n options?: SkillToolOptions,\n): Promise<SkillActivationResult> {\n const key = input.key.trim();\n const skills = toSkillRegistry(registry);\n const skill = skills.get(key);\n const alreadyActive = isSkillActive(session, key, options);\n const known = Boolean(skill);\n\n await session.events.emit(SkillActivationRequestedEvent, {\n key,\n ...(input.reason ? { reason: input.reason } : {}),\n known,\n alreadyActive,\n });\n session.log.emit(SkillActivationRequestedLog, {\n skillKey: key,\n known,\n alreadyActive,\n reason: input.reason,\n });\n\n if (!skill) {\n return {\n ok: false,\n key,\n known: false,\n alreadyActive,\n code: \"skill.unknown\",\n availableSkills: skills.catalog({ includeToolNames: true }),\n };\n }\n\n let active = getSkillState(session, options).active[key];\n if (!active) {\n active = {\n key,\n activatedAt: nowIso(),\n ...(session.toolCall?.id ? { activatedByToolCallId: session.toolCall.id } : {}),\n ...(input.reason ? { reason: input.reason } : {}),\n };\n const current = getSkillState(session, options);\n setSkillState(session, {\n active: {\n ...current.active,\n [key]: active,\n },\n }, options);\n }\n\n await session.events.emit(SkillActivatedEvent, {\n key,\n ...(skill.label ? { label: skill.label } : {}),\n ...(input.reason ? { reason: input.reason } : {}),\n alreadyActive,\n ...(active.activatedByToolCallId ? { activatedByToolCallId: active.activatedByToolCallId } : {}),\n });\n session.log.emit(SkillActivatedLog, {\n skillKey: key,\n label: skill.label,\n alreadyActive,\n });\n\n return {\n ok: true,\n key,\n known: true,\n alreadyActive,\n skill: skillCatalogEntry(skill, { includeToolNames: true }),\n active,\n };\n}\n\nexport async function deactivateSkill(\n session: AgentActionSession,\n registry: SkillRegistry | HarnessSkill[],\n input: { key: string; reason?: string },\n options?: SkillToolOptions,\n): Promise<SkillDeactivationResult> {\n const key = input.key.trim();\n const skills = toSkillRegistry(registry);\n const skill = skills.get(key);\n if (!skill) {\n return {\n ok: false,\n key,\n known: false,\n alreadyInactive: true,\n code: \"skill.unknown\",\n availableSkills: skills.catalog({ includeToolNames: true }),\n };\n }\n\n const current = getSkillState(session, options);\n const alreadyInactive = !current.active[key];\n if (!alreadyInactive) {\n const nextActive = { ...current.active };\n delete nextActive[key];\n setSkillState(session, { active: nextActive }, options);\n }\n\n await session.events.emit(SkillDeactivatedEvent, {\n key,\n ...(skill.label ? { label: skill.label } : {}),\n ...(input.reason ? { reason: input.reason } : {}),\n alreadyInactive,\n ...(session.toolCall?.id ? { deactivatedByToolCallId: session.toolCall.id } : {}),\n });\n session.log.emit(SkillDeactivatedLog, {\n skillKey: key,\n label: skill.label,\n alreadyInactive,\n });\n\n return {\n ok: true,\n key,\n known: true,\n alreadyInactive,\n skill: skillCatalogEntry(skill, { includeToolNames: true }),\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// src/logs.ts
|
|
2
|
+
import { HarnessLog } from "@harness-kernel/core/runner/logging";
|
|
3
|
+
var SkillActivationRequestedLog = class extends HarnessLog {
|
|
4
|
+
level = "info";
|
|
5
|
+
category = "agent";
|
|
6
|
+
levelFor(fields) {
|
|
7
|
+
return fields.known ? "info" : "warn";
|
|
8
|
+
}
|
|
9
|
+
message(fields) {
|
|
10
|
+
return `skill.activation.requested key=${fields.skillKey} known=${fields.known} alreadyActive=${fields.alreadyActive}`;
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
var SkillActivatedLog = class extends HarnessLog {
|
|
14
|
+
level = "info";
|
|
15
|
+
category = "agent";
|
|
16
|
+
message(fields) {
|
|
17
|
+
return `skill.activated key=${fields.skillKey} alreadyActive=${fields.alreadyActive}`;
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
var SkillDeactivatedLog = class extends HarnessLog {
|
|
21
|
+
level = "info";
|
|
22
|
+
category = "agent";
|
|
23
|
+
message(fields) {
|
|
24
|
+
return `skill.deactivated key=${fields.skillKey} alreadyInactive=${fields.alreadyInactive}`;
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
var SkillRequiredLog = class extends HarnessLog {
|
|
28
|
+
level = "warn";
|
|
29
|
+
category = "tool";
|
|
30
|
+
message(fields) {
|
|
31
|
+
return `skill.required key=${fields.skillKey} tool=${fields.toolName} reason=${fields.reason}`;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export {
|
|
36
|
+
SkillActivationRequestedLog,
|
|
37
|
+
SkillActivatedLog,
|
|
38
|
+
SkillDeactivatedLog,
|
|
39
|
+
SkillRequiredLog
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=chunk-TC7PNGST.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/logs.ts"],"sourcesContent":["import { HarnessLog } from \"@harness-kernel/core/runner/logging\";\n\nexport interface SkillActivationRequestedLogFields {\n skillKey: string;\n known: boolean;\n alreadyActive: boolean;\n reason?: string;\n}\n\nexport interface SkillActivatedLogFields {\n skillKey: string;\n label?: string;\n alreadyActive: boolean;\n}\n\nexport interface SkillDeactivatedLogFields {\n skillKey: string;\n label?: string;\n alreadyInactive: boolean;\n}\n\nexport interface SkillRequiredLogFields {\n skillKey: string;\n toolName: string;\n reason: \"inactive\" | \"unknown\";\n}\n\nexport class SkillActivationRequestedLog extends HarnessLog<SkillActivationRequestedLogFields> {\n level = \"info\" as const;\n category = \"agent\" as const;\n\n levelFor(fields: SkillActivationRequestedLogFields): \"info\" | \"warn\" {\n return fields.known ? \"info\" : \"warn\";\n }\n\n message(fields: SkillActivationRequestedLogFields): string {\n return `skill.activation.requested key=${fields.skillKey} known=${fields.known} alreadyActive=${fields.alreadyActive}`;\n }\n}\n\nexport class SkillActivatedLog extends HarnessLog<SkillActivatedLogFields> {\n level = \"info\" as const;\n category = \"agent\" as const;\n\n message(fields: SkillActivatedLogFields): string {\n return `skill.activated key=${fields.skillKey} alreadyActive=${fields.alreadyActive}`;\n }\n}\n\nexport class SkillDeactivatedLog extends HarnessLog<SkillDeactivatedLogFields> {\n level = \"info\" as const;\n category = \"agent\" as const;\n\n message(fields: SkillDeactivatedLogFields): string {\n return `skill.deactivated key=${fields.skillKey} alreadyInactive=${fields.alreadyInactive}`;\n }\n}\n\nexport class SkillRequiredLog extends HarnessLog<SkillRequiredLogFields> {\n level = \"warn\" as const;\n category = \"tool\" as const;\n\n message(fields: SkillRequiredLogFields): string {\n return `skill.required key=${fields.skillKey} tool=${fields.toolName} reason=${fields.reason}`;\n }\n}\n"],"mappings":";AAAA,SAAS,kBAAkB;AA2BpB,IAAM,8BAAN,cAA0C,WAA8C;AAAA,EAC7F,QAAQ;AAAA,EACR,WAAW;AAAA,EAEX,SAAS,QAA4D;AACnE,WAAO,OAAO,QAAQ,SAAS;AAAA,EACjC;AAAA,EAEA,QAAQ,QAAmD;AACzD,WAAO,kCAAkC,OAAO,QAAQ,UAAU,OAAO,KAAK,kBAAkB,OAAO,aAAa;AAAA,EACtH;AACF;AAEO,IAAM,oBAAN,cAAgC,WAAoC;AAAA,EACzE,QAAQ;AAAA,EACR,WAAW;AAAA,EAEX,QAAQ,QAAyC;AAC/C,WAAO,uBAAuB,OAAO,QAAQ,kBAAkB,OAAO,aAAa;AAAA,EACrF;AACF;AAEO,IAAM,sBAAN,cAAkC,WAAsC;AAAA,EAC7E,QAAQ;AAAA,EACR,WAAW;AAAA,EAEX,QAAQ,QAA2C;AACjD,WAAO,yBAAyB,OAAO,QAAQ,oBAAoB,OAAO,eAAe;AAAA,EAC3F;AACF;AAEO,IAAM,mBAAN,cAA+B,WAAmC;AAAA,EACvE,QAAQ;AAAA,EACR,WAAW;AAAA,EAEX,QAAQ,QAAwC;AAC9C,WAAO,sBAAsB,OAAO,QAAQ,SAAS,OAAO,QAAQ,WAAW,OAAO,MAAM;AAAA,EAC9F;AACF;","names":[]}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import {
|
|
2
|
+
listActiveSkills,
|
|
3
|
+
listAvailableSkills,
|
|
4
|
+
listInactiveSkills
|
|
5
|
+
} from "./chunk-SIAWNALF.js";
|
|
6
|
+
import {
|
|
7
|
+
toSkillRegistry
|
|
8
|
+
} from "./chunk-BF5PYWY6.js";
|
|
9
|
+
|
|
10
|
+
// src/provider.ts
|
|
11
|
+
import {
|
|
12
|
+
HarnessContextProvider,
|
|
13
|
+
systemRole
|
|
14
|
+
} from "@harness-kernel/core";
|
|
15
|
+
function renderTools(toolNames) {
|
|
16
|
+
return toolNames?.length ? ` Tools: ${toolNames.join(", ")}.` : "";
|
|
17
|
+
}
|
|
18
|
+
function renderCatalogLine(entry) {
|
|
19
|
+
const label = entry.label && entry.label !== entry.key ? ` (${entry.label})` : "";
|
|
20
|
+
return `- ${entry.key}${label}: ${entry.description}.${renderTools(entry.toolNames)}`;
|
|
21
|
+
}
|
|
22
|
+
var SkillPromptProvider = class extends HarnessContextProvider {
|
|
23
|
+
constructor(registry, defaults = {}) {
|
|
24
|
+
super();
|
|
25
|
+
this.registry = registry;
|
|
26
|
+
this.defaults = defaults;
|
|
27
|
+
this.role = defaults.role ?? systemRole;
|
|
28
|
+
}
|
|
29
|
+
registry;
|
|
30
|
+
defaults;
|
|
31
|
+
label = "Skill Context";
|
|
32
|
+
async render(session, options) {
|
|
33
|
+
const config = { ...this.defaults, ...options };
|
|
34
|
+
const includeInactiveCatalog = config.includeInactiveCatalog ?? true;
|
|
35
|
+
const includeToolNames = config.includeToolNames ?? true;
|
|
36
|
+
const catalogOptions = { includeToolNames, includeMetadata: false };
|
|
37
|
+
const available = listAvailableSkills(this.registry, catalogOptions);
|
|
38
|
+
const active = listActiveSkills(session, this.registry, { ...catalogOptions, stateKey: config.stateKey });
|
|
39
|
+
const inactive = listInactiveSkills(session, this.registry, { ...catalogOptions, stateKey: config.stateKey });
|
|
40
|
+
const activeKeys = new Set(active.map((entry) => entry.key));
|
|
41
|
+
const activeSkills = this.registry.list().filter((skill) => activeKeys.has(skill.key));
|
|
42
|
+
const activePrompts = [];
|
|
43
|
+
for (const skill of activeSkills) {
|
|
44
|
+
if (!skill.prompt) continue;
|
|
45
|
+
const prompt = typeof skill.prompt === "function" ? await skill.prompt(session, skill) : skill.prompt;
|
|
46
|
+
if (!prompt.trim()) continue;
|
|
47
|
+
activePrompts.push(`## ${skill.label ?? skill.key} (${skill.key})
|
|
48
|
+
${prompt.trim()}`);
|
|
49
|
+
}
|
|
50
|
+
const sections = [
|
|
51
|
+
"Skills are procedural capabilities. Activate a skill with activate_skill before using gated tools from that skill.",
|
|
52
|
+
'A gated tool that is called too early returns data.code = "skill.required" and names the required skill.',
|
|
53
|
+
`Active skills: ${active.length ? active.map((entry) => entry.key).join(", ") : "none"}.`
|
|
54
|
+
];
|
|
55
|
+
if (includeInactiveCatalog) {
|
|
56
|
+
sections.push([
|
|
57
|
+
"Available skills:",
|
|
58
|
+
...available.length ? available.map(renderCatalogLine) : ["- none"]
|
|
59
|
+
].join("\n"));
|
|
60
|
+
sections.push(`Inactive skills: ${inactive.length ? inactive.map((entry) => entry.key).join(", ") : "none"}.`);
|
|
61
|
+
}
|
|
62
|
+
if (activePrompts.length) {
|
|
63
|
+
sections.push(["Active skill instructions:", ...activePrompts].join("\n\n"));
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
role: config.role ?? this.role ?? systemRole,
|
|
67
|
+
content: sections.join("\n\n"),
|
|
68
|
+
metadata: {
|
|
69
|
+
stateKey: config.stateKey,
|
|
70
|
+
activeSkills: active.map((entry) => entry.key),
|
|
71
|
+
availableSkills: available.map((entry) => entry.key)
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
function createSkillPromptProvider(registry, options) {
|
|
77
|
+
return new SkillPromptProvider(toSkillRegistry(registry), options);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export {
|
|
81
|
+
SkillPromptProvider,
|
|
82
|
+
createSkillPromptProvider
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=chunk-THKBSLCD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/provider.ts"],"sourcesContent":["import {\n HarnessContextProvider,\n systemRole,\n type AgentReadSession,\n type ContextProviderOutput,\n type HarnessRoleSelector,\n type JsonObject,\n} from \"@harness-kernel/core\";\nimport type { HarnessSkill } from \"./skill.js\";\nimport { type SkillRegistry, toSkillRegistry } from \"./registry.js\";\nimport {\n listActiveSkills,\n listAvailableSkills,\n listInactiveSkills,\n type SkillStateOptions,\n} from \"./state.js\";\n\nexport interface SkillPromptProviderOptions extends SkillStateOptions, JsonObject {\n includeInactiveCatalog?: boolean;\n includeToolNames?: boolean;\n role?: HarnessRoleSelector;\n}\n\nfunction renderTools(toolNames: string[] | undefined): string {\n return toolNames?.length ? ` Tools: ${toolNames.join(\", \")}.` : \"\";\n}\n\nfunction renderCatalogLine(entry: {\n key: string;\n label?: string;\n description: string;\n toolNames?: string[];\n}): string {\n const label = entry.label && entry.label !== entry.key ? ` (${entry.label})` : \"\";\n return `- ${entry.key}${label}: ${entry.description}.${renderTools(entry.toolNames)}`;\n}\n\nexport class SkillPromptProvider extends HarnessContextProvider<SkillPromptProviderOptions> {\n label = \"Skill Context\";\n\n constructor(\n private readonly registry: SkillRegistry,\n private readonly defaults: SkillPromptProviderOptions = {},\n ) {\n super();\n this.role = defaults.role ?? systemRole;\n }\n\n async render(session: AgentReadSession, options?: SkillPromptProviderOptions): Promise<ContextProviderOutput> {\n const config = { ...this.defaults, ...options };\n const includeInactiveCatalog = config.includeInactiveCatalog ?? true;\n const includeToolNames = config.includeToolNames ?? true;\n const catalogOptions = { includeToolNames, includeMetadata: false };\n const available = listAvailableSkills(this.registry, catalogOptions);\n const active = listActiveSkills(session, this.registry, { ...catalogOptions, stateKey: config.stateKey });\n const inactive = listInactiveSkills(session, this.registry, { ...catalogOptions, stateKey: config.stateKey });\n const activeKeys = new Set(active.map((entry) => entry.key));\n const activeSkills = this.registry.list().filter((skill) => activeKeys.has(skill.key));\n const activePrompts: string[] = [];\n\n for (const skill of activeSkills) {\n if (!skill.prompt) continue;\n const prompt = typeof skill.prompt === \"function\"\n ? await skill.prompt(session, skill)\n : skill.prompt;\n if (!prompt.trim()) continue;\n activePrompts.push(`## ${skill.label ?? skill.key} (${skill.key})\\n${prompt.trim()}`);\n }\n\n const sections = [\n \"Skills are procedural capabilities. Activate a skill with activate_skill before using gated tools from that skill.\",\n \"A gated tool that is called too early returns data.code = \\\"skill.required\\\" and names the required skill.\",\n `Active skills: ${active.length ? active.map((entry) => entry.key).join(\", \") : \"none\"}.`,\n ];\n\n if (includeInactiveCatalog) {\n sections.push([\n \"Available skills:\",\n ...(available.length ? available.map(renderCatalogLine) : [\"- none\"]),\n ].join(\"\\n\"));\n sections.push(`Inactive skills: ${inactive.length ? inactive.map((entry) => entry.key).join(\", \") : \"none\"}.`);\n }\n\n if (activePrompts.length) {\n sections.push([\"Active skill instructions:\", ...activePrompts].join(\"\\n\\n\"));\n }\n\n return {\n role: config.role ?? this.role ?? systemRole,\n content: sections.join(\"\\n\\n\"),\n metadata: {\n stateKey: config.stateKey,\n activeSkills: active.map((entry) => entry.key),\n availableSkills: available.map((entry) => entry.key),\n },\n };\n }\n}\n\nexport function createSkillPromptProvider(\n registry: SkillRegistry | HarnessSkill[],\n options?: SkillPromptProviderOptions,\n): HarnessContextProvider {\n return new SkillPromptProvider(toSkillRegistry(registry), options);\n}\n"],"mappings":"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","names":[]}
|
package/dist/events.d.ts
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import * as _harness_kernel_core from '@harness-kernel/core';
|
|
2
|
+
import { HarnessEvent } from '@harness-kernel/core';
|
|
3
|
+
|
|
4
|
+
interface SkillActivationRequestedPayload {
|
|
5
|
+
key: string;
|
|
6
|
+
reason?: string;
|
|
7
|
+
known: boolean;
|
|
8
|
+
alreadyActive: boolean;
|
|
9
|
+
}
|
|
10
|
+
interface SkillActivatedPayload {
|
|
11
|
+
key: string;
|
|
12
|
+
label?: string;
|
|
13
|
+
reason?: string;
|
|
14
|
+
alreadyActive: boolean;
|
|
15
|
+
activatedByToolCallId?: string;
|
|
16
|
+
}
|
|
17
|
+
interface SkillDeactivatedPayload {
|
|
18
|
+
key: string;
|
|
19
|
+
label?: string;
|
|
20
|
+
reason?: string;
|
|
21
|
+
alreadyInactive: boolean;
|
|
22
|
+
deactivatedByToolCallId?: string;
|
|
23
|
+
}
|
|
24
|
+
interface SkillRequiredPayload {
|
|
25
|
+
key: string;
|
|
26
|
+
label?: string;
|
|
27
|
+
toolName: string;
|
|
28
|
+
reason: "inactive" | "unknown";
|
|
29
|
+
}
|
|
30
|
+
declare class SkillActivationRequestedEvent extends HarnessEvent<SkillActivationRequestedPayload> {
|
|
31
|
+
static type: string;
|
|
32
|
+
static schema: _harness_kernel_core.ObjectSchema<{
|
|
33
|
+
key: _harness_kernel_core.StringSchema;
|
|
34
|
+
reason: _harness_kernel_core.OptionalSchema<unknown, string | undefined>;
|
|
35
|
+
known: _harness_kernel_core.BooleanSchema;
|
|
36
|
+
alreadyActive: _harness_kernel_core.BooleanSchema;
|
|
37
|
+
}>;
|
|
38
|
+
}
|
|
39
|
+
declare class SkillActivatedEvent extends HarnessEvent<SkillActivatedPayload> {
|
|
40
|
+
static type: string;
|
|
41
|
+
static schema: _harness_kernel_core.ObjectSchema<{
|
|
42
|
+
key: _harness_kernel_core.StringSchema;
|
|
43
|
+
label: _harness_kernel_core.OptionalSchema<unknown, string | undefined>;
|
|
44
|
+
reason: _harness_kernel_core.OptionalSchema<unknown, string | undefined>;
|
|
45
|
+
alreadyActive: _harness_kernel_core.BooleanSchema;
|
|
46
|
+
activatedByToolCallId: _harness_kernel_core.OptionalSchema<unknown, string | undefined>;
|
|
47
|
+
}>;
|
|
48
|
+
}
|
|
49
|
+
declare class SkillDeactivatedEvent extends HarnessEvent<SkillDeactivatedPayload> {
|
|
50
|
+
static type: string;
|
|
51
|
+
static schema: _harness_kernel_core.ObjectSchema<{
|
|
52
|
+
key: _harness_kernel_core.StringSchema;
|
|
53
|
+
label: _harness_kernel_core.OptionalSchema<unknown, string | undefined>;
|
|
54
|
+
reason: _harness_kernel_core.OptionalSchema<unknown, string | undefined>;
|
|
55
|
+
alreadyInactive: _harness_kernel_core.BooleanSchema;
|
|
56
|
+
deactivatedByToolCallId: _harness_kernel_core.OptionalSchema<unknown, string | undefined>;
|
|
57
|
+
}>;
|
|
58
|
+
}
|
|
59
|
+
declare class SkillRequiredEvent extends HarnessEvent<SkillRequiredPayload> {
|
|
60
|
+
static type: string;
|
|
61
|
+
static schema: _harness_kernel_core.ObjectSchema<{
|
|
62
|
+
key: _harness_kernel_core.StringSchema;
|
|
63
|
+
label: _harness_kernel_core.OptionalSchema<unknown, string | undefined>;
|
|
64
|
+
toolName: _harness_kernel_core.StringSchema;
|
|
65
|
+
reason: _harness_kernel_core.EnumSchema<readonly ["inactive", "unknown"]>;
|
|
66
|
+
}>;
|
|
67
|
+
}
|
|
68
|
+
declare function skillEvents(): (typeof SkillActivationRequestedEvent | typeof SkillActivatedEvent | typeof SkillDeactivatedEvent | typeof SkillRequiredEvent)[];
|
|
69
|
+
|
|
70
|
+
export { SkillActivatedEvent, type SkillActivatedPayload, SkillActivationRequestedEvent, type SkillActivationRequestedPayload, SkillDeactivatedEvent, type SkillDeactivatedPayload, SkillRequiredEvent, type SkillRequiredPayload, skillEvents };
|
package/dist/events.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SkillActivatedEvent,
|
|
3
|
+
SkillActivationRequestedEvent,
|
|
4
|
+
SkillDeactivatedEvent,
|
|
5
|
+
SkillRequiredEvent,
|
|
6
|
+
skillEvents
|
|
7
|
+
} from "./chunk-FUZYYJJU.js";
|
|
8
|
+
export {
|
|
9
|
+
SkillActivatedEvent,
|
|
10
|
+
SkillActivationRequestedEvent,
|
|
11
|
+
SkillDeactivatedEvent,
|
|
12
|
+
SkillRequiredEvent,
|
|
13
|
+
skillEvents
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { HarnessContextProvider, HarnessTool, HarnessEventClass } from '@harness-kernel/core';
|
|
2
|
+
import { HarnessSkill } from './skill.js';
|
|
3
|
+
export { HarnessSkillInput, SkillPromptResolver, defineSkill } from './skill.js';
|
|
4
|
+
import { SkillRegistry } from './registry.js';
|
|
5
|
+
export { SkillCatalogEntry, SkillCatalogOptions, createSkillRegistry, toSkillRegistry } from './registry.js';
|
|
6
|
+
import { SkillPromptProviderOptions } from './provider.js';
|
|
7
|
+
export { SkillPromptProvider, createSkillPromptProvider } from './provider.js';
|
|
8
|
+
import { SkillGateOptions } from './tools.js';
|
|
9
|
+
export { SkillActivationTool, SkillDeactivationTool, SkillListResult, SkillListTool, createSkillActivationTool, createSkillDeactivationTool, createSkillGatedTools, createSkillListTool } from './tools.js';
|
|
10
|
+
export { ActiveSkillState, DEFAULT_SKILL_STATE_KEY, SkillActivationResult, SkillDeactivationResult, SkillErrorCode, SkillState, SkillStateOptions, SkillToolOptions, activateSkill, deactivateSkill, getSkillState, isSkillActive, listActiveSkills, listAvailableSkills, listInactiveSkills, setSkillState } from './state.js';
|
|
11
|
+
export { SkillActivatedEvent, SkillActivatedPayload, SkillActivationRequestedEvent, SkillActivationRequestedPayload, SkillDeactivatedEvent, SkillDeactivatedPayload, SkillRequiredEvent, SkillRequiredPayload, skillEvents } from './events.js';
|
|
12
|
+
export { SkillActivatedLog, SkillActivatedLogFields, SkillActivationRequestedLog, SkillActivationRequestedLogFields, SkillDeactivatedLog, SkillDeactivatedLogFields, SkillRequiredLog, SkillRequiredLogFields } from './logs.js';
|
|
13
|
+
import '@harness-kernel/core/runner/logging';
|
|
14
|
+
|
|
15
|
+
interface SkillKitOptions extends SkillPromptProviderOptions, SkillGateOptions {
|
|
16
|
+
}
|
|
17
|
+
interface SkillKit {
|
|
18
|
+
registry: SkillRegistry;
|
|
19
|
+
provider: HarnessContextProvider;
|
|
20
|
+
tools: HarnessTool[];
|
|
21
|
+
events: HarnessEventClass[];
|
|
22
|
+
}
|
|
23
|
+
declare function createSkillKit(skills: HarnessSkill[], options?: SkillKitOptions): SkillKit;
|
|
24
|
+
|
|
25
|
+
export { HarnessSkill, SkillGateOptions, type SkillKit, type SkillKitOptions, SkillPromptProviderOptions, SkillRegistry, createSkillKit };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SkillPromptProvider,
|
|
3
|
+
createSkillPromptProvider
|
|
4
|
+
} from "./chunk-THKBSLCD.js";
|
|
5
|
+
import {
|
|
6
|
+
defineSkill
|
|
7
|
+
} from "./chunk-L3KCYHUW.js";
|
|
8
|
+
import {
|
|
9
|
+
SkillActivationTool,
|
|
10
|
+
SkillDeactivationTool,
|
|
11
|
+
SkillListTool,
|
|
12
|
+
createSkillActivationTool,
|
|
13
|
+
createSkillDeactivationTool,
|
|
14
|
+
createSkillGatedTools,
|
|
15
|
+
createSkillListTool
|
|
16
|
+
} from "./chunk-6XTSIVQV.js";
|
|
17
|
+
import {
|
|
18
|
+
DEFAULT_SKILL_STATE_KEY,
|
|
19
|
+
activateSkill,
|
|
20
|
+
deactivateSkill,
|
|
21
|
+
getSkillState,
|
|
22
|
+
isSkillActive,
|
|
23
|
+
listActiveSkills,
|
|
24
|
+
listAvailableSkills,
|
|
25
|
+
listInactiveSkills,
|
|
26
|
+
setSkillState
|
|
27
|
+
} from "./chunk-SIAWNALF.js";
|
|
28
|
+
import {
|
|
29
|
+
SkillActivatedEvent,
|
|
30
|
+
SkillActivationRequestedEvent,
|
|
31
|
+
SkillDeactivatedEvent,
|
|
32
|
+
SkillRequiredEvent,
|
|
33
|
+
skillEvents
|
|
34
|
+
} from "./chunk-FUZYYJJU.js";
|
|
35
|
+
import {
|
|
36
|
+
SkillActivatedLog,
|
|
37
|
+
SkillActivationRequestedLog,
|
|
38
|
+
SkillDeactivatedLog,
|
|
39
|
+
SkillRequiredLog
|
|
40
|
+
} from "./chunk-TC7PNGST.js";
|
|
41
|
+
import {
|
|
42
|
+
createSkillRegistry,
|
|
43
|
+
toSkillRegistry
|
|
44
|
+
} from "./chunk-BF5PYWY6.js";
|
|
45
|
+
|
|
46
|
+
// src/index.ts
|
|
47
|
+
function createSkillKit(skills, options) {
|
|
48
|
+
const registry = createSkillRegistry(skills);
|
|
49
|
+
return {
|
|
50
|
+
registry,
|
|
51
|
+
provider: createSkillPromptProvider(registry, options),
|
|
52
|
+
tools: [
|
|
53
|
+
createSkillActivationTool(registry, options),
|
|
54
|
+
createSkillDeactivationTool(registry, options),
|
|
55
|
+
createSkillListTool(registry, options),
|
|
56
|
+
...createSkillGatedTools(registry, options)
|
|
57
|
+
],
|
|
58
|
+
events: skillEvents()
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export {
|
|
62
|
+
DEFAULT_SKILL_STATE_KEY,
|
|
63
|
+
SkillActivatedEvent,
|
|
64
|
+
SkillActivatedLog,
|
|
65
|
+
SkillActivationRequestedEvent,
|
|
66
|
+
SkillActivationRequestedLog,
|
|
67
|
+
SkillActivationTool,
|
|
68
|
+
SkillDeactivatedEvent,
|
|
69
|
+
SkillDeactivatedLog,
|
|
70
|
+
SkillDeactivationTool,
|
|
71
|
+
SkillListTool,
|
|
72
|
+
SkillPromptProvider,
|
|
73
|
+
SkillRequiredEvent,
|
|
74
|
+
SkillRequiredLog,
|
|
75
|
+
activateSkill,
|
|
76
|
+
createSkillActivationTool,
|
|
77
|
+
createSkillDeactivationTool,
|
|
78
|
+
createSkillGatedTools,
|
|
79
|
+
createSkillKit,
|
|
80
|
+
createSkillListTool,
|
|
81
|
+
createSkillPromptProvider,
|
|
82
|
+
createSkillRegistry,
|
|
83
|
+
deactivateSkill,
|
|
84
|
+
defineSkill,
|
|
85
|
+
getSkillState,
|
|
86
|
+
isSkillActive,
|
|
87
|
+
listActiveSkills,
|
|
88
|
+
listAvailableSkills,
|
|
89
|
+
listInactiveSkills,
|
|
90
|
+
setSkillState,
|
|
91
|
+
skillEvents,
|
|
92
|
+
toSkillRegistry
|
|
93
|
+
};
|
|
94
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { HarnessContextProvider, HarnessEventClass, HarnessTool } from \"@harness-kernel/core\";\nimport type { HarnessSkill } from \"./skill.js\";\nimport { createSkillRegistry, type SkillRegistry } from \"./registry.js\";\nimport { createSkillPromptProvider, type SkillPromptProviderOptions } from \"./provider.js\";\nimport {\n createSkillActivationTool,\n createSkillDeactivationTool,\n createSkillGatedTools,\n createSkillListTool,\n type SkillGateOptions,\n} from \"./tools.js\";\nimport { skillEvents } from \"./events.js\";\n\nexport * from \"./skill.js\";\nexport * from \"./registry.js\";\nexport * from \"./state.js\";\nexport * from \"./provider.js\";\nexport * from \"./tools.js\";\nexport * from \"./events.js\";\nexport * from \"./logs.js\";\n\nexport interface SkillKitOptions extends SkillPromptProviderOptions, SkillGateOptions {}\n\nexport interface SkillKit {\n registry: SkillRegistry;\n provider: HarnessContextProvider;\n tools: HarnessTool[];\n events: HarnessEventClass[];\n}\n\nexport function createSkillKit(skills: HarnessSkill[], options?: SkillKitOptions): SkillKit {\n const registry = createSkillRegistry(skills);\n return {\n registry,\n provider: createSkillPromptProvider(registry, options),\n tools: [\n createSkillActivationTool(registry, options),\n createSkillDeactivationTool(registry, options),\n createSkillListTool(registry, options),\n ...createSkillGatedTools(registry, options),\n ],\n events: skillEvents(),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BO,SAAS,eAAe,QAAwB,SAAqC;AAC1F,QAAM,WAAW,oBAAoB,MAAM;AAC3C,SAAO;AAAA,IACL;AAAA,IACA,UAAU,0BAA0B,UAAU,OAAO;AAAA,IACrD,OAAO;AAAA,MACL,0BAA0B,UAAU,OAAO;AAAA,MAC3C,4BAA4B,UAAU,OAAO;AAAA,MAC7C,oBAAoB,UAAU,OAAO;AAAA,MACrC,GAAG,sBAAsB,UAAU,OAAO;AAAA,IAC5C;AAAA,IACA,QAAQ,YAAY;AAAA,EACtB;AACF;","names":[]}
|
package/dist/logs.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { HarnessLog } from '@harness-kernel/core/runner/logging';
|
|
2
|
+
|
|
3
|
+
interface SkillActivationRequestedLogFields {
|
|
4
|
+
skillKey: string;
|
|
5
|
+
known: boolean;
|
|
6
|
+
alreadyActive: boolean;
|
|
7
|
+
reason?: string;
|
|
8
|
+
}
|
|
9
|
+
interface SkillActivatedLogFields {
|
|
10
|
+
skillKey: string;
|
|
11
|
+
label?: string;
|
|
12
|
+
alreadyActive: boolean;
|
|
13
|
+
}
|
|
14
|
+
interface SkillDeactivatedLogFields {
|
|
15
|
+
skillKey: string;
|
|
16
|
+
label?: string;
|
|
17
|
+
alreadyInactive: boolean;
|
|
18
|
+
}
|
|
19
|
+
interface SkillRequiredLogFields {
|
|
20
|
+
skillKey: string;
|
|
21
|
+
toolName: string;
|
|
22
|
+
reason: "inactive" | "unknown";
|
|
23
|
+
}
|
|
24
|
+
declare class SkillActivationRequestedLog extends HarnessLog<SkillActivationRequestedLogFields> {
|
|
25
|
+
level: "info";
|
|
26
|
+
category: "agent";
|
|
27
|
+
levelFor(fields: SkillActivationRequestedLogFields): "info" | "warn";
|
|
28
|
+
message(fields: SkillActivationRequestedLogFields): string;
|
|
29
|
+
}
|
|
30
|
+
declare class SkillActivatedLog extends HarnessLog<SkillActivatedLogFields> {
|
|
31
|
+
level: "info";
|
|
32
|
+
category: "agent";
|
|
33
|
+
message(fields: SkillActivatedLogFields): string;
|
|
34
|
+
}
|
|
35
|
+
declare class SkillDeactivatedLog extends HarnessLog<SkillDeactivatedLogFields> {
|
|
36
|
+
level: "info";
|
|
37
|
+
category: "agent";
|
|
38
|
+
message(fields: SkillDeactivatedLogFields): string;
|
|
39
|
+
}
|
|
40
|
+
declare class SkillRequiredLog extends HarnessLog<SkillRequiredLogFields> {
|
|
41
|
+
level: "warn";
|
|
42
|
+
category: "tool";
|
|
43
|
+
message(fields: SkillRequiredLogFields): string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export { SkillActivatedLog, type SkillActivatedLogFields, SkillActivationRequestedLog, type SkillActivationRequestedLogFields, SkillDeactivatedLog, type SkillDeactivatedLogFields, SkillRequiredLog, type SkillRequiredLogFields };
|
package/dist/logs.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SkillActivatedLog,
|
|
3
|
+
SkillActivationRequestedLog,
|
|
4
|
+
SkillDeactivatedLog,
|
|
5
|
+
SkillRequiredLog
|
|
6
|
+
} from "./chunk-TC7PNGST.js";
|
|
7
|
+
export {
|
|
8
|
+
SkillActivatedLog,
|
|
9
|
+
SkillActivationRequestedLog,
|
|
10
|
+
SkillDeactivatedLog,
|
|
11
|
+
SkillRequiredLog
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=logs.js.map
|
package/dist/logs.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|