@rubytech/taskmaster 1.4.0 → 1.4.1
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/dist/agents/tool-policy.js +4 -12
- package/dist/build-info.json +3 -3
- package/dist/cli/daemon-cli/status.gather.js +7 -1
- package/dist/commands/doctor-config-flow.js +13 -1
- package/dist/config/agent-tools-reconcile.js +67 -0
- package/dist/gateway/call.js +18 -3
- package/dist/gateway/server.impl.js +15 -1
- package/dist/infra/heartbeat-runner.js +8 -5
- package/dist/memory/manager.js +42 -8
- package/extensions/diagnostics-otel/node_modules/.bin/acorn +0 -0
- package/extensions/googlechat/node_modules/.bin/taskmaster +0 -0
- package/extensions/line/node_modules/.bin/taskmaster +0 -0
- package/extensions/matrix/node_modules/.bin/markdown-it +0 -0
- package/extensions/matrix/node_modules/.bin/taskmaster +0 -0
- package/extensions/memory-lancedb/node_modules/.bin/arrow2csv +0 -0
- package/extensions/memory-lancedb/node_modules/.bin/openai +0 -0
- package/extensions/msteams/node_modules/.bin/taskmaster +0 -0
- package/extensions/nostr/node_modules/.bin/taskmaster +0 -0
- package/extensions/nostr/node_modules/.bin/tsc +0 -0
- package/extensions/nostr/node_modules/.bin/tsserver +0 -0
- package/extensions/zalo/node_modules/.bin/taskmaster +0 -0
- package/extensions/zalouser/node_modules/.bin/taskmaster +0 -0
- package/package.json +64 -54
- package/scripts/install.sh +0 -0
- package/templates/.DS_Store +0 -0
- package/templates/customer/.DS_Store +0 -0
- package/templates/customer/agents/.DS_Store +0 -0
- package/templates/maxy/.DS_Store +0 -0
- package/templates/maxy/.gitignore +0 -1
- package/templates/maxy/agents/.DS_Store +0 -0
- package/templates/maxy/agents/admin/.DS_Store +0 -0
- package/templates/maxy/memory/.DS_Store +0 -0
- package/templates/maxy/skills/.DS_Store +0 -0
- package/templates/taskmaster/.gitignore +0 -1
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
const TOOL_NAME_ALIASES = {
|
|
2
2
|
bash: "exec",
|
|
3
3
|
"apply-patch": "apply_patch",
|
|
4
|
+
customer_lookup: "contact_lookup",
|
|
5
|
+
customer_update: "contact_update",
|
|
4
6
|
};
|
|
5
7
|
export const TOOL_GROUPS = {
|
|
6
8
|
// NOTE: Keep canonical (lowercase) tool names here.
|
|
@@ -22,12 +24,7 @@ export const TOOL_GROUPS = {
|
|
|
22
24
|
// Host/runtime execution tools
|
|
23
25
|
"group:runtime": ["exec", "process"],
|
|
24
26
|
// Session management tools
|
|
25
|
-
"group:sessions": [
|
|
26
|
-
"sessions_list",
|
|
27
|
-
"sessions_history",
|
|
28
|
-
"sessions_spawn",
|
|
29
|
-
"session_status",
|
|
30
|
-
],
|
|
27
|
+
"group:sessions": ["sessions_list", "sessions_history", "sessions_spawn", "session_status"],
|
|
31
28
|
// UI helpers
|
|
32
29
|
"group:ui": ["browser", "canvas"],
|
|
33
30
|
// Automation + infra
|
|
@@ -93,12 +90,7 @@ const TOOL_PROFILES = {
|
|
|
93
90
|
allow: ["group:fs", "group:runtime", "group:sessions", "group:memory", "image"],
|
|
94
91
|
},
|
|
95
92
|
messaging: {
|
|
96
|
-
allow: [
|
|
97
|
-
"group:messaging",
|
|
98
|
-
"sessions_list",
|
|
99
|
-
"sessions_history",
|
|
100
|
-
"session_status",
|
|
101
|
-
],
|
|
93
|
+
allow: ["group:messaging", "sessions_list", "sessions_history", "session_status"],
|
|
102
94
|
},
|
|
103
95
|
full: {
|
|
104
96
|
// "full" grants all Taskmaster-native tools, memory, web, sessions,
|
package/dist/build-info.json
CHANGED
|
@@ -71,7 +71,13 @@ export async function gatherDaemonStatus(opts) {
|
|
|
71
71
|
const tailnetIPv4 = pickPrimaryTailnetIPv4();
|
|
72
72
|
const probeHost = pickProbeHostForBind(bindMode, tailnetIPv4, customBindHost);
|
|
73
73
|
const probeUrlOverride = typeof opts.rpc.url === "string" && opts.rpc.url.trim().length > 0 ? opts.rpc.url.trim() : null;
|
|
74
|
-
|
|
74
|
+
// Mirror server auto-TLS: non-loopback bind + tls.enabled unset → wss://
|
|
75
|
+
const tlsExplicit = daemonCfg.gateway?.tls?.enabled;
|
|
76
|
+
const probeScheme = tlsExplicit === true ||
|
|
77
|
+
(tlsExplicit === undefined && bindMode !== "loopback" && bindMode !== "auto")
|
|
78
|
+
? "wss"
|
|
79
|
+
: "ws";
|
|
80
|
+
const probeUrl = probeUrlOverride ?? `${probeScheme}://${probeHost}:${daemonPort}`;
|
|
75
81
|
const probeNote = !probeUrlOverride && bindMode === "lan"
|
|
76
82
|
? "Local probe uses loopback (127.0.0.1). bind=lan listens on 0.0.0.0 (all interfaces); use a LAN IP for remote clients."
|
|
77
83
|
: !probeUrlOverride && bindMode === "loopback"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { TaskmasterSchema, CONFIG_PATH_TASKMASTER, migrateLegacyConfig, readConfigFileSnapshot, } from "../config/config.js";
|
|
2
|
-
import { reconcileAgentContactTools } from "../config/agent-tools-reconcile.js";
|
|
2
|
+
import { reconcileAgentContactTools, reconcileStaleToolEntries, } from "../config/agent-tools-reconcile.js";
|
|
3
3
|
import { applyPluginAutoEnable } from "../config/plugin-auto-enable.js";
|
|
4
4
|
import { formatCliCommand } from "../cli/command-format.js";
|
|
5
5
|
import { note } from "../terminal/note.js";
|
|
@@ -157,6 +157,18 @@ export async function loadAndMaybeMigrateDoctorConfig(params) {
|
|
|
157
157
|
fixHints.push(`Run "${formatCliCommand("taskmaster doctor --fix")}" to apply these changes.`);
|
|
158
158
|
}
|
|
159
159
|
}
|
|
160
|
+
const staleReconcile = reconcileStaleToolEntries({ config: candidate });
|
|
161
|
+
if (staleReconcile.changes.length > 0) {
|
|
162
|
+
note(staleReconcile.changes.join("\n"), "Doctor changes");
|
|
163
|
+
candidate = staleReconcile.config;
|
|
164
|
+
pendingChanges = true;
|
|
165
|
+
if (shouldRepair) {
|
|
166
|
+
cfg = staleReconcile.config;
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
fixHints.push(`Run "${formatCliCommand("taskmaster doctor --fix")}" to apply these changes.`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
160
172
|
const toolReconcile = reconcileAgentContactTools({ config: candidate });
|
|
161
173
|
if (toolReconcile.changes.length > 0) {
|
|
162
174
|
note(toolReconcile.changes.join("\n"), "Doctor changes");
|
|
@@ -8,6 +8,13 @@ const INDIVIDUAL_CONTACT_TOOLS = [
|
|
|
8
8
|
"contact_lookup",
|
|
9
9
|
"contact_update",
|
|
10
10
|
];
|
|
11
|
+
/** Tool entries that should be removed from all agent allow lists. */
|
|
12
|
+
const STALE_TOOL_ENTRIES = ["sessions_send"];
|
|
13
|
+
/** Tool entries that should be renamed in all agent allow lists. */
|
|
14
|
+
const TOOL_RENAMES = {
|
|
15
|
+
customer_lookup: "contact_lookup",
|
|
16
|
+
customer_update: "contact_update",
|
|
17
|
+
};
|
|
11
18
|
function isAdminAgent(agent) {
|
|
12
19
|
const id = agent.id?.trim() ?? "";
|
|
13
20
|
return id === "admin" || id.endsWith("-admin");
|
|
@@ -51,3 +58,63 @@ export function reconcileAgentContactTools(params) {
|
|
|
51
58
|
}
|
|
52
59
|
return { config, changes };
|
|
53
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* Remove stale tool entries and rename legacy tool names in all agent allow lists.
|
|
63
|
+
*
|
|
64
|
+
* Handles three cases for every agent (not just admin):
|
|
65
|
+
* 1. Remove entries listed in STALE_TOOL_ENTRIES (e.g. sessions_send).
|
|
66
|
+
* 2. Rename entries listed in TOOL_RENAMES (e.g. customer_lookup → contact_lookup).
|
|
67
|
+
* 3. After rename, drop individual contact_* entries that are redundant with group:contacts.
|
|
68
|
+
*
|
|
69
|
+
* Runs unconditionally on gateway startup (like reconcileAgentContactTools).
|
|
70
|
+
* Idempotent — skips agents that have no stale or renamed entries.
|
|
71
|
+
*/
|
|
72
|
+
export function reconcileStaleToolEntries(params) {
|
|
73
|
+
const config = structuredClone(params.config);
|
|
74
|
+
const changes = [];
|
|
75
|
+
const agents = config.agents?.list;
|
|
76
|
+
if (!Array.isArray(agents))
|
|
77
|
+
return { config, changes };
|
|
78
|
+
for (const agent of agents) {
|
|
79
|
+
if (!agent)
|
|
80
|
+
continue;
|
|
81
|
+
const allow = agent.tools?.allow;
|
|
82
|
+
if (!Array.isArray(allow))
|
|
83
|
+
continue;
|
|
84
|
+
const id = agent.id?.trim() ?? "<unnamed>";
|
|
85
|
+
// 1. Remove stale entries
|
|
86
|
+
for (const stale of STALE_TOOL_ENTRIES) {
|
|
87
|
+
const idx = allow.indexOf(stale);
|
|
88
|
+
if (idx !== -1) {
|
|
89
|
+
allow.splice(idx, 1);
|
|
90
|
+
changes.push(`Removed ${stale} from agent "${id}" tools.allow.`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// 2. Rename legacy entries
|
|
94
|
+
for (const [oldName, newName] of Object.entries(TOOL_RENAMES)) {
|
|
95
|
+
const idx = allow.indexOf(oldName);
|
|
96
|
+
if (idx === -1)
|
|
97
|
+
continue;
|
|
98
|
+
// Only rename if the new name isn't already present
|
|
99
|
+
if (allow.includes(newName)) {
|
|
100
|
+
allow.splice(idx, 1);
|
|
101
|
+
changes.push(`Removed duplicate ${oldName} from agent "${id}" tools.allow (${newName} already present).`);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
allow[idx] = newName;
|
|
105
|
+
changes.push(`Renamed ${oldName} → ${newName} in agent "${id}" tools.allow.`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// 3. Drop individual contact_* entries that are redundant with group:contacts
|
|
109
|
+
if (allow.includes("group:contacts")) {
|
|
110
|
+
for (const tool of INDIVIDUAL_CONTACT_TOOLS) {
|
|
111
|
+
const idx = allow.indexOf(tool);
|
|
112
|
+
if (idx !== -1) {
|
|
113
|
+
allow.splice(idx, 1);
|
|
114
|
+
changes.push(`Removed redundant ${tool} from agent "${id}" tools.allow (group:contacts covers it).`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return { config, changes };
|
|
120
|
+
}
|
package/dist/gateway/call.js
CHANGED
|
@@ -11,11 +11,17 @@ export function buildGatewayConnectionDetails(options = {}) {
|
|
|
11
11
|
const configPath = options.configPath ?? resolveConfigPath(process.env, resolveStateDir(process.env));
|
|
12
12
|
const isRemoteMode = config.gateway?.mode === "remote";
|
|
13
13
|
const remote = isRemoteMode ? config.gateway?.remote : undefined;
|
|
14
|
-
const tlsEnabled = config.gateway?.tls?.enabled === true;
|
|
15
14
|
const localPort = resolveGatewayPort(config);
|
|
16
15
|
const tailnetIPv4 = pickPrimaryTailnetIPv4();
|
|
17
16
|
const bindMode = config.gateway?.bind ?? "loopback";
|
|
18
17
|
const preferTailnet = bindMode === "tailnet" && !!tailnetIPv4;
|
|
18
|
+
// Mirror the server's auto-TLS logic: when tls.enabled is unset and the bind
|
|
19
|
+
// address is non-loopback, the server auto-enables TLS. Clients must connect
|
|
20
|
+
// with wss:// to match, otherwise the dual-protocol handler redirects the
|
|
21
|
+
// plain WS request and the WebSocket upgrade never completes (→ 1006).
|
|
22
|
+
const tlsExplicit = config.gateway?.tls?.enabled;
|
|
23
|
+
const tlsAutoEnable = tlsExplicit === undefined && bindMode !== "loopback" && bindMode !== "auto";
|
|
24
|
+
const tlsEnabled = tlsExplicit === true || tlsAutoEnable;
|
|
19
25
|
const scheme = tlsEnabled ? "wss" : "ws";
|
|
20
26
|
const localUrl = preferTailnet && tailnetIPv4
|
|
21
27
|
? `${scheme}://${tailnetIPv4}:${localPort}`
|
|
@@ -79,8 +85,17 @@ export async function callGateway(opts) {
|
|
|
79
85
|
...(opts.configPath ? { configPath: opts.configPath } : {}),
|
|
80
86
|
});
|
|
81
87
|
const url = connectionDetails.url;
|
|
82
|
-
|
|
83
|
-
|
|
88
|
+
// Load local TLS runtime for any wss:// connection that isn't a remote gateway
|
|
89
|
+
// URL from config. This covers both the auto-detected path (no URL override)
|
|
90
|
+
// and explicit URL overrides pointing at the local gateway (e.g., daemon status
|
|
91
|
+
// probe). The server auto-enables TLS for non-loopback binds even when
|
|
92
|
+
// tls.enabled is unset, so we pass { enabled: true } to loadGatewayTlsRuntime
|
|
93
|
+
// to ensure it loads the self-signed cert fingerprint needed for verification.
|
|
94
|
+
const useLocalTls = url.startsWith("wss://") && !remoteUrl;
|
|
95
|
+
const effectiveTlsConfig = useLocalTls
|
|
96
|
+
? { ...config.gateway?.tls, enabled: true }
|
|
97
|
+
: config.gateway?.tls;
|
|
98
|
+
const tlsRuntime = useLocalTls ? await loadGatewayTlsRuntime(effectiveTlsConfig) : undefined;
|
|
84
99
|
const remoteTlsFingerprint = isRemoteMode && !urlOverride && remoteUrl && typeof remote?.tlsFingerprint === "string"
|
|
85
100
|
? remote.tlsFingerprint.trim()
|
|
86
101
|
: undefined;
|
|
@@ -9,7 +9,7 @@ import { CONFIG_PATH_TASKMASTER, isNixMode, loadConfig, migrateLegacyConfig, rea
|
|
|
9
9
|
import { VERSION } from "../version.js";
|
|
10
10
|
import { isDiagnosticsEnabled } from "../infra/diagnostic-events.js";
|
|
11
11
|
import { logAcceptedEnvOption } from "../infra/env.js";
|
|
12
|
-
import { reconcileAgentContactTools } from "../config/agent-tools-reconcile.js";
|
|
12
|
+
import { reconcileAgentContactTools, reconcileStaleToolEntries, } from "../config/agent-tools-reconcile.js";
|
|
13
13
|
import { applyPluginAutoEnable } from "../config/plugin-auto-enable.js";
|
|
14
14
|
import { clearAgentRunContext, onAgentEvent } from "../infra/agent-events.js";
|
|
15
15
|
import { onHeartbeatEvent } from "../infra/heartbeat-events.js";
|
|
@@ -123,6 +123,20 @@ export async function startGatewayServer(port = 18789, opts = {}) {
|
|
|
123
123
|
log.warn(`gateway: failed to persist plugin auto-enable changes: ${String(err)}`);
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
|
+
// Remove stale/renamed tool entries from agent allow lists (e.g. sessions_send, customer_* → contact_*).
|
|
127
|
+
const staleReconcile = reconcileStaleToolEntries({ config: configSnapshot.config });
|
|
128
|
+
if (staleReconcile.changes.length > 0) {
|
|
129
|
+
try {
|
|
130
|
+
await writeConfigFile(staleReconcile.config);
|
|
131
|
+
configSnapshot = await readConfigFileSnapshot();
|
|
132
|
+
log.info(`gateway: reconciled stale tool entries:\n${staleReconcile.changes
|
|
133
|
+
.map((entry) => `- ${entry}`)
|
|
134
|
+
.join("\n")}`);
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
log.warn(`gateway: failed to persist stale tool reconciliation: ${String(err)}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
126
140
|
// Reconcile agent tool groups (e.g. individual contact tools → group:contacts).
|
|
127
141
|
const toolReconcile = reconcileAgentContactTools({ config: configSnapshot.config });
|
|
128
142
|
if (toolReconcile.changes.length > 0) {
|
|
@@ -762,13 +762,16 @@ export function startHeartbeatRunner(opts) {
|
|
|
762
762
|
}
|
|
763
763
|
// After heartbeat cycle: check for software updates and auth health, notify admin.
|
|
764
764
|
// Uses the first agent's delivery target. Non-blocking — never delays the next heartbeat.
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
765
|
+
// Auth health runs on every cycle (not gated by `ran`) because infrastructure monitoring
|
|
766
|
+
// must work even when the heartbeat LLM call is skipped — a quiet agent with an expired
|
|
767
|
+
// token is exactly the scenario that needs notification.
|
|
768
|
+
const firstAgent = state.agents.values().next().value;
|
|
769
|
+
if (firstAgent) {
|
|
770
|
+
const postRunDeps = { runtime: state.runtime };
|
|
771
|
+
if (ran) {
|
|
769
772
|
void checkAndNotifyUpdate(state.cfg, firstAgent, postRunDeps).catch(() => { });
|
|
770
|
-
void checkAuthHealth(state.cfg, firstAgent, postRunDeps).catch(() => { });
|
|
771
773
|
}
|
|
774
|
+
void checkAuthHealth(state.cfg, firstAgent, postRunDeps).catch(() => { });
|
|
772
775
|
}
|
|
773
776
|
scheduleNext();
|
|
774
777
|
if (ran)
|
package/dist/memory/manager.js
CHANGED
|
@@ -342,6 +342,7 @@ export class MemoryIndexManager {
|
|
|
342
342
|
this.openAi = params.providerResult.openAi;
|
|
343
343
|
this.gemini = params.providerResult.gemini;
|
|
344
344
|
this.sources = new Set(params.settings.sources);
|
|
345
|
+
this.cleanupOrphanedTempFiles();
|
|
345
346
|
this.db = this.openDatabase();
|
|
346
347
|
this.providerKey = this.computeProviderKey();
|
|
347
348
|
this.cache = {
|
|
@@ -892,6 +893,36 @@ export class MemoryIndexManager {
|
|
|
892
893
|
const suffixes = ["", "-wal", "-shm"];
|
|
893
894
|
await Promise.all(suffixes.map((suffix) => fs.rm(`${basePath}${suffix}`, { force: true })));
|
|
894
895
|
}
|
|
896
|
+
/**
|
|
897
|
+
* Remove orphaned temp databases left behind by failed `runSafeReindex()`
|
|
898
|
+
* attempts. These files match `{dbPath}.tmp-*` and serve no purpose after
|
|
899
|
+
* a restart — the reindex will create a fresh temp if needed.
|
|
900
|
+
*/
|
|
901
|
+
cleanupOrphanedTempFiles() {
|
|
902
|
+
const dbPath = resolveUserPath(this.settings.store.path);
|
|
903
|
+
const dir = path.dirname(dbPath);
|
|
904
|
+
const base = path.basename(dbPath);
|
|
905
|
+
let entries;
|
|
906
|
+
try {
|
|
907
|
+
entries = fsSync.readdirSync(dir);
|
|
908
|
+
}
|
|
909
|
+
catch {
|
|
910
|
+
return;
|
|
911
|
+
}
|
|
912
|
+
const prefix = `${base}.tmp-`;
|
|
913
|
+
const orphans = entries.filter((name) => name.startsWith(prefix));
|
|
914
|
+
for (const name of orphans) {
|
|
915
|
+
try {
|
|
916
|
+
fsSync.rmSync(path.join(dir, name), { force: true });
|
|
917
|
+
}
|
|
918
|
+
catch {
|
|
919
|
+
/* best-effort */
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
if (orphans.length > 0) {
|
|
923
|
+
log.info(`cleaned up ${orphans.length} orphaned temp index file(s)`);
|
|
924
|
+
}
|
|
925
|
+
}
|
|
895
926
|
moveIndexFilesSync(sourceBase, targetBase) {
|
|
896
927
|
const suffixes = ["", "-wal", "-shm"];
|
|
897
928
|
for (const suffix of suffixes) {
|
|
@@ -1532,7 +1563,6 @@ export class MemoryIndexManager {
|
|
|
1532
1563
|
const tempDbPath = `${dbPath}.tmp-${randomUUID()}`;
|
|
1533
1564
|
const tempDb = this.openDatabaseAtPath(tempDbPath);
|
|
1534
1565
|
const originalDb = this.db;
|
|
1535
|
-
let originalDbClosed = false;
|
|
1536
1566
|
const originalState = {
|
|
1537
1567
|
ftsAvailable: this.fts.available,
|
|
1538
1568
|
ftsError: this.fts.loadError,
|
|
@@ -1542,18 +1572,23 @@ export class MemoryIndexManager {
|
|
|
1542
1572
|
vectorReady: this.vectorReady,
|
|
1543
1573
|
};
|
|
1544
1574
|
const restoreOriginalState = () => {
|
|
1545
|
-
|
|
1546
|
-
|
|
1575
|
+
// Always open a fresh handle rather than reusing originalDb. A failed
|
|
1576
|
+
// reindex can leave the captured handle in a stale state (e.g. the
|
|
1577
|
+
// underlying file was partially swapped), which causes subsequent writes
|
|
1578
|
+
// to hit "attempt to write a readonly database" until the process restarts.
|
|
1579
|
+
try {
|
|
1580
|
+
originalDb.close();
|
|
1547
1581
|
}
|
|
1548
|
-
|
|
1549
|
-
|
|
1582
|
+
catch {
|
|
1583
|
+
/* may already be closed */
|
|
1550
1584
|
}
|
|
1585
|
+
this.db = this.openDatabaseAtPath(dbPath);
|
|
1551
1586
|
this.fts.available = originalState.ftsAvailable;
|
|
1552
1587
|
this.fts.loadError = originalState.ftsError;
|
|
1553
|
-
this.vector.available =
|
|
1588
|
+
this.vector.available = null;
|
|
1554
1589
|
this.vector.loadError = originalState.vectorLoadError;
|
|
1555
1590
|
this.vector.dims = originalState.vectorDims;
|
|
1556
|
-
this.vectorReady =
|
|
1591
|
+
this.vectorReady = null;
|
|
1557
1592
|
};
|
|
1558
1593
|
this.db = tempDb;
|
|
1559
1594
|
this.vectorReady = null;
|
|
@@ -1598,7 +1633,6 @@ export class MemoryIndexManager {
|
|
|
1598
1633
|
this.pruneEmbeddingCacheIfNeeded();
|
|
1599
1634
|
this.db.close();
|
|
1600
1635
|
originalDb.close();
|
|
1601
|
-
originalDbClosed = true;
|
|
1602
1636
|
// Sync swap: close → rename → reopen must be atomic from the event
|
|
1603
1637
|
// loop's perspective. An async swap here would yield control and let
|
|
1604
1638
|
// concurrent search/read/write hit the closed this.db handle.
|
|
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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rubytech/taskmaster",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.1",
|
|
4
4
|
"description": "AI-powered business assistant for small businesses",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -77,12 +77,66 @@
|
|
|
77
77
|
"dist/filler/**",
|
|
78
78
|
"dist/license/**"
|
|
79
79
|
],
|
|
80
|
+
"scripts": {
|
|
81
|
+
"dev": "node scripts/run-node.mjs",
|
|
82
|
+
"postinstall": "node scripts/postinstall.js",
|
|
83
|
+
"prepack": "pnpm build && pnpm ui:build",
|
|
84
|
+
"docs:list": "node scripts/docs-list.js",
|
|
85
|
+
"docs:bin": "node scripts/build-docs-list.mjs",
|
|
86
|
+
"docs:dev": "cd docs && mint dev",
|
|
87
|
+
"docs:build": "cd docs && pnpm dlx --reporter append-only mint broken-links",
|
|
88
|
+
"build": "tsc -p tsconfig.json && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/write-build-info.ts",
|
|
89
|
+
"plugins:sync": "node --import tsx scripts/sync-plugin-versions.ts",
|
|
90
|
+
"release:check": "node --import tsx scripts/release-check.ts",
|
|
91
|
+
"ui:install": "node scripts/ui.js install",
|
|
92
|
+
"ui:dev": "node scripts/ui.js dev",
|
|
93
|
+
"ui:build": "node scripts/ui.js build",
|
|
94
|
+
"start": "node scripts/run-node.mjs",
|
|
95
|
+
"taskmaster": "node scripts/run-node.mjs",
|
|
96
|
+
"gateway:watch": "node scripts/watch-node.mjs gateway --force",
|
|
97
|
+
"logs": "npx tsx scripts/session-viewer.ts",
|
|
98
|
+
"gateway:dev": "TASKMASTER_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway",
|
|
99
|
+
"gateway:dev:reset": "TASKMASTER_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset",
|
|
100
|
+
"tui": "node scripts/run-node.mjs tui",
|
|
101
|
+
"tui:dev": "TASKMASTER_PROFILE=dev node scripts/run-node.mjs tui",
|
|
102
|
+
"taskmaster:rpc": "node scripts/run-node.mjs agent --mode rpc --json",
|
|
103
|
+
"lint": "oxlint --type-aware src test",
|
|
104
|
+
"lint:fix": "pnpm format:fix && oxlint --type-aware --fix src test",
|
|
105
|
+
"format": "oxfmt --check src test",
|
|
106
|
+
"format:fix": "oxfmt --write src test",
|
|
107
|
+
"test": "node scripts/test-parallel.mjs",
|
|
108
|
+
"test:watch": "vitest",
|
|
109
|
+
"test:ui": "pnpm --dir ui test",
|
|
110
|
+
"test:force": "node --import tsx scripts/test-force.ts",
|
|
111
|
+
"test:coverage": "vitest run --coverage",
|
|
112
|
+
"test:e2e": "vitest run --config vitest.e2e.config.ts",
|
|
113
|
+
"test:live": "TASKMASTER_LIVE_TEST=1 vitest run --config vitest.live.config.ts",
|
|
114
|
+
"test:docker:onboard": "bash scripts/e2e/onboard-docker.sh",
|
|
115
|
+
"test:docker:gateway-network": "bash scripts/e2e/gateway-network-docker.sh",
|
|
116
|
+
"test:docker:live-models": "bash scripts/test-live-models-docker.sh",
|
|
117
|
+
"test:docker:live-gateway": "bash scripts/test-live-gateway-models-docker.sh",
|
|
118
|
+
"test:docker:qr": "bash scripts/e2e/qr-import-docker.sh",
|
|
119
|
+
"test:docker:doctor-switch": "bash scripts/e2e/doctor-install-switch-docker.sh",
|
|
120
|
+
"test:docker:plugins": "bash scripts/e2e/plugins-docker.sh",
|
|
121
|
+
"test:docker:cleanup": "bash scripts/test-cleanup-docker.sh",
|
|
122
|
+
"test:docker:all": "pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup",
|
|
123
|
+
"test:all": "pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all",
|
|
124
|
+
"test:install:e2e": "bash scripts/test-install-sh-e2e-docker.sh",
|
|
125
|
+
"test:install:smoke": "bash scripts/test-install-sh-docker.sh",
|
|
126
|
+
"test:install:e2e:openai": "TASKMASTER_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh",
|
|
127
|
+
"test:install:e2e:anthropic": "TASKMASTER_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh",
|
|
128
|
+
"protocol:gen": "node --import tsx scripts/protocol-gen.ts",
|
|
129
|
+
"protocol:check": "pnpm protocol:gen && git diff --exit-code -- dist/protocol.schema.json",
|
|
130
|
+
"canvas:a2ui:bundle": "bash scripts/bundle-a2ui.sh",
|
|
131
|
+
"check:loc": "node --import tsx scripts/check-ts-max-loc.ts --max 500"
|
|
132
|
+
},
|
|
80
133
|
"keywords": [],
|
|
81
134
|
"author": "",
|
|
82
135
|
"license": "MIT",
|
|
83
136
|
"engines": {
|
|
84
137
|
"node": ">=22.12.0"
|
|
85
138
|
},
|
|
139
|
+
"packageManager": "pnpm@10.23.0",
|
|
86
140
|
"dependencies": {
|
|
87
141
|
"@agentclientprotocol/sdk": "0.13.1",
|
|
88
142
|
"@aws-sdk/client-bedrock": "^3.975.0",
|
|
@@ -173,6 +227,14 @@
|
|
|
173
227
|
"vitest": "^4.0.18",
|
|
174
228
|
"wireit": "^0.14.12"
|
|
175
229
|
},
|
|
230
|
+
"pnpm": {
|
|
231
|
+
"minimumReleaseAge": 2880,
|
|
232
|
+
"overrides": {
|
|
233
|
+
"@sinclair/typebox": "0.34.47",
|
|
234
|
+
"hono": "4.11.4",
|
|
235
|
+
"tar": "7.5.4"
|
|
236
|
+
}
|
|
237
|
+
},
|
|
176
238
|
"vitest": {
|
|
177
239
|
"coverage": {
|
|
178
240
|
"provider": "v8",
|
|
@@ -201,57 +263,5 @@
|
|
|
201
263
|
"**/vendor/**",
|
|
202
264
|
"dist/Taskmaster.app/**"
|
|
203
265
|
]
|
|
204
|
-
},
|
|
205
|
-
"scripts": {
|
|
206
|
-
"dev": "node scripts/run-node.mjs",
|
|
207
|
-
"postinstall": "node scripts/postinstall.js",
|
|
208
|
-
"docs:list": "node scripts/docs-list.js",
|
|
209
|
-
"docs:bin": "node scripts/build-docs-list.mjs",
|
|
210
|
-
"docs:dev": "cd docs && mint dev",
|
|
211
|
-
"docs:build": "cd docs && pnpm dlx --reporter append-only mint broken-links",
|
|
212
|
-
"build": "tsc -p tsconfig.json && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/write-build-info.ts",
|
|
213
|
-
"plugins:sync": "node --import tsx scripts/sync-plugin-versions.ts",
|
|
214
|
-
"release:check": "node --import tsx scripts/release-check.ts",
|
|
215
|
-
"ui:install": "node scripts/ui.js install",
|
|
216
|
-
"ui:dev": "node scripts/ui.js dev",
|
|
217
|
-
"ui:build": "node scripts/ui.js build",
|
|
218
|
-
"start": "node scripts/run-node.mjs",
|
|
219
|
-
"taskmaster": "node scripts/run-node.mjs",
|
|
220
|
-
"gateway:watch": "node scripts/watch-node.mjs gateway --force",
|
|
221
|
-
"logs": "npx tsx scripts/session-viewer.ts",
|
|
222
|
-
"gateway:dev": "TASKMASTER_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway",
|
|
223
|
-
"gateway:dev:reset": "TASKMASTER_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset",
|
|
224
|
-
"tui": "node scripts/run-node.mjs tui",
|
|
225
|
-
"tui:dev": "TASKMASTER_PROFILE=dev node scripts/run-node.mjs tui",
|
|
226
|
-
"taskmaster:rpc": "node scripts/run-node.mjs agent --mode rpc --json",
|
|
227
|
-
"lint": "oxlint --type-aware src test",
|
|
228
|
-
"lint:fix": "pnpm format:fix && oxlint --type-aware --fix src test",
|
|
229
|
-
"format": "oxfmt --check src test",
|
|
230
|
-
"format:fix": "oxfmt --write src test",
|
|
231
|
-
"test": "node scripts/test-parallel.mjs",
|
|
232
|
-
"test:watch": "vitest",
|
|
233
|
-
"test:ui": "pnpm --dir ui test",
|
|
234
|
-
"test:force": "node --import tsx scripts/test-force.ts",
|
|
235
|
-
"test:coverage": "vitest run --coverage",
|
|
236
|
-
"test:e2e": "vitest run --config vitest.e2e.config.ts",
|
|
237
|
-
"test:live": "TASKMASTER_LIVE_TEST=1 vitest run --config vitest.live.config.ts",
|
|
238
|
-
"test:docker:onboard": "bash scripts/e2e/onboard-docker.sh",
|
|
239
|
-
"test:docker:gateway-network": "bash scripts/e2e/gateway-network-docker.sh",
|
|
240
|
-
"test:docker:live-models": "bash scripts/test-live-models-docker.sh",
|
|
241
|
-
"test:docker:live-gateway": "bash scripts/test-live-gateway-models-docker.sh",
|
|
242
|
-
"test:docker:qr": "bash scripts/e2e/qr-import-docker.sh",
|
|
243
|
-
"test:docker:doctor-switch": "bash scripts/e2e/doctor-install-switch-docker.sh",
|
|
244
|
-
"test:docker:plugins": "bash scripts/e2e/plugins-docker.sh",
|
|
245
|
-
"test:docker:cleanup": "bash scripts/test-cleanup-docker.sh",
|
|
246
|
-
"test:docker:all": "pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup",
|
|
247
|
-
"test:all": "pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all",
|
|
248
|
-
"test:install:e2e": "bash scripts/test-install-sh-e2e-docker.sh",
|
|
249
|
-
"test:install:smoke": "bash scripts/test-install-sh-docker.sh",
|
|
250
|
-
"test:install:e2e:openai": "TASKMASTER_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh",
|
|
251
|
-
"test:install:e2e:anthropic": "TASKMASTER_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh",
|
|
252
|
-
"protocol:gen": "node --import tsx scripts/protocol-gen.ts",
|
|
253
|
-
"protocol:check": "pnpm protocol:gen && git diff --exit-code -- dist/protocol.schema.json",
|
|
254
|
-
"canvas:a2ui:bundle": "bash scripts/bundle-a2ui.sh",
|
|
255
|
-
"check:loc": "node --import tsx scripts/check-ts-max-loc.ts --max 500"
|
|
256
266
|
}
|
|
257
|
-
}
|
|
267
|
+
}
|
package/scripts/install.sh
CHANGED
|
File without changes
|
package/templates/.DS_Store
DELETED
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/templates/maxy/.DS_Store
DELETED
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.DS_Store
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.DS_Store
|