gws-axi 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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, SLIDES_HELP } from "./commands/slides.js";
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({
@@ -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,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAElE,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;IACnB,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"}
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"}
@@ -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":"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"}
@@ -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 const slidesCommand: (args: string[]) => Promise<Record<string, unknown>>;
2
+ export declare function slidesCommand(args: string[]): Promise<string>;
@@ -1,11 +1,94 @@
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;
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,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"}
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.7.0",
3
+ "version": "0.8.0",
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": {