@archipelagolab/lobi 1.0.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.
- package/CHANGELOG.md +164 -0
- package/ENDOFFILE +0 -0
- package/EOF +0 -0
- package/LICENSE +21 -0
- package/SPEC-SUPPORT.md +116 -0
- package/YAMLEND +0 -0
- package/api.ts +18 -0
- package/archipelagolab-lobi-1.0.0.tgz +0 -0
- package/auth-presence.ts +56 -0
- package/channel-plugin-api.ts +3 -0
- package/cli-metadata.ts +11 -0
- package/contract-api.ts +17 -0
- package/docs/CHECKLIST.md +83 -0
- package/docs/FORK_SDK_GUIDE.md +279 -0
- package/helper-api.ts +3 -0
- package/index.test.ts +61 -0
- package/index.ts +65 -0
- package/openclaw.plugin.json +23 -0
- package/package.json +52 -0
- package/plugin-entry.handlers.runtime.ts +1 -0
- package/runtime-api.ts +54 -0
- package/runtime-heavy-api.ts +1 -0
- package/scripts/migrate-to-lobi.sh +72 -0
- package/secret-contract-api.ts +5 -0
- package/setup-entry.ts +13 -0
- package/src/account-selection.test.ts +124 -0
- package/src/account-selection.ts +226 -0
- package/src/actions.account-propagation.test.ts +251 -0
- package/src/actions.test.ts +251 -0
- package/src/actions.ts +336 -0
- package/src/approval-auth.test.ts +23 -0
- package/src/approval-auth.ts +25 -0
- package/src/approval-handler.runtime.test.ts +46 -0
- package/src/approval-handler.runtime.ts +400 -0
- package/src/approval-ids.ts +6 -0
- package/src/approval-native.test.ts +329 -0
- package/src/approval-native.ts +336 -0
- package/src/approval-reactions.test.ts +107 -0
- package/src/approval-reactions.ts +158 -0
- package/src/auth-precedence.ts +61 -0
- package/src/channel-account-paths.ts +92 -0
- package/src/channel.account-paths.test.ts +102 -0
- package/src/channel.directory.test.ts +601 -0
- package/src/channel.resolve.test.ts +38 -0
- package/src/channel.runtime.ts +16 -0
- package/src/channel.setup.test.ts +269 -0
- package/src/channel.ts +570 -0
- package/src/cli-metadata.ts +19 -0
- package/src/cli.test.ts +1015 -0
- package/src/cli.ts +1198 -0
- package/src/config-adapter.ts +41 -0
- package/src/config-schema.test.ts +90 -0
- package/src/config-schema.ts +114 -0
- package/src/directory-live.test.ts +200 -0
- package/src/directory-live.ts +238 -0
- package/src/doctor-contract.ts +287 -0
- package/src/doctor.test.ts +440 -0
- package/src/doctor.ts +262 -0
- package/src/env-vars.ts +92 -0
- package/src/exec-approval-resolver.test.ts +68 -0
- package/src/exec-approval-resolver.ts +23 -0
- package/src/exec-approvals.test.ts +483 -0
- package/src/exec-approvals.ts +290 -0
- package/src/group-mentions.ts +41 -0
- package/src/legacy-crypto-inspector-availability.test.ts +81 -0
- package/src/legacy-crypto-inspector-availability.ts +60 -0
- package/src/legacy-crypto.test.ts +234 -0
- package/src/legacy-crypto.ts +549 -0
- package/src/legacy-state.test.ts +86 -0
- package/src/legacy-state.ts +156 -0
- package/src/matrix/account-config.ts +150 -0
- package/src/matrix/accounts.readiness.test.ts +27 -0
- package/src/matrix/accounts.test.ts +757 -0
- package/src/matrix/accounts.ts +194 -0
- package/src/matrix/actions/client.test.ts +215 -0
- package/src/matrix/actions/client.ts +31 -0
- package/src/matrix/actions/devices.test.ts +114 -0
- package/src/matrix/actions/devices.ts +34 -0
- package/src/matrix/actions/limits.test.ts +15 -0
- package/src/matrix/actions/limits.ts +6 -0
- package/src/matrix/actions/messages.test.ts +289 -0
- package/src/matrix/actions/messages.ts +123 -0
- package/src/matrix/actions/pins.test.ts +74 -0
- package/src/matrix/actions/pins.ts +64 -0
- package/src/matrix/actions/polls.test.ts +71 -0
- package/src/matrix/actions/polls.ts +109 -0
- package/src/matrix/actions/profile.test.ts +109 -0
- package/src/matrix/actions/profile.ts +37 -0
- package/src/matrix/actions/reactions.test.ts +135 -0
- package/src/matrix/actions/reactions.ts +59 -0
- package/src/matrix/actions/room.test.ts +79 -0
- package/src/matrix/actions/room.ts +71 -0
- package/src/matrix/actions/summary.test.ts +87 -0
- package/src/matrix/actions/summary.ts +88 -0
- package/src/matrix/actions/types.ts +82 -0
- package/src/matrix/actions/verification.test.ts +105 -0
- package/src/matrix/actions/verification.ts +237 -0
- package/src/matrix/actions.ts +37 -0
- package/src/matrix/active-client.ts +26 -0
- package/src/matrix/async-lock.ts +18 -0
- package/src/matrix/backup-health.ts +115 -0
- package/src/matrix/client/config-runtime-api.ts +14 -0
- package/src/matrix/client/config-secret-input.runtime.ts +1 -0
- package/src/matrix/client/config.ts +982 -0
- package/src/matrix/client/create-client.test.ts +115 -0
- package/src/matrix/client/create-client.ts +101 -0
- package/src/matrix/client/env-auth.ts +6 -0
- package/src/matrix/client/file-sync-store.test.ts +265 -0
- package/src/matrix/client/file-sync-store.ts +289 -0
- package/src/matrix/client/logging.ts +123 -0
- package/src/matrix/client/migration-snapshot.runtime.ts +1 -0
- package/src/matrix/client/private-network-host.ts +56 -0
- package/src/matrix/client/runtime.ts +4 -0
- package/src/matrix/client/shared.test.ts +344 -0
- package/src/matrix/client/shared.ts +306 -0
- package/src/matrix/client/storage.test.ts +634 -0
- package/src/matrix/client/storage.ts +544 -0
- package/src/matrix/client/types.ts +50 -0
- package/src/matrix/client-bootstrap.test.ts +84 -0
- package/src/matrix/client-bootstrap.ts +164 -0
- package/src/matrix/client-resolver.test-helpers.ts +147 -0
- package/src/matrix/client.test.ts +1521 -0
- package/src/matrix/client.ts +23 -0
- package/src/matrix/config-paths.ts +31 -0
- package/src/matrix/config-update.test.ts +237 -0
- package/src/matrix/config-update.ts +291 -0
- package/src/matrix/credentials-read.ts +206 -0
- package/src/matrix/credentials-write.runtime.ts +26 -0
- package/src/matrix/credentials.test.ts +501 -0
- package/src/matrix/credentials.ts +95 -0
- package/src/matrix/deps.test.ts +74 -0
- package/src/matrix/deps.ts +225 -0
- package/src/matrix/device-health.test.ts +45 -0
- package/src/matrix/device-health.ts +31 -0
- package/src/matrix/direct-management.test.ts +350 -0
- package/src/matrix/direct-management.ts +347 -0
- package/src/matrix/direct-room.test.ts +61 -0
- package/src/matrix/direct-room.ts +128 -0
- package/src/matrix/draft-stream.test.ts +406 -0
- package/src/matrix/draft-stream.ts +216 -0
- package/src/matrix/encryption-guidance.ts +27 -0
- package/src/matrix/errors.ts +21 -0
- package/src/matrix/format.test.ts +340 -0
- package/src/matrix/format.ts +428 -0
- package/src/matrix/legacy-crypto-inspector.ts +95 -0
- package/src/matrix/media-errors.ts +20 -0
- package/src/matrix/media-text.ts +169 -0
- package/src/matrix/monitor/access-state.test.ts +45 -0
- package/src/matrix/monitor/access-state.ts +77 -0
- package/src/matrix/monitor/ack-config.test.ts +57 -0
- package/src/matrix/monitor/ack-config.ts +26 -0
- package/src/matrix/monitor/allowlist.test.ts +45 -0
- package/src/matrix/monitor/allowlist.ts +94 -0
- package/src/matrix/monitor/auto-join.test.ts +203 -0
- package/src/matrix/monitor/auto-join.ts +86 -0
- package/src/matrix/monitor/config.test.ts +197 -0
- package/src/matrix/monitor/config.ts +303 -0
- package/src/matrix/monitor/context-summary.ts +43 -0
- package/src/matrix/monitor/direct.test.ts +529 -0
- package/src/matrix/monitor/direct.ts +270 -0
- package/src/matrix/monitor/events.test.ts +1524 -0
- package/src/matrix/monitor/events.ts +213 -0
- package/src/matrix/monitor/handler.body-for-agent.test.ts +396 -0
- package/src/matrix/monitor/handler.group-history.test.ts +648 -0
- package/src/matrix/monitor/handler.media-failure.test.ts +267 -0
- package/src/matrix/monitor/handler.test-helpers.ts +308 -0
- package/src/matrix/monitor/handler.test.ts +2952 -0
- package/src/matrix/monitor/handler.thread-root-media.test.ts +82 -0
- package/src/matrix/monitor/handler.ts +1679 -0
- package/src/matrix/monitor/inbound-dedupe.test.ts +146 -0
- package/src/matrix/monitor/inbound-dedupe.ts +267 -0
- package/src/matrix/monitor/index.test.ts +920 -0
- package/src/matrix/monitor/index.ts +434 -0
- package/src/matrix/monitor/legacy-crypto-restore.test.ts +206 -0
- package/src/matrix/monitor/legacy-crypto-restore.ts +139 -0
- package/src/matrix/monitor/location.ts +100 -0
- package/src/matrix/monitor/media.test.ts +159 -0
- package/src/matrix/monitor/media.ts +119 -0
- package/src/matrix/monitor/mentions.test.ts +289 -0
- package/src/matrix/monitor/mentions.ts +177 -0
- package/src/matrix/monitor/reaction-events.test.ts +326 -0
- package/src/matrix/monitor/reaction-events.ts +187 -0
- package/src/matrix/monitor/recent-invite.test.ts +92 -0
- package/src/matrix/monitor/recent-invite.ts +30 -0
- package/src/matrix/monitor/replies.test.ts +265 -0
- package/src/matrix/monitor/replies.ts +136 -0
- package/src/matrix/monitor/reply-context.test.ts +276 -0
- package/src/matrix/monitor/reply-context.ts +92 -0
- package/src/matrix/monitor/room-history.test.ts +258 -0
- package/src/matrix/monitor/room-history.ts +301 -0
- package/src/matrix/monitor/room-info.test.ts +201 -0
- package/src/matrix/monitor/room-info.ts +126 -0
- package/src/matrix/monitor/rooms.test.ts +121 -0
- package/src/matrix/monitor/rooms.ts +52 -0
- package/src/matrix/monitor/route.test.ts +255 -0
- package/src/matrix/monitor/route.ts +178 -0
- package/src/matrix/monitor/runtime-api.ts +31 -0
- package/src/matrix/monitor/startup-verification.test.ts +294 -0
- package/src/matrix/monitor/startup-verification.ts +237 -0
- package/src/matrix/monitor/startup.test.ts +257 -0
- package/src/matrix/monitor/startup.ts +218 -0
- package/src/matrix/monitor/status.ts +111 -0
- package/src/matrix/monitor/sync-lifecycle.test.ts +224 -0
- package/src/matrix/monitor/sync-lifecycle.ts +91 -0
- package/src/matrix/monitor/task-runner.ts +38 -0
- package/src/matrix/monitor/thread-context.test.ts +149 -0
- package/src/matrix/monitor/thread-context.ts +108 -0
- package/src/matrix/monitor/threads.test.ts +68 -0
- package/src/matrix/monitor/threads.ts +85 -0
- package/src/matrix/monitor/types.ts +30 -0
- package/src/matrix/monitor/verification-events.ts +627 -0
- package/src/matrix/monitor/verification-utils.test.ts +47 -0
- package/src/matrix/monitor/verification-utils.ts +46 -0
- package/src/matrix/outbound-media-runtime.ts +1 -0
- package/src/matrix/poll-summary.ts +110 -0
- package/src/matrix/poll-types.test.ts +205 -0
- package/src/matrix/poll-types.ts +433 -0
- package/src/matrix/probe.runtime.ts +4 -0
- package/src/matrix/probe.test.ts +154 -0
- package/src/matrix/probe.ts +96 -0
- package/src/matrix/profile.test.ts +154 -0
- package/src/matrix/profile.ts +184 -0
- package/src/matrix/reaction-common.test.ts +96 -0
- package/src/matrix/reaction-common.ts +147 -0
- package/src/matrix/sdk/crypto-bootstrap.test.ts +505 -0
- package/src/matrix/sdk/crypto-bootstrap.ts +341 -0
- package/src/matrix/sdk/crypto-facade.test.ts +197 -0
- package/src/matrix/sdk/crypto-facade.ts +207 -0
- package/src/matrix/sdk/crypto-node.runtime.test.ts +27 -0
- package/src/matrix/sdk/crypto-node.runtime.ts +9 -0
- package/src/matrix/sdk/crypto-runtime.ts +11 -0
- package/src/matrix/sdk/decrypt-bridge.ts +356 -0
- package/src/matrix/sdk/event-helpers.test.ts +60 -0
- package/src/matrix/sdk/event-helpers.ts +71 -0
- package/src/matrix/sdk/http-client.test.ts +134 -0
- package/src/matrix/sdk/http-client.ts +87 -0
- package/src/matrix/sdk/idb-persistence-lock.ts +51 -0
- package/src/matrix/sdk/idb-persistence.lock-order.test.ts +108 -0
- package/src/matrix/sdk/idb-persistence.test-helpers.ts +88 -0
- package/src/matrix/sdk/idb-persistence.test.ts +149 -0
- package/src/matrix/sdk/idb-persistence.ts +283 -0
- package/src/matrix/sdk/logger.test.ts +25 -0
- package/src/matrix/sdk/logger.ts +108 -0
- package/src/matrix/sdk/read-response-with-limit.ts +19 -0
- package/src/matrix/sdk/recovery-key-store.test.ts +385 -0
- package/src/matrix/sdk/recovery-key-store.ts +430 -0
- package/src/matrix/sdk/transport.test.ts +161 -0
- package/src/matrix/sdk/transport.ts +344 -0
- package/src/matrix/sdk/types.ts +236 -0
- package/src/matrix/sdk/verification-manager.test.ts +509 -0
- package/src/matrix/sdk/verification-manager.ts +694 -0
- package/src/matrix/sdk/verification-status.ts +23 -0
- package/src/matrix/sdk.test.ts +2568 -0
- package/src/matrix/sdk.ts +1789 -0
- package/src/matrix/send/client.test.ts +174 -0
- package/src/matrix/send/client.ts +90 -0
- package/src/matrix/send/formatting.ts +189 -0
- package/src/matrix/send/media.ts +244 -0
- package/src/matrix/send/targets.test.ts +254 -0
- package/src/matrix/send/targets.ts +104 -0
- package/src/matrix/send/types.ts +134 -0
- package/src/matrix/send.test.ts +958 -0
- package/src/matrix/send.ts +609 -0
- package/src/matrix/session-store-metadata.ts +108 -0
- package/src/matrix/startup-abort.ts +44 -0
- package/src/matrix/sync-state.ts +27 -0
- package/src/matrix/target-ids.ts +102 -0
- package/src/matrix/thread-bindings-shared.ts +201 -0
- package/src/matrix/thread-bindings.test.ts +673 -0
- package/src/matrix/thread-bindings.ts +577 -0
- package/src/matrix-migration.runtime.ts +9 -0
- package/src/migration-config.test.ts +228 -0
- package/src/migration-config.ts +243 -0
- package/src/migration-snapshot-backup.ts +117 -0
- package/src/migration-snapshot.test.ts +184 -0
- package/src/migration-snapshot.ts +55 -0
- package/src/onboarding.resolve.test.ts +55 -0
- package/src/onboarding.test-harness.ts +158 -0
- package/src/onboarding.test.ts +665 -0
- package/src/onboarding.ts +773 -0
- package/src/outbound.test.ts +173 -0
- package/src/outbound.ts +78 -0
- package/src/plugin-entry.runtime.js +159 -0
- package/src/plugin-entry.runtime.test.ts +108 -0
- package/src/plugin-entry.runtime.ts +68 -0
- package/src/profile-update.ts +68 -0
- package/src/record-shared.ts +3 -0
- package/src/resolve-targets.test.ts +178 -0
- package/src/resolve-targets.ts +175 -0
- package/src/resolver.ts +21 -0
- package/src/runtime-api.ts +144 -0
- package/src/runtime.ts +7 -0
- package/src/secret-contract.ts +174 -0
- package/src/session-route.test.ts +315 -0
- package/src/session-route.ts +113 -0
- package/src/setup-bootstrap.ts +94 -0
- package/src/setup-config.ts +222 -0
- package/src/setup-contract.ts +89 -0
- package/src/setup-core.test.ts +326 -0
- package/src/setup-core.ts +50 -0
- package/src/setup-surface.ts +4 -0
- package/src/startup-maintenance.test.ts +227 -0
- package/src/startup-maintenance.ts +114 -0
- package/src/storage-paths.ts +92 -0
- package/src/test-helpers.ts +42 -0
- package/src/test-mocks.ts +55 -0
- package/src/test-runtime.ts +72 -0
- package/src/test-support/monitor-route-test-support.ts +8 -0
- package/src/tool-actions.runtime.ts +1 -0
- package/src/tool-actions.test.ts +422 -0
- package/src/tool-actions.ts +498 -0
- package/src/types.ts +230 -0
- package/test-api.ts +2 -0
- package/thread-bindings-runtime.ts +4 -0
- package/tsconfig.json +16 -0
|
@@ -0,0 +1,665 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { matrixOnboardingAdapter } from "./onboarding.js";
|
|
3
|
+
import {
|
|
4
|
+
installMatrixOnboardingEnvRestoreHooks,
|
|
5
|
+
createMatrixWizardPrompter,
|
|
6
|
+
runMatrixAddAccountAllowlistConfigure,
|
|
7
|
+
runMatrixInteractiveConfigure,
|
|
8
|
+
} from "./onboarding.test-harness.js";
|
|
9
|
+
import { installMatrixTestRuntime } from "./test-runtime.js";
|
|
10
|
+
import type { CoreConfig } from "./types.js";
|
|
11
|
+
|
|
12
|
+
vi.mock("./matrix/deps.js", () => ({
|
|
13
|
+
ensureMatrixSdkInstalled: vi.fn(async () => {}),
|
|
14
|
+
isMatrixSdkAvailable: vi.fn(() => true),
|
|
15
|
+
}));
|
|
16
|
+
|
|
17
|
+
describe("matrix onboarding", () => {
|
|
18
|
+
installMatrixOnboardingEnvRestoreHooks();
|
|
19
|
+
|
|
20
|
+
it("offers env shortcut for non-default account when scoped env vars are present", async () => {
|
|
21
|
+
installMatrixTestRuntime();
|
|
22
|
+
|
|
23
|
+
process.env.LOBI_HOMESERVER = "https://matrix.env.example.org";
|
|
24
|
+
process.env.LOBI_USER_ID = "@env:example.org";
|
|
25
|
+
process.env.LOBI_PASSWORD = "env-password"; // pragma: allowlist secret
|
|
26
|
+
process.env.LOBI_ACCESS_TOKEN = "";
|
|
27
|
+
process.env.LOBI_OPS_HOMESERVER = "https://matrix.ops.env.example.org";
|
|
28
|
+
process.env.LOBI_OPS_ACCESS_TOKEN = "ops-env-token";
|
|
29
|
+
|
|
30
|
+
const confirmMessages: string[] = [];
|
|
31
|
+
const prompter = createMatrixWizardPrompter({
|
|
32
|
+
select: {
|
|
33
|
+
"Matrix already configured. What do you want to do?": "add-account",
|
|
34
|
+
"Matrix auth method": "token",
|
|
35
|
+
},
|
|
36
|
+
text: {
|
|
37
|
+
"Matrix account name": "ops",
|
|
38
|
+
},
|
|
39
|
+
onConfirm: (message) => {
|
|
40
|
+
confirmMessages.push(message);
|
|
41
|
+
return message.startsWith("Matrix env vars detected");
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
const result = await runMatrixInteractiveConfigure({
|
|
46
|
+
cfg: {
|
|
47
|
+
channels: {
|
|
48
|
+
matrix: {
|
|
49
|
+
accounts: {
|
|
50
|
+
default: {
|
|
51
|
+
homeserver: "https://matrix.main.example.org",
|
|
52
|
+
accessToken: "main-token",
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
} as CoreConfig,
|
|
58
|
+
prompter,
|
|
59
|
+
shouldPromptAccountIds: true,
|
|
60
|
+
configured: true,
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
expect(result).not.toBe("skip");
|
|
64
|
+
if (result !== "skip") {
|
|
65
|
+
const opsAccount = result.cfg.channels?.["matrix"]?.accounts?.ops as
|
|
66
|
+
| {
|
|
67
|
+
enabled?: boolean;
|
|
68
|
+
homeserver?: string;
|
|
69
|
+
accessToken?: string;
|
|
70
|
+
}
|
|
71
|
+
| undefined;
|
|
72
|
+
expect(result.accountId).toBe("ops");
|
|
73
|
+
expect(opsAccount).toMatchObject({
|
|
74
|
+
enabled: true,
|
|
75
|
+
});
|
|
76
|
+
expect(opsAccount?.homeserver).toBeUndefined();
|
|
77
|
+
expect(opsAccount?.accessToken).toBeUndefined();
|
|
78
|
+
}
|
|
79
|
+
expect(
|
|
80
|
+
confirmMessages.some((message) =>
|
|
81
|
+
message.startsWith(
|
|
82
|
+
"Matrix env vars detected (LOBI_OPS_HOMESERVER (+ auth vars)). Use env values?",
|
|
83
|
+
),
|
|
84
|
+
),
|
|
85
|
+
).toBe(true);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it("routes env-shortcut add-account flow through Matrix invite auto-join setup", async () => {
|
|
89
|
+
installMatrixTestRuntime();
|
|
90
|
+
|
|
91
|
+
process.env.LOBI_HOMESERVER = "https://matrix.env.example.org";
|
|
92
|
+
process.env.LOBI_USER_ID = "@env:example.org";
|
|
93
|
+
process.env.LOBI_PASSWORD = "env-password"; // pragma: allowlist secret
|
|
94
|
+
process.env.LOBI_ACCESS_TOKEN = "";
|
|
95
|
+
process.env.LOBI_OPS_HOMESERVER = "https://matrix.ops.env.example.org";
|
|
96
|
+
process.env.LOBI_OPS_ACCESS_TOKEN = "ops-env-token";
|
|
97
|
+
|
|
98
|
+
const notes: string[] = [];
|
|
99
|
+
const prompter = createMatrixWizardPrompter({
|
|
100
|
+
notes,
|
|
101
|
+
select: {
|
|
102
|
+
"Matrix already configured. What do you want to do?": "add-account",
|
|
103
|
+
"Matrix rooms access": "allowlist",
|
|
104
|
+
"Matrix invite auto-join": "allowlist",
|
|
105
|
+
},
|
|
106
|
+
text: {
|
|
107
|
+
"Matrix account name": "ops",
|
|
108
|
+
"Matrix rooms allowlist (comma-separated)": "!ops-room:example.org",
|
|
109
|
+
"Matrix invite auto-join allowlist (comma-separated)": "#ops-invites:example.org",
|
|
110
|
+
},
|
|
111
|
+
confirm: {
|
|
112
|
+
"Configure Matrix rooms access?": true,
|
|
113
|
+
"Configure Matrix invite auto-join?": true,
|
|
114
|
+
},
|
|
115
|
+
onConfirm: (message) => message.startsWith("Matrix env vars detected"),
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
const result = await runMatrixInteractiveConfigure({
|
|
119
|
+
cfg: {
|
|
120
|
+
channels: {
|
|
121
|
+
matrix: {
|
|
122
|
+
accounts: {
|
|
123
|
+
default: {
|
|
124
|
+
homeserver: "https://matrix.main.example.org",
|
|
125
|
+
accessToken: "main-token",
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
} as CoreConfig,
|
|
131
|
+
prompter,
|
|
132
|
+
shouldPromptAccountIds: true,
|
|
133
|
+
configured: true,
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
expect(result).not.toBe("skip");
|
|
137
|
+
if (result === "skip") {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
expect(result.accountId).toBe("ops");
|
|
142
|
+
expect(result.cfg.channels?.matrix?.accounts?.ops).toMatchObject({
|
|
143
|
+
enabled: true,
|
|
144
|
+
groupPolicy: "allowlist",
|
|
145
|
+
groups: {
|
|
146
|
+
"!ops-room:example.org": { enabled: true },
|
|
147
|
+
},
|
|
148
|
+
autoJoin: "allowlist",
|
|
149
|
+
autoJoinAllowlist: ["#ops-invites:example.org"],
|
|
150
|
+
});
|
|
151
|
+
expect(notes.join("\n")).toContain("WARNING: Matrix invite auto-join defaults to off.");
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it("promotes legacy top-level Matrix config before adding a named account", async () => {
|
|
155
|
+
installMatrixTestRuntime();
|
|
156
|
+
|
|
157
|
+
const prompter = createMatrixWizardPrompter({
|
|
158
|
+
select: {
|
|
159
|
+
"Matrix already configured. What do you want to do?": "add-account",
|
|
160
|
+
"Matrix auth method": "token",
|
|
161
|
+
},
|
|
162
|
+
text: {
|
|
163
|
+
"Matrix account name": "ops",
|
|
164
|
+
"Matrix homeserver URL": "https://matrix.ops.example.org",
|
|
165
|
+
"Matrix access token": "ops-token",
|
|
166
|
+
"Matrix device name (optional)": "",
|
|
167
|
+
},
|
|
168
|
+
onConfirm: async () => false,
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
const result = await runMatrixInteractiveConfigure({
|
|
172
|
+
cfg: {
|
|
173
|
+
channels: {
|
|
174
|
+
matrix: {
|
|
175
|
+
homeserver: "https://matrix.main.example.org",
|
|
176
|
+
userId: "@main:example.org",
|
|
177
|
+
accessToken: "main-token",
|
|
178
|
+
avatarUrl: "mxc://matrix.main.example.org/main-avatar",
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
} as CoreConfig,
|
|
182
|
+
prompter,
|
|
183
|
+
shouldPromptAccountIds: true,
|
|
184
|
+
configured: true,
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
expect(result).not.toBe("skip");
|
|
188
|
+
if (result === "skip") {
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
expect(result.cfg.channels?.matrix?.homeserver).toBeUndefined();
|
|
193
|
+
expect(result.cfg.channels?.matrix?.accessToken).toBeUndefined();
|
|
194
|
+
expect(result.cfg.channels?.matrix?.avatarUrl).toBeUndefined();
|
|
195
|
+
expect(result.cfg.channels?.matrix?.accounts?.default).toMatchObject({
|
|
196
|
+
homeserver: "https://matrix.main.example.org",
|
|
197
|
+
userId: "@main:example.org",
|
|
198
|
+
accessToken: "main-token",
|
|
199
|
+
avatarUrl: "mxc://matrix.main.example.org/main-avatar",
|
|
200
|
+
});
|
|
201
|
+
expect(result.cfg.channels?.matrix?.accounts?.ops).toMatchObject({
|
|
202
|
+
name: "ops",
|
|
203
|
+
homeserver: "https://matrix.ops.example.org",
|
|
204
|
+
accessToken: "ops-token",
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
it("reuses an existing raw default-like key during onboarding promotion when defaultAccount is unset", async () => {
|
|
209
|
+
installMatrixTestRuntime();
|
|
210
|
+
|
|
211
|
+
const prompter = createMatrixWizardPrompter({
|
|
212
|
+
select: {
|
|
213
|
+
"Matrix already configured. What do you want to do?": "add-account",
|
|
214
|
+
"Matrix auth method": "token",
|
|
215
|
+
},
|
|
216
|
+
text: {
|
|
217
|
+
"Matrix account name": "ops",
|
|
218
|
+
"Matrix homeserver URL": "https://matrix.ops.example.org",
|
|
219
|
+
"Matrix access token": "ops-token",
|
|
220
|
+
"Matrix device name (optional)": "",
|
|
221
|
+
},
|
|
222
|
+
onConfirm: async () => false,
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
const result = await runMatrixInteractiveConfigure({
|
|
226
|
+
cfg: {
|
|
227
|
+
channels: {
|
|
228
|
+
matrix: {
|
|
229
|
+
homeserver: "https://matrix.main.example.org",
|
|
230
|
+
userId: "@main:example.org",
|
|
231
|
+
accessToken: "main-token",
|
|
232
|
+
avatarUrl: "mxc://matrix.main.example.org/main-avatar",
|
|
233
|
+
accounts: {
|
|
234
|
+
Default: {
|
|
235
|
+
enabled: true,
|
|
236
|
+
deviceName: "Legacy raw key",
|
|
237
|
+
},
|
|
238
|
+
support: {
|
|
239
|
+
homeserver: "https://matrix.support.example.org",
|
|
240
|
+
accessToken: "support-token",
|
|
241
|
+
},
|
|
242
|
+
},
|
|
243
|
+
},
|
|
244
|
+
},
|
|
245
|
+
} as CoreConfig,
|
|
246
|
+
prompter,
|
|
247
|
+
shouldPromptAccountIds: true,
|
|
248
|
+
configured: true,
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
expect(result).not.toBe("skip");
|
|
252
|
+
if (result === "skip") {
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
expect(result.cfg.channels?.matrix?.accounts?.Default).toMatchObject({
|
|
257
|
+
enabled: true,
|
|
258
|
+
deviceName: "Legacy raw key",
|
|
259
|
+
homeserver: "https://matrix.main.example.org",
|
|
260
|
+
userId: "@main:example.org",
|
|
261
|
+
accessToken: "main-token",
|
|
262
|
+
avatarUrl: "mxc://matrix.main.example.org/main-avatar",
|
|
263
|
+
});
|
|
264
|
+
expect(result.cfg.channels?.matrix?.accounts?.default).toBeUndefined();
|
|
265
|
+
expect(result.cfg.channels?.matrix?.accounts?.support).toMatchObject({
|
|
266
|
+
homeserver: "https://matrix.support.example.org",
|
|
267
|
+
accessToken: "support-token",
|
|
268
|
+
});
|
|
269
|
+
expect(result.cfg.channels?.matrix?.accounts?.ops).toMatchObject({
|
|
270
|
+
name: "ops",
|
|
271
|
+
homeserver: "https://matrix.ops.example.org",
|
|
272
|
+
accessToken: "ops-token",
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
it("includes device env var names in auth help text", async () => {
|
|
277
|
+
installMatrixTestRuntime();
|
|
278
|
+
|
|
279
|
+
const notes: string[] = [];
|
|
280
|
+
const prompter = createMatrixWizardPrompter({
|
|
281
|
+
notes,
|
|
282
|
+
onText: async () => {
|
|
283
|
+
throw new Error("stop-after-help");
|
|
284
|
+
},
|
|
285
|
+
onConfirm: async () => false,
|
|
286
|
+
onSelect: async () => "token",
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
await expect(
|
|
290
|
+
runMatrixInteractiveConfigure({
|
|
291
|
+
cfg: { channels: {} } as CoreConfig,
|
|
292
|
+
prompter,
|
|
293
|
+
}),
|
|
294
|
+
).rejects.toThrow("stop-after-help");
|
|
295
|
+
|
|
296
|
+
const noteText = notes.join("\n");
|
|
297
|
+
expect(noteText).toContain("LOBI_DEVICE_ID");
|
|
298
|
+
expect(noteText).toContain("LOBI_DEVICE_NAME");
|
|
299
|
+
expect(noteText).toContain("MATRIX_<ACCOUNT_ID>_DEVICE_ID");
|
|
300
|
+
expect(noteText).toContain("MATRIX_<ACCOUNT_ID>_DEVICE_NAME");
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
it("prompts for private-network access when onboarding an internal http homeserver", async () => {
|
|
304
|
+
installMatrixTestRuntime();
|
|
305
|
+
|
|
306
|
+
const prompter = createMatrixWizardPrompter({
|
|
307
|
+
select: {
|
|
308
|
+
"Matrix auth method": "token",
|
|
309
|
+
},
|
|
310
|
+
text: {
|
|
311
|
+
"Matrix homeserver URL": "http://localhost.localdomain:8008",
|
|
312
|
+
"Matrix access token": "ops-token",
|
|
313
|
+
"Matrix device name (optional)": "",
|
|
314
|
+
},
|
|
315
|
+
confirm: {
|
|
316
|
+
"Allow private/internal Matrix homeserver traffic for this account?": true,
|
|
317
|
+
"Enable end-to-end encryption (E2EE)?": false,
|
|
318
|
+
},
|
|
319
|
+
onConfirm: async () => false,
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
const result = await runMatrixInteractiveConfigure({
|
|
323
|
+
cfg: {} as CoreConfig,
|
|
324
|
+
prompter,
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
expect(result).not.toBe("skip");
|
|
328
|
+
if (result === "skip") {
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
expect(result.cfg.channels?.matrix).toMatchObject({
|
|
333
|
+
homeserver: "http://localhost.localdomain:8008",
|
|
334
|
+
network: {
|
|
335
|
+
dangerouslyAllowPrivateNetwork: true,
|
|
336
|
+
},
|
|
337
|
+
accessToken: "ops-token",
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
it("preserves SecretRef access tokens when keeping existing credentials", async () => {
|
|
342
|
+
installMatrixTestRuntime();
|
|
343
|
+
|
|
344
|
+
process.env.LOBI_ACCESS_TOKEN = "env-token";
|
|
345
|
+
|
|
346
|
+
const prompter = createMatrixWizardPrompter({
|
|
347
|
+
select: {
|
|
348
|
+
"Matrix already configured. What do you want to do?": "update",
|
|
349
|
+
},
|
|
350
|
+
text: {
|
|
351
|
+
"Matrix homeserver URL": "https://matrix.example.org",
|
|
352
|
+
"Matrix device name (optional)": "OpenClaw Gateway",
|
|
353
|
+
},
|
|
354
|
+
confirm: {
|
|
355
|
+
"Matrix credentials already configured. Keep them?": true,
|
|
356
|
+
"Enable end-to-end encryption (E2EE)?": false,
|
|
357
|
+
"Configure Matrix rooms access?": false,
|
|
358
|
+
"Configure Matrix invite auto-join?": false,
|
|
359
|
+
},
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
const result = await runMatrixInteractiveConfigure({
|
|
363
|
+
cfg: {
|
|
364
|
+
channels: {
|
|
365
|
+
matrix: {
|
|
366
|
+
homeserver: "https://matrix.example.org",
|
|
367
|
+
accessToken: { source: "env", provider: "default", id: "LOBI_ACCESS_TOKEN" },
|
|
368
|
+
},
|
|
369
|
+
},
|
|
370
|
+
secrets: {
|
|
371
|
+
defaults: {
|
|
372
|
+
env: "default",
|
|
373
|
+
},
|
|
374
|
+
},
|
|
375
|
+
} as CoreConfig,
|
|
376
|
+
prompter,
|
|
377
|
+
configured: true,
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
expect(result).not.toBe("skip");
|
|
381
|
+
if (result === "skip") {
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
expect(result.cfg.channels?.matrix?.accessToken).toEqual({
|
|
386
|
+
source: "env",
|
|
387
|
+
provider: "default",
|
|
388
|
+
id: "LOBI_ACCESS_TOKEN",
|
|
389
|
+
});
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
it("resolves status using the overridden Matrix account", async () => {
|
|
393
|
+
const status = await matrixOnboardingAdapter.getStatus({
|
|
394
|
+
cfg: {
|
|
395
|
+
channels: {
|
|
396
|
+
matrix: {
|
|
397
|
+
defaultAccount: "default",
|
|
398
|
+
accounts: {
|
|
399
|
+
default: {
|
|
400
|
+
homeserver: "https://matrix.default.example.org",
|
|
401
|
+
},
|
|
402
|
+
ops: {
|
|
403
|
+
homeserver: "https://matrix.ops.example.org",
|
|
404
|
+
accessToken: "ops-token",
|
|
405
|
+
},
|
|
406
|
+
},
|
|
407
|
+
},
|
|
408
|
+
},
|
|
409
|
+
} as CoreConfig,
|
|
410
|
+
options: undefined,
|
|
411
|
+
accountOverrides: {
|
|
412
|
+
matrix: "ops",
|
|
413
|
+
},
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
expect(status.configured).toBe(true);
|
|
417
|
+
expect(status.selectionHint).toBe("configured");
|
|
418
|
+
expect(status.statusLines).toEqual(["Matrix: configured"]);
|
|
419
|
+
});
|
|
420
|
+
|
|
421
|
+
it("writes allowlists and room access to the selected Matrix account", async () => {
|
|
422
|
+
installMatrixTestRuntime();
|
|
423
|
+
const notes: string[] = [];
|
|
424
|
+
|
|
425
|
+
const result = await runMatrixAddAccountAllowlistConfigure({
|
|
426
|
+
cfg: {
|
|
427
|
+
channels: {
|
|
428
|
+
matrix: {
|
|
429
|
+
accounts: {
|
|
430
|
+
default: {
|
|
431
|
+
homeserver: "https://matrix.main.example.org",
|
|
432
|
+
accessToken: "main-token",
|
|
433
|
+
},
|
|
434
|
+
},
|
|
435
|
+
},
|
|
436
|
+
},
|
|
437
|
+
} as CoreConfig,
|
|
438
|
+
allowFromInput: "@alice:example.org",
|
|
439
|
+
roomsAllowlistInput: "!ops-room:example.org",
|
|
440
|
+
autoJoinAllowlistInput: "#ops-invites:example.org",
|
|
441
|
+
deviceName: "Ops Gateway",
|
|
442
|
+
notes,
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
expect(result).not.toBe("skip");
|
|
446
|
+
if (result === "skip") {
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
expect(result.accountId).toBe("ops");
|
|
451
|
+
expect(result.cfg.channels?.["matrix"]?.accounts?.ops).toMatchObject({
|
|
452
|
+
homeserver: "https://matrix.ops.example.org",
|
|
453
|
+
accessToken: "ops-token",
|
|
454
|
+
deviceName: "Ops Gateway",
|
|
455
|
+
dm: {
|
|
456
|
+
policy: "allowlist",
|
|
457
|
+
allowFrom: ["@alice:example.org"],
|
|
458
|
+
},
|
|
459
|
+
groupPolicy: "allowlist",
|
|
460
|
+
autoJoin: "allowlist",
|
|
461
|
+
autoJoinAllowlist: ["#ops-invites:example.org"],
|
|
462
|
+
groups: {
|
|
463
|
+
"!ops-room:example.org": { enabled: true },
|
|
464
|
+
},
|
|
465
|
+
});
|
|
466
|
+
expect(result.cfg.channels?.["matrix"]?.dm).toBeUndefined();
|
|
467
|
+
expect(result.cfg.channels?.["matrix"]?.groups).toBeUndefined();
|
|
468
|
+
expect(notes.join("\n")).toContain("WARNING: Matrix invite auto-join defaults to off.");
|
|
469
|
+
});
|
|
470
|
+
|
|
471
|
+
it("clears Matrix invite auto-join allowlists when switching auto-join off", async () => {
|
|
472
|
+
installMatrixTestRuntime();
|
|
473
|
+
const notes: string[] = [];
|
|
474
|
+
|
|
475
|
+
const prompter = createMatrixWizardPrompter({
|
|
476
|
+
notes,
|
|
477
|
+
select: {
|
|
478
|
+
"Matrix already configured. What do you want to do?": "update",
|
|
479
|
+
"Matrix invite auto-join": "off",
|
|
480
|
+
},
|
|
481
|
+
text: {
|
|
482
|
+
"Matrix homeserver URL": "https://matrix.example.org",
|
|
483
|
+
"Matrix device name (optional)": "OpenClaw Gateway",
|
|
484
|
+
},
|
|
485
|
+
confirm: {
|
|
486
|
+
"Matrix credentials already configured. Keep them?": true,
|
|
487
|
+
"Enable end-to-end encryption (E2EE)?": false,
|
|
488
|
+
"Configure Matrix rooms access?": false,
|
|
489
|
+
"Configure Matrix invite auto-join?": true,
|
|
490
|
+
"Update Matrix invite auto-join?": true,
|
|
491
|
+
},
|
|
492
|
+
});
|
|
493
|
+
|
|
494
|
+
const result = await runMatrixInteractiveConfigure({
|
|
495
|
+
cfg: {
|
|
496
|
+
channels: {
|
|
497
|
+
matrix: {
|
|
498
|
+
homeserver: "https://matrix.example.org",
|
|
499
|
+
accessToken: "matrix-token",
|
|
500
|
+
autoJoin: "allowlist",
|
|
501
|
+
autoJoinAllowlist: ["#ops:example.org"],
|
|
502
|
+
},
|
|
503
|
+
},
|
|
504
|
+
} as CoreConfig,
|
|
505
|
+
prompter,
|
|
506
|
+
configured: true,
|
|
507
|
+
});
|
|
508
|
+
|
|
509
|
+
expect(result).not.toBe("skip");
|
|
510
|
+
if (result === "skip") {
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
expect(result.cfg.channels?.matrix?.autoJoin).toBe("off");
|
|
515
|
+
expect(result.cfg.channels?.matrix?.autoJoinAllowlist).toBeUndefined();
|
|
516
|
+
expect(notes.join("\n")).toContain("Matrix invite auto-join remains off.");
|
|
517
|
+
expect(notes.join("\n")).toContain(
|
|
518
|
+
"Agents will not join invited rooms or fresh DM-style invites until you change autoJoin.",
|
|
519
|
+
);
|
|
520
|
+
});
|
|
521
|
+
|
|
522
|
+
it("re-prompts Matrix invite auto-join allowlists until entries are stable invite targets", async () => {
|
|
523
|
+
installMatrixTestRuntime();
|
|
524
|
+
const notes: string[] = [];
|
|
525
|
+
let inviteAllowlistPrompts = 0;
|
|
526
|
+
|
|
527
|
+
const prompter = createMatrixWizardPrompter({
|
|
528
|
+
notes,
|
|
529
|
+
select: {
|
|
530
|
+
"Matrix already configured. What do you want to do?": "update",
|
|
531
|
+
"Matrix invite auto-join": "allowlist",
|
|
532
|
+
},
|
|
533
|
+
text: {
|
|
534
|
+
"Matrix homeserver URL": "https://matrix.example.org",
|
|
535
|
+
"Matrix device name (optional)": "OpenClaw Gateway",
|
|
536
|
+
},
|
|
537
|
+
confirm: {
|
|
538
|
+
"Matrix credentials already configured. Keep them?": true,
|
|
539
|
+
"Enable end-to-end encryption (E2EE)?": false,
|
|
540
|
+
"Configure Matrix rooms access?": false,
|
|
541
|
+
"Configure Matrix invite auto-join?": true,
|
|
542
|
+
"Update Matrix invite auto-join?": true,
|
|
543
|
+
},
|
|
544
|
+
onText: async (message) => {
|
|
545
|
+
if (message === "Matrix invite auto-join allowlist (comma-separated)") {
|
|
546
|
+
inviteAllowlistPrompts += 1;
|
|
547
|
+
return inviteAllowlistPrompts === 1 ? "Project Room" : "#ops:example.org";
|
|
548
|
+
}
|
|
549
|
+
throw new Error(`unexpected text prompt: ${message}`);
|
|
550
|
+
},
|
|
551
|
+
});
|
|
552
|
+
|
|
553
|
+
const result = await runMatrixInteractiveConfigure({
|
|
554
|
+
cfg: {
|
|
555
|
+
channels: {
|
|
556
|
+
matrix: {
|
|
557
|
+
homeserver: "https://matrix.example.org",
|
|
558
|
+
accessToken: "matrix-token",
|
|
559
|
+
},
|
|
560
|
+
},
|
|
561
|
+
} as CoreConfig,
|
|
562
|
+
prompter,
|
|
563
|
+
configured: true,
|
|
564
|
+
});
|
|
565
|
+
|
|
566
|
+
expect(result).not.toBe("skip");
|
|
567
|
+
if (result === "skip") {
|
|
568
|
+
return;
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
expect(inviteAllowlistPrompts).toBe(2);
|
|
572
|
+
expect(result.cfg.channels?.matrix?.autoJoin).toBe("allowlist");
|
|
573
|
+
expect(result.cfg.channels?.matrix?.autoJoinAllowlist).toEqual(["#ops:example.org"]);
|
|
574
|
+
expect(notes.join("\n")).toContain(
|
|
575
|
+
"Use only stable Matrix invite targets for auto-join: !roomId:server, #alias:server, or *.",
|
|
576
|
+
);
|
|
577
|
+
expect(notes.join("\n")).toContain("Invalid: Project Room");
|
|
578
|
+
});
|
|
579
|
+
|
|
580
|
+
it("reports account-scoped DM config keys for named accounts", () => {
|
|
581
|
+
const resolveConfigKeys = matrixOnboardingAdapter.dmPolicy?.resolveConfigKeys;
|
|
582
|
+
expect(resolveConfigKeys).toBeDefined();
|
|
583
|
+
if (!resolveConfigKeys) {
|
|
584
|
+
return;
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
expect(
|
|
588
|
+
resolveConfigKeys(
|
|
589
|
+
{
|
|
590
|
+
channels: {
|
|
591
|
+
matrix: {
|
|
592
|
+
accounts: {
|
|
593
|
+
default: {
|
|
594
|
+
homeserver: "https://matrix.main.example.org",
|
|
595
|
+
},
|
|
596
|
+
ops: {
|
|
597
|
+
homeserver: "https://matrix.ops.example.org",
|
|
598
|
+
},
|
|
599
|
+
},
|
|
600
|
+
},
|
|
601
|
+
},
|
|
602
|
+
} as CoreConfig,
|
|
603
|
+
"ops",
|
|
604
|
+
),
|
|
605
|
+
).toEqual({
|
|
606
|
+
policyKey: "channels.lobi.accounts.ops.dm.policy",
|
|
607
|
+
allowFromKey: "channels.lobi.accounts.ops.dm.allowFrom",
|
|
608
|
+
});
|
|
609
|
+
});
|
|
610
|
+
|
|
611
|
+
it("reports configured when only the effective default Matrix account is configured", async () => {
|
|
612
|
+
installMatrixTestRuntime();
|
|
613
|
+
|
|
614
|
+
const status = await matrixOnboardingAdapter.getStatus({
|
|
615
|
+
cfg: {
|
|
616
|
+
channels: {
|
|
617
|
+
matrix: {
|
|
618
|
+
defaultAccount: "ops",
|
|
619
|
+
accounts: {
|
|
620
|
+
ops: {
|
|
621
|
+
homeserver: "https://matrix.ops.example.org",
|
|
622
|
+
accessToken: "ops-token",
|
|
623
|
+
},
|
|
624
|
+
},
|
|
625
|
+
},
|
|
626
|
+
},
|
|
627
|
+
} as CoreConfig,
|
|
628
|
+
accountOverrides: {},
|
|
629
|
+
});
|
|
630
|
+
|
|
631
|
+
expect(status.configured).toBe(true);
|
|
632
|
+
expect(status.statusLines).toContain("Matrix: configured");
|
|
633
|
+
expect(status.selectionHint).toBe("configured");
|
|
634
|
+
});
|
|
635
|
+
|
|
636
|
+
it("asks for defaultAccount when multiple named Matrix accounts exist", async () => {
|
|
637
|
+
installMatrixTestRuntime();
|
|
638
|
+
|
|
639
|
+
const status = await matrixOnboardingAdapter.getStatus({
|
|
640
|
+
cfg: {
|
|
641
|
+
channels: {
|
|
642
|
+
matrix: {
|
|
643
|
+
accounts: {
|
|
644
|
+
assistant: {
|
|
645
|
+
homeserver: "https://matrix.assistant.example.org",
|
|
646
|
+
accessToken: "assistant-token",
|
|
647
|
+
},
|
|
648
|
+
ops: {
|
|
649
|
+
homeserver: "https://matrix.ops.example.org",
|
|
650
|
+
accessToken: "ops-token",
|
|
651
|
+
},
|
|
652
|
+
},
|
|
653
|
+
},
|
|
654
|
+
},
|
|
655
|
+
} as CoreConfig,
|
|
656
|
+
accountOverrides: {},
|
|
657
|
+
});
|
|
658
|
+
|
|
659
|
+
expect(status.configured).toBe(false);
|
|
660
|
+
expect(status.statusLines).toEqual([
|
|
661
|
+
'Matrix: set "channels.lobi.defaultAccount" to select a named account',
|
|
662
|
+
]);
|
|
663
|
+
expect(status.selectionHint).toBe("set defaultAccount");
|
|
664
|
+
});
|
|
665
|
+
});
|