photon-msg 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +275 -2
  3. package/dist/args.d.ts +63 -0
  4. package/dist/args.d.ts.map +1 -0
  5. package/dist/args.js +68 -0
  6. package/dist/args.js.map +1 -0
  7. package/dist/bin.d.ts +3 -0
  8. package/dist/bin.d.ts.map +1 -0
  9. package/dist/bin.js +9 -0
  10. package/dist/bin.js.map +1 -0
  11. package/dist/cli.d.ts +13 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +163 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/client.d.ts +37 -0
  16. package/dist/client.d.ts.map +1 -0
  17. package/dist/client.js +68 -0
  18. package/dist/client.js.map +1 -0
  19. package/dist/commands/attachments.d.ts +25 -0
  20. package/dist/commands/attachments.d.ts.map +1 -0
  21. package/dist/commands/attachments.js +78 -0
  22. package/dist/commands/attachments.js.map +1 -0
  23. package/dist/commands/doctor.d.ts +9 -0
  24. package/dist/commands/doctor.d.ts.map +1 -0
  25. package/dist/commands/doctor.js +54 -0
  26. package/dist/commands/doctor.js.map +1 -0
  27. package/dist/commands/line.d.ts +51 -0
  28. package/dist/commands/line.d.ts.map +1 -0
  29. package/dist/commands/line.js +117 -0
  30. package/dist/commands/line.js.map +1 -0
  31. package/dist/commands/messages.d.ts +82 -0
  32. package/dist/commands/messages.d.ts.map +1 -0
  33. package/dist/commands/messages.js +163 -0
  34. package/dist/commands/messages.js.map +1 -0
  35. package/dist/commands/misc.d.ts +33 -0
  36. package/dist/commands/misc.d.ts.map +1 -0
  37. package/dist/commands/misc.js +61 -0
  38. package/dist/commands/misc.js.map +1 -0
  39. package/dist/commands/send.d.ts +107 -0
  40. package/dist/commands/send.d.ts.map +1 -0
  41. package/dist/commands/send.js +104 -0
  42. package/dist/commands/send.js.map +1 -0
  43. package/dist/commands/spaces.d.ts +56 -0
  44. package/dist/commands/spaces.d.ts.map +1 -0
  45. package/dist/commands/spaces.js +118 -0
  46. package/dist/commands/spaces.js.map +1 -0
  47. package/dist/commands/users.d.ts +34 -0
  48. package/dist/commands/users.d.ts.map +1 -0
  49. package/dist/commands/users.js +82 -0
  50. package/dist/commands/users.js.map +1 -0
  51. package/dist/config.d.ts +47 -0
  52. package/dist/config.d.ts.map +1 -0
  53. package/dist/config.js +77 -0
  54. package/dist/config.js.map +1 -0
  55. package/dist/content.d.ts +33 -0
  56. package/dist/content.d.ts.map +1 -0
  57. package/dist/content.js +287 -0
  58. package/dist/content.js.map +1 -0
  59. package/dist/errors.d.ts +62 -0
  60. package/dist/errors.d.ts.map +1 -0
  61. package/dist/errors.js +95 -0
  62. package/dist/errors.js.map +1 -0
  63. package/dist/help.d.ts +8 -0
  64. package/dist/help.d.ts.map +1 -0
  65. package/dist/help.js +177 -0
  66. package/dist/help.js.map +1 -0
  67. package/dist/index.d.ts +21 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +13 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/output.d.ts +35 -0
  72. package/dist/output.d.ts.map +1 -0
  73. package/dist/output.js +121 -0
  74. package/dist/output.js.map +1 -0
  75. package/dist/target.d.ts +34 -0
  76. package/dist/target.d.ts.map +1 -0
  77. package/dist/target.js +75 -0
  78. package/dist/target.js.map +1 -0
  79. package/dist/types.d.ts +200 -0
  80. package/dist/types.d.ts.map +1 -0
  81. package/dist/types.js +8 -0
  82. package/dist/types.js.map +1 -0
  83. package/dist/upload.d.ts +33 -0
  84. package/dist/upload.d.ts.map +1 -0
  85. package/dist/upload.js +119 -0
  86. package/dist/upload.js.map +1 -0
  87. package/package.json +49 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,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;AAOzC;;;;;;GAMG;AACH,SAAS,WAAW;IAClB,IAAI,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACxD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QAClD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAgB,CAAC;gBACvE,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC,EAAE,CAAC;oBACzE,OAAO,GAAG,CAAC,OAAO,CAAC;gBACrB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,wCAAwC;YAC1C,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAClC,IAAI,MAAM,KAAK,SAAS;YAAE,MAAM;QAChC,SAAS,GAAG,MAAM,CAAC;IACrB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,4DAA4D;AAC5D,MAAM,CAAC,MAAM,OAAO,GAAW,WAAW,EAAE,CAAC;AAE7C,MAAM,CAAC,MAAM,SAAS,GAAG,cAAc,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyD7C,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAA2B;IAClD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCP;IACC,eAAe,EAAE;;;;;;;;;;;;CAYlB;IACC,gBAAgB,EAAE;;;;;;CAMnB;IACC,eAAe,EAAE;;;;;CAKlB;IACC,cAAc,EAAE;;;;CAIjB;IACC,oBAAoB,EAAE;;;CAGvB;IACC,MAAM,EAAE;;;CAGT;IACC,aAAa,EAAE;;;;;;CAMhB;CACA,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Programmatic entry point, so the CLI's building blocks can be reused in a
