openclaw-multi-auto 1.7.8 → 1.8.0

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.
Files changed (86) hide show
  1. package/dist/build-info.json +3 -3
  2. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  3. package/dist/plugin-sdk/{audio-preflight-CVWl4NKo.js → audio-preflight-yyFn-I5K.js} +12 -12
  4. package/dist/plugin-sdk/{audit-membership-runtime-D1VvFm38.js → audit-membership-runtime-DHo6vLy0.js} +5 -5
  5. package/dist/plugin-sdk/{auth-profiles.runtime-Cy2e2Wah.js → auth-profiles.runtime-DN3bNNeo.js} +12 -12
  6. package/dist/plugin-sdk/{bluebubbles-B_tcmPhi.js → bluebubbles-BPDNQxEz.js} +1 -1
  7. package/dist/plugin-sdk/bluebubbles.js +15 -15
  8. package/dist/plugin-sdk/{channel-access-GDk6vyOi.js → channel-access-BaZDvsTA.js} +1 -1
  9. package/dist/plugin-sdk/{channel-access-configure-CerQrsyV.js → channel-access-configure-DLZc22_m.js} +1 -1
  10. package/dist/plugin-sdk/{channel-config-helpers-CX9AfjCJ.js → channel-config-helpers-CFkTEzkz.js} +3 -3
  11. package/dist/plugin-sdk/{compact.runtime-0XuiRVw-.js → compact.runtime-D1HfZ8IJ.js} +12 -12
  12. package/dist/plugin-sdk/compat.js +28 -28
  13. package/dist/plugin-sdk/core.js +14 -14
  14. package/dist/plugin-sdk/{deliver-runtime-D37pd8wU.js → deliver-runtime-DrD2s_GI.js} +12 -12
  15. package/dist/plugin-sdk/device-pair.js +5 -5
  16. package/dist/plugin-sdk/diagnostics-otel.js +2 -2
  17. package/dist/plugin-sdk/{discord-dU71XVvQ.js → discord-BZR9M1Ft.js} +4 -4
  18. package/dist/plugin-sdk/discord.js +16 -16
  19. package/dist/plugin-sdk/{exec-88qB5pUO.js → exec-BvTkR9oI.js} +2 -2
  20. package/dist/plugin-sdk/feishu.js +14 -14
  21. package/dist/plugin-sdk/{fetch-guard-DEyOIg88.js → fetch-guard-Cwx1pJhf.js} +1 -1
  22. package/dist/plugin-sdk/{fetch-Cqwcg-Kq.js → fetch-yk-axchG.js} +2 -2
  23. package/dist/plugin-sdk/google-gemini-cli-auth.js +4 -4
  24. package/dist/plugin-sdk/googlechat.js +14 -14
  25. package/dist/plugin-sdk/{helpers-zm9M-XCJ.js → helpers-Cj2lgcNt.js} +1 -1
  26. package/dist/plugin-sdk/{http-registry-CR-l0QpT.js → http-registry-DyBqqyPO.js} +2 -2
  27. package/dist/plugin-sdk/{image-runtime-CSZNFoHc.js → image-runtime-ChtfQsK-.js} +12 -12
  28. package/dist/plugin-sdk/{imessage-DvtFTwJr.js → imessage-DtibPuZP.js} +3 -3
  29. package/dist/plugin-sdk/imessage.js +14 -14
  30. package/dist/plugin-sdk/{inbound-reply-dispatch-DpGprwTU.js → inbound-reply-dispatch-CfNEV0ZG.js} +1 -1
  31. package/dist/plugin-sdk/index.js +28 -28
  32. package/dist/plugin-sdk/irc.js +15 -15
  33. package/dist/plugin-sdk/{logger-D-go2oXy.js → logger-C9fkmDdb.js} +2 -2
  34. package/dist/plugin-sdk/{logger-Jt8cCPPV.js → logger-DXnvMlr-.js} +2 -2
  35. package/dist/plugin-sdk/{login-CnT14vQ1.js → login-BC7QDpvj.js} +5 -5
  36. package/dist/plugin-sdk/{login-qr-Di9Gqms7.js → login-qr-rnZFcwNs.js} +13 -13
  37. package/dist/plugin-sdk/{manager-runtime-DzCE2bL1.js → manager-runtime-B8O--3Jt.js} +12 -12
  38. package/dist/plugin-sdk/{manager.runtime-D6nT5fqn.js → manager.runtime-U_d65Qv1.js} +18 -18
  39. package/dist/plugin-sdk/matrix.js +16 -16
  40. package/dist/plugin-sdk/mattermost.js +14 -14
  41. package/dist/plugin-sdk/msteams.js +16 -16
  42. package/dist/plugin-sdk/nextcloud-talk.js +15 -15
  43. package/dist/plugin-sdk/nostr.js +4 -4
  44. package/dist/plugin-sdk/{outbound-media-CN8bsq-T.js → outbound-media-DWtG1X8J.js} +1 -1
  45. package/dist/plugin-sdk/{persistent-dedupe-CjCe_L5g.js → persistent-dedupe-BroxGf3Q.js} +1 -1
  46. package/dist/plugin-sdk/{pi-model-discovery-runtime-1vkd_hCn.js → pi-model-discovery-runtime-DWyENOD9.js} +12 -12
  47. package/dist/plugin-sdk/{pi-tools.before-tool-call.runtime-D0XEYwCa.js → pi-tools.before-tool-call.runtime-CPBeYJY2.js} +12 -12
  48. package/dist/plugin-sdk/{pw-ai-DkDE5awL.js → pw-ai-DR8Hjs-J.js} +12 -12
  49. package/dist/plugin-sdk/{qmd-manager-CguAGtaF.js → qmd-manager-3qRPZ5ye.js} +7 -7
  50. package/dist/plugin-sdk/{query-expansion-ChYs46vb.js → query-expansion-BnFYorqr.js} +5 -5
  51. package/dist/plugin-sdk/{redact-CqHkGWow.js → redact-DTcVTGFU.js} +1 -1
  52. package/dist/plugin-sdk/{run-command-nYfMDZC3.js → run-command-qzkvaQG1.js} +1 -1
  53. package/dist/plugin-sdk/runtime-whatsapp-login.runtime-BDbgMnYK.js +24 -0
  54. package/dist/plugin-sdk/runtime-whatsapp-outbound.runtime-BYZKJw25.js +23 -0
  55. package/dist/plugin-sdk/{send-BDZssl9O.js → send-BZgg6N38.js} +5 -5
  56. package/dist/plugin-sdk/{session-DPhL1rLb.js → session-Dm0FT_vI.js} +5 -5
  57. package/dist/plugin-sdk/{signal-BKMAyRnz.js → signal-Dy_XjHKL.js} +6 -6
  58. package/dist/plugin-sdk/signal.js +14 -14
  59. package/dist/plugin-sdk/{slack-jues0BBq.js → slack-DNwpGTSd.js} +3 -3
  60. package/dist/plugin-sdk/slack.js +16 -16
  61. package/dist/plugin-sdk/{slash-commands.runtime-BJ6veGjC.js → slash-commands.runtime-Bn7T59g3.js} +12 -12
  62. package/dist/plugin-sdk/{slash-dispatch.runtime-CyWyh0DI.js → slash-dispatch.runtime-BPsvStS0.js} +12 -12
  63. package/dist/plugin-sdk/{slash-skill-commands.runtime-BiDqNceZ.js → slash-skill-commands.runtime-TDVZ7jxr.js} +12 -12
  64. package/dist/plugin-sdk/{subagent-registry-runtime-BVsFNLUF.js → subagent-registry-runtime-D3DovVGQ.js} +12 -12
  65. package/dist/plugin-sdk/{subsystem-DOh66yR6.js → subsystem-DXcqLSNd.js} +1 -1
  66. package/dist/plugin-sdk/synology-chat.js +4 -4
  67. package/dist/plugin-sdk/{telegram-D3JLaXTI.js → telegram-B1RGxv8p.js} +4 -4
  68. package/dist/plugin-sdk/telegram.js +14 -14
  69. package/dist/plugin-sdk/{text-chunking-Bd2LMKfE.js → text-chunking-CaqMErUv.js} +1 -1
  70. package/dist/plugin-sdk/{thread-bindings-Cc59nx4d.js → thread-bindings-Bp_o0GHR.js} +48 -48
  71. package/dist/plugin-sdk/tlon.js +13 -13
  72. package/dist/plugin-sdk/twitch.js +14 -14
  73. package/dist/plugin-sdk/{utils-BhiRkVxe.js → utils-BQpbGej3.js} +1 -1
  74. package/dist/plugin-sdk/{vllm-setup-R5M9rOvm.js → vllm-setup-wjrX_svM.js} +2 -2
  75. package/dist/plugin-sdk/voice-call.js +12 -12
  76. package/dist/plugin-sdk/{web-BpHTS6sG.js → web-Dz6AjTQn.js} +16 -16
  77. package/dist/plugin-sdk/{webhook-targets-t3fxeJQf.js → webhook-targets-yTQuv0k1.js} +1 -1
  78. package/dist/plugin-sdk/{whatsapp-actions-BAJ27s8B.js → whatsapp-actions-C5SohPL-.js} +13 -13
  79. package/dist/plugin-sdk/{whatsapp-heartbeat-D6NF4OC0.js → whatsapp-heartbeat-_Kw4PPKA.js} +3 -3
  80. package/dist/plugin-sdk/whatsapp.js +13 -13
  81. package/dist/plugin-sdk/zalo.js +15 -15
  82. package/dist/plugin-sdk/zalouser.js +16 -16
  83. package/package.json +1 -1
  84. package/scripts/create-instance.sh +49 -181
  85. package/dist/plugin-sdk/runtime-whatsapp-login.runtime-UvsfFa7Q.js +0 -24
  86. package/dist/plugin-sdk/runtime-whatsapp-outbound.runtime-CYBj8E4x.js +0 -23
