@rubytech/taskmaster 1.17.17 → 1.19.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.
@@ -6,8 +6,8 @@
6
6
  <title>Taskmaster Control</title>
7
7
  <meta name="color-scheme" content="dark light" />
8
8
  <link rel="icon" type="image/png" href="./favicon.png" />
9
- <script type="module" crossorigin src="./assets/index-DYBHelH8.js"></script>
10
- <link rel="stylesheet" crossorigin href="./assets/index-XqRo9tNW.css">
9
+ <script type="module" crossorigin src="./assets/index-BuvDuhk9.js"></script>
10
+ <link rel="stylesheet" crossorigin href="./assets/index-0WHVrpg7.css">
11
11
  </head>
12
12
  <body>
13
13
  <taskmaster-app></taskmaster-app>
@@ -4,14 +4,14 @@ import path from "node:path";
4
4
  * Writes a delivery record to the agent's workspace memory so the admin agent
5
5
  * can discover what was sent by cron jobs when recipients reply later.
6
6
  *
7
- * Files are stored in `memory/shared/cron-activity/` as dated markdown,
8
- * discoverable via the agent's normal memory search.
7
+ * Files are stored in `memory/admin/cron-activity/` as dated markdown,
8
+ * discoverable via the admin agent's normal memory search.
9
9
  */
10
10
  export async function writeCronDeliveryRecord(params) {
11
11
  const { workspaceDir, jobName, jobId, agentOutput, deliveredTo, timestamp } = params;
12
12
  if (!agentOutput.trim() || deliveredTo.length === 0)
13
13
  return null;
14
- const dir = path.join(workspaceDir, "memory", "shared", "cron-activity");
14
+ const dir = path.join(workspaceDir, "memory", "admin", "cron-activity");
15
15
  await fs.promises.mkdir(dir, { recursive: true });
16
16
  const dateSlug = formatDateSlug(timestamp);
17
17
  const nameSlug = slugify(jobName);
@@ -403,8 +403,11 @@ export async function runCronIsolatedAgentTurn(params) {
403
403
  }
404
404
  }
405
405
  // Also persist delivery record to memory for searchability.
