@rubytech/create-maxy-code 0.1.24 → 0.1.26
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 +63 -16
- package/package.json +1 -1
- package/payload/platform/plugins/admin/PLUGIN.md +46 -23
- package/payload/platform/plugins/admin/skills/onboarding/SKILL.md +111 -126
- package/payload/platform/plugins/cloudflare/references/dashboard-guide.md +37 -0
- package/payload/platform/plugins/cloudflare/references/manual-setup.md +81 -1
- package/payload/platform/plugins/cloudflare/scripts/__tests__/tunnel-ingress.test.ts +241 -0
- package/payload/platform/plugins/cloudflare/scripts/setup-tunnel.sh +267 -28
- package/payload/platform/plugins/cloudflare/scripts/tunnel-ingress.ts +291 -0
- package/payload/platform/plugins/cloudflare/skills/setup-tunnel/SKILL.md +42 -0
- package/payload/platform/plugins/contacts/PLUGIN.md +18 -9
- package/payload/platform/plugins/docs/references/platform.md +2 -0
- package/payload/platform/plugins/docs/references/troubleshooting.md +12 -0
- package/payload/platform/plugins/email/PLUGIN.md +18 -9
- package/payload/platform/plugins/email/mcp/dist/lib/claude-bridge.d.ts +17 -0
- package/payload/platform/plugins/email/mcp/dist/lib/claude-bridge.d.ts.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/lib/claude-bridge.js +185 -0
- package/payload/platform/plugins/email/mcp/dist/lib/claude-bridge.js.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/scripts/email-auto-respond.js +34 -111
- package/payload/platform/plugins/email/mcp/dist/scripts/email-auto-respond.js.map +1 -1
- package/payload/platform/plugins/memory/PLUGIN.md +58 -29
- package/payload/platform/plugins/memory/mcp/dist/tools/profile-read.d.ts +3 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/profile-read.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/profile-read.js +105 -4
- package/payload/platform/plugins/memory/mcp/dist/tools/profile-read.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.d.ts.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.js +16 -3
- package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.js.map +1 -1
- package/payload/platform/plugins/outlook/PLUGIN.md +14 -7
- package/payload/platform/plugins/replicate/PLUGIN.md +6 -3
- package/payload/platform/plugins/scheduling/PLUGIN.md +16 -8
- package/payload/platform/plugins/tasks/PLUGIN.md +28 -14
- package/payload/platform/plugins/telegram/PLUGIN.md +6 -3
- package/payload/platform/plugins/waitlist/PLUGIN.md +12 -6
- package/payload/platform/plugins/whatsapp/PLUGIN.md +25 -13
- package/payload/platform/plugins/workflows/PLUGIN.md +16 -8
- package/payload/platform/scripts/conversation-id-allowlist.txt +0 -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 +14 -2
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/index.js +27 -0
- package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +22 -0
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +32 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/tool-surface.d.ts +25 -0
- package/payload/platform/services/claude-session-manager/dist/tool-surface.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/tool-surface.js +149 -0
- package/payload/platform/services/claude-session-manager/dist/tool-surface.js.map +1 -0
- package/payload/premium-plugins/real-agency/plugins/estate-business/PLUGIN.md +15 -0
- package/payload/premium-plugins/real-agency/plugins/estate-sales/PLUGIN.md +5 -0
- package/payload/premium-plugins/real-agency/plugins/leads/PLUGIN.md +16 -0
- package/payload/premium-plugins/real-agency/plugins/listings/PLUGIN.md +39 -0
- package/payload/premium-plugins/real-agency/plugins/loop/PLUGIN.md +15 -0
- package/payload/server/{chunk-2ZNKHCQB.js → chunk-2MRZBQMH.js} +1 -1
- package/payload/server/{chunk-GPUCA2RQ.js → chunk-NL7QLVAD.js} +0 -192
- package/payload/server/{chunk-IDKWGLM5.js → chunk-YPZFYTYP.js} +1 -247
- package/payload/server/{cloudflare-task-tracker-LYI5BTYI.js → cloudflare-task-tracker-QVOGHKWV.js} +2 -2
- package/payload/server/maxy-edge.js +2 -2
- package/payload/server/package.json +0 -2
- package/payload/server/public/assets/{Checkbox-D1OQD43b.js → Checkbox-YIF0payo.js} +1 -1
- package/payload/server/public/assets/{admin-czNBxWor.js → admin-DW8IJcLc.js} +1 -1
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-BcwgT80u.js → architectureDiagram-Q4EWVU46-Bz8mlxZZ.js} +1 -1
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-BMSyZUQA.js → blockDiagram-DXYQGD6D-DwV8Z8-i.js} +1 -1
- package/payload/server/public/assets/{brand-2cku8WFs.css → brand-DqiRNMlu.css} +1 -1
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY-DPRGY1jJ.js → c4Diagram-AHTNJAMY-DiUTejMp.js} +1 -1
- package/payload/server/public/assets/channel-PtVtoBEL.js +1 -0
- package/payload/server/public/assets/{chunk-336JU56O-B7oQ3g1c.js → chunk-336JU56O-4mHZpBXe.js} +2 -2
- package/payload/server/public/assets/{chunk-426QAEUC-C1P0yFXw.js → chunk-426QAEUC-Cbv0vrN9.js} +1 -1
- package/payload/server/public/assets/{chunk-4TB4RGXK-LI7kOJd0.js → chunk-4TB4RGXK-BvLhId_2.js} +1 -1
- package/payload/server/public/assets/{chunk-5FUZZQ4R-CXQRGTQE.js → chunk-5FUZZQ4R-bBafOTkw.js} +1 -1
- package/payload/server/public/assets/{chunk-5PVQY5BW-NSyzpXRy.js → chunk-5PVQY5BW-B0NqBKVy.js} +1 -1
- package/payload/server/public/assets/{chunk-EDXVE4YY-voNwxbDs.js → chunk-EDXVE4YY-CFd4SqI6.js} +1 -1
- package/payload/server/public/assets/{chunk-ENJZ2VHE-CMEMPzYY.js → chunk-ENJZ2VHE-ajf2sb6c.js} +1 -1
- package/payload/server/public/assets/{chunk-ICPOFSXX-hEbwu-pe.js → chunk-ICPOFSXX-pWg6bug7.js} +1 -1
- package/payload/server/public/assets/{chunk-OYMX7WX6-DxskDrLs.js → chunk-OYMX7WX6-OjEd-17c.js} +1 -1
- package/payload/server/public/assets/{chunk-U2HBQHQK-D7TKgUo0.js → chunk-U2HBQHQK-DbEFSPoh.js} +1 -1
- package/payload/server/public/assets/{chunk-X2U36JSP-BvPUQEPm.js → chunk-X2U36JSP-COdNwrBb.js} +1 -1
- package/payload/server/public/assets/{chunk-YZCP3GAM-BY-RWQUW.js → chunk-YZCP3GAM-CHMWuY9B.js} +1 -1
- package/payload/server/public/assets/{chunk-ZZ45TVLE-DZvOYDY6.js → chunk-ZZ45TVLE-B-uDLQOB.js} +1 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-RVH_SEhY.js +1 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-Cm3rAb93.js +1 -0
- package/payload/server/public/assets/clone-BjY0Wzht.js +1 -0
- package/payload/server/public/assets/{dagre-KV5264BT-Cnj0mUZl.js → dagre-KV5264BT-CMEzmhIL.js} +1 -1
- package/payload/server/public/assets/{dagre-Bt-fpckL.js → dagre-bhIG_KnW.js} +1 -1
- package/payload/server/public/assets/data-K_kS__sL.js +1 -0
- package/payload/server/public/assets/{device-url-actions-Bjz3Xzbm.js → device-url-actions-AcOyLSeF.js} +1 -1
- package/payload/server/public/assets/{diagram-5BDNPKRD-DjLzvOlx.js → diagram-5BDNPKRD-6RIoQhIL.js} +1 -1
- package/payload/server/public/assets/{diagram-G4DWMVQ6-DTfuRd-T.js → diagram-G4DWMVQ6-BSp36TVv.js} +1 -1
- package/payload/server/public/assets/{diagram-MMDJMWI5-BaL2mCnx.js → diagram-MMDJMWI5-D54fo52D.js} +1 -1
- package/payload/server/public/assets/{diagram-TYMM5635-C5InWY5R.js → diagram-TYMM5635-CWL8z-Pq.js} +1 -1
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-DO7BXTpn.js → erDiagram-SMLLAGMA-AnnHBo3z.js} +1 -1
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-DDdAKfLf.js → flowDiagram-DWJPFMVM-laWmBl5o.js} +1 -1
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-arJD8Utm.js → ganttDiagram-T4ZO3ILL-B94ko8ie.js} +1 -1
- package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-C55GH-OS.js → gitGraphDiagram-UUTBAWPF-DxzL1fxZ.js} +1 -1
- package/payload/server/public/assets/graph-DeEigyO_.js +1 -0
- package/payload/server/public/assets/graph-labels-C7I5QvNv.js +1 -0
- package/payload/server/public/assets/{graphlib-DL9PM7Ex.js → graphlib-CY-zIElM.js} +1 -1
- package/payload/server/public/assets/{infoDiagram-42DDH7IO-BMSGqUbG.js → infoDiagram-42DDH7IO-BMTajIIr.js} +1 -1
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-Dw6BZ6BG.js → ishikawaDiagram-UXIWVN3A-B_QauE5O.js} +1 -1
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-DrywUGXw.js → journeyDiagram-VCZTEJTY-DmlqSIih.js} +1 -1
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY-DuwtVBBc.js → kanban-definition-6JOO6SKY-ZGDQT7xB.js} +1 -1
- package/payload/server/public/assets/{line-JAksyKHj.js → line-D13opgep.js} +1 -1
- package/payload/server/public/assets/{mermaid-parser.core-BMq-ApBW.js → mermaid-parser.core-C650Sual.js} +1 -1
- package/payload/server/public/assets/{mermaid.core-tH4oX0Kh.js → mermaid.core-BqnQoXTp.js} +3 -3
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-D1OiiJga.js → mindmap-definition-QFDTVHPH-BS_8y-tY.js} +1 -1
- package/payload/server/public/assets/{page-BZpoS7iR.js → page-B_rpjIRr.js} +1 -1
- package/payload/server/public/assets/{page-CkvBvezS.js → page-qSH972X0.js} +1 -1
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-Ckwm69PW.js → pieDiagram-DEJITSTG-B5OmNvBO.js} +1 -1
- package/payload/server/public/assets/{public-C-dTMgXu.js → public-DDsYgotk.js} +3 -3
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-COw3yZ1j.js → quadrantDiagram-34T5L4WZ-DTYITdNo.js} +1 -1
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-DqGzM4K-.js → requirementDiagram-MS252O5E-CRZWxH06.js} +1 -1
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-D-l1c_Pl.js → sankeyDiagram-XADWPNL6-DazRENhe.js} +1 -1
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-BeIi0DtJ.js → sequenceDiagram-FGHM5R23-BcHTxmPy.js} +1 -1
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-C-jgegLk.js → stateDiagram-FHFEXIEX-DYU7nbqg.js} +1 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BgljVtlp.js +1 -0
- package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-BGFKkYmi.js → timeline-definition-GMOUNBTQ-BKGmqkST.js} +1 -1
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-5NuIhJLS.js → vennDiagram-DHZGUBPP-BXvLPmX7.js} +1 -1
- package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-Be9ytVut.js → wardleyDiagram-NUSXRM2D-BCclUa3Z.js} +1 -1
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-DCyHg41R.js → xychartDiagram-5P7HB3ND-C-Xp-Eoc.js} +1 -1
- package/payload/server/public/data.html +5 -5
- package/payload/server/public/graph.html +6 -6
- package/payload/server/public/index.html +8 -8
- package/payload/server/public/public.html +5 -5
- package/payload/server/server.js +1024 -2347
- package/payload/platform/scripts/check-sdk-oauth.mjs +0 -185
- package/payload/server/public/assets/channel-fxEghWew.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-BsWzGW0N.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BGVa3h90.js +0 -1
- package/payload/server/public/assets/clone-Khvocke2.js +0 -1
- package/payload/server/public/assets/data-DBd-Buhp.js +0 -1
- package/payload/server/public/assets/graph-DUtVdnZ6.js +0 -1
- package/payload/server/public/assets/graph-labels-Dxfue-fP.js +0 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BaMs8Znv.js +0 -1
- /package/payload/server/public/assets/{brand-CSQuxS9w.js → brand-Bm671owU.js} +0 -0
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { serve } from '@hono/node-server';
|
|
2
2
|
import { spawn as ptySpawn } from 'node-pty';
|
|
3
|
+
import { join } from 'node:path';
|
|
3
4
|
import { loadConfig } from './config.js';
|
|
4
5
|
import { buildHttpApp } from './http-server.js';
|
|
5
6
|
import { SessionStore } from './session-store.js';
|
|
7
|
+
import { loadToolSurface, ToolSurfaceError } from './tool-surface.js';
|
|
6
8
|
const TAG = '[claude-session-manager]';
|
|
7
9
|
const log = (line) => console.log(`${TAG} ${line}`);
|
|
8
10
|
function spawnPtyAdapter(cmd, args, env, cwd) {
|
|
@@ -27,6 +29,30 @@ async function main() {
|
|
|
27
29
|
log(`boot port=${config.port} persistDir=${config.persistDir} spawnCwd=${config.spawnCwd}`);
|
|
28
30
|
log(`host hostname=${config.host.hostname} lanIPv4=${config.host.lanIPv4 ?? 'unresolved'} adminUrl=${config.host.adminUrl} tunnelUrl=${config.host.tunnelUrl ?? 'none'}` +
|
|
29
31
|
(config.host.lanIPv4Diagnostic ? ` diagnostic=${JSON.stringify(config.host.lanIPv4Diagnostic)}` : ''));
|
|
32
|
+
// Task 005 — load the tool surface once at boot. Refuse to start if any
|
|
33
|
+
// PLUGIN.md tool entry lacks a publicAllowlist field (or has a malformed
|
|
34
|
+
// one). The HTTP listener is only bound after this returns successfully,
|
|
35
|
+
// so a malformed manifest never silently produces public spawns.
|
|
36
|
+
const platformRoot = process.env.PLATFORM_ROOT ?? process.env.MAXY_PLATFORM_ROOT;
|
|
37
|
+
if (!platformRoot) {
|
|
38
|
+
log('boot-failed reason=platform-root-missing detail="PLATFORM_ROOT env var not set; cannot locate plugins/"');
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
const pluginsRoot = join(platformRoot, 'plugins');
|
|
42
|
+
let toolSurface;
|
|
43
|
+
try {
|
|
44
|
+
toolSurface = loadToolSurface(pluginsRoot);
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
if (err instanceof ToolSurfaceError) {
|
|
48
|
+
log(`boot-failed reason=${err.reason} tool=${err.detail}`);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
log(`boot-failed reason=tool-surface-load detail=${err instanceof Error ? err.message : String(err)}`);
|
|
52
|
+
}
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
log(`tool-surface admin=${toolSurface.admin.size} public=${toolSurface.public.size}`);
|
|
30
56
|
const app = buildHttpApp({
|
|
31
57
|
store,
|
|
32
58
|
spawnCwd: config.spawnCwd,
|
|
@@ -37,6 +63,7 @@ async function main() {
|
|
|
37
63
|
logger: log,
|
|
38
64
|
spawnPty: (cmd, args, env) => spawnPtyAdapter(cmd, args, env, config.spawnCwd),
|
|
39
65
|
host: config.host,
|
|
66
|
+
toolSurface,
|
|
40
67
|
});
|
|
41
68
|
serve({ fetch: app.fetch, port: config.port, hostname: '127.0.0.1' }, (info) => {
|
|
42
69
|
log(`listening address=127.0.0.1:${info.port}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,KAAK,IAAI,QAAQ,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import type { Logger, PtyHandle, Role, Channel } from './types.js';
|
|
|
2
2
|
import { SessionStore, type StoredSession } from './session-store.js';
|
|
3
3
|
import { type OnboardingPayload } from './system-prompt.js';
|
|
4
4
|
import type { HostResolution } from './config.js';
|
|
5
|
+
import type { ToolSurface } from './tool-surface.js';
|
|
5
6
|
export type SpawnResult = {
|
|
6
7
|
ok: true;
|
|
7
8
|
session: StoredSession;
|
|
@@ -24,6 +25,12 @@ export interface SpawnDeps {
|
|
|
24
25
|
* `lanIPv4` is null. One edit to this block changes the doctrine for
|
|
25
26
|
* every agent in every session. */
|
|
26
27
|
host: HostResolution;
|
|
28
|
+
/** Task 005 — precomputed tool surface for both roles. Loaded once at
|
|
29
|
+
* manager boot from a directory walk of platform/plugins/<name>/PLUGIN.md.
|
|
30
|
+
* The boot path refuses to start if any tool's PLUGIN.md entry lacks a
|
|
31
|
+
* publicAllowlist field, so by the time pty-spawner sees this struct, the
|
|
32
|
+
* per-tool decisions are guaranteed complete. */
|
|
33
|
+
toolSurface: ToolSurface;
|
|
27
34
|
}
|
|
28
35
|
export interface SpawnArgs {
|
|
29
36
|
senderId: string;
|
|
@@ -52,7 +59,22 @@ export interface SpawnArgs {
|
|
|
52
59
|
* source account without persisting the full id. Public/non-admin
|
|
53
60
|
* spawns omit this. */
|
|
54
61
|
accountId?: string;
|
|
62
|
+
/** Task 010 — operator-selected permission mode. When set to anything
|
|
63
|
+
* other than `default`, the manager appends `--permission-mode <mode>`
|
|
64
|
+
* to the spawn argv so the claude CLI starts the session in that mode.
|
|
65
|
+
* `default` (or omitted) leaves argv byte-identical to today. */
|
|
66
|
+
permissionMode?: PermissionMode;
|
|
67
|
+
/** Task 051 — per-session attachment directory for role=public. When set,
|
|
68
|
+
* pty-spawner pre-creates the directory and appends `--add-dir <dir>` plus
|
|
69
|
+
* `--allowed-tools "Read(<dir>/**)"` to argv so claude can read public-chat
|
|
70
|
+
* uploads referenced in the dispatched turn. Ignored for non-public roles.
|
|
71
|
+
* The directory is per-(accountId, senderId) and deterministic; the bridge
|
|
72
|
+
* passes it at session-creation time so it covers every turn in the
|
|
73
|
+
* session, not just the first turn carrying attachments. */
|
|
74
|
+
attachmentDir?: string;
|
|
55
75
|
}
|
|
76
|
+
export type PermissionMode = 'default' | 'acceptEdits' | 'plan' | 'auto';
|
|
77
|
+
export declare const PERMISSION_MODES: readonly PermissionMode[];
|
|
56
78
|
export declare function spawnClaudeSession(deps: SpawnDeps, args: SpawnArgs): Promise<SpawnResult>;
|
|
57
79
|
export interface DeleteDeps {
|
|
58
80
|
store: SessionStore;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pty-spawner.d.ts","sourceRoot":"","sources":["../src/pty-spawner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pty-spawner.d.ts","sourceRoot":"","sources":["../src/pty-spawner.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAElE,OAAO,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAErE,OAAO,EAAoD,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC7G,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpD,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,aAAa,CAAA;CAAE,GACpC;IACE,EAAE,EAAE,KAAK,CAAA;IACT,MAAM,EACF,wBAAwB,GACxB,kBAAkB,GAClB,qBAAqB,GACrB,yBAAyB,CAAA;IAC7B,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAEL,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,KAAK,SAAS,CAAA;IAC5E,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,YAAY,CAAA;IACnB;;;;;uCAKmC;IACnC,IAAI,EAAE,cAAc,CAAA;IACpB;;;;sDAIkD;IAClD,WAAW,EAAE,WAAW,CAAA;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,IAAI,CAAA;IACV,OAAO,EAAE,OAAO,CAAA;IAChB;;gCAE4B;IAC5B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B;;;;8EAI0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB;;;;;iEAK6D;IAC7D,UAAU,CAAC,EAAE,iBAAiB,CAAA;IAC9B;;;;4BAIwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;sEAGkE;IAClE,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B;;;;;;iEAM6D;IAC7D,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,aAAa,GAAG,MAAM,GAAG,MAAM,CAAA;AACxE,eAAO,MAAM,gBAAgB,EAAE,SAAS,cAAc,EAA+C,CAAA;AAErG,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAsH/F;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,YAAY,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAqBzC"}
|
|
@@ -9,9 +9,11 @@
|
|
|
9
9
|
// child is killed (if alive) before the error surfaces to the caller. The
|
|
10
10
|
// `[claude-session-manager] spawn-failed` line names the reason.
|
|
11
11
|
import { randomUUID } from 'node:crypto';
|
|
12
|
+
import { mkdirSync } from 'node:fs';
|
|
12
13
|
import { startUrlCapture } from './url-capture.js';
|
|
13
14
|
import { deriveJsonlPath } from './jsonl-path.js';
|
|
14
15
|
import { composeAppendSystemPrompt, renderOnboardingBlock } from './system-prompt.js';
|
|
16
|
+
export const PERMISSION_MODES = ['default', 'acceptEdits', 'plan', 'auto'];
|
|
15
17
|
export async function spawnClaudeSession(deps, args) {
|
|
16
18
|
const sessionId = randomUUID();
|
|
17
19
|
const startedAt = new Date().toISOString();
|
|
@@ -36,6 +38,35 @@ export async function spawnClaudeSession(deps, args) {
|
|
|
36
38
|
argv.push('--channels', ch);
|
|
37
39
|
}
|
|
38
40
|
}
|
|
41
|
+
// Task 005 — per-role tool-allowlist argv. The set is precomputed at boot
|
|
42
|
+
// and never inferred per call; this loop just renders it. Sorted output
|
|
43
|
+
// gives byte-stable argv for snapshot tests and grep-friendly log lines.
|
|
44
|
+
const allowedSet = args.role === 'public' ? deps.toolSurface.public : deps.toolSurface.admin;
|
|
45
|
+
const allowed = Array.from(allowedSet).sort();
|
|
46
|
+
for (const tool of allowed) {
|
|
47
|
+
argv.push('--allowed-tools', tool);
|
|
48
|
+
}
|
|
49
|
+
// Observability — sample up to 5 excluded tool names so an operator
|
|
50
|
+
// grepping the spawn log can see at a glance what a public role cannot
|
|
51
|
+
// touch. Admin role excludes nothing; the field is still emitted (empty)
|
|
52
|
+
// so the line shape is uniform across roles.
|
|
53
|
+
const excludedSample = args.role === 'public'
|
|
54
|
+
? Array.from(deps.toolSurface.admin).filter((t) => !deps.toolSurface.public.has(t)).sort().slice(0, 5).join(',')
|
|
55
|
+
: '';
|
|
56
|
+
deps.logger(`tool-allowlist role=${args.role} count=${allowed.length} excluded=${excludedSample}`);
|
|
57
|
+
if (args.permissionMode && args.permissionMode !== 'default') {
|
|
58
|
+
argv.push('--permission-mode', args.permissionMode);
|
|
59
|
+
}
|
|
60
|
+
// Task 051 — public-chat attachment passthrough. Pre-create the per-session
|
|
61
|
+
// upload dir (so --add-dir does not fail on a missing path), then grant
|
|
62
|
+
// claude scoped Read access to it. The Read allow-rule mirrors the dir, so
|
|
63
|
+
// a `Read("/etc/passwd")` call from the PTY is refused by claude's
|
|
64
|
+
// permissions layer regardless of any operator instruction in the turn.
|
|
65
|
+
if (args.role === 'public' && args.attachmentDir) {
|
|
66
|
+
mkdirSync(args.attachmentDir, { recursive: true });
|
|
67
|
+
argv.push('--add-dir', args.attachmentDir);
|
|
68
|
+
argv.push('--allowed-tools', `Read(${args.attachmentDir}/**)`);
|
|
69
|
+
}
|
|
39
70
|
let pty;
|
|
40
71
|
try {
|
|
41
72
|
pty = deps.spawnPty(deps.claudeBin, argv, {
|
|
@@ -74,7 +105,7 @@ export async function spawnClaudeSession(deps, args) {
|
|
|
74
105
|
session.exited = true;
|
|
75
106
|
deps.logger(`kill pid=${pty.pid} reason=process-exited exit-code=0`);
|
|
76
107
|
});
|
|
77
|
-
deps.logger(`spawn pid=${pty.pid} sessionUrl=${url} jsonlPath=${jsonlPath ?? 'unknown'} senderId=${args.senderId} role=${args.role} channel=${args.channel} latency-ms=${Date.now() - start}`);
|
|
108
|
+
deps.logger(`spawn pid=${pty.pid} sessionUrl=${url} jsonlPath=${jsonlPath ?? 'unknown'} senderId=${args.senderId} role=${args.role} channel=${args.channel} permissionMode=${args.permissionMode ?? 'default'} latency-ms=${Date.now() - start}`);
|
|
78
109
|
deps.logger(`[pty-spawn] sessionId=${sessionId} appendSystemPromptBytes=${Buffer.byteLength(appendSystemPrompt, 'utf8')} hostname=${deps.host.hostname} lanIPv4=${deps.host.lanIPv4} adminUrl=${deps.host.adminUrl} tunnelUrl=${deps.host.tunnelUrl ?? 'none'}`);
|
|
79
110
|
if (args.onboarding) {
|
|
80
111
|
const rendered = renderOnboardingBlock(args.onboarding.step);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pty-spawner.js","sourceRoot":"","sources":["../src/pty-spawner.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,yEAAyE;AACzE,0DAA0D;AAC1D,0EAA0E;AAC1E,2EAA2E;AAC3E,eAAe;AACf,EAAE;AACF,0EAA0E;AAC1E,0EAA0E;AAC1E,iEAAiE;AAEjE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"pty-spawner.js","sourceRoot":"","sources":["../src/pty-spawner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface ToolSurface {
|
|
2
|
+
admin: ReadonlySet<string>;
|
|
3
|
+
public: ReadonlySet<string>;
|
|
4
|
+
}
|
|
5
|
+
export declare class ToolSurfaceError extends Error {
|
|
6
|
+
readonly reason: string;
|
|
7
|
+
readonly detail: string;
|
|
8
|
+
constructor(reason: string, detail: string);
|
|
9
|
+
}
|
|
10
|
+
interface ToolEntry {
|
|
11
|
+
name: string;
|
|
12
|
+
publicAllowlist: boolean;
|
|
13
|
+
}
|
|
14
|
+
/** Parse the tools: block out of a PLUGIN.md frontmatter body. Returns an
|
|
15
|
+
* empty array when the frontmatter has no tools: key or declares `tools: []`.
|
|
16
|
+
* Throws ToolSurfaceError on any malformed entry (missing name, missing or
|
|
17
|
+
* non-boolean publicAllowlist). */
|
|
18
|
+
export declare function parseToolsBlock(frontmatter: string, pluginDir: string): ToolEntry[];
|
|
19
|
+
/** Walk a plugins root directory, parse every <name>/PLUGIN.md, and return
|
|
20
|
+
* the {admin, public} sets of fully qualified tool names. Throws on the
|
|
21
|
+
* first malformed manifest — the caller (the manager boot) must exit
|
|
22
|
+
* non-zero so the operator sees the gap. */
|
|
23
|
+
export declare function loadToolSurface(pluginsRoot: string): ToolSurface;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=tool-surface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-surface.d.ts","sourceRoot":"","sources":["../src/tool-surface.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IAC1B,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAC5B;AAED,qBAAa,gBAAiB,SAAQ,KAAK;aACb,MAAM,EAAE,MAAM;aAAkB,MAAM,EAAE,MAAM;gBAA9C,MAAM,EAAE,MAAM,EAAkB,MAAM,EAAE,MAAM;CAI3E;AAED,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,eAAe,EAAE,OAAO,CAAA;CACzB;AAYD;;;oCAGoC;AACpC,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,CAsEnF;AAED;;;6CAG6C;AAC7C,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CA0BhE"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
// Tool-surface resolver — Task 005.
|
|
2
|
+
//
|
|
3
|
+
// Loaded once at manager boot from a directory walk of every
|
|
4
|
+
// platform/plugins/<name>/PLUGIN.md. The frontmatter of each PLUGIN.md
|
|
5
|
+
// declares a list of tools; every tool entry must specify both `name` and
|
|
6
|
+
// `publicAllowlist: <bool>`. The resolver produces two sets of fully
|
|
7
|
+
// qualified tool names (`mcp__<plugin-dir>__<tool>`):
|
|
8
|
+
//
|
|
9
|
+
// - admin: every tool, every plugin.
|
|
10
|
+
// - public: subset where publicAllowlist === true.
|
|
11
|
+
//
|
|
12
|
+
// A tool missing the publicAllowlist field is a refusal-to-boot condition,
|
|
13
|
+
// not a silent default. The decision belongs at the tool's declaration
|
|
14
|
+
// site; defaulting either way hides the question from the writer.
|
|
15
|
+
//
|
|
16
|
+
// The parser uses a hand-rolled YAML-ish walker over the frontmatter block
|
|
17
|
+
// — there is no js-yaml dependency in this service today and the schema
|
|
18
|
+
// is intentionally narrow (a sequence of `- name: <s>` + `publicAllowlist:
|
|
19
|
+
// <bool>` pairs). Anything outside that shape is rejected loudly.
|
|
20
|
+
import { readFileSync, readdirSync, statSync, existsSync } from 'node:fs';
|
|
21
|
+
import { join } from 'node:path';
|
|
22
|
+
export class ToolSurfaceError extends Error {
|
|
23
|
+
reason;
|
|
24
|
+
detail;
|
|
25
|
+
constructor(reason, detail) {
|
|
26
|
+
super(`${reason}: ${detail}`);
|
|
27
|
+
this.reason = reason;
|
|
28
|
+
this.detail = detail;
|
|
29
|
+
this.name = 'ToolSurfaceError';
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const FRONTMATTER_RE = /^---\r?\n([\s\S]*?)\r?\n---/;
|
|
33
|
+
function extractFrontmatter(raw, pluginDir) {
|
|
34
|
+
const m = raw.match(FRONTMATTER_RE);
|
|
35
|
+
if (!m) {
|
|
36
|
+
throw new ToolSurfaceError('frontmatter-missing', `${pluginDir}/PLUGIN.md has no '---' delimited frontmatter`);
|
|
37
|
+
}
|
|
38
|
+
return m[1];
|
|
39
|
+
}
|
|
40
|
+
/** Parse the tools: block out of a PLUGIN.md frontmatter body. Returns an
|
|
41
|
+
* empty array when the frontmatter has no tools: key or declares `tools: []`.
|
|
42
|
+
* Throws ToolSurfaceError on any malformed entry (missing name, missing or
|
|
43
|
+
* non-boolean publicAllowlist). */
|
|
44
|
+
export function parseToolsBlock(frontmatter, pluginDir) {
|
|
45
|
+
const lines = frontmatter.split(/\r?\n/);
|
|
46
|
+
let i = 0;
|
|
47
|
+
while (i < lines.length) {
|
|
48
|
+
const line = lines[i];
|
|
49
|
+
// Skip blank lines and other top-level keys until we hit `tools:`.
|
|
50
|
+
if (/^tools:\s*\[\s*\]\s*$/.test(line))
|
|
51
|
+
return [];
|
|
52
|
+
if (/^tools:\s*$/.test(line)) {
|
|
53
|
+
i++;
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
i++;
|
|
57
|
+
}
|
|
58
|
+
if (i >= lines.length)
|
|
59
|
+
return [];
|
|
60
|
+
const out = [];
|
|
61
|
+
let current = null;
|
|
62
|
+
const flush = () => {
|
|
63
|
+
if (!current)
|
|
64
|
+
return;
|
|
65
|
+
if (typeof current.name !== 'string' || current.name.length === 0) {
|
|
66
|
+
throw new ToolSurfaceError('tool-name-missing', `${pluginDir}/PLUGIN.md has a tool entry with no name`);
|
|
67
|
+
}
|
|
68
|
+
if (typeof current.publicAllowlist !== 'boolean') {
|
|
69
|
+
if (current.publicAllowlist === undefined) {
|
|
70
|
+
throw new ToolSurfaceError('public-allowlist-missing', `${pluginDir}/${current.name} — every tool must declare publicAllowlist: <true|false>`);
|
|
71
|
+
}
|
|
72
|
+
throw new ToolSurfaceError('public-allowlist-not-boolean', `${pluginDir}/${current.name} — publicAllowlist must be a YAML boolean (true|false), got ${JSON.stringify(current.publicAllowlist)}`);
|
|
73
|
+
}
|
|
74
|
+
out.push(current);
|
|
75
|
+
current = null;
|
|
76
|
+
};
|
|
77
|
+
for (; i < lines.length; i++) {
|
|
78
|
+
const line = lines[i];
|
|
79
|
+
if (line.length === 0)
|
|
80
|
+
continue;
|
|
81
|
+
// A top-level key (no leading space) ends the tools block.
|
|
82
|
+
if (/^[A-Za-z_]/.test(line))
|
|
83
|
+
break;
|
|
84
|
+
const newEntry = line.match(/^\s+-\s+name:\s*(.+?)\s*$/);
|
|
85
|
+
if (newEntry) {
|
|
86
|
+
flush();
|
|
87
|
+
current = { name: newEntry[1] };
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
// A list item that does NOT lead with `name:` is malformed — the entry
|
|
91
|
+
// has no name field. Surface it loudly rather than silently ignoring.
|
|
92
|
+
const orphanListItem = line.match(/^\s+-\s+(?!name:)/);
|
|
93
|
+
if (orphanListItem) {
|
|
94
|
+
throw new ToolSurfaceError('tool-name-missing', `${pluginDir}/PLUGIN.md tool entry lacks a name field`);
|
|
95
|
+
}
|
|
96
|
+
const allowlist = line.match(/^\s+publicAllowlist:\s*(.+?)\s*$/);
|
|
97
|
+
if (allowlist && current) {
|
|
98
|
+
const v = allowlist[1].trim();
|
|
99
|
+
if (v === 'true')
|
|
100
|
+
current.publicAllowlist = true;
|
|
101
|
+
else if (v === 'false')
|
|
102
|
+
current.publicAllowlist = false;
|
|
103
|
+
else
|
|
104
|
+
current.publicAllowlist = v;
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
// Other per-entry fields (e.g. nested name on its own line, or unknown
|
|
108
|
+
// keys we don't care about) are ignored — only name and publicAllowlist
|
|
109
|
+
// affect the resolver.
|
|
110
|
+
}
|
|
111
|
+
flush();
|
|
112
|
+
return out;
|
|
113
|
+
}
|
|
114
|
+
/** Walk a plugins root directory, parse every <name>/PLUGIN.md, and return
|
|
115
|
+
* the {admin, public} sets of fully qualified tool names. Throws on the
|
|
116
|
+
* first malformed manifest — the caller (the manager boot) must exit
|
|
117
|
+
* non-zero so the operator sees the gap. */
|
|
118
|
+
export function loadToolSurface(pluginsRoot) {
|
|
119
|
+
if (!existsSync(pluginsRoot)) {
|
|
120
|
+
throw new ToolSurfaceError('plugins-root-missing', pluginsRoot);
|
|
121
|
+
}
|
|
122
|
+
const admin = new Set();
|
|
123
|
+
const pub = new Set();
|
|
124
|
+
const entries = readdirSync(pluginsRoot).sort();
|
|
125
|
+
for (const plugin of entries) {
|
|
126
|
+
const pluginDir = join(pluginsRoot, plugin);
|
|
127
|
+
try {
|
|
128
|
+
if (!statSync(pluginDir).isDirectory())
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
const manifestPath = join(pluginDir, 'PLUGIN.md');
|
|
135
|
+
if (!existsSync(manifestPath))
|
|
136
|
+
continue;
|
|
137
|
+
const raw = readFileSync(manifestPath, 'utf-8');
|
|
138
|
+
const frontmatter = extractFrontmatter(raw, plugin);
|
|
139
|
+
const tools = parseToolsBlock(frontmatter, plugin);
|
|
140
|
+
for (const t of tools) {
|
|
141
|
+
const qualified = `mcp__${plugin}__${t.name}`;
|
|
142
|
+
admin.add(qualified);
|
|
143
|
+
if (t.publicAllowlist)
|
|
144
|
+
pub.add(qualified);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return { admin, public: pub };
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=tool-surface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-surface.js","sourceRoot":"","sources":["../src/tool-surface.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,21 @@ skills:
|
|
|
11
11
|
- skills/business-operations/SKILL.md
|
|
12
12
|
- skills/personal-branding/SKILL.md
|
|
13
13
|
- skills/exp-partnership/SKILL.md
|
|
14
|
+
profileKeys:
|
|
15
|
+
- realagent.accounting.chart_of_accounts_map
|
|
16
|
+
- realagent.accounting.platform
|
|
17
|
+
- realagent.bank.batch_format
|
|
18
|
+
- realagent.bank.preferred_pay_date_offset_days
|
|
19
|
+
- realagent.close.flag_threshold_fee_gbp
|
|
20
|
+
- realagent.close.match_tolerance_days
|
|
21
|
+
- realagent.close.match_tolerance_gbp
|
|
22
|
+
- realagent.close.narrative_voice_samples
|
|
23
|
+
- realagent.close.pack_recipients
|
|
24
|
+
- realagent.close.writeoff_threshold_gbp
|
|
25
|
+
- realagent.commission.adjustments
|
|
26
|
+
- realagent.commission.franchise_levy_pct
|
|
27
|
+
- realagent.commission.splits_table_path
|
|
28
|
+
- realagent.payees
|
|
14
29
|
always: false
|
|
15
30
|
metadata: {"platform":{"optional":true,"embed":["admin"]}}
|
|
16
31
|
---
|
|
@@ -10,6 +10,11 @@ skills:
|
|
|
10
10
|
- skills/sales-negotiation/SKILL.md
|
|
11
11
|
- skills/sales-progression/SKILL.md
|
|
12
12
|
- skills/negotiation/SKILL.md
|
|
13
|
+
profileKeys:
|
|
14
|
+
- realagent.batch_cap
|
|
15
|
+
- realagent.phrasing_pet_peeves
|
|
16
|
+
- realagent.risk_weights.fee_multiplier
|
|
17
|
+
- realagent.skip_recipients
|
|
13
18
|
always: false
|
|
14
19
|
metadata: {"platform":{"optional":true,"embed":["public","admin"]}}
|
|
15
20
|
---
|
|
@@ -9,6 +9,22 @@ skills:
|
|
|
9
9
|
- skills/chain-progression-tracker/SKILL.md
|
|
10
10
|
- skills/lead-nurturing/SKILL.md
|
|
11
11
|
- skills/prospecting/SKILL.md
|
|
12
|
+
profileKeys:
|
|
13
|
+
- realagent.awaiting_reply_lookback_days
|
|
14
|
+
- realagent.cause_phrases
|
|
15
|
+
- realagent.diary.postcode_ordering
|
|
16
|
+
- realagent.diary.show_internal_events
|
|
17
|
+
- realagent.enquiry_triage.source_weights
|
|
18
|
+
- realagent.enquiry_triage.spam_phrases
|
|
19
|
+
- realagent.morning_round.delivery_channel
|
|
20
|
+
- realagent.morning_round.delivery_time
|
|
21
|
+
- realagent.morning_round.hidden_sections
|
|
22
|
+
- realagent.morning_round.section_order
|
|
23
|
+
- realagent.stalled_threshold_days.broker
|
|
24
|
+
- realagent.stalled_threshold_days.buyer
|
|
25
|
+
- realagent.stalled_threshold_days.solicitor
|
|
26
|
+
- realagent.stalled_threshold_days.surveyor
|
|
27
|
+
- realagent.stalled_threshold_days.vendor
|
|
12
28
|
always: false
|
|
13
29
|
metadata: {"platform":{"optional":true,"embed":["admin"]}}
|
|
14
30
|
---
|
|
@@ -18,6 +18,45 @@ skills:
|
|
|
18
18
|
- skills/listing-presentation/SKILL.md
|
|
19
19
|
- skills/property-marketing/SKILL.md
|
|
20
20
|
- skills/home-preparation/SKILL.md
|
|
21
|
+
profileKeys:
|
|
22
|
+
- realagent.comparable_exclude_filters
|
|
23
|
+
- realagent.comparable_radius_miles
|
|
24
|
+
- realagent.compliance.cmp_scheme_membership
|
|
25
|
+
- realagent.compliance.ico_registration
|
|
26
|
+
- realagent.compliance.redress_scheme
|
|
27
|
+
- realagent.epc_order.standard_brief
|
|
28
|
+
- realagent.fee_structure.default
|
|
29
|
+
- realagent.fee_structure.marketing_period_weeks
|
|
30
|
+
- realagent.fee_structure.minimum
|
|
31
|
+
- realagent.fee_structure.withdrawal_fee
|
|
32
|
+
- realagent.listing_copy.headline_style
|
|
33
|
+
- realagent.listing_copy.length_words
|
|
34
|
+
- realagent.listing_copy.section_order
|
|
35
|
+
- realagent.market_stats.area_definition
|
|
36
|
+
- realagent.market_stats.lookback_days
|
|
37
|
+
- realagent.objection_responses
|
|
38
|
+
- realagent.particulars.location_paragraph_position
|
|
39
|
+
- realagent.particulars.photo_count
|
|
40
|
+
- realagent.particulars.section_order
|
|
41
|
+
- realagent.particulars.template_path
|
|
42
|
+
- realagent.portal_launch.preferred_day
|
|
43
|
+
- realagent.portal_launch.preferred_time
|
|
44
|
+
- realagent.portal_launch.rightmove_tier
|
|
45
|
+
- realagent.portal_launch.viewing_slots_per_day
|
|
46
|
+
- realagent.pricing.aspirational_caveat_phrase
|
|
47
|
+
- realagent.pricing_format
|
|
48
|
+
- realagent.privacy_line.suppress
|
|
49
|
+
- realagent.privacy_line.surface
|
|
50
|
+
- realagent.suppliers.aml_provider
|
|
51
|
+
- realagent.suppliers.brief.floorplan
|
|
52
|
+
- realagent.suppliers.brief.photography
|
|
53
|
+
- realagent.suppliers.combined
|
|
54
|
+
- realagent.suppliers.epc
|
|
55
|
+
- realagent.suppliers.floorplan
|
|
56
|
+
- realagent.suppliers.photographer
|
|
57
|
+
- realagent.terms_template_path
|
|
58
|
+
- realagent.usp_phrases
|
|
59
|
+
- realagent.voice_samples
|
|
21
60
|
always: false
|
|
22
61
|
metadata: {"platform":{"optional":true,"embed":["admin"]}}
|
|
23
62
|
---
|
|
@@ -31,6 +31,21 @@ skills:
|
|
|
31
31
|
- skills/compliance-flag-checker/SKILL.md
|
|
32
32
|
- skills/vendor-research/SKILL.md
|
|
33
33
|
- skills/variance-narrator/SKILL.md
|
|
34
|
+
profileKeys:
|
|
35
|
+
- realagent.cause_phrases
|
|
36
|
+
- realagent.close.narrative_voice_samples
|
|
37
|
+
- realagent.compliance.aml_provider
|
|
38
|
+
- realagent.compliance.cmp_scheme_membership
|
|
39
|
+
- realagent.compliance.ico_registration
|
|
40
|
+
- realagent.compliance.mlro_designation
|
|
41
|
+
- realagent.compliance.propertymark_membership
|
|
42
|
+
- realagent.compliance.redress_scheme
|
|
43
|
+
- realagent.compliance.tpo_membership
|
|
44
|
+
- realagent.phrasing_pet_peeves
|
|
45
|
+
- realagent.priority_weights.fee_multiplier
|
|
46
|
+
- realagent.privacy_line.suppress
|
|
47
|
+
- realagent.privacy_line.surface
|
|
48
|
+
- realagent.voice_samples
|
|
34
49
|
always: false
|
|
35
50
|
metadata: {"platform":{"optional":true,"embed":["admin"]}}
|
|
36
51
|
---
|