@@ -1,28 +1,28 @@
1
1
  import { g as normalizeAccountId, h as DEFAULT_ACCOUNT_ID } from "./session-key-CbP51u9x.js";
2
- import { _ as formatPairingApproveHint, a as formatWhatsAppConfigAllowFromEntries, d as resolveWhatsAppConfigDefaultTo, u as resolveWhatsAppConfigAllowFrom } from "./channel-config-helpers-CX9AfjCJ.js";
3
- import { Ia as createWhatsAppOutboundBase, La as resolveWhatsAppGroupIntroHint, Oa as listWhatsAppDirectoryGroupsFromConfig, Ra as resolveWhatsAppMentionStripPatterns, ka as listWhatsAppDirectoryPeersFromConfig, no as resolveWhatsAppGroupToolPolicy, or as createActionGate, s as WhatsAppConfigSchema, to as resolveWhatsAppGroupRequireMention, ur as readStringParam, xs as getChatChannelMeta, za as resolveWhatsAppOutboundTarget } from "./thread-bindings-Cc59nx4d.js";
2
+ import { _ as formatPairingApproveHint, a as formatWhatsAppConfigAllowFromEntries, d as resolveWhatsAppConfigDefaultTo, u as resolveWhatsAppConfigAllowFrom } from "./channel-config-helpers-CFkTEzkz.js";
3
+ import { Ia as createWhatsAppOutboundBase, La as resolveWhatsAppGroupIntroHint, Oa as listWhatsAppDirectoryGroupsFromConfig, Ra as resolveWhatsAppMentionStripPatterns, ka as listWhatsAppDirectoryPeersFromConfig, no as resolveWhatsAppGroupToolPolicy, or as createActionGate, s as WhatsAppConfigSchema, to as resolveWhatsAppGroupRequireMention, ur as readStringParam, xs as getChatChannelMeta, za as resolveWhatsAppOutboundTarget } from "./thread-bindings-Bp_o0GHR.js";
4
4
  import "./paths-WR8OhEmw.js";
5
5
  import "./github-copilot-token-BGYH4ltJ.js";
6
- import "./logger-D-go2oXy.js";
6
+ import "./logger-C9fkmDdb.js";
7
7
  import "./tmp-openclaw-dir-DRPiOszV.js";
8
- import "./subsystem-DOh66yR6.js";
9
- import { d as normalizeE164 } from "./utils-BhiRkVxe.js";
10
- import "./fetch-Cqwcg-Kq.js";
11
- import "./exec-88qB5pUO.js";
8
+ import "./subsystem-DXcqLSNd.js";
9
+ import { d as normalizeE164 } from "./utils-BQpbGej3.js";
10
+ import "./fetch-yk-axchG.js";
11
+ import "./exec-BvTkR9oI.js";
12
12
  import "./thinking-B2k7q5lY.js";
13
- import "./query-expansion-ChYs46vb.js";
14
- import "./logger-Jt8cCPPV.js";
13
+ import "./query-expansion-BnFYorqr.js";
14
+ import "./logger-DXnvMlr-.js";
15
15
  import "./zod-schema.core-GWl_s9xp.js";
16
- import "./redact-CqHkGWow.js";
17
- import "./http-registry-CR-l0QpT.js";
16
+ import "./redact-DTcVTGFU.js";
17
+ import "./http-registry-DyBqqyPO.js";
18
18
  import "./pairing-token-BwgaSu88.js";
19
19
  import "./ssrf-Dlo7BZU6.js";
20
- import "./fetch-guard-DEyOIg88.js";
20
+ import "./fetch-guard-Cwx1pJhf.js";
21
21
  import { i as resolveDefaultGroupPolicy, r as resolveAllowlistProviderRuntimeGroupPolicy } from "./runtime-group-policy-CDs_9_tb.js";
22
22
  import "./registry-N-tffRct.js";
23
23
  import "./http-body-CLS7yD5S.js";
24
24
  import { t as emptyPluginConfigSchema } from "./config-schema-D85tZOYm.js";
25
25
  import { r as migrateBaseNameToDefaultAccount, t as applyAccountNameToChannelSection } from "./setup-helpers-B1M39J3a.js";
26
26
  import { i as buildChannelConfigSchema } from "./config-schema-BPehl1ON.js";
