slack-axi 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +77 -0
- package/dist/bin/slack-axi.d.ts +2 -0
- package/dist/bin/slack-axi.js +4 -0
- package/dist/bin/slack-axi.js.map +1 -0
- package/dist/src/auth/setup.d.ts +39 -0
- package/dist/src/auth/setup.js +119 -0
- package/dist/src/auth/setup.js.map +1 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +66 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/commands/auth.d.ts +2 -0
- package/dist/src/commands/auth.js +192 -0
- package/dist/src/commands/auth.js.map +1 -0
- package/dist/src/commands/cache.d.ts +2 -0
- package/dist/src/commands/cache.js +25 -0
- package/dist/src/commands/cache.js.map +1 -0
- package/dist/src/commands/catchup.d.ts +2 -0
- package/dist/src/commands/catchup.js +171 -0
- package/dist/src/commands/catchup.js.map +1 -0
- package/dist/src/commands/channels.d.ts +6 -0
- package/dist/src/commands/channels.js +147 -0
- package/dist/src/commands/channels.js.map +1 -0
- package/dist/src/commands/cite.d.ts +2 -0
- package/dist/src/commands/cite.js +38 -0
- package/dist/src/commands/cite.js.map +1 -0
- package/dist/src/commands/doctor.d.ts +2 -0
- package/dist/src/commands/doctor.js +46 -0
- package/dist/src/commands/doctor.js.map +1 -0
- package/dist/src/commands/home.d.ts +6 -0
- package/dist/src/commands/home.js +37 -0
- package/dist/src/commands/home.js.map +1 -0
- package/dist/src/commands/read.d.ts +4 -0
- package/dist/src/commands/read.js +178 -0
- package/dist/src/commands/read.js.map +1 -0
- package/dist/src/commands/search.d.ts +2 -0
- package/dist/src/commands/search.js +135 -0
- package/dist/src/commands/search.js.map +1 -0
- package/dist/src/commands/setup.d.ts +2 -0
- package/dist/src/commands/setup.js +21 -0
- package/dist/src/commands/setup.js.map +1 -0
- package/dist/src/commands/write.d.ts +4 -0
- package/dist/src/commands/write.js +148 -0
- package/dist/src/commands/write.js.map +1 -0
- package/dist/src/config.d.ts +71 -0
- package/dist/src/config.js +184 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/flags.d.ts +11 -0
- package/dist/src/flags.js +21 -0
- package/dist/src/flags.js.map +1 -0
- package/dist/src/meta.d.ts +3 -0
- package/dist/src/meta.js +17 -0
- package/dist/src/meta.js.map +1 -0
- package/dist/src/output.d.ts +25 -0
- package/dist/src/output.js +52 -0
- package/dist/src/output.js.map +1 -0
- package/dist/src/session.d.ts +17 -0
- package/dist/src/session.js +25 -0
- package/dist/src/session.js.map +1 -0
- package/dist/src/slack/cache.d.ts +40 -0
- package/dist/src/slack/cache.js +161 -0
- package/dist/src/slack/cache.js.map +1 -0
- package/dist/src/slack/client.d.ts +21 -0
- package/dist/src/slack/client.js +39 -0
- package/dist/src/slack/client.js.map +1 -0
- package/dist/src/slack/errors.d.ts +14 -0
- package/dist/src/slack/errors.js +54 -0
- package/dist/src/slack/errors.js.map +1 -0
- package/dist/src/slack/format.d.ts +8 -0
- package/dist/src/slack/format.js +20 -0
- package/dist/src/slack/format.js.map +1 -0
- package/dist/src/slack/permalink.d.ts +7 -0
- package/dist/src/slack/permalink.js +10 -0
- package/dist/src/slack/permalink.js.map +1 -0
- package/dist/src/slack/resolve.d.ts +22 -0
- package/dist/src/slack/resolve.js +118 -0
- package/dist/src/slack/resolve.js.map +1 -0
- package/dist/src/slack/scopes.d.ts +7 -0
- package/dist/src/slack/scopes.js +23 -0
- package/dist/src/slack/scopes.js.map +1 -0
- package/dist/src/slack/threads.d.ts +24 -0
- package/dist/src/slack/threads.js +63 -0
- package/dist/src/slack/threads.js.map +1 -0
- package/dist/src/slack/time.d.ts +46 -0
- package/dist/src/slack/time.js +156 -0
- package/dist/src/slack/time.js.map +1 -0
- package/dist/src/slack/ts.d.ts +5 -0
- package/dist/src/slack/ts.js +14 -0
- package/dist/src/slack/ts.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { AxiError } from "axi-sdk-js";
|
|
2
|
+
/**
|
|
3
|
+
* Human time in, Slack ts out — the year-correctness guard. The agent never produces an epoch; we
|
|
4
|
+
* parse spans/dates in a timezone (Eastern by default) and echo the resolved window back with explicit
|
|
5
|
+
* year. See specs/behaviors/time-and-completeness.md. All functions are pure (now is injected).
|
|
6
|
+
*/
|
|
7
|
+
export const DEFAULT_TZ = "America/New_York";
|
|
8
|
+
const DEFAULT_WINDOW_MS = 7 * 24 * 60 * 60 * 1000;
|
|
9
|
+
/** Parse a relative span like `90m`, `24h`, `7d`, `2w` into milliseconds; undefined if it doesn't match. */
|
|
10
|
+
export function parseSpanMs(input) {
|
|
11
|
+
const m = /^(\d+)(m|h|d|w)$/.exec(input.trim());
|
|
12
|
+
if (!m)
|
|
13
|
+
return undefined;
|
|
14
|
+
const n = Number.parseInt(m[1], 10);
|
|
15
|
+
const unit = m[2];
|
|
16
|
+
const factor = unit === "m" ? 60_000 : unit === "h" ? 3_600_000 : unit === "d" ? 86_400_000 : 7 * 86_400_000;
|
|
17
|
+
return n * factor;
|
|
18
|
+
}
|
|
19
|
+
/** Offset (ms) of a timezone at a given instant: (wall-clock read as UTC) − actual epoch. */
|
|
20
|
+
function tzOffsetMs(epochMs, tz) {
|
|
21
|
+
const dtf = new Intl.DateTimeFormat("en-US", {
|
|
22
|
+
timeZone: tz,
|
|
23
|
+
year: "numeric",
|
|
24
|
+
month: "2-digit",
|
|
25
|
+
day: "2-digit",
|
|
26
|
+
hour: "2-digit",
|
|
27
|
+
minute: "2-digit",
|
|
28
|
+
second: "2-digit",
|
|
29
|
+
hour12: false,
|
|
30
|
+
});
|
|
31
|
+
const parts = Object.fromEntries(dtf.formatToParts(new Date(epochMs)).map((p) => [p.type, p.value]));
|
|
32
|
+
const asUTC = Date.UTC(Number(parts.year), Number(parts.month) - 1, Number(parts.day), parts.hour === "24" ? 0 : Number(parts.hour), Number(parts.minute), Number(parts.second));
|
|
33
|
+
return asUTC - epochMs;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Convert a wall-clock time in `tz` to epoch ms (DST-correct via a two-pass offset). Offset math runs
|
|
37
|
+
* on a millisecond-free instant (Intl parts have no ms, and real offsets are whole-minute); `ms` is
|
|
38
|
+
* added back at the end.
|
|
39
|
+
*/
|
|
40
|
+
function zonedToEpochMs(y, mo, d, h, mi, s, ms, tz) {
|
|
41
|
+
const guess = Date.UTC(y, mo - 1, d, h, mi, s, 0);
|
|
42
|
+
let epoch = guess - tzOffsetMs(guess, tz);
|
|
43
|
+
const second = guess - tzOffsetMs(epoch, tz);
|
|
44
|
+
if (second !== epoch)
|
|
45
|
+
epoch = second;
|
|
46
|
+
return epoch + ms;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Resolve a `when` token (date `2026-04-23`, datetime `2026-04-23T14:00`, or relative span `7d`) to
|
|
50
|
+
* epoch ms in `tz`. A bare date binds to start or end of day per `boundary`.
|
|
51
|
+
*/
|
|
52
|
+
function parseWhen(when, tz, boundary, now) {
|
|
53
|
+
const span = parseSpanMs(when);
|
|
54
|
+
if (span !== undefined)
|
|
55
|
+
return now - span;
|
|
56
|
+
const dateMatch = /^(\d{4})-(\d{2})-(\d{2})$/.exec(when.trim());
|
|
57
|
+
if (dateMatch) {
|
|
58
|
+
const [, y, mo, d] = dateMatch.map(Number);
|
|
59
|
+
// start → that day's midnight (inclusive); end → the NEXT day's midnight (exclusive upper bound),
|
|
60
|
+
// so "--to 2026-06-07" covers all of June 7 and tiles exactly with a batch starting June 8.
|
|
61
|
+
return boundary === "start"
|
|
62
|
+
? zonedToEpochMs(y, mo, d, 0, 0, 0, 0, tz)
|
|
63
|
+
: zonedToEpochMs(y, mo, d + 1, 0, 0, 0, 0, tz);
|
|
64
|
+
}
|
|
65
|
+
const dtMatch = /^(\d{4})-(\d{2})-(\d{2})[T ](\d{2}):(\d{2})(?::(\d{2}))?$/.exec(when.trim());
|
|
66
|
+
if (dtMatch) {
|
|
67
|
+
const [, y, mo, d, h, mi, s] = dtMatch.map((v) => Number(v ?? 0));
|
|
68
|
+
// A datetime bound is an exact instant: inclusive as a start, exclusive as an end.
|
|
69
|
+
return zonedToEpochMs(y, mo, d, h, mi, Number.isFinite(s) ? s : 0, 0, tz);
|
|
70
|
+
}
|
|
71
|
+
throw new AxiError(`Could not parse time '${when}'`, "USAGE", [
|
|
72
|
+
"Use a date (2026-04-23), datetime (2026-04-23T14:00), or span (7d, 24h, 90m)",
|
|
73
|
+
]);
|
|
74
|
+
}
|
|
75
|
+
/** Resolve `--since` / `--from` / `--to` into an explicit window. Defaults to the last 7 days. */
|
|
76
|
+
export function resolveWindow(opts, now) {
|
|
77
|
+
const tz = opts.tz ?? DEFAULT_TZ;
|
|
78
|
+
// endMs is exclusive; `now + 1` ms keeps "now" itself inside the window.
|
|
79
|
+
if (opts.since !== undefined) {
|
|
80
|
+
const span = parseSpanMs(opts.since);
|
|
81
|
+
if (span === undefined) {
|
|
82
|
+
throw new AxiError(`Invalid --since '${opts.since}'`, "USAGE", ["Use a span like 7d, 24h, 90m, or 2w"]);
|
|
83
|
+
}
|
|
84
|
+
return { oldestMs: now - span, endMs: now + 1, tz };
|
|
85
|
+
}
|
|
86
|
+
const endMs = opts.to !== undefined ? parseWhen(opts.to, tz, "end", now) : now + 1;
|
|
87
|
+
const oldestMs = opts.from !== undefined ? parseWhen(opts.from, tz, "start", now) : now - DEFAULT_WINDOW_MS;
|
|
88
|
+
if (oldestMs >= endMs) {
|
|
89
|
+
throw new AxiError("Resolved window is empty (--from is at or after --to)", "USAGE", [
|
|
90
|
+
"Check the dates; --from must be earlier than --to",
|
|
91
|
+
]);
|
|
92
|
+
}
|
|
93
|
+
return { oldestMs, endMs, tz };
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Tile a window into half-open `[start, end)` batches of `everyMs`. Adjacent batches share a boundary
|
|
97
|
+
* instant (one batch's `endMs` == the next's `startMs`), so the set has no gap and no overlap; the
|
|
98
|
+
* final batch's `endMs` is exactly the window's end. See specs/commands/catchup.md.
|
|
99
|
+
*/
|
|
100
|
+
export function batchWindows(oldestMs, endMs, everyMs) {
|
|
101
|
+
const batches = [];
|
|
102
|
+
for (let start = oldestMs; start < endMs; start += everyMs) {
|
|
103
|
+
batches.push({ startMs: start, endMs: Math.min(start + everyMs, endMs) });
|
|
104
|
+
}
|
|
105
|
+
return batches;
|
|
106
|
+
}
|
|
107
|
+
function partsInTz(epochMs, tz) {
|
|
108
|
+
const dtf = new Intl.DateTimeFormat("en-US", {
|
|
109
|
+
timeZone: tz,
|
|
110
|
+
year: "numeric",
|
|
111
|
+
month: "2-digit",
|
|
112
|
+
day: "2-digit",
|
|
113
|
+
hour: "2-digit",
|
|
114
|
+
minute: "2-digit",
|
|
115
|
+
hour12: false,
|
|
116
|
+
});
|
|
117
|
+
return Object.fromEntries(dtf.formatToParts(new Date(epochMs)).map((p) => [p.type, p.value]));
|
|
118
|
+
}
|
|
119
|
+
/** `YYYY-MM-DD` in tz. */
|
|
120
|
+
export function formatDate(epochMs, tz) {
|
|
121
|
+
const p = partsInTz(epochMs, tz);
|
|
122
|
+
return `${p.year}-${p.month}-${p.day}`;
|
|
123
|
+
}
|
|
124
|
+
/** `HH:MM` in tz (24h). */
|
|
125
|
+
export function formatTime(epochMs, tz) {
|
|
126
|
+
const p = partsInTz(epochMs, tz);
|
|
127
|
+
const hour = p.hour === "24" ? "00" : p.hour;
|
|
128
|
+
return `${hour}:${p.minute}`;
|
|
129
|
+
}
|
|
130
|
+
/** `YYYY-MM-DD HH:MM` in tz — used in the resolved-range echo so the year is always explicit. */
|
|
131
|
+
export function formatDateTime(epochMs, tz) {
|
|
132
|
+
return `${formatDate(epochMs, tz)} ${formatTime(epochMs, tz)}`;
|
|
133
|
+
}
|
|
134
|
+
/** The resolved-range header value, e.g. `2026-05-30 09:14 → 2026-06-06 09:14 (America/New_York)`.
|
|
135
|
+
* endMs is exclusive, so the displayed upper bound is `endMs − 1` (the last instant actually covered). */
|
|
136
|
+
export function formatRange(w) {
|
|
137
|
+
return `${formatDateTime(w.oldestMs, w.tz)} → ${formatDateTime(w.endMs - 1, w.tz)} (${w.tz})`;
|
|
138
|
+
}
|
|
139
|
+
/** Slack ts (`1717589640.123456`) → epoch ms. */
|
|
140
|
+
export function tsToEpochMs(ts) {
|
|
141
|
+
return Math.round(Number.parseFloat(ts) * 1000);
|
|
142
|
+
}
|
|
143
|
+
function microsToTs(micros) {
|
|
144
|
+
const seconds = Math.floor(micros / 1_000_000);
|
|
145
|
+
const frac = micros - seconds * 1_000_000;
|
|
146
|
+
return `${seconds}.${String(frac).padStart(6, "0")}`;
|
|
147
|
+
}
|
|
148
|
+
/** epoch ms → Slack ts string (seconds.microseconds), exact integer math. */
|
|
149
|
+
export function epochMsToTs(epochMs) {
|
|
150
|
+
return microsToTs(epochMs * 1000);
|
|
151
|
+
}
|
|
152
|
+
/** Slack ts one microsecond *before* an instant — the inclusive `latest` for a half-open `[…, endMs)`. */
|
|
153
|
+
export function tsExclusiveBefore(endMs) {
|
|
154
|
+
return microsToTs(endMs * 1000 - 1);
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=time.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time.js","sourceRoot":"","sources":["../../../src/slack/time.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Message-ts handle helpers. The dotless form is the compact display/citation handle. */
|
|
2
|
+
/** Dotless ts for display, e.g. `1717589640.123456` → `1717589640123456`. */
|
|
3
|
+
export declare function handle(ts: string): string;
|
|
4
|
+
/** Accept a dotless or dotted ts; return the dotted form Slack APIs expect. */
|
|
5
|
+
export declare function dottedTs(ts: string): string;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Message-ts handle helpers. The dotless form is the compact display/citation handle. */
|
|
2
|
+
/** Dotless ts for display, e.g. `1717589640.123456` → `1717589640123456`. */
|
|
3
|
+
export function handle(ts) {
|
|
4
|
+
return ts.replace(".", "");
|
|
5
|
+
}
|
|
6
|
+
/** Accept a dotless or dotted ts; return the dotted form Slack APIs expect. */
|
|
7
|
+
export function dottedTs(ts) {
|
|
8
|
+
if (ts.includes("."))
|
|
9
|
+
return ts;
|
|
10
|
+
if (ts.length <= 6)
|
|
11
|
+
return ts;
|
|
12
|
+
return `${ts.slice(0, ts.length - 6)}.${ts.slice(ts.length - 6)}`;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=ts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ts.js","sourceRoot":"","sources":["../../../src/slack/ts.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAE1F,6EAA6E;AAC7E,MAAM,UAAU,MAAM,CAAC,EAAU;IAC/B,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,QAAQ,CAAC,EAAU;IACjC,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,IAAI,EAAE,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9B,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;AACpE,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "slack-axi",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "AXI-compliant Slack CLI — read, search, and draft Slack with token-efficient TOON output",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/JarvusInnovations/slack-axi.git"
|
|
9
|
+
},
|
|
10
|
+
"bin": {
|
|
11
|
+
"slack-axi": "./dist/bin/slack-axi.js"
|
|
12
|
+
},
|
|
13
|
+
"publishConfig": {
|
|
14
|
+
"access": "public"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"LICENSE",
|
|
19
|
+
"README.md"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc && chmod +x dist/bin/slack-axi.js",
|
|
23
|
+
"dev": "bun bin/slack-axi.ts",
|
|
24
|
+
"test": "vitest run --passWithNoTests",
|
|
25
|
+
"test:watch": "vitest"
|
|
26
|
+
},
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=20"
|
|
29
|
+
},
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@slack/web-api": "^7.16.0",
|
|
33
|
+
"@toon-format/toon": "^2.3.0",
|
|
34
|
+
"axi-sdk-js": "^0.1.7"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@types/node": "^22.0.0",
|
|
38
|
+
"typescript": "^5.7.0",
|
|
39
|
+
"vitest": "^4.1.8"
|
|
40
|
+
}
|
|
41
|
+
}
|