Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
97d628d
feat: add Hermes Agent adapter (hermes_local)
teknium1 Mar 11, 2026
87c0bf9
added v0.3.1.md changelog
cryppadotta Mar 12, 2026
873535f
verify the packages actually make it to npm
cryppadotta Mar 12, 2026
964e043
fixes verification
cryppadotta Mar 12, 2026
63c62e3
chore: release v0.3.1
cryppadotta Mar 12, 2026
4e354ad
fix: address review feedback — pin dependency and add sessionCodec
teknium1 Mar 13, 2026
e84c0e8
fix: use npm package instead of GitHub URL dependency
teknium1 Mar 13, 2026
cdebf7b
Merge remote-tracking branch 'public-gh/master' into pr-432
cryppadotta Mar 13, 2026
7e288d2
Merge remote-tracking branch 'public-gh/master' into pr-432
cryppadotta Mar 13, 2026
80cdbdb
Add plugin framework and settings UI
cryppadotta Mar 13, 2026
12ccfc2
Simplify plugin runtime and cleanup lifecycle
cryppadotta Mar 13, 2026
303c00b
fix(server): load .env from cwd as fallback when .paperclip/.env is m…
mvanhorn Mar 14, 2026
93faf6d
fix: address review feedback — pin version, enable JWT
teknium1 Mar 14, 2026
6fa1dd2
Add kitchen sink plugin example
cryppadotta Mar 14, 2026
d671a59
fix: set AGENT_HOME env var for agent processes
devinfoley Mar 14, 2026
cb5d7e7
Expand kitchen sink plugin demos
cryppadotta Mar 14, 2026
3088875
Clarify plugin authoring and external dev workflow
cryppadotta Mar 14, 2026
eafb5b8
Merge public-gh/master into feature/plugin-runtime-instance-cleanup
cryppadotta Mar 14, 2026
dcd8a47
Merge pull request #713 from paperclipai/release/0.3.1
cryppadotta Mar 14, 2026
ff4f326
fix(server): use realpathSync for .env path dedup to handle symlinks
mvanhorn Mar 14, 2026
7c4b02f
Fix plugin dev watcher and migration snapshot
cryppadotta Mar 14, 2026
22b8e90
Fix plugin smoke example typecheck
cryppadotta Mar 14, 2026
0605c9f
Tighten plugin dev file watching
cryppadotta Mar 14, 2026
4cfbeab
Drop lockfile from watcher change
cryppadotta Mar 14, 2026
325fcf8
Merge pull request #864 from paperclipai/fix/agent-home-env
cryppadotta Mar 14, 2026
0851e81
Merge pull request #821 from paperclipai/feature/plugin-runtime-insta…
cryppadotta Mar 14, 2026
b13c530
Refine heartbeatService to only target runs stuck in "running" state
gsxdsm Mar 14, 2026
2dc3b4d
Add buildPluginSdk function to build the plugin SDK during dev run
gsxdsm Mar 14, 2026
6b17f7c
Update scripts/dev-runner.mjs
gsxdsm Mar 14, 2026
30e2914
feat(plugins): bridge core domain events to plugin event bus
mvanhorn Mar 14, 2026
a6c7e09
fix(plugins): log plugin handler errors, warn on double-init
mvanhorn Mar 14, 2026
0f831e0
Add plugin cli commands
gsxdsm Mar 14, 2026
b92f234
Merge pull request #903 from gsxdsm/fix/process-list
cryppadotta Mar 14, 2026
2e3a0d0
Merge pull request #909 from mvanhorn/feat/plugin-domain-event-bridge
cryppadotta Mar 14, 2026
bc5d650
Add global toolbar slots to BreadcrumbBar component
gsxdsm Mar 14, 2026
d0677dc
Update cli/src/commands/client/plugin.ts
gsxdsm Mar 14, 2026
4f8df18
Update cli/src/commands/client/plugin.ts
gsxdsm Mar 14, 2026
0afd5d5
Update cli/src/commands/client/plugin.ts
gsxdsm Mar 14, 2026
e219761
Fix plugin installation output and error handling in registerPluginCo…
gsxdsm Mar 14, 2026
7e3a04c
Refactor BreadcrumbBar to use useMemo for global toolbar slot context…
gsxdsm Mar 14, 2026
0fb85e5
Merge pull request #910 from gsxdsm/feat/plugin-cli
cryppadotta Mar 14, 2026
98e73ac
Merge pull request #904 from gsxdsm/fix/build-plugin-sdk
cryppadotta Mar 14, 2026
648ee37
Merge pull request #912 from gsxdsm/feat/plugin-breadcumb-slot
cryppadotta Mar 14, 2026
2dbb31e
Fix syntax error
gsxdsm Mar 14, 2026
8985dda
Merge pull request #914 from gsxdsm/fix/dev-runner-syntax
cryppadotta Mar 14, 2026
811e2b9
Add globalToolbarButton slot type and update related documentation
gsxdsm Mar 14, 2026
5d52ce2
Merge pull request #916 from gsxdsm/fix/plugin-slots
cryppadotta Mar 14, 2026
ec261e9
Enhance plugin loading and toolbar integration
gsxdsm Mar 14, 2026
0d2380b
Fix plugin launchers initialization by adding enabled flag based on c…
gsxdsm Mar 14, 2026
6d65800
Register secret-ref format in AJV for validating Paperclip secret UUIDs
gsxdsm Mar 14, 2026
6c7ebae
Refactor secret-ref format registration to use a UI hint for Papercli…
gsxdsm Mar 14, 2026
825d2b4
fix(ui): hide scrollbar track background when sidebar is not hovered
cryppadotta Mar 14, 2026
f482433
Merge pull request #919 from paperclipai/fix/sidebar-scrollbar-hover-…
cryppadotta Mar 14, 2026
872807a
Merge pull request #918 from gsxdsm/fix/plugin-slots
cryppadotta Mar 14, 2026
bfaa4b4
Merge pull request #834 from mvanhorn/fix/dotenv-cwd-fallback
cryppadotta Mar 15, 2026
2162289
Merge branch 'master' into feat/hermes-agent-adapter
cryppadotta Mar 15, 2026
675421f
Merge pull request #587 from teknium1/feat/hermes-agent-adapter
cryppadotta Mar 15, 2026
61fd548
fix: wire plugin event subscriptions from worker to host
leeknowsai Mar 15, 2026
8468d34
fix: address review feedback — subscription cleanup, filter nullabili…
leeknowsai Mar 15, 2026
c94132b
Merge pull request #988 from leeknowsai/fix/plugin-event-subscription…
cryppadotta Mar 15, 2026
3bffe3e
docs: update documentation for accuracy after plugin system launch
cryppadotta Mar 16, 2026
52b1278
docs: fix documentation drift — adapters, plugins, tech stack
cryppadotta Mar 16, 2026
34ec402
Merge pull request #1010 from paperclipai/docs/maintenance-20260316
cryppadotta Mar 16, 2026
711da2b
fix: release() must clear executionRunId, executionLockedAt, executio…
Mar 16, 2026
34a6afa
feat: add headless agent key provisioning CLI and tests
Mar 16, 2026
1770937
feat: add plugin-ops-automations with auto-unblock and push auto-route
Mar 17, 2026
4021ad9
feat: add health monitor and batch push sweep jobs to ops-automations…
Mar 17, 2026
dc4b105
feat(plugin-ops-automations): add parent auto-close handler
Mar 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ tmp/
.claude/settings.local.json
.paperclip-local/