27
- import { t as resolveWhatsAppHeartbeatRecipients } from "./whatsapp-heartbeat-D6NF4OC0.js";
27
+ import { t as resolveWhatsAppHeartbeatRecipients } from "./whatsapp-heartbeat-_Kw4PPKA.js";
28
28
  export { DEFAULT_ACCOUNT_ID, WhatsAppConfigSchema, applyAccountNameToChannelSection, buildChannelConfigSchema, createActionGate, createWhatsAppOutboundBase, emptyPluginConfigSchema, formatPairingApproveHint, formatWhatsAppConfigAllowFromEntries, getChatChannelMeta, listWhatsAppDirectoryGroupsFromConfig, listWhatsAppDirectoryPeersFromConfig, migrateBaseNameToDefaultAccount, normalizeAccountId, normalizeE164, readStringParam, resolveAllowlistProviderRuntimeGroupPolicy, resolveDefaultGroupPolicy, resolveWhatsAppConfigAllowFrom, resolveWhatsAppConfigDefaultTo, resolveWhatsAppGroupIntroHint, resolveWhatsAppGroupRequireMention, resolveWhatsAppGroupToolPolicy, resolveWhatsAppHeartbeatRecipients, resolveWhatsAppMentionStripPatterns, resolveWhatsAppOutboundTarget };
@@ -1,34 +1,34 @@
1
1
  import { g as normalizeAccountId, h as DEFAULT_ACCOUNT_ID } from "./session-key-CbP51u9x.js";
2
- import { B as createAccountListHelpers, _ as formatPairingApproveHint } from "./channel-config-helpers-CX9AfjCJ.js";
3
- import { Cn as createDedupeCache, L as waitForAbortSignal, P as extractToolSend, Pa as listDirectoryUserEntriesFromAllowFrom, Q as issuePairingChallenge, at as createReplyPrefixOptions, bs as resolveClientIp, ct as logTypingFailure, nt as createTypingCallbacks, oi as evaluateSenderGroupAccess, oo as isNormalizedSenderAllowed, ro as formatAllowFromLowercase, sr as jsonResult, ur as readStringParam } from "./thread-bindings-Cc59nx4d.js";
2
+ import { B as createAccountListHelpers, _ as formatPairingApproveHint } from "./channel-config-helpers-CFkTEzkz.js";
3
+ import { Cn as createDedupeCache, L as waitForAbortSignal, P as extractToolSend, Pa as listDirectoryUserEntriesFromAllowFrom, Q as issuePairingChallenge, at as createReplyPrefixOptions, bs as resolveClientIp, ct as logTypingFailure, nt as createTypingCallbacks, oi as evaluateSenderGroupAccess, oo as isNormalizedSenderAllowed, ro as formatAllowFromLowercase, sr as jsonResult, ur as readStringParam } from "./thread-bindings-Bp_o0GHR.js";
4
4
  import "./paths-WR8OhEmw.js";
5
5
  import "./github-copilot-token-BGYH4ltJ.js";
6
- import "./logger-D-go2oXy.js";
6
+ import "./logger-C9fkmDdb.js";
7
7
  import "./tmp-openclaw-dir-DRPiOszV.js";
8
- import "./subsystem-DOh66yR6.js";
9
- import "./utils-BhiRkVxe.js";
10
- import "./fetch-Cqwcg-Kq.js";
11
- import "./exec-88qB5pUO.js";
8
+ import "./subsystem-DXcqLSNd.js";
9
+ import "./utils-BQpbGej3.js";
10
+ import "./fetch-yk-axchG.js";
11
+ import "./exec-BvTkR9oI.js";
12
12
  import "./thinking-B2k7q5lY.js";
13
- import "./query-expansion-ChYs46vb.js";
14
- import "./logger-Jt8cCPPV.js";
13
+ import "./query-expansion-BnFYorqr.js";
14
+ import "./logger-DXnvMlr-.js";
15
15
  import { H as setAccountEnabledInConfigSection, V as deleteAccountFromConfigSection, at as normalizeSecretInputString, it as normalizeResolvedSecretInputString, m as MarkdownConfigSchema, tt as hasConfiguredSecretInput } from "./zod-schema.core-GWl_s9xp.js";
16
- import "./redact-CqHkGWow.js";
17
- import "./http-registry-CR-l0QpT.js";
16
+ import "./redact-DTcVTGFU.js";
17
+ import "./http-registry-DyBqqyPO.js";
18
18
  import "./pairing-token-BwgaSu88.js";
19
19
  import "./ssrf-Dlo7BZU6.js";
20
- import "./fetch-guard-DEyOIg88.js";
20
+ import "./fetch-guard-Cwx1pJhf.js";
21
21
  import { a as resolveOpenProviderRuntimeGroupPolicy, i as resolveDefaultGroupPolicy, s as warnMissingProviderGroupPolicyFallbackOnce } from "./runtime-group-policy-CDs_9_tb.js";
22
22
  import "./registry-N-tffRct.js";
23
23
  import "./http-body-CLS7yD5S.js";
24
24
  import { t as emptyPluginConfigSchema } from "./config-schema-D85tZOYm.js";
25
- import { c as resolveWebhookTargets, d as resolveWebhookPath, i as resolveSingleWebhookTarget, l as withResolvedWebhookRequestPipeline, n as registerWebhookTargetWithPluginRoute, s as resolveWebhookTargetWithAuthOrRejectSync, t as registerWebhookTarget } from "./webhook-targets-t3fxeJQf.js";
25
+ import { c as resolveWebhookTargets, d as resolveWebhookPath, i as resolveSingleWebhookTarget, l as withResolvedWebhookRequestPipeline, n as registerWebhookTargetWithPluginRoute, s as resolveWebhookTargetWithAuthOrRejectSync, t as registerWebhookTarget } from "./webhook-targets-yTQuv0k1.js";
26
26
  import { r as applyBasicWebhookRequestGuards, s as readJsonWebhookBodyOrReject } from "./webhook-request-guards-BSr2HYoW.js";
27
27
  import { o as buildTokenChannelStatusSummary, t as buildBaseAccountStatusSnapshot } from "./status-helpers-BZuLH1ue.js";
28
28
  import "./provider-env-vars-BJJqyIIb.js";
29
- import { C as setTopLevelChannelDmPolicyWithAllowFrom, _ as runSingleChannelSecretStep, h as resolveAccountIdForConfigure, i as mergeAllowFromEntries, m as promptSingleChannelSecretInput, r as buildSingleChannelSecretPromptState, t as addWildcardAllowFrom, u as promptAccountId } from "./helpers-zm9M-XCJ.js";
29
+ import { C as setTopLevelChannelDmPolicyWithAllowFrom, _ as runSingleChannelSecretStep, h as resolveAccountIdForConfigure, i as mergeAllowFromEntries, m as promptSingleChannelSecretInput, r as buildSingleChannelSecretPromptState, t as addWildcardAllowFrom, u as promptAccountId } from "./helpers-Cj2lgcNt.js";
30
30
  import { n as applySetupAccountConfigPatch, r as migrateBaseNameToDefaultAccount, t as applyAccountNameToChannelSection } from "./setup-helpers-B1M39J3a.js";
31
- import { a as resolveSenderCommandAuthorizationWithRuntime, n as resolveChannelAccountConfigBasePath, o as buildChannelSendResult, r as resolveDirectDmAuthorizationOutcome, t as chunkTextForOutbound } from "./text-chunking-Bd2LMKfE.js";
31
+ import { a as resolveSenderCommandAuthorizationWithRuntime, n as resolveChannelAccountConfigBasePath, o as buildChannelSendResult, r as resolveDirectDmAuthorizationOutcome, t as chunkTextForOutbound } from "./text-chunking-CaqMErUv.js";
32
32
  import { i as buildChannelConfigSchema } from "./config-schema-BPehl1ON.js";
