@krtclcdy/tersio 2.25.2 → 2.25.4
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/README.md +3 -3
- package/dashboard/dist/index.html +1 -1
- package/{cli → dist/cli}/common.js +4 -3
- package/{cli → dist/cli}/dashboard.js +30 -13
- package/{cli → dist/cli}/doctor-fix.js +2 -4
- package/{cli → dist/cli}/doctor.js +13 -6
- package/{cli → dist/cli}/install.js +56 -15
- package/{cli → dist/cli}/manifest.js +4 -2
- package/{cli → dist/cli}/settings.js +5 -23
- package/{cli → dist/cli}/uninstall.js +1 -1
- package/{cli → dist/cli}/update.js +4 -5
- package/{extensions → dist/extensions}/ai-addons-updater/index.js +4 -4
- package/{extensions → dist/extensions}/caveman-session/index.js +12 -5
- package/dist/extensions/caveman-session/rule-ultra.md +63 -0
- package/dist/extensions/caveman-session/rule.md +79 -0
- package/{extensions → dist/extensions}/combo-toggle/index.js +39 -29
- package/{extensions → dist/extensions}/lib/utils.js +26 -1
- package/{extensions → dist/extensions}/opencode/server.js +45 -1
- package/dist/extensions/rtk-filter/index.js +87 -0
- package/{extensions → dist/extensions}/rtk-session/index.js +3 -2
- package/{extensions → dist/extensions}/shared/host.js +18 -12
- package/{extensions → dist/extensions}/shared/plugin-settings.js +1 -1
- package/{extensions → dist/extensions}/shared/session-state.js +17 -3
- package/{extensions → dist/extensions}/shared/status.js +7 -1
- package/{tersio.js → dist/tersio.js} +1 -1
- package/extensions/ai-addons-updater/index.ts +4 -5
- package/extensions/caveman-session/index.ts +12 -5
- package/extensions/caveman-session/rule-megacave.md +63 -0
- package/extensions/caveman-session/rule.md +4 -2
- package/extensions/combo-toggle/index.ts +37 -29
- package/extensions/lib/utils.ts +22 -1
- package/extensions/opencode/server.ts +38 -1
- package/extensions/rtk-filter/index.ts +90 -0
- package/extensions/rtk-session/index.ts +3 -2
- package/extensions/shared/host.ts +26 -13
- package/extensions/shared/plugin-settings.ts +1 -1
- package/extensions/shared/session-state.ts +18 -3
- package/extensions/shared/status.ts +8 -1
- package/extensions/shared/types.ts +10 -2
- package/package.json +16 -15
- package/extensions/opencode/index.js +0 -104
- /package/{cli → dist/cli}/banner.js +0 -0
- /package/{cli → dist/cli}/currency.js +0 -0
- /package/{cli → dist/cli}/hosts.js +0 -0
- /package/{cli → dist/cli}/interactive.js +0 -0
- /package/{cli → dist/cli}/profile.js +0 -0
- /package/{cli → dist/cli}/reset.js +0 -0
- /package/{cli → dist/cli}/rtk-wiring.js +0 -0
- /package/{cli → dist/cli}/usage.js +0 -0
- /package/{extensions/caveman-session/rule-wenyan.md → dist/extensions/caveman-session/rule-megacave.md} +0 -0
- /package/{extensions → dist/extensions}/shared/carbon.js +0 -0
- /package/{extensions → dist/extensions}/shared/pricing.js +0 -0
- /package/{extensions → dist/extensions}/shared/rtk-gain.js +0 -0
- /package/{extensions → dist/extensions}/shared/types.js +0 -0
- /package/{extensions → dist/extensions}/shared/usage-ledger.js +0 -0
- /package/{extensions → dist/extensions}/shared/usage-store.js +0 -0
- /package/{extensions → dist/extensions}/tersio-commands/index.js +0 -0
|
@@ -36,6 +36,7 @@ export interface UiApi {
|
|
|
36
36
|
export interface ExtensionCtx {
|
|
37
37
|
hasUI?: boolean;
|
|
38
38
|
cwd?: string;
|
|
39
|
+
signal?: AbortSignal;
|
|
39
40
|
sessionManager?: {
|
|
40
41
|
getBranch?: () => SessionEntry[];
|
|
41
42
|
getEntries?: () => SessionEntry[];
|
|
@@ -46,13 +47,20 @@ export interface ExtensionCtx {
|
|
|
46
47
|
|
|
47
48
|
export interface SystemPromptEvent {
|
|
48
49
|
systemPrompt: string | string[];
|
|
49
|
-
// pi only: the mutable prompt sections. OMP does not provide
|
|
50
|
-
systemPromptOptions?: { appendSystemPrompt?: string };
|
|
50
|
+
// pi only: the mutable prompt sections and append slot. OMP does not provide them.
|
|
51
|
+
systemPromptOptions?: { appendSystemPrompt?: string; sections?: Record<string, string> };
|
|
51
52
|
}
|
|
52
53
|
|
|
53
54
|
/** What a `before_agent_start` handler hands back. OMP takes an array, pi a string. */
|
|
54
55
|
export type PromptInjection = { systemPrompt: string[] } | { systemPrompt: string };
|
|
55
56
|
|
|
57
|
+
/** A finished tool call, before its result reaches the model. pi and OMP provide it. */
|
|
58
|
+
export interface ToolResultEvent {
|
|
59
|
+
toolName?: string;
|
|
60
|
+
content?: Array<{ type?: string; text?: string }>;
|
|
61
|
+
isError?: boolean;
|
|
62
|
+
}
|
|
63
|
+
|
|
56
64
|
/** A tool `parameters` object. OMP wants zod, pi wants JSON Schema. */
|
|
57
65
|
export type ToolParams = Record<string, unknown>;
|
|
58
66
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@krtclcdy/tersio",
|
|
3
|
-
"version": "2.25.
|
|
3
|
+
"version": "2.25.4",
|
|
4
4
|
"description": "✂️ Token saver and usage tracker for coding agents: terse Caveman replies, compact RTK shell output, lean Ponytail code calls, and a gain dashboard — one-command combo presets over one shared extension tree.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"token-saving",
|
|
@@ -21,10 +21,10 @@
|
|
|
21
21
|
},
|
|
22
22
|
"type": "module",
|
|
23
23
|
"bin": {
|
|
24
|
-
"tersio": "tersio.js"
|
|
24
|
+
"tersio": "dist/tersio.js"
|
|
25
25
|
},
|
|
26
26
|
"exports": {
|
|
27
|
-
"./server": "./extensions/opencode/server.js"
|
|
27
|
+
"./server": "./dist/extensions/opencode/server.js"
|
|
28
28
|
},
|
|
29
29
|
"omp": {
|
|
30
30
|
"name": "Tersio",
|
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
"extensions": [
|
|
33
33
|
"./extensions/caveman-session/index.ts",
|
|
34
34
|
"./extensions/rtk-session/index.ts",
|
|
35
|
+
"./extensions/rtk-filter/index.ts",
|
|
35
36
|
"./extensions/combo-toggle/index.ts",
|
|
36
37
|
"./extensions/tersio-commands/index.ts"
|
|
37
38
|
],
|
|
@@ -72,9 +73,9 @@
|
|
|
72
73
|
"lite",
|
|
73
74
|
"full",
|
|
74
75
|
"ultra",
|
|
75
|
-
"
|
|
76
|
-
"
|
|
77
|
-
"
|
|
76
|
+
"megacave-lite",
|
|
77
|
+
"megacave-full",
|
|
78
|
+
"megacave-ultra"
|
|
78
79
|
],
|
|
79
80
|
"default": "off"
|
|
80
81
|
},
|
|
@@ -114,24 +115,23 @@
|
|
|
114
115
|
}
|
|
115
116
|
},
|
|
116
117
|
"files": [
|
|
117
|
-
"
|
|
118
|
-
"
|
|
118
|
+
"dist/**/*.js",
|
|
119
|
+
"dist/extensions/caveman-session/*.md",
|
|
119
120
|
"dashboard/dist/**/*",
|
|
120
|
-
"extensions/**/*.js",
|
|
121
121
|
"extensions/**/*.ts",
|
|
122
122
|
"extensions/caveman-session/rule.md",
|
|
123
123
|
"extensions/caveman-session/rule-ultra.md",
|
|
124
|
-
"extensions/caveman-session/rule-
|
|
124
|
+
"extensions/caveman-session/rule-megacave.md"
|
|
125
125
|
],
|
|
126
126
|
"scripts": {
|
|
127
|
-
"clean": "rm -
|
|
128
|
-
"build": "tsc && bun run build:dashboard",
|
|
127
|
+
"clean": "rm -rf dist dashboard/dist",
|
|
128
|
+
"build": "tsc && bun run build:dashboard && cp extensions/caveman-session/*.md dist/extensions/caveman-session/",
|
|
129
129
|
"build:dashboard": "bun install --cwd dashboard/app --frozen-lockfile && bun run --cwd dashboard/app build",
|
|
130
130
|
"prepublishOnly": "bun run build",
|
|
131
131
|
"check": "tsc --noEmit",
|
|
132
132
|
"verify": "bun install --frozen-lockfile && bun run build && bun run test",
|
|
133
|
-
"doctor": "node tersio.js --doctor",
|
|
134
|
-
"dry-run": "node tersio.js --dry-run --scope user --yes",
|
|
133
|
+
"doctor": "node dist/tersio.js --doctor",
|
|
134
|
+
"dry-run": "node dist/tersio.js --dry-run --scope user --yes",
|
|
135
135
|
"lint": "oxlint cli extensions test tersio.ts",
|
|
136
136
|
"lint:dashboard": "bun run --cwd dashboard/app lint",
|
|
137
137
|
"lint:fix": "oxlint cli extensions test tersio.ts --fix",
|
|
@@ -143,6 +143,7 @@
|
|
|
143
143
|
"devDependencies": {
|
|
144
144
|
"@opencode/plugin": "^2.0.22",
|
|
145
145
|
"@types/node": "^26.4.1",
|
|
146
|
+
"happy-dom": "^20.14.5",
|
|
146
147
|
"oxlint": "^1.85.0",
|
|
147
148
|
"typescript": "^7.0.2",
|
|
148
149
|
"vitest": "^5.0.1"
|
|
@@ -150,6 +151,6 @@
|
|
|
150
151
|
"dependencies": {
|
|
151
152
|
"@clack/core": "^1.5.1",
|
|
152
153
|
"@clack/prompts": "^1.8.0",
|
|
153
|
-
"@dietrichgebert/ponytail": "^4.
|
|
154
|
+
"@dietrichgebert/ponytail": "^4.12.0"
|
|
154
155
|
}
|
|
155
156
|
}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
// OpenCode plugin entry: maps its plugin API onto the shared ExtensionApi the mode extensions consume.
|
|
2
|
-
import { execFile } from 'node:child_process';
|
|
3
|
-
import { Plugin } from '@opencode/plugin';
|
|
4
|
-
import cavemanSessionExtension from '../caveman-session/index.js';
|
|
5
|
-
import rtkSessionExtension from '../rtk-session/index.js';
|
|
6
|
-
import comboToggleExtension from '../combo-toggle/index.js';
|
|
7
|
-
import tersioCommandsExtension from '../tersio-commands/index.js';
|
|
8
|
-
export default Plugin.define({
|
|
9
|
-
id: 'tersio',
|
|
10
|
-
async setup(ctx) {
|
|
11
|
-
const entries = (await ctx.storage.get('entries')) ?? [];
|
|
12
|
-
const persist = () => { void ctx.storage.set('entries', entries).catch(() => { }); };
|
|
13
|
-
const stubCtx = () => ({
|
|
14
|
-
hasUI: false,
|
|
15
|
-
cwd: ctx.location.directory,
|
|
16
|
-
sessionManager: { getBranch: () => entries, getEntries: () => entries },
|
|
17
|
-
});
|
|
18
|
-
const commands = new Map();
|
|
19
|
-
const tools = new Map();
|
|
20
|
-
const beforeStart = [];
|
|
21
|
-
const inputHandlers = [];
|
|
22
|
-
const lifecycle = new Map();
|
|
23
|
-
const host = {
|
|
24
|
-
hostId: 'opencode',
|
|
25
|
-
setLabel() { },
|
|
26
|
-
registerCommand(name, config) { commands.set(name, config); },
|
|
27
|
-
registerTool(tool) { tools.set(tool.name, tool); },
|
|
28
|
-
appendEntry(type, data) { entries.push({ type: 'custom', customType: type, data }); persist(); },
|
|
29
|
-
exec: (cmd, args, opts) => new Promise((resolve) => {
|
|
30
|
-
execFile(cmd, args, { signal: opts?.signal, cwd: opts?.cwd }, (error, stdout, stderr) => {
|
|
31
|
-
const code = error && typeof error.code === 'number' ? error.code : 0;
|
|
32
|
-
resolve({ stdout: stdout ?? '', stderr: stderr ?? '', code, killed: !!error?.killed });
|
|
33
|
-
});
|
|
34
|
-
}),
|
|
35
|
-
cwd: ctx.location.directory,
|
|
36
|
-
on: (event, handler) => {
|
|
37
|
-
if (event === 'before_agent_start') {
|
|
38
|
-
beforeStart.push(handler);
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
if (event === 'input') {
|
|
42
|
-
inputHandlers.push(handler);
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
const list = lifecycle.get(event) ?? [];
|
|
46
|
-
list.push(handler);
|
|
47
|
-
lifecycle.set(event, list);
|
|
48
|
-
},
|
|
49
|
-
};
|
|
50
|
-
for (const extension of [cavemanSessionExtension, rtkSessionExtension, comboToggleExtension, tersioCommandsExtension])
|
|
51
|
-
extension(host);
|
|
52
|
-
// OpenCode has no session_start event surfaced to plugins, so restore once at setup.
|
|
53
|
-
for (const handler of lifecycle.get('session_start') ?? [])
|
|
54
|
-
await handler({}, stubCtx());
|
|
55
|
-
await ctx.command.transform((editor) => {
|
|
56
|
-
for (const [name, config] of commands) {
|
|
57
|
-
editor.add({
|
|
58
|
-
name,
|
|
59
|
-
description: config.description,
|
|
60
|
-
execute: async (input) => {
|
|
61
|
-
const text = typeof input.prompt?.text === 'string' ? input.prompt.text : '';
|
|
62
|
-
const args = text.includes(' ') ? text.slice(text.indexOf(' ') + 1).trim() : '';
|
|
63
|
-
await config.handler(args, stubCtx());
|
|
64
|
-
},
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
await ctx.tool.transform((editor) => {
|
|
69
|
-
for (const tool of tools.values()) {
|
|
70
|
-
editor.add({
|
|
71
|
-
name: tool.name,
|
|
72
|
-
description: tool.description,
|
|
73
|
-
input: tool.parameters,
|
|
74
|
-
execute: async (input) => {
|
|
75
|
-
const args = Array.isArray(input.args) ? (input.args) : [];
|
|
76
|
-
const result = await tool.execute('t', { args }, undefined, undefined, stubCtx());
|
|
77
|
-
return { content: result.content.map((part) => part.text).join('\n') };
|
|
78
|
-
},
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
await ctx.session.hook('context', async (event) => {
|
|
83
|
-
const systemParts = event.system.map((part) => (part.type === 'text' ? part.text : '')).filter(Boolean);
|
|
84
|
-
for (const handler of beforeStart) {
|
|
85
|
-
const result = await handler({ systemPrompt: [...systemParts] }, stubCtx());
|
|
86
|
-
if (!result || typeof result !== 'object' || !('systemPrompt' in result))
|
|
87
|
-
continue;
|
|
88
|
-
const parts = typeof result.systemPrompt === 'string'
|
|
89
|
-
? [result.systemPrompt]
|
|
90
|
-
: Array.isArray(result.systemPrompt)
|
|
91
|
-
? result.systemPrompt
|
|
92
|
-
: [];
|
|
93
|
-
for (const part of parts) {
|
|
94
|
-
if (!systemParts.includes(part))
|
|
95
|
-
event.system.push({ type: 'text', text: part });
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
await ctx.session.hook('prompt', (event) => {
|
|
100
|
-
for (const handler of inputHandlers)
|
|
101
|
-
void handler({ text: event.prompt.text, source: 'interactive' });
|
|
102
|
-
});
|
|
103
|
-
},
|
|
104
|
-
});
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|