# Doc maintenance cursor
.doc-review-cursor

# Playwright
tests/e2e/test-results/
tests/e2e/playwright-report/
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ See [doc/DEVELOPING.md](doc/DEVELOPING.md) for the full development guide.
- ⚪ ClipMart - buy and sell entire agent companies
- ⚪ Easy agent configurations / easier to understand
- ⚪ Better support for harness engineering
- Plugin system (e.g. if you want to add a knowledgebase, custom tracing, queues, etc)
- 🟢 Plugin system (e.g. if you want to add a knowledgebase, custom tracing, queues, etc)
- ⚪ Better docs

<br/>
Expand Down
18 changes: 18 additions & 0 deletions cli/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,23 @@
# paperclipai

## 0.3.1

### Patch Changes

- Stable release preparation for 0.3.1
- Updated dependencies
- @paperclipai/adapter-utils@0.3.1
- @paperclipai/adapter-claude-local@0.3.1
- @paperclipai/adapter-codex-local@0.3.1
- @paperclipai/adapter-cursor-local@0.3.1
- @paperclipai/adapter-gemini-local@0.3.1
- @paperclipai/adapter-openclaw-gateway@0.3.1
- @paperclipai/adapter-opencode-local@0.3.1
- @paperclipai/adapter-pi-local@0.3.1
- @paperclipai/db@0.3.1
- @paperclipai/shared@0.3.1
- @paperclipai/server@0.3.1