33
33
  import { t as createScopedPairingAccess } from "./pairing-access-bXidxMna.js";
34
34
  import { r as resolveInboundRouteEnvelopeBuilderWithRuntime } from "./inbound-envelope-BxdUZQxb.js";
@@ -1,36 +1,36 @@
1
1
  import { g as normalizeAccountId, h as DEFAULT_ACCOUNT_ID } from "./session-key-CbP51u9x.js";
2
- import { B as createAccountListHelpers, _ as formatPairingApproveHint } from "./channel-config-helpers-CX9AfjCJ.js";
3
- import { J as summarizeMapping, Q as issuePairingChallenge, at as createReplyPrefixOptions, ci as resolveSenderScopedGroupPolicy, et as resolveMentionGatingWithBypass, h as ToolPolicySchema, ii as evaluateGroupRouteAccessForPolicy, nt as createTypingCallbacks, q as mergeAllowlist, ro as formatAllowFromLowercase, tt as isDangerousNameMatchingEnabled } from "./thread-bindings-Cc59nx4d.js";
2
+ import { B as createAccountListHelpers, _ as formatPairingApproveHint } from "./channel-config-helpers-CFkTEzkz.js";
3
+ import { J as summarizeMapping, Q as issuePairingChallenge, at as createReplyPrefixOptions, ci as resolveSenderScopedGroupPolicy, et as resolveMentionGatingWithBypass, h as ToolPolicySchema, ii as evaluateGroupRouteAccessForPolicy, nt as createTypingCallbacks, q as mergeAllowlist, ro as formatAllowFromLowercase, tt as isDangerousNameMatchingEnabled } from "./thread-bindings-Bp_o0GHR.js";
4
4
  import "./paths-WR8OhEmw.js";
5
5
  import "./github-copilot-token-BGYH4ltJ.js";
6
- import "./logger-D-go2oXy.js";
6
+ import "./logger-C9fkmDdb.js";
7
7
  import { t as resolvePreferredOpenClawTmpDir } from "./tmp-openclaw-dir-DRPiOszV.js";
8
- import "./subsystem-DOh66yR6.js";
9
- import "./utils-BhiRkVxe.js";
10
- import "./fetch-Cqwcg-Kq.js";
11
- import "./exec-88qB5pUO.js";
8
+ import "./subsystem-DXcqLSNd.js";
9
+ import "./utils-BQpbGej3.js";
10
+ import "./fetch-yk-axchG.js";
11
+ import "./exec-BvTkR9oI.js";
12
12
  import "./thinking-B2k7q5lY.js";
13
- import "./query-expansion-ChYs46vb.js";
14
- import "./logger-Jt8cCPPV.js";
13
+ import "./query-expansion-BnFYorqr.js";
14
+ import "./logger-DXnvMlr-.js";
15
15
  import { H as setAccountEnabledInConfigSection, V as deleteAccountFromConfigSection, m as MarkdownConfigSchema } from "./zod-schema.core-GWl_s9xp.js";
16
- import "./redact-CqHkGWow.js";
17
- import "./http-registry-CR-l0QpT.js";
16
+ import "./redact-DTcVTGFU.js";
17
+ import "./http-registry-DyBqqyPO.js";
18
18
  import "./pairing-token-BwgaSu88.js";
19
19
  import "./ssrf-Dlo7BZU6.js";
20
- import "./fetch-guard-DEyOIg88.js";
20
+ import "./fetch-guard-Cwx1pJhf.js";
21
21
  import { a as resolveOpenProviderRuntimeGroupPolicy, i as resolveDefaultGroupPolicy, s as warnMissingProviderGroupPolicyFallbackOnce } from "./runtime-group-policy-CDs_9_tb.js";
22
22
  import "./registry-N-tffRct.js";
23
23
  import "./http-body-CLS7yD5S.js";
24
24
  import { t as emptyPluginConfigSchema } from "./config-schema-D85tZOYm.js";
25
25
  import { t as buildBaseAccountStatusSnapshot } from "./status-helpers-BZuLH1ue.js";
26
26
  import "./provider-env-vars-BJJqyIIb.js";
27
- import { C as setTopLevelChannelDmPolicyWithAllowFrom, h as resolveAccountIdForConfigure, i as mergeAllowFromEntries, t as addWildcardAllowFrom, u as promptAccountId } from "./helpers-zm9M-XCJ.js";
27
+ import { C as setTopLevelChannelDmPolicyWithAllowFrom, h as resolveAccountIdForConfigure, i as mergeAllowFromEntries, t as addWildcardAllowFrom, u as promptAccountId } from "./helpers-Cj2lgcNt.js";
28
28
  import { a as patchScopedAccountConfig, n as applySetupAccountConfigPatch, r as migrateBaseNameToDefaultAccount, t as applyAccountNameToChannelSection } from "./setup-helpers-B1M39J3a.js";
29
29
  import { t as formatResolvedUnresolvedNote } from "./resolution-notes-DLPPP3rA.js";
30
- import { i as resolveSenderCommandAuthorization, n as resolveChannelAccountConfigBasePath, o as buildChannelSendResult, t as chunkTextForOutbound } from "./text-chunking-Bd2LMKfE.js";
30
+ import { i as resolveSenderCommandAuthorization, n as resolveChannelAccountConfigBasePath, o as buildChannelSendResult, t as chunkTextForOutbound } from "./text-chunking-CaqMErUv.js";
31
31
  import { i as buildChannelConfigSchema } from "./config-schema-BPehl1ON.js";
32
32
  import { t as createScopedPairingAccess } from "./pairing-access-bXidxMna.js";
33
33
  import { a as resolveOutboundMediaUrls, o as sendMediaWithLeadingCaption, r as isNumericTargetId, s as sendPayloadWithChunkedTextAndMedia } from "./reply-payload-C0CJpM2K.js";
34
- import { t as loadOutboundMediaFromUrl } from "./outbound-media-CN8bsq-T.js";
35
- import { t as promptChannelAccessConfig } from "./channel-access-GDk6vyOi.js";
34
+ import { t as loadOutboundMediaFromUrl } from "./outbound-media-DWtG1X8J.js";
35
+ import { t as promptChannelAccessConfig } from "./channel-access-BaZDvsTA.js";
36
36
  export { DEFAULT_ACCOUNT_ID, MarkdownConfigSchema, ToolPolicySchema, addWildcardAllowFrom, applyAccountNameToChannelSection, applySetupAccountConfigPatch, buildBaseAccountStatusSnapshot, buildChannelConfigSchema, buildChannelSendResult, chunkTextForOutbound, createAccountListHelpers, createReplyPrefixOptions, createScopedPairingAccess, createTypingCallbacks, deleteAccountFromConfigSection, emptyPluginConfigSchema, evaluateGroupRouteAccessForPolicy, formatAllowFromLowercase, formatPairingApproveHint, formatResolvedUnresolvedNote, isDangerousNameMatchingEnabled, isNumericTargetId, issuePairingChallenge, loadOutboundMediaFromUrl, mergeAllowFromEntries, mergeAllowlist, migrateBaseNameToDefaultAccount, normalizeAccountId, patchScopedAccountConfig, promptAccountId, promptChannelAccessConfig, resolveAccountIdForConfigure, resolveChannelAccountConfigBasePath, resolveDefaultGroupPolicy, resolveMentionGatingWithBypass, resolveOpenProviderRuntimeGroupPolicy, resolveOutboundMediaUrls, resolvePreferredOpenClawTmpDir, resolveSenderCommandAuthorization, resolveSenderScopedGroupPolicy, sendMediaWithLeadingCaption, sendPayloadWithChunkedTextAndMedia, setAccountEnabledInConfigSection, setTopLevelChannelDmPolicyWithAllowFrom, summarizeMapping, warnMissingProviderGroupPolicyFallbackOnce };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openclaw-multi-auto",
