londai 0.1.0-alpha.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/dist/bin-create.d.ts +3 -0
- package/dist/bin-create.d.ts.map +1 -0
- package/dist/bin-create.js +3 -0
- package/dist/bin-create.js.map +1 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +3 -0
- package/dist/bin.js.map +1 -0
- package/dist/config-loader.d.ts +12 -0
- package/dist/config-loader.d.ts.map +1 -0
- package/dist/config-loader.js +22 -0
- package/dist/config-loader.js.map +1 -0
- package/dist/define-agent.d.ts +34 -0
- package/dist/define-agent.d.ts.map +1 -0
- package/dist/define-agent.js +38 -0
- package/dist/define-agent.js.map +1 -0
- package/dist/define-config.d.ts +27 -0
- package/dist/define-config.d.ts.map +1 -0
- package/dist/define-config.js +88 -0
- package/dist/define-config.js.map +1 -0
- package/dist/define-skill.d.ts +10 -0
- package/dist/define-skill.d.ts.map +1 -0
- package/dist/define-skill.js +45 -0
- package/dist/define-skill.js.map +1 -0
- package/dist/define-tool.d.ts +27 -0
- package/dist/define-tool.d.ts.map +1 -0
- package/dist/define-tool.js +44 -0
- package/dist/define-tool.js.map +1 -0
- package/dist/errors.d.ts +29 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +88 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +12 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +69 -0
- package/dist/logger.js.map +1 -0
- package/dist/londai.d.ts +15 -0
- package/dist/londai.d.ts.map +1 -0
- package/dist/londai.js +74 -0
- package/dist/londai.js.map +1 -0
- package/dist/registry.d.ts +57 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +130 -0
- package/dist/registry.js.map +1 -0
- package/dist/server/abort.d.ts +23 -0
- package/dist/server/abort.d.ts.map +1 -0
- package/dist/server/abort.js +35 -0
- package/dist/server/abort.js.map +1 -0
- package/dist/server/agent-builder.d.ts +49 -0
- package/dist/server/agent-builder.d.ts.map +1 -0
- package/dist/server/agent-builder.js +107 -0
- package/dist/server/agent-builder.js.map +1 -0
- package/dist/server/app.d.ts +21 -0
- package/dist/server/app.d.ts.map +1 -0
- package/dist/server/app.js +34 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/middleware/auth.d.ts +23 -0
- package/dist/server/middleware/auth.d.ts.map +1 -0
- package/dist/server/middleware/auth.js +102 -0
- package/dist/server/middleware/auth.js.map +1 -0
- package/dist/server/middleware/error.d.ts +10 -0
- package/dist/server/middleware/error.d.ts.map +1 -0
- package/dist/server/middleware/error.js +17 -0
- package/dist/server/middleware/error.js.map +1 -0
- package/dist/server/middleware/rate-limit.d.ts +18 -0
- package/dist/server/middleware/rate-limit.d.ts.map +1 -0
- package/dist/server/middleware/rate-limit.js +55 -0
- package/dist/server/middleware/rate-limit.js.map +1 -0
- package/dist/server/routes/approve.d.ts +11 -0
- package/dist/server/routes/approve.d.ts.map +1 -0
- package/dist/server/routes/approve.js +38 -0
- package/dist/server/routes/approve.js.map +1 -0
- package/dist/server/routes/chat-completion.d.ts +14 -0
- package/dist/server/routes/chat-completion.d.ts.map +1 -0
- package/dist/server/routes/chat-completion.js +70 -0
- package/dist/server/routes/chat-completion.js.map +1 -0
- package/dist/server/routes/chat-stream.d.ts +29 -0
- package/dist/server/routes/chat-stream.d.ts.map +1 -0
- package/dist/server/routes/chat-stream.js +190 -0
- package/dist/server/routes/chat-stream.js.map +1 -0
- package/dist/server/routes/common.d.ts +47 -0
- package/dist/server/routes/common.d.ts.map +1 -0
- package/dist/server/routes/common.js +143 -0
- package/dist/server/routes/common.js.map +1 -0
- package/dist/server/routes/session.d.ts +22 -0
- package/dist/server/routes/session.d.ts.map +1 -0
- package/dist/server/routes/session.js +228 -0
- package/dist/server/routes/session.js.map +1 -0
- package/dist/skills-loader.d.ts +46 -0
- package/dist/skills-loader.d.ts.map +1 -0
- package/dist/skills-loader.js +113 -0
- package/dist/skills-loader.js.map +1 -0
- package/dist/types.d.ts +128 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/package.json +47 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Londai
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin-create.d.ts","sourceRoot":"","sources":["../src/bin-create.ts"],"names":[],"mappings":";AACA,OAAO,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin-create.js","sourceRoot":"","sources":["../src/bin-create.ts"],"names":[],"mappings":";AACA,OAAO,uBAAuB,CAAC"}
|
package/dist/bin.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,oBAAoB,CAAC"}
|
package/dist/bin.js
ADDED
package/dist/bin.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `loadConfig` — read the registry, throwing a clear error if `defineConfig`
|
|
3
|
+
* was never called. Used by `londai.run()`.
|
|
4
|
+
*/
|
|
5
|
+
import { getLogger, requireConfig, requireModels } from "./registry.ts";
|
|
6
|
+
export interface LoadedConfig {
|
|
7
|
+
config: ReturnType<typeof requireConfig>;
|
|
8
|
+
models: ReturnType<typeof requireModels>;
|
|
9
|
+
logger: NonNullable<ReturnType<typeof getLogger>>;
|
|
10
|
+
}
|
|
11
|
+
export declare function loadConfig(): LoadedConfig;
|
|
12
|
+
//# sourceMappingURL=config-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../src/config-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAExE,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;IACzC,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;IACzC,MAAM,EAAE,WAAW,CAAC,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC;CAClD;AAED,wBAAgB,UAAU,IAAI,YAAY,CAKzC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `loadConfig` — read the registry, throwing a clear error if `defineConfig`
|
|
3
|
+
* was never called. Used by `londai.run()`.
|
|
4
|
+
*/
|
|
5
|
+
import { getLogger, requireConfig, requireModels } from "./registry.js";
|
|
6
|
+
export function loadConfig() {
|
|
7
|
+
const config = requireConfig();
|
|
8
|
+
const models = requireModels();
|
|
9
|
+
const logger = getLogger() ?? silentConsole();
|
|
10
|
+
return { config, models, logger };
|
|
11
|
+
}
|
|
12
|
+
function silentConsole() {
|
|
13
|
+
return {
|
|
14
|
+
debug() { },
|
|
15
|
+
info() { },
|
|
16
|
+
warn() { },
|
|
17
|
+
error(...args) {
|
|
18
|
+
console.error("[londai]", ...args);
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=config-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../src/config-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAQxE,MAAM,UAAU,UAAU;IACzB,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,SAAS,EAAE,IAAI,aAAa,EAAE,CAAC;IAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,aAAa;IACrB,OAAO;QACN,KAAK,KAAI,CAAC;QACV,IAAI,KAAI,CAAC;QACT,IAAI,KAAI,CAAC;QACT,KAAK,CAAC,GAAG,IAAe;YACvB,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,CAAC;QACpC,CAAC;KACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `defineAgent` — declare an agent spec (name, provider, model, systemPrompt,
|
|
3
|
+
* tools, skills, hooks, thinkingLevel). Returns an {@link AgentSpec} that
|
|
4
|
+
* `londai.run()` instantiates per request.
|
|
5
|
+
*
|
|
6
|
+
* Skills are loaded (file content + frontmatter) at define time via
|
|
7
|
+
* `defineSkill`, so missing-skill-file errors surface at boot. Hooks map
|
|
8
|
+
* directly to `AgentOptions` fields at request build time.
|
|
9
|
+
*
|
|
10
|
+
* The spec is a pure data object — no `Agent` is instantiated here. That keeps
|
|
11
|
+
* `defineAgent` safe to call at module top level (no I/O beyond skill reads).
|
|
12
|
+
*/
|
|
13
|
+
import type { AgentTool, ModelThinkingLevel, SimpleStreamOptions } from "@londai/core";
|
|
14
|
+
import { defineSkill, formatSkillsForSystemPrompt } from "./define-skill.ts";
|
|
15
|
+
import type { AgentHooks, AgentSpec, SkillSpec } from "./types.ts";
|
|
16
|
+
export interface DefineAgentInput {
|
|
17
|
+
name: string;
|
|
18
|
+
description?: string;
|
|
19
|
+
provider: string;
|
|
20
|
+
model: string;
|
|
21
|
+
systemPrompt: string | ((ctx: {
|
|
22
|
+
messages: import("@londai/core").AgentMessage[];
|
|
23
|
+
userId?: string;
|
|
24
|
+
}) => string | Promise<string>);
|
|
25
|
+
tools?: AgentTool<any>[];
|
|
26
|
+
/** Skill specs (already-defined via `defineSkill`) **or** raw skill inputs. */
|
|
27
|
+
skills?: (SkillSpec | Parameters<typeof defineSkill>[0])[];
|
|
28
|
+
hooks?: AgentHooks;
|
|
29
|
+
thinkingLevel?: ModelThinkingLevel;
|
|
30
|
+
streamOptions?: Partial<Omit<SimpleStreamOptions, "signal" | "apiKey" | "onPayload" | "onResponse">>;
|
|
31
|
+
}
|
|
32
|
+
export declare function defineAgent(input: DefineAgentInput): AgentSpec;
|
|
33
|
+
export { formatSkillsForSystemPrompt };
|
|
34
|
+
//# sourceMappingURL=define-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-agent.d.ts","sourceRoot":"","sources":["../src/define-agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEnE,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EACT,MAAM,GACN,CAAC,CAAC,GAAG,EAAE;QAAE,QAAQ,EAAE,OAAO,cAAc,EAAE,YAAY,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7G,KAAK,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;IACzB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,CAAC,SAAS,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC;CACrG;AAUD,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,SAAS,CAgB9D;AAED,OAAO,EAAE,2BAA2B,EAAE,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `defineAgent` — declare an agent spec (name, provider, model, systemPrompt,
|
|
3
|
+
* tools, skills, hooks, thinkingLevel). Returns an {@link AgentSpec} that
|
|
4
|
+
* `londai.run()` instantiates per request.
|
|
5
|
+
*
|
|
6
|
+
* Skills are loaded (file content + frontmatter) at define time via
|
|
7
|
+
* `defineSkill`, so missing-skill-file errors surface at boot. Hooks map
|
|
8
|
+
* directly to `AgentOptions` fields at request build time.
|
|
9
|
+
*
|
|
10
|
+
* The spec is a pure data object — no `Agent` is instantiated here. That keeps
|
|
11
|
+
* `defineAgent` safe to call at module top level (no I/O beyond skill reads).
|
|
12
|
+
*/
|
|
13
|
+
import { defineSkill, formatSkillsForSystemPrompt } from "./define-skill.js";
|
|
14
|
+
function normalizeSkill(skill) {
|
|
15
|
+
if ("content" in skill && typeof skill.content === "string" && skill.name && skill.description) {
|
|
16
|
+
// Looks like a SkillSpec already (has content + name + description). Accept as-is.
|
|
17
|
+
return skill;
|
|
18
|
+
}
|
|
19
|
+
return defineSkill(skill);
|
|
20
|
+
}
|
|
21
|
+
export function defineAgent(input) {
|
|
22
|
+
const skills = (input.skills ?? []).map(normalizeSkill);
|
|
23
|
+
void formatSkillsForSystemPrompt; // referenced lazily by agent-builder; ensure import stays
|
|
24
|
+
return {
|
|
25
|
+
name: input.name,
|
|
26
|
+
description: input.description,
|
|
27
|
+
provider: input.provider,
|
|
28
|
+
model: input.model,
|
|
29
|
+
systemPrompt: input.systemPrompt,
|
|
30
|
+
tools: input.tools ?? [],
|
|
31
|
+
skills,
|
|
32
|
+
hooks: input.hooks ?? {},
|
|
33
|
+
thinkingLevel: input.thinkingLevel,
|
|
34
|
+
streamOptions: input.streamOptions,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export { formatSkillsForSystemPrompt };
|
|
38
|
+
//# sourceMappingURL=define-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-agent.js","sourceRoot":"","sources":["../src/define-agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,WAAW,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAmB7E,SAAS,cAAc,CAAC,KAAoD;IAC3E,IAAI,SAAS,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QAChG,mFAAmF;QACnF,OAAO,KAAkB,CAAC;IAC3B,CAAC;IACD,OAAO,WAAW,CAAC,KAA0C,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAuB;IAClD,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACxD,KAAK,2BAA2B,CAAC,CAAC,0DAA0D;IAE5F,OAAO;QACN,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;QACxB,MAAM;QACN,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;QACxB,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,aAAa,EAAE,KAAK,CAAC,aAAa;KAClC,CAAC;AACH,CAAC;AAED,OAAO,EAAE,2BAA2B,EAAE,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `defineConfig` — register infrastructure config (providers, session, auth,
|
|
3
|
+
* logger) as a process-global side effect.
|
|
4
|
+
*
|
|
5
|
+
* User pattern (DESIGN §4):
|
|
6
|
+
* ```ts
|
|
7
|
+
* // src/config.ts
|
|
8
|
+
* import { defineConfig } from "londai";
|
|
9
|
+
* export default defineConfig({ providers: { anthropic: {} }, auth: false });
|
|
10
|
+
* ```
|
|
11
|
+
* Then `import "./config"` (or rely on the generated side-effect import) before
|
|
12
|
+
* `londai.run()` so the registry is populated.
|
|
13
|
+
*
|
|
14
|
+
* Provider resolution:
|
|
15
|
+
* - Known keys (`anthropic`, `openai`, `google`) → built-in provider factories.
|
|
16
|
+
* - Any other key → treated as an OpenAI-compatible endpoint (Ollama, Groq, etc.)
|
|
17
|
+
* via `createOpenAICompatProvider({ id: key, baseUrl, apiKey, envVarName })`.
|
|
18
|
+
*/
|
|
19
|
+
import { resolveApiKey } from "@londai/providers";
|
|
20
|
+
import type { ConfigSpec } from "./types.ts";
|
|
21
|
+
/**
|
|
22
|
+
* Register config globally. Re-calling overwrites the previous registration
|
|
23
|
+
* (useful for HMR/tests) and rebuilds the `Models` collection from scratch.
|
|
24
|
+
*/
|
|
25
|
+
export declare function defineConfig(spec: ConfigSpec): ConfigSpec;
|
|
26
|
+
export { resolveApiKey };
|
|
27
|
+
//# sourceMappingURL=define-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-config.d.ts","sourceRoot":"","sources":["../src/define-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAON,aAAa,EAEb,MAAM,mBAAmB,CAAC;AAI3B,OAAO,KAAK,EAAE,UAAU,EAAuB,MAAM,YAAY,CAAC;AAsDlE;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAkBzD;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `defineConfig` — register infrastructure config (providers, session, auth,
|
|
3
|
+
* logger) as a process-global side effect.
|
|
4
|
+
*
|
|
5
|
+
* User pattern (DESIGN §4):
|
|
6
|
+
* ```ts
|
|
7
|
+
* // src/config.ts
|
|
8
|
+
* import { defineConfig } from "londai";
|
|
9
|
+
* export default defineConfig({ providers: { anthropic: {} }, auth: false });
|
|
10
|
+
* ```
|
|
11
|
+
* Then `import "./config"` (or rely on the generated side-effect import) before
|
|
12
|
+
* `londai.run()` so the registry is populated.
|
|
13
|
+
*
|
|
14
|
+
* Provider resolution:
|
|
15
|
+
* - Known keys (`anthropic`, `openai`, `google`) → built-in provider factories.
|
|
16
|
+
* - Any other key → treated as an OpenAI-compatible endpoint (Ollama, Groq, etc.)
|
|
17
|
+
* via `createOpenAICompatProvider({ id: key, baseUrl, apiKey, envVarName })`.
|
|
18
|
+
*/
|
|
19
|
+
import { anthropicProvider, createModels, createOpenAICompatProvider, fauxProvider, googleProvider, openaiProvider, resolveApiKey, setDefaultModels, } from "@londai/providers";
|
|
20
|
+
import { createSessionRepo } from "@londai/session";
|
|
21
|
+
import { createConsoleLogger } from "./logger.js";
|
|
22
|
+
import { setConfig, setSessionRepo } from "./registry.js";
|
|
23
|
+
const BUILTIN_PROVIDERS = {
|
|
24
|
+
anthropic: anthropicProvider,
|
|
25
|
+
openai: openaiProvider,
|
|
26
|
+
google: googleProvider,
|
|
27
|
+
};
|
|
28
|
+
function isBuiltinProvider(key) {
|
|
29
|
+
return key in BUILTIN_PROVIDERS;
|
|
30
|
+
}
|
|
31
|
+
function registerProvider(models, key, entry) {
|
|
32
|
+
if (key === "faux") {
|
|
33
|
+
models.setProvider(fauxProvider());
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (isBuiltinProvider(key)) {
|
|
37
|
+
// Empty object → builtin defaults. Non-empty is unexpected for builtins but
|
|
38
|
+
// we still register the builtin; callers can customize the shared default
|
|
39
|
+
// `Models` via `getModels()` directly.
|
|
40
|
+
void entry;
|
|
41
|
+
models.setProvider(BUILTIN_PROVIDERS[key]());
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
// Treat as OpenAI-compatible custom endpoint.
|
|
45
|
+
if (!("baseUrl" in entry) || typeof entry.baseUrl !== "string" || entry.baseUrl.length === 0) {
|
|
46
|
+
throw new Error(`londai: custom provider "${key}" requires a baseUrl. Set it like: providers["${key}"] = { baseUrl: "..." }.`);
|
|
47
|
+
}
|
|
48
|
+
const provider = createOpenAICompatProvider({
|
|
49
|
+
id: key,
|
|
50
|
+
baseUrl: entry.baseUrl,
|
|
51
|
+
apiKey: entry.apiKey,
|
|
52
|
+
envVarName: entry.envVarName,
|
|
53
|
+
models: (entry.models ?? []).map((m) => ({
|
|
54
|
+
id: m.id,
|
|
55
|
+
name: m.name ?? m.id,
|
|
56
|
+
api: "openai-completions",
|
|
57
|
+
provider: key,
|
|
58
|
+
baseUrl: entry.baseUrl,
|
|
59
|
+
reasoning: false,
|
|
60
|
+
input: ["text"],
|
|
61
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
62
|
+
contextWindow: 128_000,
|
|
63
|
+
maxTokens: 8_192,
|
|
64
|
+
})),
|
|
65
|
+
});
|
|
66
|
+
models.setProvider(provider);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Register config globally. Re-calling overwrites the previous registration
|
|
70
|
+
* (useful for HMR/tests) and rebuilds the `Models` collection from scratch.
|
|
71
|
+
*/
|
|
72
|
+
export function defineConfig(spec) {
|
|
73
|
+
const models = createModels();
|
|
74
|
+
for (const [key, entry] of Object.entries(spec.providers ?? {})) {
|
|
75
|
+
registerProvider(models, key, entry);
|
|
76
|
+
}
|
|
77
|
+
const logger = createConsoleLogger(spec.logger);
|
|
78
|
+
setDefaultModels(models);
|
|
79
|
+
setConfig(spec, models, logger);
|
|
80
|
+
// Wire session repo if configured.
|
|
81
|
+
if (spec.session?.url) {
|
|
82
|
+
const repo = createSessionRepo({ url: spec.session.url, schema: spec.session.schema });
|
|
83
|
+
setSessionRepo(repo);
|
|
84
|
+
}
|
|
85
|
+
return spec;
|
|
86
|
+
}
|
|
87
|
+
export { resolveApiKey };
|
|
88
|
+
//# sourceMappingURL=define-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-config.js","sourceRoot":"","sources":["../src/define-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `defineSkill` — load a skill (frontmatter + markdown) explicit & type-safe.
|
|
3
|
+
*
|
|
4
|
+
* Londai is explicit (DESIGN §12): no folder auto-discovery. Pass `source` (a
|
|
5
|
+
* markdown file path relative to cwd) or `content` (inline markdown).
|
|
6
|
+
*/
|
|
7
|
+
import type { DefineSkillInput, SkillSpec } from "./types.ts";
|
|
8
|
+
export declare function defineSkill(input: DefineSkillInput): SkillSpec;
|
|
9
|
+
export { formatSkillsForSystemPrompt } from "./skills-loader.ts";
|
|
10
|
+
//# sourceMappingURL=define-skill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-skill.d.ts","sourceRoot":"","sources":["../src/define-skill.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE9D,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,SAAS,CAqC9D;AAED,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `defineSkill` — load a skill (frontmatter + markdown) explicit & type-safe.
|
|
3
|
+
*
|
|
4
|
+
* Londai is explicit (DESIGN §12): no folder auto-discovery. Pass `source` (a
|
|
5
|
+
* markdown file path relative to cwd) or `content` (inline markdown).
|
|
6
|
+
*/
|
|
7
|
+
import { loadSkillFromFile, validateSkillDescription, validateSkillName } from "./skills-loader.js";
|
|
8
|
+
export function defineSkill(input) {
|
|
9
|
+
let description = input.description;
|
|
10
|
+
let content = input.content ?? "";
|
|
11
|
+
let filePath;
|
|
12
|
+
let disableModelInvocation = input.disableModelInvocation;
|
|
13
|
+
if (input.source) {
|
|
14
|
+
const loaded = loadSkillFromFile(input.source);
|
|
15
|
+
filePath = loaded.resolvedPath;
|
|
16
|
+
if (loaded.content)
|
|
17
|
+
content = loaded.content;
|
|
18
|
+
if (loaded.frontmatter.description)
|
|
19
|
+
description ??= loaded.frontmatter.description;
|
|
20
|
+
if (loaded.frontmatter.name && !input.name) {
|
|
21
|
+
// frontmatter name is informational; input.name wins
|
|
22
|
+
}
|
|
23
|
+
if (typeof loaded.frontmatter["disable-model-invocation"] === "boolean") {
|
|
24
|
+
disableModelInvocation ??= loaded.frontmatter["disable-model-invocation"];
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (!description) {
|
|
28
|
+
throw new Error(`londai: skill "${input.name}" is missing a description (provide description or frontmatter).`);
|
|
29
|
+
}
|
|
30
|
+
for (const warning of validateSkillName(input.name)) {
|
|
31
|
+
console.warn(`[londai] skill "${input.name}": ${warning}`);
|
|
32
|
+
}
|
|
33
|
+
for (const warning of validateSkillDescription(description)) {
|
|
34
|
+
console.warn(`[londai] skill "${input.name}": ${warning}`);
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
name: input.name,
|
|
38
|
+
description,
|
|
39
|
+
content,
|
|
40
|
+
filePath,
|
|
41
|
+
disableModelInvocation,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export { formatSkillsForSystemPrompt } from "./skills-loader.js";
|
|
45
|
+
//# sourceMappingURL=define-skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-skill.js","sourceRoot":"","sources":["../src/define-skill.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAGpG,MAAM,UAAU,WAAW,CAAC,KAAuB;IAClD,IAAI,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;IACpC,IAAI,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;IAClC,IAAI,QAA4B,CAAC;IACjC,IAAI,sBAAsB,GAAG,KAAK,CAAC,sBAAsB,CAAC;IAE1D,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/C,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC;QAC/B,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC7C,IAAI,MAAM,CAAC,WAAW,CAAC,WAAW;YAAE,WAAW,KAAK,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC;QACnF,IAAI,MAAM,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAC5C,qDAAqD;QACtD,CAAC;QACD,IAAI,OAAO,MAAM,CAAC,WAAW,CAAC,0BAA0B,CAAC,KAAK,SAAS,EAAE,CAAC;YACzE,sBAAsB,KAAK,MAAM,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC;QAC3E,CAAC;IACF,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,kBAAkB,KAAK,CAAC,IAAI,kEAAkE,CAAC,CAAC;IACjH,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,mBAAmB,KAAK,CAAC,IAAI,MAAM,OAAO,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,wBAAwB,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,mBAAmB,KAAK,CAAC,IAAI,MAAM,OAAO,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO;QACN,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,WAAW;QACX,OAAO;QACP,QAAQ;QACR,sBAAsB;KACtB,CAAC;AACH,CAAC;AAED,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `defineTool` — type-safe tool definition with Zod-schema validation.
|
|
3
|
+
*
|
|
4
|
+
* Wraps the user's `execute` so that:
|
|
5
|
+
* 1. `prepareArguments` shim is applied first (normalize legacy model formats).
|
|
6
|
+
* 2. `parameters.safeParse(args)` runs before `execute`. Validation failures
|
|
7
|
+
* return an `isError: true` tool result (the model self-correct path)
|
|
8
|
+
* instead of throwing into the agent loop.
|
|
9
|
+
* 3. `execute` throws are encoded as error tool results by the agent loop's
|
|
10
|
+
* existing catch (core contract); nothing extra needed here.
|
|
11
|
+
*
|
|
12
|
+
* Returns a core `AgentTool`, ready to pass to `defineAgent({ tools })`.
|
|
13
|
+
*/
|
|
14
|
+
import type { AgentTool, AgentToolResult, AgentToolUpdateCallback, ToolExecutionMode, ToolRisk } from "@londai/core";
|
|
15
|
+
import type { ZodTypeAny } from "zod";
|
|
16
|
+
export interface DefineToolInput<TParameters extends ZodTypeAny = ZodTypeAny, TDetails = any> {
|
|
17
|
+
name: string;
|
|
18
|
+
label: string;
|
|
19
|
+
description: string;
|
|
20
|
+
parameters: TParameters;
|
|
21
|
+
risk?: ToolRisk;
|
|
22
|
+
executionMode?: ToolExecutionMode;
|
|
23
|
+
prepareArguments?: (args: unknown) => unknown;
|
|
24
|
+
execute: (toolCallId: string, params: unknown, signal?: AbortSignal, onUpdate?: AgentToolUpdateCallback<TDetails>) => Promise<AgentToolResult<TDetails>>;
|
|
25
|
+
}
|
|
26
|
+
export declare function defineTool<TParameters extends ZodTypeAny = ZodTypeAny, TDetails = any>(input: DefineToolInput<TParameters, TDetails>): AgentTool<TParameters, TDetails>;
|
|
27
|
+
//# sourceMappingURL=define-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-tool.d.ts","sourceRoot":"","sources":["../src/define-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACX,SAAS,EACT,eAAe,EACf,uBAAuB,EAEvB,iBAAiB,EACjB,QAAQ,EACR,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAEtC,MAAM,WAAW,eAAe,CAAC,WAAW,SAAS,UAAU,GAAG,UAAU,EAAE,QAAQ,GAAG,GAAG;IAC3F,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,WAAW,CAAC;IACxB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;IAC9C,OAAO,EAAE,CACR,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,OAAO,EACf,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,uBAAuB,CAAC,QAAQ,CAAC,KACxC,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;CACxC;AAiBD,wBAAgB,UAAU,CAAC,WAAW,SAAS,UAAU,GAAG,UAAU,EAAE,QAAQ,GAAG,GAAG,EACrF,KAAK,EAAE,eAAe,CAAC,WAAW,EAAE,QAAQ,CAAC,GAC3C,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,CAoBlC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `defineTool` — type-safe tool definition with Zod-schema validation.
|
|
3
|
+
*
|
|
4
|
+
* Wraps the user's `execute` so that:
|
|
5
|
+
* 1. `prepareArguments` shim is applied first (normalize legacy model formats).
|
|
6
|
+
* 2. `parameters.safeParse(args)` runs before `execute`. Validation failures
|
|
7
|
+
* return an `isError: true` tool result (the model self-correct path)
|
|
8
|
+
* instead of throwing into the agent loop.
|
|
9
|
+
* 3. `execute` throws are encoded as error tool results by the agent loop's
|
|
10
|
+
* existing catch (core contract); nothing extra needed here.
|
|
11
|
+
*
|
|
12
|
+
* Returns a core `AgentTool`, ready to pass to `defineAgent({ tools })`.
|
|
13
|
+
*/
|
|
14
|
+
function validationErrorResult(toolName, args, issues) {
|
|
15
|
+
const formatted = issues.length
|
|
16
|
+
? issues
|
|
17
|
+
.map((issue) => ` - ${issue.path.length > 0 ? issue.path.join(".") : "(root)"}: ${issue.message}`)
|
|
18
|
+
.join("\n")
|
|
19
|
+
: "Unknown validation error";
|
|
20
|
+
const text = `Validation failed for tool "${toolName}":\n${formatted}\n\nReceived arguments:\n${JSON.stringify(args, null, 2)}`;
|
|
21
|
+
const content = [{ type: "text", text }];
|
|
22
|
+
return { content, isError: true, details: undefined };
|
|
23
|
+
}
|
|
24
|
+
export function defineTool(input) {
|
|
25
|
+
const wrappedExecute = async (toolCallId, params, signal, onUpdate) => {
|
|
26
|
+
const prepared = input.prepareArguments ? input.prepareArguments(params) : params;
|
|
27
|
+
const parsed = input.parameters.safeParse(prepared);
|
|
28
|
+
if (!parsed.success) {
|
|
29
|
+
return validationErrorResult(input.name, prepared, parsed.error.issues);
|
|
30
|
+
}
|
|
31
|
+
return input.execute(toolCallId, parsed.data, signal, onUpdate);
|
|
32
|
+
};
|
|
33
|
+
return {
|
|
34
|
+
name: input.name,
|
|
35
|
+
label: input.label,
|
|
36
|
+
description: input.description,
|
|
37
|
+
parameters: input.parameters,
|
|
38
|
+
risk: input.risk,
|
|
39
|
+
executionMode: input.executionMode,
|
|
40
|
+
prepareArguments: input.prepareArguments,
|
|
41
|
+
execute: wrappedExecute,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=define-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-tool.js","sourceRoot":"","sources":["../src/define-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA4BH,SAAS,qBAAqB,CAC7B,QAAgB,EAChB,IAAa,EACb,MAAkD;IAElD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM;QAC9B,CAAC,CAAC,MAAM;aACL,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;aAClG,IAAI,CAAC,IAAI,CAAC;QACb,CAAC,CAAC,0BAA0B,CAAC;IAC9B,MAAM,IAAI,GAAG,+BAA+B,QAAQ,OAAO,SAAS,4BAA4B,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;IAChI,MAAM,OAAO,GAAkB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,UAAU,CACzB,KAA6C;IAE7C,MAAM,cAAc,GAAgD,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;QAClH,MAAM,QAAQ,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAClF,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,qBAAqB,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjE,CAAC,CAAC;IAEF,OAAO;QACN,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,OAAO,EAAE,cAAc;KACvB,CAAC;AACH,CAAC"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework errors + HTTP status mapping.
|
|
3
|
+
*
|
|
4
|
+
* `Result.err` surfaced from the agent loop, `AgentError` from core, and
|
|
5
|
+
* `FrameworkError` from transport/DX all carry a stable `code` that
|
|
6
|
+
* `errorToStatus` maps to an HTTP status. LLM-level failures (stopReason
|
|
7
|
+
* "error"/"aborted") are emitted as SSE `event: error` and never reach the HTTP
|
|
8
|
+
* error path.
|
|
9
|
+
*/
|
|
10
|
+
import type { HttpErrorCode } from "./types.ts";
|
|
11
|
+
/** Framework failure carrying a stable {@link HttpErrorCode}. */
|
|
12
|
+
export declare class FrameworkError extends Error {
|
|
13
|
+
readonly code: HttpErrorCode;
|
|
14
|
+
constructor(code: HttpErrorCode, message: string, cause?: unknown);
|
|
15
|
+
}
|
|
16
|
+
/** Map an error (AgentError/FrameworkError/Error) to an HTTP status code. */
|
|
17
|
+
export declare function errorToStatus(error: unknown): number;
|
|
18
|
+
/** Extract a stable {@link HttpErrorCode} from any thrown value. */
|
|
19
|
+
export declare function errorCodeOf(error: unknown): HttpErrorCode;
|
|
20
|
+
/** Map an {@link HttpErrorCode} to an HTTP status. */
|
|
21
|
+
export declare function codeToStatus(code: HttpErrorCode): number;
|
|
22
|
+
/** HTTP body for an error response. */
|
|
23
|
+
export declare function errorBody(error: unknown): {
|
|
24
|
+
error: {
|
|
25
|
+
code: HttpErrorCode;
|
|
26
|
+
message: string;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,iEAAiE;AACjE,qBAAa,cAAe,SAAQ,KAAK;IACxC,SAAgB,IAAI,EAAE,aAAa,CAAC;gBAExB,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAKjE;AAED,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGpD;AAED,oEAAoE;AACpE,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CAwBzD;AAED,sDAAsD;AACtD,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAyBxD;AAED,uCAAuC;AACvC,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAE7F"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework errors + HTTP status mapping.
|
|
3
|
+
*
|
|
4
|
+
* `Result.err` surfaced from the agent loop, `AgentError` from core, and
|
|
5
|
+
* `FrameworkError` from transport/DX all carry a stable `code` that
|
|
6
|
+
* `errorToStatus` maps to an HTTP status. LLM-level failures (stopReason
|
|
7
|
+
* "error"/"aborted") are emitted as SSE `event: error` and never reach the HTTP
|
|
8
|
+
* error path.
|
|
9
|
+
*/
|
|
10
|
+
/** Framework failure carrying a stable {@link HttpErrorCode}. */
|
|
11
|
+
export class FrameworkError extends Error {
|
|
12
|
+
code;
|
|
13
|
+
constructor(code, message, cause) {
|
|
14
|
+
super(message, cause === undefined ? undefined : { cause: cause });
|
|
15
|
+
this.name = "FrameworkError";
|
|
16
|
+
this.code = code;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/** Map an error (AgentError/FrameworkError/Error) to an HTTP status code. */
|
|
20
|
+
export function errorToStatus(error) {
|
|
21
|
+
const code = errorCodeOf(error);
|
|
22
|
+
return codeToStatus(code);
|
|
23
|
+
}
|
|
24
|
+
/** Extract a stable {@link HttpErrorCode} from any thrown value. */
|
|
25
|
+
export function errorCodeOf(error) {
|
|
26
|
+
if (error instanceof FrameworkError)
|
|
27
|
+
return error.code;
|
|
28
|
+
if (error instanceof Error) {
|
|
29
|
+
const code = error.code;
|
|
30
|
+
if (typeof code === "string") {
|
|
31
|
+
const mapped = {
|
|
32
|
+
aborted: "aborted",
|
|
33
|
+
timeout: "timeout",
|
|
34
|
+
busy: "busy",
|
|
35
|
+
invalid_state: "config",
|
|
36
|
+
invalid_argument: "validation",
|
|
37
|
+
hook: "unknown",
|
|
38
|
+
session: "unknown",
|
|
39
|
+
unknown: "unknown",
|
|
40
|
+
not_found: "not_found",
|
|
41
|
+
invalid_session: "validation",
|
|
42
|
+
invalid_entry: "validation",
|
|
43
|
+
storage: "unknown",
|
|
44
|
+
summarization_failed: "unknown",
|
|
45
|
+
};
|
|
46
|
+
if (code in mapped)
|
|
47
|
+
return mapped[code];
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return "unknown";
|
|
51
|
+
}
|
|
52
|
+
/** Map an {@link HttpErrorCode} to an HTTP status. */
|
|
53
|
+
export function codeToStatus(code) {
|
|
54
|
+
switch (code) {
|
|
55
|
+
case "auth":
|
|
56
|
+
return 401;
|
|
57
|
+
case "forbidden":
|
|
58
|
+
return 403;
|
|
59
|
+
case "not_found":
|
|
60
|
+
return 404;
|
|
61
|
+
case "conflict":
|
|
62
|
+
case "busy":
|
|
63
|
+
return 409;
|
|
64
|
+
case "validation":
|
|
65
|
+
return 422;
|
|
66
|
+
case "provider":
|
|
67
|
+
case "upstream":
|
|
68
|
+
return 502;
|
|
69
|
+
case "timeout":
|
|
70
|
+
return 504;
|
|
71
|
+
case "config":
|
|
72
|
+
return 500;
|
|
73
|
+
case "aborted":
|
|
74
|
+
return 499;
|
|
75
|
+
default:
|
|
76
|
+
return 500;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/** HTTP body for an error response. */
|
|
80
|
+
export function errorBody(error) {
|
|
81
|
+
return { error: { code: errorCodeOf(error), message: errorMessage(error) } };
|
|
82
|
+
}
|
|
83
|
+
function errorMessage(error) {
|
|
84
|
+
if (error instanceof Error)
|
|
85
|
+
return error.message;
|
|
86
|
+
return String(error);
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,iEAAiE;AACjE,MAAM,OAAO,cAAe,SAAQ,KAAK;IACxB,IAAI,CAAgB;IAEpC,YAAY,IAAmB,EAAE,OAAe,EAAE,KAAe;QAChE,KAAK,CAAC,OAAO,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAc,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;CACD;AAED,6EAA6E;AAC7E,MAAM,UAAU,aAAa,CAAC,KAAc;IAC3C,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAChC,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,WAAW,CAAC,KAAc;IACzC,IAAI,KAAK,YAAY,cAAc;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IACvD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAI,KAA4B,CAAC,IAAI,CAAC;QAChD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAkC;gBAC7C,OAAO,EAAE,SAAS;gBAClB,OAAO,EAAE,SAAS;gBAClB,IAAI,EAAE,MAAM;gBACZ,aAAa,EAAE,QAAQ;gBACvB,gBAAgB,EAAE,YAAY;gBAC9B,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,SAAS;gBAClB,OAAO,EAAE,SAAS;gBAClB,SAAS,EAAE,WAAW;gBACtB,eAAe,EAAE,YAAY;gBAC7B,aAAa,EAAE,YAAY;gBAC3B,OAAO,EAAE,SAAS;gBAClB,oBAAoB,EAAE,SAAS;aAC/B,CAAC;YACF,IAAI,IAAI,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,YAAY,CAAC,IAAmB;IAC/C,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,MAAM;YACV,OAAO,GAAG,CAAC;QACZ,KAAK,WAAW;YACf,OAAO,GAAG,CAAC;QACZ,KAAK,WAAW;YACf,OAAO,GAAG,CAAC;QACZ,KAAK,UAAU,CAAC;QAChB,KAAK,MAAM;YACV,OAAO,GAAG,CAAC;QACZ,KAAK,YAAY;YAChB,OAAO,GAAG,CAAC;QACZ,KAAK,UAAU,CAAC;QAChB,KAAK,UAAU;YACd,OAAO,GAAG,CAAC;QACZ,KAAK,SAAS;YACb,OAAO,GAAG,CAAC;QACZ,KAAK,QAAQ;YACZ,OAAO,GAAG,CAAC;QACZ,KAAK,SAAS;YACb,OAAO,GAAG,CAAC;QACZ;YACC,OAAO,GAAG,CAAC;IACb,CAAC;AACF,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,SAAS,CAAC,KAAc;IACvC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;AAC9E,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IACnC,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IACjD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACtB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public API of the `londai` framework package.
|
|
3
|
+
*
|
|
4
|
+
* ```ts
|
|
5
|
+
* import { londai, defineConfig, defineAgent, defineTool, defineSkill } from "londai";
|
|
6
|
+
* ```
|
|
7
|
+
*/
|
|
8
|
+
import "@londai/providers";
|
|
9
|
+
export { Agent, type AgentEvent, type AgentMessage, type AgentTool, type AgentToolResult, type AgentToolUpdateCallback, convertToLlm, err, type ImageContent, type Message, type Model, type ModelThinkingLevel, ok, type StopReason, type TextContent, type ToolCall, type ToolRisk, type Usage, } from "@londai/core";
|
|
10
|
+
export { createStreamFn, getDefaultModels, setDefaultModels, streamSimple, toolInputSchema } from "@londai/providers";
|
|
11
|
+
export type { Conversation, ConversationListEntry, CreateSessionRepoOptions, PostgresSessionRepoOptions, SessionContext, SessionRepo, SessionSnapshot, } from "@londai/session";
|
|
12
|
+
export { buildSchema, conversations, createSessionRepo, loandaiSchema, MemorySessionRepo, messages, PostgresSessionRepo, } from "@londai/session";
|
|
13
|
+
export type { DefineAgentInput } from "./define-agent.ts";
|
|
14
|
+
export { defineAgent, formatSkillsForSystemPrompt } from "./define-agent.ts";
|
|
15
|
+
export { defineConfig } from "./define-config.ts";
|
|
16
|
+
export { defineSkill } from "./define-skill.ts";
|
|
17
|
+
export type { DefineToolInput } from "./define-tool.ts";
|
|
18
|
+
export { defineTool } from "./define-tool.ts";
|
|
19
|
+
export { codeToStatus, errorCodeOf, errorToStatus, FrameworkError } from "./errors.ts";
|
|
20
|
+
export { createConsoleLogger, silentLogger } from "./logger.ts";
|
|
21
|
+
export { londai } from "./londai.ts";
|
|
22
|
+
export { getAuthConfig, getModels, requireConfig, requireModels, resetRegistry, } from "./registry.ts";
|
|
23
|
+
export { formatSkillsForSystemPrompt as formatSkills, loadSkillFromFile, parseFrontmatter, validateSkillDescription, validateSkillName, } from "./skills-loader.ts";
|
|
24
|
+
export type { AgentSpec, ApprovalConfig, ApprovalRiskLevel, AuthConfig, ConfigSpec, DefineSkillInput, HttpErrorCode, Logger, LoggerConfig, LondaiRunOptions, LondaiServerHandle, ProviderConfigEntry, RateLimitConfig, SessionConfig, SkillSpec, } from "./types.ts";
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,mBAAmB,CAAC;AAG3B,OAAO,EACN,KAAK,EACL,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAC5B,YAAY,EACZ,GAAG,EACH,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,KAAK,KAAK,EACV,KAAK,kBAAkB,EACvB,EAAE,EACF,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,KAAK,GACV,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACtH,YAAY,EACX,YAAY,EACZ,qBAAqB,EACrB,wBAAwB,EACxB,0BAA0B,EAC1B,cAAc,EACd,WAAW,EACX,eAAe,GACf,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACN,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,mBAAmB,GACnB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EACN,aAAa,EACb,SAAS,EACT,aAAa,EACb,aAAa,EACb,aAAa,GACb,MAAM,eAAe,CAAC;AACvB,OAAO,EACN,2BAA2B,IAAI,YAAY,EAC3C,iBAAiB,EACjB,gBAAgB,EAChB,wBAAwB,EACxB,iBAAiB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACX,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,MAAM,EACN,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,SAAS,GACT,MAAM,YAAY,CAAC"}
|