@rubytech/create-maxy-code 0.1.411 → 0.1.414
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__/installer-cwd-pin-and-auth-verify.test.js +82 -0
- package/dist/index.js +44 -5
- package/package.json +1 -1
- package/payload/platform/lib/account-scope/dist/index.d.ts +27 -0
- package/payload/platform/lib/account-scope/dist/index.d.ts.map +1 -0
- package/payload/platform/lib/account-scope/dist/index.js +33 -0
- package/payload/platform/lib/account-scope/dist/index.js.map +1 -0
- package/payload/platform/lib/account-scope/src/index.ts +43 -0
- package/payload/platform/lib/account-scope/tsconfig.json +5 -0
- package/payload/platform/package.json +2 -2
- 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/skills/platform-architecture/SKILL.md +37 -1
- package/payload/platform/plugins/business-assistant/skills/e-sign/SKILL.md +2 -0
- package/payload/platform/plugins/docs/references/cross-account-authority.md +25 -0
- package/payload/platform/plugins/docs/references/memory-guide.md +6 -0
- package/payload/platform/plugins/filesystem/.claude-plugin/plugin.json +21 -0
- package/payload/platform/plugins/filesystem/PLUGIN.md +63 -0
- package/payload/platform/plugins/filesystem/lib/mcp-spawn-tee/index.js +193 -0
- package/payload/platform/plugins/filesystem/lib/mcp-spawn-tee/package.json +3 -0
- package/payload/platform/plugins/filesystem/mcp/dist/index.d.ts +2 -0
- package/payload/platform/plugins/filesystem/mcp/dist/index.d.ts.map +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/index.js +91 -0
- package/payload/platform/plugins/filesystem/mcp/dist/index.js.map +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/scope.test.d.ts +2 -0
- package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/scope.test.d.ts.map +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/scope.test.js +89 -0
- package/payload/platform/plugins/filesystem/mcp/dist/lib/__tests__/scope.test.js.map +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/lib/result.d.ts +12 -0
- package/payload/platform/plugins/filesystem/mcp/dist/lib/result.d.ts.map +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/lib/result.js +6 -0
- package/payload/platform/plugins/filesystem/mcp/dist/lib/result.js.map +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/lib/scope.d.ts +45 -0
- package/payload/platform/plugins/filesystem/mcp/dist/lib/scope.d.ts.map +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/lib/scope.js +86 -0
- package/payload/platform/plugins/filesystem/mcp/dist/lib/scope.js.map +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/lib/walk.d.ts +11 -0
- package/payload/platform/plugins/filesystem/mcp/dist/lib/walk.d.ts.map +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/lib/walk.js +64 -0
- package/payload/platform/plugins/filesystem/mcp/dist/lib/walk.js.map +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/__tests__/handlers.test.d.ts +2 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/__tests__/handlers.test.d.ts.map +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/__tests__/handlers.test.js +94 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/__tests__/handlers.test.js.map +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-edit.d.ts +8 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-edit.d.ts.map +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-edit.js +40 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-edit.js.map +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-glob.d.ts +6 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-glob.d.ts.map +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-glob.js +13 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-glob.js.map +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-grep.d.ts +7 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-grep.d.ts.map +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-grep.js +71 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-grep.js.map +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-list.d.ts +6 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-list.d.ts.map +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-list.js +26 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-list.js.map +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-read.d.ts +6 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-read.d.ts.map +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-read.js +28 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-read.js.map +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-write.d.ts +7 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-write.d.ts.map +1 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-write.js +25 -0
- package/payload/platform/plugins/filesystem/mcp/dist/tools/file-write.js.map +1 -0
- package/payload/platform/plugins/filesystem/mcp/package.json +21 -0
- package/payload/platform/plugins/filesystem/mcp/vitest.config.ts +8 -0
- package/payload/platform/plugins/memory/PLUGIN.md +8 -0
- package/payload/platform/plugins/memory/mcp/dist/index-testable.d.ts +34 -0
- package/payload/platform/plugins/memory/mcp/dist/index-testable.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/index-testable.js +60 -0
- package/payload/platform/plugins/memory/mcp/dist/index-testable.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/index.js +327 -146
- package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/memory/mcp/dist/lib/resolve-owner-userid.d.ts +15 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/resolve-owner-userid.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/resolve-owner-userid.js +29 -0
- package/payload/platform/plugins/memory/mcp/dist/lib/resolve-owner-userid.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/cross-account.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/cross-account.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/cross-account.test.js +74 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/cross-account.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/resolve-owner-userid.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/resolve-owner-userid.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/resolve-owner-userid.test.js +40 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/resolve-owner-userid.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/resolve-tool-account.test.d.ts +2 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/resolve-tool-account.test.d.ts.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/resolve-tool-account.test.js +54 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/resolve-tool-account.test.js.map +1 -0
- package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.d.ts +11 -0
- 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 +13 -1
- package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.js.map +1 -1
- package/payload/platform/plugins/whatsapp/references/channels-whatsapp.md +2 -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 +7 -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/claude-host-creds.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/claude-host-creds.js +6 -1
- package/payload/platform/services/claude-session-manager/dist/claude-host-creds.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/claude-keychain-write.d.ts +7 -1
- package/payload/platform/services/claude-session-manager/dist/claude-keychain-write.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/claude-keychain-write.js +7 -2
- package/payload/platform/services/claude-session-manager/dist/claude-keychain-write.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/config.d.ts +37 -0
- package/payload/platform/services/claude-session-manager/dist/config.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/config.js +34 -1
- package/payload/platform/services/claude-session-manager/dist/config.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/cross-account-census.d.ts +34 -0
- package/payload/platform/services/claude-session-manager/dist/cross-account-census.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/cross-account-census.js +98 -0
- package/payload/platform/services/claude-session-manager/dist/cross-account-census.js.map +1 -0
- 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 +10 -0
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/index.js +17 -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.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +25 -0
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/session-sidecar.d.ts +7 -0
- package/payload/platform/services/claude-session-manager/dist/session-sidecar.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/session-sidecar.js +8 -0
- package/payload/platform/services/claude-session-manager/dist/session-sidecar.js.map +1 -1
- package/payload/server/{chunk-ZYS5V5QG.js → chunk-3Z5WE53X.js} +4 -0
- package/payload/server/maxy-edge.js +1 -1
- package/payload/server/public/assets/{AdminLoginScreens-BRQgI2lW.js → AdminLoginScreens-CYPTMmTk.js} +1 -1
- package/payload/server/public/assets/{AdminShell-By9n5icG.js → AdminShell-CZH_EZIy.js} +1 -1
- package/payload/server/public/assets/{Checkbox-DjEWgYu1.js → Checkbox-B0pbYJDQ.js} +1 -1
- package/payload/server/public/assets/{Transcript-BejWvOaO.js → Transcript-CYaAPBFX.js} +1 -1
- package/payload/server/public/assets/{admin-BFEMryQm.js → admin-BKDMSRto.js} +1 -1
- package/payload/server/public/assets/{browser-CMJMEUz6.js → browser-CxeMDDZA.js} +1 -1
- package/payload/server/public/assets/{calendar-C6ZGlHEP.js → calendar-DiIiTY9-.js} +1 -1
- package/payload/server/public/assets/chat-C56Oqvt1.js +1 -0
- package/payload/server/public/assets/chevron-left-Da-iZGi_.js +1 -0
- package/payload/server/public/assets/data-ZUdT44Ba.js +1 -0
- package/payload/server/public/assets/{graph-DIrXtPLv.js → graph-DC3dwnMZ.js} +1 -1
- package/payload/server/public/assets/{graph-labels-BtPf1Jom.js → graph-labels-Csnovm_c.js} +1 -1
- package/payload/server/public/assets/{maximize-2-DeJ4K8kL.js → maximize-2-WRUJsg5n.js} +1 -1
- package/payload/server/public/assets/{operator-B8QhqzLI.js → operator-BpzeHTAw.js} +1 -1
- package/payload/server/public/assets/{page-iFOy0dFx.js → page-8jJOxx6y.js} +1 -1
- package/payload/server/public/assets/{page-Df6KYkf4.js → page-IQDLdebG.js} +1 -1
- package/payload/server/public/assets/{public-BrUIRQZd.js → public-Dqg7jwjq.js} +1 -1
- package/payload/server/public/assets/{rotate-ccw-CYfntpwu.js → rotate-ccw-BayMWwfc.js} +1 -1
- package/payload/server/public/assets/{useSubAccountSwitcher-Cvnc_fwQ.css → useSubAccountSwitcher-CRZfyJXR.css} +1 -1
- package/payload/server/public/browser.html +4 -4
- package/payload/server/public/calendar.html +5 -5
- package/payload/server/public/chat.html +9 -9
- package/payload/server/public/data.html +8 -8
- package/payload/server/public/graph.html +9 -9
- package/payload/server/public/index.html +11 -11
- package/payload/server/public/operator.html +11 -11
- package/payload/server/public/public.html +9 -9
- package/payload/server/server.js +72 -15
- package/payload/server/public/assets/chat-B7s62Nnp.js +0 -1
- package/payload/server/public/assets/chevron-left-Dfjcaiyr.js +0 -1
- package/payload/server/public/assets/data-741ZbBwR.js +0 -1
- /package/payload/server/public/assets/{useSubAccountSwitcher-BK_KfOLC.js → useSubAccountSwitcher-C9aLg8yI.js} +0 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// Pure, side-effect-free cross-account seam for the memory MCP plugin.
|
|
2
|
+
//
|
|
3
|
+
// Split out of index.ts so unit tests can exercise the resolution + [xacct]
|
|
4
|
+
// logging without importing index.ts, which has stdio side effects at module
|
|
5
|
+
// load (stderr tee, MCP server construction, schema load that throws on a
|
|
6
|
+
// broken sidecar). Task 1455.
|
|
7
|
+
import { resolveEffectiveAccountCore } from "../../../../lib/account-scope/dist/index.js";
|
|
8
|
+
function errContent(text) {
|
|
9
|
+
return { content: [{ type: "text", text }], isError: true };
|
|
10
|
+
}
|
|
11
|
+
/** Preserve the exact wording of index.ts's `refuseNoAccount` so a metadata-only
|
|
12
|
+
* spawn (no ACCOUNT_ID) returns the same message it always has. */
|
|
13
|
+
function noAccountText(toolName) {
|
|
14
|
+
return (`${toolName} cannot execute: this MCP instance was launched without ACCOUNT_ID ` +
|
|
15
|
+
`(plugin-system metadata-only mode). Per-account graph access requires ACCOUNT_ID at spawn.`);
|
|
16
|
+
}
|
|
17
|
+
/** Operator-facing reject messages. Each CONTAINS its reject code so the
|
|
18
|
+
* reason is greppable and the agent sees why the call was refused. */
|
|
19
|
+
function rejectText(reason, target8) {
|
|
20
|
+
return reason === "cross-account-denied"
|
|
21
|
+
? `cross-account-denied: only a house-scoped admin session may set targetAccountId.`
|
|
22
|
+
: `cross-account-invalid-target: "${target8}…" is not a valid account on this install.`;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Build the per-tool account resolver. `accountId` / `houseScope` are the boot
|
|
26
|
+
* constants; `isValid` is injected (from `enumerateValidAccountIds(accountsDir)`
|
|
27
|
+
* in production, a stub in tests). Returns a closure the tool handlers call with
|
|
28
|
+
* their optional `targetAccountId`.
|
|
29
|
+
*
|
|
30
|
+
* Contract:
|
|
31
|
+
* - null boot `accountId` → refuse (no-account guard, unchanged behaviour).
|
|
32
|
+
* - no `targetAccountId` → own account, no `[xacct]` line (byte-identical).
|
|
33
|
+
* - `targetAccountId` set → resolve via the shared 1440 resolver, emit one
|
|
34
|
+
* `[xacct]` line, and on reject return the MCP error content.
|
|
35
|
+
* `houseScope=false decision=allow` cannot occur: a non-house session with a
|
|
36
|
+
* target is denied by the resolver before any allow path.
|
|
37
|
+
*/
|
|
38
|
+
export function makeResolveToolAccount(deps) {
|
|
39
|
+
const write = deps.log ?? ((l) => void process.stderr.write(l));
|
|
40
|
+
return (toolName, targetAccountId) => {
|
|
41
|
+
if (!deps.accountId) {
|
|
42
|
+
// Preserve the greppable no-account diagnostic the old refuseNoAccount wrote.
|
|
43
|
+
write(`[memory] tool=${toolName} refuse reason=no-account-context\n`);
|
|
44
|
+
return { reject: errContent(noAccountText(toolName)) };
|
|
45
|
+
}
|
|
46
|
+
const eff = resolveEffectiveAccountCore({ ownAccountId: deps.accountId, houseScope: deps.houseScope, targetAccountId }, deps.isValid);
|
|
47
|
+
if (targetAccountId) {
|
|
48
|
+
const decision = "reject" in eff ? "deny" : "allow";
|
|
49
|
+
const reason = "reject" in eff ? eff.reject : "ok";
|
|
50
|
+
write(`[xacct] op=call tool=${toolName} caller=${deps.accountId.slice(0, 8)} ` +
|
|
51
|
+
`target=${targetAccountId.slice(0, 8)} houseScope=${deps.houseScope ? "true" : "false"} ` +
|
|
52
|
+
`decision=${decision} reason=${reason}\n`);
|
|
53
|
+
}
|
|
54
|
+
if ("reject" in eff) {
|
|
55
|
+
return { reject: errContent(rejectText(eff.reject, (targetAccountId ?? "").slice(0, 8))) };
|
|
56
|
+
}
|
|
57
|
+
return { accountId: eff.accountId };
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=index-testable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-testable.js","sourceRoot":"","sources":["../src/index-testable.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,EAAE;AACF,4EAA4E;AAC5E,6EAA6E;AAC7E,0EAA0E;AAC1E,8BAA8B;AAC9B,OAAO,EAAE,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AAK1F,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAa,EAAE,CAAC;AAChF,CAAC;AAED;oEACoE;AACpE,SAAS,aAAa,CAAC,QAAgB;IACrC,OAAO,CACL,GAAG,QAAQ,qEAAqE;QAChF,4FAA4F,CAC7F,CAAC;AACJ,CAAC;AAED;uEACuE;AACvE,SAAS,UAAU,CAAC,MAA+D,EAAE,OAAe;IAClG,OAAO,MAAM,KAAK,sBAAsB;QACtC,CAAC,CAAC,kFAAkF;QACpF,CAAC,CAAC,kCAAkC,OAAO,4CAA4C,CAAC;AAC5F,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAKtC;IACC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,EAAE;QACnC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,8EAA8E;YAC9E,KAAK,CAAC,iBAAiB,QAAQ,qCAAqC,CAAC,CAAC;YACtE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACzD,CAAC;QACD,MAAM,GAAG,GAAG,2BAA2B,CACrC,EAAE,YAAY,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,eAAe,EAAE,EAC9E,IAAI,CAAC,OAAO,CACb,CAAC;QACF,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAG,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;YACpD,MAAM,MAAM,GAAG,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YACnD,KAAK,CACH,wBAAwB,QAAQ,WAAW,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;gBACtE,UAAU,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,eAAe,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,GAAG;gBACzF,YAAY,QAAQ,WAAW,MAAM,IAAI,CAC5C,CAAC;QACJ,CAAC;QACD,IAAI,QAAQ,IAAI,GAAG,EAAE,CAAC;YACpB,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7F,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;IACtC,CAAC,CAAC;AACJ,CAAC"}
|