@nervekit/agent 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.
- package/LICENSE +201 -0
- package/NOTICE +5 -0
- package/dist/agent-loop.d.ts +2 -0
- package/dist/agent-loop.d.ts.map +1 -0
- package/dist/agent-loop.js +2 -0
- package/dist/agent-loop.js.map +1 -0
- package/dist/agent.d.ts +125 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +427 -0
- package/dist/agent.js.map +1 -0
- package/dist/harness/agent-harness.d.ts +114 -0
- package/dist/harness/agent-harness.d.ts.map +1 -0
- package/dist/harness/agent-harness.js +474 -0
- package/dist/harness/agent-harness.js.map +1 -0
- package/dist/harness/compaction/branch-summarization.d.ts +54 -0
- package/dist/harness/compaction/branch-summarization.d.ts.map +1 -0
- package/dist/harness/compaction/branch-summarization.js +183 -0
- package/dist/harness/compaction/branch-summarization.js.map +1 -0
- package/dist/harness/compaction/compaction.d.ts +19 -0
- package/dist/harness/compaction/compaction.d.ts.map +1 -0
- package/dist/harness/compaction/compaction.js +335 -0
- package/dist/harness/compaction/compaction.js.map +1 -0
- package/dist/harness/compaction/cut-points.d.ts +7 -0
- package/dist/harness/compaction/cut-points.d.ts.map +1 -0
- package/dist/harness/compaction/cut-points.js +106 -0
- package/dist/harness/compaction/cut-points.js.map +1 -0
- package/dist/harness/compaction/overflow.d.ts +3 -0
- package/dist/harness/compaction/overflow.d.ts.map +1 -0
- package/dist/harness/compaction/overflow.js +54 -0
- package/dist/harness/compaction/overflow.js.map +1 -0
- package/dist/harness/compaction/policy.d.ts +8 -0
- package/dist/harness/compaction/policy.d.ts.map +1 -0
- package/dist/harness/compaction/policy.js +57 -0
- package/dist/harness/compaction/policy.js.map +1 -0
- package/dist/harness/compaction/types.d.ts +79 -0
- package/dist/harness/compaction/types.d.ts.map +1 -0
- package/dist/harness/compaction/types.js +2 -0
- package/dist/harness/compaction/types.js.map +1 -0
- package/dist/harness/compaction/usage.d.ts +30 -0
- package/dist/harness/compaction/usage.d.ts.map +1 -0
- package/dist/harness/compaction/usage.js +177 -0
- package/dist/harness/compaction/usage.js.map +1 -0
- package/dist/harness/compaction/utils.d.ts +25 -0
- package/dist/harness/compaction/utils.d.ts.map +1 -0
- package/dist/harness/compaction/utils.js +131 -0
- package/dist/harness/compaction/utils.js.map +1 -0
- package/dist/harness/configuration.d.ts +34 -0
- package/dist/harness/configuration.d.ts.map +1 -0
- package/dist/harness/configuration.js +75 -0
- package/dist/harness/configuration.js.map +1 -0
- package/dist/harness/conversation/context.d.ts +24 -0
- package/dist/harness/conversation/context.d.ts.map +1 -0
- package/dist/harness/conversation/context.js +76 -0
- package/dist/harness/conversation/context.js.map +1 -0
- package/dist/harness/conversation/conversation.d.ts +36 -0
- package/dist/harness/conversation/conversation.d.ts.map +1 -0
- package/dist/harness/conversation/conversation.js +163 -0
- package/dist/harness/conversation/conversation.js.map +1 -0
- package/dist/harness/conversation/entries.d.ts +117 -0
- package/dist/harness/conversation/entries.d.ts.map +1 -0
- package/dist/harness/conversation/entries.js +2 -0
- package/dist/harness/conversation/entries.js.map +1 -0
- package/dist/harness/conversation/jsonl-repo.d.ts +27 -0
- package/dist/harness/conversation/jsonl-repo.d.ts.map +1 -0
- package/dist/harness/conversation/jsonl-repo.js +110 -0
- package/dist/harness/conversation/jsonl-repo.js.map +1 -0
- package/dist/harness/conversation/jsonl-storage.d.ts +34 -0
- package/dist/harness/conversation/jsonl-storage.d.ts.map +1 -0
- package/dist/harness/conversation/jsonl-storage.js +213 -0
- package/dist/harness/conversation/jsonl-storage.js.map +1 -0
- package/dist/harness/conversation/memory-repo.d.ts +18 -0
- package/dist/harness/conversation/memory-repo.d.ts.map +1 -0
- package/dist/harness/conversation/memory-repo.js +45 -0
- package/dist/harness/conversation/memory-repo.js.map +1 -0
- package/dist/harness/conversation/memory-storage.d.ts +25 -0
- package/dist/harness/conversation/memory-storage.d.ts.map +1 -0
- package/dist/harness/conversation/memory-storage.js +88 -0
- package/dist/harness/conversation/memory-storage.js.map +1 -0
- package/dist/harness/conversation/repo-utils.d.ts +13 -0
- package/dist/harness/conversation/repo-utils.d.ts.map +1 -0
- package/dist/harness/conversation/repo-utils.js +39 -0
- package/dist/harness/conversation/repo-utils.js.map +1 -0
- package/dist/harness/conversation/storage-utils.d.ts +11 -0
- package/dist/harness/conversation/storage-utils.d.ts.map +1 -0
- package/dist/harness/conversation/storage-utils.js +32 -0
- package/dist/harness/conversation/storage-utils.js.map +1 -0
- package/dist/harness/conversation/text-extraction.d.ts +8 -0
- package/dist/harness/conversation/text-extraction.d.ts.map +1 -0
- package/dist/harness/conversation/text-extraction.js +24 -0
- package/dist/harness/conversation/text-extraction.js.map +1 -0
- package/dist/harness/conversation/uuid.d.ts +2 -0
- package/dist/harness/conversation/uuid.d.ts.map +1 -0
- package/dist/harness/conversation/uuid.js +54 -0
- package/dist/harness/conversation/uuid.js.map +1 -0
- package/dist/harness/conversation-writes.d.ts +9 -0
- package/dist/harness/conversation-writes.d.ts.map +1 -0
- package/dist/harness/conversation-writes.js +54 -0
- package/dist/harness/conversation-writes.js.map +1 -0
- package/dist/harness/env/nodejs.d.ts +53 -0
- package/dist/harness/env/nodejs.d.ts.map +1 -0
- package/dist/harness/env/nodejs.js +497 -0
- package/dist/harness/env/nodejs.js.map +1 -0
- package/dist/harness/env/types.d.ts +106 -0
- package/dist/harness/env/types.d.ts.map +1 -0
- package/dist/harness/env/types.js +2 -0
- package/dist/harness/env/types.js.map +1 -0
- package/dist/harness/errors.d.ts +48 -0
- package/dist/harness/errors.d.ts.map +1 -0
- package/dist/harness/errors.js +63 -0
- package/dist/harness/errors.js.map +1 -0
- package/dist/harness/events.d.ts +238 -0
- package/dist/harness/events.d.ts.map +1 -0
- package/dist/harness/events.js +2 -0
- package/dist/harness/events.js.map +1 -0
- package/dist/harness/harness-configuration-methods.d.ts +36 -0
- package/dist/harness/harness-configuration-methods.d.ts.map +1 -0
- package/dist/harness/harness-configuration-methods.js +145 -0
- package/dist/harness/harness-configuration-methods.js.map +1 -0
- package/dist/harness/harness-continuation.d.ts +18 -0
- package/dist/harness/harness-continuation.d.ts.map +1 -0
- package/dist/harness/harness-continuation.js +56 -0
- package/dist/harness/harness-continuation.js.map +1 -0
- package/dist/harness/harness-events.d.ts +23 -0
- package/dist/harness/harness-events.d.ts.map +1 -0
- package/dist/harness/harness-events.js +129 -0
- package/dist/harness/harness-events.js.map +1 -0
- package/dist/harness/harness-invocations.d.ts +20 -0
- package/dist/harness/harness-invocations.d.ts.map +1 -0
- package/dist/harness/harness-invocations.js +22 -0
- package/dist/harness/harness-invocations.js.map +1 -0
- package/dist/harness/harness-maintenance.d.ts +30 -0
- package/dist/harness/harness-maintenance.d.ts.map +1 -0
- package/dist/harness/harness-maintenance.js +155 -0
- package/dist/harness/harness-maintenance.js.map +1 -0
- package/dist/harness/harness-queue-methods.d.ts +45 -0
- package/dist/harness/harness-queue-methods.d.ts.map +1 -0
- package/dist/harness/harness-queue-methods.js +51 -0
- package/dist/harness/harness-queue-methods.js.map +1 -0
- package/dist/harness/messages.d.ts +76 -0
- package/dist/harness/messages.d.ts.map +1 -0
- package/dist/harness/messages.js +147 -0
- package/dist/harness/messages.js.map +1 -0
- package/dist/harness/options.d.ts +95 -0
- package/dist/harness/options.d.ts.map +1 -0
- package/dist/harness/options.js +2 -0
- package/dist/harness/options.js.map +1 -0
- package/dist/harness/prompt-templates.d.ts +49 -0
- package/dist/harness/prompt-templates.d.ts.map +1 -0
- package/dist/harness/prompt-templates.js +230 -0
- package/dist/harness/prompt-templates.js.map +1 -0
- package/dist/harness/result.d.ts +19 -0
- package/dist/harness/result.d.ts.map +1 -0
- package/dist/harness/result.js +32 -0
- package/dist/harness/result.js.map +1 -0
- package/dist/harness/run/messages.d.ts +5 -0
- package/dist/harness/run/messages.d.ts.map +1 -0
- package/dist/harness/run/messages.js +37 -0
- package/dist/harness/run/messages.js.map +1 -0
- package/dist/harness/skills/format.d.ts +6 -0
- package/dist/harness/skills/format.d.ts.map +1 -0
- package/dist/harness/skills/format.js +38 -0
- package/dist/harness/skills/format.js.map +1 -0
- package/dist/harness/skills/index.d.ts +5 -0
- package/dist/harness/skills/index.d.ts.map +1 -0
- package/dist/harness/skills/index.js +5 -0
- package/dist/harness/skills/index.js.map +1 -0
- package/dist/harness/skills/loader.d.ts +43 -0
- package/dist/harness/skills/loader.d.ts.map +1 -0
- package/dist/harness/skills/loader.js +279 -0
- package/dist/harness/skills/loader.js.map +1 -0
- package/dist/harness/skills/parser.d.ts +12 -0
- package/dist/harness/skills/parser.d.ts.map +1 -0
- package/dist/harness/skills/parser.js +22 -0
- package/dist/harness/skills/parser.js.map +1 -0
- package/dist/harness/skills/validation.d.ts +3 -0
- package/dist/harness/skills/validation.d.ts.map +1 -0
- package/dist/harness/skills/validation.js +28 -0
- package/dist/harness/skills/validation.js.map +1 -0
- package/dist/harness/skills.d.ts +2 -0
- package/dist/harness/skills.d.ts.map +1 -0
- package/dist/harness/skills.js +2 -0
- package/dist/harness/skills.js.map +1 -0
- package/dist/harness/stream-options.d.ts +5 -0
- package/dist/harness/stream-options.d.ts.map +1 -0
- package/dist/harness/stream-options.js +67 -0
- package/dist/harness/stream-options.js.map +1 -0
- package/dist/harness/system-prompt.d.ts +2 -0
- package/dist/harness/system-prompt.d.ts.map +1 -0
- package/dist/harness/system-prompt.js +2 -0
- package/dist/harness/system-prompt.js.map +1 -0
- package/dist/harness/turn-state.d.ts +27 -0
- package/dist/harness/turn-state.d.ts.map +1 -0
- package/dist/harness/turn-state.js +35 -0
- package/dist/harness/turn-state.js.map +1 -0
- package/dist/harness/types.d.ts +9 -0
- package/dist/harness/types.d.ts.map +1 -0
- package/dist/harness/types.js +8 -0
- package/dist/harness/types.js.map +1 -0
- package/dist/harness/utils/env-path.d.ts +14 -0
- package/dist/harness/utils/env-path.d.ts.map +1 -0
- package/dist/harness/utils/env-path.js +99 -0
- package/dist/harness/utils/env-path.js.map +1 -0
- package/dist/harness/utils/shell-output.d.ts +16 -0
- package/dist/harness/utils/shell-output.d.ts.map +1 -0
- package/dist/harness/utils/shell-output.js +137 -0
- package/dist/harness/utils/shell-output.js.map +1 -0
- package/dist/harness/utils/truncate.d.ts +70 -0
- package/dist/harness/utils/truncate.d.ts.map +1 -0
- package/dist/harness/utils/truncate.js +289 -0
- package/dist/harness/utils/truncate.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/node.d.ts +3 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +3 -0
- package/dist/node.js.map +1 -0
- package/dist/proxy.d.ts +67 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +299 -0
- package/dist/proxy.js.map +1 -0
- package/dist/runtime/loop/agent-loop.d.ts +24 -0
- package/dist/runtime/loop/agent-loop.d.ts.map +1 -0
- package/dist/runtime/loop/agent-loop.js +72 -0
- package/dist/runtime/loop/agent-loop.js.map +1 -0
- package/dist/runtime/loop/events.d.ts +5 -0
- package/dist/runtime/loop/events.d.ts.map +1 -0
- package/dist/runtime/loop/events.js +5 -0
- package/dist/runtime/loop/events.js.map +1 -0
- package/dist/runtime/loop/index.d.ts +6 -0
- package/dist/runtime/loop/index.d.ts.map +1 -0
- package/dist/runtime/loop/index.js +6 -0
- package/dist/runtime/loop/index.js.map +1 -0
- package/dist/runtime/loop/stream-assistant.d.ts +9 -0
- package/dist/runtime/loop/stream-assistant.d.ts.map +1 -0
- package/dist/runtime/loop/stream-assistant.js +87 -0
- package/dist/runtime/loop/stream-assistant.js.map +1 -0
- package/dist/runtime/loop/tool-execution.d.ts +15 -0
- package/dist/runtime/loop/tool-execution.d.ts.map +1 -0
- package/dist/runtime/loop/tool-execution.js +271 -0
- package/dist/runtime/loop/tool-execution.js.map +1 -0
- package/dist/runtime/loop/turn-loop.d.ts +7 -0
- package/dist/runtime/loop/turn-loop.d.ts.map +1 -0
- package/dist/runtime/loop/turn-loop.js +84 -0
- package/dist/runtime/loop/turn-loop.js.map +1 -0
- package/dist/runtime.d.ts +63 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +170 -0
- package/dist/runtime.js.map +1 -0
- package/dist/suspension.d.ts +18 -0
- package/dist/suspension.d.ts.map +1 -0
- package/dist/suspension.js +19 -0
- package/dist/suspension.js.map +1 -0
- package/dist/types.d.ts +395 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/worker.d.ts +2 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +88 -0
- package/dist/worker.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Result of a fallible operation. Expected failures are returned as `ok: false` instead of thrown. */
|
|
2
|
+
export type Result<TValue, TError> = {
|
|
3
|
+
ok: true;
|
|
4
|
+
value: TValue;
|
|
5
|
+
} | {
|
|
6
|
+
ok: false;
|
|
7
|
+
error: TError;
|
|
8
|
+
};
|
|
9
|
+
/** Create a successful {@link Result}. */
|
|
10
|
+
export declare function ok<TValue, TError>(value: TValue): Result<TValue, TError>;
|
|
11
|
+
/** Create a failed {@link Result}. */
|
|
12
|
+
export declare function err<TValue, TError>(error: TError): Result<TValue, TError>;
|
|
13
|
+
/** Return the success value or throw the failure error. Intended for tests and explicit adapter boundaries. */
|
|
14
|
+
export declare function getOrThrow<TValue, TError>(result: Result<TValue, TError>): TValue;
|
|
15
|
+
/** Return the success value or `undefined`. Only object values are allowed to avoid truthiness bugs with primitives. */
|
|
16
|
+
export declare function getOrUndefined<TValue extends object, TError>(result: Result<TValue, TError>): TValue | undefined;
|
|
17
|
+
/** Normalize unknown thrown values into Error instances before using them as typed error causes. */
|
|
18
|
+
export declare function toError(error: unknown): Error;
|
|
19
|
+
//# sourceMappingURL=result.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/harness/result.ts"],"names":[],"mappings":"AAAA,uGAAuG;AACvG,MAAM,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,IAC7B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC3B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC,0CAA0C;AAC1C,wBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAExE;AAED,sCAAsC;AACtC,wBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEzE;AAED,+GAA+G;AAC/G,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EACvC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,MAAM,CAGR;AAED,wHAAwH;AACxH,wBAAgB,cAAc,CAAC,MAAM,SAAS,MAAM,EAAE,MAAM,EAC1D,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,MAAM,GAAG,SAAS,CAEpB;AAED,oGAAoG;AACpG,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAQ7C"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** Create a successful {@link Result}. */
|
|
2
|
+
export function ok(value) {
|
|
3
|
+
return { ok: true, value };
|
|
4
|
+
}
|
|
5
|
+
/** Create a failed {@link Result}. */
|
|
6
|
+
export function err(error) {
|
|
7
|
+
return { ok: false, error };
|
|
8
|
+
}
|
|
9
|
+
/** Return the success value or throw the failure error. Intended for tests and explicit adapter boundaries. */
|
|
10
|
+
export function getOrThrow(result) {
|
|
11
|
+
if (!result.ok)
|
|
12
|
+
throw result.error;
|
|
13
|
+
return result.value;
|
|
14
|
+
}
|
|
15
|
+
/** Return the success value or `undefined`. Only object values are allowed to avoid truthiness bugs with primitives. */
|
|
16
|
+
export function getOrUndefined(result) {
|
|
17
|
+
return result.ok ? result.value : undefined;
|
|
18
|
+
}
|
|
19
|
+
/** Normalize unknown thrown values into Error instances before using them as typed error causes. */
|
|
20
|
+
export function toError(error) {
|
|
21
|
+
if (error instanceof Error)
|
|
22
|
+
return error;
|
|
23
|
+
if (typeof error === "string")
|
|
24
|
+
return new Error(error);
|
|
25
|
+
try {
|
|
26
|
+
return new Error(JSON.stringify(error));
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return new Error(String(error));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/harness/result.ts"],"names":[],"mappings":"AAKA,0CAA0C;AAC1C,MAAM,UAAU,EAAE,CAAiB,KAAa;IAC9C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,GAAG,CAAiB,KAAa;IAC/C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC9B,CAAC;AAED,+GAA+G;AAC/G,MAAM,UAAU,UAAU,CACxB,MAA8B;IAE9B,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,MAAM,CAAC,KAAK,CAAC;IACnC,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC;AAED,wHAAwH;AACxH,MAAM,UAAU,cAAc,CAC5B,MAA8B;IAE9B,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9C,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,KAAK,CAAC;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IACvD,IAAI,CAAC;QACH,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAClC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { AssistantMessage, ImageContent, UserMessage } from "@earendil-works/pi-ai";
|
|
2
|
+
import type { AnyModel } from "../../types.js";
|
|
3
|
+
export declare function createUserMessage(text: string, images?: ImageContent[]): UserMessage;
|
|
4
|
+
export declare function createFailureMessage(model: AnyModel, error: unknown, aborted: boolean): AssistantMessage;
|
|
5
|
+
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/harness/run/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,YAAY,EAAE,GACtB,WAAW,CAMb;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,OAAO,GACf,gBAAgB,CA2BlB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export function createUserMessage(text, images) {
|
|
2
|
+
const content = [
|
|
3
|
+
{ type: "text", text },
|
|
4
|
+
];
|
|
5
|
+
if (images)
|
|
6
|
+
content.push(...images);
|
|
7
|
+
return { role: "user", content, timestamp: Date.now() };
|
|
8
|
+
}
|
|
9
|
+
export function createFailureMessage(model, error, aborted) {
|
|
10
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
11
|
+
return {
|
|
12
|
+
role: "assistant",
|
|
13
|
+
content: [
|
|
14
|
+
{
|
|
15
|
+
type: "text",
|
|
16
|
+
text: aborted
|
|
17
|
+
? "Agent run aborted."
|
|
18
|
+
: `Agent run failed: ${errorMessage}`,
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
api: model.api,
|
|
22
|
+
provider: model.provider,
|
|
23
|
+
model: model.id,
|
|
24
|
+
stopReason: aborted ? "aborted" : "error",
|
|
25
|
+
errorMessage,
|
|
26
|
+
timestamp: Date.now(),
|
|
27
|
+
usage: {
|
|
28
|
+
input: 0,
|
|
29
|
+
output: 0,
|
|
30
|
+
cacheRead: 0,
|
|
31
|
+
cacheWrite: 0,
|
|
32
|
+
totalTokens: 0,
|
|
33
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/harness/run/messages.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,MAAuB;IAEvB,MAAM,OAAO,GAAyD;QACpE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;KACvB,CAAC;IACF,IAAI,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;IACpC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,KAAe,EACf,KAAc,EACd,OAAgB;IAEhB,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5E,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,OAAO;oBACX,CAAC,CAAC,oBAAoB;oBACtB,CAAC,CAAC,qBAAqB,YAAY,EAAE;aACxC;SACF;QACD,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,KAAK,EAAE,KAAK,CAAC,EAAE;QACf,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;QACzC,YAAY;QACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,KAAK,EAAE;YACL,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;YACT,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,CAAC;YACb,WAAW,EAAE,CAAC;YACd,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;SACrE;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Skill } from "../options.js";
|
|
2
|
+
/** Format a skill invocation prompt, optionally appending additional user instructions. */
|
|
3
|
+
export declare function formatSkillInvocation(skill: Skill, additionalInstructions?: string): string;
|
|
4
|
+
/** Format model-visible skill availability instructions for the system prompt. */
|
|
5
|
+
export declare function formatSkillsForSystemPrompt(skills: Skill[]): string;
|
|
6
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/harness/skills/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAG3C,2FAA2F;AAC3F,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,KAAK,EACZ,sBAAsB,CAAC,EAAE,MAAM,GAC9B,MAAM,CAKR;AAED,kFAAkF;AAClF,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAuBnE"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { dirnameEnvPath } from "../utils/env-path.js";
|
|
2
|
+
/** Format a skill invocation prompt, optionally appending additional user instructions. */
|
|
3
|
+
export function formatSkillInvocation(skill, additionalInstructions) {
|
|
4
|
+
const skillBlock = `<skill name="${skill.name}" location="${skill.filePath}">\nReferences are relative to ${dirnameEnvPath(skill.filePath)}.\n\n${skill.content}\n</skill>`;
|
|
5
|
+
return additionalInstructions
|
|
6
|
+
? `${skillBlock}\n\n${additionalInstructions}`
|
|
7
|
+
: skillBlock;
|
|
8
|
+
}
|
|
9
|
+
/** Format model-visible skill availability instructions for the system prompt. */
|
|
10
|
+
export function formatSkillsForSystemPrompt(skills) {
|
|
11
|
+
const visibleSkills = skills.filter((skill) => !skill.disableModelInvocation);
|
|
12
|
+
if (visibleSkills.length === 0)
|
|
13
|
+
return "";
|
|
14
|
+
const lines = [
|
|
15
|
+
"Skills are optional task-specific instructions.",
|
|
16
|
+
"Read a skill file when its description matches the task; resolve relative references from that skill file's directory.",
|
|
17
|
+
"",
|
|
18
|
+
"<available_skills>",
|
|
19
|
+
];
|
|
20
|
+
for (const skill of visibleSkills) {
|
|
21
|
+
lines.push(" <skill>");
|
|
22
|
+
lines.push(` <name>${escapeXml(skill.name)}</name>`);
|
|
23
|
+
lines.push(` <description>${escapeXml(skill.description)}</description>`);
|
|
24
|
+
lines.push(` <location>${escapeXml(skill.filePath)}</location>`);
|
|
25
|
+
lines.push(" </skill>");
|
|
26
|
+
}
|
|
27
|
+
lines.push("</available_skills>");
|
|
28
|
+
return lines.join("\n");
|
|
29
|
+
}
|
|
30
|
+
function escapeXml(value) {
|
|
31
|
+
return value
|
|
32
|
+
.replace(/&/g, "&")
|
|
33
|
+
.replace(/</g, "<")
|
|
34
|
+
.replace(/>/g, ">")
|
|
35
|
+
.replace(/"/g, """)
|
|
36
|
+
.replace(/'/g, "'");
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/harness/skills/format.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,2FAA2F;AAC3F,MAAM,UAAU,qBAAqB,CACnC,KAAY,EACZ,sBAA+B;IAE/B,MAAM,UAAU,GAAG,gBAAgB,KAAK,CAAC,IAAI,eAAe,KAAK,CAAC,QAAQ,kCAAkC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,KAAK,CAAC,OAAO,YAAY,CAAC;IAC5K,OAAO,sBAAsB;QAC3B,CAAC,CAAC,GAAG,UAAU,OAAO,sBAAsB,EAAE;QAC9C,CAAC,CAAC,UAAU,CAAC;AACjB,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,2BAA2B,CAAC,MAAe;IACzD,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC9E,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE1C,MAAM,KAAK,GAAG;QACZ,iDAAiD;QACjD,wHAAwH;QACxH,EAAE;QACF,oBAAoB;KACrB,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,aAAa,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxD,KAAK,CAAC,IAAI,CACR,oBAAoB,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,gBAAgB,CACjE,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,iBAAiB,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QACpE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAClC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK;SACT,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/harness/skills/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/harness/skills/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { ExecutionEnv } from "../env/types.js";
|
|
2
|
+
import type { Skill } from "../options.js";
|
|
3
|
+
export type SkillDiagnosticCode = "file_info_failed" | "list_failed" | "read_failed" | "parse_failed" | "invalid_metadata";
|
|
4
|
+
/** Warning produced while loading skills. */
|
|
5
|
+
export interface SkillDiagnostic {
|
|
6
|
+
/** Diagnostic severity. Currently only warnings are emitted. */
|
|
7
|
+
type: "warning";
|
|
8
|
+
/** Stable diagnostic code. */
|
|
9
|
+
code: SkillDiagnosticCode;
|
|
10
|
+
/** Human-readable diagnostic message. */
|
|
11
|
+
message: string;
|
|
12
|
+
/** Path associated with the diagnostic. */
|
|
13
|
+
path: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Load skills from one or more directories.
|
|
17
|
+
*
|
|
18
|
+
* Traverses directories recursively, loads `SKILL.md` files, loads direct root `.md` files as skills, honors ignore files,
|
|
19
|
+
* and returns diagnostics for invalid skill files. Missing input directories are skipped.
|
|
20
|
+
*/
|
|
21
|
+
export declare function loadSkills(env: ExecutionEnv, dirs: string | string[]): Promise<{
|
|
22
|
+
skills: Skill[];
|
|
23
|
+
diagnostics: SkillDiagnostic[];
|
|
24
|
+
}>;
|
|
25
|
+
/**
|
|
26
|
+
* Load skills from source-tagged directories.
|
|
27
|
+
*
|
|
28
|
+
* Source values are preserved exactly and attached to every loaded skill and diagnostic. The agent package does not
|
|
29
|
+
* interpret source values; applications define their own provenance shape.
|
|
30
|
+
*/
|
|
31
|
+
export declare function loadSourcedSkills<TSource, TSkill extends Skill = Skill>(env: ExecutionEnv, inputs: Array<{
|
|
32
|
+
path: string;
|
|
33
|
+
source: TSource;
|
|
34
|
+
}>, mapSkill?: (skill: Skill, source: TSource) => TSkill): Promise<{
|
|
35
|
+
skills: Array<{
|
|
36
|
+
skill: TSkill;
|
|
37
|
+
source: TSource;
|
|
38
|
+
}>;
|
|
39
|
+
diagnostics: Array<SkillDiagnostic & {
|
|
40
|
+
source: TSource;
|
|
41
|
+
}>;
|
|
42
|
+
}>;
|
|
43
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/harness/skills/loader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAY,MAAM,iBAAiB,CAAC;AAC9D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAc3C,MAAM,MAAM,mBAAmB,GAC3B,kBAAkB,GAClB,aAAa,GACb,aAAa,GACb,cAAc,GACd,kBAAkB,CAAC;AAEvB,6CAA6C;AAC7C,MAAM,WAAW,eAAe;IAC9B,gEAAgE;IAChE,IAAI,EAAE,SAAS,CAAC;IAChB,8BAA8B;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GACtB,OAAO,CAAC;IAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAAC,WAAW,EAAE,eAAe,EAAE,CAAA;CAAE,CAAC,CA8B9D;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,SAAS,KAAK,GAAG,KAAK,EAC3E,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,EAChD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,KAAK,MAAM,GACnD,OAAO,CAAC;IACT,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAClD,WAAW,EAAE,KAAK,CAAC,eAAe,GAAG;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC3D,CAAC,CAeD"}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import ignore from "ignore";
|
|
2
|
+
import { basenameEnvPath, dirnameEnvPath, joinEnvPath, relativeEnvPath, } from "../utils/env-path.js";
|
|
3
|
+
import { parseFrontmatter } from "./parser.js";
|
|
4
|
+
import { validateDescription, validateName } from "./validation.js";
|
|
5
|
+
const IGNORE_FILE_NAMES = [".gitignore", ".ignore", ".fdignore"];
|
|
6
|
+
/**
|
|
7
|
+
* Load skills from one or more directories.
|
|
8
|
+
*
|
|
9
|
+
* Traverses directories recursively, loads `SKILL.md` files, loads direct root `.md` files as skills, honors ignore files,
|
|
10
|
+
* and returns diagnostics for invalid skill files. Missing input directories are skipped.
|
|
11
|
+
*/
|
|
12
|
+
export async function loadSkills(env, dirs) {
|
|
13
|
+
const skills = [];
|
|
14
|
+
const diagnostics = [];
|
|
15
|
+
for (const dir of Array.isArray(dirs) ? dirs : [dirs]) {
|
|
16
|
+
const rootInfoResult = await env.fileInfo(dir);
|
|
17
|
+
if (!rootInfoResult.ok) {
|
|
18
|
+
if (rootInfoResult.error.code !== "not_found") {
|
|
19
|
+
diagnostics.push({
|
|
20
|
+
type: "warning",
|
|
21
|
+
code: "file_info_failed",
|
|
22
|
+
message: rootInfoResult.error.message,
|
|
23
|
+
path: dir,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
const rootInfo = rootInfoResult.value;
|
|
29
|
+
if ((await resolveKind(env, rootInfo, diagnostics)) !== "directory")
|
|
30
|
+
continue;
|
|
31
|
+
const result = await loadSkillsFromDirInternal(env, rootInfo.path, true, ignore(), rootInfo.path);
|
|
32
|
+
skills.push(...result.skills);
|
|
33
|
+
diagnostics.push(...result.diagnostics);
|
|
34
|
+
}
|
|
35
|
+
return { skills, diagnostics };
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Load skills from source-tagged directories.
|
|
39
|
+
*
|
|
40
|
+
* Source values are preserved exactly and attached to every loaded skill and diagnostic. The agent package does not
|
|
41
|
+
* interpret source values; applications define their own provenance shape.
|
|
42
|
+
*/
|
|
43
|
+
export async function loadSourcedSkills(env, inputs, mapSkill) {
|
|
44
|
+
const skills = [];
|
|
45
|
+
const diagnostics = [];
|
|
46
|
+
for (const input of inputs) {
|
|
47
|
+
const result = await loadSkills(env, input.path);
|
|
48
|
+
for (const skill of result.skills) {
|
|
49
|
+
skills.push({
|
|
50
|
+
skill: mapSkill ? mapSkill(skill, input.source) : skill,
|
|
51
|
+
source: input.source,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
for (const diagnostic of result.diagnostics)
|
|
55
|
+
diagnostics.push({ ...diagnostic, source: input.source });
|
|
56
|
+
}
|
|
57
|
+
return { skills, diagnostics };
|
|
58
|
+
}
|
|
59
|
+
async function loadSkillsFromDirInternal(env, dir, includeRootFiles, ignoreMatcher, rootDir) {
|
|
60
|
+
const skills = [];
|
|
61
|
+
const diagnostics = [];
|
|
62
|
+
const dirInfoResult = await env.fileInfo(dir);
|
|
63
|
+
if (!dirInfoResult.ok) {
|
|
64
|
+
if (dirInfoResult.error.code !== "not_found") {
|
|
65
|
+
diagnostics.push({
|
|
66
|
+
type: "warning",
|
|
67
|
+
code: "file_info_failed",
|
|
68
|
+
message: dirInfoResult.error.message,
|
|
69
|
+
path: dir,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return { skills, diagnostics };
|
|
73
|
+
}
|
|
74
|
+
const dirInfo = dirInfoResult.value;
|
|
75
|
+
if ((await resolveKind(env, dirInfo, diagnostics)) !== "directory")
|
|
76
|
+
return { skills, diagnostics };
|
|
77
|
+
await addIgnoreRules(env, ignoreMatcher, dir, rootDir, diagnostics);
|
|
78
|
+
const entriesResult = await env.listDir(dir);
|
|
79
|
+
if (!entriesResult.ok) {
|
|
80
|
+
diagnostics.push({
|
|
81
|
+
type: "warning",
|
|
82
|
+
code: "list_failed",
|
|
83
|
+
message: entriesResult.error.message,
|
|
84
|
+
path: dir,
|
|
85
|
+
});
|
|
86
|
+
return { skills, diagnostics };
|
|
87
|
+
}
|
|
88
|
+
const entries = entriesResult.value;
|
|
89
|
+
for (const entry of entries) {
|
|
90
|
+
if (entry.name !== "SKILL.md")
|
|
91
|
+
continue;
|
|
92
|
+
const fullPath = entry.path;
|
|
93
|
+
const kind = await resolveKind(env, entry, diagnostics);
|
|
94
|
+
if (kind !== "file")
|
|
95
|
+
continue;
|
|
96
|
+
const relPath = relativeEnvPath(rootDir, fullPath);
|
|
97
|
+
if (ignoreMatcher.ignores(relPath))
|
|
98
|
+
continue;
|
|
99
|
+
const result = await loadSkillFromFile(env, fullPath);
|
|
100
|
+
if (result.skill)
|
|
101
|
+
skills.push(result.skill);
|
|
102
|
+
diagnostics.push(...result.diagnostics);
|
|
103
|
+
return { skills, diagnostics };
|
|
104
|
+
}
|
|
105
|
+
for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
106
|
+
if (entry.name.startsWith(".") || entry.name === "node_modules")
|
|
107
|
+
continue;
|
|
108
|
+
const fullPath = entry.path;
|
|
109
|
+
const kind = await resolveKind(env, entry, diagnostics);
|
|
110
|
+
if (!kind)
|
|
111
|
+
continue;
|
|
112
|
+
const relPath = relativeEnvPath(rootDir, fullPath);
|
|
113
|
+
const ignorePath = kind === "directory" ? `${relPath}/` : relPath;
|
|
114
|
+
if (ignoreMatcher.ignores(ignorePath))
|
|
115
|
+
continue;
|
|
116
|
+
if (kind === "directory") {
|
|
117
|
+
const result = await loadSkillsFromDirInternal(env, fullPath, false, ignoreMatcher, rootDir);
|
|
118
|
+
skills.push(...result.skills);
|
|
119
|
+
diagnostics.push(...result.diagnostics);
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (kind !== "file" || !includeRootFiles || !entry.name.endsWith(".md"))
|
|
123
|
+
continue;
|
|
124
|
+
const result = await loadSkillFromFile(env, fullPath);
|
|
125
|
+
if (result.skill)
|
|
126
|
+
skills.push(result.skill);
|
|
127
|
+
diagnostics.push(...result.diagnostics);
|
|
128
|
+
}
|
|
129
|
+
return { skills, diagnostics };
|
|
130
|
+
}
|
|
131
|
+
async function addIgnoreRules(env, ig, dir, rootDir, diagnostics) {
|
|
132
|
+
const relativeDir = relativeEnvPath(rootDir, dir);
|
|
133
|
+
const prefix = relativeDir ? `${relativeDir}/` : "";
|
|
134
|
+
for (const filename of IGNORE_FILE_NAMES) {
|
|
135
|
+
const ignorePath = joinEnvPath(dir, filename);
|
|
136
|
+
const info = await env.fileInfo(ignorePath);
|
|
137
|
+
if (!info.ok) {
|
|
138
|
+
if (info.error.code !== "not_found") {
|
|
139
|
+
diagnostics.push({
|
|
140
|
+
type: "warning",
|
|
141
|
+
code: "file_info_failed",
|
|
142
|
+
message: info.error.message,
|
|
143
|
+
path: ignorePath,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
if (info.value.kind !== "file")
|
|
149
|
+
continue;
|
|
150
|
+
const content = await env.readTextFile(ignorePath);
|
|
151
|
+
if (!content.ok) {
|
|
152
|
+
diagnostics.push({
|
|
153
|
+
type: "warning",
|
|
154
|
+
code: "read_failed",
|
|
155
|
+
message: content.error.message,
|
|
156
|
+
path: ignorePath,
|
|
157
|
+
});
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
const patterns = content.value
|
|
161
|
+
.split(/\r?\n/)
|
|
162
|
+
.map((line) => prefixIgnorePattern(line, prefix))
|
|
163
|
+
.filter((line) => Boolean(line));
|
|
164
|
+
if (patterns.length > 0)
|
|
165
|
+
ig.add(patterns);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function prefixIgnorePattern(line, prefix) {
|
|
169
|
+
const trimmed = line.trim();
|
|
170
|
+
if (!trimmed)
|
|
171
|
+
return null;
|
|
172
|
+
if (trimmed.startsWith("#") && !trimmed.startsWith("\\#"))
|
|
173
|
+
return null;
|
|
174
|
+
let pattern = line;
|
|
175
|
+
let negated = false;
|
|
176
|
+
if (pattern.startsWith("!")) {
|
|
177
|
+
negated = true;
|
|
178
|
+
pattern = pattern.slice(1);
|
|
179
|
+
}
|
|
180
|
+
else if (pattern.startsWith("\\!")) {
|
|
181
|
+
pattern = pattern.slice(1);
|
|
182
|
+
}
|
|
183
|
+
if (pattern.startsWith("/"))
|
|
184
|
+
pattern = pattern.slice(1);
|
|
185
|
+
const prefixed = prefix ? `${prefix}${pattern}` : pattern;
|
|
186
|
+
return negated ? `!${prefixed}` : prefixed;
|
|
187
|
+
}
|
|
188
|
+
async function loadSkillFromFile(env, filePath) {
|
|
189
|
+
const diagnostics = [];
|
|
190
|
+
const rawContent = await env.readTextFile(filePath);
|
|
191
|
+
if (!rawContent.ok) {
|
|
192
|
+
diagnostics.push({
|
|
193
|
+
type: "warning",
|
|
194
|
+
code: "read_failed",
|
|
195
|
+
message: rawContent.error.message,
|
|
196
|
+
path: filePath,
|
|
197
|
+
});
|
|
198
|
+
return { skill: null, diagnostics };
|
|
199
|
+
}
|
|
200
|
+
const parsed = parseFrontmatter(rawContent.value);
|
|
201
|
+
if (!parsed.ok) {
|
|
202
|
+
diagnostics.push({
|
|
203
|
+
type: "warning",
|
|
204
|
+
code: "parse_failed",
|
|
205
|
+
message: parsed.error.message,
|
|
206
|
+
path: filePath,
|
|
207
|
+
});
|
|
208
|
+
return { skill: null, diagnostics };
|
|
209
|
+
}
|
|
210
|
+
const { frontmatter, body } = parsed.value;
|
|
211
|
+
const skillDir = dirnameEnvPath(filePath);
|
|
212
|
+
const parentDirName = basenameEnvPath(skillDir);
|
|
213
|
+
const description = typeof frontmatter.description === "string"
|
|
214
|
+
? frontmatter.description
|
|
215
|
+
: undefined;
|
|
216
|
+
for (const error of validateDescription(description)) {
|
|
217
|
+
diagnostics.push({
|
|
218
|
+
type: "warning",
|
|
219
|
+
code: "invalid_metadata",
|
|
220
|
+
message: error,
|
|
221
|
+
path: filePath,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
const frontmatterName = typeof frontmatter.name === "string" ? frontmatter.name : undefined;
|
|
225
|
+
const name = frontmatterName || parentDirName;
|
|
226
|
+
for (const error of validateName(name, parentDirName)) {
|
|
227
|
+
diagnostics.push({
|
|
228
|
+
type: "warning",
|
|
229
|
+
code: "invalid_metadata",
|
|
230
|
+
message: error,
|
|
231
|
+
path: filePath,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
if (!description || description.trim() === "") {
|
|
235
|
+
return { skill: null, diagnostics };
|
|
236
|
+
}
|
|
237
|
+
return {
|
|
238
|
+
skill: {
|
|
239
|
+
name,
|
|
240
|
+
description,
|
|
241
|
+
content: body,
|
|
242
|
+
filePath,
|
|
243
|
+
disableModelInvocation: frontmatter["disable-model-invocation"] === true,
|
|
244
|
+
},
|
|
245
|
+
diagnostics,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
async function resolveKind(env, info, diagnostics) {
|
|
249
|
+
if (info.kind === "file" || info.kind === "directory")
|
|
250
|
+
return info.kind;
|
|
251
|
+
const canonicalPath = await env.canonicalPath(info.path);
|
|
252
|
+
if (!canonicalPath.ok) {
|
|
253
|
+
if (canonicalPath.error.code !== "not_found") {
|
|
254
|
+
diagnostics.push({
|
|
255
|
+
type: "warning",
|
|
256
|
+
code: "file_info_failed",
|
|
257
|
+
message: canonicalPath.error.message,
|
|
258
|
+
path: info.path,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
return undefined;
|
|
262
|
+
}
|
|
263
|
+
const target = await env.fileInfo(canonicalPath.value);
|
|
264
|
+
if (!target.ok) {
|
|
265
|
+
if (target.error.code !== "not_found") {
|
|
266
|
+
diagnostics.push({
|
|
267
|
+
type: "warning",
|
|
268
|
+
code: "file_info_failed",
|
|
269
|
+
message: target.error.message,
|
|
270
|
+
path: info.path,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
return undefined;
|
|
274
|
+
}
|
|
275
|
+
return target.value.kind === "file" || target.value.kind === "directory"
|
|
276
|
+
? target.value.kind
|
|
277
|
+
: undefined;
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/harness/skills/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Result } from "../result.js";
|
|
2
|
+
export interface SkillFrontmatter {
|
|
3
|
+
name?: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
"disable-model-invocation"?: boolean;
|
|
6
|
+
[key: string]: unknown;
|
|
7
|
+
}
|
|
8
|
+
export declare function parseFrontmatter<T extends Record<string, unknown>>(content: string): Result<{
|
|
9
|
+
frontmatter: T;
|
|
10
|
+
body: string;
|
|
11
|
+
}, Error>;
|
|
12
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/harness/skills/parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChE,OAAO,EAAE,MAAM,GACd,MAAM,CAAC;IAAE,WAAW,EAAE,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,CAAC,CAiBjD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { parse } from "yaml";
|
|
2
|
+
import { toError } from "../result.js";
|
|
3
|
+
export function parseFrontmatter(content) {
|
|
4
|
+
try {
|
|
5
|
+
const normalized = content.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
6
|
+
if (!normalized.startsWith("---"))
|
|
7
|
+
return { ok: true, value: { frontmatter: {}, body: normalized } };
|
|
8
|
+
const endIndex = normalized.indexOf("\n---", 3);
|
|
9
|
+
if (endIndex === -1)
|
|
10
|
+
return { ok: true, value: { frontmatter: {}, body: normalized } };
|
|
11
|
+
const yamlString = normalized.slice(4, endIndex);
|
|
12
|
+
const body = normalized.slice(endIndex + 4).trim();
|
|
13
|
+
return {
|
|
14
|
+
ok: true,
|
|
15
|
+
value: { frontmatter: (parse(yamlString) ?? {}), body },
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
return { ok: false, error: toError(error) };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/harness/skills/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AASvC,MAAM,UAAU,gBAAgB,CAC9B,OAAe;IAEf,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACvE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC;YAC/B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,EAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC;QACzE,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAChD,IAAI,QAAQ,KAAK,CAAC,CAAC;YACjB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,EAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC;QACzE,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACnD,OAAO;YACL,EAAE,EAAE,IAAI;YACR,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAM,EAAE,IAAI,EAAE;SAC7D,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;IAC9C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/harness/skills/validation.ts"],"names":[],"mappings":"AAGA,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAkB1E;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAU7E"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const MAX_NAME_LENGTH = 64;
|
|
2
|
+
const MAX_DESCRIPTION_LENGTH = 1024;
|
|
3
|
+
export function validateName(name, parentDirName) {
|
|
4
|
+
const errors = [];
|
|
5
|
+
if (name !== parentDirName)
|
|
6
|
+
errors.push(`name "${name}" does not match parent directory "${parentDirName}"`);
|
|
7
|
+
if (name.length > MAX_NAME_LENGTH)
|
|
8
|
+
errors.push(`name exceeds ${MAX_NAME_LENGTH} characters (${name.length})`);
|
|
9
|
+
if (!/^[a-z0-9-]+$/.test(name)) {
|
|
10
|
+
errors.push("name contains invalid characters (must be lowercase a-z, 0-9, hyphens only)");
|
|
11
|
+
}
|
|
12
|
+
if (name.startsWith("-") || name.endsWith("-"))
|
|
13
|
+
errors.push("name must not start or end with a hyphen");
|
|
14
|
+
if (name.includes("--"))
|
|
15
|
+
errors.push("name must not contain consecutive hyphens");
|
|
16
|
+
return errors;
|
|
17
|
+
}
|
|
18
|
+
export function validateDescription(description) {
|
|
19
|
+
const errors = [];
|
|
20
|
+
if (!description || description.trim() === "") {
|
|
21
|
+
errors.push("description is required");
|
|
22
|
+
}
|
|
23
|
+
else if (description.length > MAX_DESCRIPTION_LENGTH) {
|
|
24
|
+
errors.push(`description exceeds ${MAX_DESCRIPTION_LENGTH} characters (${description.length})`);
|
|
25
|
+
}
|
|
26
|
+
return errors;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/harness/skills/validation.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAEpC,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,aAAqB;IAC9D,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,IAAI,KAAK,aAAa;QACxB,MAAM,CAAC,IAAI,CACT,SAAS,IAAI,sCAAsC,aAAa,GAAG,CACpE,CAAC;IACJ,IAAI,IAAI,CAAC,MAAM,GAAG,eAAe;QAC/B,MAAM,CAAC,IAAI,CAAC,gBAAgB,eAAe,gBAAgB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7E,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CACT,6EAA6E,CAC9E,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAC1D,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IAC3D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,WAA+B;IACjE,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACzC,CAAC;SAAM,IAAI,WAAW,CAAC,MAAM,GAAG,sBAAsB,EAAE,CAAC;QACvD,MAAM,CAAC,IAAI,CACT,uBAAuB,sBAAsB,gBAAgB,WAAW,CAAC,MAAM,GAAG,CACnF,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/harness/skills.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
|