3
- "version": "1.7.8",
3
+ "version": "1.8.0",
4
4
  "description": "Multi-channel AI gateway with extensible messaging integrations",
5
5
  "keywords": [],
6
6
  "homepage": "https://github.com/openclaw/openclaw#readme",
@@ -2,13 +2,6 @@
2
2
  # =================================================================
3
3
  # OpenClaw 深度集成初始化工具 (create-instance.sh)
4
4
  # 功能:创建实例目录、复制源码、安装依赖、配置模型、启动服务
5
- #
6
- # 架构说明:
7
- # - 源码位置: ~/openclaw-runtime/node_modules/openclaw-multi-auto
8
- # - 实例位置: ~/openclaws/实例名/
9
- # - 源码复制: ~/openclaws/实例名/dist (复制源码,不含 node_modules)
10
- # - 依赖安装: ~/openclaws/实例名/node_modules (pnpm 安装)
11
- # - 启动方式: ./start.sh (从 dist 目录启动,使用实例根目录的 node_modules)
12
5
  # =================================================================
13
6
 
14
7
  set -e
@@ -29,10 +22,7 @@ for cmd in node pnpm; do
29
22
  done
30
23
 
31
24
  # --- 1. 源码路径定位 ---
32
- # 默认源码路径:~/openclaw-runtime/node_modules/openclaw-multi-auto
33
25
  SOURCE_CODE="$HOME/openclaw-runtime/node_modules/openclaw-multi-auto"
34
-
35
- # 允许通过环境变量覆盖
36
26
  if [ -n "$OPENCLAW_SOURCE_DIR" ] && [ -d "$OPENCLAW_SOURCE_DIR" ]; then
37
27
  SOURCE_CODE="$OPENCLAW_SOURCE_DIR"
38
28
  echo -e "${BLUE}📂 使用环境变量指定的源码路径: $SOURCE_CODE${NC}"
@@ -41,21 +31,13 @@ else
41
31
  echo -e "${GREEN}✅ 找到本地源码路径: $SOURCE_CODE${NC}"
42
32
  else
43
33
  echo -e "${RED}❌ 错误: 未找到 OpenClaw 源码目录${NC}"
44
- echo -e "${YELLOW}源码路径: $SOURCE_CODE${NC}"
45
- echo -e "${YELLOW}请确认已正确安装 openclaw-multi-auto${NC}"
46
34
  exit 1
47
35
  fi
48
36
  fi
49
37
 
50
- # 实例基础目录:~/openclaws
38
+ # 实例基础目录
51
39
  INSTANCES_BASE="$HOME/openclaws"
52
40
 
53
- # 实例根目录
54
- INSTANCE_DIR="$INSTANCES_BASE/${INSTANCE_NAME}"
55
-
56
- # dist 目录:实例根目录(不使用子目录,避免 root-alias.cjs 路径解析问题)
57
- DIST_DIR="${INSTANCE_DIR}"
58
-
59
41
  # --- 2. 获取实例名称 ---
60
42
  INSTANCE_NAME="${1:-}"
61
43
  if [ -z "$INSTANCE_NAME" ]; then
@@ -73,16 +55,16 @@ fi
73
55
 
74
56
  # --- 4. 定义实例目录并清理旧残留 ---
75
57
  INSTANCE_DIR="$INSTANCES_BASE/${INSTANCE_NAME}"
58
+ DIST_DIR="${INSTANCE_DIR}" # 源码复制到实例根目录(根据您的脚本)
76
59
 
77
60
  echo -e "${BLUE}🏗️ 正在深度初始化实例: ${INSTANCE_NAME} (端口 ${PORT})${NC}"
78
- echo "SOURCE_CODE = $SOURCE_CODE"
79
61
 
80
62
  if [ -d "$INSTANCE_DIR" ]; then
81
63
  echo -e "${YELLOW}⚠️ 清理旧实例目录...${NC}"
82
64
  rm -rf "$INSTANCE_DIR"
83
65
  fi
84
66
 
85
- # 清理基础目录下可能遗留的 workspace 配置
67
+ # 清理可能遗留的 workspace 配置
86
68
  [ -d "${INSTANCES_BASE}/node_modules" ] && rm -rf "${INSTANCES_BASE}/node_modules"
87
69
  [ -f "${INSTANCES_BASE}/pnpm-workspace.yaml" ] && rm -f "${INSTANCES_BASE}/pnpm-workspace.yaml"
88
70
 
@@ -106,16 +88,6 @@ fi
106
88
 
107
89
  # --- 7. 核心代码同步 (从源码复制到实例根目录) ---
108
90
  echo -e "${BLUE}🔄 正在从源码复制文件到实例根目录...${NC}"
109
- echo -e "${YELLOW}源码路径: ${SOURCE_CODE}${NC}"
110
- echo -e "${YELLOW}目标路径: ${INSTANCE_DIR}${NC}"
111
-
112
- # 清理已存在的实例目录(如果存在)
113
- if [ -d "$INSTANCE_DIR" ]; then
114
- echo -e "${YELLOW}⚠️ 清理旧实例目录...${NC}"
115
- rm -rf "$INSTANCE_DIR"
116
- fi
117
-
118
- # 复制源码所有内容到实例根目录
119
91
  if cp -r "${SOURCE_CODE}/." "${INSTANCE_DIR}/"; then
120
92
  echo -e "${GREEN}✅ 源码复制成功${NC}"
121
93
  else
@@ -123,6 +95,13 @@ else
123
95
  exit 1
124
96
  fi
125
97
 
98
+ # 【关键修复】如果 config 是符号链接,则替换为普通目录
99
+ if [ -L "${INSTANCE_DIR}/config" ]; then
100
+ echo -e "${YELLOW}⚠️ 检测到 config 为符号链接,正在修复为普通目录...${NC}"
101
+ rm -f "${INSTANCE_DIR}/config"
102
+ mkdir -p "${INSTANCE_DIR}/config"
103
+ fi
104
+
126
105
  # 验证关键文件是否存在
127
106
  if [ ! -f "${INSTANCE_DIR}/package.json" ]; then
128
107
  echo -e "${RED}❌ 错误: 实例目录中未找到 package.json${NC}"
@@ -130,9 +109,7 @@ if [ ! -f "${INSTANCE_DIR}/package.json" ]; then
130
109
  fi
131
110
 
132
111
  # --- 依赖安装 ---
133
- # 注意:npm/pnpm 发布的包不包含 node_modules,需要在实例中安装
134
112
  echo -e "${BLUE}📦 正在安装依赖...${NC}"
135
-
136
113
  cd "${INSTANCE_DIR}"
