gws-axi 0.7.0 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/cli.js +1 -2
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/gmail/mime.js +7 -6
- package/dist/src/commands/gmail/mime.js.map +1 -1
- package/dist/src/commands/gmail/mime.test.js +18 -1
- package/dist/src/commands/gmail/mime.test.js.map +1 -1
- package/dist/src/commands/slides/get.d.ts +2 -0
- package/dist/src/commands/slides/get.js +95 -0
- package/dist/src/commands/slides/get.js.map +1 -0
- package/dist/src/commands/slides/page.d.ts +2 -0
- package/dist/src/commands/slides/page.js +100 -0
- package/dist/src/commands/slides/page.js.map +1 -0
- package/dist/src/commands/slides/summarize.d.ts +2 -0
- package/dist/src/commands/slides/summarize.js +159 -0
- package/dist/src/commands/slides/summarize.js.map +1 -0
- package/dist/src/commands/slides/text.d.ts +22 -0
- package/dist/src/commands/slides/text.js +103 -0
- package/dist/src/commands/slides/text.js.map +1 -0
- package/dist/src/commands/slides.d.ts +1 -1
- package/dist/src/commands/slides.js +93 -10
- package/dist/src/commands/slides.js.map +1 -1
- package/package.json +1 -1
package/dist/src/cli.js
CHANGED
|
@@ -9,7 +9,7 @@ import { calendarCommand } from "./commands/calendar.js";
|
|
|
9
9
|
import { gmailCommand } from "./commands/gmail.js";
|
|
10
10
|
import { docsCommand } from "./commands/docs.js";
|
|
11
11
|
import { driveCommand } from "./commands/drive.js";
|
|
12
|
-
import { slidesCommand
|
|
12
|
+
import { slidesCommand } from "./commands/slides.js";
|
|
13
13
|
const DESCRIPTION = "Agent ergonomic CLI for Google Workspace. Unified interface for Gmail, Calendar, Docs, Drive, and Slides with agent-guided OAuth setup.";
|
|
14
14
|
const VERSION = readPackageVersion();
|
|
15
15
|
export const TOP_HELP = `usage: gws-axi [command] [args] [flags]
|
|
@@ -29,7 +29,6 @@ examples:
|
|
|
29
29
|
const COMMAND_HELP = {
|
|
30
30
|
auth: AUTH_HELP,
|
|
31
31
|
doctor: DOCTOR_HELP,
|
|
32
|
-
slides: SLIDES_HELP,
|
|
33
32
|
};
|
|
34
33
|
export async function main() {
|
|
35
34
|
await runAxiCli({
|
package/dist/src/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,WAAW,GACf,yIAAyI,CAAC;AAE5I,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;AAErC,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;CAUvB,CAAC;AAEF,0EAA0E;AAC1E,0EAA0E;AAC1E,iEAAiE;AACjE,MAAM,YAAY,GAA2B;IAC3C,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,WAAW;CACpB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,SAAS,CAAC;QACd,WAAW,EAAE,WAAW;QACxB,OAAO,EAAE,OAAO;QAChB,YAAY,EAAE,QAAQ;QACtB,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,WAAW,EAAE;QAC/B,QAAQ,EAAE;YACR,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,aAAa;YACrB,QAAQ,EAAE,eAAe;YACzB,KAAK,EAAE,YAAY;YACnB,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,YAAY;YACnB,MAAM,EAAE,aAAa;SACtB;QACD,cAAc,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC;KACnD,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAErD,KAAK,MAAM,SAAS,IAAI;QACtB,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC;KACvC,EAAE,CAAC;QACF,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAEzD,CAAC;QACF,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpE,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -47,12 +47,13 @@ function partHeader(part, name) {
|
|
|
47
47
|
}
|
|
48
48
|
function isInlineDisposition(part) {
|
|
49
49
|
// RFC 2183: Content-Disposition: inline [; filename="..."]
|
|
50
|
-
// Gmail
|
|
51
|
-
//
|
|
52
|
-
//
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
50
|
+
// Explicit disposition wins — Gmail's composer stamps a Content-ID on
|
|
51
|
+
// every user-attached file too, so treating any Content-ID as inline
|
|
52
|
+
// would demote real attachments. Only fall back to the cid:-heuristic
|
|
53
|
+
// when no disposition was declared at all.
|
|
54
|
+
const disp = partHeader(part, "Content-Disposition")?.toLowerCase();
|
|
55
|
+
if (disp)
|
|
56
|
+
return disp.trimStart().startsWith("inline");
|
|
56
57
|
if (partHeader(part, "Content-ID"))
|
|
57
58
|
return true;
|
|
58
59
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mime.js","sourceRoot":"","sources":["../../../../src/commands/gmail/mime.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,eAAe,CAAC;AAE1C,OAAO,eAAe,MAAM,UAAU,CAAC;AAkCvC,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC;IACnC,YAAY,EAAE,KAAK;IACnB,cAAc,EAAE,QAAQ;IACxB,gBAAgB,EAAE,GAAG;CACtB,CAAC,CAAC;AACH,0EAA0E;AAC1E,2EAA2E;AAC3E,oDAAoD;AACpD,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AAE7C,MAAM,UAAU,YAAY,CAAC,GAA4B;IACvD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC;QAC3C,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAA8C,EAAE,CAAC;IAChE,MAAM,WAAW,GAAiB,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,EAAE,kBAAkB,EAAE,CAAC,EAAE,CAAC;IACxC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;IAEzD,uEAAuE;IACvE,kEAAkE;IAClE,+CAA+C;IAC/C,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,WAAW,CAAC,CAAC;IAE/D,IAAI,IAAiB,CAAC;IACtB,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAClD,CAAC;SAAM,IAAI,IAAI,EAAE,CAAC;QAChB,IAAI,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACnE,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC1C,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAAE,KAAK,CAAC,kBAAkB,EAAE,CAAC;AACtF,CAAC;AAED,SAAS,UAAU,CACjB,IAAiC,EACjC,IAAY;IAEZ,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QACnC,IAAI,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,KAAK;YAAE,OAAO,CAAC,CAAC,KAAK,IAAI,SAAS,CAAC;IACnE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAiC;IAC5D,2DAA2D;IAC3D,
|
|
1
|
+
{"version":3,"file":"mime.js","sourceRoot":"","sources":["../../../../src/commands/gmail/mime.ts"],"names":[],"mappings":"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"}
|
|
@@ -126,7 +126,7 @@ describe("parseMessage — attachments vs inline", () => {
|
|
|
126
126
|
expect(parsed.attachments).toHaveLength(0);
|
|
127
127
|
expect(parsed.inline_image_count).toBe(1);
|
|
128
128
|
});
|
|
129
|
-
it("filters parts that have a Content-ID
|
|
129
|
+
it("filters parts that have a Content-ID but no disposition", () => {
|
|
130
130
|
const part = attachmentPart("image/png", "embed.png", 512, null);
|
|
131
131
|
part.headers = headers([
|
|
132
132
|
["Content-Type", "image/png"],
|
|
@@ -140,6 +140,23 @@ describe("parseMessage — attachments vs inline", () => {
|
|
|
140
140
|
expect(parsed.attachments).toHaveLength(0);
|
|
141
141
|
expect(parsed.inline_image_count).toBe(1);
|
|
142
142
|
});
|
|
143
|
+
it("treats Content-Disposition: attachment as an attachment even when Content-ID is present", () => {
|
|
144
|
+
// Gmail's composer stamps a Content-ID on user-attached files alongside
|
|
145
|
+
// the explicit attachment disposition; the disposition must win.
|
|
146
|
+
const part = attachmentPart("application/vnd.openxmlformats-officedocument.wordprocessingml.document", "Response.docx", 27530, 'attachment; filename="Response.docx"');
|
|
147
|
+
part.headers = [
|
|
148
|
+
...(part.headers ?? []),
|
|
149
|
+
{ name: "Content-ID", value: "<f_movy511a0>" },
|
|
150
|
+
];
|
|
151
|
+
const msg = message([["Subject", "With doc"]], multipart("multipart/mixed", [
|
|
152
|
+
textPart("text/plain", "See attached"),
|
|
153
|
+
part,
|
|
154
|
+
]));
|
|
155
|
+
const parsed = parseMessage(msg);
|
|
156
|
+
expect(parsed.attachments).toHaveLength(1);
|
|
157
|
+
expect(parsed.attachments[0].filename).toBe("Response.docx");
|
|
158
|
+
expect(parsed.inline_image_count).toBe(0);
|
|
159
|
+
});
|
|
143
160
|
it("classifies mixed inline + attachment correctly", () => {
|
|
144
161
|
const msg = message([["Subject", "Mixed"]], multipart("multipart/mixed", [
|
|
145
162
|
multipart("multipart/related", [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mime.test.js","sourceRoot":"","sources":["../../../../src/commands/gmail/mime.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"mime.test.js","sourceRoot":"","sources":["../../../../src/commands/gmail/mime.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const GET_HELP = "usage: gws-axi slides get <presentation-id> [flags]\nargs[1]:\n <presentation-id> The Slides presentation ID (from the URL after /d/)\nflags[1]:\n --account <email> Account override when 2+ are configured\nexamples:\n gws-axi slides get 1AbC...\noutput:\n A `presentation{id,title,slide_count,revision_id}` header and a\n `slides[N]{index,page_id,title}` table \u2014 one row per slide. Use this\n to pick a target page_id for `slides page <pres-id> <page-id>`, or\n go straight to `slides summarize <pres-id>` for the full content.\nnotes:\n This is light metadata only \u2014 no slide bodies or speaker notes.\n For the full deck contents, use `slides summarize`.\n";
|
|
2
|
+
export declare function slidesGetCommand(account: string, args: string[]): Promise<string>;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { AxiError } from "axi-sdk-js";
|
|
2
|
+
import { slidesClient, translateGoogleError } from "../../google/client.js";
|
|
3
|
+
import { field, joinBlocks, renderHelp, renderList, renderObject, } from "../../output/index.js";
|
|
4
|
+
import { extractSlideContent, isSlidePage } from "./text.js";
|
|
5
|
+
export const GET_HELP = `usage: gws-axi slides get <presentation-id> [flags]
|
|
6
|
+
args[1]:
|
|
7
|
+
<presentation-id> The Slides presentation ID (from the URL after /d/)
|
|
8
|
+
flags[1]:
|
|
9
|
+
--account <email> Account override when 2+ are configured
|
|
10
|
+
examples:
|
|
11
|
+
gws-axi slides get 1AbC...
|
|
12
|
+
output:
|
|
13
|
+
A \`presentation{id,title,slide_count,revision_id}\` header and a
|
|
14
|
+
\`slides[N]{index,page_id,title}\` table — one row per slide. Use this
|
|
15
|
+
to pick a target page_id for \`slides page <pres-id> <page-id>\`, or
|
|
16
|
+
go straight to \`slides summarize <pres-id>\` for the full content.
|
|
17
|
+
notes:
|
|
18
|
+
This is light metadata only — no slide bodies or speaker notes.
|
|
19
|
+
For the full deck contents, use \`slides summarize\`.
|
|
20
|
+
`;
|
|
21
|
+
function parseFlags(args) {
|
|
22
|
+
let presentationId;
|
|
23
|
+
for (const arg of args) {
|
|
24
|
+
if (!arg.startsWith("--") && presentationId === undefined) {
|
|
25
|
+
presentationId = arg;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (!presentationId) {
|
|
29
|
+
throw new AxiError("Missing presentationId argument", "VALIDATION_ERROR", ["Usage: gws-axi slides get <presentation-id>"]);
|
|
30
|
+
}
|
|
31
|
+
return { presentationId };
|
|
32
|
+
}
|
|
33
|
+
function slideRowSchema() {
|
|
34
|
+
return [field("index"), field("page_id"), field("title")];
|
|
35
|
+
}
|
|
36
|
+
export async function slidesGetCommand(account, args) {
|
|
37
|
+
const flags = parseFlags(args);
|
|
38
|
+
const api = await slidesClient(account);
|
|
39
|
+
let presentation;
|
|
40
|
+
try {
|
|
41
|
+
const res = await api.presentations.get({
|
|
42
|
+
presentationId: flags.presentationId,
|
|
43
|
+
});
|
|
44
|
+
presentation = res.data;
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
const translated = translateGoogleError(err, {
|
|
48
|
+
account,
|
|
49
|
+
operation: "slides.presentations.get",
|
|
50
|
+
});
|
|
51
|
+
if (translated.code === "NOT_FOUND") {
|
|
52
|
+
throw new AxiError(`Presentation '${flags.presentationId}' not found (or ${account} doesn't have access)`, "PRESENTATION_NOT_FOUND", [
|
|
53
|
+
`Verify the presentation ID is correct (the portion of the URL after /d/)`,
|
|
54
|
+
`Confirm ${account} has at least view access`,
|
|
55
|
+
]);
|
|
56
|
+
}
|
|
57
|
+
throw translated;
|
|
58
|
+
}
|
|
59
|
+
const slides = (presentation.slides ?? []).filter(isSlidePage);
|
|
60
|
+
const rows = slides.map((s, i) => {
|
|
61
|
+
const content = extractSlideContent(s, i);
|
|
62
|
+
return {
|
|
63
|
+
index: i + 1,
|
|
64
|
+
page_id: content.page_id,
|
|
65
|
+
title: content.title,
|
|
66
|
+
};
|
|
67
|
+
});
|
|
68
|
+
const blocks = [];
|
|
69
|
+
blocks.push(renderObject({ account }));
|
|
70
|
+
blocks.push(renderObject({
|
|
71
|
+
presentation: {
|
|
72
|
+
id: presentation.presentationId ?? flags.presentationId,
|
|
73
|
+
title: presentation.title ?? "",
|
|
74
|
+
slide_count: slides.length,
|
|
75
|
+
...(presentation.revisionId
|
|
76
|
+
? { revision_id: presentation.revisionId }
|
|
77
|
+
: {}),
|
|
78
|
+
},
|
|
79
|
+
}));
|
|
80
|
+
if (rows.length === 0) {
|
|
81
|
+
blocks.push(renderObject({ slides: "no slides in this presentation" }));
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
blocks.push(renderList("slides", rows, slideRowSchema()));
|
|
85
|
+
}
|
|
86
|
+
const suggestions = [];
|
|
87
|
+
if (rows.length > 0) {
|
|
88
|
+
suggestions.push(`Run \`gws-axi slides summarize ${flags.presentationId}\` to render the full deck as markdown (titles, body text, speaker notes)`);
|
|
89
|
+
suggestions.push(`Run \`gws-axi slides page ${flags.presentationId} <page-id>\` for just one slide (use any page_id from the slides table)`);
|
|
90
|
+
}
|
|
91
|
+
if (suggestions.length > 0)
|
|
92
|
+
blocks.push(renderHelp(suggestions));
|
|
93
|
+
return joinBlocks(...blocks);
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=get.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../../src/commands/slides/get.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const PAGE_HELP = "usage: gws-axi slides page <presentation-id> <page-id> [flags]\nargs[2]:\n <presentation-id> The Slides presentation ID\n <page-id> The slide's objectId (page_id from `slides get`)\nflags[1]:\n --account <email> Account override when 2+ are configured\nexamples:\n gws-axi slides page 1AbC... gd87cbcb3a4_0_42\noutput:\n A `slide{index,page_id,title,image_count,table_count,has_video}`\n header and `body` + (when present) `speaker_notes` blocks. The\n body is a single text block joining every shape's/table's visible\n text on the slide in document order.\nnotes:\n For the full deck use `slides summarize`. `page` is for one-slide\n reads when the agent already knows which slide it wants (e.g., from\n prior context or a slide-by-slide walk).\n";
|
|
2
|
+
export declare function slidesPageCommand(account: string, args: string[]): Promise<string>;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { AxiError } from "axi-sdk-js";
|
|
2
|
+
import { slidesClient, translateGoogleError } from "../../google/client.js";
|
|
3
|
+
import { joinBlocks, renderHelp, renderObject, } from "../../output/index.js";
|
|
4
|
+
import { extractSlideContent, isSlidePage } from "./text.js";
|
|
5
|
+
export const PAGE_HELP = `usage: gws-axi slides page <presentation-id> <page-id> [flags]
|
|
6
|
+
args[2]:
|
|
7
|
+
<presentation-id> The Slides presentation ID
|
|
8
|
+
<page-id> The slide's objectId (page_id from \`slides get\`)
|
|
9
|
+
flags[1]:
|
|
10
|
+
--account <email> Account override when 2+ are configured
|
|
11
|
+
examples:
|
|
12
|
+
gws-axi slides page 1AbC... gd87cbcb3a4_0_42
|
|
13
|
+
output:
|
|
14
|
+
A \`slide{index,page_id,title,image_count,table_count,has_video}\`
|
|
15
|
+
header and \`body\` + (when present) \`speaker_notes\` blocks. The
|
|
16
|
+
body is a single text block joining every shape's/table's visible
|
|
17
|
+
text on the slide in document order.
|
|
18
|
+
notes:
|
|
19
|
+
For the full deck use \`slides summarize\`. \`page\` is for one-slide
|
|
20
|
+
reads when the agent already knows which slide it wants (e.g., from
|
|
21
|
+
prior context or a slide-by-slide walk).
|
|
22
|
+
`;
|
|
23
|
+
function parseFlags(args) {
|
|
24
|
+
const positional = [];
|
|
25
|
+
for (const arg of args) {
|
|
26
|
+
if (!arg.startsWith("--"))
|
|
27
|
+
positional.push(arg);
|
|
28
|
+
}
|
|
29
|
+
if (positional.length < 2) {
|
|
30
|
+
throw new AxiError("Missing required arguments", "VALIDATION_ERROR", [
|
|
31
|
+
"Usage: gws-axi slides page <presentation-id> <page-id>",
|
|
32
|
+
"Get the page-id from `gws-axi slides get <presentation-id>` output",
|
|
33
|
+
]);
|
|
34
|
+
}
|
|
35
|
+
return { presentationId: positional[0], pageId: positional[1] };
|
|
36
|
+
}
|
|
37
|
+
export async function slidesPageCommand(account, args) {
|
|
38
|
+
const flags = parseFlags(args);
|
|
39
|
+
const api = await slidesClient(account);
|
|
40
|
+
let presentation;
|
|
41
|
+
try {
|
|
42
|
+
const res = await api.presentations.get({
|
|
43
|
+
presentationId: flags.presentationId,
|
|
44
|
+
});
|
|
45
|
+
presentation = res.data;
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
const translated = translateGoogleError(err, {
|
|
49
|
+
account,
|
|
50
|
+
operation: "slides.presentations.get",
|
|
51
|
+
});
|
|
52
|
+
if (translated.code === "NOT_FOUND") {
|
|
53
|
+
throw new AxiError(`Presentation '${flags.presentationId}' not found (or ${account} doesn't have access)`, "PRESENTATION_NOT_FOUND", [
|
|
54
|
+
`Verify the presentation ID is correct (the portion of the URL after /d/)`,
|
|
55
|
+
`Confirm ${account} has at least view access`,
|
|
56
|
+
]);
|
|
57
|
+
}
|
|
58
|
+
throw translated;
|
|
59
|
+
}
|
|
60
|
+
const slidePages = (presentation.slides ?? []).filter(isSlidePage);
|
|
61
|
+
const targetIndex = slidePages.findIndex((s) => s.objectId === flags.pageId);
|
|
62
|
+
if (targetIndex === -1) {
|
|
63
|
+
throw new AxiError(`Slide '${flags.pageId}' not found in presentation '${flags.presentationId}'`, "PAGE_NOT_FOUND", [
|
|
64
|
+
`List slides with \`gws-axi slides get ${flags.presentationId}\``,
|
|
65
|
+
`Use a page_id from the slides table`,
|
|
66
|
+
]);
|
|
67
|
+
}
|
|
68
|
+
const content = extractSlideContent(slidePages[targetIndex], targetIndex);
|
|
69
|
+
const blocks = [];
|
|
70
|
+
blocks.push(renderObject({ account }));
|
|
71
|
+
blocks.push(renderObject({
|
|
72
|
+
slide: {
|
|
73
|
+
presentation_id: flags.presentationId,
|
|
74
|
+
index: content.index + 1,
|
|
75
|
+
page_id: content.page_id,
|
|
76
|
+
title: content.title,
|
|
77
|
+
...(content.image_count > 0 ? { image_count: content.image_count } : {}),
|
|
78
|
+
...(content.table_count > 0 ? { table_count: content.table_count } : {}),
|
|
79
|
+
...(content.has_video ? { has_video: true } : {}),
|
|
80
|
+
},
|
|
81
|
+
}));
|
|
82
|
+
if (content.body.length > 0) {
|
|
83
|
+
blocks.push(renderObject({ body: content.body.join("\n\n") }));
|
|
84
|
+
}
|
|
85
|
+
if (content.speaker_notes) {
|
|
86
|
+
blocks.push(renderObject({ speaker_notes: content.speaker_notes }));
|
|
87
|
+
}
|
|
88
|
+
const suggestions = [];
|
|
89
|
+
if (content.image_count > 0 || content.has_video) {
|
|
90
|
+
suggestions.push(`This slide has visual content (${content.image_count > 0 ? `${content.image_count} image${content.image_count === 1 ? "" : "s"}` : ""}${content.image_count > 0 && content.has_video ? ", " : ""}${content.has_video ? "a video" : ""}) — only text content is rendered here`);
|
|
91
|
+
}
|
|
92
|
+
if (targetIndex < slidePages.length - 1) {
|
|
93
|
+
const next = slidePages[targetIndex + 1];
|
|
94
|
+
suggestions.push(`Next slide: \`gws-axi slides page ${flags.presentationId} ${next.objectId}\` (slide ${targetIndex + 2}/${slidePages.length})`);
|
|
95
|
+
}
|
|
96
|
+
suggestions.push(`Full deck: \`gws-axi slides summarize ${flags.presentationId}\``);
|
|
97
|
+
blocks.push(renderHelp(suggestions));
|
|
98
|
+
return joinBlocks(...blocks);
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.js","sourceRoot":"","sources":["../../../../src/commands/slides/page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EACL,UAAU,EACV,UAAU,EACV,YAAY,GACb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7D,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;CAiBxB,CAAC;AAOF,SAAS,UAAU,CAAC,IAAc;IAChC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,QAAQ,CAChB,4BAA4B,EAC5B,kBAAkB,EAClB;YACE,wDAAwD;YACxD,oEAAoE;SACrE,CACF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;AAClE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAe,EACf,IAAc;IAEd,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IAExC,IAAI,YAA2C,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC;YACtC,cAAc,EAAE,KAAK,CAAC,cAAc;SACrC,CAAC,CAAC;QACH,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,UAAU,GAAG,oBAAoB,CAAC,GAAG,EAAE;YAC3C,OAAO;YACP,SAAS,EAAE,0BAA0B;SACtC,CAAC,CAAC;QACH,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACpC,MAAM,IAAI,QAAQ,CAChB,iBAAiB,KAAK,CAAC,cAAc,mBAAmB,OAAO,uBAAuB,EACtF,wBAAwB,EACxB;gBACE,0EAA0E;gBAC1E,WAAW,OAAO,2BAA2B;aAC9C,CACF,CAAC;QACJ,CAAC;QACD,MAAM,UAAU,CAAC;IACnB,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,YAAY,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACnE,MAAM,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7E,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,QAAQ,CAChB,UAAU,KAAK,CAAC,MAAM,gCAAgC,KAAK,CAAC,cAAc,GAAG,EAC7E,gBAAgB,EAChB;YACE,yCAAyC,KAAK,CAAC,cAAc,IAAI;YACjE,qCAAqC;SACtC,CACF,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,mBAAmB,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC;IAE1E,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,CACT,YAAY,CAAC;QACX,KAAK,EAAE;YACL,eAAe,EAAE,KAAK,CAAC,cAAc;YACrC,KAAK,EAAE,OAAO,CAAC,KAAK,GAAG,CAAC;YACxB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,GAAG,CAAC,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxE,GAAG,CAAC,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxE,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClD;KACF,CAAC,CACH,CAAC;IACF,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,OAAO,CAAC,WAAW,GAAG,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACjD,WAAW,CAAC,IAAI,CACd,kCAAkC,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,SAAS,OAAO,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,WAAW,GAAG,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,wCAAwC,CAC/Q,CAAC;IACJ,CAAC;IACD,IAAI,WAAW,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;QACzC,WAAW,CAAC,IAAI,CACd,qCAAqC,KAAK,CAAC,cAAc,IAAI,IAAI,CAAC,QAAQ,aAAa,WAAW,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAC/H,CAAC;IACJ,CAAC;IACD,WAAW,CAAC,IAAI,CACd,yCAAyC,KAAK,CAAC,cAAc,IAAI,CAClE,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;IACrC,OAAO,UAAU,CAAC,GAAG,MAAM,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const SUMMARIZE_HELP = "usage: gws-axi slides summarize <presentation-id> [flags]\nargs[1]:\n <presentation-id> The Slides presentation ID\nflags[3]:\n --full Bypass the 8000-char truncation threshold and emit\n the complete deck inline.\n --out <path> Write the full deck markdown to a file instead of\n embedding it inline (implies --full).\n --account <email> Account override when 2+ are configured\nexamples:\n gws-axi slides summarize 1AbC...\n gws-axi slides summarize 1AbC... --full\n gws-axi slides summarize 1AbC... --out ./deck.md\noutput:\n A `presentation{id,title,slide_count}` header, then either a\n `content` block of GitHub-flavored markdown (one `## N. Title`\n section per slide with body + speaker notes) \u2014 or a `saved` path\n when --out is set. Same truncation pattern as `docs read`: default\n 8000-char cap with --full / --out as escape hatches.\n";
|
|
2
|
+
export declare function slidesSummarizeCommand(account: string, args: string[]): Promise<string>;
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { AxiError } from "axi-sdk-js";
|
|
4
|
+
import { slidesClient, translateGoogleError } from "../../google/client.js";
|
|
5
|
+
import { joinBlocks, renderHelp, renderObject, } from "../../output/index.js";
|
|
6
|
+
import { resolveOutputPath } from "../../util/paths.js";
|
|
7
|
+
import { extractSlideContent, isSlidePage, } from "./text.js";
|
|
8
|
+
export const SUMMARIZE_HELP = `usage: gws-axi slides summarize <presentation-id> [flags]
|
|
9
|
+
args[1]:
|
|
10
|
+
<presentation-id> The Slides presentation ID
|
|
11
|
+
flags[3]:
|
|
12
|
+
--full Bypass the 8000-char truncation threshold and emit
|
|
13
|
+
the complete deck inline.
|
|
14
|
+
--out <path> Write the full deck markdown to a file instead of
|
|
15
|
+
embedding it inline (implies --full).
|
|
16
|
+
--account <email> Account override when 2+ are configured
|
|
17
|
+
examples:
|
|
18
|
+
gws-axi slides summarize 1AbC...
|
|
19
|
+
gws-axi slides summarize 1AbC... --full
|
|
20
|
+
gws-axi slides summarize 1AbC... --out ./deck.md
|
|
21
|
+
output:
|
|
22
|
+
A \`presentation{id,title,slide_count}\` header, then either a
|
|
23
|
+
\`content\` block of GitHub-flavored markdown (one \`## N. Title\`
|
|
24
|
+
section per slide with body + speaker notes) — or a \`saved\` path
|
|
25
|
+
when --out is set. Same truncation pattern as \`docs read\`: default
|
|
26
|
+
8000-char cap with --full / --out as escape hatches.
|
|
27
|
+
`;
|
|
28
|
+
const DEFAULT_TRUNCATE_CHARS = 8000;
|
|
29
|
+
function parseFlags(args) {
|
|
30
|
+
let presentationId;
|
|
31
|
+
let full = false;
|
|
32
|
+
let out;
|
|
33
|
+
for (let i = 0; i < args.length; i++) {
|
|
34
|
+
const arg = args[i];
|
|
35
|
+
const next = args[i + 1];
|
|
36
|
+
switch (arg) {
|
|
37
|
+
case "--full":
|
|
38
|
+
full = true;
|
|
39
|
+
break;
|
|
40
|
+
case "--out":
|
|
41
|
+
out = next;
|
|
42
|
+
i++;
|
|
43
|
+
break;
|
|
44
|
+
default:
|
|
45
|
+
if (!arg.startsWith("--") && presentationId === undefined) {
|
|
46
|
+
presentationId = arg;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (!presentationId) {
|
|
51
|
+
throw new AxiError("Missing presentationId argument", "VALIDATION_ERROR", ["Usage: gws-axi slides summarize <presentation-id>"]);
|
|
52
|
+
}
|
|
53
|
+
if (out)
|
|
54
|
+
full = true;
|
|
55
|
+
return { presentationId, full, out };
|
|
56
|
+
}
|
|
57
|
+
function renderDeckAsMarkdown(presentation, slides) {
|
|
58
|
+
const lines = [];
|
|
59
|
+
lines.push(`# ${presentation.title || "(untitled deck)"}`, "");
|
|
60
|
+
lines.push(`${slides.length} slides`, "");
|
|
61
|
+
lines.push("---", "");
|
|
62
|
+
for (const s of slides) {
|
|
63
|
+
const heading = s.title ? `${s.index + 1}. ${s.title}` : `Slide ${s.index + 1}`;
|
|
64
|
+
lines.push(`## ${heading}`, "");
|
|
65
|
+
if (s.body.length > 0) {
|
|
66
|
+
lines.push(s.body.join("\n\n"), "");
|
|
67
|
+
}
|
|
68
|
+
if (s.speaker_notes) {
|
|
69
|
+
lines.push("**Speaker notes:**", "", s.speaker_notes, "");
|
|
70
|
+
}
|
|
71
|
+
if (s.image_count > 0 || s.table_count > 0 || s.has_video) {
|
|
72
|
+
const visuals = [];
|
|
73
|
+
if (s.image_count > 0)
|
|
74
|
+
visuals.push(`${s.image_count} image${s.image_count === 1 ? "" : "s"}`);
|
|
75
|
+
if (s.table_count > 0)
|
|
76
|
+
visuals.push(`${s.table_count} table${s.table_count === 1 ? "" : "s"}`);
|
|
77
|
+
if (s.has_video)
|
|
78
|
+
visuals.push("video");
|
|
79
|
+
lines.push(`_visuals: ${visuals.join(", ")}_`, "");
|
|
80
|
+
}
|
|
81
|
+
lines.push("---", "");
|
|
82
|
+
}
|
|
83
|
+
return lines.join("\n");
|
|
84
|
+
}
|
|
85
|
+
export async function slidesSummarizeCommand(account, args) {
|
|
86
|
+
const flags = parseFlags(args);
|
|
87
|
+
const api = await slidesClient(account);
|
|
88
|
+
let presentation;
|
|
89
|
+
try {
|
|
90
|
+
const res = await api.presentations.get({
|
|
91
|
+
presentationId: flags.presentationId,
|
|
92
|
+
});
|
|
93
|
+
presentation = res.data;
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
const translated = translateGoogleError(err, {
|
|
97
|
+
account,
|
|
98
|
+
operation: "slides.presentations.get",
|
|
99
|
+
});
|
|
100
|
+
if (translated.code === "NOT_FOUND") {
|
|
101
|
+
throw new AxiError(`Presentation '${flags.presentationId}' not found (or ${account} doesn't have access)`, "PRESENTATION_NOT_FOUND", [
|
|
102
|
+
`Verify the presentation ID is correct (the portion of the URL after /d/)`,
|
|
103
|
+
`Confirm ${account} has at least view access`,
|
|
104
|
+
]);
|
|
105
|
+
}
|
|
106
|
+
throw translated;
|
|
107
|
+
}
|
|
108
|
+
const slidePages = (presentation.slides ?? []).filter(isSlidePage);
|
|
109
|
+
const slides = slidePages.map((s, i) => extractSlideContent(s, i));
|
|
110
|
+
const markdown = renderDeckAsMarkdown(presentation, slides);
|
|
111
|
+
const total = markdown.length;
|
|
112
|
+
const blocks = [];
|
|
113
|
+
blocks.push(renderObject({ account }));
|
|
114
|
+
blocks.push(renderObject({
|
|
115
|
+
presentation: {
|
|
116
|
+
id: presentation.presentationId ?? flags.presentationId,
|
|
117
|
+
title: presentation.title ?? "",
|
|
118
|
+
slide_count: slides.length,
|
|
119
|
+
},
|
|
120
|
+
}));
|
|
121
|
+
if (flags.out) {
|
|
122
|
+
const defaultName = `${presentation.title || presentation.presentationId || "deck"}.md`;
|
|
123
|
+
const outPath = await resolveOutputPath(flags.out, defaultName);
|
|
124
|
+
await mkdir(dirname(outPath), { recursive: true });
|
|
125
|
+
await writeFile(outPath, markdown);
|
|
126
|
+
blocks.push(renderObject({
|
|
127
|
+
saved: outPath,
|
|
128
|
+
content_total_chars: total,
|
|
129
|
+
}));
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
const cap = flags.full ? Number.POSITIVE_INFINITY : DEFAULT_TRUNCATE_CHARS;
|
|
133
|
+
const truncated = total > cap;
|
|
134
|
+
const content = truncated ? `${markdown.slice(0, cap)}…` : markdown;
|
|
135
|
+
blocks.push(renderObject({ content }));
|
|
136
|
+
if (truncated) {
|
|
137
|
+
blocks.push(renderObject({
|
|
138
|
+
content_truncated: true,
|
|
139
|
+
content_total_chars: total,
|
|
140
|
+
}));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const suggestions = [];
|
|
144
|
+
const totalImages = slides.reduce((a, s) => a + s.image_count, 0);
|
|
145
|
+
const totalTables = slides.reduce((a, s) => a + s.table_count, 0);
|
|
146
|
+
if (totalImages > 0) {
|
|
147
|
+
suggestions.push(`${totalImages} image${totalImages === 1 ? "" : "s"} across the deck — text-only summary; use \`docs download ${flags.presentationId} --as application/pdf\` to fetch a visual version`);
|
|
148
|
+
}
|
|
149
|
+
if (totalTables > 0) {
|
|
150
|
+
suggestions.push(`${totalTables} table${totalTables === 1 ? "" : "s"} rendered as pipe-delimited rows (best-effort — Slides tables are layout-heavy)`);
|
|
151
|
+
}
|
|
152
|
+
if (!flags.out && total > DEFAULT_TRUNCATE_CHARS && !flags.full) {
|
|
153
|
+
suggestions.push(`Run \`gws-axi slides summarize ${flags.presentationId} --out <path>\` to save the complete deck, or --full to expand inline`);
|
|
154
|
+
}
|
|
155
|
+
suggestions.push(`Single-slide read: \`gws-axi slides page ${flags.presentationId} <page-id>\` (page IDs in \`slides get\`)`);
|
|
156
|
+
blocks.push(renderHelp(suggestions));
|
|
157
|
+
return joinBlocks(...blocks);
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=summarize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summarize.js","sourceRoot":"","sources":["../../../../src/commands/slides/summarize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { slides_v1 } from "googleapis";
|
|
2
|
+
export interface SlideContent {
|
|
3
|
+
index: number;
|
|
4
|
+
page_id: string;
|
|
5
|
+
title: string;
|
|
6
|
+
body: string[];
|
|
7
|
+
speaker_notes: string;
|
|
8
|
+
image_count: number;
|
|
9
|
+
table_count: number;
|
|
10
|
+
has_video: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Extract the visible text content of a slide: best-effort title (from
|
|
14
|
+
* a TITLE / CENTERED_TITLE placeholder), the body text from every other
|
|
15
|
+
* shape and table in document order, and the speaker notes from the
|
|
16
|
+
* slide's associated notes page.
|
|
17
|
+
*
|
|
18
|
+
* Images / videos / charts get no inline content — we just count them
|
|
19
|
+
* so agents can tell visual-heavy decks apart from text-heavy ones.
|
|
20
|
+
*/
|
|
21
|
+
export declare function extractSlideContent(slide: slides_v1.Schema$Page, index: number): SlideContent;
|
|
22
|
+
export declare function isSlidePage(p: slides_v1.Schema$Page): boolean;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract the visible text content of a slide: best-effort title (from
|
|
3
|
+
* a TITLE / CENTERED_TITLE placeholder), the body text from every other
|
|
4
|
+
* shape and table in document order, and the speaker notes from the
|
|
5
|
+
* slide's associated notes page.
|
|
6
|
+
*
|
|
7
|
+
* Images / videos / charts get no inline content — we just count them
|
|
8
|
+
* so agents can tell visual-heavy decks apart from text-heavy ones.
|
|
9
|
+
*/
|
|
10
|
+
export function extractSlideContent(slide, index) {
|
|
11
|
+
const content = {
|
|
12
|
+
index,
|
|
13
|
+
page_id: slide.objectId ?? "",
|
|
14
|
+
title: "",
|
|
15
|
+
body: [],
|
|
16
|
+
speaker_notes: "",
|
|
17
|
+
image_count: 0,
|
|
18
|
+
table_count: 0,
|
|
19
|
+
has_video: false,
|
|
20
|
+
};
|
|
21
|
+
for (const el of slide.pageElements ?? []) {
|
|
22
|
+
if (el.shape) {
|
|
23
|
+
const placeholderType = el.shape.placeholder?.type ?? "";
|
|
24
|
+
const text = extractShapeText(el.shape).trim();
|
|
25
|
+
if (!text)
|
|
26
|
+
continue;
|
|
27
|
+
if (!content.title &&
|
|
28
|
+
(placeholderType === "TITLE" || placeholderType === "CENTERED_TITLE")) {
|
|
29
|
+
content.title = text;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
content.body.push(text);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else if (el.table) {
|
|
36
|
+
content.table_count += 1;
|
|
37
|
+
const tableText = extractTableText(el.table).trim();
|
|
38
|
+
if (tableText)
|
|
39
|
+
content.body.push(tableText);
|
|
40
|
+
}
|
|
41
|
+
else if (el.image) {
|
|
42
|
+
content.image_count += 1;
|
|
43
|
+
}
|
|
44
|
+
else if (el.video) {
|
|
45
|
+
content.has_video = true;
|
|
46
|
+
}
|
|
47
|
+
else if (el.elementGroup) {
|
|
48
|
+
// Nested group — recurse one level to pick up text inside groups.
|
|
49
|
+
for (const inner of el.elementGroup.children ?? []) {
|
|
50
|
+
if (inner.shape) {
|
|
51
|
+
const text = extractShapeText(inner.shape).trim();
|
|
52
|
+
if (text)
|
|
53
|
+
content.body.push(text);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Speaker notes live on the notes page; the speakerNotesObjectId
|
|
59
|
+
// identifies which shape on it holds the notes text.
|
|
60
|
+
const notes = slide.slideProperties?.notesPage;
|
|
61
|
+
const notesObjectId = notes?.notesProperties?.speakerNotesObjectId;
|
|
62
|
+
if (notes && notesObjectId) {
|
|
63
|
+
for (const el of notes.pageElements ?? []) {
|
|
64
|
+
if (el.objectId === notesObjectId && el.shape) {
|
|
65
|
+
content.speaker_notes = extractShapeText(el.shape).trim();
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return content;
|
|
71
|
+
}
|
|
72
|
+
function extractShapeText(shape) {
|
|
73
|
+
if (!shape.text?.textElements)
|
|
74
|
+
return "";
|
|
75
|
+
const parts = [];
|
|
76
|
+
for (const el of shape.text.textElements) {
|
|
77
|
+
if (el.textRun?.content)
|
|
78
|
+
parts.push(el.textRun.content);
|
|
79
|
+
else if (el.autoText)
|
|
80
|
+
parts.push(el.autoText.content ?? "");
|
|
81
|
+
}
|
|
82
|
+
return parts.join("");
|
|
83
|
+
}
|
|
84
|
+
function extractTableText(table) {
|
|
85
|
+
const rows = [];
|
|
86
|
+
for (const row of table.tableRows ?? []) {
|
|
87
|
+
const cells = [];
|
|
88
|
+
for (const cell of row.tableCells ?? []) {
|
|
89
|
+
const cellText = [];
|
|
90
|
+
for (const el of cell.text?.textElements ?? []) {
|
|
91
|
+
if (el.textRun?.content)
|
|
92
|
+
cellText.push(el.textRun.content);
|
|
93
|
+
}
|
|
94
|
+
cells.push(cellText.join("").replace(/[\n|]/g, " ").trim());
|
|
95
|
+
}
|
|
96
|
+
rows.push(`| ${cells.join(" | ")} |`);
|
|
97
|
+
}
|
|
98
|
+
return rows.join("\n");
|
|
99
|
+
}
|
|
100
|
+
export function isSlidePage(p) {
|
|
101
|
+
return (p.pageType ?? "SLIDE") === "SLIDE";
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../../../src/commands/slides/text.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export declare const SLIDES_HELP: string;
|
|
2
|
-
export declare
|
|
2
|
+
export declare function slidesCommand(args: string[]): Promise<string>;
|
|
@@ -1,11 +1,94 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
import { AxiError } from "axi-sdk-js";
|
|
2
|
+
import { resolveAccount } from "../google/account.js";
|
|
3
|
+
import { GET_HELP, slidesGetCommand } from "./slides/get.js";
|
|
4
|
+
import { PAGE_HELP, slidesPageCommand } from "./slides/page.js";
|
|
5
|
+
import { SUMMARIZE_HELP, slidesSummarizeCommand, } from "./slides/summarize.js";
|
|
6
|
+
const CREATE_HELP = `usage: gws-axi slides create --title <text> [--from <template-id>] [flags]
|
|
7
|
+
status: planned for v1 writes — not yet implemented
|
|
8
|
+
`;
|
|
9
|
+
const UPDATE_HELP = `usage: gws-axi slides update <presentation-id> --requests <json-file> [flags]
|
|
10
|
+
status: planned for v1 writes — not yet implemented
|
|
11
|
+
notes:
|
|
12
|
+
Will wrap batchUpdate. Until implemented, programmatic edits require
|
|
13
|
+
the raw Slides API or the Drive copy/edit flow.
|
|
14
|
+
`;
|
|
15
|
+
const SUBCOMMANDS = [
|
|
16
|
+
{ name: "get", mutation: false, help: GET_HELP, handler: slidesGetCommand },
|
|
17
|
+
{
|
|
18
|
+
name: "page",
|
|
19
|
+
mutation: false,
|
|
20
|
+
help: PAGE_HELP,
|
|
21
|
+
handler: slidesPageCommand,
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: "summarize",
|
|
25
|
+
mutation: false,
|
|
26
|
+
help: SUMMARIZE_HELP,
|
|
27
|
+
handler: slidesSummarizeCommand,
|
|
28
|
+
},
|
|
29
|
+
{ name: "create", mutation: true, help: CREATE_HELP },
|
|
30
|
+
{ name: "update", mutation: true, help: UPDATE_HELP },
|
|
31
|
+
];
|
|
32
|
+
const SUB_BY_NAME = Object.fromEntries(SUBCOMMANDS.map((s) => [s.name, s]));
|
|
33
|
+
function parseAccountFlag(args) {
|
|
34
|
+
const rest = [];
|
|
35
|
+
let account;
|
|
36
|
+
for (let i = 0; i < args.length; i++) {
|
|
37
|
+
const arg = args[i];
|
|
38
|
+
if (arg === "--account" && args[i + 1]) {
|
|
39
|
+
account = args[i + 1];
|
|
40
|
+
i++;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
rest.push(arg);
|
|
44
|
+
}
|
|
45
|
+
return { account, rest };
|
|
46
|
+
}
|
|
47
|
+
const reads = SUBCOMMANDS.filter((s) => !s.mutation).map((s) => s.name);
|
|
48
|
+
const writes = SUBCOMMANDS.filter((s) => s.mutation).map((s) => s.name);
|
|
49
|
+
export const SLIDES_HELP = `usage: gws-axi slides <subcommand> [args] [--account <email>] [flags]
|
|
50
|
+
reads[${reads.length}]:
|
|
51
|
+
${reads.join(", ")}
|
|
52
|
+
writes[${writes.length}]:
|
|
53
|
+
${writes.join(", ")}
|
|
54
|
+
notes:
|
|
55
|
+
Writes require --account <email> when 2+ accounts are authenticated.
|
|
56
|
+
Reads use the default account when --account is not provided.
|
|
57
|
+
Write subcommands are scaffolded for the next slice; they throw
|
|
58
|
+
NOT_IMPLEMENTED after account resolution runs.
|
|
59
|
+
subcommand help:
|
|
60
|
+
gws-axi slides get --help for metadata + slide list
|
|
61
|
+
gws-axi slides page --help for a single slide's content
|
|
62
|
+
gws-axi slides summarize --help for the whole deck as markdown
|
|
63
|
+
examples:
|
|
64
|
+
gws-axi slides get 1AbC...
|
|
65
|
+
gws-axi slides summarize 1AbC...
|
|
66
|
+
gws-axi slides page 1AbC... gd87cbcb3a4_0_42
|
|
67
|
+
`;
|
|
68
|
+
export async function slidesCommand(args) {
|
|
69
|
+
if (args.length === 0 || (args.length === 1 && args[0] === "--help")) {
|
|
70
|
+
return SLIDES_HELP;
|
|
71
|
+
}
|
|
72
|
+
const sub = args[0];
|
|
73
|
+
const def = SUB_BY_NAME[sub];
|
|
74
|
+
if (!def) {
|
|
75
|
+
throw new AxiError(`Unknown slides subcommand: ${sub}`, "VALIDATION_ERROR", [`Run \`gws-axi slides --help\` to see available subcommands`]);
|
|
76
|
+
}
|
|
77
|
+
const rest = args.slice(1);
|
|
78
|
+
if (rest.includes("--help")) {
|
|
79
|
+
return def.help;
|
|
80
|
+
}
|
|
81
|
+
const { account: accountFlag, rest: remaining } = parseAccountFlag(rest);
|
|
82
|
+
const resolution = resolveAccount(accountFlag, {
|
|
83
|
+
mutation: def.mutation,
|
|
84
|
+
commandName: `slides ${sub}`,
|
|
85
|
+
});
|
|
86
|
+
if (!def.handler) {
|
|
87
|
+
throw new AxiError(`gws-axi slides ${sub} is not yet implemented`, "NOT_IMPLEMENTED", [
|
|
88
|
+
`Account resolution succeeded: would run as ${resolution.account}`,
|
|
89
|
+
`See \`gws-axi slides ${sub} --help\` for the planned surface`,
|
|
90
|
+
]);
|
|
91
|
+
}
|
|
92
|
+
return def.handler(resolution.account, remaining);
|
|
93
|
+
}
|
|
11
94
|
//# sourceMappingURL=slides.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slides.js","sourceRoot":"","sources":["../../../src/commands/slides.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"slides.js","sourceRoot":"","sources":["../../../src/commands/slides.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gws-axi",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.1",
|
|
4
4
|
"description": "AXI-compliant Google Workspace CLI — token-efficient TOON output, agent-guided auth setup, unified interface for Gmail, Calendar, Docs, Drive, Slides",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|