3
+ * script or an agent without shelling out.
4
+ */
5
+ export { createPhotonClient, createOfflineClient, pageItems, nextPageToken, handleOf } from "./client.js";
6
+ export type { ClientOptions } from "./client.js";
7
+ export { buildMessage, detectModes, describeContent, validateContentFlags, MODES } from "./content.js";
8
+ export type { BuildMessageInput, ContentMode } from "./content.js";
9
+ export { resolveTarget, resolveUser, normalizeHandle, inferPlatform } from "./target.js";
10
+ export type { ResolveTargetInput, ResolveUserInput } from "./target.js";
11
+ export { createUploader, buildMultipartRelated, contentTypeFor } from "./upload.js";
12
+ export type { UploaderOptions, MultipartInput } from "./upload.js";
13
+ export { resolveConfig, requireCredentials, readConfigFile, redact, ENV, defaultConfigPath } from "./config.js";
14
+ export type { Config, ConfigFile, Credentials, ResolveConfigInput } from "./config.js";
15
+ export { createOutput, formatTime, summarizeContent } from "./output.js";
16
+ export type { Output, OutputOptions, TableColumn } from "./output.js";
17
+ export { CliError, EXIT, PROBLEM_HINTS, toCliError, isApiError, errorPayload, usageError } from "./errors.js";
18
+ export type { CliErrorOptions, ExitCode, ProblemBody, ApiErrorLike } from "./errors.js";
19
+ export { main, ROUTES, commands, hasRoute } from "./cli.js";
20
+ export type { Flags, Command, CommandContext, BuiltMessage, EmailOptions, ResolvedTarget, Uploader, UserLookup, UserRecord, MessageRecord, SpaceRecord, AssignmentRecord, AttachmentRecord, } from "./types.js";
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC1G,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACvG,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEnE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACzF,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAExE,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACpF,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEnE,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChH,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEvF,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACzE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEtE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9G,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAExF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE5D,YAAY,EACV,KAAK,EACL,OAAO,EACP,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,UAAU,EACV,UAAU,EACV,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Programmatic entry point, so the CLI's building blocks can be reused in a
3
+ * script or an agent without shelling out.
4
+ */
5
+ export { createPhotonClient, createOfflineClient, pageItems, nextPageToken, handleOf } from "./client.js";
6
+ export { buildMessage, detectModes, describeContent, validateContentFlags, MODES } from "./content.js";
7
+ export { resolveTarget, resolveUser, normalizeHandle, inferPlatform } from "./target.js";
8
+ export { createUploader, buildMultipartRelated, contentTypeFor } from "./upload.js";
9
+ export { resolveConfig, requireCredentials, readConfigFile, redact, ENV, defaultConfigPath } from "./config.js";
10
+ export { createOutput, formatTime, summarizeContent } from "./output.js";
11
+ export { CliError, EXIT, PROBLEM_HINTS, toCliError, isApiError, errorPayload, usageError } from "./errors.js";
12
+ export { main, ROUTES, commands, hasRoute } from "./cli.js";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG1G,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAGvG,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGzF,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGpF,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGhH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGzE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9G,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Output helper: one place that decides between human-readable text and stable
3
+ * JSON, and that keeps stdout clean so `--json` stays pipeable.
4
+ */
5
+ import type { Writable } from "node:stream";
6
+ import type { SendContent } from "@photon-ai/api";
7
+ import type { CliError } from "./errors.js";
8
+ export interface OutputOptions {
9
+ json?: boolean;
10
+ color?: boolean;
11
+ stdout?: Writable;
12
+ stderr?: Writable;
13
+ }
14
+ export interface TableColumn<T> {
15
+ header: string;
16
+ value: (row: T) => unknown;
17
+ }
18
+ export interface Output {
19
+ readonly json: boolean;
20
+ data(value: unknown): void;
21
+ line(text?: string): void;
22
+ success(text: string): void;
23
+ info(text: string): void;
24
+ warn(text: string): void;
25
+ error(cliError: CliError): void;
26
+ table<T>(rows: T[], columns: Array<TableColumn<T>>): void;
27
+ heading(text: string): void;
28
+ keyValue(pairs: Array<[string, unknown]>): void;
29
+ }
30
+ export declare function createOutput({ json, color, stdout, stderr, }?: OutputOptions): Output;
31
+ /** Formats an RFC 3339 timestamp for humans; falls back to the raw string. */
32
+ export declare function formatTime(value: string | undefined): string;
33
+ /** Renders message content as a single line of text for tables and logs. */
34
+ export declare function summarizeContent(content: SendContent | undefined): string;
35
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAW5C,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,MAAM,CAAC,EAAE,QAAQ,CAAC;CACnB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAC1D,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;CACjD;AAED,wBAAgB,YAAY,CAAC,EAC3B,IAAY,EACZ,KAAa,EACb,MAAuB,EACvB,MAAuB,GACxB,GAAE,aAAkB,GAAG,MAAM,CAsE7B;AAED,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAK5D;AAED,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,CA8BzE"}
package/dist/output.js ADDED
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Output helper: one place that decides between human-readable text and stable
3
+ * JSON, and that keeps stdout clean so `--json` stays pipeable.
4
+ */
5
+ const ANSI = {
6
+ reset: "\u001b[0m",
7
+ dim: "\u001b[2m",
8
+ bold: "\u001b[1m",
9
+ red: "\u001b[31m",
10
+ green: "\u001b[32m",
11
+ yellow: "\u001b[33m",
12
+ };
13
+ export function createOutput({ json = false, color = false, stdout = process.stdout, stderr = process.stderr, } = {}) {
14
+ const paint = (code, text) => (color ? `${code}${text}${ANSI.reset}` : text);
15
+ return {
16
+ json,
17
+ /** Emits the machine-readable result; a no-op unless --json is set. */
18
+ data(value) {
19
+ if (!json)
20
+ return;
21
+ stdout.write(`${JSON.stringify(value, null, 2)}\n`);
22
+ },
23
+ line(text = "") {
24
+ if (json)
25
+ return;
26
+ stdout.write(`${text}\n`);
27
+ },
28
+ success(text) {
29
+ if (json)
30
+ return;
31
+ stdout.write(`${paint(ANSI.green, "✓")} ${text}\n`);
32
+ },
33
+ info(text) {
34
+ if (json)
35
+ return;
36
+ stdout.write(`${paint(ANSI.dim, text)}\n`);
37
+ },
38
+ warn(text) {
39
+ if (json)
40
+ return;
41
+ stderr.write(`${paint(ANSI.yellow, "!")} ${text}\n`);
42
+ },
43
+ error(cliError) {
44
+ stderr.write(`${paint(ANSI.red, "✗")} ${cliError.message}\n`);
45
+ if (cliError.hint)
46
+ stderr.write(` ${cliError.hint}\n`);
47
+ },
48
+ /** Simple two-column renderer used by the list commands. */
49
+ table(rows, columns) {
50
+ if (json)
51
+ return;
52
+ if (rows.length === 0) {
53
+ this.info("(no results)");
54
+ return;
55
+ }
56
+ const widths = columns.map((column) => Math.max(column.header.length, ...rows.map((row) => String(column.value(row) ?? "").length)));
57
+ const header = columns.map((column, index) => column.header.padEnd(widths[index] ?? 0)).join(" ");
58
+ stdout.write(`${paint(ANSI.bold, header)}\n`);
59
+ for (const row of rows) {
60
+ const cells = columns.map((column, index) => String(column.value(row) ?? "").padEnd(widths[index] ?? 0));
61
+ stdout.write(`${cells.join(" ")}\n`);
62
+ }
63
+ },
64
+ heading(text) {
65
+ if (json)
66
+ return;
67
+ stdout.write(`${paint(ANSI.bold, text)}\n`);
68
+ },
69
+ keyValue(pairs) {
70
+ if (json)
71
+ return;
72
+ const width = Math.max(...pairs.map(([key]) => key.length));
73
+ for (const [key, value] of pairs) {
74
+ stdout.write(`${paint(ANSI.dim, key.padEnd(width))} ${String(value ?? "")}\n`);
75
+ }
76
+ },
77
+ };
78
+ }
79
+ /** Formats an RFC 3339 timestamp for humans; falls back to the raw string. */
80
+ export function formatTime(value) {
81
+ if (!value)
82
+ return "";
83
+ const date = new Date(value);
84
+ if (Number.isNaN(date.getTime()))
85
+ return value;
86
+ return date.toISOString().replace("T", " ").replace(/\.\d+Z$/, "Z");
87
+ }
88
+ /** Renders message content as a single line of text for tables and logs. */
89
+ export function summarizeContent(content) {
90
+ if (!content)
91
+ return "";
92
+ switch (content.type) {
93
+ case "text":
94
+ case "text.update":
95
+ return content.text;
96
+ case "attachment":
97
+ return `[attachment ${content.attachmentId}]`;
98
+ case "voice":
99
+ return "[voice note]";
100
+ case "reaction":
101
+ return `[reaction ${content.action ?? "add"} ${content.reaction}]`;
102
+ case "poll":
103
+ case "poll.update":
104
+ return `[poll ${content.question}]`;
105
+ case "poll.vote":
106
+ return "[poll vote]";
107
+ case "message.delete":
108
+ return "[message deleted]";
109
+ case "message.read":
110
+ return "[read receipt]";
111
+ case "space.typing.update":
112
+ return `[typing ${content.typing ? "on" : "off"}]`;
113
+ case "space.participants.update":
114
+ return "[participants updated]";
115
+ case "group":
116
+ return `[group of ${content.parts.length}]`;
117
+ default:
118
+ return "[unknown content]";
119
+ }
120
+ }
121
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Resolves who is sending and where, turning friendly handles into the IDs the
3
+ * API requires.
4
+ *
5
+ * Two addressing styles are supported:
6
+ * --space <spaceId> --as <sender> reply into an existing conversation
7
+ * --to <handle> --as <sender> start (or reuse) a direct conversation
8
+ *
9
+ * The second relies on `createOrGetSpace`, so it is idempotent for a given pair
10
+ * of participants.
11
+ */
12
+ import type { Photon } from "@photon-ai/api";
13
+ import type { Flags, ResolvedTarget, UserRecord } from "./types.js";
14
+ /** Infers a platform from a handle when --platform is absent. */
15
+ export declare function inferPlatform(handle: string | undefined, fallback?: string): string;
16
+ /** Normalizes a phone number to E.164 when it looks like one; otherwise passes it through. */
17
+ export declare function normalizeHandle(handle: string): string;
18
+ export interface ResolveUserInput {
19
+ client: Photon;
20
+ projectId: string;
21
+ platform: string;
22
+ input: string;
23
+ normalize?: boolean;
24
+ }
25
+ /** Accepts a Photon user ID or a handle and returns the user record. */
26
+ export declare function resolveUser({ client, projectId, platform, input, normalize, }: ResolveUserInput): Promise<UserRecord>;
27
+ export interface ResolveTargetInput {
28
+ client: Photon;
29
+ projectId: string;
30
+ flags: Flags;
31
+ defaultHandle?: string | undefined;
32
+ }
33
+ export declare function resolveTarget({ client, projectId, flags, defaultHandle, }: ResolveTargetInput): Promise<ResolvedTarget>;
34
+ //# sourceMappingURL=target.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target.d.ts","sourceRoot":"","sources":["../src/target.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAIpE,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,SAAa,GAAG,MAAM,CAIvF;AAED,8FAA8F;AAC9F,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOtD;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wEAAwE;AACxE,wBAAsB,WAAW,CAAC,EAChC,MAAM,EACN,SAAS,EACT,QAAQ,EACR,KAAK,EACL,SAAgB,GACjB,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CAWxC;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,wBAAsB,aAAa,CAAC,EAClC,MAAM,EACN,SAAS,EACT,KAAK,EACL,aAAa,GACd,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,CAAC,CA0C9C"}
package/dist/target.js ADDED
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Resolves who is sending and where, turning friendly handles into the IDs the
3
+ * API requires.
4
+ *
5
+ * Two addressing styles are supported:
6
+ * --space <spaceId> --as <sender> reply into an existing conversation
7
+ * --to <handle> --as <sender> start (or reuse) a direct conversation
8
+ *
9
+ * The second relies on `createOrGetSpace`, so it is idempotent for a given pair
10
+ * of participants.
11
+ */
12
+ import { usageError } from "./errors.js";
13
+ const USER_ID = /^pho_usr_[0-9a-z]+$/i;
14
+ /** Infers a platform from a handle when --platform is absent. */
15
+ export function inferPlatform(handle, fallback = "imessage") {
16
+ if (!handle)
17
+ return fallback;
18
+ if (handle.includes("@"))
19
+ return "email";
20
+ return fallback;
21
+ }
22
+ /** Normalizes a phone number to E.164 when it looks like one; otherwise passes it through. */
23
+ export function normalizeHandle(handle) {
24
+ const value = handle.trim();
25
+ const digits = value.replace(/[^\d+]/g, "");
26
+ if (/^\+?\d{7,15}$/.test(digits)) {
27
+ return digits.startsWith("+") ? digits : `+1${digits}`;
28
+ }
29
+ return value;
30
+ }
31
+ /** Accepts a Photon user ID or a handle and returns the user record. */
32
+ export async function resolveUser({ client, projectId, platform, input, normalize = true, }) {
33
+ if (USER_ID.test(input)) {
34
+ const user = await client.projects.getUser({ path: { id: projectId, userId: input } });
35
+ return user;
36
+ }
37
+ const handle = normalize ? normalizeHandle(input) : input;
38
+ const user = await client.projects.createOrGetUser({
39
+ path: { id: projectId },
40
+ body: { handle, platform },
41
+ });
42
+ return user;
43
+ }
44
+ export async function resolveTarget({ client, projectId, flags, defaultHandle, }) {
45
+ const platform = flags.platform ?? inferPlatform(flags.to);
46
+ const senderInput = flags.as ?? defaultHandle;
47
+ if (!senderInput) {
48
+ throw usageError("No sender. Pass --as <agent handle or user ID>, or set PHOTON_AGENT_HANDLE.", "The sender must be an agent that belongs to this project (for example the number assigned to a shared line).");
49
+ }
50
+ const sender = await resolveUser({ client, projectId, platform, input: senderInput });
51
+ const senderId = String(sender.id);
52
+ const senderHandle = typeof sender.handle === "string" ? sender.handle : undefined;
53
+ if (flags.space) {
54
+ return { spaceId: flags.space, senderId, ...(senderHandle ? { senderHandle } : {}) };
55
+ }
56
+ if (!flags.to) {
57
+ throw usageError("No destination. Pass --to <handle> to start a direct conversation, or --space <spaceId> to use an existing one.");
58
+ }
59
+ const peer = await resolveUser({ client, projectId, platform, input: flags.to });
60
+ const peerId = String(peer.id);
61
+ const space = await client.projects.createOrGetSpace({
62
+ path: { id: projectId },
63
+ headers: {
64
+ "idempotency-key": flags["idempotency-key"] ?? `photon-msg:space:${senderId}:${peerId}`,
65
+ },
66
+ body: { platform, participantIds: [senderId, peerId] },
67
+ });
68
+ return {
69
+ spaceId: String(space.id),
70
+ senderId,
71
+ ...(senderHandle ? { senderHandle } : {}),
72
+ peerId,
73
+ };
74
+ }
75
+ //# sourceMappingURL=target.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target.js","sourceRoot":"","sources":["../src/target.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Shared types for the CLI.
3
+ *
4
+ * Payload shapes come from the SDK rather than being re-declared, so the CLI
5
+ * fails to compile if the API contract changes underneath it.
6
+ */
7
+ import type { ParseArgsOptionsConfig } from "node:util";
8
+ import type { Photon, SendContent } from "@photon-ai/api";
9
+ import type { Output } from "./output.js";
10
+ import type { Config } from "./config.js";
11
+ /** Uploads a local path or URL and resolves to an attachment ID. */
12
+ export type Uploader = (source: string, options?: {
13
+ contentType?: string;
14
+ }) => Promise<string>;
15
+ /** Looks up users by Photon ID; used to build participant snapshots. */
16
+ export type UserLookup = (ids: string[]) => Promise<UserRecord[]>;
17
+ /** The subset of a Photon User the CLI relies on. */
18
+ export interface UserRecord {
19
+ id: string;
20
+ handle?: string;
21
+ kind?: string;
22
+ type?: string;
23
+ platform?: string;
24
+ createdAt?: string;
25
+ [key: string]: unknown;
26
+ }
27
+ /**
28
+ * Parsed flags. `parseArgs` yields `string | boolean | (string|boolean)[]`, so
29
+ * array-capable options are typed as `string | string[]` and normalized by
30
+ * `toArray` at the call site.
31
+ */
32
+ export interface Flags {
33
+ help?: boolean;
34
+ version?: boolean;
35
+ json?: boolean;
36
+ color?: boolean;
37
+ "api-key"?: string;
38
+ project?: string;
39
+ "base-url"?: string;
40
+ timeout?: string;
41
+ "dry-run"?: boolean;
42
+ quiet?: boolean;
43
+ to?: string;
44
+ space?: string;
45
+ as?: string;
46
+ platform?: string;
47
+ text?: string | string[];
48
+ "text-file"?: string;
49
+ format?: string;
50
+ image?: string | string[];
51
+ file?: string | string[];
52
+ caption?: string;
53
+ voice?: string;
54
+ reaction?: string;
55
+ "reaction-action"?: string;
56
+ poll?: string;
57
+ "poll-option"?: string | string[];
58
+ "poll-mode"?: string;
59
+ edit?: string;
60
+ delete?: string;
61
+ reason?: string;
62
+ read?: boolean;
63
+ typing?: string;
64
+ "participants-add"?: string | string[];
65
+ "participants-remove"?: string | string[];
66
+ group?: boolean;
67
+ "reply-to"?: string;
68
+ "idempotency-key"?: string;
69
+ subject?: string;
70
+ cc?: string | string[];
71
+ bcc?: string | string[];
72
+ direction?: string;
73
+ order?: string;
74
+ "order-by"?: string;
75
+ resource?: string;
76
+ "perspective-user"?: string;
77
+ "created-since"?: string;
78
+ "created-before"?: string;
79
+ "updated-since"?: string;
80
+ "updated-before"?: string;
81
+ "exclude-content-types"?: string;
82
+ "page-size"?: string;
83
+ "page-token"?: string;
84
+ limit?: string;
85
+ interval?: string;
86
+ for?: string;
87
+ since?: string;
88
+ participant?: string | string[];
89
+ "participant-handle"?: string;
90
+ handle?: string;
91
+ email?: string;
92
+ "first-name"?: string;
93
+ "last-name"?: string;
94
+ "include-released"?: boolean;
95
+ "content-type"?: string;
96
+ out?: string;
97
+ on?: boolean;
98
+ off?: boolean;
99
+ }
100
+ /** Everything a command receives. `client` and `upload` are always present; in
101
+ * dry-run they throw rather than silently doing nothing. */
102
+ export interface CommandContext {
103
+ flags: Flags;
104
+ positionals: string[];
105
+ config: Config;
106
+ projectId: string;
107
+ client: Photon;
108
+ upload: Uploader;
109
+ out: Output;
110
+ dryRun: boolean;
111
+ }
112
+ /** A command implementation. */
113
+ export interface Command {
114
+ options: ParseArgsOptionsConfig;
115
+ run(ctx: CommandContext): Promise<void>;
116
+ }
117
+ /** A resolved outbound payload, before it is addressed to a space. */
118
+ export interface BuiltMessage {
119
+ content: SendContent;
120
+ parentMessageId?: string;
121
+ email?: EmailOptions;
122
+ }
123
+ /** Email-only options that travel alongside content. */
124
+ export interface EmailOptions {
125
+ subject?: string;
126
+ cc?: Array<{
127
+ address: string;
128
+ }>;
129
+ bcc?: Array<{
130
+ address: string;
131
+ }>;
132
+ }
133
+ /** Resolved addressing for a send. */
134
+ export interface ResolvedTarget {
135
+ spaceId: string;
136
+ senderId: string;
137
+ senderHandle?: string;
138
+ peerId?: string;
139
+ }
140
+ /**
141
+ * Display projections of API resources.
142
+ *
143
+ * The SDK models these as platform-specific unions; the CLI only reads the
144
+ * fields that every platform shares, so these interfaces keep table and JSON
145
+ * output typed without pretending to model each platform.
146
+ */
147
+ export interface MessageRecord {
148
+ id: string;
149
+ platform?: string;
150
+ direction?: string;
151
+ status?: string;
152
+ createdAt?: string;
153
+ updatedAt?: string;
154
+ space?: {
155
+ id: string;
156
+ kind?: string;
157
+ platform?: string;
158
+ };
159
+ sentBy?: {
160
+ id?: string;
161
+ kind?: string;
162
+ handle?: string;
163
+ };
164
+ receivedBy?: {
165
+ id?: string;
166
+ kind?: string;
167
+ handle?: string;
168
+ } | null;
169
+ content?: SendContent;
170
+ [key: string]: unknown;
171
+ }
172
+ export interface SpaceRecord {
173
+ id: string;
174
+ platform?: string;
175
+ kind?: string;
176
+ title?: string;
177
+ name?: string;
178
+ createdAt?: string;
179
+ [key: string]: unknown;
180
+ }
181
+ export interface AssignmentRecord {
182
+ assignmentId: string;
183
+ handle: string;
184
+ assignedPhoneNumber: string;
185
+ platform?: string;
186
+ projectId?: string;
187
+ createdAt?: string;
188
+ updatedAt?: string;
189
+ releasedAt?: string;
190
+ [key: string]: unknown;
191
+ }
192
+ export interface AttachmentRecord {
193
+ id: string;
194
+ contentType?: string;
195
+ filename?: string;
196
+ sizeBytes?: number;
197
+ createdAt?: string;
198
+ [key: string]: unknown;
199
+ }
200
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Shared types for the CLI.
3
+ *
4
+ * Payload shapes come from the SDK rather than being re-declared, so the CLI
5
+ * fails to compile if the API contract changes underneath it.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Attachment upload.
3
+ *
4
+ * The endpoint takes `multipart/related` with exactly two parts: a JSON
5
+ * descriptor followed by the raw bytes. We talk to it with fetch directly rather
6
+ * than through the SDK, because the SDK's upload method expects a
7
+ * pre-serialized body and would otherwise fight us over the content type.
8
+ */
9
+ import type { Uploader } from "./types.js";
10
+ /** Best-effort content type from a filename extension. */
11
+ export declare function contentTypeFor(filename: string): string;
12
+ export interface MultipartInput {
13
+ descriptor: Record<string, unknown>;
14
+ bytes: Uint8Array;
15
+ contentType: string;
16
+ boundary: string;
17
+ }
18
+ /**
19
+ * Builds the `multipart/related` body by hand so the framing is exactly what the
20
+ * API documents: two parts, no extra headers. (The API rejects unsupported
21
+ * content-type parameters and part headers, which is why nothing else is added.)
22
+ */
23
+ export declare function buildMultipartRelated({ descriptor, bytes, contentType, boundary, }: MultipartInput): Uint8Array;
24
+ export interface UploaderOptions {
25
+ apiKey: string;
26
+ projectId: string;
27
+ baseUrl?: string;
28
+ fetch?: typeof globalThis.fetch;
29
+ timeoutMs?: number;
30
+ }
31
+ /** Creates an uploader bound to one project. Returns an attachment ID. */
32
+ export declare function createUploader({ apiKey, projectId, baseUrl, fetch: fetchImpl, timeoutMs, }: UploaderOptions): Uploader;
33
+ //# sourceMappingURL=upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../src/upload.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAqB3C,0DAA0D;AAC1D,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,KAAK,EAAE,UAAU,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,UAAU,EACV,KAAK,EACL,WAAW,EACX,QAAQ,GACT,EAAE,cAAc,GAAG,UAAU,CAmB7B;AAyBD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,SAAS,EACT,OAA0B,EAC1B,KAAK,EAAE,SAA4B,EACnC,SAAS,GACV,EAAE,eAAe,GAAG,QAAQ,CA2C5B"}