@rubytech/create-realagent-code 0.1.566 → 0.1.568
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__/brand-agent-root.test.js +91 -0
- package/dist/brand-agent-root.js +58 -0
- package/dist/index.js +25 -28
- package/package.json +1 -1
- package/payload/platform/neo4j/schema.cypher +9 -0
- package/payload/platform/package-lock.json +66 -1
- package/payload/platform/plugins/.claude-plugin/marketplace.json +5 -0
- package/payload/platform/plugins/admin/hooks/lib/maxy-mcp-plugins.txt +1 -0
- package/payload/platform/plugins/admin/mcp/dist/index.js +7 -1
- package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/admin/mcp/dist/lib/roster-census.d.ts +10 -1
- package/payload/platform/plugins/admin/mcp/dist/lib/roster-census.d.ts.map +1 -1
- package/payload/platform/plugins/admin/mcp/dist/lib/roster-census.js +6 -1
- package/payload/platform/plugins/admin/mcp/dist/lib/roster-census.js.map +1 -1
- package/payload/platform/plugins/admin/mcp/dist/tools/capabilities-here.d.ts +9 -0
- package/payload/platform/plugins/admin/mcp/dist/tools/capabilities-here.d.ts.map +1 -1
- package/payload/platform/plugins/admin/mcp/dist/tools/capabilities-here.js +1 -1
- package/payload/platform/plugins/admin/mcp/dist/tools/capabilities-here.js.map +1 -1
- package/payload/platform/plugins/admin/skills/capabilities-here/SKILL.md +1 -1
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +91 -1
- package/payload/platform/plugins/admin/skills/public-agent-manager/SKILL.md +5 -1
- package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +13 -0
- package/payload/platform/plugins/docs/references/channel-wake-and-prompt.md +90 -0
- package/payload/platform/plugins/inventory/.claude-plugin/plugin.json +21 -0
- package/payload/platform/plugins/inventory/PLUGIN.md +75 -0
- package/payload/platform/plugins/inventory/lib/mcp-spawn-tee/index.js +204 -0
- package/payload/platform/plugins/inventory/lib/mcp-spawn-tee/package.json +3 -0
- package/payload/platform/plugins/inventory/mcp/dist/index.d.ts +2 -0
- package/payload/platform/plugins/inventory/mcp/dist/index.d.ts.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/index.js +241 -0
- package/payload/platform/plugins/inventory/mcp/dist/index.js.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/lib/forecast.d.ts +20 -0
- package/payload/platform/plugins/inventory/mcp/dist/lib/forecast.d.ts.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/lib/forecast.js +29 -0
- package/payload/platform/plugins/inventory/mcp/dist/lib/forecast.js.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/lib/neo4j.d.ts +5 -0
- package/payload/platform/plugins/inventory/mcp/dist/lib/neo4j.d.ts.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/lib/neo4j.js +40 -0
- package/payload/platform/plugins/inventory/mcp/dist/lib/neo4j.js.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/lib/read.d.ts +28 -0
- package/payload/platform/plugins/inventory/mcp/dist/lib/read.d.ts.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/lib/read.js +91 -0
- package/payload/platform/plugins/inventory/mcp/dist/lib/read.js.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/lib/replenish.d.ts +56 -0
- package/payload/platform/plugins/inventory/mcp/dist/lib/replenish.d.ts.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/lib/replenish.js +107 -0
- package/payload/platform/plugins/inventory/mcp/dist/lib/replenish.js.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/lib/types.d.ts +98 -0
- package/payload/platform/plugins/inventory/mcp/dist/lib/types.d.ts.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/lib/types.js +7 -0
- package/payload/platform/plugins/inventory/mcp/dist/lib/types.js.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/lib/write-rejects.d.ts +12 -0
- package/payload/platform/plugins/inventory/mcp/dist/lib/write-rejects.d.ts.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/lib/write-rejects.js +49 -0
- package/payload/platform/plugins/inventory/mcp/dist/lib/write-rejects.js.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/demand-record.d.ts +20 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/demand-record.d.ts.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/demand-record.js +53 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/demand-record.js.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/forecast.d.ts +23 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/forecast.d.ts.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/forecast.js +18 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/forecast.js.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/policy-set.d.ts +25 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/policy-set.d.ts.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/policy-set.js +37 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/policy-set.js.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/purchase-order-record.d.ts +25 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/purchase-order-record.d.ts.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/purchase-order-record.js +43 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/purchase-order-record.js.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/replenish-plan.d.ts +29 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/replenish-plan.d.ts.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/replenish-plan.js +95 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/replenish-plan.js.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/stock-record.d.ts +21 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/stock-record.d.ts.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/stock-record.js +46 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/stock-record.js.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/supplier-terms-set.d.ts +24 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/supplier-terms-set.d.ts.map +1 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/supplier-terms-set.js +29 -0
- package/payload/platform/plugins/inventory/mcp/dist/tools/supplier-terms-set.js.map +1 -0
- package/payload/platform/plugins/inventory/mcp/package.json +21 -0
- package/payload/platform/plugins/memory/references/schema-retail.md +20 -0
- package/payload/platform/scripts/lib/provision-account-dir.sh +0 -2
- package/payload/platform/services/claude-session-manager/dist/account-agent-registry.d.ts +19 -0
- package/payload/platform/services/claude-session-manager/dist/account-agent-registry.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/account-agent-registry.js +146 -0
- package/payload/platform/services/claude-session-manager/dist/account-agent-registry.js.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js +8 -0
- package/payload/platform/services/claude-session-manager/dist/canonical-tool-names.generated.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts +5 -0
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.js +5 -5
- package/payload/platform/services/claude-session-manager/dist/fs-watcher.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +11 -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 +124 -17
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/index.js +25 -13
- package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-census.d.ts +6 -1
- package/payload/platform/services/claude-session-manager/dist/pty-census.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-census.js +6 -3
- package/payload/platform/services/claude-session-manager/dist/pty-census.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +21 -8
- 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 +38 -15
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/public-spawn-model.d.ts +28 -0
- package/payload/platform/services/claude-session-manager/dist/public-spawn-model.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/public-spawn-model.js +58 -0
- package/payload/platform/services/claude-session-manager/dist/public-spawn-model.js.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.d.ts +2 -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 +4 -1
- package/payload/platform/services/claude-session-manager/dist/rc-daemon.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/reaper.d.ts +3 -0
- package/payload/platform/services/claude-session-manager/dist/reaper.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/reaper.js +2 -1
- package/payload/platform/services/claude-session-manager/dist/reaper.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/session-cap-audit.d.ts +2 -0
- package/payload/platform/services/claude-session-manager/dist/session-cap-audit.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/session-cap-audit.js +5 -2
- package/payload/platform/services/claude-session-manager/dist/session-cap-audit.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.d.ts +2 -0
- package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.js +5 -3
- package/payload/platform/services/claude-session-manager/dist/slice-memory-policy.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/systemd-scope.d.ts +26 -16
- package/payload/platform/services/claude-session-manager/dist/systemd-scope.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/systemd-scope.js +84 -31
- package/payload/platform/services/claude-session-manager/dist/systemd-scope.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.d.ts +7 -0
- package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.js +6 -0
- package/payload/platform/services/claude-session-manager/dist/wa-channel-mcp.js.map +1 -1
- package/payload/platform/services/telegram-channel/dist/notification.d.ts +10 -2
- package/payload/platform/services/telegram-channel/dist/notification.d.ts.map +1 -1
- package/payload/platform/services/telegram-channel/dist/notification.js +15 -3
- package/payload/platform/services/telegram-channel/dist/notification.js.map +1 -1
- package/payload/platform/services/telegram-channel/dist/server.d.ts +5 -0
- package/payload/platform/services/telegram-channel/dist/server.d.ts.map +1 -1
- package/payload/platform/services/telegram-channel/dist/server.js +57 -5
- package/payload/platform/services/telegram-channel/dist/server.js.map +1 -1
- package/payload/platform/services/telegram-channel/dist/turn-follow.d.ts +44 -2
- package/payload/platform/services/telegram-channel/dist/turn-follow.d.ts.map +1 -1
- package/payload/platform/services/telegram-channel/dist/turn-follow.js +188 -15
- package/payload/platform/services/telegram-channel/dist/turn-follow.js.map +1 -1
- package/payload/platform/services/webchat-channel/dist/server.d.ts +5 -0
- package/payload/platform/services/webchat-channel/dist/server.d.ts.map +1 -1
- package/payload/platform/services/webchat-channel/dist/server.js +53 -4
- package/payload/platform/services/webchat-channel/dist/server.js.map +1 -1
- package/payload/platform/services/webchat-channel/dist/turn-follow.d.ts +44 -2
- package/payload/platform/services/webchat-channel/dist/turn-follow.d.ts.map +1 -1
- package/payload/platform/services/webchat-channel/dist/turn-follow.js +188 -15
- package/payload/platform/services/webchat-channel/dist/turn-follow.js.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/instructions.d.ts +9 -0
- package/payload/platform/services/whatsapp-channel/dist/instructions.d.ts.map +1 -0
- package/payload/platform/services/whatsapp-channel/dist/instructions.js +22 -0
- package/payload/platform/services/whatsapp-channel/dist/instructions.js.map +1 -0
- package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +3 -1
- package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/notification.js +10 -2
- package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/server.d.ts +10 -2
- package/payload/platform/services/whatsapp-channel/dist/server.d.ts.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/server.js +71 -8
- package/payload/platform/services/whatsapp-channel/dist/server.js.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/turn-follow.d.ts +34 -2
- package/payload/platform/services/whatsapp-channel/dist/turn-follow.d.ts.map +1 -1
- package/payload/platform/services/whatsapp-channel/dist/turn-follow.js +153 -15
- package/payload/platform/services/whatsapp-channel/dist/turn-follow.js.map +1 -1
- package/payload/server/server.js +254 -96
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
export interface RosterCensusInput {
|
|
2
2
|
/** `<accountDir>/agents/admin/AGENTS.md` — the admin's routing prose. */
|
|
3
3
|
agentsMdPath: string;
|
|
4
|
-
/** `<accountDir>/specialists/agents` — the directory spawn-context
|
|
4
|
+
/** `<accountDir>/specialists/agents` — the source directory spawn-context
|
|
5
|
+
* reads for the `<specialist-domains>` prompt block, and the directory the
|
|
6
|
+
* registry mirrors. Not what dispatch resolves against; see `registryDir`.
|
|
7
|
+
* Drives `undurable` and `bundleOrphans` only. */
|
|
5
8
|
specialistsAgentsDir: string;
|
|
9
|
+
/** Task 2460 — `<accountDir>/.claude/agents`, the one directory the CLI
|
|
10
|
+
* resolves a subagent name from once the brand-wide root is retired.
|
|
11
|
+
* `syncAccountAgentRegistry` writes it at every spawn. Required, not
|
|
12
|
+
* optional: a caller that omitted it would report every declared specialist
|
|
13
|
+
* as orphaned. */
|
|
14
|
+
registryDir: string;
|
|
6
15
|
/** Directories whose own `*.md` files are durable copies. Today just
|
|
7
16
|
* `$PLATFORM_ROOT/templates/specialists/agents`. Required, not optional:
|
|
8
17
|
* a caller that omitted them would report every live specialist as
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roster-census.d.ts","sourceRoot":"","sources":["../../src/lib/roster-census.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"roster-census.d.ts","sourceRoot":"","sources":["../../src/lib/roster-census.ts"],"names":[],"mappings":"AAmCA,MAAM,WAAW,iBAAiB;IAChC,yEAAyE;IACzE,YAAY,EAAE,MAAM,CAAC;IACrB;;;uDAGmD;IACnD,oBAAoB,EAAE,MAAM,CAAC;IAC7B;;;;uBAImB;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB;;;qBAGiB;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB;;;;4EAIwE;IACxE,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B;;qEAEiE;IACjE,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;oEAEgE;IAChE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB;;;;sEAIkE;IAClE,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAyCD,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,kBAAkB,CAqC5E"}
|
|
@@ -43,7 +43,12 @@ export function runRosterCensus(input) {
|
|
|
43
43
|
for (const match of body.matchAll(/^- \*\*specialists:([^*]+)\*\*:/gm)) {
|
|
44
44
|
declared.push(match[1]);
|
|
45
45
|
}
|
|
46
|
-
|
|
46
|
+
// Task 2460 — measured against the registry, not the source directory. Those
|
|
47
|
+
// two disagreed on the account that filed that task: 13 authored, 12
|
|
48
|
+
// registered, and this line reported zero orphans three times. existsSync
|
|
49
|
+
// follows symlinks, so a dangling registry link reads as absent, which is
|
|
50
|
+
// correct — it does not resolve.
|
|
51
|
+
const orphaned = declared.filter((name) => !existsSync(join(input.registryDir, `${name}.md`)));
|
|
47
52
|
const durable = new Set();
|
|
48
53
|
for (const dir of input.durableDirs) {
|
|
49
54
|
for (const filename of markdownIn(dir))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roster-census.js","sourceRoot":"","sources":["../../src/lib/roster-census.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"roster-census.js","sourceRoot":"","sources":["../../src/lib/roster-census.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,16 @@ export interface CapabilitiesHereInput {
|
|
|
11
11
|
brandConfigPath: string;
|
|
12
12
|
platformRoot: string;
|
|
13
13
|
premiumPluginsRoot: string;
|
|
14
|
+
/** Still needed: `listConnectorsRaw` runs `claude mcp list` under it. No
|
|
15
|
+
* longer the source of `registeredAgentTypes`; see `agentRegistryDir`. */
|
|
14
16
|
claudeConfigDir: string;
|
|
17
|
+
/** Task 2460 — `<accountDir>/.claude/agents`, the account's agent registry.
|
|
18
|
+
* `registeredAgentTypes` used to enumerate `$CLAUDE_CONFIG_DIR/agents`, the
|
|
19
|
+
* brand-wide root the installer wrote; that root is retired and cleared on
|
|
20
|
+
* upgrade, so reading it would report an empty registry on every install.
|
|
21
|
+
* This tool's contract is that a caller may rely on it before claiming what
|
|
22
|
+
* is dispatchable, so it must name the directory dispatch resolves against. */
|
|
23
|
+
agentRegistryDir: string;
|
|
15
24
|
/** Task 1160 — returns the raw combined output of `claude mcp list` run under
|
|
16
25
|
* the brand config dir. Injected by the adapter (index.ts) so this function
|
|
17
26
|
* stays a pure resolver and so the subprocess never runs in unit tests. When
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities-here.d.ts","sourceRoot":"","sources":["../../src/tools/capabilities-here.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,sBAAsB,GAAG,WAAW,GAAG,YAAY,GAAG,aAAa,CAAC;AAEhF,MAAM,WAAW,iBAAiB;IAChC;qFACiF;IACjF,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,sBAAsB,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB;;;;;yCAKqC;IACrC,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,4BAA4B,EAAE,MAAM,EAAE,CAAC;IACvC,2BAA2B,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;IACxC,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,mBAAmB,EAAE,MAAM,EAAE,CAAC;KAC/B,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;CACpB;AASD,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAwBlF;AAuCD,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,qBAAqB,EAC5B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,sBAAsB,CAAC,
|
|
1
|
+
{"version":3,"file":"capabilities-here.d.ts","sourceRoot":"","sources":["../../src/tools/capabilities-here.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,sBAAsB,GAAG,WAAW,GAAG,YAAY,GAAG,aAAa,CAAC;AAEhF,MAAM,WAAW,iBAAiB;IAChC;qFACiF;IACjF,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,sBAAsB,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B;+EAC2E;IAC3E,eAAe,EAAE,MAAM,CAAC;IACxB;;;;;oFAKgF;IAChF,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;;;yCAKqC;IACrC,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,4BAA4B,EAAE,MAAM,EAAE,CAAC;IACvC,2BAA2B,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;IACxC,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,mBAAmB,EAAE,MAAM,EAAE,CAAC;KAC/B,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;CACpB;AASD,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAwBlF;AAuCD,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,qBAAqB,EAC5B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,sBAAsB,CAAC,CAiDjC"}
|
|
@@ -101,7 +101,7 @@ export async function resolveCapabilitiesHere(input, nowIso) {
|
|
|
101
101
|
for (const name of names)
|
|
102
102
|
installedPremiumSpecialists.push({ bundle, name });
|
|
103
103
|
}
|
|
104
|
-
const registeredAgentTypes = listAgentRegistry(
|
|
104
|
+
const registeredAgentTypes = listAgentRegistry(input.agentRegistryDir);
|
|
105
105
|
const claudeAiConnectors = await resolveClaudeAiConnectors(input.listConnectorsRaw);
|
|
106
106
|
return {
|
|
107
107
|
accountId: input.accountId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities-here.js","sourceRoot":"","sources":["../../src/tools/capabilities-here.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"capabilities-here.js","sourceRoot":"","sources":["../../src/tools/capabilities-here.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,7 +22,7 @@ Call `mcp__plugin_admin_admin__capabilities-here` with no arguments. The tool re
|
|
|
22
22
|
- `brand.json` for `productName` and `shipsPremiumBundles`.
|
|
23
23
|
- `platform/templates/specialists/agents/` for `installedPlatformSpecialists`.
|
|
24
24
|
- Each enabled premium bundle's `agents/` for `installedPremiumSpecialists`.
|
|
25
|
-
-
|
|
25
|
+
- `<accountDir>/.claude/agents/` for `registeredAgentTypes` (this account's agent registry, the same one the Agent tool resolves against). It is mirrored from `<accountDir>/specialists/agents/` before every spawn. The brand-wide `$CLAUDE_CONFIG_DIR/agents/` is not a registration surface and registers nothing.
|
|
26
26
|
|
|
27
27
|
Returns one JSON object with those fields plus `accountId`, `capturedAt`, and the `brand` block. No LLM in the resolution path; pure disk + JSON reads.
|
|
28
28
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: platform-architecture
|
|
3
3
|
description: Use when grounding any documented-surface claim about what Real Agent 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:4bcfae6ebab07ac3d10e2837d724d2949b60e9cb6c90812a748db2c19b12d67e
|
|
5
5
|
brand: realagent-code
|
|
6
6
|
product-name: Real Agent
|
|
7
7
|
---
|
|
@@ -1773,6 +1773,96 @@ The first-run dialog is answered for the session, and the watcher that guards ag
|
|
|
1773
1773
|
|
|
1774
1774
|
Two standing audits reconcile that chain rather than waiting for someone to notice. `op=public-notify-reconcile` reports `routed` against `answered`, so a visitor routed to an agent that never replied shows as `answerGap`. `op=spawn-census` reports attempts against successes. A non-zero gap, or attempts with no successes, is a fault even when nothing has been reported.
|
|
1775
1775
|
|
|
1776
|
+
## Delivery parity, and where its lines actually land
|
|
1777
|
+
|
|
1778
|
+
**The contract.** For any channel session, the set of answers delivered to the
|
|
1779
|
+
chat equals the transcript's assistant `text` blocks **for turns that answered a
|
|
1780
|
+
channel inbound**. An answer readable in the reader and absent from the chat is a
|
|
1781
|
+
defect. Turns that answered no inbound — subagent side-chains, turns driven from
|
|
1782
|
+
claude.ai — are deliberately outside that set: the credit guards are what keep
|
|
1783
|
+
them out of a customer's chat.
|
|
1784
|
+
|
|
1785
|
+
Each door's `src/parity.test.ts` asserts the contract end to end against a real
|
|
1786
|
+
JSONL and the real follower.
|
|
1787
|
+
|
|
1788
|
+
**Six discard sites, each now logged.** A follower outcome is dropped at:
|
|
1789
|
+
|
|
1790
|
+
| File | Guard | `reason=` |
|
|
1791
|
+
|---|---|---|
|
|
1792
|
+
| `telegram-channel/src/server.ts:241` | `pendingTurns <= 0` | `no-credit` |
|
|
1793
|
+
| `webchat-channel/src/server.ts:378` | `pendingTurns <= 0` | `no-credit` |
|
|
1794
|
+
| `whatsapp-channel/src/server.ts:481` | `pendingTurns <= 0` | `no-credit` |
|
|
1795
|
+
| `whatsapp-channel/src/server.ts:489` | `consumedInbounds <= 0` | `no-consumed-inbound` |
|
|
1796
|
+
| `whatsapp-channel/src/server.ts:617` | `pendingTurns <= 0` (2nd follower) | `no-credit` |
|
|
1797
|
+
| `whatsapp-channel/src/server.ts:620` | `consumedInbounds <= 0` (2nd follower) | `no-consumed-inbound` |
|
|
1798
|
+
|
|
1799
|
+
```
|
|
1800
|
+
[<door>-channel] op=turn-drop sessionId=… messageId=… finalBytes=… reason=…
|
|
1801
|
+
[<door>-turn-census] op=census sessionId=… pending=… held=<0|1> heldMessageId=… heldAgeMs=… lastMessageId=…
|
|
1802
|
+
```
|
|
1803
|
+
|
|
1804
|
+
Any `op=turn-drop` with `finalBytes>0` is a lost answer. The census runs every
|
|
1805
|
+
60 s per follower; `held=1` with `heldAgeMs` rising across ticks is a hold that
|
|
1806
|
+
never resolved, and `pending` not returning to 0 with no inbound in flight is
|
|
1807
|
+
credit drift.
|
|
1808
|
+
|
|
1809
|
+
**Read them in the right file.** Both lines are emitted by the *channel MCP
|
|
1810
|
+
server*, whose stderr is teed to `${LOG_DIR}/mcp-<serverName>-<sessionId>.log`
|
|
1811
|
+
(`claude-session-manager/src/channel-spawn-tee.ts`). They are **never** in
|
|
1812
|
+
`server.log`, which carries the gateway-side half only — `op=turn-end`,
|
|
1813
|
+
`op=turn-answer-absent`, `delivered=`. Grepping `server.log` for a drop returns
|
|
1814
|
+
nothing and means nothing.
|
|
1815
|
+
|
|
1816
|
+
```bash
|
|
1817
|
+
# the discard and the hold, per session
|
|
1818
|
+
grep -E 'op=(turn-drop|census)' ~/.<brand>/logs/mcp-telegram-channel-*.log | tail -20
|
|
1819
|
+
# the gateway's view of the same turn
|
|
1820
|
+
grep -E 'op=(turn-end|turn-answer-absent)' ~/.<brand>/logs/server.log | grep <sessionId>
|
|
1821
|
+
```
|
|
1822
|
+
|
|
1823
|
+
**A seventh discard site, and the one nothing was reading.** An answer that
|
|
1824
|
+
survived every guard above could still be produced and thrown away at the last
|
|
1825
|
+
step, because the gateway resolved its destination from admin identity rather
|
|
1826
|
+
than from the channel it came in on. A public visitor has no admin identity, so
|
|
1827
|
+
the resolver returned no target: nothing was attempted, no transport failed, and
|
|
1828
|
+
the line read `reached=none notReached=none`.
|
|
1829
|
+
|
|
1830
|
+
The turn-end body now carries the channel server's own spawn `role`, and that is
|
|
1831
|
+
the only thing that decides the destination:
|
|
1832
|
+
|
|
1833
|
+
| `role=` | Where the answer goes | `op=fan-out` |
|
|
1834
|
+
|---|---|---|
|
|
1835
|
+
| `public` | every segment through the posting key's own transport; no identity resolver, no registry read | never emitted |
|
|
1836
|
+
| `admin` | every live door the person is reachable on, via `fanTargetsFor` | emitted |
|
|
1837
|
+
| absent or unrecognised | nowhere. 400, plus one `op=turn-role-absent … evicted=<yes\|no>` | never emitted |
|
|
1838
|
+
|
|
1839
|
+
`op=turn-end` and `op=turn-strand-anomaly` both name the role, so no outcome is
|
|
1840
|
+
unattributable.
|
|
1841
|
+
|
|
1842
|
+
A roleless POST has one cause: a channel server from a build predating the field,
|
|
1843
|
+
still attached to a session that outlived the platform restart. It reconnects its
|
|
1844
|
+
stream, so nothing respawns it, and left alone it would post roleless turn-ends for
|
|
1845
|
+
the life of that session. `evicted=yes` says the gateway dropped its subscriber, so
|
|
1846
|
+
the next inbound spawns a server on the current build: one turn is lost per session
|
|
1847
|
+
rather than all of them. That turn's answer is deliberately not delivered to the
|
|
1848
|
+
posting key, because doing so would restore the very fallback whose reachability hid
|
|
1849
|
+
the original defect. The standing check is one line per door per minute, over a
|
|
1850
|
+
rolling hour:
|
|
1851
|
+
|
|
1852
|
+
```bash
|
|
1853
|
+
# the standing read; any undeliveredPublic>0 is a failure
|
|
1854
|
+
grep -E 'op=census' ~/.<brand>/logs/server.log | grep delivery-census | tail -5
|
|
1855
|
+
# a visitor's answer that reached nobody, or a turn-end that named no role
|
|
1856
|
+
grep -E 'op=(turn-role-absent|turn-strand-anomaly)' ~/.<brand>/logs/server.log | tail -20
|
|
1857
|
+
```
|
|
1858
|
+
|
|
1859
|
+
`[<door>-delivery-census] op=census windowMin=60 turnEnds=… record=… none=…
|
|
1860
|
+
undelivered=… undeliveredPublic=… undeliveredAdmin=… roleAbsent=…`. Healthy is
|
|
1861
|
+
`undeliveredPublic=0 roleAbsent=0` with `record` tracking `turnEnds` minus
|
|
1862
|
+
`none`. A door with no turn-end in the hour emits nothing; the
|
|
1863
|
+
`op=arm name=channel-delivery-census` line at boot is what separates that from a
|
|
1864
|
+
census that is not running.
|
|
1865
|
+
|
|
1776
1866
|
---
|
|
1777
1867
|
# Settings
|
|
1778
1868
|
Source: https://docs.getmaxy.com/settings.md
|
|
@@ -47,6 +47,10 @@ Each agent lives at `{accountDir}/agents/{slug}/`:
|
|
|
47
47
|
}
|
|
48
48
|
```
|
|
49
49
|
|
|
50
|
+
### model
|
|
51
|
+
|
|
52
|
+
`model` is live. A public spawn reads it from this file and passes it to the agent's process as `--model`; changing it here changes the next spawn's model with no code change and no restart. An id outside the three listed below is ignored, and the spawn falls back to the account's `publicModel`.
|
|
53
|
+
|
|
50
54
|
### Toolless by construction
|
|
51
55
|
|
|
52
56
|
The public agent has no tools. It cannot search the graph, read files, run commands, or load skills mid-conversation. Everything it knows is the KNOWLEDGE.md and SOUL assembled into its system prompt at spawn time. There is no operator toggle for this — it is the fixed posture for every public agent on every channel. If the agent needs to surface graph content created after deployment, refresh its KNOWLEDGE.md (see Update knowledge below); the agent itself never reaches the live graph.
|
|
@@ -83,7 +87,7 @@ Tagging routes a node to the suggestion surface; it does not publish it. A tagge
|
|
|
83
87
|
|
|
84
88
|
### Model Options
|
|
85
89
|
|
|
86
|
-
Present as a `select` field within the agent configuration `form` during creation:
|
|
90
|
+
Present as a `select` field within the agent configuration `form` during creation. The chosen id is written to `config.json` `model` and is what the agent's spawns actually run on:
|
|
87
91
|
|
|
88
92
|
| Model | ID | Suitability | Cost |
|
|
89
93
|
|-------|-----|------------|------|
|
|
@@ -9,6 +9,19 @@ 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-06 (0.1.568)
|
|
13
|
+
|
|
14
|
+
- Answers reach the conversation they came from again. An answer was being routed by who the account's admin is rather than by the conversation it was sent to, so a public agent's reply could go nowhere and an admin answer could strand with nothing said about it. Delivery now returns to the door the message arrived on, and every failure to find one is named rather than passing silently. If you rolled an install back because of this, you can move forward again.
|
|
15
|
+
- Starting one product no longer kills conversations belonging to another on the same machine. A product starting up was clearing away stale conversations by a pattern that matched every other co-resident product's live ones too.
|
|
16
|
+
- A specialist you wrote is now actually dispatchable. It was being listed to the assistant while never being registered where dispatch looks, so asking for it did nothing.
|
|
17
|
+
- Telegram and webchat no longer spend one of your inbound allowances on a turn that answered nothing.
|
|
18
|
+
|
|
19
|
+
## 2026-08-05 (0.1.567)
|
|
20
|
+
|
|
21
|
+
- An answer you can see in the reader is now delivered to the channel it belongs to. A turn that ended on a thinking block was closing before its answer row arrived, and that answer was dropped. Every channel now holds a close that carries no message, merges a split answer back into one message, and records a line at each of the six points where a turn used to be discarded silently.
|
|
22
|
+
- A public agent now runs on the model it is configured with. Public conversations were ignoring the agent's own setting and inheriting the admin model instead.
|
|
23
|
+
- Retail installs can plan, not just record. A new inventory area adds stock positions, demand history, supplier terms and replenishment policy, and answers what to order and when, rather than only recording what has already been sold.
|
|
24
|
+
|
|
12
25
|
## 2026-08-05 (0.1.566)
|
|
13
26
|
|
|
14
27
|
- Installing or upgrading Real Agent on a machine that also runs another Real Agent-family product no longer fails because a browser is in the way. Real Agent's browser-automation port was the one every browser tool picks by default when nothing tells it otherwise, so an assistant on the other product could take it and the install would stop rather than write over a port in use. Real Agent now uses a port outside that range.
|
|
@@ -86,3 +86,93 @@ op=startup-watch state=disposed
|
|
|
86
86
|
The first-run dialog is answered for the session, and the watcher that guards against an *unanswered* one drops what it saw before that answer. `bufferCleared=false` means the confirm fired and the drop did not, which is the shape that killed a resumed spawn on 2026-08-01: the answered dialog's own footer stayed in the buffer, the replayed transcript slid past it, and the spawn was blocked by a line the agent itself had written the day before.
|
|
87
87
|
|
|
88
88
|
Two standing audits reconcile that chain rather than waiting for someone to notice. `op=public-notify-reconcile` reports `routed` against `answered`, so a visitor routed to an agent that never replied shows as `answerGap`. `op=spawn-census` reports attempts against successes. A non-zero gap, or attempts with no successes, is a fault even when nothing has been reported.
|
|
89
|
+
|
|
90
|
+
## Delivery parity, and where its lines actually land
|
|
91
|
+
|
|
92
|
+
**The contract.** For any channel session, the set of answers delivered to the
|
|
93
|
+
chat equals the transcript's assistant `text` blocks **for turns that answered a
|
|
94
|
+
channel inbound**. An answer readable in the reader and absent from the chat is a
|
|
95
|
+
defect. Turns that answered no inbound — subagent side-chains, turns driven from
|
|
96
|
+
claude.ai — are deliberately outside that set: the credit guards are what keep
|
|
97
|
+
them out of a customer's chat.
|
|
98
|
+
|
|
99
|
+
Each door's `src/parity.test.ts` asserts the contract end to end against a real
|
|
100
|
+
JSONL and the real follower.
|
|
101
|
+
|
|
102
|
+
**Six discard sites, each now logged.** A follower outcome is dropped at:
|
|
103
|
+
|
|
104
|
+
| File | Guard | `reason=` |
|
|
105
|
+
|---|---|---|
|
|
106
|
+
| `telegram-channel/src/server.ts:241` | `pendingTurns <= 0` | `no-credit` |
|
|
107
|
+
| `webchat-channel/src/server.ts:378` | `pendingTurns <= 0` | `no-credit` |
|
|
108
|
+
| `whatsapp-channel/src/server.ts:481` | `pendingTurns <= 0` | `no-credit` |
|
|
109
|
+
| `whatsapp-channel/src/server.ts:489` | `consumedInbounds <= 0` | `no-consumed-inbound` |
|
|
110
|
+
| `whatsapp-channel/src/server.ts:617` | `pendingTurns <= 0` (2nd follower) | `no-credit` |
|
|
111
|
+
| `whatsapp-channel/src/server.ts:620` | `consumedInbounds <= 0` (2nd follower) | `no-consumed-inbound` |
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
[<door>-channel] op=turn-drop sessionId=… messageId=… finalBytes=… reason=…
|
|
115
|
+
[<door>-turn-census] op=census sessionId=… pending=… held=<0|1> heldMessageId=… heldAgeMs=… lastMessageId=…
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Any `op=turn-drop` with `finalBytes>0` is a lost answer. The census runs every
|
|
119
|
+
60 s per follower; `held=1` with `heldAgeMs` rising across ticks is a hold that
|
|
120
|
+
never resolved, and `pending` not returning to 0 with no inbound in flight is
|
|
121
|
+
credit drift.
|
|
122
|
+
|
|
123
|
+
**Read them in the right file.** Both lines are emitted by the *channel MCP
|
|
124
|
+
server*, whose stderr is teed to `${LOG_DIR}/mcp-<serverName>-<sessionId>.log`
|
|
125
|
+
(`claude-session-manager/src/channel-spawn-tee.ts`). They are **never** in
|
|
126
|
+
`server.log`, which carries the gateway-side half only — `op=turn-end`,
|
|
127
|
+
`op=turn-answer-absent`, `delivered=`. Grepping `server.log` for a drop returns
|
|
128
|
+
nothing and means nothing.
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
# the discard and the hold, per session
|
|
132
|
+
grep -E 'op=(turn-drop|census)' ~/.<brand>/logs/mcp-telegram-channel-*.log | tail -20
|
|
133
|
+
# the gateway's view of the same turn
|
|
134
|
+
grep -E 'op=(turn-end|turn-answer-absent)' ~/.<brand>/logs/server.log | grep <sessionId>
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**A seventh discard site, and the one nothing was reading.** An answer that
|
|
138
|
+
survived every guard above could still be produced and thrown away at the last
|
|
139
|
+
step, because the gateway resolved its destination from admin identity rather
|
|
140
|
+
than from the channel it came in on. A public visitor has no admin identity, so
|
|
141
|
+
the resolver returned no target: nothing was attempted, no transport failed, and
|
|
142
|
+
the line read `reached=none notReached=none`.
|
|
143
|
+
|
|
144
|
+
The turn-end body now carries the channel server's own spawn `role`, and that is
|
|
145
|
+
the only thing that decides the destination:
|
|
146
|
+
|
|
147
|
+
| `role=` | Where the answer goes | `op=fan-out` |
|
|
148
|
+
|---|---|---|
|
|
149
|
+
| `public` | every segment through the posting key's own transport; no identity resolver, no registry read | never emitted |
|
|
150
|
+
| `admin` | every live door the person is reachable on, via `fanTargetsFor` | emitted |
|
|
151
|
+
| absent or unrecognised | nowhere. 400, plus one `op=turn-role-absent … evicted=<yes\|no>` | never emitted |
|
|
152
|
+
|
|
153
|
+
`op=turn-end` and `op=turn-strand-anomaly` both name the role, so no outcome is
|
|
154
|
+
unattributable.
|
|
155
|
+
|
|
156
|
+
A roleless POST has one cause: a channel server from a build predating the field,
|
|
157
|
+
still attached to a session that outlived the platform restart. It reconnects its
|
|
158
|
+
stream, so nothing respawns it, and left alone it would post roleless turn-ends for
|
|
159
|
+
the life of that session. `evicted=yes` says the gateway dropped its subscriber, so
|
|
160
|
+
the next inbound spawns a server on the current build: one turn is lost per session
|
|
161
|
+
rather than all of them. That turn's answer is deliberately not delivered to the
|
|
162
|
+
posting key, because doing so would restore the very fallback whose reachability hid
|
|
163
|
+
the original defect. The standing check is one line per door per minute, over a
|
|
164
|
+
rolling hour:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
# the standing read; any undeliveredPublic>0 is a failure
|
|
168
|
+
grep -E 'op=census' ~/.<brand>/logs/server.log | grep delivery-census | tail -5
|
|
169
|
+
# a visitor's answer that reached nobody, or a turn-end that named no role
|
|
170
|
+
grep -E 'op=(turn-role-absent|turn-strand-anomaly)' ~/.<brand>/logs/server.log | tail -20
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
`[<door>-delivery-census] op=census windowMin=60 turnEnds=… record=… none=…
|
|
174
|
+
undelivered=… undeliveredPublic=… undeliveredAdmin=… roleAbsent=…`. Healthy is
|
|
175
|
+
`undeliveredPublic=0 roleAbsent=0` with `record` tracking `turnEnds` minus
|
|
176
|
+
`none`. A door with no turn-end in the hour emits nothing; the
|
|
177
|
+
`op=arm name=channel-delivery-census` line at boot is what separates that from a
|
|
178
|
+
census that is not running.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "inventory",
|
|
3
|
+
"description": "Retail replenishment planning. Records measured stock and observed demand at a product-plus-location grain, holds supplier lead times and service-level policy, and computes what to reorder rather than storing it. Provides inventory-stock-record, inventory-demand-record, inventory-policy-set, inventory-supplier-terms-set, inventory-forecast, inventory-replenish-plan, inventory-purchase-order-record.",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Rubytech LLC"
|
|
7
|
+
},
|
|
8
|
+
"mcpServers": {
|
|
9
|
+
"inventory": {
|
|
10
|
+
"type": "stdio",
|
|
11
|
+
"command": "node",
|
|
12
|
+
"args": [
|
|
13
|
+
"${CLAUDE_PLUGIN_ROOT}/lib/mcp-spawn-tee/index.js",
|
|
14
|
+
"${CLAUDE_PLUGIN_ROOT}/mcp/dist/index.js"
|
|
15
|
+
],
|
|
16
|
+
"env": {
|
|
17
|
+
"MCP_SPAWN_TEE_NAME": "inventory"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: inventory
|
|
3
|
+
description: "Retail replenishment planning. Records measured stock and observed demand at a product-plus-location grain, holds supplier lead times and service-level policy, and computes what to reorder rather than storing it. Provides inventory-stock-record, inventory-demand-record, inventory-policy-set, inventory-supplier-terms-set, inventory-forecast, inventory-replenish-plan, inventory-purchase-order-record."
|
|
4
|
+
tools:
|
|
5
|
+
- name: inventory-stock-record
|
|
6
|
+
publicAllowlist: false
|
|
7
|
+
adminAllowlist: true
|
|
8
|
+
riskClass: write_local
|
|
9
|
+
- name: inventory-demand-record
|
|
10
|
+
publicAllowlist: false
|
|
11
|
+
adminAllowlist: true
|
|
12
|
+
riskClass: write_local
|
|
13
|
+
- name: inventory-policy-set
|
|
14
|
+
publicAllowlist: false
|
|
15
|
+
adminAllowlist: true
|
|
16
|
+
riskClass: write_local
|
|
17
|
+
- name: inventory-supplier-terms-set
|
|
18
|
+
publicAllowlist: false
|
|
19
|
+
adminAllowlist: true
|
|
20
|
+
riskClass: write_local
|
|
21
|
+
- name: inventory-forecast
|
|
22
|
+
publicAllowlist: false
|
|
23
|
+
adminAllowlist: true
|
|
24
|
+
riskClass: read
|
|
25
|
+
- name: inventory-replenish-plan
|
|
26
|
+
publicAllowlist: false
|
|
27
|
+
adminAllowlist: true
|
|
28
|
+
riskClass: read
|
|
29
|
+
- name: inventory-purchase-order-record
|
|
30
|
+
publicAllowlist: false
|
|
31
|
+
adminAllowlist: true
|
|
32
|
+
riskClass: write_local
|
|
33
|
+
always: false
|
|
34
|
+
embed: false
|
|
35
|
+
metadata: {"platform":{}}
|
|
36
|
+
mcp:
|
|
37
|
+
command: node
|
|
38
|
+
args:
|
|
39
|
+
- ${PLATFORM_ROOT}/lib/mcp-spawn-tee/dist/index.js
|
|
40
|
+
- ${PLATFORM_ROOT}/plugins/inventory/mcp/dist/index.js
|
|
41
|
+
env:
|
|
42
|
+
MCP_SPAWN_TEE_NAME: inventory
|
|
43
|
+
LOG_DIR: ${LOG_DIR}
|
|
44
|
+
PLATFORM_ROOT: ${PLATFORM_ROOT}
|
|
45
|
+
ACCOUNT_ID: ${ACCOUNT_ID}
|
|
46
|
+
SESSION_ID: ${SESSION_ID}
|
|
47
|
+
AGENT_SLUG: ${AGENT_SLUG}
|
|
48
|
+
mcp-manifest: auto
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
# Inventory
|
|
52
|
+
|
|
53
|
+
Replenishment planning for a retail account. Admin agent only.
|
|
54
|
+
|
|
55
|
+
Load `platform/plugins/memory/references/schema-retail.md` before writing: this plugin's nodes are declared there.
|
|
56
|
+
|
|
57
|
+
## Nothing it recommends is stored
|
|
58
|
+
|
|
59
|
+
The forecast and the reorder point are computed from recorded facts on every call. There is no `Forecast` node and no stored plan.
|
|
60
|
+
|
|
61
|
+
A stored recommendation drifts the moment stock moves by a path that forgets to update it, and nothing fails when it does: the plan simply reports a number that no longer reconciles against the positions it was computed from. A computed figure cannot disagree with the data it is computed from.
|
|
62
|
+
|
|
63
|
+
## The planning grain is a product at a location
|
|
64
|
+
|
|
65
|
+
Stock lives on `:StockPosition`, keyed on product plus location, not on `Product.stockLevel`. A retailer with a shop and a warehouse can say how much sits where; a single-site seller simply has one location.
|
|
66
|
+
|
|
67
|
+
No tool here reads `Product.stockLevel`.
|
|
68
|
+
|
|
69
|
+
## Nothing is defaulted
|
|
70
|
+
|
|
71
|
+
A line that cannot be computed, because the supplier has no lead time, the product has no policy, or there is no demand history, comes back named as skipped with the missing input. It is never computed from a substituted value: a default service level or a guessed lead time produces a confident, wrong order quantity, which is worse than no answer.
|
|
72
|
+
|
|
73
|
+
## Data age is returned, not assumed
|
|
74
|
+
|
|
75
|
+
Stock arrives by upload, so it is stale by construction. `inventory-replenish-plan` returns the oldest and newest `asOf` it actually read. Report that age to the operator as a fact from the tool rather than assuming the data is current.
|