@wirecat/whatsapp-cli 0.0.0-stage → 0.1.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/LICENSE +204 -0
- package/README.md +282 -2
- package/dist/adapter/adapter.d.ts +9 -0
- package/dist/adapter/adapter.d.ts.map +1 -0
- package/dist/adapter/adapter.js +326 -0
- package/dist/adapter/adapter.js.map +1 -0
- package/dist/adapter/checks.d.ts +7 -0
- package/dist/adapter/checks.d.ts.map +1 -0
- package/dist/adapter/checks.js +3 -0
- package/dist/adapter/checks.js.map +1 -0
- package/dist/adapter/errors.d.ts +18 -0
- package/dist/adapter/errors.d.ts.map +1 -0
- package/dist/adapter/errors.js +40 -0
- package/dist/adapter/errors.js.map +1 -0
- package/dist/adapter/format-markdown.d.ts +8 -0
- package/dist/adapter/format-markdown.d.ts.map +1 -0
- package/dist/adapter/format-markdown.js +80 -0
- package/dist/adapter/format-markdown.js.map +1 -0
- package/dist/adapter/groups.d.ts +21 -0
- package/dist/adapter/groups.d.ts.map +1 -0
- package/dist/adapter/groups.js +210 -0
- package/dist/adapter/groups.js.map +1 -0
- package/dist/adapter/map.d.ts +9 -0
- package/dist/adapter/map.d.ts.map +1 -0
- package/dist/adapter/map.js +72 -0
- package/dist/adapter/map.js.map +1 -0
- package/dist/adapter/polls.d.ts +21 -0
- package/dist/adapter/polls.d.ts.map +1 -0
- package/dist/adapter/polls.js +103 -0
- package/dist/adapter/polls.js.map +1 -0
- package/dist/app.d.ts +6 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +16 -0
- package/dist/app.js.map +1 -0
- package/dist/bin/wa.d.ts +3 -0
- package/dist/bin/wa.d.ts.map +1 -0
- package/dist/bin/wa.js +27 -0
- package/dist/bin/wa.js.map +1 -0
- package/dist/commands/answer.d.ts +7 -0
- package/dist/commands/answer.d.ts.map +1 -0
- package/dist/commands/answer.js +11 -0
- package/dist/commands/answer.js.map +1 -0
- package/dist/commands/session.d.ts +37 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +202 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/setup.d.ts +3 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +192 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/update.d.ts +2 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +36 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/diagnose.d.ts +77 -0
- package/dist/diagnose.d.ts.map +1 -0
- package/dist/diagnose.js +84 -0
- package/dist/diagnose.js.map +1 -0
- package/dist/engine/contract.d.ts +617 -0
- package/dist/engine/contract.d.ts.map +1 -0
- package/dist/engine/contract.js +186 -0
- package/dist/engine/contract.js.map +1 -0
- package/dist/engine/events.d.ts +9 -0
- package/dist/engine/events.d.ts.map +1 -0
- package/dist/engine/events.js +23 -0
- package/dist/engine/events.js.map +1 -0
- package/dist/engine/go-engine.d.ts +23 -0
- package/dist/engine/go-engine.d.ts.map +1 -0
- package/dist/engine/go-engine.js +238 -0
- package/dist/engine/go-engine.js.map +1 -0
- package/dist/engine/groups.d.ts +159 -0
- package/dist/engine/groups.d.ts.map +1 -0
- package/dist/engine/groups.js +64 -0
- package/dist/engine/groups.js.map +1 -0
- package/dist/engine-binary.d.ts +5 -0
- package/dist/engine-binary.d.ts.map +1 -0
- package/dist/engine-binary.js +18 -0
- package/dist/engine-binary.js.map +1 -0
- package/dist/install/postinstall.d.ts +8 -0
- package/dist/install/postinstall.d.ts.map +1 -0
- package/dist/install/postinstall.js +62 -0
- package/dist/install/postinstall.js.map +1 -0
- package/dist/messenger.d.ts +64 -0
- package/dist/messenger.d.ts.map +1 -0
- package/dist/messenger.js +171 -0
- package/dist/messenger.js.map +1 -0
- package/dist/paths.d.ts +5 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +7 -0
- package/dist/paths.js.map +1 -0
- package/dist/program.d.ts +8 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +114 -0
- package/dist/program.js.map +1 -0
- package/dist/reasons.d.ts +4 -0
- package/dist/reasons.d.ts.map +1 -0
- package/dist/reasons.js +13 -0
- package/dist/reasons.js.map +1 -0
- package/dist/update.d.ts +8 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +26 -0
- package/dist/update.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/install/postinstall.mjs +3 -0
- package/install/windows.ps1 +161 -0
- package/package.json +89 -4
- package/skills/whatsapp-cli/SKILL.md +290 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import * as v from "valibot";
|
|
2
|
+
import { type WaContact } from "./contract.js";
|
|
3
|
+
export declare const waMember: v.StrictObjectSchema<{
|
|
4
|
+
readonly jid: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>;
|
|
5
|
+
readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
6
|
+
readonly role: v.PicklistSchema<["owner", "admin", "member"], undefined>;
|
|
7
|
+
}, undefined>;
|
|
8
|
+
/**
|
|
9
|
+
* A group in WhatsApp's own terms. `addMode` is who may add members; `announce`, only admins send; `locked`, only
|
|
10
|
+
* admins change the name and description; `ephemeral`, seconds until messages disappear, 0 for never. `link` is
|
|
11
|
+
* `null` unless it was asked for and the account may see it.
|
|
12
|
+
*/
|
|
13
|
+
export declare const waGroup: v.StrictObjectSchema<{
|
|
14
|
+
readonly chat: v.StrictObjectSchema<{
|
|
15
|
+
readonly jid: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>;
|
|
16
|
+
readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
17
|
+
readonly kind: v.PicklistSchema<["dm", "self", "group", "newsletter", "broadcast"], undefined>;
|
|
18
|
+
readonly unread: v.NullableSchema<v.NumberSchema<undefined>, undefined>;
|
|
19
|
+
readonly lastMessageAt: v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IsoTimestampAction<string, undefined>]>, undefined>;
|
|
20
|
+
readonly participants: v.NullableSchema<v.NumberSchema<undefined>, undefined>;
|
|
21
|
+
readonly archived: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
|
|
22
|
+
readonly muted: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
|
|
23
|
+
}, undefined>;
|
|
24
|
+
readonly description: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
25
|
+
readonly link: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
26
|
+
readonly addMode: v.PicklistSchema<["admin_add", "all_member_add", ""], undefined>;
|
|
27
|
+
readonly approval: v.BooleanSchema<undefined>;
|
|
28
|
+
readonly announce: v.BooleanSchema<undefined>;
|
|
29
|
+
readonly locked: v.BooleanSchema<undefined>;
|
|
30
|
+
readonly ephemeral: v.NumberSchema<undefined>;
|
|
31
|
+
readonly members: v.ArraySchema<v.StrictObjectSchema<{
|
|
32
|
+
readonly jid: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>;
|
|
33
|
+
readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
34
|
+
readonly role: v.PicklistSchema<["owner", "admin", "member"], undefined>;
|
|
35
|
+
}, undefined>, undefined>;
|
|
36
|
+
}, undefined>;
|
|
37
|
+
/** `notAdded`: who could not be added, by their privacy or the group's limits, in the form they were named. */
|
|
38
|
+
export declare const waCreated: v.StrictObjectSchema<{
|
|
39
|
+
readonly group: v.StrictObjectSchema<{
|
|
40
|
+
readonly chat: v.StrictObjectSchema<{
|
|
41
|
+
readonly jid: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>;
|
|
42
|
+
readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
43
|
+
readonly kind: v.PicklistSchema<["dm", "self", "group", "newsletter", "broadcast"], undefined>;
|
|
44
|
+
readonly unread: v.NullableSchema<v.NumberSchema<undefined>, undefined>;
|
|
45
|
+
readonly lastMessageAt: v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IsoTimestampAction<string, undefined>]>, undefined>;
|
|
46
|
+
readonly participants: v.NullableSchema<v.NumberSchema<undefined>, undefined>;
|
|
47
|
+
readonly archived: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
|
|
48
|
+
readonly muted: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
|
|
49
|
+
}, undefined>;
|
|
50
|
+
readonly description: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
51
|
+
readonly link: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
52
|
+
readonly addMode: v.PicklistSchema<["admin_add", "all_member_add", ""], undefined>;
|
|
53
|
+
readonly approval: v.BooleanSchema<undefined>;
|
|
54
|
+
readonly announce: v.BooleanSchema<undefined>;
|
|
55
|
+
readonly locked: v.BooleanSchema<undefined>;
|
|
56
|
+
readonly ephemeral: v.NumberSchema<undefined>;
|
|
57
|
+
readonly members: v.ArraySchema<v.StrictObjectSchema<{
|
|
58
|
+
readonly jid: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>;
|
|
59
|
+
readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
60
|
+
readonly role: v.PicklistSchema<["owner", "admin", "member"], undefined>;
|
|
61
|
+
}, undefined>, undefined>;
|
|
62
|
+
}, undefined>;
|
|
63
|
+
readonly notAdded: v.ArraySchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>, undefined>;
|
|
64
|
+
}, undefined>;
|
|
65
|
+
export declare const waJoined: v.StrictObjectSchema<{
|
|
66
|
+
readonly group: v.NullableSchema<v.StrictObjectSchema<{
|
|
67
|
+
readonly chat: v.StrictObjectSchema<{
|
|
68
|
+
readonly jid: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>;
|
|
69
|
+
readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
70
|
+
readonly kind: v.PicklistSchema<["dm", "self", "group", "newsletter", "broadcast"], undefined>;
|
|
71
|
+
readonly unread: v.NullableSchema<v.NumberSchema<undefined>, undefined>;
|
|
72
|
+
readonly lastMessageAt: v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IsoTimestampAction<string, undefined>]>, undefined>;
|
|
73
|
+
readonly participants: v.NullableSchema<v.NumberSchema<undefined>, undefined>;
|
|
74
|
+
readonly archived: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
|
|
75
|
+
readonly muted: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
|
|
76
|
+
}, undefined>;
|
|
77
|
+
readonly description: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
78
|
+
readonly link: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
79
|
+
readonly addMode: v.PicklistSchema<["admin_add", "all_member_add", ""], undefined>;
|
|
80
|
+
readonly approval: v.BooleanSchema<undefined>;
|
|
81
|
+
readonly announce: v.BooleanSchema<undefined>;
|
|
82
|
+
readonly locked: v.BooleanSchema<undefined>;
|
|
83
|
+
readonly ephemeral: v.NumberSchema<undefined>;
|
|
84
|
+
readonly members: v.ArraySchema<v.StrictObjectSchema<{
|
|
85
|
+
readonly jid: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>;
|
|
86
|
+
readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
87
|
+
readonly role: v.PicklistSchema<["owner", "admin", "member"], undefined>;
|
|
88
|
+
}, undefined>, undefined>;
|
|
89
|
+
}, undefined>, undefined>;
|
|
90
|
+
readonly requested: v.BooleanSchema<undefined>;
|
|
91
|
+
}, undefined>;
|
|
92
|
+
export declare const waNotAdded: v.StrictObjectSchema<{
|
|
93
|
+
readonly notAdded: v.ArraySchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>, undefined>;
|
|
94
|
+
}, undefined>;
|
|
95
|
+
export declare const waJoinRequest: v.StrictObjectSchema<{
|
|
96
|
+
readonly jid: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>;
|
|
97
|
+
readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
98
|
+
readonly requestedAt: v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IsoTimestampAction<string, undefined>]>, undefined>;
|
|
99
|
+
}, undefined>;
|
|
100
|
+
/** `photo` is `null` when their privacy hides it; `verified` is WhatsApp's badge on an official business. */
|
|
101
|
+
export declare const waProfile: v.StrictObjectSchema<{
|
|
102
|
+
readonly jid: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>;
|
|
103
|
+
readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
104
|
+
readonly about: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
105
|
+
readonly business: v.BooleanSchema<undefined>;
|
|
106
|
+
readonly verified: v.BooleanSchema<undefined>;
|
|
107
|
+
readonly contact: v.BooleanSchema<undefined>;
|
|
108
|
+
readonly photo: v.NullableSchema<v.BooleanSchema<undefined>, undefined>;
|
|
109
|
+
}, undefined>;
|
|
110
|
+
export type WaMember = v.InferOutput<typeof waMember>;
|
|
111
|
+
export type WaGroup = v.InferOutput<typeof waGroup>;
|
|
112
|
+
export type WaCreated = v.InferOutput<typeof waCreated>;
|
|
113
|
+
export type WaJoined = v.InferOutput<typeof waJoined>;
|
|
114
|
+
export type WaJoinRequest = v.InferOutput<typeof waJoinRequest>;
|
|
115
|
+
export type WaProfile = v.InferOutput<typeof waProfile>;
|
|
116
|
+
/** What `updateGroup` changes; a field left out stays. */
|
|
117
|
+
export interface WaGroupChange {
|
|
118
|
+
title?: string;
|
|
119
|
+
description?: string;
|
|
120
|
+
addMode?: "admin_add" | "all_member_add";
|
|
121
|
+
approval?: boolean;
|
|
122
|
+
announce?: boolean;
|
|
123
|
+
locked?: boolean;
|
|
124
|
+
/** Seconds, one of WhatsApp's own timers; 0 turns it off. */
|
|
125
|
+
ephemeral?: number;
|
|
126
|
+
}
|
|
127
|
+
export type WaParticipantAction = "add" | "remove" | "promote" | "demote";
|
|
128
|
+
/** The engine's group and people requests. Every write here is seen by other people. */
|
|
129
|
+
export interface GroupEngine {
|
|
130
|
+
/** One group and its members; the invite link only with `withLink`, and only when the account may see it. */
|
|
131
|
+
group(jid: string, options?: {
|
|
132
|
+
withLink?: boolean;
|
|
133
|
+
}): Promise<WaGroup>;
|
|
134
|
+
/** The people are told they were added. */
|
|
135
|
+
createGroup(title: string, people: string[]): Promise<WaCreated>;
|
|
136
|
+
/** By an invite link; `requested` when the group's admins approve who joins. */
|
|
137
|
+
join(link: string): Promise<WaJoined>;
|
|
138
|
+
leave(jid: string): Promise<void>;
|
|
139
|
+
updateGroup(jid: string, change: WaGroupChange): Promise<WaGroup>;
|
|
140
|
+
/** A new invite link; the old one stops working. */
|
|
141
|
+
resetInviteLink(jid: string): Promise<WaGroup>;
|
|
142
|
+
/** Adds, removes, promotes to admin or demotes; only `add` may leave some out. */
|
|
143
|
+
participants(jid: string, action: WaParticipantAction, people: string[]): Promise<{
|
|
144
|
+
notAdded: string[];
|
|
145
|
+
}>;
|
|
146
|
+
joinRequests(jid: string): Promise<WaJoinRequest[]>;
|
|
147
|
+
answerJoinRequest(jid: string, person: string, accept: boolean): Promise<void>;
|
|
148
|
+
/** Reading it tells them nothing. */
|
|
149
|
+
profile(jid: string): Promise<WaProfile>;
|
|
150
|
+
block(jid: string, blocked: boolean): Promise<void>;
|
|
151
|
+
/** Whether one number has WhatsApp; nothing is sent to it. The engine takes one lookup every few seconds. */
|
|
152
|
+
lookup(phone: string): Promise<WaContact>;
|
|
153
|
+
/** The phone's address book, as the engine's store holds it. */
|
|
154
|
+
contacts(): Promise<WaContact[]>;
|
|
155
|
+
}
|
|
156
|
+
export type EngineRequest = <T>(op: string, fields: Record<string, unknown>, schema: v.GenericSchema<unknown, T>) => Promise<T>;
|
|
157
|
+
/** The group and people requests over the Go engine's JSON lines. */
|
|
158
|
+
export declare const goGroups: (request: EngineRequest) => GroupEngine;
|
|
159
|
+
//# sourceMappingURL=groups.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groups.d.ts","sourceRoot":"","sources":["../../src/engine/groups.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import * as v from "valibot";
|
|
2
|
+
import { waChat, waContact } from "./contract.js";
|
|
3
|
+
const jid = v.pipe(v.string(), v.includes("@"));
|
|
4
|
+
const time = v.pipe(v.string(), v.isoTimestamp());
|
|
5
|
+
export const waMember = v.strictObject({
|
|
6
|
+
jid,
|
|
7
|
+
name: v.nullable(v.string()),
|
|
8
|
+
role: v.picklist(["owner", "admin", "member"]),
|
|
9
|
+
});
|
|
10
|
+
/**
|
|
11
|
+
* A group in WhatsApp's own terms. `addMode` is who may add members; `announce`, only admins send; `locked`, only
|
|
12
|
+
* admins change the name and description; `ephemeral`, seconds until messages disappear, 0 for never. `link` is
|
|
13
|
+
* `null` unless it was asked for and the account may see it.
|
|
14
|
+
*/
|
|
15
|
+
export const waGroup = v.strictObject({
|
|
16
|
+
chat: waChat,
|
|
17
|
+
description: v.nullable(v.string()),
|
|
18
|
+
link: v.nullable(v.string()),
|
|
19
|
+
addMode: v.picklist(["admin_add", "all_member_add", ""]),
|
|
20
|
+
approval: v.boolean(),
|
|
21
|
+
announce: v.boolean(),
|
|
22
|
+
locked: v.boolean(),
|
|
23
|
+
ephemeral: v.number(),
|
|
24
|
+
members: v.array(waMember),
|
|
25
|
+
});
|
|
26
|
+
/** `notAdded`: who could not be added, by their privacy or the group's limits, in the form they were named. */
|
|
27
|
+
export const waCreated = v.strictObject({ group: waGroup, notAdded: v.array(jid) });
|
|
28
|
+
export const waJoined = v.strictObject({ group: v.nullable(waGroup), requested: v.boolean() });
|
|
29
|
+
export const waNotAdded = v.strictObject({ notAdded: v.array(jid) });
|
|
30
|
+
export const waJoinRequest = v.strictObject({ jid, name: v.nullable(v.string()), requestedAt: v.nullable(time) });
|
|
31
|
+
/** `photo` is `null` when their privacy hides it; `verified` is WhatsApp's badge on an official business. */
|
|
32
|
+
export const waProfile = v.strictObject({
|
|
33
|
+
jid,
|
|
34
|
+
name: v.nullable(v.string()),
|
|
35
|
+
about: v.nullable(v.string()),
|
|
36
|
+
business: v.boolean(),
|
|
37
|
+
verified: v.boolean(),
|
|
38
|
+
contact: v.boolean(),
|
|
39
|
+
photo: v.nullable(v.boolean()),
|
|
40
|
+
});
|
|
41
|
+
const nothing = v.nullable(v.unknown());
|
|
42
|
+
/** The group and people requests over the Go engine's JSON lines. */
|
|
43
|
+
export const goGroups = (request) => ({
|
|
44
|
+
group: (jid, { withLink = false } = {}) => request("group", { jid, ...(withLink ? { withLink } : {}) }, waGroup),
|
|
45
|
+
createGroup: (title, people) => request("createGroup", { title, people }, waCreated),
|
|
46
|
+
join: (link) => request("join", { link }, waJoined),
|
|
47
|
+
leave: async (jid) => {
|
|
48
|
+
await request("leave", { jid }, nothing);
|
|
49
|
+
},
|
|
50
|
+
updateGroup: (jid, change) => request("updateGroup", { jid, ...change }, waGroup),
|
|
51
|
+
resetInviteLink: (jid) => request("resetLink", { jid }, waGroup),
|
|
52
|
+
participants: (jid, action, people) => request("participants", { jid, action, people }, waNotAdded),
|
|
53
|
+
joinRequests: (jid) => request("requests", { jid }, v.array(waJoinRequest)),
|
|
54
|
+
answerJoinRequest: async (jid, person, accept) => {
|
|
55
|
+
await request("answerRequest", { jid, people: [person], accept }, nothing);
|
|
56
|
+
},
|
|
57
|
+
profile: (jid) => request("profile", { jid }, waProfile),
|
|
58
|
+
block: async (jid, blocked) => {
|
|
59
|
+
await request("block", { jid, blocked }, nothing);
|
|
60
|
+
},
|
|
61
|
+
lookup: (phone) => request("lookup", { phone }, waContact),
|
|
62
|
+
contacts: () => request("contacts", {}, v.array(waContact)),
|
|
63
|
+
});
|
|
64
|
+
//# sourceMappingURL=groups.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groups.js","sourceRoot":"","sources":["../../src/engine/groups.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAkB,MAAM,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAEjE,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;AAC/C,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAA;AAEjD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,YAAY,CAAC;IACrC,GAAG;IACH,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;CAC/C,CAAC,CAAA;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,YAAY,CAAC;IACpC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACnC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC5B,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC;IACxD,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;IACrB,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;IACrB,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;IACnB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;CAC3B,CAAC,CAAA;AAEF,+GAA+G;AAC/G,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AACnF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;AAC9F,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AACpE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAEjH,6GAA6G;AAC7G,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,YAAY,CAAC;IACtC,GAAG;IACH,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC5B,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC7B,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;IACrB,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;IACrB,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;CAC/B,CAAC,CAAA;AAsDF,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;AAEvC,qEAAqE;AACrE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,OAAsB,EAAe,EAAE,CAAC,CAAC;IAChE,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC;IAChH,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC;IACpF,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC;IACnD,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACnB,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,CAAA;IAC1C,CAAC;IACD,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,EAAE,OAAO,CAAC;IACjF,eAAe,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC;IAChE,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,UAAU,CAAC;IACnG,YAAY,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC3E,iBAAiB,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;QAC/C,MAAM,OAAO,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,CAAA;IAC5E,CAAC;IACD,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,CAAC;IACxD,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;QAC5B,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,CAAA;IACnD,CAAC;IACD,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,CAAC;IAC1D,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;CAC5D,CAAC,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** The npm package that carries the engine for this system, an optional dependency of whatsapp-cli. */
|
|
2
|
+
export declare const enginePackage: (platform?: string, arch?: string) => string;
|
|
3
|
+
/** `WA_ENGINE`, else the engine package installed beside the CLI, else the binary `pnpm engine:build` writes. */
|
|
4
|
+
export declare const engineBinary: (env?: NodeJS.ProcessEnv) => string;
|
|
5
|
+
//# sourceMappingURL=engine-binary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-binary.d.ts","sourceRoot":"","sources":["../src/engine-binary.ts"],"names":[],"mappings":"AAMA,uGAAuG;AACvG,eAAO,MAAM,aAAa,cAAc,MAAM,SAA2B,MAAM,KAAkB,MACjD,CAAA;AAWhD,iHAAiH;AACjH,eAAO,MAAM,YAAY,SAAS,MAAM,CAAC,UAAU,KAAiB,MACsC,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
const EXE = process.platform === "win32" ? ".exe" : "";
|
|
5
|
+
/** The npm package that carries the engine for this system, an optional dependency of whatsapp-cli. */
|
|
6
|
+
export const enginePackage = (platform = process.platform, arch = process.arch) => `@wirecat/whatsapp-engine-${platform}-${arch}`;
|
|
7
|
+
const installed = () => {
|
|
8
|
+
try {
|
|
9
|
+
const manifest = createRequire(import.meta.url).resolve(`${enginePackage()}/package.json`);
|
|
10
|
+
return join(dirname(manifest), "bin", `wa-engine${EXE}`);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
/** `WA_ENGINE`, else the engine package installed beside the CLI, else the binary `pnpm engine:build` writes. */
|
|
17
|
+
export const engineBinary = (env = process.env) => env.WA_ENGINE || installed() || fileURLToPath(new URL(`../engine/bin/wa-engine${EXE}`, import.meta.url));
|
|
18
|
+
//# sourceMappingURL=engine-binary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-binary.js","sourceRoot":"","sources":["../src/engine-binary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;AAEtD,uGAAuG;AACvG,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAQ,GAAW,OAAO,CAAC,QAAQ,EAAE,IAAI,GAAW,OAAO,CAAC,IAAI,EAAU,EAAE,CACxG,4BAA4B,QAAQ,IAAI,IAAI,EAAE,CAAA;AAEhD,MAAM,SAAS,GAAG,GAAuB,EAAE;IACzC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,aAAa,EAAE,eAAe,CAAC,CAAA;QAC1F,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,EAAE,CAAC,CAAA;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC,CAAA;AAED,iHAAiH;AACjH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG,EAAU,EAAE,CAC3E,GAAG,CAAC,SAAS,IAAI,SAAS,EAAE,IAAI,aAAa,CAAC,IAAI,GAAG,CAAC,0BAA0B,GAAG,EAAE,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const completeGlobalInstall: ({ env, platform, packageRoot, repair, note, }?: {
|
|
2
|
+
env?: NodeJS.ProcessEnv | undefined;
|
|
3
|
+
note?: ((message: string) => boolean) | undefined;
|
|
4
|
+
packageRoot?: string | undefined;
|
|
5
|
+
platform?: NodeJS.Platform | undefined;
|
|
6
|
+
repair?: ((prefix: string) => void) | undefined;
|
|
7
|
+
}) => void;
|
|
8
|
+
//# sourceMappingURL=postinstall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postinstall.d.ts","sourceRoot":"","sources":["../../src/install/postinstall.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,qBAAqB;;sBA+Bf,MAAM;;;uBA3BL,MAAM;MA4BjB,IA4BR,CAAA"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { dirname, join, resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
4
|
+
import { installSkill } from "@wirecat/cli-base/skill";
|
|
5
|
+
import { VERSION } from "../version.js";
|
|
6
|
+
const root = resolve(dirname(fileURLToPath(import.meta.url)), "../..");
|
|
7
|
+
export const completeGlobalInstall = ({ env = process.env, platform = process.platform, packageRoot = root, repair = (prefix) => {
|
|
8
|
+
const child = spawnSync("powershell.exe", [
|
|
9
|
+
"-NoProfile",
|
|
10
|
+
"-NonInteractive",
|
|
11
|
+
"-ExecutionPolicy",
|
|
12
|
+
"Bypass",
|
|
13
|
+
"-EncodedCommand",
|
|
14
|
+
Buffer.from("& $env:WA_INSTALL_SCRIPT -RepairOnly -Prefix $env:WA_INSTALL_PREFIX -NodeDirectory $env:WA_INSTALL_NODE -Json", "utf16le").toString("base64"),
|
|
15
|
+
], {
|
|
16
|
+
encoding: "utf8",
|
|
17
|
+
env: {
|
|
18
|
+
...env,
|
|
19
|
+
WA_INSTALL_SCRIPT: resolve(packageRoot, "install/windows.ps1"),
|
|
20
|
+
WA_INSTALL_PREFIX: prefix,
|
|
21
|
+
WA_INSTALL_NODE: dirname(process.execPath),
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
if (child.error || child.status !== 0)
|
|
25
|
+
throw new Error("Windows PATH setup failed; run the Windows installer from the installation guide");
|
|
26
|
+
}, note = (message) => process.stderr.write(`${message}\n`), } = {}) => {
|
|
27
|
+
if (env.npm_config_global !== "true")
|
|
28
|
+
return;
|
|
29
|
+
if (platform === "win32") {
|
|
30
|
+
const prefix = env.npm_config_prefix;
|
|
31
|
+
if (!prefix)
|
|
32
|
+
throw new Error("npm did not provide its global prefix; use the Windows installer");
|
|
33
|
+
repair(prefix);
|
|
34
|
+
note("wa: Windows user PATH updated; new terminals can run wa directly.");
|
|
35
|
+
}
|
|
36
|
+
if (env.WA_INSTALL_AGENT === "none") {
|
|
37
|
+
note("wa: agent skill skipped by WA_INSTALL_AGENT=none; install with wa skill install --for all.");
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
const agent = env.WA_INSTALL_AGENT ?? "all";
|
|
41
|
+
if (!["all", "codex", "cursor", "claude", "gemini"].includes(agent))
|
|
42
|
+
throw new Error("WA_INSTALL_AGENT must be all, codex, cursor, claude, gemini or none");
|
|
43
|
+
const targets = agent === "all"
|
|
44
|
+
? ["claude", "agents"]
|
|
45
|
+
: agent === "claude"
|
|
46
|
+
? ["claude"]
|
|
47
|
+
: ["agents"];
|
|
48
|
+
installSkill({ command: "wa", appName: "whatsapp-cli", version: VERSION }, pathToFileURL(join(packageRoot, "skills/whatsapp-cli/SKILL.md")), { env, targets });
|
|
49
|
+
note("wa: agent skill installed. Agent: read wa skill show before login; verify the installed skill is loaded.");
|
|
50
|
+
}
|
|
51
|
+
note("wa: link an account: wa personal session start (any profile name in place of personal).");
|
|
52
|
+
};
|
|
53
|
+
if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
|
|
54
|
+
try {
|
|
55
|
+
completeGlobalInstall();
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
process.stderr.write(`wa installation incomplete: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
59
|
+
process.exitCode = 1;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=postinstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postinstall.js","sourceRoot":"","sources":["../../src/install/postinstall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { type BaseContext, type BaseEnvironment, type Closeable, type Messenger } from "@wirecat/cli-core/cli";
|
|
2
|
+
import type { UpdateEnvironment } from "@wirecat/cli-core/update";
|
|
3
|
+
import type { Command } from "commander";
|
|
4
|
+
import { type WhatsAppEngine } from "./engine/contract.js";
|
|
5
|
+
export interface EngineRequest {
|
|
6
|
+
storePath: string;
|
|
7
|
+
/** The command holding the connection, named to anyone the engine's lock refuses. */
|
|
8
|
+
holder: string;
|
|
9
|
+
listen: boolean;
|
|
10
|
+
link: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface Environment extends BaseEnvironment {
|
|
13
|
+
/** Tests hand in an engine in memory. */
|
|
14
|
+
engine?: (request: EngineRequest) => WhatsAppEngine | Promise<WhatsAppEngine>;
|
|
15
|
+
/** Tests run a stand-in for the Go engine binary, through the real client. */
|
|
16
|
+
engineCommand?: {
|
|
17
|
+
file: string;
|
|
18
|
+
args: string[];
|
|
19
|
+
};
|
|
20
|
+
/** Tests shorten how long `session start` waits for the phone's history. */
|
|
21
|
+
historyWait?: {
|
|
22
|
+
firstMs: number;
|
|
23
|
+
quietMs: number;
|
|
24
|
+
};
|
|
25
|
+
/** npm, the package manager and this install's path, for `upgrade` and the update notice; tests hand them in. */
|
|
26
|
+
update?: UpdateEnvironment;
|
|
27
|
+
}
|
|
28
|
+
/** A code to show while linking: the engine's, in the terms a command may see. */
|
|
29
|
+
export interface LinkCode {
|
|
30
|
+
login: "qr" | "pair";
|
|
31
|
+
code: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Starts the engine for the command's profile, or throws saying how to log in. Only a login (`link`) may start on
|
|
35
|
+
* a profile that has no device yet.
|
|
36
|
+
*/
|
|
37
|
+
export declare const openEngine: (command: Command, base: Pick<BaseContext, "settings" | "env" | "renderer">, { listen, link }?: {
|
|
38
|
+
listen?: boolean;
|
|
39
|
+
link?: boolean;
|
|
40
|
+
}) => Promise<WhatsAppEngine>;
|
|
41
|
+
export interface Linked {
|
|
42
|
+
account: {
|
|
43
|
+
id: string;
|
|
44
|
+
name: string | null;
|
|
45
|
+
};
|
|
46
|
+
/** Nothing was asked: the profile was linked before. */
|
|
47
|
+
alreadyLinked: boolean;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Links the profile's device, showing each code through `onCode`. A newly linked engine stays open and is handed to
|
|
51
|
+
* the command's next `connect`; an already linked one is closed and nothing is asked.
|
|
52
|
+
*/
|
|
53
|
+
export declare const linkDevice: (command: Command, base: Pick<BaseContext, "settings" | "env" | "renderer">, { method, phone, onCode, beforeLink, track, }: {
|
|
54
|
+
method: "qr" | "phone";
|
|
55
|
+
phone: () => Promise<string>;
|
|
56
|
+
onCode: (code: LinkCode) => void;
|
|
57
|
+
/** Throws when nobody could answer: a store can exist without a device, after a link that did not finish. */
|
|
58
|
+
beforeLink?: () => void;
|
|
59
|
+
/** Closed by the caller's deadline as well. */
|
|
60
|
+
track?: (engine: Closeable) => void;
|
|
61
|
+
}) => Promise<Linked>;
|
|
62
|
+
export declare const SKILL: import("url").URL;
|
|
63
|
+
export declare const WHATSAPP: Messenger;
|
|
64
|
+
//# sourceMappingURL=messenger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messenger.d.ts","sourceRoot":"","sources":["../src/messenger.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,SAAS,EAEd,KAAK,SAAS,EACf,MAAM,uBAAuB,CAAA;AAC9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAOxC,OAAO,EAAe,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAIvE,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,qFAAqF;IACrF,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;IACf,IAAI,EAAE,OAAO,CAAA;CACd;AAED,MAAM,WAAW,WAAY,SAAQ,eAAe;IAClD,yCAAyC;IACzC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;IAC7E,8EAA8E;IAC9E,aAAa,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;IAChD,4EAA4E;IAC5E,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IAClD,iHAAiH;IACjH,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAC3B;AAkBD,kFAAkF;AAClF,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,IAAI,GAAG,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,YACZ,OAAO,QACV,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,KAAK,GAAG,UAAU,CAAC,qBACtB;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,KACrE,OAAO,CAAC,cAAc,CASxB,CAAA;AA+BD,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;IAC5C,wDAAwD;IACxD,aAAa,EAAE,OAAO,CAAA;CACvB;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,YACZ,OAAO,QACV,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,KAAK,GAAG,UAAU,CAAC,iDAOrD;IACD,MAAM,EAAE,IAAI,GAAG,OAAO,CAAA;IACtB,KAAK,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;IAC5B,MAAM,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAA;IAChC,6GAA6G;IAC7G,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;IACvB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAA;CACpC,KACA,OAAO,CAAC,MAAM,CAmBhB,CAAA;AAED,eAAO,MAAM,KAAK,mBAA8D,CAAA;AAEhF,eAAO,MAAM,QAAQ,EAAE,SAoFtB,CAAA"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { CliError } from "@wirecat/cli-base";
|
|
3
|
+
import { asFirstWord, environmentOf, } from "@wirecat/cli-core/cli";
|
|
4
|
+
import { whatsAppAdapter } from "./adapter/adapter.js";
|
|
5
|
+
import { fromEngine } from "./adapter/errors.js";
|
|
6
|
+
import { ADMIN_RIGHTS, GROUP_SETTINGS } from "./adapter/groups.js";
|
|
7
|
+
import { resolveSettings, WA } from "./app.js";
|
|
8
|
+
import { diagnoseWhatsApp } from "./diagnose.js";
|
|
9
|
+
import { EngineError } from "./engine/contract.js";
|
|
10
|
+
import { startGoEngine } from "./engine/go-engine.js";
|
|
11
|
+
import { privateStore } from "./paths.js";
|
|
12
|
+
const holderOf = (command) => {
|
|
13
|
+
const words = [];
|
|
14
|
+
for (let at = command; at?.parent; at = at.parent)
|
|
15
|
+
words.unshift(at.name());
|
|
16
|
+
return words.join(" ") || "wa";
|
|
17
|
+
};
|
|
18
|
+
const COMMANDS = { "chats.list": "chats list", serve: "serve", "session.start": "session start" };
|
|
19
|
+
/** The commands the adapter's messages send a person to, with this profile named first. */
|
|
20
|
+
const wordsFor = (profile) => (check) => `\`wa ${asFirstWord(profile)}${COMMANDS[check]}\``;
|
|
21
|
+
const loginHint = (profile) => wordsFor(profile)("session.start");
|
|
22
|
+
/**
|
|
23
|
+
* Starts the engine for the command's profile, or throws saying how to log in. Only a login (`link`) may start on
|
|
24
|
+
* a profile that has no device yet.
|
|
25
|
+
*/
|
|
26
|
+
export const openEngine = async (command, base, { listen = false, link = false } = {}) => {
|
|
27
|
+
const { profile } = base.settings;
|
|
28
|
+
const request = { storePath: privateStore(profile, base.env), holder: holderOf(command), listen, link };
|
|
29
|
+
const { engine: given, engineCommand, trackCloseable } = environmentOf(command);
|
|
30
|
+
// The engine ignores Ctrl+C and lives until its stdin closes, so the runner must be able to close it on a signal or
|
|
31
|
+
// a deadline: a login waiting for a scan would otherwise keep the process alive.
|
|
32
|
+
const engine = given ? await given(request) : await startEngine(request, base, engineCommand);
|
|
33
|
+
trackCloseable?.(engine);
|
|
34
|
+
return engine;
|
|
35
|
+
};
|
|
36
|
+
const startEngine = async (request, base, engineCommand) => {
|
|
37
|
+
const { profile } = base.settings;
|
|
38
|
+
if (!request.link && !existsSync(request.storePath))
|
|
39
|
+
throw new CliError("authentication_error", `profile "${profile}" is not linked to WhatsApp — run ${loginHint(profile)}`);
|
|
40
|
+
try {
|
|
41
|
+
return await startGoEngine({
|
|
42
|
+
...request,
|
|
43
|
+
env: base.env,
|
|
44
|
+
warn: base.renderer.warn,
|
|
45
|
+
...(engineCommand ? { command: engineCommand } : {}),
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
if (error instanceof EngineError && error.code === "authentication_error")
|
|
50
|
+
throw new CliError("authentication_error", `${error.message} — run ${loginHint(profile)}`);
|
|
51
|
+
if (error instanceof EngineError)
|
|
52
|
+
throw fromEngine(error);
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
/** An engine that just linked, kept open for the command's next connect: the first history push comes on it. */
|
|
57
|
+
const handedOver = new WeakMap();
|
|
58
|
+
/**
|
|
59
|
+
* Links the profile's device, showing each code through `onCode`. A newly linked engine stays open and is handed to
|
|
60
|
+
* the command's next `connect`; an already linked one is closed and nothing is asked.
|
|
61
|
+
*/
|
|
62
|
+
export const linkDevice = async (command, base, { method, phone, onCode, beforeLink, track, }) => {
|
|
63
|
+
const engine = await openEngine(command, base, { link: true, listen: true });
|
|
64
|
+
track?.(engine);
|
|
65
|
+
let keep = false;
|
|
66
|
+
try {
|
|
67
|
+
const alreadyLinked = engine.self() !== null;
|
|
68
|
+
if (!alreadyLinked)
|
|
69
|
+
beforeLink?.();
|
|
70
|
+
const account = alreadyLinked
|
|
71
|
+
? await engine.me()
|
|
72
|
+
: await engine.link(method === "phone" ? { method, phone: await phone() } : { method }, onCode);
|
|
73
|
+
keep = !alreadyLinked;
|
|
74
|
+
if (keep)
|
|
75
|
+
handedOver.set(command, engine);
|
|
76
|
+
return { account: { id: account.jid, name: account.name }, alreadyLinked };
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
if (error instanceof EngineError)
|
|
80
|
+
throw fromEngine(error);
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
finally {
|
|
84
|
+
if (!keep)
|
|
85
|
+
await engine.close();
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
export const SKILL = new URL("../skills/whatsapp-cli/SKILL.md", import.meta.url);
|
|
89
|
+
export const WHATSAPP = {
|
|
90
|
+
app: WA,
|
|
91
|
+
provider: "whatsapp",
|
|
92
|
+
name: "WhatsApp",
|
|
93
|
+
resolveSettings,
|
|
94
|
+
history: "store",
|
|
95
|
+
historyOnDemand: true,
|
|
96
|
+
// WhatsApp drops the older of two connections, so while serve holds the device every command runs through it.
|
|
97
|
+
connection: "exclusive",
|
|
98
|
+
// Ids are WhatsApp's own strings, so held stretches are keyed by time. A page is one request to the phone for older
|
|
99
|
+
// messages (the adapter's `history`), and WhatsApp's own clients ask 50 at a time.
|
|
100
|
+
fetching: { page: 50, maxPageSize: 50, pause: "2s", jitter: true, maxPages: 20, orderBy: "time" },
|
|
101
|
+
chatArgument: "a chat: its name, or its WhatsApp id (…@lid, …@g.us)",
|
|
102
|
+
inviteLinks: /chat\.whatsapp\.com\/[A-Za-z0-9]+/i,
|
|
103
|
+
// The chat with yourself has your own id.
|
|
104
|
+
savedChatId: (account) => account.account,
|
|
105
|
+
partnerOf: (chat) => (chat.kind === "dialog" ? chat.id : undefined),
|
|
106
|
+
skill: SKILL,
|
|
107
|
+
diagnose: async (command, base) => diagnoseWhatsApp(base.settings.profile, base.env, environmentOf(command).update),
|
|
108
|
+
// What WhatsApp does not have, so the shared commands do not offer it: forum topics, folders, more than one
|
|
109
|
+
// invite link per group (`chats link reset` replaces the one there is), answering every join request at once,
|
|
110
|
+
// channel comments, history shown to people added later, and admins with some rights but not others: every admin
|
|
111
|
+
// gets them all, so `admins add` takes no `--can`.
|
|
112
|
+
topics: false,
|
|
113
|
+
folderOrder: false,
|
|
114
|
+
folderJoin: false,
|
|
115
|
+
inviteLinkCreate: false,
|
|
116
|
+
inviteLinkList: false,
|
|
117
|
+
inviteLinkRevoke: false,
|
|
118
|
+
joinRequestsAll: false,
|
|
119
|
+
channelComments: false,
|
|
120
|
+
addsWithHistory: false,
|
|
121
|
+
// A document carries the name the recipient sees; WhatsApp has no spoiler and no caption above.
|
|
122
|
+
mediaOptions: ["fileName"],
|
|
123
|
+
groupSettings: GROUP_SETTINGS,
|
|
124
|
+
adminRights: ADMIN_RIGHTS,
|
|
125
|
+
pickAdminRights: false,
|
|
126
|
+
// A WhatsApp poll stays open, and any vote in it can be changed; everyone sees who voted for what.
|
|
127
|
+
pollClose: false,
|
|
128
|
+
pollRevote: false,
|
|
129
|
+
pollVoters: true,
|
|
130
|
+
pollAnonymous: false,
|
|
131
|
+
// Every message goes as the account, at once, with a notification.
|
|
132
|
+
silentSends: false,
|
|
133
|
+
sendAs: false,
|
|
134
|
+
scheduledSends: false,
|
|
135
|
+
// Nothing sends unless a typed command asked: WhatsApp bans accounts that answer like a bot.
|
|
136
|
+
autoReplies: false,
|
|
137
|
+
lacks: [
|
|
138
|
+
"updateProfile",
|
|
139
|
+
"sessions",
|
|
140
|
+
"endOtherSessions",
|
|
141
|
+
"chatEvents",
|
|
142
|
+
"inspect",
|
|
143
|
+
"folders",
|
|
144
|
+
"createFolder",
|
|
145
|
+
"updateFolder",
|
|
146
|
+
"deleteFolder",
|
|
147
|
+
"addContact",
|
|
148
|
+
"removeContact",
|
|
149
|
+
"renameContact",
|
|
150
|
+
"importContacts",
|
|
151
|
+
"pin",
|
|
152
|
+
"unpin",
|
|
153
|
+
],
|
|
154
|
+
// Every delete wa makes is for everyone, which an agent may never do: the MCP delete refuses up front instead of
|
|
155
|
+
// answering with an "add --for-everyone" that only the owner can act on.
|
|
156
|
+
deleteForMe: false,
|
|
157
|
+
connect: async (command, base, options = {}) => {
|
|
158
|
+
const linked = handedOver.get(command);
|
|
159
|
+
handedOver.delete(command);
|
|
160
|
+
const words = wordsFor(base.settings.profile);
|
|
161
|
+
if (linked)
|
|
162
|
+
return whatsAppAdapter(linked, options.stored, words);
|
|
163
|
+
const engine = await openEngine(command, base, { listen: options.listen === true });
|
|
164
|
+
if (engine.self() === null) {
|
|
165
|
+
await engine.close();
|
|
166
|
+
throw new CliError("authentication_error", `profile "${base.settings.profile}" is not linked to WhatsApp — run ${loginHint(base.settings.profile)}`);
|
|
167
|
+
}
|
|
168
|
+
return whatsAppAdapter(engine, options.stored, words);
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
//# sourceMappingURL=messenger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messenger.js","sourceRoot":"","sources":["../src/messenger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EACL,WAAW,EAIX,aAAa,GAEd,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,WAAW,EAAuB,MAAM,sBAAsB,CAAA;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAqBzC,MAAM,QAAQ,GAAG,CAAC,OAAgB,EAAU,EAAE;IAC5C,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,IAAI,EAAE,GAAmB,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM;QAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;IAC3F,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAA;AAChC,CAAC,CAAA;AAED,MAAM,QAAQ,GAA0B,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,CAAA;AAExH,2FAA2F;AAC3F,MAAM,QAAQ,GACZ,CAAC,OAAe,EAAS,EAAE,CAC3B,CAAC,KAAK,EAAE,EAAE,CACR,QAAQ,WAAW,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAA;AAEtD,MAAM,SAAS,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAA;AAQzE;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAC7B,OAAgB,EAChB,IAAwD,EACxD,EAAE,MAAM,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,EAAE,GAAyC,EAAE,EAClD,EAAE;IAC3B,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAA;IACjC,MAAM,OAAO,GAAkB,EAAE,SAAS,EAAE,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;IACtH,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,aAAa,CAAc,OAAO,CAAC,CAAA;IAC5F,oHAAoH;IACpH,iFAAiF;IACjF,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,aAAa,CAAC,CAAA;IAC7F,cAAc,EAAE,CAAC,MAAM,CAAC,CAAA;IACxB,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,MAAM,WAAW,GAAG,KAAK,EACvB,OAAsB,EACtB,IAAwD,EACxD,aAA2C,EAClB,EAAE;IAC3B,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAA;IACjC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC;QACjD,MAAM,IAAI,QAAQ,CAChB,sBAAsB,EACtB,YAAY,OAAO,qCAAqC,SAAS,CAAC,OAAO,CAAC,EAAE,CAC7E,CAAA;IACH,IAAI,CAAC;QACH,OAAO,MAAM,aAAa,CAAC;YACzB,GAAG,OAAO;YACV,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;YACxB,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrD,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB;YACvE,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,GAAG,KAAK,CAAC,OAAO,UAAU,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC5F,IAAI,KAAK,YAAY,WAAW;YAAE,MAAM,UAAU,CAAC,KAAK,CAAC,CAAA;QACzD,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC,CAAA;AAED,gHAAgH;AAChH,MAAM,UAAU,GAAG,IAAI,OAAO,EAA2B,CAAA;AAQzD;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAC7B,OAAgB,EAChB,IAAwD,EACxD,EACE,MAAM,EACN,KAAK,EACL,MAAM,EACN,UAAU,EACV,KAAK,GASN,EACgB,EAAE;IACnB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;IAC5E,KAAK,EAAE,CAAC,MAAM,CAAC,CAAA;IACf,IAAI,IAAI,GAAG,KAAK,CAAA;IAChB,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,CAAA;QAC5C,IAAI,CAAC,aAAa;YAAE,UAAU,EAAE,EAAE,CAAA;QAClC,MAAM,OAAO,GAAG,aAAa;YAC3B,CAAC,CAAC,MAAM,MAAM,CAAC,EAAE,EAAE;YACnB,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,CAAA;QACjG,IAAI,GAAG,CAAC,aAAa,CAAA;QACrB,IAAI,IAAI;YAAE,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QACzC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,CAAA;IAC5E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW;YAAE,MAAM,UAAU,CAAC,KAAK,CAAC,CAAA;QACzD,MAAM,KAAK,CAAA;IACb,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,IAAI;YAAE,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;IACjC,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,iCAAiC,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAA;AAEhF,MAAM,CAAC,MAAM,QAAQ,GAAc;IACjC,GAAG,EAAE,EAAE;IACP,QAAQ,EAAE,UAAU;IACpB,IAAI,EAAE,UAAU;IAChB,eAAe;IACf,OAAO,EAAE,OAAO;IAChB,eAAe,EAAE,IAAI;IACrB,8GAA8G;IAC9G,UAAU,EAAE,WAAW;IACvB,oHAAoH;IACpH,mFAAmF;IACnF,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;IACjG,YAAY,EAAE,sDAAsD;IACpE,WAAW,EAAE,oCAAoC;IACjD,0CAA0C;IAC1C,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO;IACzC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,KAAK,EAAE,KAAK;IACZ,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAChC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,aAAa,CAAc,OAAO,CAAC,CAAC,MAAM,CAAC;IAC/F,4GAA4G;IAC5G,8GAA8G;IAC9G,iHAAiH;IACjH,mDAAmD;IACnD,MAAM,EAAE,KAAK;IACb,WAAW,EAAE,KAAK;IAClB,UAAU,EAAE,KAAK;IACjB,gBAAgB,EAAE,KAAK;IACvB,cAAc,EAAE,KAAK;IACrB,gBAAgB,EAAE,KAAK;IACvB,eAAe,EAAE,KAAK;IACtB,eAAe,EAAE,KAAK;IACtB,eAAe,EAAE,KAAK;IACtB,gGAAgG;IAChG,YAAY,EAAE,CAAC,UAAU,CAAC;IAC1B,aAAa,EAAE,cAAc;IAC7B,WAAW,EAAE,YAAY;IACzB,eAAe,EAAE,KAAK;IACtB,mGAAmG;IACnG,SAAS,EAAE,KAAK;IAChB,UAAU,EAAE,KAAK;IACjB,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,KAAK;IACpB,mEAAmE;IACnE,WAAW,EAAE,KAAK;IAClB,MAAM,EAAE,KAAK;IACb,cAAc,EAAE,KAAK;IACrB,6FAA6F;IAC7F,WAAW,EAAE,KAAK;IAClB,KAAK,EAAE;QACL,eAAe;QACf,UAAU;QACV,kBAAkB;QAClB,YAAY;QACZ,SAAS;QACT,SAAS;QACT,cAAc;QACd,cAAc;QACd,cAAc;QACd,YAAY;QACZ,eAAe;QACf,eAAe;QACf,gBAAgB;QAChB,KAAK;QACL,OAAO;KACR;IACD,iHAAiH;IACjH,yEAAyE;IACzE,WAAW,EAAE,KAAK;IAClB,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,EAAE,EAAE,EAAE;QAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACtC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAC1B,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QAC7C,IAAI,MAAM;YAAE,OAAO,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QACjE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAA;QACnF,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YAC3B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;YACpB,MAAM,IAAI,QAAQ,CAChB,sBAAsB,EACtB,YAAY,IAAI,CAAC,QAAQ,CAAC,OAAO,qCAAqC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CACzG,CAAA;QACH,CAAC;QACD,OAAO,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACvD,CAAC;CACF,CAAA"}
|
package/dist/paths.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type Paths } from "@wirecat/cli-base";
|
|
2
|
+
export declare const pathsFor: (env?: NodeJS.ProcessEnv) => Paths;
|
|
3
|
+
/** The engine's device store: the linked device's keys, a credential as good as a password. One device per file. */
|
|
4
|
+
export declare const privateStore: (profile: string, env?: NodeJS.ProcessEnv) => string;
|
|
5
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,KAAK,EAAgB,MAAM,mBAAmB,CAAA;AAG5D,eAAO,MAAM,QAAQ,SAAS,MAAM,CAAC,UAAU,KAAiB,KACE,CAAA;AAElE,oHAAoH;AACpH,eAAO,MAAM,YAAY,YAAa,MAAM,QAAO,MAAM,CAAC,UAAU,KAAiB,MACvB,CAAA"}
|