137
114
 
138
115
  # 临时清理可能干扰的 workspace 配置
@@ -141,11 +118,9 @@ if [ -f "${INSTANCES_BASE}/pnpm-workspace.yaml" ]; then
141
118
  mv "${INSTANCES_BASE}/pnpm-workspace.yaml" "${INSTANCES_BASE}/pnpm-workspace.yaml.bak.$(date +%s)"
142
119
  fi
143
120
 
144
- # 设置 Sharp 镜像(国内加速)
145
121
  export SHARP_BINARY_HOST="https://npmmirror.com/mirrors/sharp"
146
122
  export SHARP_LIBVIPS_BINARY_HOST="https://npmmirror.com/mirrors/sharp-libvips"
147
123
 
148
- # 安装依赖(使用国内镜像)
149
124
  if ! pnpm install --shamefully-hoist --ignore-workspace --registry=https://registry.npmmirror.com --no-frozen-lockfile > .install.log 2>&1; then
150
125
  echo -e "${RED}❌ 依赖安装失败,请查看日志: ${INSTANCE_DIR}/.install.log${NC}"
151
126
  exit 1
@@ -157,22 +132,15 @@ if [ ! -d "node_modules" ]; then
157
132
  fi
158
133
  echo -e "${GREEN}✅ 依赖安装成功${NC}"
159
134
 
160
- # --- 安装扩展到实例根目录 ---
135
+ # --- 安装扩展 page-action-cache ---
161
136
  echo -e "${BLUE}📦 正在安装扩展 page-action-cache...${NC}"
162
-
163
- # 确保 extensions 目录存在
164
137
  mkdir -p "${INSTANCE_DIR}/extensions"
165
-
166
138
  cd "${INSTANCE_DIR}/extensions"
167
-
168
- # 下载 page-action-cache tarball 并解压到临时目录
169
139
  TEMP_EXT_DIR=$(mktemp -d)
170
140
  cd "$TEMP_EXT_DIR"
171
141
  if npm pack page-action-cache --registry=https://registry.npmmirror.com --quiet > /dev/null 2>&1; then
172
142
  TARBALL=$(ls *.tgz)
173
- # 解压到临时目录
174
143
  tar -xzf "$TARBALL"
175
- # 移动到 extensions/page-action-cache
176
144
  rm -rf "${INSTANCE_DIR}/extensions/page-action-cache"
177
145
  mv package "${INSTANCE_DIR}/extensions/page-action-cache"
178
146
  echo -e "${GREEN}✅ page-action-cache 安装成功${NC}"
@@ -180,8 +148,6 @@ else
180
148
  echo -e "${YELLOW}⚠️ page-action-cache 下载失败${NC}"
181
149
  fi
182
150
  rm -rf "$TEMP_EXT_DIR"
183
-
184
- # 返回实例根目录
185
151
  cd "${INSTANCE_DIR}"
186
152
 
187
153
  # --- 8. 参数与交互式获取 ---
@@ -206,9 +172,17 @@ if [ -z "$API_KEY" ]; then
206
172
  fi
207
173
 
208
174
  # --- 9. 生成深度配置文件 ---
209
- DEFAULT_MODEL="zai/glm-5"
210
- ZAI_KEY=""; DS_KEY=""; MX_KEY=""; KIMI_KEY=""; QWEN_KEY=""
175
+ # 【双重保障】再次确保 config 是普通目录且可写
176
+ if [ -e "${INSTANCE_DIR}/config" ] && [ ! -d "${INSTANCE_DIR}/config" ]; then
177
+ echo -e "${YELLOW}⚠️ 检测到 config 不是目录,正在修复...${NC}"
178
+ rm -f "${INSTANCE_DIR}/config"
179
+ fi
180
+ mkdir -p "${INSTANCE_DIR}/config"
181
+ touch "${INSTANCE_DIR}/config/.write_test" || { echo -e "${RED}❌ config 目录不可写${NC}"; exit 1; }
182
+ rm -f "${INSTANCE_DIR}/config/.write_test"
211
183
 
184
+ # 设置模型变量
185
+ ZAI_KEY=""; DS_KEY=""; MX_KEY=""; KIMI_KEY=""; QWEN_KEY=""
212
186
  case "$MODEL_PROVIDER" in
213
187
  zai) PRIMARY_MODEL="zai/glm-5"; ZAI_KEY="$API_KEY" ;;
214
188
  deepseek) PRIMARY_MODEL="deepseek/deepseek-chat"; DS_KEY="$API_KEY" ;;
@@ -235,72 +209,32 @@ cat > "${INSTANCE_DIR}/config/openclaw.json" << EOF
235
209
  "baseUrl": "https://open.bigmodel.cn/api/paas/v4",
236
210
  "apiKey": "${ZAI_KEY}",
237
211
  "api": "openai-completions",
238
- "models": [
239
- {
240
- "id": "glm-5",
241
- "name": "GLM-5",
242
- "input": ["text"],
243
- "contextWindow": 32768,
244
- "maxTokens": 4096
245
- }
246
- ]
212
+ "models": [{"id": "glm-5","name": "GLM-5","input": ["text"],"contextWindow": 32768,"maxTokens": 4096}]
247
213
  },
248
214
  "deepseek": {
249
215
  "baseUrl": "https://api.deepseek.com",
250
216
  "apiKey": "${DS_KEY}",
251
217
  "api": "openai-completions",
252
- "models": [
253
- {
254
- "id": "deepseek-chat",
255
- "name": "DeepSeek-Chat",
256
- "input": ["text"],
257
- "contextWindow": 32768,
258
- "maxTokens": 4096
259
- }
260
- ]
218
+ "models": [{"id": "deepseek-chat","name": "DeepSeek-Chat","input": ["text"],"contextWindow": 32768,"maxTokens": 4096}]
261
219
  },
262
220
  "minimax-cn": {
263
221
  "baseUrl": "https://api.minimax.chat/v1",
264
222
  "apiKey": "${MX_KEY}",
265
223
  "api": "openai-completions",
266
- "models": [
267
- {
268
- "id": "MiniMax-M2.5-highspeed",
269
- "name": "MiniMax-M2.5-highspeed",
270
- "input": ["text"],
271
- "cost": { "input": 0.000002, "output": 0.000006 },
272
- "contextWindow": 65536,
273
- "maxTokens": 8192
274
- }
275
- ]
224
+ "models": [{"id": "MiniMax-M2.5-highspeed","name": "MiniMax-M2.5-highspeed","input": ["text"],"cost": {"input": 2e-6,"output": 6e-6},"contextWindow": 65536,"maxTokens": 8192}]
276
225
  },
277
226
  "ollama": {
278
227
  "baseUrl": "http://127.0.0.1:11434",
279
228
  "api": "ollama",
280
- "models": [
281
- {
282
- "id": "qwen3-vl:8b",
283
- "name": "Qwen3-VL-8B",
284
- "input": ["text", "image"],
285
- "contextWindow": 32768,
286
- "maxTokens": 4096
287
- }
288
- ]
229
+ "models": [{"id": "qwen3-vl:8b","name": "Qwen3-VL-8B","input": ["text","image"],"contextWindow": 32768,"maxTokens": 4096}]
289
230
  }
290
231
  }
291
232
  },