406
+ // Always write to the admin agent's workspace so records land in memory/admin/,
407
+ // regardless of which agent is executing the cron job.
408
+ const adminWorkspaceDir = resolveAgentWorkspaceDir(params.cfg, "admin");
406
409
  await writeCronDeliveryRecord({
407
- workspaceDir,
410
+ workspaceDir: adminWorkspaceDir,
408
411
  jobName: params.job.name,
409
412
  jobId: params.job.id,
410
413
  agentOutput: outputText,
@@ -25,7 +25,7 @@
25
25
  import { randomUUID } from "node:crypto";
26
26
  import fs from "node:fs";
27
27
  import path from "node:path";
28
- import { resolveAgentWorkspaceDir, resolveAgentWorkspaceRoot, resolveSessionAgentId } from "../agents/agent-scope.js";
28
+ import { resolveAgentWorkspaceDir, resolveAgentWorkspaceRoot, resolveSessionAgentId, } from "../agents/agent-scope.js";
29
29
  import { loadOrCreateSessionSecret, signSessionKey, verifySessionToken, } from "./public-chat/session-token.js";
30
30
  import { resolveEffectiveMessagesConfig, resolveIdentityName } from "../agents/identity.js";
31
31
  import { dispatchInboundMessage } from "../auto-reply/dispatch.js";
@@ -2,7 +2,7 @@ import { randomUUID } from "node:crypto";
2
2
  import fs from "node:fs";
3
3
  import path from "node:path";
4
4
  import { CURRENT_SESSION_VERSION } from "@mariozechner/pi-coding-agent";
5
- import { resolveAgentWorkspaceDir, resolveAgentWorkspaceRoot, resolveSessionAgentId } from "../../agents/agent-scope.js";
5
+ import { resolveAgentWorkspaceDir, resolveAgentWorkspaceRoot, resolveSessionAgentId, } from "../../agents/agent-scope.js";
6
6
  import { resolveEffectiveMessagesConfig, resolveIdentityName } from "../../agents/identity.js";
7
7
  import { resolveThinkingDefault } from "../../agents/model-selection.js";
8
8
  import { resolveAgentTimeoutMs } from "../../agents/timeout.js";
@@ -15,7 +15,7 @@ import fs from "node:fs";
15
15
  import path from "node:path";
16
16
  const AUDIT_FILENAME = ".memory-audit.json";
17
17
  /** Paths that are excluded from audit — expected operational writes. */
18
- const EXCLUDED_PREFIXES = ["memory/shared/events/", "memory/shared/cron-activity/"];
18
+ const EXCLUDED_PREFIXES = ["memory/shared/events/", "memory/admin/cron-activity/"];
19
19
  /**
20
20
  * Returns true if a memory write path should be audited.
21
21
  * Auditable paths: memory/shared/** and memory/public/** (excluding exemptions).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/taskmaster",
3
- "version": "1.17.17",
3
+ "version": "1.19.0",
4
4
  "description": "AI-powered business assistant for small businesses",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -103,6 +103,19 @@ When you create an event that also needs a reminder (e.g., "remind me 30 minutes
103
103
 
104
104
  The reminder's payload text should reference the event clearly so the recipient has full context when it fires.
105
105
 
106
+ ### Computing the cron timestamp safely
107
+
108
+ The `cron` tool takes `atMs` — a Unix timestamp in **milliseconds**. Errors here cause the job to fire immediately (if the time is in the past) with no warning.
109
+
110
+ **Always call `current_time` before scheduling a cron job.** Use the returned `unix` value (seconds since epoch) as your anchor:
111
+
112
+ 1. Get `unix` from `current_time` — this is the current time in seconds.
113
+ 2. Calculate how many seconds until the reminder should fire (days × 86400 + hours × 3600 + minutes × 60).
114
+ 3. Add to `unix`, then multiply by 1000 to get `atMs`.
115
+ 4. Before submitting: verify your computed `atMs` is strictly greater than `unix × 1000`. If it is not, the job will fire immediately — recalculate.
116
+
117
+ Never compute a Unix timestamp from a fixed epoch date (e.g. "January 1, 2026 = X"). Epoch arithmetic done from scratch is the most common source of year-off errors.
118
+
106
119
  ---
107
120
 
108
121
  ## Event Types
@@ -1087,6 +1087,23 @@ This is entirely optional and is a network preference, not a Taskmaster requirem
1087
1087
 
1088
1088
  ## Troubleshooting
1089
1089
 
1090
+ ### Start here: ask your assistant
1091
+
1092
+ Before digging into the Control Panel or exporting logs, ask your assistant. It has direct access to the system and session logs and can read them, identify patterns, and explain what's wrong in plain language — far faster than manual inspection.
1093
+
1094
+ **Try asking:**
1095
+ - *"Can you review the logs and tell me if anything looks wrong?"*
1096
+ - *"Is the system healthy?"*
1097
+ - *"Are there any errors or warnings I should know about?"*
1098
+
1099
+ Your assistant will scan both system logs and session logs, triage any issues by severity, and tell you what happened, why, and what to do. This is the quickest first step for any problem you can't immediately explain.
1100
+
1101
+ **Daily Log Review** — if you'd like this to happen automatically every day, go to **Advanced → Events** in the Control Panel, find the **Daily Log Review** event, and enable it. Your assistant will run a health check each morning and send you a report.
1102
+
1103
+ If the assistant surfaces an issue it can't resolve, it will advise you to forward the report to Taskmaster support on WhatsApp. That report contains everything the support team needs — no separate log export required.
1104
+
1105
+ ---
1106
+
1090
1107
  ### Can't access the Control Panel?
1091
1108
 
1092
1109
  If you can't load the Control Panel in your browser: