Skip to main content

v3.1.0

Released: August 10, 2026

Highlights

  • Tool overrides at init (toolpack-sdk) — toolOverrides lets host packages replace built-in tools by name after built-ins load
  • Runtime multi-project loading (toolpack-sdk) — loadToolProjects() registers several projects and rebuilds the BM25 index once; searchTools() / getRegisteredToolNames() expose registration for inspection and tests
  • Finer tool categories (toolpack-sdk) — the old network category is split into http, web, github, and slack
  • Dynamic tool.search categories (toolpack-sdk) — category enum is built from currently registered tools (excluding meta)
  • Incremental knowledge APIs (@toolpack-sdk/knowledge) — TextSource, ingest(), delete(), deleteWhere(), plus onAdd / onDelete hooks
  • Peer bump (@toolpack-sdk/agents) — requires toolpack-sdk@^3.1.0 and @toolpack-sdk/knowledge@^3.1.0 (optional)

Breaking changes

ChangeMigration
Tool / project category network removedUse http, web, github, or slack as appropriate
CHAT_MODE.allowedToolCategoriesWas ['network']; now ['http', 'web']
tool.search category enumReplaces network with http, web, github, slack (and may be overridden dynamically from registered tools)

If you filter modes or configs with category: 'network', update those allow/block lists to the new categories.


toolpack-sdk

toolOverrides on Toolpack.init()

Pass tool projects that should win over same-named built-ins. They load after built-ins and also feed the dynamic tool.search category enum.

const sdk = await Toolpack.init({
provider: 'anthropic',
tools: true,
toolOverrides: [customToolsProject],
});
FieldTypeDefaultDescription
toolOverridesToolProject[]undefinedProjects loaded after built-ins; same tool name replaces the built-in

loadToolProjects(), searchTools(), getRegisteredToolNames()

await sdk.loadToolProjects([projectA, projectB]); // single BM25 reindex at the end

const { found, tools } = sdk.searchTools('http get', 'http');
const names = sdk.getRegisteredToolNames();

loadToolProject() still exists and delegates to loadToolProjects([project]).


Category split: http / web / github / slack

Built-in HTTP, web, GitHub, and Slack tools no longer share network. Chat mode allows only http and web by default.

ToolRouter builds the tool.search schema with categories from registry.getCategories() (excluding meta). If none are registered yet, the static default enum is used.


Public skills exports

import { BM25Engine, parseSkillFile } from 'toolpack-sdk';
import type { BM25SearchResult } from 'toolpack-sdk';

@toolpack-sdk/knowledge

TextSource

Chunk plain text with optional metadata — suited to platform / tenant knowledge items.

import { TextSource } from '@toolpack-sdk/knowledge';

const source = new TextSource('item-abc', documentBody, {
namespace: 'tenant-knowledge',
metadata: { knowledge_item_id: 'abc', tenant_id: 't1' },
});

await knowledge.ingest(source);

Incremental updates

await knowledge.add(content, metadata);                    // Embed + store one chunk
await knowledge.ingest(source); // Add without clearing
await knowledge.delete([id]); // Delete by IDs
await knowledge.deleteWhere({ knowledge_item_id: 'abc' }); // Cascade by metadata

onAdd / onDelete handlers on Knowledge.create() fire after successful writes/deletes so an outer sync layer can mirror changes. matchesFilter is exported for reuse outside Knowledge.


@toolpack-sdk/agents

No agent-runtime API changes. Peer ranges now require toolpack-sdk@^3.1.0 and @toolpack-sdk/knowledge@^3.1.0 (optional).


Install

npm install toolpack-sdk@3.1.0
npm install @toolpack-sdk/knowledge@3.1.0
npm install @toolpack-sdk/agents@3.1.0