292
233
  "agents": {
293
234
  "defaults": {
294
235
  "model": { "primary": "${PRIMARY_MODEL}" },
295
- "imageModel": {
296
- "primary": "ollama/qwen3-vl:8b",
297
- "fallbacks": [
298
- "ollama/qwen3-vl:8b"
299
- ]
300
- },
301
- "models": {
302
- "ollama/qwen3-vl:8b": {}
303
- },
236
+ "imageModel": { "primary": "ollama/qwen3-vl:8b", "fallbacks": ["ollama/qwen3-vl:8b"] },
237
+ "models": { "ollama/qwen3-vl:8b": {} },
304
238
  "workspace": "${INSTANCE_DIR}/workspace",
305
239
  "compaction": { "mode": "safeguard" }
306
240
  }
@@ -310,17 +244,14 @@ cat > "${INSTANCE_DIR}/config/openclaw.json" << EOF
310
244
  }
311
245
  EOF
312
246
 
313
- # --- 10. 预装可选技能 (失败不影响主流程) ---
247
+ # --- 10. 预装可选技能 ---
314
248
  echo -e "${BLUE}🤖 正在注入飞书运维机器人引导...${NC}"
315
249
  SKILLS_DIR="${INSTANCE_DIR}/workspace/skills"
316
250
  mkdir -p "$SKILLS_DIR"
317
-
318
251
  SKILL_PKG="jinyu-skill-feishu-config"
319
252
  REGISTRY="https://registry.npmmirror.com"
320
-
321
253
  TEMP_DIR=$(mktemp -d)
322
254
  cd "$TEMP_DIR"
323
-
324
255
  if npm pack "$SKILL_PKG@latest" --registry="$REGISTRY" --quiet > /dev/null; then
325
256
  TARBALL=$(ls *.tgz)
326
257
  mkdir -p "$SKILLS_DIR/feishu-config"
@@ -329,11 +260,10 @@ if npm pack "$SKILL_PKG@latest" --registry="$REGISTRY" --quiet > /dev/null; then
329
260
  else
330
261
  echo -e "${YELLOW}⚠️ 技能 feishu-config 下载失败,跳过(可手动安装)${NC}"
331
262
  fi
332
-
333
263
  cd - > /dev/null
334
264
  rm -rf "$TEMP_DIR"
335
265
 
336
- # --- 如果实例是 yunwei,安装角色包并初始化 workspace ---
266
+ # --- 如果实例是 yunwei,安装角色包 ---
337
267
  if [ "$INSTANCE_NAME" = "yunwei" ]; then
338
268
  echo -e "${BLUE}🛠️ 检测到运维实例,正在安装角色包 role-openclaw-yunwei...${NC}"
339
269
  TEMP_ROLE_DIR=$(mktemp -d)
@@ -342,22 +272,15 @@ if [ "$INSTANCE_NAME" = "yunwei" ]; then
342
272
  TARBALL=$(ls *.tgz)
343
273
  tar -xzf "$TARBALL" --strip-components=1
344
274
  rm "$TARBALL"
345
-
346
- # 1. 将 memory、skills 等目录复制到 workspace 根目录(排除 .md 文件)
347
275
  for item in *; do
348
276
  if [ -d "$item" ]; then
349
- # 目录(如 memory、skills)复制到 workspace
350
277
  cp -r "$item" "$INSTANCE_DIR/workspace/"
351
278
  elif [ -f "$item" ]; then
352
- # 非 .md 文件(如 package.json)也复制到 workspace
353
279
  cp "$item" "$INSTANCE_DIR/workspace/" 2>/dev/null || true
354
280
  fi
355
281
  done
356
-
357
- # 2. 创建实例根目录下的 docs 目录,并将所有 .md 文件复制过去
358
282
  mkdir -p "$INSTANCE_DIR/docs/reference/templates"
359
283
  cp *.md "$INSTANCE_DIR/docs/reference/templates/" 2>/dev/null || true
360
-
361
284
  echo -e "${GREEN}✅ 角色包安装完成,workspace 已初始化${NC}"
362
285
  else
363
286
  echo -e "${YELLOW}⚠️ 角色包下载失败,请检查网络或手动安装${NC}"
@@ -366,56 +289,35 @@ if [ "$INSTANCE_NAME" = "yunwei" ]; then
366
289
  rm -rf "$TEMP_ROLE_DIR"
367
290
  fi
368
291
 
369
- # --- 设置 profile 链接以便 openclaw --profile 使用 ---
370
- echo -e "${BLUE}🔗 配置 profile 链接以支持 --profile 命令行...${NC}"
292
+ # --- 设置 profile 链接 ---
293
+ echo -e "${BLUE}🔗 配置 profile 链接...${NC}"
371
294
  PROFILES_DIR="$HOME/.openclaw/profiles"
372
295
  mkdir -p "$PROFILES_DIR"
373
-
374
- # 配置文件软链接
375
296
  ln -sf "$INSTANCE_DIR/config/openclaw.json" "$PROFILES_DIR/$INSTANCE_NAME.json"
376
-
377
- # 状态目录软链接(profile 默认状态目录为 ~/.openclaw/profiles/<profile>/)
378
- # 使用 -sfn 以确保目录链接正确
379
297
  ln -sfn "$INSTANCE_DIR/state" "$PROFILES_DIR/$INSTANCE_NAME"
380
-
381
298
  echo -e "${GREEN}✅ 现在可以使用 'openclaw --profile $INSTANCE_NAME ...' 管理此实例${NC}"
382
299
 
383
- # --- 11. 生成增强型启动脚本 ---
300
+ # --- 11. 生成启动脚本 ---
384
301
  cat > "${INSTANCE_DIR}/start.sh" << 'EOF'
385
302
  #!/usr/bin/env bash
386
- # =================================================================
387
- # OpenClaw 实例启动脚本
388
- # 功能:从 dist 目录启动实例,支持网关、TUI 等多种模式
389
- # 源码位置:~/openclaws/实例名/dist
390
- # =================================================================
391
-
392
- # 获取脚本所在目录(实例根目录)
393
303
  SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
394
304
  INSTANCE_NAME=$(basename "$SCRIPT_DIR")
305
+ DIST_DIR="$SCRIPT_DIR"
395
306
 
396
- # 检查实例根目录中是否有关键文件
397
- if [ ! -f "$SCRIPT_DIR/package.json" ]; then
398
- echo -e "\033[0;31m❌ 错误: 实例目录中未找到 package.json\033[0m"
399
- echo -e "\033[1;33m请重新运行 create-instance.sh 脚本\033[0m"
307
+ if [ ! -f "$DIST_DIR/package.json" ]; then
308
+ echo -e "\033[0;31m❌ 错误: 未找到 package.json\033[0m"
400
309
  exit 1
401
310
  fi
402
-
403
- # 检查实例根目录中是否包含 node_modules(依赖已安装)
404
311
  if [ ! -d "$SCRIPT_DIR/node_modules" ]; then
405
- echo -e "\033[0;31m❌ 错误: 实例目录中未找到 node_modules\033[0m"
406
- echo -e "\033[1;33m请重新运行 create-instance.sh 脚本安装依赖\033[0m"
312
+ echo -e "\033[0;31m❌ 错误: 未找到 node_modules\033[0m"
407
313
  exit 1
408
314
  fi
409
315
 
