gws-axi 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 +21 -0
- package/README.md +91 -0
- package/dist/bin/gws-axi.d.ts +2 -0
- package/dist/bin/gws-axi.js +4 -0
- package/dist/bin/gws-axi.js.map +1 -0
- package/dist/src/auth/gcloud.d.ts +21 -0
- package/dist/src/auth/gcloud.js +134 -0
- package/dist/src/auth/gcloud.js.map +1 -0
- package/dist/src/auth/loopback.d.ts +50 -0
- package/dist/src/auth/loopback.js +420 -0
- package/dist/src/auth/loopback.js.map +1 -0
- package/dist/src/auth/pending.d.ts +15 -0
- package/dist/src/auth/pending.js +35 -0
- package/dist/src/auth/pending.js.map +1 -0
- package/dist/src/auth/scopes.d.ts +13 -0
- package/dist/src/auth/scopes.js +29 -0
- package/dist/src/auth/scopes.js.map +1 -0
- package/dist/src/auth/setup-html.d.ts +13 -0
- package/dist/src/auth/setup-html.js +245 -0
- package/dist/src/auth/setup-html.js.map +1 -0
- package/dist/src/auth/state.d.ts +4 -0
- package/dist/src/auth/state.js +41 -0
- package/dist/src/auth/state.js.map +1 -0
- package/dist/src/auth/steps.d.ts +30 -0
- package/dist/src/auth/steps.js +306 -0
- package/dist/src/auth/steps.js.map +1 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +72 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/commands/auth.d.ts +2 -0
- package/dist/src/commands/auth.js +453 -0
- package/dist/src/commands/auth.js.map +1 -0
- package/dist/src/commands/calendar/calendars.d.ts +2 -0
- package/dist/src/commands/calendar/calendars.js +98 -0
- package/dist/src/commands/calendar/calendars.js.map +1 -0
- package/dist/src/commands/calendar/events.d.ts +2 -0
- package/dist/src/commands/calendar/events.js +261 -0
- package/dist/src/commands/calendar/events.js.map +1 -0
- package/dist/src/commands/calendar/get.d.ts +2 -0
- package/dist/src/commands/calendar/get.js +176 -0
- package/dist/src/commands/calendar/get.js.map +1 -0
- package/dist/src/commands/calendar.d.ts +2 -0
- package/dist/src/commands/calendar.js +76 -0
- package/dist/src/commands/calendar.js.map +1 -0
- package/dist/src/commands/docs.d.ts +2 -0
- package/dist/src/commands/docs.js +19 -0
- package/dist/src/commands/docs.js.map +1 -0
- package/dist/src/commands/doctor.d.ts +2 -0
- package/dist/src/commands/doctor.js +213 -0
- package/dist/src/commands/doctor.js.map +1 -0
- package/dist/src/commands/drive.d.ts +2 -0
- package/dist/src/commands/drive.js +17 -0
- package/dist/src/commands/drive.js.map +1 -0
- package/dist/src/commands/gmail.d.ts +2 -0
- package/dist/src/commands/gmail.js +20 -0
- package/dist/src/commands/gmail.js.map +1 -0
- package/dist/src/commands/home.d.ts +1 -0
- package/dist/src/commands/home.js +42 -0
- package/dist/src/commands/home.js.map +1 -0
- package/dist/src/commands/service-stub.d.ts +8 -0
- package/dist/src/commands/service-stub.js +67 -0
- package/dist/src/commands/service-stub.js.map +1 -0
- package/dist/src/commands/slides.d.ts +2 -0
- package/dist/src/commands/slides.js +11 -0
- package/dist/src/commands/slides.js.map +1 -0
- package/dist/src/config.d.ts +46 -0
- package/dist/src/config.js +155 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/google/account.d.ts +12 -0
- package/dist/src/google/account.js +65 -0
- package/dist/src/google/account.js.map +1 -0
- package/dist/src/google/client.d.ts +29 -0
- package/dist/src/google/client.js +106 -0
- package/dist/src/google/client.js.map +1 -0
- package/dist/src/google/probe.d.ts +15 -0
- package/dist/src/google/probe.js +200 -0
- package/dist/src/google/probe.js.map +1 -0
- package/dist/src/google/tokens.d.ts +22 -0
- package/dist/src/google/tokens.js +91 -0
- package/dist/src/google/tokens.js.map +1 -0
- package/dist/src/output/index.d.ts +2 -0
- package/dist/src/output/index.js +3 -0
- package/dist/src/output/index.js.map +1 -0
- package/dist/src/output/render.d.ts +40 -0
- package/dist/src/output/render.js +65 -0
- package/dist/src/output/render.js.map +1 -0
- package/dist/src/output/schema.d.ts +32 -0
- package/dist/src/output/schema.js +69 -0
- package/dist/src/output/schema.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar.js","sourceRoot":"","sources":["../../../src/commands/calendar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { buildServiceStub } from "./service-stub.js";
|
|
2
|
+
const stub = buildServiceStub("docs", [
|
|
3
|
+
{ name: "read", mutation: false },
|
|
4
|
+
{ name: "find", mutation: false },
|
|
5
|
+
{ name: "comments", mutation: false },
|
|
6
|
+
{ name: "append", mutation: true },
|
|
7
|
+
{ name: "insert-text", mutation: true },
|
|
8
|
+
{ name: "delete-range", mutation: true },
|
|
9
|
+
{ name: "style-text", mutation: true },
|
|
10
|
+
{ name: "style-paragraph", mutation: true },
|
|
11
|
+
{ name: "insert-table", mutation: true },
|
|
12
|
+
{ name: "edit-cell", mutation: true },
|
|
13
|
+
{ name: "comment-add", mutation: true },
|
|
14
|
+
{ name: "comment-reply", mutation: true },
|
|
15
|
+
{ name: "comment-resolve", mutation: true },
|
|
16
|
+
]);
|
|
17
|
+
export const DOCS_HELP = stub.help;
|
|
18
|
+
export const docsCommand = stub.command;
|
|
19
|
+
//# sourceMappingURL=docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../../src/commands/docs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,EAAE;IACpC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;IACjC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;IACjC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE;IACrC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE;IACvC,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE;IACxC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE;IACtC,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC3C,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE;IACxC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE;IACrC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE;IACvC,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE;IACzC,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,IAAI,EAAE;CAC5C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC;AACnC,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { existsSync, accessSync, constants } from "node:fs";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { configDir, getDefaultAccount, listAccounts, readSetupState, setupProgress, SETUP_STEP_ORDER, } from "../config.js";
|
|
5
|
+
import { probeAccount } from "../google/probe.js";
|
|
6
|
+
import { SERVICES } from "../auth/scopes.js";
|
|
7
|
+
function collapseHomeDirectory(path) {
|
|
8
|
+
const home = homedir();
|
|
9
|
+
return path.startsWith(home) ? `~${path.slice(home.length)}` : path;
|
|
10
|
+
}
|
|
11
|
+
export const DOCTOR_HELP = `usage: gws-axi doctor [--check <tier|tier.service>] [--summary]
|
|
12
|
+
flags[3]:
|
|
13
|
+
--check <tier> Run only one tier (prerequisites|setup|runtime)
|
|
14
|
+
--check runtime.<service> Run probes for one service (${SERVICES.join(" | ")})
|
|
15
|
+
--summary One-line summary output (used by SessionStart hook)
|
|
16
|
+
tiers:
|
|
17
|
+
prerequisites gcloud presence, node version, config dir perms
|
|
18
|
+
setup progress of the 7-step BYO onboarding
|
|
19
|
+
runtime live per-account × per-service API probes (token, scope, reachability)
|
|
20
|
+
exit codes:
|
|
21
|
+
0 all checks passed (or warnings only)
|
|
22
|
+
1 at least one failing check
|
|
23
|
+
examples:
|
|
24
|
+
gws-axi doctor
|
|
25
|
+
gws-axi doctor --summary
|
|
26
|
+
gws-axi doctor --check prerequisites
|
|
27
|
+
gws-axi doctor --check runtime
|
|
28
|
+
gws-axi doctor --check runtime.gmail
|
|
29
|
+
`;
|
|
30
|
+
function checkPrerequisites() {
|
|
31
|
+
const rows = [];
|
|
32
|
+
try {
|
|
33
|
+
const version = execFileSync("gcloud", ["--version"], {
|
|
34
|
+
encoding: "utf-8",
|
|
35
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
36
|
+
})
|
|
37
|
+
.split("\n")[0]
|
|
38
|
+
.trim();
|
|
39
|
+
rows.push({ check: "gcloud CLI", status: "ok", detail: version });
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
rows.push({
|
|
43
|
+
check: "gcloud CLI",
|
|
44
|
+
status: "warn",
|
|
45
|
+
detail: "not installed (setup will use deep-links instead)",
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
const nodeVersion = process.versions.node;
|
|
49
|
+
const major = parseInt(nodeVersion.split(".")[0] ?? "0", 10);
|
|
50
|
+
rows.push({
|
|
51
|
+
check: "node runtime",
|
|
52
|
+
status: major >= 20 ? "ok" : "fail",
|
|
53
|
+
detail: `v${nodeVersion}${major >= 20 ? "" : " (requires >=20)"}`,
|
|
54
|
+
});
|
|
55
|
+
const dir = configDir();
|
|
56
|
+
if (!existsSync(dir)) {
|
|
57
|
+
rows.push({
|
|
58
|
+
check: "config dir",
|
|
59
|
+
status: "warn",
|
|
60
|
+
detail: `${collapseHomeDirectory(dir)} does not exist yet (created on first setup)`,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
try {
|
|
65
|
+
accessSync(dir, constants.R_OK | constants.W_OK);
|
|
66
|
+
rows.push({
|
|
67
|
+
check: "config dir",
|
|
68
|
+
status: "ok",
|
|
69
|
+
detail: `${collapseHomeDirectory(dir)} (rw)`,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
rows.push({
|
|
74
|
+
check: "config dir",
|
|
75
|
+
status: "fail",
|
|
76
|
+
detail: `${collapseHomeDirectory(dir)} not writable`,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return rows;
|
|
81
|
+
}
|
|
82
|
+
function checkSetup() {
|
|
83
|
+
const state = readSetupState();
|
|
84
|
+
return SETUP_STEP_ORDER.map((key) => {
|
|
85
|
+
const step = state.steps[key];
|
|
86
|
+
if (step.done) {
|
|
87
|
+
return {
|
|
88
|
+
check: key,
|
|
89
|
+
status: "ok",
|
|
90
|
+
detail: typeof step.project_id === "string"
|
|
91
|
+
? step.project_id
|
|
92
|
+
: typeof step.email === "string"
|
|
93
|
+
? step.email
|
|
94
|
+
: "",
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
return { check: key, status: "fail", detail: "not done" };
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
async function checkRuntime(serviceFilter) {
|
|
101
|
+
const accounts = listAccounts();
|
|
102
|
+
if (accounts.length === 0) {
|
|
103
|
+
return [
|
|
104
|
+
{
|
|
105
|
+
account: "(none)",
|
|
106
|
+
service: "—",
|
|
107
|
+
status: "fail",
|
|
108
|
+
detail: "no accounts authenticated — run `gws-axi auth login`",
|
|
109
|
+
},
|
|
110
|
+
];
|
|
111
|
+
}
|
|
112
|
+
// Probe all accounts in parallel. Per-account, services that can run in
|
|
113
|
+
// parallel (gmail/calendar/drive) already do inside probeAccount.
|
|
114
|
+
const perAccount = await Promise.all(accounts.map(async (email) => {
|
|
115
|
+
const results = await probeAccount(email);
|
|
116
|
+
return { email, results };
|
|
117
|
+
}));
|
|
118
|
+
const rows = [];
|
|
119
|
+
for (const { email, results } of perAccount) {
|
|
120
|
+
for (const result of results) {
|
|
121
|
+
if (serviceFilter && result.service !== serviceFilter)
|
|
122
|
+
continue;
|
|
123
|
+
rows.push({
|
|
124
|
+
account: email,
|
|
125
|
+
service: result.service,
|
|
126
|
+
status: result.status,
|
|
127
|
+
detail: result.detail,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return rows;
|
|
132
|
+
}
|
|
133
|
+
export async function doctorCommand(args) {
|
|
134
|
+
const summaryMode = args.includes("--summary");
|
|
135
|
+
const checkIdx = args.indexOf("--check");
|
|
136
|
+
const checkTarget = checkIdx >= 0 ? args[checkIdx + 1] : undefined;
|
|
137
|
+
const [tier, name] = checkTarget ? checkTarget.split(".") : [undefined, undefined];
|
|
138
|
+
if (tier && !["prerequisites", "setup", "runtime"].includes(tier)) {
|
|
139
|
+
return {
|
|
140
|
+
error: `Unknown tier: ${tier}`,
|
|
141
|
+
code: "VALIDATION_ERROR",
|
|
142
|
+
help: ["Valid tiers: prerequisites, setup, runtime"],
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
const prereqs = !tier || tier === "prerequisites" ? checkPrerequisites() : [];
|
|
146
|
+
const setupRows = !tier || tier === "setup" ? checkSetup() : [];
|
|
147
|
+
const runtimeRows = !tier || tier === "runtime"
|
|
148
|
+
? await checkRuntime(tier === "runtime" ? name : undefined)
|
|
149
|
+
: [];
|
|
150
|
+
const failing = prereqs.filter((r) => r.status === "fail").length +
|
|
151
|
+
setupRows.filter((r) => r.status === "fail").length +
|
|
152
|
+
runtimeRows.filter((r) => r.status === "fail").length;
|
|
153
|
+
const warning = prereqs.filter((r) => r.status === "warn").length +
|
|
154
|
+
setupRows.filter((r) => r.status === "warn").length +
|
|
155
|
+
runtimeRows.filter((r) => r.status === "warn").length;
|
|
156
|
+
if (summaryMode) {
|
|
157
|
+
const state = readSetupState();
|
|
158
|
+
const { done, total } = setupProgress(state);
|
|
159
|
+
if (done < total) {
|
|
160
|
+
return {
|
|
161
|
+
status: `setup ${done}/${total} — run 'gws-axi auth setup' to continue`,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
if (failing > 0) {
|
|
165
|
+
return {
|
|
166
|
+
status: `${failing} failing check${failing === 1 ? "" : "s"} — run 'gws-axi doctor'`,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
return { status: "ok" };
|
|
170
|
+
}
|
|
171
|
+
const accounts = listAccounts();
|
|
172
|
+
const defaultAccount = getDefaultAccount();
|
|
173
|
+
const output = {};
|
|
174
|
+
if (accounts.length > 0) {
|
|
175
|
+
output.accounts = accounts;
|
|
176
|
+
if (defaultAccount)
|
|
177
|
+
output.default_account = defaultAccount;
|
|
178
|
+
if (accounts.length > 1) {
|
|
179
|
+
output.write_protection = "enabled — writes require --account";
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
if (prereqs.length > 0)
|
|
183
|
+
output.prerequisites = prereqs;
|
|
184
|
+
if (setupRows.length > 0)
|
|
185
|
+
output.setup = setupRows;
|
|
186
|
+
if (runtimeRows.length > 0)
|
|
187
|
+
output.runtime = runtimeRows;
|
|
188
|
+
output.summary = `${failing} failing, ${warning} warning`;
|
|
189
|
+
const help = [];
|
|
190
|
+
const setupFailing = setupRows.some((r) => r.status === "fail");
|
|
191
|
+
const runtimeFailing = runtimeRows.some((r) => r.status === "fail");
|
|
192
|
+
const tokenFailures = runtimeRows.filter((r) => r.status === "fail" && /401|revoked|refresh/i.test(r.detail));
|
|
193
|
+
const scopeFailures = runtimeRows.filter((r) => r.status === "fail" && /scope/i.test(r.detail));
|
|
194
|
+
if (setupFailing) {
|
|
195
|
+
help.push("Run `gws-axi auth setup` to advance incomplete setup steps");
|
|
196
|
+
}
|
|
197
|
+
if (tokenFailures.length > 0) {
|
|
198
|
+
const accts = [...new Set(tokenFailures.map((r) => r.account))];
|
|
199
|
+
help.push(`Token issues detected on ${accts.join(", ")} — run \`gws-axi auth login --account <email>\` + \`auth login --wait\` to re-auth`);
|
|
200
|
+
}
|
|
201
|
+
if (scopeFailures.length > 0) {
|
|
202
|
+
const accts = [...new Set(scopeFailures.map((r) => r.account))];
|
|
203
|
+
help.push(`Scope gaps on ${accts.join(", ")} — re-auth to re-consent to the full scope set`);
|
|
204
|
+
}
|
|
205
|
+
if (failing === 0 && warning === 0) {
|
|
206
|
+
help.push("All checks passed — you can start using service commands");
|
|
207
|
+
}
|
|
208
|
+
help.push("Run `gws-axi doctor --help` for check targeting");
|
|
209
|
+
output.help = help;
|
|
210
|
+
process.exitCode = failing > 0 ? 1 : 0;
|
|
211
|
+
return output;
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { buildServiceStub } from "./service-stub.js";
|
|
2
|
+
const stub = buildServiceStub("drive", [
|
|
3
|
+
{ name: "search", mutation: false },
|
|
4
|
+
{ name: "get", mutation: false },
|
|
5
|
+
{ name: "ls", mutation: false },
|
|
6
|
+
{ name: "permissions", mutation: false },
|
|
7
|
+
{ name: "download", mutation: false },
|
|
8
|
+
{ name: "create", mutation: true },
|
|
9
|
+
{ name: "copy", mutation: true },
|
|
10
|
+
{ name: "move", mutation: true },
|
|
11
|
+
{ name: "rename", mutation: true },
|
|
12
|
+
{ name: "delete", mutation: true },
|
|
13
|
+
{ name: "mkdir", mutation: true },
|
|
14
|
+
]);
|
|
15
|
+
export const DRIVE_HELP = stub.help;
|
|
16
|
+
export const driveCommand = stub.command;
|
|
17
|
+
//# sourceMappingURL=drive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drive.js","sourceRoot":"","sources":["../../../src/commands/drive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,EAAE;IACrC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE;IACnC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE;IAChC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE;IAC/B,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE;IACxC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE;IACrC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;IAChC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;IAChC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE;CAClC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC;AACpC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { buildServiceStub } from "./service-stub.js";
|
|
2
|
+
const stub = buildServiceStub("gmail", [
|
|
3
|
+
{ name: "search", mutation: false },
|
|
4
|
+
{ name: "read", mutation: false },
|
|
5
|
+
{ name: "labels", mutation: false },
|
|
6
|
+
{ name: "filter-list", mutation: false },
|
|
7
|
+
{ name: "download", mutation: false },
|
|
8
|
+
{ name: "send", mutation: true },
|
|
9
|
+
{ name: "draft", mutation: true },
|
|
10
|
+
{ name: "modify", mutation: true },
|
|
11
|
+
{ name: "batch-modify", mutation: true },
|
|
12
|
+
{ name: "label-create", mutation: true },
|
|
13
|
+
{ name: "label-update", mutation: true },
|
|
14
|
+
{ name: "label-delete", mutation: true },
|
|
15
|
+
{ name: "filter-create", mutation: true },
|
|
16
|
+
{ name: "filter-delete", mutation: true },
|
|
17
|
+
]);
|
|
18
|
+
export const GMAIL_HELP = stub.help;
|
|
19
|
+
export const gmailCommand = stub.command;
|
|
20
|
+
//# sourceMappingURL=gmail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gmail.js","sourceRoot":"","sources":["../../../src/commands/gmail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,EAAE;IACrC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE;IACnC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;IACjC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE;IACnC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE;IACxC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE;IACrC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;IAChC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE;IACjC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE;IACxC,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE;IACxC,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE;IACxC,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE;IACxC,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE;IACzC,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE;CAC1C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC;AACpC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function homeCommand(): Promise<Record<string, unknown>>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { getDefaultAccount, listAccounts, readSetupState, setupProgress, } from "../config.js";
|
|
2
|
+
export async function homeCommand() {
|
|
3
|
+
const state = readSetupState();
|
|
4
|
+
const { done, total, nextStep } = setupProgress(state);
|
|
5
|
+
const accounts = listAccounts();
|
|
6
|
+
const defaultAccount = getDefaultAccount();
|
|
7
|
+
const output = {};
|
|
8
|
+
if (accounts.length > 0) {
|
|
9
|
+
output.account = defaultAccount ?? accounts[0];
|
|
10
|
+
if (accounts.length > 1) {
|
|
11
|
+
output.other_accounts = accounts.filter((a) => a !== (defaultAccount ?? accounts[0]));
|
|
12
|
+
output.write_protection = "enabled (2+ accounts — writes require --account)";
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
const setup = {
|
|
16
|
+
progress: `${done} of ${total} steps complete`,
|
|
17
|
+
};
|
|
18
|
+
if (nextStep)
|
|
19
|
+
setup.next_step = nextStep;
|
|
20
|
+
output.setup = setup;
|
|
21
|
+
const help = [];
|
|
22
|
+
if (done < total) {
|
|
23
|
+
help.push("Run `gws-axi auth setup` to continue setup");
|
|
24
|
+
}
|
|
25
|
+
else if (accounts.length === 0) {
|
|
26
|
+
help.push("Run `gws-axi auth login` to authenticate your first account");
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
help.push("Run `gws-axi doctor` to check auth + runtime health");
|
|
30
|
+
help.push("Run `gws-axi calendar events` to list upcoming events");
|
|
31
|
+
if (accounts.length === 1) {
|
|
32
|
+
help.push("Run `gws-axi auth login --account <email>` to add another account");
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
help.push("Run `gws-axi auth accounts` to see all accounts");
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
help.push("Run `gws-axi --help` for the full command list");
|
|
39
|
+
output.help = help;
|
|
40
|
+
return output;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=home.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"home.js","sourceRoot":"","sources":["../../../src/commands/home.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,aAAa,GACd,MAAM,cAAc,CAAC;AAEtB,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAE3C,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,OAAO,GAAG,cAAc,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,cAAc,GAAG,QAAQ,CAAC,MAAM,CACrC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,CAC7C,CAAC;YACF,MAAM,CAAC,gBAAgB,GAAG,kDAAkD,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAA4B;QACrC,QAAQ,EAAE,GAAG,IAAI,OAAO,KAAK,iBAAiB;KAC/C,CAAC;IACF,IAAI,QAAQ;QAAE,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAC;IACzC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IAErB,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;QACjB,IAAI,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAC1D,CAAC;SAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IAC3E,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QACjE,IAAI,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACnE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;QACjF,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAC5D,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;IAEnB,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { AxiError } from "axi-sdk-js";
|
|
2
|
+
import { resolveAccount, } from "../google/account.js";
|
|
3
|
+
function parseAccountFlag(args) {
|
|
4
|
+
const rest = [];
|
|
5
|
+
let account;
|
|
6
|
+
for (let i = 0; i < args.length; i++) {
|
|
7
|
+
const arg = args[i];
|
|
8
|
+
if (arg === "--account" && args[i + 1]) {
|
|
9
|
+
account = args[i + 1];
|
|
10
|
+
i++;
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
rest.push(arg);
|
|
14
|
+
}
|
|
15
|
+
return { account, rest };
|
|
16
|
+
}
|
|
17
|
+
export function buildServiceStub(service, subcommands) {
|
|
18
|
+
const readOps = subcommands.filter((s) => !s.mutation).map((s) => s.name);
|
|
19
|
+
const writeOps = subcommands.filter((s) => s.mutation).map((s) => s.name);
|
|
20
|
+
const help = `usage: gws-axi ${service} <subcommand> [args] [--account <email>] [flags]
|
|
21
|
+
reads[${readOps.length}]:
|
|
22
|
+
${readOps.join(", ") || "(none)"}
|
|
23
|
+
writes[${writeOps.length}]:
|
|
24
|
+
${writeOps.join(", ") || "(none)"}
|
|
25
|
+
status: ${service} is not yet implemented in v1-dev
|
|
26
|
+
see: docs/design.md for the full command surface plan
|
|
27
|
+
notes:
|
|
28
|
+
Writes require --account <email> when 2+ accounts are authenticated.
|
|
29
|
+
Reads use the default account when --account is not provided.
|
|
30
|
+
`;
|
|
31
|
+
const command = async (args) => {
|
|
32
|
+
if (args.length === 0) {
|
|
33
|
+
// Return help as structured output so it integrates with TOON
|
|
34
|
+
return {
|
|
35
|
+
service,
|
|
36
|
+
status: "not_implemented",
|
|
37
|
+
reads: readOps,
|
|
38
|
+
writes: writeOps,
|
|
39
|
+
help: [
|
|
40
|
+
`Run \`gws-axi ${service} --help\` for details`,
|
|
41
|
+
"See docs/design.md for implementation roadmap",
|
|
42
|
+
],
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const sub = args[0];
|
|
46
|
+
const def = subcommands.find((s) => s.name === sub);
|
|
47
|
+
if (!def) {
|
|
48
|
+
throw new AxiError(`Unknown ${service} subcommand: ${sub}`, "VALIDATION_ERROR", [`Run \`gws-axi ${service} --help\` to see available subcommands`]);
|
|
49
|
+
}
|
|
50
|
+
// Account resolution runs even though the operation is stubbed — this
|
|
51
|
+
// exercises write-protection and error paths without needing real API
|
|
52
|
+
// plumbing, and gives users an accurate preview of the multi-account
|
|
53
|
+
// error messages they'd see in production.
|
|
54
|
+
const { account } = parseAccountFlag(args.slice(1));
|
|
55
|
+
const resolution = resolveAccount(account, {
|
|
56
|
+
mutation: def.mutation,
|
|
57
|
+
commandName: `${service} ${sub}`,
|
|
58
|
+
});
|
|
59
|
+
throw new AxiError(`gws-axi ${service} ${sub} is not yet implemented in v1-dev`, "NOT_IMPLEMENTED", [
|
|
60
|
+
`Account resolution succeeded: would run as ${resolution.account}`,
|
|
61
|
+
`Run \`gws-axi ${service} --help\` for the planned command surface`,
|
|
62
|
+
"See docs/design.md for implementation roadmap",
|
|
63
|
+
]);
|
|
64
|
+
};
|
|
65
|
+
return { help, command };
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=service-stub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-stub.js","sourceRoot":"","sources":["../../../src/commands/service-stub.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { buildServiceStub } from "./service-stub.js";
|
|
2
|
+
const stub = buildServiceStub("slides", [
|
|
3
|
+
{ name: "get", mutation: false },
|
|
4
|
+
{ name: "page", mutation: false },
|
|
5
|
+
{ name: "summarize", mutation: false },
|
|
6
|
+
{ name: "create", mutation: true },
|
|
7
|
+
{ name: "update", mutation: true },
|
|
8
|
+
]);
|
|
9
|
+
export const SLIDES_HELP = stub.help;
|
|
10
|
+
export const slidesCommand = stub.command;
|
|
11
|
+
//# sourceMappingURL=slides.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slides.js","sourceRoot":"","sources":["../../../src/commands/slides.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,IAAI,GAAG,gBAAgB,CAAC,QAAQ,EAAE;IACtC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE;IAChC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;IACjC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE;IACtC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;CACnC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC;AACrC,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export declare const SETUP_VERSION = 1;
|
|
2
|
+
export declare const CONFIG_VERSION = 1;
|
|
3
|
+
export type SetupStepKey = "gcp_project" | "apis_enabled" | "oauth_client" | "credentials_saved" | "consent_screen" | "test_user_added" | "tokens_obtained";
|
|
4
|
+
export interface SetupStep {
|
|
5
|
+
done: boolean;
|
|
6
|
+
at?: string;
|
|
7
|
+
[key: string]: unknown;
|
|
8
|
+
}
|
|
9
|
+
export interface SetupState {
|
|
10
|
+
version: number;
|
|
11
|
+
auth_mode: "byo";
|
|
12
|
+
steps: Record<SetupStepKey, SetupStep>;
|
|
13
|
+
last_action?: string;
|
|
14
|
+
resume_hint?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface UserConfig {
|
|
17
|
+
version: number;
|
|
18
|
+
default_account?: string;
|
|
19
|
+
}
|
|
20
|
+
declare const SETUP_STEP_ORDER: SetupStepKey[];
|
|
21
|
+
export declare function configDir(): string;
|
|
22
|
+
export declare function setupStatePath(): string;
|
|
23
|
+
export declare function credentialsPath(): string;
|
|
24
|
+
export declare function userConfigPath(): string;
|
|
25
|
+
export declare function accountsDir(): string;
|
|
26
|
+
export declare function accountDir(email: string): string;
|
|
27
|
+
export declare function tokensPathForAccount(email: string): string;
|
|
28
|
+
export declare function profilePathForAccount(email: string): string;
|
|
29
|
+
export declare function normalizeEmail(email: string): string;
|
|
30
|
+
export declare function defaultSetupState(): SetupState;
|
|
31
|
+
export declare function readSetupState(): SetupState;
|
|
32
|
+
export declare function writeSetupState(state: SetupState): void;
|
|
33
|
+
export declare function setupProgress(state: SetupState): {
|
|
34
|
+
done: number;
|
|
35
|
+
total: number;
|
|
36
|
+
nextStep: SetupStepKey | null;
|
|
37
|
+
};
|
|
38
|
+
export declare function defaultUserConfig(): UserConfig;
|
|
39
|
+
export declare function readUserConfig(): UserConfig;
|
|
40
|
+
export declare function writeUserConfig(cfg: UserConfig): void;
|
|
41
|
+
export declare function listAccounts(): string[];
|
|
42
|
+
export declare function hasAccount(email: string): boolean;
|
|
43
|
+
export declare function removeAccount(email: string): void;
|
|
44
|
+
export declare function getDefaultAccount(): string | undefined;
|
|
45
|
+
export declare function setDefaultAccount(email: string): void;
|
|
46
|
+
export { SETUP_STEP_ORDER };
|