@rubytech/create-maxy-code 0.1.599 → 0.1.601
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/__tests__/email-sampler-unit.test.js +31 -0
- package/dist/index.js +18 -2
- package/dist/port-resolution.js +24 -0
- package/package.json +1 -1
- package/payload/platform/lib/routine-templates/dist/roster.d.ts +8 -2
- package/payload/platform/lib/routine-templates/dist/roster.d.ts.map +1 -1
- package/payload/platform/lib/routine-templates/dist/roster.js +10 -3
- package/payload/platform/lib/routine-templates/dist/roster.js.map +1 -1
- package/payload/platform/lib/routine-templates/src/__tests__/roster.test.ts +0 -0
- package/payload/platform/lib/routine-templates/src/__tests__/seed.test.ts +1 -1
- package/payload/platform/lib/routine-templates/src/roster.ts +20 -4
- package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +8 -0
- package/payload/platform/plugins/email/PLUGIN.md +7 -1
- package/payload/platform/plugins/email/mcp/dist/lib/credentials.d.ts +27 -0
- package/payload/platform/plugins/email/mcp/dist/lib/credentials.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/credentials.js +78 -0
- package/payload/platform/plugins/email/mcp/dist/lib/credentials.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/sampler/__tests__/sample-mailbox.test.d.ts +2 -0
- package/payload/platform/plugins/email/mcp/dist/sampler/__tests__/sample-mailbox.test.d.ts.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/sampler/__tests__/sample-mailbox.test.js +96 -0
- package/payload/platform/plugins/email/mcp/dist/sampler/__tests__/sample-mailbox.test.js.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/sampler/main.d.ts +2 -0
- package/payload/platform/plugins/email/mcp/dist/sampler/main.d.ts.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/sampler/main.js +75 -0
- package/payload/platform/plugins/email/mcp/dist/sampler/main.js.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/sampler/sample-mailbox.d.ts +48 -0
- package/payload/platform/plugins/email/mcp/dist/sampler/sample-mailbox.d.ts.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/sampler/sample-mailbox.js +77 -0
- package/payload/platform/plugins/email/mcp/dist/sampler/sample-mailbox.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/scheduling-gate.test.js +81 -3
- package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/scheduling-gate.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.d.ts +29 -2
- package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.js +67 -1
- package/payload/platform/plugins/scheduling/mcp/dist/tools/scheduling-gate.js.map +1 -1
- package/payload/platform/scripts/logs-read.sh +18 -3
- package/payload/server/public/operator.html +1 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Acceptance gate for the email-sampler systemd unit (Task 2682).
|
|
2
|
+
//
|
|
3
|
+
// The sampler runs the plugin's compiled entrypoint as its own per-brand user
|
|
4
|
+
// unit. Two invariants:
|
|
5
|
+
// (a) it runs `node dist/sampler/main.js` from the email plugin's mcp dir, so
|
|
6
|
+
// its relative imports of the plugin's lib resolve;
|
|
7
|
+
// (b) it carries the same runtime env the email MCP server needs —
|
|
8
|
+
// PLATFORM_ROOT, ACCOUNT_ID, the sampler log path — plus the brand .env
|
|
9
|
+
// (which supplies NEO4J_URI and the neo4j password source).
|
|
10
|
+
import test from "node:test";
|
|
11
|
+
import assert from "node:assert/strict";
|
|
12
|
+
import { buildEmailSamplerUnitFile } from "../port-resolution.js";
|
|
13
|
+
const unit = buildEmailSamplerUnitFile({
|
|
14
|
+
productName: "Maxy",
|
|
15
|
+
installDir: "/home/x/maxy-code",
|
|
16
|
+
persistDir: "/home/x/.maxy",
|
|
17
|
+
accountId: "acc-1",
|
|
18
|
+
logPath: "/home/x/.maxy/logs/email-sampler.log",
|
|
19
|
+
intervalSec: 60,
|
|
20
|
+
});
|
|
21
|
+
test("runs the compiled sampler from the plugin dir", () => {
|
|
22
|
+
assert.match(unit, /^WorkingDirectory=\/home\/x\/maxy-code\/platform\/plugins\/email\/mcp$/m);
|
|
23
|
+
assert.match(unit, /^ExecStart=\/usr\/bin\/node dist\/sampler\/main\.js$/m);
|
|
24
|
+
});
|
|
25
|
+
test("carries the plugin runtime env and the brand .env", () => {
|
|
26
|
+
assert.match(unit, /^Environment=PLATFORM_ROOT=\/home\/x\/maxy-code\/platform$/m);
|
|
27
|
+
assert.match(unit, /^Environment=ACCOUNT_ID=acc-1$/m);
|
|
28
|
+
assert.match(unit, /^Environment=EMAIL_SAMPLER_LOG_PATH=\/home\/x\/\.maxy\/logs\/email-sampler\.log$/m);
|
|
29
|
+
assert.match(unit, /^Environment=EMAIL_SAMPLER_INTERVAL_SEC=60$/m);
|
|
30
|
+
assert.match(unit, /^EnvironmentFile=-\/home\/x\/\.maxy\/\.env$/m);
|
|
31
|
+
});
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import { clearBrandAgentRoot } from "./brand-agent-root.js";
|
|
|
5
5
|
import { seedBypassPermissionsSettings, assertBypassPermissionsSeed } from "./permissions-seed.js";
|
|
6
6
|
import { resolve, join, dirname } from "node:path";
|
|
7
7
|
import { randomBytes } from "node:crypto";
|
|
8
|
-
import { resolveInstallPortFromFs, buildMaxyUnitFile, buildClaudeSessionManagerUnitFile, buildClaudePtysSliceUnitFile, buildCloudflaredSliceUnitFile, buildDarwinServiceEnvPath } from "./port-resolution.js";
|
|
8
|
+
import { resolveInstallPortFromFs, buildMaxyUnitFile, buildClaudeSessionManagerUnitFile, buildEmailSamplerUnitFile, buildClaudePtysSliceUnitFile, buildCloudflaredSliceUnitFile, buildDarwinServiceEnvPath } from "./port-resolution.js";
|
|
9
9
|
import { buildBrandCronBlock, mergeBrandCronBlock } from "./cron-registration.js";
|
|
10
10
|
import { validateTierFlag, validateEntitlementBase64, applyTierToAccountConfig, entitlementPath } from "./tier-flag.js";
|
|
11
11
|
import { parseOsRelease, isUbuntuLike as isUbuntuLikePure, parseAptCacheCandidate, decideAptResolution, } from "./apt-resolve.js";
|
|
@@ -4571,6 +4571,20 @@ WantedBy=default.target
|
|
|
4571
4571
|
`;
|
|
4572
4572
|
writeFileSync(join(serviceDir, rssSamplerUnitName), rssSamplerUnit);
|
|
4573
4573
|
logFile(` rss-sampler installed: ${rssSamplerUnitName} LOG_PATH=${rssSamplerLogPath} BRAND_SERVICE=${memBrandService} EDGE_SERVICE=${memEdgeService} NEO4J_UNIT=${memNeo4jUnit} MEM_PRESSURE_PCT=${memPressurePct}`);
|
|
4574
|
+
// Task 2682 — the email-sampler unit: an always-on user service that writes
|
|
4575
|
+
// every inbound IMAP message to the graph, independent of any agent turn. It
|
|
4576
|
+
// runs the email plugin's compiled sampler entrypoint from the plugin dir.
|
|
4577
|
+
const emailSamplerUnitName = `${BRAND.hostname}-email-sampler.service`;
|
|
4578
|
+
const emailSamplerLogPath = join(persistDir, "logs", "email-sampler.log");
|
|
4579
|
+
const emailSamplerUnit = buildEmailSamplerUnitFile({
|
|
4580
|
+
productName: BRAND.productName,
|
|
4581
|
+
installDir: INSTALL_DIR,
|
|
4582
|
+
persistDir,
|
|
4583
|
+
accountId: installAccountId,
|
|
4584
|
+
logPath: emailSamplerLogPath,
|
|
4585
|
+
});
|
|
4586
|
+
writeFileSync(join(serviceDir, emailSamplerUnitName), emailSamplerUnit);
|
|
4587
|
+
logFile(` email-sampler installed: ${emailSamplerUnitName} LOG_PATH=${emailSamplerLogPath}`);
|
|
4574
4588
|
// the edge service: always-on front door that owns the public
|
|
4575
4589
|
// port (PORT) and the VNC stack (Xtigervnc + websockify). Its lifecycle is
|
|
4576
4590
|
// independent of the main brand service, so an in-place upgrade triggered
|
|
@@ -4791,13 +4805,15 @@ WantedBy=multi-user.target
|
|
|
4791
4805
|
spawnSync("systemctl", ["--user", "enable", claudeSessionManagerUnitShort], { stdio: "inherit" });
|
|
4792
4806
|
spawnSync("systemctl", ["--user", "enable", unitName], { stdio: "inherit" });
|
|
4793
4807
|
spawnSync("systemctl", ["--user", "enable", `${BRAND.hostname}-rss-sampler`], { stdio: "inherit" });
|
|
4808
|
+
spawnSync("systemctl", ["--user", "enable", `${BRAND.hostname}-email-sampler`], { stdio: "inherit" });
|
|
4794
4809
|
// edge first: binds public port + starts VNC stack. Then claude-session-manager
|
|
4795
4810
|
// (so the main brand unit's Requires= is satisfied). Then main brand service.
|
|
4796
|
-
// rss-sampler
|
|
4811
|
+
// rss-sampler and email-sampler are independent — start last, failure is non-blocking.
|
|
4797
4812
|
spawnSync("systemctl", ["--user", "restart", edgeUnitShort], { stdio: "inherit" });
|
|
4798
4813
|
spawnSync("systemctl", ["--user", "restart", claudeSessionManagerUnitShort], { stdio: "inherit" });
|
|
4799
4814
|
spawnSync("systemctl", ["--user", "restart", unitName], { stdio: "inherit" });
|
|
4800
4815
|
spawnSync("systemctl", ["--user", "restart", `${BRAND.hostname}-rss-sampler`], { stdio: "inherit" });
|
|
4816
|
+
spawnSync("systemctl", ["--user", "restart", `${BRAND.hostname}-email-sampler`], { stdio: "inherit" });
|
|
4801
4817
|
// Session manager runs in its own systemd user unit and can boot-fail silently
|
|
4802
4818
|
// (e.g. mcp-block-missing). The web server below comes up regardless, so the
|
|
4803
4819
|
// install terminal would otherwise report success while every API call 503s.
|
package/dist/port-resolution.js
CHANGED
|
@@ -167,6 +167,30 @@ EnvironmentFile=-${o.persistDir}/.env
|
|
|
167
167
|
StandardOutput=append:${o.persistDir}/logs/server.log
|
|
168
168
|
StandardError=append:${o.persistDir}/logs/server.log
|
|
169
169
|
|
|
170
|
+
[Install]
|
|
171
|
+
WantedBy=default.target
|
|
172
|
+
`;
|
|
173
|
+
}
|
|
174
|
+
export function buildEmailSamplerUnitFile(o) {
|
|
175
|
+
return `[Unit]
|
|
176
|
+
Description=${o.productName} Email Sampler
|
|
177
|
+
After=network.target
|
|
178
|
+
|
|
179
|
+
[Service]
|
|
180
|
+
Type=simple
|
|
181
|
+
WorkingDirectory=${o.installDir}/platform/plugins/email/mcp
|
|
182
|
+
ExecStart=/usr/bin/node dist/sampler/main.js
|
|
183
|
+
Restart=on-failure
|
|
184
|
+
RestartSec=10
|
|
185
|
+
Environment=NODE_ENV=production
|
|
186
|
+
Environment=ACCOUNT_ID=${o.accountId}
|
|
187
|
+
Environment=PLATFORM_ROOT=${o.installDir}/platform
|
|
188
|
+
Environment=EMAIL_SAMPLER_LOG_PATH=${o.logPath}
|
|
189
|
+
Environment=EMAIL_SAMPLER_INTERVAL_SEC=${o.intervalSec ?? 60}
|
|
190
|
+
EnvironmentFile=-${o.persistDir}/.env
|
|
191
|
+
StandardOutput=append:${o.persistDir}/logs/server.log
|
|
192
|
+
StandardError=append:${o.persistDir}/logs/server.log
|
|
193
|
+
|
|
170
194
|
[Install]
|
|
171
195
|
WantedBy=default.target
|
|
172
196
|
`;
|
package/package.json
CHANGED
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
* routine's prompt only when the stored `routineTemplateVersion` is BELOW this
|
|
35
35
|
* and no operator has edited the row, so an unbumped edit ships to new installs
|
|
36
36
|
* and never reaches existing ones — bump it in the same commit as the edit. */
|
|
37
|
-
export declare const ROUTINE_TEMPLATE_VERSION =
|
|
37
|
+
export declare const ROUTINE_TEMPLATE_VERSION = 6;
|
|
38
38
|
/**
|
|
39
39
|
* Task 2379 — the check shapes a shipped template may name.
|
|
40
40
|
*
|
|
@@ -70,7 +70,13 @@ export interface RoutineTelegramCheck {
|
|
|
70
70
|
readonly type: "telegram";
|
|
71
71
|
readonly scope: "inbound";
|
|
72
72
|
}
|
|
73
|
-
|
|
73
|
+
/** Task 2681 — activity in the account's own graph. `appointments` is
|
|
74
|
+
* `:Event`/`:Meeting`, the two labels a calendar reconcile reconciles. */
|
|
75
|
+
export interface RoutineGraphCheck {
|
|
76
|
+
readonly type: "graph";
|
|
77
|
+
readonly scope: "appointments";
|
|
78
|
+
}
|
|
79
|
+
export type RoutineGateCheck = RoutineMailCheck | RoutineD1Check | RoutineWhatsappCheck | RoutineCalendarCheck | RoutineTelegramCheck | RoutineGraphCheck;
|
|
74
80
|
/** The plugin and the tool are constants for every roster gate, so a template
|
|
75
81
|
* carries neither. `hasWork` is true when ANY check is true. */
|
|
76
82
|
export interface RoutineGate {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roster.d.ts","sourceRoot":"","sources":["../src/roster.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH;;;gFAGgF;AAChF,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C;;;;;;;;;GASG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C;AACD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AACD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC;CACtC;AACD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AACD;iDACiD;AACjD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;CAC3B;AACD,MAAM,MAAM,gBAAgB,GACxB,gBAAgB,GAChB,cAAc,GACd,oBAAoB,GACpB,oBAAoB,GACpB,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"roster.d.ts","sourceRoot":"","sources":["../src/roster.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH;;;gFAGgF;AAChF,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C;;;;;;;;;GASG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C;AACD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AACD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC;CACtC;AACD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AACD;iDACiD;AACjD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;CAC3B;AACD;2EAC2E;AAC3E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;CAChC;AACD,MAAM,MAAM,gBAAgB,GACxB,gBAAgB,GAChB,cAAc,GACd,oBAAoB,GACpB,oBAAoB,GACpB,oBAAoB,GACpB,iBAAiB,CAAC;AAEtB;iEACiE;AACjE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,CAAC;CAC9C;AAWD;;;;;;;;;;;4DAW4D;AAC5D,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAUnE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAE1D;AAED,MAAM,WAAW,eAAe;IAC9B;;mEAE+D;IAC/D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;6EAGyE;IACzE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;wEACoE;IACpE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;2CAIuC;IACvC,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;IAC5B;;;+DAG2D;IAC3D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;2BAO2B;AAC3B,wBAAgB,YAAY,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAI/D;AA8KD;;;;;;;;iFAQiF;AACjF,eAAO,MAAM,cAAc,EAAE,SAAS,eAAe,EAiIpD,CAAC;AAEF;;6DAE6D;AAC7D,eAAO,MAAM,mBAAmB,EAAE,SAAS,MAAM,EAAqC,CAAC"}
|
|
@@ -40,7 +40,7 @@ exports.isClassified = isClassified;
|
|
|
40
40
|
* routine's prompt only when the stored `routineTemplateVersion` is BELOW this
|
|
41
41
|
* and no operator has edited the row, so an unbumped edit ships to new installs
|
|
42
42
|
* and never reaches existing ones — bump it in the same commit as the edit. */
|
|
43
|
-
exports.ROUTINE_TEMPLATE_VERSION =
|
|
43
|
+
exports.ROUTINE_TEMPLATE_VERSION = 6;
|
|
44
44
|
// Task 2663 — `GATE_COMMIT_TOKEN` is deleted. It stood in for a
|
|
45
45
|
// `scheduling-gate` call the routine's own turn made to advance its watermark,
|
|
46
46
|
// and the whole reason it had to be a token was that a template cannot write the
|
|
@@ -64,7 +64,12 @@ exports.ROUTINE_TEMPLATE_VERSION = 5;
|
|
|
64
64
|
function isWatermarkedCheck(check) {
|
|
65
65
|
if (check.type === "whatsapp")
|
|
66
66
|
return check.scope === "inbound";
|
|
67
|
-
|
|
67
|
+
// Task 2681 — `graph` compares an ISO `updatedAt` against a stored one, so a
|
|
68
|
+
// commitless graph gate reports work on every fire exactly as a mail one does.
|
|
69
|
+
return (check.type === "mail" ||
|
|
70
|
+
check.type === "calendar" ||
|
|
71
|
+
check.type === "telegram" ||
|
|
72
|
+
check.type === "graph");
|
|
68
73
|
}
|
|
69
74
|
function gateNeedsCommit(gate) {
|
|
70
75
|
return gate.checks.some(isWatermarkedCheck);
|
|
@@ -304,7 +309,9 @@ exports.ROUTINE_ROSTER = [
|
|
|
304
309
|
description: "Reconciles the provider calendar against the appointments held in the graph, writing what is missing and marking what was cancelled; a clean run says nothing.",
|
|
305
310
|
recurrence: "*/15 * * * *",
|
|
306
311
|
prompt: CALENDAR_RECONCILE,
|
|
307
|
-
|
|
312
|
+
// Task 2681 — reconciles both sides, so it wakes when either the provider
|
|
313
|
+
// calendar (the busy digest) or the graph's appointments change.
|
|
314
|
+
gate: { checks: [{ type: "calendar", connector: "account" }, { type: "graph", scope: "appointments" }] },
|
|
308
315
|
},
|
|
309
316
|
{
|
|
310
317
|
key: "contact-reconcile",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roster.js","sourceRoot":"","sources":["../src/roster.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;;;
|
|
1
|
+
{"version":3,"file":"roster.js","sourceRoot":"","sources":["../src/roster.ts"],"names":[],"mappings":"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"}
|
|
Binary file
|
|
@@ -413,7 +413,7 @@ describe("gate seeding", () => {
|
|
|
413
413
|
const rows = merge.params.rows as Array<{ key: string; gateChecks: string | null }>;
|
|
414
414
|
const byKey = new Map(rows.map((r) => [r.key, r.gateChecks]));
|
|
415
415
|
expect(byKey.get("channel-link-check")).toBe('[{"type":"whatsapp","scope":"status"}]');
|
|
416
|
-
expect(byKey.get("calendar-reconcile")).toBe('[{"type":"calendar","connector":"account"}]');
|
|
416
|
+
expect(byKey.get("calendar-reconcile")).toBe('[{"type":"calendar","connector":"account"},{"type":"graph","scope":"appointments"}]');
|
|
417
417
|
expect(byKey.get("telegram-inbound-check")).toBe('[{"type":"telegram","scope":"inbound"}]');
|
|
418
418
|
expect(byKey.get("weekly-digest")).toBeNull();
|
|
419
419
|
});
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
* routine's prompt only when the stored `routineTemplateVersion` is BELOW this
|
|
36
36
|
* and no operator has edited the row, so an unbumped edit ships to new installs
|
|
37
37
|
* and never reaches existing ones — bump it in the same commit as the edit. */
|
|
38
|
-
export const ROUTINE_TEMPLATE_VERSION =
|
|
38
|
+
export const ROUTINE_TEMPLATE_VERSION = 6;
|
|
39
39
|
|
|
40
40
|
/**
|
|
41
41
|
* Task 2379 — the check shapes a shipped template may name.
|
|
@@ -72,12 +72,19 @@ export interface RoutineTelegramCheck {
|
|
|
72
72
|
readonly type: "telegram";
|
|
73
73
|
readonly scope: "inbound";
|
|
74
74
|
}
|
|
75
|
+
/** Task 2681 — activity in the account's own graph. `appointments` is
|
|
76
|
+
* `:Event`/`:Meeting`, the two labels a calendar reconcile reconciles. */
|
|
77
|
+
export interface RoutineGraphCheck {
|
|
78
|
+
readonly type: "graph";
|
|
79
|
+
readonly scope: "appointments";
|
|
80
|
+
}
|
|
75
81
|
export type RoutineGateCheck =
|
|
76
82
|
| RoutineMailCheck
|
|
77
83
|
| RoutineD1Check
|
|
78
84
|
| RoutineWhatsappCheck
|
|
79
85
|
| RoutineCalendarCheck
|
|
80
|
-
| RoutineTelegramCheck
|
|
86
|
+
| RoutineTelegramCheck
|
|
87
|
+
| RoutineGraphCheck;
|
|
81
88
|
|
|
82
89
|
/** The plugin and the tool are constants for every roster gate, so a template
|
|
83
90
|
* carries neither. `hasWork` is true when ANY check is true. */
|
|
@@ -108,7 +115,14 @@ export interface RoutineGate {
|
|
|
108
115
|
* on every fire exactly as a commitless mail gate does. */
|
|
109
116
|
export function isWatermarkedCheck(check: RoutineGateCheck): boolean {
|
|
110
117
|
if (check.type === "whatsapp") return check.scope === "inbound";
|
|
111
|
-
|
|
118
|
+
// Task 2681 — `graph` compares an ISO `updatedAt` against a stored one, so a
|
|
119
|
+
// commitless graph gate reports work on every fire exactly as a mail one does.
|
|
120
|
+
return (
|
|
121
|
+
check.type === "mail" ||
|
|
122
|
+
check.type === "calendar" ||
|
|
123
|
+
check.type === "telegram" ||
|
|
124
|
+
check.type === "graph"
|
|
125
|
+
);
|
|
112
126
|
}
|
|
113
127
|
|
|
114
128
|
export function gateNeedsCommit(gate: RoutineGate): boolean {
|
|
@@ -402,7 +416,9 @@ export const ROUTINE_ROSTER: readonly RoutineTemplate[] = [
|
|
|
402
416
|
"Reconciles the provider calendar against the appointments held in the graph, writing what is missing and marking what was cancelled; a clean run says nothing.",
|
|
403
417
|
recurrence: "*/15 * * * *",
|
|
404
418
|
prompt: CALENDAR_RECONCILE,
|
|
405
|
-
|
|
419
|
+
// Task 2681 — reconciles both sides, so it wakes when either the provider
|
|
420
|
+
// calendar (the busy digest) or the graph's appointments change.
|
|
421
|
+
gate: { checks: [{ type: "calendar", connector: "account" }, { type: "graph", scope: "appointments" }] },
|
|
406
422
|
},
|
|
407
423
|
{
|
|
408
424
|
key: "contact-reconcile",
|
|
@@ -9,6 +9,14 @@ Invoked by the admin agent directly.
|
|
|
9
9
|
|
|
10
10
|
This is the platform's release timeline, newest first. Each entry shows the date it shipped and the version it shipped in, so you can tell the operator how current their install is. To compare, read the installed version from `capabilities-here` and match it against the versions below. Keep answers high level and in plain English; this is a summary, not a full commit log.
|
|
11
11
|
|
|
12
|
+
## 2026-08-13 (0.1.601)
|
|
13
|
+
|
|
14
|
+
- Your incoming email is now recorded automatically. A background service checks each connected mailbox on its own and saves every new message so the assistant can recall it later, without you having to say "check my email" first.
|
|
15
|
+
|
|
16
|
+
## 2026-08-13 (0.1.600)
|
|
17
|
+
|
|
18
|
+
- The routine that keeps your diary and the app's view of it in step now also wakes when an appointment changes in the app, not only when your provider calendar changes. It stays quiet on a check where neither side moved.
|
|
19
|
+
|
|
12
20
|
## 2026-08-13 (0.1.599)
|
|
13
21
|
|
|
14
22
|
- A recurring routine that had nothing to report now stays silent instead of sending a "nothing to report" message. A routine set up without a check to skip an empty run now simply does nothing on that run, rather than waking the assistant to speak.
|
|
@@ -143,7 +143,13 @@ Manages the agent's own dedicated email account — IMAP for reading, SMTP for s
|
|
|
143
143
|
|
|
144
144
|
## Ingestion model
|
|
145
145
|
|
|
146
|
-
|
|
146
|
+
There are two independent paths into the graph, both writing `:ConversationArchive {source:'email'}`:
|
|
147
|
+
|
|
148
|
+
- **Deterministic ingest — the `email-sampler` service.** A per-brand, always-on systemd user unit (`<brand>-email-sampler.service`) runs the plugin's compiled `dist/sampler/main.js`. Each cycle it enumerates every connected IMAP mailbox on the install and writes every inbound message above its own cursor, with no agent turn and no approval step. Its cursor is `:EmailAccount.samplerCursorUid` + `samplerUidValidity`, written only by the sampler and kept strictly independent of `lastFetchedUid` (which `email-fetch` owns). This is the foundation a gate that reads email-in-graph can trust: every inbound message lands within one cycle. Observability: one `op=sample mailbox=<addr> fetched=<n> cursor=<uid>` line per mailbox per cycle (`op=sample-error` on failure, cursor unadvanced), read with `logs-read.sh --tail email-sampler`. Attachment archival by the sampler is deferred (see the task follow-up).
|
|
149
|
+
|
|
150
|
+
- **Operator-initiated ingest — human-in-the-loop.** When the operator says "check my emails", `email-fetch` lists new messages and the operator approves each one; only the approved subset is written via `email-ingest`, which also fetches and archives attachment bytes. See `skills/email-ingest/SKILL.md` for the conversation flow and `skills/email-composition/SKILL.md` for drafting replies once a thread is stored.
|
|
151
|
+
|
|
152
|
+
The two watermarks are independent by design, so a message may be seen by both; `dispatch` uses MERGE, so a double write is idempotent and never duplicates a node.
|
|
147
153
|
|
|
148
154
|
## Retrieval paths
|
|
149
155
|
|
|
@@ -61,6 +61,33 @@ export declare function readConfig(accountId: string, email: string): Promise<Em
|
|
|
61
61
|
* own :EmailAccount node keyed by (accountId, email).
|
|
62
62
|
*/
|
|
63
63
|
export declare function listConfigs(accountId: string): Promise<EmailConfig[]>;
|
|
64
|
+
/** The sampler's own high-water mark for one mailbox, keyed by uidValidity. */
|
|
65
|
+
export interface SamplerCursor {
|
|
66
|
+
cursorUid: number;
|
|
67
|
+
uidValidity: number | null;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Every configured IMAP mailbox across every account on the install, with its
|
|
71
|
+
* password resolved. An account whose password cannot be read is skipped (with
|
|
72
|
+
* a stderr note) rather than failing the whole enumeration, so one broken
|
|
73
|
+
* credential never stops the sampler from servicing the others.
|
|
74
|
+
*/
|
|
75
|
+
export declare function listAllImapAccounts(): Promise<Array<{
|
|
76
|
+
accountId: string;
|
|
77
|
+
config: EmailConfig;
|
|
78
|
+
password: string;
|
|
79
|
+
}>>;
|
|
80
|
+
/**
|
|
81
|
+
* Read the sampler's cursor for one mailbox. Returns null when the node is
|
|
82
|
+
* absent or the sampler has never written a cursor for it — the caller treats
|
|
83
|
+
* that as "start from a fresh backfill".
|
|
84
|
+
*/
|
|
85
|
+
export declare function readSamplerCursor(accountId: string, email: string): Promise<SamplerCursor | null>;
|
|
86
|
+
/**
|
|
87
|
+
* Advance the sampler's cursor for one mailbox. Written only by the sampler,
|
|
88
|
+
* never touching `lastFetchedUid`. Integer-typed to match `lastFetchedUid`.
|
|
89
|
+
*/
|
|
90
|
+
export declare function advanceSamplerCursor(accountId: string, email: string, cursorUid: number, uidValidity: number): Promise<void>;
|
|
64
91
|
/**
|
|
65
92
|
* Resolve which configured mailbox a call targets.
|
|
66
93
|
* Resolution order:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -144,6 +144,84 @@ export async function listConfigs(accountId) {
|
|
|
144
144
|
await session.close();
|
|
145
145
|
}
|
|
146
146
|
}
|
|
147
|
+
/**
|
|
148
|
+
* Every configured IMAP mailbox across every account on the install, with its
|
|
149
|
+
* password resolved. An account whose password cannot be read is skipped (with
|
|
150
|
+
* a stderr note) rather than failing the whole enumeration, so one broken
|
|
151
|
+
* credential never stops the sampler from servicing the others.
|
|
152
|
+
*/
|
|
153
|
+
export async function listAllImapAccounts() {
|
|
154
|
+
const session = getSession();
|
|
155
|
+
let propRows;
|
|
156
|
+
try {
|
|
157
|
+
const result = await session.run(`MATCH (e:EmailAccount) RETURN e ORDER BY e.accountId, e.email`);
|
|
158
|
+
propRows = result.records.map((r) => r.get("e").properties);
|
|
159
|
+
}
|
|
160
|
+
finally {
|
|
161
|
+
await session.close();
|
|
162
|
+
}
|
|
163
|
+
// Map + resolve the password per row, skipping any row that throws (a
|
|
164
|
+
// malformed node whose nodeToConfig fails, or a missing password) rather than
|
|
165
|
+
// letting one bad node blank the whole enumeration — the sampler runs
|
|
166
|
+
// unattended, so a single bad row must never stop it servicing the others.
|
|
167
|
+
const out = [];
|
|
168
|
+
for (const props of propRows) {
|
|
169
|
+
const accountId = props.accountId;
|
|
170
|
+
try {
|
|
171
|
+
const config = nodeToConfig(props);
|
|
172
|
+
out.push({ accountId, config, password: readPassword(config.email) });
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
process.stderr.write(`[email-sampler] WARN skip account=${(accountId ?? "").slice(0, 8)} mailbox=${props.email ?? "?"} ` +
|
|
176
|
+
`reason=${err instanceof Error ? err.message : String(err)}\n`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return out;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Read the sampler's cursor for one mailbox. Returns null when the node is
|
|
183
|
+
* absent or the sampler has never written a cursor for it — the caller treats
|
|
184
|
+
* that as "start from a fresh backfill".
|
|
185
|
+
*/
|
|
186
|
+
export async function readSamplerCursor(accountId, email) {
|
|
187
|
+
const session = getSession();
|
|
188
|
+
try {
|
|
189
|
+
const result = await session.run(`MATCH (e:EmailAccount {accountId: $accountId, email: $email})
|
|
190
|
+
RETURN e.samplerCursorUid AS uid, e.samplerUidValidity AS v LIMIT 1`, { accountId, email });
|
|
191
|
+
if (result.records.length === 0)
|
|
192
|
+
return null;
|
|
193
|
+
const uid = result.records[0].get("uid");
|
|
194
|
+
if (uid === null || uid === undefined)
|
|
195
|
+
return null;
|
|
196
|
+
const v = result.records[0].get("v");
|
|
197
|
+
return {
|
|
198
|
+
cursorUid: neo4j.integer.toNumber(uid),
|
|
199
|
+
uidValidity: v === null || v === undefined ? null : neo4j.integer.toNumber(v),
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
finally {
|
|
203
|
+
await session.close();
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Advance the sampler's cursor for one mailbox. Written only by the sampler,
|
|
208
|
+
* never touching `lastFetchedUid`. Integer-typed to match `lastFetchedUid`.
|
|
209
|
+
*/
|
|
210
|
+
export async function advanceSamplerCursor(accountId, email, cursorUid, uidValidity) {
|
|
211
|
+
const session = getSession();
|
|
212
|
+
try {
|
|
213
|
+
await session.run(`MATCH (e:EmailAccount {accountId: $accountId, email: $email})
|
|
214
|
+
SET e.samplerCursorUid = $cursorUid, e.samplerUidValidity = $uidValidity`, {
|
|
215
|
+
accountId,
|
|
216
|
+
email,
|
|
217
|
+
cursorUid: neo4j.int(cursorUid),
|
|
218
|
+
uidValidity: neo4j.int(uidValidity),
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
finally {
|
|
222
|
+
await session.close();
|
|
223
|
+
}
|
|
224
|
+
}
|
|
147
225
|
/**
|
|
148
226
|
* The one line that makes an outbound mailbox choice attributable: which
|
|
149
227
|
* address was picked, and which of the three routes picked it (Task 2194).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"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"}
|
package/payload/platform/plugins/email/mcp/dist/sampler/__tests__/sample-mailbox.test.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sample-mailbox.test.d.ts","sourceRoot":"","sources":["../../../src/sampler/__tests__/sample-mailbox.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { sampleMailbox } from "../sample-mailbox.js";
|
|
3
|
+
const config = { email: "box@x.com", agentAddress: "box@x.com" };
|
|
4
|
+
const account = { accountId: "acc-1", config, password: "pw" };
|
|
5
|
+
const email = (uid) => ({
|
|
6
|
+
uid,
|
|
7
|
+
messageId: `<m${uid}@x>`,
|
|
8
|
+
inReplyTo: null,
|
|
9
|
+
toAddresses: ["box@x.com"],
|
|
10
|
+
ccAddresses: [],
|
|
11
|
+
fromAddress: "s@y.com",
|
|
12
|
+
fromName: "S",
|
|
13
|
+
subject: `s${uid}`,
|
|
14
|
+
date: "2026-08-13T00:00:00Z",
|
|
15
|
+
bodyPreview: "b",
|
|
16
|
+
attachments: [],
|
|
17
|
+
});
|
|
18
|
+
function deps(over = {}) {
|
|
19
|
+
return {
|
|
20
|
+
fetchSince: vi.fn(async () => ({ uidValidity: 100, emails: [], maxUid: 0 })),
|
|
21
|
+
write: vi.fn(async () => ({
|
|
22
|
+
threadsDispatched: 1,
|
|
23
|
+
threadsSkipped: 0,
|
|
24
|
+
unresolvedAddresses: [],
|
|
25
|
+
attachmentsAttached: 0,
|
|
26
|
+
attachmentsFailed: 0,
|
|
27
|
+
})),
|
|
28
|
+
readCursor: vi.fn(async () => null),
|
|
29
|
+
advanceCursor: vi.fn(async () => { }),
|
|
30
|
+
recipients: () => ["box@x.com"],
|
|
31
|
+
log: vi.fn(),
|
|
32
|
+
...over,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
describe("sampleMailbox", () => {
|
|
36
|
+
it("writes above-cursor messages once and advances the cursor to maxUid", async () => {
|
|
37
|
+
const d = deps({
|
|
38
|
+
readCursor: vi.fn(async () => ({ cursorUid: 10, uidValidity: 100 })),
|
|
39
|
+
fetchSince: vi.fn(async () => ({ uidValidity: 100, emails: [email(11), email(12)], maxUid: 12 })),
|
|
40
|
+
});
|
|
41
|
+
const r = await sampleMailbox(d, account);
|
|
42
|
+
expect(d.write).toHaveBeenCalledTimes(1);
|
|
43
|
+
expect(d.write.mock.calls[0][0]).toHaveLength(2);
|
|
44
|
+
expect(d.advanceCursor).toHaveBeenCalledWith("acc-1", "box@x.com", 12, 100);
|
|
45
|
+
expect(r).toMatchObject({ fetched: 2, cursor: 12 });
|
|
46
|
+
});
|
|
47
|
+
it("leaves the cursor unadvanced when the write fails", async () => {
|
|
48
|
+
const d = deps({
|
|
49
|
+
readCursor: vi.fn(async () => ({ cursorUid: 10, uidValidity: 100 })),
|
|
50
|
+
fetchSince: vi.fn(async () => ({ uidValidity: 100, emails: [email(11)], maxUid: 11 })),
|
|
51
|
+
write: vi.fn(async () => {
|
|
52
|
+
throw new Error("neo4j down");
|
|
53
|
+
}),
|
|
54
|
+
});
|
|
55
|
+
const r = await sampleMailbox(d, account);
|
|
56
|
+
expect(d.advanceCursor).not.toHaveBeenCalled();
|
|
57
|
+
expect(r.error).toContain("neo4j down");
|
|
58
|
+
expect(d.log.mock.calls.some((c) => String(c[0]).includes("op=sample-error"))).toBe(true);
|
|
59
|
+
});
|
|
60
|
+
it("is a no-op when nothing is above the cursor", async () => {
|
|
61
|
+
const d = deps({
|
|
62
|
+
readCursor: vi.fn(async () => ({ cursorUid: 10, uidValidity: 100 })),
|
|
63
|
+
fetchSince: vi.fn(async () => ({ uidValidity: 100, emails: [], maxUid: 0 })),
|
|
64
|
+
});
|
|
65
|
+
const r = await sampleMailbox(d, account);
|
|
66
|
+
expect(d.write).not.toHaveBeenCalled();
|
|
67
|
+
expect(d.advanceCursor).not.toHaveBeenCalled();
|
|
68
|
+
expect(r).toMatchObject({ fetched: 0, cursor: 10 });
|
|
69
|
+
});
|
|
70
|
+
it("a second cycle over a persistent store does not re-ingest", async () => {
|
|
71
|
+
let stored = null;
|
|
72
|
+
const d = deps({
|
|
73
|
+
readCursor: vi.fn(async () => stored),
|
|
74
|
+
advanceCursor: vi.fn(async (_a, _e, uid, v) => {
|
|
75
|
+
stored = { cursorUid: uid, uidValidity: v };
|
|
76
|
+
}),
|
|
77
|
+
fetchSince: vi.fn(async (_c, _p, sinceUid) => sinceUid < 12
|
|
78
|
+
? { uidValidity: 100, emails: [email(11), email(12)], maxUid: 12 }
|
|
79
|
+
: { uidValidity: 100, emails: [], maxUid: 0 }),
|
|
80
|
+
});
|
|
81
|
+
await sampleMailbox(d, account);
|
|
82
|
+
await sampleMailbox(d, account);
|
|
83
|
+
expect(d.write).toHaveBeenCalledTimes(1);
|
|
84
|
+
});
|
|
85
|
+
it("resets the cursor to a backfill when uidValidity changed", async () => {
|
|
86
|
+
const d = deps({
|
|
87
|
+
readCursor: vi.fn(async () => ({ cursorUid: 5000, uidValidity: 100 })),
|
|
88
|
+
fetchSince: vi.fn(async () => ({ uidValidity: 200, emails: [email(1)], maxUid: 1 })),
|
|
89
|
+
});
|
|
90
|
+
const r = await sampleMailbox(d, account);
|
|
91
|
+
expect(d.write).not.toHaveBeenCalled();
|
|
92
|
+
expect(d.advanceCursor).toHaveBeenCalledWith("acc-1", "box@x.com", 0, 200);
|
|
93
|
+
expect(r).toMatchObject({ fetched: 0, cursor: 0 });
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
//# sourceMappingURL=sample-mailbox.test.js.map
|