@rubytech/create-maxy-code 0.1.265 → 0.1.267
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/index.js +16 -0
- package/package.json +1 -1
- package/payload/platform/lib/models/dist/index.d.ts +1 -1
- package/payload/platform/lib/models/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/models/dist/index.js +5 -2
- package/payload/platform/lib/models/dist/index.js.map +1 -1
- package/payload/platform/lib/models/src/index.ts +5 -2
- package/payload/platform/neo4j/schema.cypher +13 -0
- package/payload/platform/package-lock.json +16 -0
- package/payload/platform/package.json +3 -2
- package/payload/platform/plugins/admin/mcp/dist/__tests__/skill-search.test.js +9 -9
- package/payload/platform/plugins/admin/mcp/dist/__tests__/skill-search.test.js.map +1 -1
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +11 -3
- package/payload/platform/plugins/admin/skills/public-agent-manager/SKILL.md +2 -2
- package/payload/platform/plugins/business-assistant/PLUGIN.md +1 -5
- package/payload/platform/plugins/docs/references/admin-ui.md +1 -1
- package/payload/platform/plugins/docs/references/voice-mirror-guide.md +9 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.js +36 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts +10 -0
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.js +59 -0
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.d.ts +19 -0
- package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.js +31 -0
- package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.js.map +1 -0
- package/payload/platform/services/whatsapp-channel/package.json +20 -0
- package/payload/platform/templates/account.json +1 -1
- package/payload/platform/templates/specialists/agents/content-producer.md +1 -1
- package/payload/platform/templates/specialists/agents/librarian.md +1 -1
- package/payload/platform/templates/specialists/agents/research-assistant.md +1 -1
- package/payload/premium-plugins/venture-studio/skills/investor-data-room/SKILL.md +1 -1
- package/payload/premium-plugins/writer-craft/PLUGIN.md +4 -4
- package/payload/premium-plugins/writer-craft/mcp/dist/index.d.ts.map +1 -1
- package/payload/premium-plugins/writer-craft/mcp/dist/index.js +44 -9
- package/payload/premium-plugins/writer-craft/mcp/dist/index.js.map +1 -1
- package/payload/premium-plugins/writer-craft/mcp/dist/lib/voice-corpus.d.ts +31 -0
- package/payload/premium-plugins/writer-craft/mcp/dist/lib/voice-corpus.d.ts.map +1 -1
- package/payload/premium-plugins/writer-craft/mcp/dist/lib/voice-corpus.js +28 -0
- package/payload/premium-plugins/writer-craft/mcp/dist/lib/voice-corpus.js.map +1 -1
- package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-distil-profile.d.ts +7 -1
- package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-distil-profile.d.ts.map +1 -1
- package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-distil-profile.js +93 -44
- package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-distil-profile.js.map +1 -1
- package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-ingest-session-text.d.ts.map +1 -1
- package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-ingest-session-text.js +1 -0
- package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-ingest-session-text.js.map +1 -1
- package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-record-feedback.d.ts +7 -1
- package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-record-feedback.d.ts.map +1 -1
- package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-record-feedback.js +14 -3
- package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-record-feedback.js.map +1 -1
- package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-retrieve-conditioning.d.ts +22 -8
- package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-retrieve-conditioning.d.ts.map +1 -1
- package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-retrieve-conditioning.js +93 -84
- package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-retrieve-conditioning.js.map +1 -1
- package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-tag-content.d.ts +18 -0
- package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-tag-content.d.ts.map +1 -1
- package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-tag-content.js +32 -3
- package/payload/premium-plugins/writer-craft/mcp/dist/tools/voice-tag-content.js.map +1 -1
- package/payload/premium-plugins/writer-craft/mcp/scripts/smoke.mjs +35 -2
- package/payload/premium-plugins/writer-craft/mcp/src/index.ts +52 -10
- package/payload/premium-plugins/writer-craft/mcp/src/lib/voice-corpus.ts +39 -0
- package/payload/premium-plugins/writer-craft/mcp/src/tools/voice-distil-profile.ts +108 -44
- package/payload/premium-plugins/writer-craft/mcp/src/tools/voice-ingest-session-text.ts +1 -0
- package/payload/premium-plugins/writer-craft/mcp/src/tools/voice-record-feedback.ts +24 -4
- package/payload/premium-plugins/writer-craft/mcp/src/tools/voice-retrieve-conditioning.ts +136 -102
- package/payload/premium-plugins/writer-craft/mcp/src/tools/voice-tag-content.ts +45 -3
- package/payload/premium-plugins/writer-craft/skills/voice-mirror/SKILL.md +34 -23
- package/payload/server/{chunk-SOLVVUST.js → chunk-W4EM7RK4.js} +2 -0
- package/payload/server/maxy-edge.js +1 -1
- package/payload/server/server.js +345 -14
- package/payload/platform/plugins/business-assistant/references/quote-engine.md +0 -122
- package/payload/platform/plugins/business-assistant/references/quote-generation.md +0 -94
- package/payload/platform/plugins/business-assistant/references/quoting.md +0 -85
- package/payload/platform/plugins/business-assistant/skills/pricing-method/SKILL.md +0 -78
- package/payload/platform/plugins/business-assistant/skills/pricing-method/references/learning-from-history.md +0 -51
- package/payload/platform/plugins/business-assistant/skills/pricing-method/references/maintenance.md +0 -32
- package/payload/platform/plugins/business-assistant/skills/pricing-method/references/manual-definition.md +0 -42
- package/payload/platform/plugins/business-assistant/skills/pricing-method/references/verification.md +0 -37
package/dist/index.js
CHANGED
|
@@ -2193,6 +2193,22 @@ function buildPlatform() {
|
|
|
2193
2193
|
console.log(` Installing claude-session-manager dependencies (${csmDir})...`);
|
|
2194
2194
|
shellRetry("npm", ["install", "--omit=dev", ...NPM_NET_FLAGS], { cwd: csmDir }, 3, 15);
|
|
2195
2195
|
}
|
|
2196
|
+
// (maxy-code, Task 677 P2) — whatsapp-channel service has its own
|
|
2197
|
+
// package.json declaring @modelcontextprotocol/sdk. It ships dist/ +
|
|
2198
|
+
// package.json (no node_modules, stripped by npm pack like the manager), so
|
|
2199
|
+
// its runtime dep must be installed on the device. The per-sender channel
|
|
2200
|
+
// server (node dist/server.js) is spawned by claude and resolves the SDK
|
|
2201
|
+
// from this node_modules. Wipe + reinstall on upgrade, same as the manager.
|
|
2202
|
+
const wcDir = join(INSTALL_DIR, "platform", "services", "whatsapp-channel");
|
|
2203
|
+
if (existsSync(wcDir)) {
|
|
2204
|
+
const wcNodeModules = join(wcDir, "node_modules");
|
|
2205
|
+
if (existsSync(wcNodeModules)) {
|
|
2206
|
+
console.log(" Wiping previous whatsapp-channel/node_modules for a clean reinstall...");
|
|
2207
|
+
rmSync(wcNodeModules, { recursive: true, force: true });
|
|
2208
|
+
}
|
|
2209
|
+
console.log(` Installing whatsapp-channel dependencies (${wcDir})...`);
|
|
2210
|
+
shellRetry("npm", ["install", "--omit=dev", ...NPM_NET_FLAGS], { cwd: wcDir }, 3, 15);
|
|
2211
|
+
}
|
|
2196
2212
|
// Premium-plugin MCP servers (e.g. real-agent/loop) ship dist/ + package.json
|
|
2197
2213
|
// in the payload but no node_modules — npm pack strips them, same reason as
|
|
2198
2214
|
// server/. Discover every <installDir>/premium-plugins/<bundle>/plugins/<plugin>/mcp
|
package/package.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const OPUS_MODEL = "claude-opus-4-
|
|
1
|
+
export declare const OPUS_MODEL = "claude-opus-4-8[1m]";
|
|
2
2
|
export declare const SONNET_MODEL = "claude-sonnet-4-6";
|
|
3
3
|
export declare const HAIKU_MODEL = "claude-haiku-4-5";
|
|
4
4
|
export declare const MODEL_CONTEXT_WINDOW: Record<string, number>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,UAAU,wBAAwB,CAAC;AAChD,eAAO,MAAM,YAAY,sBAAsB,CAAC;AAChD,eAAO,MAAM,WAAW,qBAAqB,CAAC;AAE9C,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIvD,CAAC;AAEF,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD"}
|
|
@@ -5,11 +5,14 @@
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.MODEL_CONTEXT_WINDOW = exports.HAIKU_MODEL = exports.SONNET_MODEL = exports.OPUS_MODEL = void 0;
|
|
7
7
|
exports.contextWindow = contextWindow;
|
|
8
|
-
|
|
8
|
+
// Opus defaults to the 1M-context variant ([1m] is Claude Code's
|
|
9
|
+
// context-extension suffix, valid in settings.json "model" and agent
|
|
10
|
+
// frontmatter); Sonnet/Haiku stay on the standard 200k window.
|
|
11
|
+
exports.OPUS_MODEL = "claude-opus-4-8[1m]";
|
|
9
12
|
exports.SONNET_MODEL = "claude-sonnet-4-6";
|
|
10
13
|
exports.HAIKU_MODEL = "claude-haiku-4-5";
|
|
11
14
|
exports.MODEL_CONTEXT_WINDOW = {
|
|
12
|
-
[exports.OPUS_MODEL]:
|
|
15
|
+
[exports.OPUS_MODEL]: 1_000_000,
|
|
13
16
|
[exports.SONNET_MODEL]: 200_000,
|
|
14
17
|
[exports.HAIKU_MODEL]: 200_000,
|
|
15
18
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,0DAA0D;AAC1D,iEAAiE;AACjE,6CAA6C;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,0DAA0D;AAC1D,iEAAiE;AACjE,6CAA6C;;;AAgB7C,sCAEC;AAhBD,iEAAiE;AACjE,qEAAqE;AACrE,+DAA+D;AAClD,QAAA,UAAU,GAAG,qBAAqB,CAAC;AACnC,QAAA,YAAY,GAAG,mBAAmB,CAAC;AACnC,QAAA,WAAW,GAAG,kBAAkB,CAAC;AAEjC,QAAA,oBAAoB,GAA2B;IAC1D,CAAC,kBAAU,CAAC,EAAE,SAAS;IACvB,CAAC,oBAAY,CAAC,EAAE,OAAO;IACvB,CAAC,mBAAW,CAAC,EAAE,OAAO;CACvB,CAAC;AAEF,wEAAwE;AACxE,SAAgB,aAAa,CAAC,KAAa;IACzC,OAAO,4BAAoB,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC;AAChD,CAAC"}
|
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
// Templates, docs, and skills reference these values as strings;
|
|
3
3
|
// all TypeScript consumers import from here.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
// Opus defaults to the 1M-context variant ([1m] is Claude Code's
|
|
6
|
+
// context-extension suffix, valid in settings.json "model" and agent
|
|
7
|
+
// frontmatter); Sonnet/Haiku stay on the standard 200k window.
|
|
8
|
+
export const OPUS_MODEL = "claude-opus-4-8[1m]";
|
|
6
9
|
export const SONNET_MODEL = "claude-sonnet-4-6";
|
|
7
10
|
export const HAIKU_MODEL = "claude-haiku-4-5";
|
|
8
11
|
|
|
9
12
|
export const MODEL_CONTEXT_WINDOW: Record<string, number> = {
|
|
10
|
-
[OPUS_MODEL]:
|
|
13
|
+
[OPUS_MODEL]: 1_000_000,
|
|
11
14
|
[SONNET_MODEL]: 200_000,
|
|
12
15
|
[HAIKU_MODEL]: 200_000,
|
|
13
16
|
};
|
|
@@ -1462,6 +1462,19 @@ FOR (wg:WhatsAppGroup) ON (wg.accountId);
|
|
|
1462
1462
|
// :VoiceProfile nodes. The per-label format index lets per-format corpus
|
|
1463
1463
|
// walks and profile reads avoid full-label scans.
|
|
1464
1464
|
|
|
1465
|
+
// Task 676 — :VoiceProfile.scope ∈ {'personal','org'} discriminates the two
|
|
1466
|
+
// profile kinds. Personal: key (accountId, userId, format), scope='personal',
|
|
1467
|
+
// anchored on :AdminUser via HAS_VOICE_PROFILE. Org: key (accountId,
|
|
1468
|
+
// userId='__org__', format), scope='org', anchored on :LocalBusiness. The
|
|
1469
|
+
// reserved sentinel userId '__org__' keeps the (accountId, userId, format)
|
|
1470
|
+
// UNIQUE constraint below valid with NO migration — exactly one org profile
|
|
1471
|
+
// per (account, format). A real :AdminUser must never hold userId='__org__'
|
|
1472
|
+
// (voice-distil-profile surfaces, never swallows, the resulting constraint
|
|
1473
|
+
// error). Corpus nodes carry voiceAuthor (a userId): org walks are
|
|
1474
|
+
// account-wide, personal walks filter n.voiceAuthor = the operator. :VoiceEdit
|
|
1475
|
+
// also carries scope + the profile-key userId so feedback routes to the
|
|
1476
|
+
// matching profile; the real editor is preserved via :AUTHORED.
|
|
1477
|
+
|
|
1465
1478
|
// Task 462 — drop the old (accountId, adminUserId) constraint before
|
|
1466
1479
|
// creating the new (accountId, userId, format) three-key constraint.
|
|
1467
1480
|
// `IF EXISTS` makes the DROP idempotent on fresh installs.
|
|
@@ -133,6 +133,10 @@
|
|
|
133
133
|
"resolved": "plugins/whatsapp/mcp",
|
|
134
134
|
"link": true
|
|
135
135
|
},
|
|
136
|
+
"node_modules/@maxy/whatsapp-channel": {
|
|
137
|
+
"resolved": "services/whatsapp-channel",
|
|
138
|
+
"link": true
|
|
139
|
+
},
|
|
136
140
|
"node_modules/@maxy/work": {
|
|
137
141
|
"resolved": "plugins/work/mcp",
|
|
138
142
|
"link": true
|
|
@@ -4055,6 +4059,18 @@
|
|
|
4055
4059
|
"typescript": "^5.7.0",
|
|
4056
4060
|
"vitest": "^4.1.2"
|
|
4057
4061
|
}
|
|
4062
|
+
},
|
|
4063
|
+
"services/whatsapp-channel": {
|
|
4064
|
+
"name": "@maxy/whatsapp-channel",
|
|
4065
|
+
"version": "0.1.0",
|
|
4066
|
+
"dependencies": {
|
|
4067
|
+
"@modelcontextprotocol/sdk": "^1.0.0"
|
|
4068
|
+
},
|
|
4069
|
+
"devDependencies": {
|
|
4070
|
+
"@types/node": "^22.0.0",
|
|
4071
|
+
"typescript": "^5.7.0",
|
|
4072
|
+
"vitest": "^4.1.2"
|
|
4073
|
+
}
|
|
4058
4074
|
}
|
|
4059
4075
|
}
|
|
4060
4076
|
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"services/*"
|
|
7
7
|
],
|
|
8
8
|
"scripts": {
|
|
9
|
-
"build": "tsc -p lib/models/tsconfig.json && tsc -p lib/mcp-stderr-tee/tsconfig.json && tsc -p lib/mcp-spawn-tee/tsconfig.json && tsc -p lib/mcp-eager/tsconfig.json && tsc -p lib/account-enumeration/tsconfig.json && tsc -p lib/graph-write/tsconfig.json && tsc -p lib/embed-client/tsconfig.json && tsc -p lib/graph-mcp/tsconfig.json && tsc -p lib/graph-trash/tsconfig.json && tsc -p lib/admin-conversation-purge/tsconfig.json && tsc -p lib/graph-search/tsconfig.json && tsc -p lib/graph-style/tsconfig.json && tsc -p lib/device-url/tsconfig.json && tsc -p lib/brand-templating/tsconfig.json && tsc -p lib/entitlement/tsconfig.json && tsc -p lib/task-secrets/tsconfig.json && tsc -p lib/admins-write/tsconfig.json && tsc -p lib/persistent-components/tsconfig.json && tsc -p lib/require-port-env/tsconfig.json && tsc -p lib/aeo-llms-txt-writer/tsconfig.json && tsc -p lib/obsidian-parser/tsconfig.json && tsc -p services/claude-session-manager/tsconfig.json && NODE_OPTIONS='--max-old-space-size=8192' tsc -b plugins/*/mcp/tsconfig.json",
|
|
9
|
+
"build": "tsc -p lib/models/tsconfig.json && tsc -p lib/mcp-stderr-tee/tsconfig.json && tsc -p lib/mcp-spawn-tee/tsconfig.json && tsc -p lib/mcp-eager/tsconfig.json && tsc -p lib/account-enumeration/tsconfig.json && tsc -p lib/graph-write/tsconfig.json && tsc -p lib/embed-client/tsconfig.json && tsc -p lib/graph-mcp/tsconfig.json && tsc -p lib/graph-trash/tsconfig.json && tsc -p lib/admin-conversation-purge/tsconfig.json && tsc -p lib/graph-search/tsconfig.json && tsc -p lib/graph-style/tsconfig.json && tsc -p lib/device-url/tsconfig.json && tsc -p lib/brand-templating/tsconfig.json && tsc -p lib/entitlement/tsconfig.json && tsc -p lib/task-secrets/tsconfig.json && tsc -p lib/admins-write/tsconfig.json && tsc -p lib/persistent-components/tsconfig.json && tsc -p lib/require-port-env/tsconfig.json && tsc -p lib/aeo-llms-txt-writer/tsconfig.json && tsc -p lib/obsidian-parser/tsconfig.json && tsc -p services/claude-session-manager/tsconfig.json && tsc -p services/whatsapp-channel/tsconfig.json && NODE_OPTIONS='--max-old-space-size=8192' tsc -b plugins/*/mcp/tsconfig.json",
|
|
10
10
|
"build:lib": "tsc -p lib/models/tsconfig.json && tsc -p lib/mcp-stderr-tee/tsconfig.json && tsc -p lib/mcp-spawn-tee/tsconfig.json && tsc -p lib/mcp-eager/tsconfig.json && tsc -p lib/account-enumeration/tsconfig.json && tsc -p lib/graph-write/tsconfig.json && tsc -p lib/embed-client/tsconfig.json && tsc -p lib/graph-mcp/tsconfig.json && tsc -p lib/graph-trash/tsconfig.json && tsc -p lib/admin-conversation-purge/tsconfig.json && tsc -p lib/graph-search/tsconfig.json && tsc -p lib/graph-style/tsconfig.json && tsc -p lib/device-url/tsconfig.json && tsc -p lib/brand-templating/tsconfig.json && tsc -p lib/entitlement/tsconfig.json && tsc -p lib/task-secrets/tsconfig.json && tsc -p lib/admins-write/tsconfig.json && tsc -p lib/persistent-components/tsconfig.json && tsc -p lib/require-port-env/tsconfig.json && tsc -p lib/aeo-llms-txt-writer/tsconfig.json && tsc -p lib/obsidian-parser/tsconfig.json",
|
|
11
11
|
"gen:canonical-tools": "node scripts/generate-canonical-tool-names.mjs",
|
|
12
12
|
"build:memory": "tsc -p plugins/memory/mcp/tsconfig.json",
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
"build:stubs": "tsc -p plugins/scheduling/mcp/tsconfig.json",
|
|
22
22
|
"build:replicate": "tsc -p plugins/replicate/mcp/tsconfig.json",
|
|
23
23
|
"build:graph-viewer": "tsc -p plugins/graph-viewer/mcp/tsconfig.json",
|
|
24
|
-
"build:claude-session-manager": "tsc -p services/claude-session-manager/tsconfig.json"
|
|
24
|
+
"build:claude-session-manager": "tsc -p services/claude-session-manager/tsconfig.json",
|
|
25
|
+
"build:whatsapp-channel": "tsc -p services/whatsapp-channel/tsconfig.json"
|
|
25
26
|
}
|
|
26
27
|
}
|
|
@@ -24,24 +24,24 @@ function seedSkill(plugin, skill, body) {
|
|
|
24
24
|
const fm = (name, description) => `---\nname: ${name}\ndescription: ${description}\n---\n\n# ${name}\n`;
|
|
25
25
|
describe("searchSkills", () => {
|
|
26
26
|
it("description-only match returns the owning plugin + canonical slug path top-ranked", () => {
|
|
27
|
-
seedSkill("
|
|
27
|
+
seedSkill("quotation", "quotation", fm("quotation", "Use when an operator's own way of pricing jobs needs to become something the assistant can apply — set up my pricing, learn how I quote, re-learning their method from past quotes."));
|
|
28
28
|
seedSkill("admin", "qr-code", fm("qr-code", "Generate QR codes. Trigger phrases: create a QR, make a QR code."));
|
|
29
29
|
seedSkill("admin", "datetime", fm("datetime", "Timezone queries and relative-date arithmetic."));
|
|
30
30
|
const hits = searchSkills(root, "pricing algorithm");
|
|
31
31
|
expect(hits.length).toBeGreaterThan(0);
|
|
32
|
-
expect(hits[0].pluginName).toBe("
|
|
33
|
-
expect(hits[0].skillName).toBe("
|
|
34
|
-
expect(hits[0].file).toBe("skills/
|
|
32
|
+
expect(hits[0].pluginName).toBe("quotation");
|
|
33
|
+
expect(hits[0].skillName).toBe("quotation");
|
|
34
|
+
expect(hits[0].file).toBe("skills/quotation/SKILL.md");
|
|
35
35
|
});
|
|
36
36
|
it("a common trigger word does not let a noise skill outrank the distinctive match", () => {
|
|
37
37
|
// "create" is a noise term (appears in many descriptions); "quote" is
|
|
38
|
-
// distinctive.
|
|
39
|
-
seedSkill("
|
|
38
|
+
// distinctive. quotation must still win for "create a quote".
|
|
39
|
+
seedSkill("quotation", "quotation", fm("quotation", "Onboarding a new business's pricing, re-learning their method from past quotes, checking the method reproduces past quotes."));
|
|
40
40
|
seedSkill("admin", "qr-code", fm("qr-code", "Create a QR code. Trigger: create a QR, create a code."));
|
|
41
41
|
seedSkill("admin", "publish-site", fm("publish-site", "Create and publish a static site online."));
|
|
42
42
|
seedSkill("admin", "deck-pages", fm("deck-pages", "Create a slide deck of pages."));
|
|
43
43
|
const hits = searchSkills(root, "create a quote");
|
|
44
|
-
expect(hits[0].skillName).toBe("
|
|
44
|
+
expect(hits[0].skillName).toBe("quotation");
|
|
45
45
|
});
|
|
46
46
|
it("no-match query returns an empty array, not an error", () => {
|
|
47
47
|
seedSkill("admin", "qr-code", fm("qr-code", "Generate QR codes."));
|
|
@@ -85,8 +85,8 @@ describe("searchSkills", () => {
|
|
|
85
85
|
});
|
|
86
86
|
describe("parseSkillFrontmatter", () => {
|
|
87
87
|
it("reads a single-line description", () => {
|
|
88
|
-
const r = parseSkillFrontmatter("---\nname:
|
|
89
|
-
expect(r.name).toBe("
|
|
88
|
+
const r = parseSkillFrontmatter("---\nname: quotation\ndescription: Set up my pricing and learn how I quote.\n---\n\n# x\n");
|
|
89
|
+
expect(r.name).toBe("quotation");
|
|
90
90
|
expect(r.description).toContain("learn how I quote");
|
|
91
91
|
});
|
|
92
92
|
it("folds a block-scalar description into one line", () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-search.test.js","sourceRoot":"","sources":["../../src/__tests__/skill-search.test.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,EAAE;AACF,6EAA6E;AAC7E,4EAA4E;AAC5E,6EAA6E;AAC7E,8EAA8E;AAC9E,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE7E,IAAI,IAAY,CAAC;AAEjB,UAAU,CAAC,GAAG,EAAE;IACd,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC;AAEH,SAAS,SAAS,CAAC,MAAc,EAAE,KAAa,EAAE,IAAY;IAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC3D,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,EAAE,GAAG,CAAC,IAAY,EAAE,WAAmB,EAAE,EAAE,CAAC,cAAc,IAAI,kBAAkB,WAAW,cAAc,IAAI,IAAI,CAAC;AAExH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,mFAAmF,EAAE,GAAG,EAAE;QAC3F,SAAS,CACP,
|
|
1
|
+
{"version":3,"file":"skill-search.test.js","sourceRoot":"","sources":["../../src/__tests__/skill-search.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: platform-architecture
|
|
3
3
|
description: Use when grounding any documented-surface claim about what Maxy ships — plugins, skills, specialists, install/deploy flows, internals. This is the install catalogue, not evidence of what is enabled on the current account. For install state on this account, call `capabilities-here`; for documented surface, cite the `Source:` URL inline.
|
|
4
|
-
content-hash: sha256:
|
|
4
|
+
content-hash: sha256:0e8368ce205506dec22d5ed93f886c0cfc0f12b5306a6b953b4ddad19e8d3175
|
|
5
5
|
brand: maxy-code
|
|
6
6
|
product-name: Maxy
|
|
7
7
|
---
|
|
@@ -2185,6 +2185,14 @@ Maxy reads the corpus for each format, summarises your style as a YAML card, and
|
|
|
2185
2185
|
|
|
2186
2186
|
The profile re-runs automatically when your corpus grows by ≥20% for any format or every 30 days, whichever comes first.
|
|
2187
2187
|
|
|
2188
|
+
## Your Voice and the House Voice
|
|
2189
|
+
|
|
2190
|
+
There are two kinds of profile. **Your voice** is learned from your own writing — it's what an email drafted under your name should sound like. **The house voice** is learned from everyone's writing on the account as a whole — it's what something that goes out under the business's name should sound like, like a brochure or an investor document.
|
|
2191
|
+
|
|
2192
|
+
Drafting picks the right one for you: emails use your voice; brochures and investor documents use the house voice. If you ask for your own voice but haven't tagged any of your own writing yet, Maxy quietly uses the house voice instead, so drafts still sound right rather than generic.
|
|
2193
|
+
|
|
2194
|
+
When you tag content, it's attributed to you by default. On a shared account with more than one person, you can attribute a piece to whoever actually wrote it, so each person's voice stays their own while the house voice draws on all of it.
|
|
2195
|
+
|
|
2188
2196
|
## Feedback Loop
|
|
2189
2197
|
|
|
2190
2198
|
When you edit an agent draft before sending — shorten a sentence, change a sign-off, swap a phrase — Maxy captures the edit and feeds it into the next distillation. The more you edit, the closer the voice gets.
|
|
@@ -2197,7 +2205,7 @@ Voice mirror is on by default for every drafting skill. To opt out for one, set
|
|
|
2197
2205
|
|
|
2198
2206
|
## What It Won't Do
|
|
2199
2207
|
|
|
2200
|
-
- **Blend
|
|
2208
|
+
- **Blend two named people** — you get a profile per person plus one house voice for the whole account, but not a bespoke "Joel + Neo combined" voice.
|
|
2201
2209
|
- **Copy public figures** — voice mirror only learns from your own writing.
|
|
2202
2210
|
- **Clone audio** — text only, no speech synthesis.
|
|
2203
2211
|
- **Guess** — historical content stays `unknown` until you mark it. Maxy never auto-classifies your writing. (Automatic ingestion applies only to your live PTY sessions where authorship is certain.)
|
|
@@ -2261,7 +2269,7 @@ either is a regression.
|
|
|
2261
2269
|
| `/session-rc-spawn` | POST `{ sessionId?, name? }` (Task 543). Fire-and-forget `claude --remote-control [name] [--session-id <sid>]`. Present `sessionId` resumes; absent starts a fresh session (also used by the sidebar's "New session" button — it no longer opens claude.ai/code directly). Proxies to the manager's `/rc-spawn`, which waits up to **60 s** (Task 648, raised from 12 s) for the spawned PTY to bind and returns `{ spawnedPid, sessionId, bridgeSessionId, slug, outcome, reason }`. The Sidebar navigates the opened tab to `claude.ai/code/session_<id>` on `outcome=bound`; on `timeout` or `spawn-failed` it shows an error modal (reason + sessionId) and **never** opens a bare claude.ai/code tab. The new process registers itself as its own Remote Control entry in claude.ai/code. | `POST /` |
|
|
2262
2270
|
| `/claude-sessions` | **Spawn surface only** (Task 500). `POST /` is the Sidebar new-session-with-prompt path, cookie-auth only (Task 626 removed the recorder loopback caller; LinkedIn ingest moved to `/rc-spawn`). The former UI-facing handlers (SSE row feed, list, resume, stop, rename, archive, delete, `/:id/meta`, `/:id/input`, `/:id/log`) were removed — the maxy dashboard no longer manages or displays sessions. | `POST /` |
|
|
2263
2271
|
|
|
2264
|
-
Task 500 — **admin session management moved entirely to claude's own interfaces** (claude.ai/code, claude desktop). A manager-owned per-account `claude rc --spawn same-dir` daemon registers the device as a Remote Control target there; the composer creates / resumes / stops / renames / archives / deletes sessions, with model + permission-mode applied at inception. The model lever is `account.json.adminModel` → `CLAUDE_CONFIG_DIR/settings.json "model"`, written by the daemon supervisor at boot. The maxy admin UI keeps a single "New session" link (`https://claude.ai/code`, opens in a new tab) and no session list, viewer, controls, or model/mode picker. The daemon supervisor lives at [`platform/services/claude-session-manager/src/rc-daemon.ts`](../../../services/claude-session-manager/src/rc-daemon.ts). The `/session-defaults` route and `SpawnPreference` node were deleted with the picker. `/new-session-failure`, `/new-session-submit`, and `/claude-capabilities` are now orphaned (consumed only by the deleted NewSessionModal) — see [`.tasks/501`](../../../.tasks/) for their removal.
|
|
2272
|
+
Task 500 — **admin session management moved entirely to claude's own interfaces** (claude.ai/code, claude desktop). A manager-owned per-account `claude rc --spawn same-dir` daemon registers the device as a Remote Control target there; the composer creates / resumes / stops / renames / archives / deletes sessions, with model + permission-mode applied at inception. The model lever is `account.json.adminModel` → `CLAUDE_CONFIG_DIR/settings.json "model"`, written by the daemon supervisor at boot; the reasoning-effort lever is `account.json.effort` → `settings.json "effortLevel"` (accepted values `low|medium|high|xhigh`; any other value, e.g. legacy `"auto"`, leaves the key unset so claude's own default governs), written by the same read-merge-write at boot. The maxy admin UI keeps a single "New session" link (`https://claude.ai/code`, opens in a new tab) and no session list, viewer, controls, or model/mode picker. The daemon supervisor lives at [`platform/services/claude-session-manager/src/rc-daemon.ts`](../../../services/claude-session-manager/src/rc-daemon.ts). The `/session-defaults` route and `SpawnPreference` node were deleted with the picker. `/new-session-failure`, `/new-session-submit`, and `/claude-capabilities` are now orphaned (consumed only by the deleted NewSessionModal) — see [`.tasks/501`](../../../.tasks/) for their removal.
|
|
2265
2273
|
|
|
2266
2274
|
**Row title resolution.** Both the sidebar (`/sidebar-sessions`) and the manager's own row payload resolve a row's title in the same order: operator rename → Claude Code `ai-title` → first non-CLI user message → 8-char sessionId prefix. The operator-rename tier is the on-disk `<accountDir>/session-titles.json` (the manager's `UserTitleStore`), keyed by the CC sessionId — the sidebar reads that same file, so a write to the store lights up both surfaces with one write.
|
|
2267
2275
|
|
|
@@ -81,7 +81,7 @@ Present as a `select` field within the agent configuration `form` during creatio
|
|
|
81
81
|
|-------|-----|------------|------|
|
|
82
82
|
| Haiku | `claude-haiku-4-5` | Fast, cost-effective. FAQ, routing, high-volume. | Low |
|
|
83
83
|
| Sonnet | `claude-sonnet-4-6` | Balanced. Nuanced conversation, qualification, support. | Standard |
|
|
84
|
-
| Opus | `claude-opus-4-
|
|
84
|
+
| Opus | `claude-opus-4-8[1m]` | Maximum intelligence. Complex sales, consultative selling. | Premium |
|
|
85
85
|
|
|
86
86
|
## SOUL.md Scope Enforcement
|
|
87
87
|
|
|
@@ -160,7 +160,7 @@ After creation, no template metadata persists in the agent's files. The resultin
|
|
|
160
160
|
- `model` (`select`): label "Model", options with descriptions:
|
|
161
161
|
- `claude-haiku-4-5` — "Haiku — Fast, cost-effective. FAQ, routing, high-volume."
|
|
162
162
|
- `claude-sonnet-4-6` — "Sonnet — Balanced. Nuanced conversation, qualification, support."
|
|
163
|
-
- `claude-opus-4-
|
|
163
|
+
- `claude-opus-4-8[1m]` — "Opus — Maximum intelligence. Complex sales, consultative selling."
|
|
164
164
|
- `showAgentName` (`select`): label "Chat header title", options: `false` — "Business name (default)", `true` — "Agent display name", `"none"` — "None (logo only)"
|
|
165
165
|
The `model` field should have a `defaultValue` of `"claude-haiku-4-5"`.
|
|
166
166
|
Wait for the user's response before proceeding.
|
|
@@ -6,7 +6,7 @@ metadata: {"platform":{"always":true,"embed":["admin"],"pluginKey":"business-ass
|
|
|
6
6
|
|
|
7
7
|
# Business Assistant
|
|
8
8
|
|
|
9
|
-
You are a business assistant for a small business. You handle their customer communications, scheduling,
|
|
9
|
+
You are a business assistant for a small business. You handle their customer communications, scheduling, invoicing, and admin — so they can focus on the work.
|
|
10
10
|
|
|
11
11
|
## Core Principle: Memory First
|
|
12
12
|
|
|
@@ -54,10 +54,6 @@ Load the relevant reference when the task requires it:
|
|
|
54
54
|
|
|
55
55
|
- **Triage & escalation** → `references/escalation.md` — urgency classification (RED/AMBER/GREEN), customer handoff protocol, voice IVR handling
|
|
56
56
|
- **Scheduling & briefings** → `references/scheduling.md` — booking protocol, geographic clustering, travel time estimation, morning briefings, holiday mode, GPS integration
|
|
57
|
-
- **Quotes (lightweight)** → `references/quoting.md` — photo-to-quote, formatting, follow-up timings
|
|
58
|
-
- **Pricing method** → invoke the `pricing-method` skill (via the Skill tool) to build, edit, re-learn, or verify an operator's own pricing method — the items, quantity rules, pricing rules, and roll-up the quote flow consumes
|
|
59
|
-
- **Priced quote compute** → `references/quote-engine.md` — generate & run the owner's bespoke pricing engine (measured/counted work → priced result), domain-agnostic compute contract
|
|
60
|
-
- **Quote generation (engine-driven outputs)** → `references/quote-generation.md` — the output contract for a priced job: internal margin-bearing view + client breakdown + client quote, each reconciling to one engine total and rendered to PDF
|
|
61
57
|
- **Invoices & payment** → `references/invoicing.md` — HTML invoice creation, PDF generation via `browser-navigate` + `browser-pdf-save`, sending, payment chase protocol
|
|
62
58
|
- **Customer records** → `references/crm.md` — contact record management, `contact_lookup`/`contact_update` usage, pipeline tracking, when to create/update records
|
|
63
59
|
- **Document filing** → `references/document-management.md` — dual-scope filing system, naming conventions, folder structure for customer-facing vs internal documents
|
|
@@ -49,7 +49,7 @@ either is a regression.
|
|
|
49
49
|
| `/session-rc-spawn` | POST `{ sessionId?, name? }` (Task 543). Fire-and-forget `claude --remote-control [name] [--session-id <sid>]`. Present `sessionId` resumes; absent starts a fresh session (also used by the sidebar's "New session" button — it no longer opens claude.ai/code directly). Proxies to the manager's `/rc-spawn`, which waits up to **60 s** (Task 648, raised from 12 s) for the spawned PTY to bind and returns `{ spawnedPid, sessionId, bridgeSessionId, slug, outcome, reason }`. The Sidebar navigates the opened tab to `claude.ai/code/session_<id>` on `outcome=bound`; on `timeout` or `spawn-failed` it shows an error modal (reason + sessionId) and **never** opens a bare claude.ai/code tab. The new process registers itself as its own Remote Control entry in claude.ai/code. | `POST /` |
|
|
50
50
|
| `/claude-sessions` | **Spawn surface only** (Task 500). `POST /` is the Sidebar new-session-with-prompt path, cookie-auth only (Task 626 removed the recorder loopback caller; LinkedIn ingest moved to `/rc-spawn`). The former UI-facing handlers (SSE row feed, list, resume, stop, rename, archive, delete, `/:id/meta`, `/:id/input`, `/:id/log`) were removed — the maxy dashboard no longer manages or displays sessions. | `POST /` |
|
|
51
51
|
|
|
52
|
-
Task 500 — **admin session management moved entirely to claude's own interfaces** (claude.ai/code, claude desktop). A manager-owned per-account `claude rc --spawn same-dir` daemon registers the device as a Remote Control target there; the composer creates / resumes / stops / renames / archives / deletes sessions, with model + permission-mode applied at inception. The model lever is `account.json.adminModel` → `CLAUDE_CONFIG_DIR/settings.json "model"`, written by the daemon supervisor at boot. The maxy admin UI keeps a single "New session" link (`https://claude.ai/code`, opens in a new tab) and no session list, viewer, controls, or model/mode picker. The daemon supervisor lives at [`platform/services/claude-session-manager/src/rc-daemon.ts`](../../../services/claude-session-manager/src/rc-daemon.ts). The `/session-defaults` route and `SpawnPreference` node were deleted with the picker. `/new-session-failure`, `/new-session-submit`, and `/claude-capabilities` are now orphaned (consumed only by the deleted NewSessionModal) — see [`.tasks/501`](../../../.tasks/) for their removal.
|
|
52
|
+
Task 500 — **admin session management moved entirely to claude's own interfaces** (claude.ai/code, claude desktop). A manager-owned per-account `claude rc --spawn same-dir` daemon registers the device as a Remote Control target there; the composer creates / resumes / stops / renames / archives / deletes sessions, with model + permission-mode applied at inception. The model lever is `account.json.adminModel` → `CLAUDE_CONFIG_DIR/settings.json "model"`, written by the daemon supervisor at boot; the reasoning-effort lever is `account.json.effort` → `settings.json "effortLevel"` (accepted values `low|medium|high|xhigh`; any other value, e.g. legacy `"auto"`, leaves the key unset so claude's own default governs), written by the same read-merge-write at boot. The maxy admin UI keeps a single "New session" link (`https://claude.ai/code`, opens in a new tab) and no session list, viewer, controls, or model/mode picker. The daemon supervisor lives at [`platform/services/claude-session-manager/src/rc-daemon.ts`](../../../services/claude-session-manager/src/rc-daemon.ts). The `/session-defaults` route and `SpawnPreference` node were deleted with the picker. `/new-session-failure`, `/new-session-submit`, and `/claude-capabilities` are now orphaned (consumed only by the deleted NewSessionModal) — see [`.tasks/501`](../../../.tasks/) for their removal.
|
|
53
53
|
|
|
54
54
|
**Row title resolution.** Both the sidebar (`/sidebar-sessions`) and the manager's own row payload resolve a row's title in the same order: operator rename → Claude Code `ai-title` → first non-CLI user message → 8-char sessionId prefix. The operator-rename tier is the on-disk `<accountDir>/session-titles.json` (the manager's `UserTitleStore`), keyed by the CC sessionId — the sidebar reads that same file, so a write to the store lights up both surfaces with one write.
|
|
55
55
|
|
|
@@ -42,6 +42,14 @@ Once you have corpus entries tagged (or after automatic PTY ingestion fills the
|
|
|
42
42
|
|
|
43
43
|
The profile re-runs automatically when your corpus grows by ≥20% for any format or every 30 days, whichever comes first.
|
|
44
44
|
|
|
45
|
+
## Your Voice and the House Voice
|
|
46
|
+
|
|
47
|
+
There are two kinds of profile. **Your voice** is learned from your own writing — it's what an email drafted under your name should sound like. **The house voice** is learned from everyone's writing on the account as a whole — it's what something that goes out under the business's name should sound like, like a brochure or an investor document.
|
|
48
|
+
|
|
49
|
+
Drafting picks the right one for you: emails use your voice; brochures and investor documents use the house voice. If you ask for your own voice but haven't tagged any of your own writing yet, {{productName}} quietly uses the house voice instead, so drafts still sound right rather than generic.
|
|
50
|
+
|
|
51
|
+
When you tag content, it's attributed to you by default. On a shared account with more than one person, you can attribute a piece to whoever actually wrote it, so each person's voice stays their own while the house voice draws on all of it.
|
|
52
|
+
|
|
45
53
|
## Feedback Loop
|
|
46
54
|
|
|
47
55
|
When you edit an agent draft before sending — shorten a sentence, change a sign-off, swap a phrase — {{productName}} captures the edit and feeds it into the next distillation. The more you edit, the closer the voice gets.
|
|
@@ -54,7 +62,7 @@ Voice mirror is on by default for every drafting skill. To opt out for one, set
|
|
|
54
62
|
|
|
55
63
|
## What It Won't Do
|
|
56
64
|
|
|
57
|
-
- **Blend
|
|
65
|
+
- **Blend two named people** — you get a profile per person plus one house voice for the whole account, but not a bespoke "Joel + Neo combined" voice.
|
|
58
66
|
- **Copy public figures** — voice mirror only learns from your own writing.
|
|
59
67
|
- **Clone audio** — text only, no speech synthesis.
|
|
60
68
|
- **Guess** — historical content stays `unknown` until you mark it. {{productName}} never auto-classifies your writing. (Automatic ingestion applies only to your live PTY sessions where authorship is certain.)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAS3B,OAAO,EAeL,KAAK,SAAS,EAEf,MAAM,kBAAkB,CAAA;AAkBzB,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,iBAAiB,CAAA;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAgF9E,eAAO,MAAM,kBAAkB,QAA2B,CAAA;AAS1D,eAAO,MAAM,4BAA4B,QAAS,CAAA;AAIlD,MAAM,WAAW,QAAS,SAAQ,IAAI,CAAC,SAAS,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC7E;;qEAEiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,SAAS,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,WAAW,CAAA;IAC/B,eAAe,EAAE,aAAa,CAAA;IAC9B;kFAC8E;IAC9E,cAAc,EAAE,cAAc,CAAA;IAC9B;;gFAE4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AA+MD;;;kEAGkE;AAClE,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG;IAC3B,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACpD;;;+CAG2C;IAC3C,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAChD,CAAA;AAmBD,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAiqDpD"}
|
|
@@ -21,7 +21,9 @@
|
|
|
21
21
|
// manager does not know.
|
|
22
22
|
import { Hono } from 'hono';
|
|
23
23
|
import { stream } from 'hono/streaming';
|
|
24
|
-
import { existsSync, statSync, createReadStream, watchFile, unwatchFile, rmSync, mkdirSync, renameSync, readFileSync } from 'node:fs';
|
|
24
|
+
import { existsSync, statSync, createReadStream, watchFile, unwatchFile, rmSync, mkdirSync, renameSync, readFileSync, writeFileSync } from 'node:fs';
|
|
25
|
+
import { tmpdir } from 'node:os';
|
|
26
|
+
import { buildWaChannelMcpServers, waChannelDevChannelsArgv } from './wa-channel-mcp.js';
|
|
25
27
|
import { randomUUID } from 'node:crypto';
|
|
26
28
|
import { execFileSync } from 'node:child_process';
|
|
27
29
|
import { buildRcChildEnv } from './rc-daemon.js';
|
|
@@ -1554,6 +1556,16 @@ export function buildHttpApp(deps) {
|
|
|
1554
1556
|
// so the JSONL watcher has a path to follow.
|
|
1555
1557
|
const initialMessage = typeof body.initialMessage === 'string' && body.initialMessage.length > 0 ? body.initialMessage : null;
|
|
1556
1558
|
const closeAfterTurn = body.closeAfterTurn === true && sessionId !== null;
|
|
1559
|
+
// Task 677 P2 — optional WhatsApp native-channel attach (admin path). All
|
|
1560
|
+
// three fields must be present strings or the attach is skipped.
|
|
1561
|
+
const waChannelRaw = body.waChannel;
|
|
1562
|
+
const waChannel = waChannelRaw !== null &&
|
|
1563
|
+
typeof waChannelRaw === 'object' &&
|
|
1564
|
+
typeof waChannelRaw.senderId === 'string' &&
|
|
1565
|
+
typeof waChannelRaw.gatewayUrl === 'string' &&
|
|
1566
|
+
typeof waChannelRaw.serverPath === 'string'
|
|
1567
|
+
? waChannelRaw
|
|
1568
|
+
: undefined;
|
|
1557
1569
|
if (sessionId !== null && !UUID_PATTERN.test(sessionId)) {
|
|
1558
1570
|
timed(deps.logger, 'POST', '/rc-spawn', 400, Date.now() - start);
|
|
1559
1571
|
return c.json({ error: 'sessionId must be a v4 UUID' }, 400);
|
|
@@ -1577,6 +1589,29 @@ export function buildHttpApp(deps) {
|
|
|
1577
1589
|
// to. Per Task 574 doctrine the waiver is per-spawn (never written into
|
|
1578
1590
|
// settings.json / .claude.json, which would permanently waive it).
|
|
1579
1591
|
argv.push('--settings', JSON.stringify({ skipDangerousModePermissionPrompt: true, skipAutoPermissionPrompt: true }));
|
|
1592
|
+
// Task 677 P2 — admin WhatsApp native channel. When the caller supplies
|
|
1593
|
+
// waChannel, register the per-sender channel server in its own --mcp-config
|
|
1594
|
+
// (additive; rc-spawn carries no --strict-mcp-config) and activate it as a
|
|
1595
|
+
// development channel. Inbound WhatsApp then arrives as a `<channel
|
|
1596
|
+
// source="whatsapp">` event and the agent replies via the channel `reply`
|
|
1597
|
+
// tool — no keystroke injection. Pushed before the trailing positional.
|
|
1598
|
+
if (waChannel && sessionId) {
|
|
1599
|
+
const waServers = buildWaChannelMcpServers({
|
|
1600
|
+
sessionId,
|
|
1601
|
+
senderId: waChannel.senderId,
|
|
1602
|
+
gatewayUrl: waChannel.gatewayUrl,
|
|
1603
|
+
serverPath: waChannel.serverPath,
|
|
1604
|
+
});
|
|
1605
|
+
const waPath = join(tmpdir(), `maxy-wa-channel-${sessionId.replace(/[^A-Za-z0-9_-]/g, '_')}.json`);
|
|
1606
|
+
try {
|
|
1607
|
+
writeFileSync(waPath, JSON.stringify({ mcpServers: waServers }, null, 2), 'utf8');
|
|
1608
|
+
argv.push('--mcp-config', waPath, ...waChannelDevChannelsArgv());
|
|
1609
|
+
deps.logger(`[rc-spawn] op=wa-channel senderId=${waChannel.senderId} gateway=${waChannel.gatewayUrl} path=${waPath}`);
|
|
1610
|
+
}
|
|
1611
|
+
catch (err) {
|
|
1612
|
+
deps.logger(`[rc-spawn] op=wa-channel-write-failed err=${JSON.stringify(err instanceof Error ? err.message : String(err))}`);
|
|
1613
|
+
}
|
|
1614
|
+
}
|
|
1580
1615
|
// Task 626 — the initial message is the trailing positional, processed as
|
|
1581
1616
|
// the session's first user turn at PTY startup. One-shot jobs omit `name`
|
|
1582
1617
|
// so the prompt is the sole positional.
|