## 0.3.0

### Minor Changes
Expand Down
2 changes: 1 addition & 1 deletion cli/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "paperclipai",
"version": "0.3.0",
"version": "0.3.1",
"description": "Paperclip CLI — orchestrate AI agent teams to run a business",
"type": "module",
"bin": {
Expand Down
95 changes: 95 additions & 0 deletions cli/src/commands/client/agent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -312,4 +312,99 @@ export function registerAgentCommands(program: Command): void {
}),
{ includeCompany: false },
);

// ── agent key <create|list|revoke> ──────────────────────────────
const key = agent.command("key").description("Manage agent API keys");

addCommonClientOptions(
key
.command("create")
.description("Create a long-lived API key for an agent")
.argument("<agentId>", "Agent ID")
.option("-n, --name <name>", "Key label", "default")
.action(async (agentId: string, opts: BaseClientOptions & { name: string }) => {
try {
const ctx = resolveCommandContext(opts);
const created = await ctx.api.post<CreatedAgentKey>(`/api/agents/${encodeURIComponent(agentId)}/keys`, {
name: opts.name,
});
if (!created) {
throw new Error("Failed to create API key");
}

if (ctx.json) {
printOutput(created, { json: true });
return;
}

console.log(`Key created: ${created.name} (${created.id})`);
console.log(`Token (shown once): ${created.token}`);
} catch (err) {
handleCommandError(err);
}
}),
);

addCommonClientOptions(
key
.command("list")
.description("List API keys for an agent")
.argument("<agentId>", "Agent ID")
.action(async (agentId: string, opts: BaseClientOptions) => {
try {
const ctx = resolveCommandContext(opts);
const keys = await ctx.api.get<Array<{ id: string; name: string; createdAt: string; revokedAt: string | null }>>(
`/api/agents/${encodeURIComponent(agentId)}/keys`,
);

if (ctx.json) {
printOutput(keys, { json: true });
return;
}

if (!keys || keys.length === 0) {
printOutput([], { json: false });
return;
}

for (const k of keys) {
console.log(
formatInlineRecord({
id: k.id,
name: k.name,
createdAt: k.createdAt,
status: k.revokedAt ? "revoked" : "active",
}),
);
}
} catch (err) {
handleCommandError(err);
}
}),
);

addCommonClientOptions(
key
.command("revoke")
.description("Revoke an agent API key")
.argument("<agentId>", "Agent ID")
.argument("<keyId>", "Key ID to revoke")
.action(async (agentId: string, keyId: string, opts: BaseClientOptions) => {
try {
const ctx = resolveCommandContext(opts);
await ctx.api.delete<{ ok: true }>(
`/api/agents/${encodeURIComponent(agentId)}/keys/${encodeURIComponent(keyId)}`,
);

if (ctx.json) {
printOutput({ ok: true }, { json: true });
return;
}

console.log(`Key ${keyId} revoked.`);
} catch (err) {
handleCommandError(err);
}
}),
);
}
Loading