410
- # 导出核心配置路径
411
316
  export OPENCLAW_CONFIG_PATH="$SCRIPT_DIR/config/openclaw.json"
412
317
  export OPENCLAW_TMP_DIR="$SCRIPT_DIR/tmp"
413
318
  export OPENCLAW_STATE_DIR="$SCRIPT_DIR/state"
414
-
415
- # 设置 NODE_PATH 以使用实例根目录下的 node_modules
416
319
  export NODE_PATH="$SCRIPT_DIR/node_modules:$NODE_PATH"
417
320
 
418
- # 从配置中提取 workspace 路径并导出
419
321
  if [ -f "$OPENCLAW_CONFIG_PATH" ]; then
420
322
  export OPENCLAW_WORKSPACE=$(node -e "
421
323
  const cfg = require('$OPENCLAW_CONFIG_PATH');
@@ -423,65 +325,37 @@ if [ -f "$OPENCLAW_CONFIG_PATH" ]; then
423
325
  ")
424
326
  fi
425
327
 
426
- # macOS launchd 守护配置(可选)
427
- if [[ "$OSTYPE" == "darwin"* ]]; then
428
- PLIST_LABEL="ai.openclaw.$INSTANCE_NAME"
429
- PLIST_PATH="$HOME/Library/LaunchAgents/$PLIST_LABEL.plist"
430
- if [ ! -f "$PLIST_PATH" ]; then
431
- cat > "$PLIST_PATH" <<EOP
432
- <?xml version="1.0" encoding="UTF-8"?>
433
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
434
- <plist version="1.0">
435
- <dict>
436
- <key>Label</key><string>$PLIST_LABEL</string>
437
- <key>ProgramArguments</key><array><string>/bin/bash</string><string>$SCRIPT_DIR/start.sh</string></array>
438
- <key>RunAtLoad</key><true/><key>KeepAlive</key><true/>
439
- <key>WorkingDirectory</key><string>$SCRIPT_DIR</string>
440
- </dict>
441
- </plist>
442
- EOP
443
- launchctl load "$PLIST_PATH" 2>/dev/null || true
444
- fi
445
- fi
446
-
447
- # 验证可执行文件是否存在
448
- if [ ! -f "$SCRIPT_DIR/dist/index.js" ]; then
449
- echo -e "\033[0;31m❌ 错误: 未找到可执行文件 $SCRIPT_DIR/dist/index.js\033[0m"
328
+ if [ ! -f "$DIST_DIR/dist/index.js" ]; then
329
+ echo -e "\033[0;31m❌ 错误: 未找到可执行文件 $DIST_DIR/dist/index.js\033[0m"
450
330
  exit 1
451
331
  fi
452
332
 
453
- # 根据命令行参数执行对应操作
454
333
  if [ $# -eq 0 ]; then
455
- # 无参数:启动网关
456
334
  if [ -f "$OPENCLAW_CONFIG_PATH" ]; then
457
335
  GATEWAY_PORT=$(node -e "console.log(require('$OPENCLAW_CONFIG_PATH').gateway?.port || 18789)")
458
336
  echo -e "\033[0;32m🚀 启动 OpenClaw-$INSTANCE_NAME 网关 (端口: $GATEWAY_PORT)...\033[0m"
459
- exec $OPENCLAW_EXEC="node $SCRIPT_DIR/dist/index.js" gateway run --port "$GATEWAY_PORT"
337
+ exec node "$DIST_DIR/dist/index.js" gateway run --port "$GATEWAY_PORT"
460
338
  else
461
- echo -e "\033[0;31m❌ 错误: 未找到配置文件 $OPENCLAW_CONFIG_PATH\033[0m"
339
+ echo -e "\033[0;31m❌ 错误: 未找到配置文件\033[0m"
462
340
  exit 1
463
341
  fi
464
342
  else
465
343
  if [ "$1" = "tui" ]; then
466
- # TUI 必须在 workspace 目录下运行,以正确加载模板文件
467
- echo -e "\033[0;32m🚀 启动 OpenClaw-$INSTANCE_NAME TUI (workspace mode)...\033[0m"
344
+ echo -e "\033[0;32m🚀 启动 OpenClaw-$INSTANCE_NAME TUI...\033[0m"
468
345
  cd "$OPENCLAW_WORKSPACE"
469
- exec node "$SCRIPT_DIR/dist/index.js" tui
346
+ exec node "$DIST_DIR/dist/index.js" tui
470
347
  else
471
- # 其他命令直接在实例目录执行
472
- echo -e "\033[0;32m🚀 执行 OpenClaw-$INSTANCE_NAME 命令: $@\033[0m"
473
- exec $OPENCLAW_EXEC="node $SCRIPT_DIR/dist/index.js" "$@"
348
+ echo -e "\033[0;32m🚀 执行命令: $@\033[0m"
349
+ exec node "$DIST_DIR/dist/index.js" "$@"
474
350
  fi
475
351
  fi
476
352
  EOF
477
-
478
353
  chmod +x "${INSTANCE_DIR}/start.sh"
479
354
 
480
355
  # --- 12. 执行拉起 ---
481
356
  echo -e "${BLUE}⚡ 正在后台启动服务...${NC}"
482
357
  nohup "${INSTANCE_DIR}/start.sh" > "${INSTANCE_DIR}/workspace/server.log" 2>&1 &
483
358
  PID=$!
484
-
485
359
  sleep 5
486
360
 
487
361
  check_port() {
@@ -504,12 +378,11 @@ if kill -0 $PID 2>/dev/null; then
504
378
  echo -e "📄 实时日志: tail -f ${INSTANCE_DIR}/workspace/server.log"
505
379
  echo -e "${GREEN}================================================${NC}"
506
380
 
507
- # --- 交互式菜单 ---
508
381
  if [ -t 0 ]; then
509
382
  echo
510
383
  echo -e "${BLUE}请选择下一步操作:${NC}"
511
- echo "1) 启动 TUI (终端交互界面)"
512
- echo "2) 打开 Web UI (浏览器)"
384
+ echo "1) 启动 TUI"
385
+ echo "2) 打开 Web UI"
513
386
  echo "3) 退出"
514
387
  read -p "请输入数字 [1-3]: " choice
515
388
  case $choice in
@@ -532,17 +405,12 @@ if kill -0 $PID 2>/dev/null; then
532
405
  echo -e "${RED}未找到 token,请手动查看配置文件。${NC}"
533
406
  fi
534
407
  ;;
535
- 3)
536
- echo "退出"
537
- exit 0
538
- ;;
539
- *)
540
- echo "无效选择"
541
- ;;
408
+ 3) echo "退出"; exit 0 ;;
409
+ *) echo "无效选择" ;;
542
410
  esac
543
411
  fi
544
412
  else
545
- echo -e "${YELLOW}⚠️ 进程存在但端口 ${PORT} 未监听(可能启动较慢或检查工具问题),请查看日志: ${INSTANCE_DIR}/workspace/server.log${NC}"
413
+ echo -e "${YELLOW}⚠️ 进程存在但端口 ${PORT} 未监听,请查看日志: ${INSTANCE_DIR}/workspace/server.log${NC}"
546
414
  fi
547
415
  else
548
416
  echo -e "${RED}❌ 启动失败,请查看日志: tail -n 20 ${INSTANCE_DIR}/workspace/server.log${NC}"