@vincemakes/kiso-core 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 +21 -0
- package/README.md +9 -0
- package/dist/errors.d.ts +9 -0
- package/dist/errors.js +29 -0
- package/dist/governance/delivery.d.ts +35 -0
- package/dist/governance/delivery.js +47 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +13 -0
- package/dist/kernel/compaction.d.ts +60 -0
- package/dist/kernel/compaction.js +117 -0
- package/dist/kernel/event-log.d.ts +44 -0
- package/dist/kernel/event-log.js +51 -0
- package/dist/kernel/hooks.d.ts +52 -0
- package/dist/kernel/hooks.js +16 -0
- package/dist/kernel/ledger.d.ts +43 -0
- package/dist/kernel/ledger.js +88 -0
- package/dist/kernel/loop.d.ts +97 -0
- package/dist/kernel/loop.js +793 -0
- package/dist/kernel/mode.d.ts +26 -0
- package/dist/kernel/mode.js +21 -0
- package/dist/kernel/permission.d.ts +27 -0
- package/dist/kernel/permission.js +20 -0
- package/dist/kernel/project.d.ts +43 -0
- package/dist/kernel/project.js +287 -0
- package/dist/protocol/adapter.d.ts +77 -0
- package/dist/protocol/adapter.js +44 -0
- package/dist/protocol/events.d.ts +408 -0
- package/dist/protocol/events.js +230 -0
- package/dist/protocol/index.d.ts +3 -0
- package/dist/protocol/index.js +3 -0
- package/dist/protocol/messages.d.ts +113 -0
- package/dist/protocol/messages.js +17 -0
- package/dist/tools/registry.d.ts +28 -0
- package/dist/tools/registry.js +53 -0
- package/dist/tools/tool.d.ts +72 -0
- package/dist/tools/tool.js +21 -0
- package/dist/tools/validate.d.ts +11 -0
- package/dist/tools/validate.js +28 -0
- package/package.json +53 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L1 — the message types.
|
|
3
|
+
*
|
|
4
|
+
* This is the conversation history the kernel hands to `adapter.stream()`.
|
|
5
|
+
* A `Message` is tagged by role; `ToolSpec` is the minimal projection an
|
|
6
|
+
* adapter advertises to the model.
|
|
7
|
+
*
|
|
8
|
+
* WHY the content of a user/tool message is `string | ContentBlock[]`:
|
|
9
|
+
* the string form is the common case and stays cheap, while the array form
|
|
10
|
+
* carries images. Forcing every caller into the array shape to serve the
|
|
11
|
+
* 5% that need vision is a tax paid on every line of product code.
|
|
12
|
+
*
|
|
13
|
+
* See ADR-0003 (sum type) and ADR-0008 (tool contract).
|
|
14
|
+
*
|
|
15
|
+
* This module is types-only: it compiles to nothing.
|
|
16
|
+
*/
|
|
17
|
+
export type Role = "user" | "assistant" | "tool";
|
|
18
|
+
/** A text segment. Equivalent to plain `string` content, but interleavable. */
|
|
19
|
+
export interface TextContentBlock {
|
|
20
|
+
readonly type: "text";
|
|
21
|
+
readonly text: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* An image input.
|
|
25
|
+
*
|
|
26
|
+
* - `sourceType: "url"` — the PROVIDER fetches it. atto never downloads.
|
|
27
|
+
* - `sourceType: "base64"` — `data` holds raw base64 with no `data:` prefix;
|
|
28
|
+
* `mediaType` is then required.
|
|
29
|
+
*
|
|
30
|
+
* Exactly one of `url` / `data` must be set for the declared `sourceType`.
|
|
31
|
+
* Adapters do NOT re-validate this — a mismatch surfaces as a provider 400.
|
|
32
|
+
* That is deliberate: a second validation layer that disagrees with the
|
|
33
|
+
* provider's is worse than none.
|
|
34
|
+
*/
|
|
35
|
+
export interface ImageContentBlock {
|
|
36
|
+
readonly type: "image";
|
|
37
|
+
readonly sourceType: "url" | "base64";
|
|
38
|
+
readonly url?: string;
|
|
39
|
+
readonly data?: string;
|
|
40
|
+
readonly mediaType?: "image/png" | "image/jpeg" | "image/webp" | "image/gif";
|
|
41
|
+
}
|
|
42
|
+
export type ContentBlock = TextContentBlock | ImageContentBlock;
|
|
43
|
+
/**
|
|
44
|
+
* Provenance — where a message actually came from.
|
|
45
|
+
*
|
|
46
|
+
* The model treats this as evidence about intent; a "user" line that the UI
|
|
47
|
+
* recycled from a suggestion chip is NOT user intent, and a model that cannot
|
|
48
|
+
* tell the difference drifts on its own recycled wording (Claude Code
|
|
49
|
+
* #60087). The kernel preserves the label; product code decides how to render
|
|
50
|
+
* it. Defaults (when absent): role `user` → "user", role `assistant` →
|
|
51
|
+
* "model", role `tool` → "tool_result".
|
|
52
|
+
*/
|
|
53
|
+
export type MessageSource = "user" | "suggestion" | "tool_result" | "subagent" | "system" | "model";
|
|
54
|
+
export interface UserMessage {
|
|
55
|
+
readonly role: "user";
|
|
56
|
+
readonly content: string | readonly ContentBlock[];
|
|
57
|
+
readonly source?: MessageSource;
|
|
58
|
+
}
|
|
59
|
+
export interface AssistantTextBlock {
|
|
60
|
+
readonly type: "text";
|
|
61
|
+
readonly text: string;
|
|
62
|
+
}
|
|
63
|
+
export interface AssistantToolUseBlock {
|
|
64
|
+
readonly type: "tool_use";
|
|
65
|
+
readonly callId: string;
|
|
66
|
+
readonly name: string;
|
|
67
|
+
readonly input: Readonly<Record<string, unknown>>;
|
|
68
|
+
}
|
|
69
|
+
export type AssistantBlock = AssistantTextBlock | AssistantToolUseBlock;
|
|
70
|
+
export interface AssistantMessage {
|
|
71
|
+
readonly role: "assistant";
|
|
72
|
+
readonly blocks: readonly AssistantBlock[];
|
|
73
|
+
readonly source?: MessageSource;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Sent back to the model after a tool ran.
|
|
77
|
+
*
|
|
78
|
+
* `tags` are product-defined labels that the kernel honors but never defines.
|
|
79
|
+
* The canonical use is marking a result as do-not-compact (a safety notice, a
|
|
80
|
+
* billing receipt, a trace anchor). kiso prescribes no vocabulary: the kernel
|
|
81
|
+
* matches tags it was configured with and ignores the rest.
|
|
82
|
+
*/
|
|
83
|
+
export interface ToolResultMessage {
|
|
84
|
+
readonly role: "tool";
|
|
85
|
+
readonly callId: string;
|
|
86
|
+
readonly content: string | readonly ContentBlock[];
|
|
87
|
+
readonly isError: boolean;
|
|
88
|
+
readonly source?: MessageSource;
|
|
89
|
+
readonly tags?: readonly string[];
|
|
90
|
+
/**
|
|
91
|
+
* The seq of the `tool_result` EVENT this message was projected from —
|
|
92
|
+
* the stable identity compaction uses to name WHICH result it replaced
|
|
93
|
+
* (五: the callId may repeat across runs). DERIVED, never persisted: the
|
|
94
|
+
* projection attaches it as a non-enumerable field, so it is invisible
|
|
95
|
+
* to deep equality with seed messages and never survives a re-derive
|
|
96
|
+
* from anywhere but the log.
|
|
97
|
+
*/
|
|
98
|
+
readonly eventSeq?: number;
|
|
99
|
+
}
|
|
100
|
+
export type Message = UserMessage | AssistantMessage | ToolResultMessage;
|
|
101
|
+
/**
|
|
102
|
+
* What the adapter advertises to the model.
|
|
103
|
+
*
|
|
104
|
+
* Deliberately minimal: the full tool (handler, repair, concurrency, dedup)
|
|
105
|
+
* is L3-internal and an adapter must never see it. An adapter that can reach
|
|
106
|
+
* the handler will eventually call it, and then the kernel is no longer the
|
|
107
|
+
* only thing that runs tools.
|
|
108
|
+
*/
|
|
109
|
+
export interface ToolSpec {
|
|
110
|
+
readonly name: string;
|
|
111
|
+
readonly description: string;
|
|
112
|
+
readonly inputSchema: Readonly<Record<string, unknown>>;
|
|
113
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L1 — the message types.
|
|
3
|
+
*
|
|
4
|
+
* This is the conversation history the kernel hands to `adapter.stream()`.
|
|
5
|
+
* A `Message` is tagged by role; `ToolSpec` is the minimal projection an
|
|
6
|
+
* adapter advertises to the model.
|
|
7
|
+
*
|
|
8
|
+
* WHY the content of a user/tool message is `string | ContentBlock[]`:
|
|
9
|
+
* the string form is the common case and stays cheap, while the array form
|
|
10
|
+
* carries images. Forcing every caller into the array shape to serve the
|
|
11
|
+
* 5% that need vision is a tax paid on every line of product code.
|
|
12
|
+
*
|
|
13
|
+
* See ADR-0003 (sum type) and ADR-0008 (tool contract).
|
|
14
|
+
*
|
|
15
|
+
* This module is types-only: it compiles to nothing.
|
|
16
|
+
*/
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L3 — the tool registry.
|
|
3
|
+
*
|
|
4
|
+
* One registry per agent. It is the ONLY place the kernel learns which tools
|
|
5
|
+
* exist: nothing is assembled from a list maintained elsewhere, because a
|
|
6
|
+
* second list is a second truth (the failure class behind Claude Code's five
|
|
7
|
+
* hand-maintained agent-tool sets and pi's six copies of the default tool
|
|
8
|
+
* list — see ADR-0001).
|
|
9
|
+
*
|
|
10
|
+
* `subset()` is the structural tool filter: a mode or a subagent gets a
|
|
11
|
+
* registry whose tool table PHYSICALLY lacks the tools it must not see. The
|
|
12
|
+
* model cannot call a tool that is not in its registry — no prompt can
|
|
13
|
+
* achieve that guarantee.
|
|
14
|
+
*/
|
|
15
|
+
import type { ToolSpec } from "../protocol/messages.js";
|
|
16
|
+
import type { Tool } from "./tool.js";
|
|
17
|
+
export declare class ToolRegistry {
|
|
18
|
+
#private;
|
|
19
|
+
register(tool: Tool<any>): void;
|
|
20
|
+
get(name: string): Tool<any> | undefined;
|
|
21
|
+
list(): readonly Tool[];
|
|
22
|
+
has(name: string): boolean;
|
|
23
|
+
/** A registry restricted to the named tools. Unknown names are dropped
|
|
24
|
+
* loudly (the kernel never silently shrinks a tool set). */
|
|
25
|
+
subset(names: readonly string[]): ToolRegistry;
|
|
26
|
+
/** The minimal projection an adapter may see (never the handlers). */
|
|
27
|
+
toSpecs(): readonly ToolSpec[];
|
|
28
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L3 — the tool registry.
|
|
3
|
+
*
|
|
4
|
+
* One registry per agent. It is the ONLY place the kernel learns which tools
|
|
5
|
+
* exist: nothing is assembled from a list maintained elsewhere, because a
|
|
6
|
+
* second list is a second truth (the failure class behind Claude Code's five
|
|
7
|
+
* hand-maintained agent-tool sets and pi's six copies of the default tool
|
|
8
|
+
* list — see ADR-0001).
|
|
9
|
+
*
|
|
10
|
+
* `subset()` is the structural tool filter: a mode or a subagent gets a
|
|
11
|
+
* registry whose tool table PHYSICALLY lacks the tools it must not see. The
|
|
12
|
+
* model cannot call a tool that is not in its registry — no prompt can
|
|
13
|
+
* achieve that guarantee.
|
|
14
|
+
*/
|
|
15
|
+
export class ToolRegistry {
|
|
16
|
+
#tools = new Map();
|
|
17
|
+
register(tool) {
|
|
18
|
+
if (this.#tools.has(tool.name)) {
|
|
19
|
+
throw new Error(`Tool already registered: ${tool.name}`);
|
|
20
|
+
}
|
|
21
|
+
this.#tools.set(tool.name, tool);
|
|
22
|
+
}
|
|
23
|
+
get(name) {
|
|
24
|
+
return this.#tools.get(name);
|
|
25
|
+
}
|
|
26
|
+
list() {
|
|
27
|
+
return [...this.#tools.values()];
|
|
28
|
+
}
|
|
29
|
+
has(name) {
|
|
30
|
+
return this.#tools.has(name);
|
|
31
|
+
}
|
|
32
|
+
/** A registry restricted to the named tools. Unknown names are dropped
|
|
33
|
+
* loudly (the kernel never silently shrinks a tool set). */
|
|
34
|
+
subset(names) {
|
|
35
|
+
const out = new ToolRegistry();
|
|
36
|
+
for (const name of names) {
|
|
37
|
+
const tool = this.#tools.get(name);
|
|
38
|
+
if (tool === undefined) {
|
|
39
|
+
throw new Error(`subset(): unknown tool '${name}'`);
|
|
40
|
+
}
|
|
41
|
+
out.register(tool);
|
|
42
|
+
}
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
/** The minimal projection an adapter may see (never the handlers). */
|
|
46
|
+
toSpecs() {
|
|
47
|
+
return [...this.#tools.values()].map((t) => ({
|
|
48
|
+
name: t.name,
|
|
49
|
+
description: t.description,
|
|
50
|
+
inputSchema: t.parameters,
|
|
51
|
+
}));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L3 — the tool contract.
|
|
3
|
+
*
|
|
4
|
+
* A tool is a pure declaration + handler pair. The kernel never branches on
|
|
5
|
+
* a tool's internals: `parameters` is a JSON Schema the kernel validates and
|
|
6
|
+
* projects to the adapter as `ToolSpec` (adapter never sees the handler —
|
|
7
|
+
* see ADR-0001), `concurrencySafe` decides batch scheduling, `delivers`
|
|
8
|
+
* marks a tool as an artifact producer (consumed by harness-side delivery
|
|
9
|
+
* tracking; the kernel only carries the flag).
|
|
10
|
+
*
|
|
11
|
+
* WHY JSON Schema instead of a runtime library: the kernel has zero runtime
|
|
12
|
+
* dependencies (ADR-0001). Zod / TypeBox / valibot live at the harness layer;
|
|
13
|
+
* a harness author converts their schema to JSON Schema once, at defineTool
|
|
14
|
+
* time, and the kernel stays host- and library-agnostic.
|
|
15
|
+
*
|
|
16
|
+
* `ToolErrorKind` (protocol/events) rides on `ToolResult` so a refusal
|
|
17
|
+
* ("precondition") is distinguishable from a failure after work began.
|
|
18
|
+
*/
|
|
19
|
+
import type { AbortSignalLike } from "../protocol/adapter.js";
|
|
20
|
+
import type { ToolErrorKind } from "../protocol/events.js";
|
|
21
|
+
/** Everything a handler needs, and nothing else. */
|
|
22
|
+
export interface ToolContext {
|
|
23
|
+
readonly signal: AbortSignalLike;
|
|
24
|
+
/** Opaque session anchor, when the harness has one. */
|
|
25
|
+
readonly sessionId?: string;
|
|
26
|
+
/** Free-form per-call metadata the kernel passes through untouched. */
|
|
27
|
+
readonly meta?: Readonly<Record<string, unknown>>;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 第五轮(P1-9): a DISCRIMINATED union — `errorKind` is structurally
|
|
31
|
+
* impossible on a non-error result, matching the persisted-event schema
|
|
32
|
+
* (an isError:false result with an errorKind would be rejected by the
|
|
33
|
+
* store's validator and poison the next load).
|
|
34
|
+
*/
|
|
35
|
+
export type ToolResult = {
|
|
36
|
+
readonly content: string;
|
|
37
|
+
readonly isError: false;
|
|
38
|
+
readonly tags?: readonly string[];
|
|
39
|
+
} | {
|
|
40
|
+
readonly content: string;
|
|
41
|
+
readonly isError: true;
|
|
42
|
+
/** Present only when the handler classified the failure. */
|
|
43
|
+
readonly errorKind?: ToolErrorKind;
|
|
44
|
+
readonly tags?: readonly string[];
|
|
45
|
+
};
|
|
46
|
+
export interface Tool<I = unknown> {
|
|
47
|
+
readonly name: string;
|
|
48
|
+
readonly description: string;
|
|
49
|
+
/** JSON Schema (draft-07 subset). Validated before execute. */
|
|
50
|
+
readonly parameters: Readonly<Record<string, unknown>>;
|
|
51
|
+
/**
|
|
52
|
+
* Per-call concurrency predicate — the CC-invented shape that pi's static
|
|
53
|
+
* executionMode cannot express: the same tool may be parallel-safe for one
|
|
54
|
+
* input and must be serial for another (generate_image with
|
|
55
|
+
* `chain_to_previous`). Absent = safe when true-ish; see ADR-0015.
|
|
56
|
+
*/
|
|
57
|
+
readonly concurrencySafe?: (input: I) => boolean;
|
|
58
|
+
/** Marks this tool as an artifact producer (harness-side delivery truth). */
|
|
59
|
+
readonly delivers?: {
|
|
60
|
+
readonly kind: string;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Exactly-once guard escape hatch (Phase D): a tool whose side effects
|
|
64
|
+
* are safe to repeat (reads, searches, pure computations) declares
|
|
65
|
+
* `idempotent: true`. Without it, the kernel refuses to run the same
|
|
66
|
+
* tool+input twice in a session — a confirmed success is replayed, an
|
|
67
|
+
* interrupted attempt blocks. The default is the safe side.
|
|
68
|
+
*/
|
|
69
|
+
readonly idempotent?: boolean;
|
|
70
|
+
readonly execute: (input: I, ctx: ToolContext) => Promise<ToolResult>;
|
|
71
|
+
}
|
|
72
|
+
export declare function defineTool<I = unknown>(tool: Tool<I>): Tool<I>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L3 — the tool contract.
|
|
3
|
+
*
|
|
4
|
+
* A tool is a pure declaration + handler pair. The kernel never branches on
|
|
5
|
+
* a tool's internals: `parameters` is a JSON Schema the kernel validates and
|
|
6
|
+
* projects to the adapter as `ToolSpec` (adapter never sees the handler —
|
|
7
|
+
* see ADR-0001), `concurrencySafe` decides batch scheduling, `delivers`
|
|
8
|
+
* marks a tool as an artifact producer (consumed by harness-side delivery
|
|
9
|
+
* tracking; the kernel only carries the flag).
|
|
10
|
+
*
|
|
11
|
+
* WHY JSON Schema instead of a runtime library: the kernel has zero runtime
|
|
12
|
+
* dependencies (ADR-0001). Zod / TypeBox / valibot live at the harness layer;
|
|
13
|
+
* a harness author converts their schema to JSON Schema once, at defineTool
|
|
14
|
+
* time, and the kernel stays host- and library-agnostic.
|
|
15
|
+
*
|
|
16
|
+
* `ToolErrorKind` (protocol/events) rides on `ToolResult` so a refusal
|
|
17
|
+
* ("precondition") is distinguishable from a failure after work began.
|
|
18
|
+
*/
|
|
19
|
+
export function defineTool(tool) {
|
|
20
|
+
return tool;
|
|
21
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L3 — real JSON Schema validation of tool arguments (Phase B).
|
|
3
|
+
*
|
|
4
|
+
* `Tool.parameters` was always declared to be a JSON Schema the kernel
|
|
5
|
+
* validates; until Phase B it was only advertised, never enforced. ajv is
|
|
6
|
+
* the core's single runtime dependency (ADR-0023): the alternative —
|
|
7
|
+
* hand-rolling a draft-07 subset — is how schemas silently stop meaning
|
|
8
|
+
* what they say. Validators are compiled once per schema and cached.
|
|
9
|
+
*/
|
|
10
|
+
/** Returns a human-readable failure reason, or null when the input is valid. */
|
|
11
|
+
export declare function validateArgs(schema: Readonly<Record<string, unknown>>, input: unknown): string | null;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L3 — real JSON Schema validation of tool arguments (Phase B).
|
|
3
|
+
*
|
|
4
|
+
* `Tool.parameters` was always declared to be a JSON Schema the kernel
|
|
5
|
+
* validates; until Phase B it was only advertised, never enforced. ajv is
|
|
6
|
+
* the core's single runtime dependency (ADR-0023): the alternative —
|
|
7
|
+
* hand-rolling a draft-07 subset — is how schemas silently stop meaning
|
|
8
|
+
* what they say. Validators are compiled once per schema and cached.
|
|
9
|
+
*/
|
|
10
|
+
import { Ajv } from "ajv";
|
|
11
|
+
const ajv = new Ajv({ strict: false });
|
|
12
|
+
const cache = new WeakMap();
|
|
13
|
+
/** Returns a human-readable failure reason, or null when the input is valid. */
|
|
14
|
+
export function validateArgs(schema, input) {
|
|
15
|
+
let validate = cache.get(schema);
|
|
16
|
+
if (!validate) {
|
|
17
|
+
validate = ajv.compile(schema);
|
|
18
|
+
cache.set(schema, validate);
|
|
19
|
+
}
|
|
20
|
+
if (validate(input))
|
|
21
|
+
return null;
|
|
22
|
+
const first = validate.errors?.[0];
|
|
23
|
+
if (first) {
|
|
24
|
+
const where = first.instancePath || "/";
|
|
25
|
+
return `${where} ${first.message ?? "is invalid"}`;
|
|
26
|
+
}
|
|
27
|
+
return "arguments failed schema validation";
|
|
28
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@vincemakes/kiso-core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "kiso(\u57fa\u790e) core \u2014 protocol, event log, loop, hooks, modes, permissions, compaction, delivery truth. The 2,000-line kernel at the bottom of the kiso framework.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"default": "./dist/index.js"
|
|
11
|
+
},
|
|
12
|
+
"./protocol": {
|
|
13
|
+
"types": "./dist/protocol/index.d.ts",
|
|
14
|
+
"default": "./dist/protocol/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"README.md",
|
|
20
|
+
"LICENSE"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsc -p tsconfig.build.json",
|
|
24
|
+
"typecheck": "tsc -p tsconfig.json",
|
|
25
|
+
"test": "vitest run"
|
|
26
|
+
},
|
|
27
|
+
"keywords": [
|
|
28
|
+
"agent",
|
|
29
|
+
"llm",
|
|
30
|
+
"framework",
|
|
31
|
+
"kernel",
|
|
32
|
+
"anthropic",
|
|
33
|
+
"openai"
|
|
34
|
+
],
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@vincemakes/kiso-evals": "0.1.0",
|
|
37
|
+
"@types/node": "^26.1.2",
|
|
38
|
+
"typescript": "^5.7.2",
|
|
39
|
+
"vitest": "^3.0.0"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"ajv": "^8.20.0"
|
|
43
|
+
},
|
|
44
|
+
"repository": {
|
|
45
|
+
"type": "git",
|
|
46
|
+
"url": "https://github.com/vincemakes/kiso.git",
|
|
47
|
+
"directory": "packages/core"
|
|
48
|
+
},
|
|
49
|
+
"bugs": {
|
|
50
|
+
"url": "https://github.com/vincemakes/kiso/issues"
|
|
51
|
+
},
|
|
52
|
+
"homepage": "https://github.com/vincemakes/kiso/tree/main/packages/core#readme"
|
|
53
|
+
}
|