experimental-ash 0.11.0 → 0.12.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/CHANGELOG.md +178 -0
- package/dist/docs/public/channels/README.md +29 -14
- package/dist/docs/public/channels/slack.md +52 -28
- package/dist/docs/public/session-context.md +9 -6
- package/dist/docs/public/typescript-api.md +14 -5
- package/dist/src/chunks/{dev-authored-source-watcher-Dli96TWx.js → dev-authored-source-watcher-DA6pewzf.js} +1 -1
- package/dist/src/chunks/{host-Cp4XhAAX.js → host-D_hajFPO.js} +2 -2
- package/dist/src/chunks/paths-BYaK6-t0.js +88 -0
- package/dist/src/chunks/{prewarm-DIMA-oZ6.js → prewarm-QPhmJIsB.js} +1 -1
- package/dist/src/cli/commands/info.js +1 -1
- package/dist/src/cli/run.js +1 -1
- package/dist/src/compiler/manifest.d.ts +19 -0
- package/dist/src/compiler/manifest.js +14 -0
- package/dist/src/compiler/normalize-channel.js +8 -0
- package/dist/src/compiler/normalize-connection.js +31 -1
- package/dist/src/evals/cli/eval.js +1 -1
- package/dist/src/execution/sandbox/bindings/local.js +18 -7
- package/dist/src/execution/sandbox/bindings/vercel.js +16 -20
- package/dist/src/execution/sandbox/read-file-tool.js +1 -1
- package/dist/src/execution/sandbox/session.d.ts +6 -29
- package/dist/src/execution/sandbox/session.js +55 -15
- package/dist/src/execution/sandbox/stream-utils.d.ts +9 -0
- package/dist/src/execution/sandbox/stream-utils.js +22 -0
- package/dist/src/execution/sandbox/write-file-tool.js +3 -3
- package/dist/src/execution/workflow-steps.js +1 -1
- package/dist/src/harness/attachment-staging.js +2 -2
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/internal/nitro/host/build-application.js +11 -1
- package/dist/src/internal/nitro/host/build-vercel-agent-summary.d.ts +40 -0
- package/dist/src/internal/nitro/host/build-vercel-agent-summary.js +139 -0
- package/dist/src/protocol/vercel-agent-summary.d.ts +201 -0
- package/dist/src/protocol/vercel-agent-summary.js +72 -0
- package/dist/src/public/channels/slack/api.d.ts +309 -18
- package/dist/src/public/channels/slack/api.js +361 -26
- package/dist/src/public/channels/slack/attachments.d.ts +11 -10
- package/dist/src/public/channels/slack/attachments.js +42 -26
- package/dist/src/public/channels/slack/blocks.d.ts +45 -0
- package/dist/src/public/channels/slack/blocks.js +243 -0
- package/dist/src/public/channels/slack/defaults.d.ts +14 -7
- package/dist/src/public/channels/slack/defaults.js +41 -53
- package/dist/src/public/channels/slack/inbound.d.ts +127 -20
- package/dist/src/public/channels/slack/inbound.js +104 -30
- package/dist/src/public/channels/slack/index.d.ts +13 -3
- package/dist/src/public/channels/slack/index.js +9 -1
- package/dist/src/public/channels/slack/interactions.d.ts +2 -7
- package/dist/src/public/channels/slack/interactions.js +14 -19
- package/dist/src/public/channels/slack/slackChannel.d.ts +69 -55
- package/dist/src/public/channels/slack/slackChannel.js +162 -187
- package/dist/src/public/channels/slack/verify.d.ts +48 -0
- package/dist/src/public/channels/slack/verify.js +70 -0
- package/dist/src/public/definitions/defineChannel.d.ts +12 -0
- package/dist/src/public/definitions/defineChannel.js +2 -2
- package/dist/src/public/definitions/sandbox.d.ts +1 -1
- package/dist/src/public/sandbox/index.d.ts +1 -1
- package/dist/src/runtime/skills/sandbox-access.js +3 -3
- package/dist/src/shared/sandbox-session.d.ts +96 -26
- package/package.json +1 -1
- package/dist/src/chunks/paths-CWTvKBbf.js +0 -88
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,183 @@
|
|
|
1
1
|
# experimental-ash
|
|
2
2
|
|
|
3
|
+
## 0.12.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 1d2ee77: feat(ash): revise SandboxSession abstraction for more intuitive DX and reduced surface for sandbox implementers
|
|
8
|
+
- 251233f: feat(slack): add `onDirectMessage` hook for 1:1 direct messages
|
|
9
|
+
|
|
10
|
+
`slackChannel({ onDirectMessage })` is the DM analog of `onAppMention`. The framework parses Slack `message` events with `channel_type: "im"` into a `SlackMessage`, filters bot-authored messages (`bot_id` set, including the bot's own replies) and message subtypes (edits, deletes, joins), and dispatches surviving messages through the same auth-and-state pipeline as channel mentions. The default handler derives a workspace-scoped auth from the Slack actor and posts a `"Thinking…"` typing indicator.
|
|
11
|
+
|
|
12
|
+
```ts
|
|
13
|
+
slackChannel({
|
|
14
|
+
onDirectMessage(ctx, message) {
|
|
15
|
+
if (!message.author) return null;
|
|
16
|
+
return {
|
|
17
|
+
auth: {
|
|
18
|
+
principalId: message.author.userId,
|
|
19
|
+
principalType: "user",
|
|
20
|
+
authenticator: "slack",
|
|
21
|
+
attributes: { surface: "im" },
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Requires the bot's Slack app to subscribe to `message.im` with the `im:history` scope. Replies are threaded under the inbound user message, matching `onAppMention` behavior.
|
|
29
|
+
|
|
30
|
+
- ac0c73a: refactor(slack): drop chat-sdk runtime, split `ctx` into `ctx.thread` + `ctx.slack`
|
|
31
|
+
|
|
32
|
+
The slack channel no longer leans on the chat SDK runtime (`Chat`, `chat.onNewMention`, `chat.webhooks.slack`, `StateAdapter`, `createSlackAdapter`). Inbound is now native: HMAC verify (or caller-supplied `webhookVerifier`), JSON envelope parse, filter for `event.type === "app_mention"`, dispatch via `onAppMention(ctx, message)`. The `Card`/`Actions`/`Button`/... data factories are still re-exported from `experimental-ash/channels/slack` (they're pure functions with no runtime coupling).
|
|
33
|
+
|
|
34
|
+
The resulting `ctx` exposes two handles so call sites read naturally:
|
|
35
|
+
|
|
36
|
+
- `ctx.thread` (`SlackThread`) — `post`, `postEphemeral`, `startTyping`, `refresh`, `recentMessages`, `threadId`, `mentionUser`. Reads as "post a reply to this thread".
|
|
37
|
+
- `ctx.slack` (`SlackHandle`) — `channelId`, `threadTs`, `teamId`, `request(op, body)`, `uploadFiles(...)`. Reads as "raw Slack API, possibly not the bound thread".
|
|
38
|
+
|
|
39
|
+
`ctx.thread.post(...)` accepts ergonomic bare forms (`string` → `{ markdown }`, `CardElement` → `{ card }`) in addition to the explicit `SlackPostInput` variants:
|
|
40
|
+
|
|
41
|
+
```ts
|
|
42
|
+
ctx.thread.post(event.message); // string → markdown
|
|
43
|
+
ctx.thread.post(Card({ children: [...] })); // CardElement → card
|
|
44
|
+
ctx.thread.post({ markdown: event.message, files }); // wrapper form for files
|
|
45
|
+
ctx.thread.post({ blocks: [...], text: "fallback" }); // raw Block Kit
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Files upload uses Slack's modern external-upload flow (`files.getUploadURLExternal` → POST → `files.completeUploadExternal`). `ctx.thread.post({ markdown | text, files })` produces a single Slack message with files attached via `initial_comment`; `ctx.thread.post({ blocks | card, files })` posts the structured message first then uploads files as a follow-up in the same thread (Slack has no native way to embed arbitrary files inside a Block Kit message).
|
|
49
|
+
|
|
50
|
+
## Migration
|
|
51
|
+
|
|
52
|
+
```ts
|
|
53
|
+
// before — onMention + single ctx.slack handle
|
|
54
|
+
import { slackChannel } from "experimental-ash/channels/slack";
|
|
55
|
+
|
|
56
|
+
export default slackChannel({
|
|
57
|
+
onMention(ctx, message) {
|
|
58
|
+
if (!ALLOWED.has(ctx.slack.channelId)) return null;
|
|
59
|
+
ctx.thread.startTyping("Thinking…");
|
|
60
|
+
return {
|
|
61
|
+
auth: {
|
|
62
|
+
/* ... */
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
},
|
|
66
|
+
events: {
|
|
67
|
+
"message.completed"(event, ctx) {
|
|
68
|
+
if (event.message) ctx.thread.post(event.message);
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
// after — onAppMention + ctx.thread / ctx.slack split
|
|
74
|
+
import { slackChannel } from "experimental-ash/channels/slack";
|
|
75
|
+
|
|
76
|
+
export default slackChannel({
|
|
77
|
+
onAppMention(ctx, message) {
|
|
78
|
+
if (!ALLOWED.has(ctx.slack.channelId)) return null;
|
|
79
|
+
ctx.thread.startTyping("Thinking…");
|
|
80
|
+
return {
|
|
81
|
+
auth: {
|
|
82
|
+
/* ... */
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
},
|
|
86
|
+
events: {
|
|
87
|
+
"message.completed"(event, ctx) {
|
|
88
|
+
if (event.message) ctx.thread.post(event.message);
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Concretely:
|
|
95
|
+
|
|
96
|
+
- `onMention` → `onAppMention`. Signature unchanged.
|
|
97
|
+
- `ctx.slack.post(...)` / `startTyping(...)` / `refresh(...)` / `recentMessages` → `ctx.thread.*`. Identity reads (`channelId`, `threadTs`, `teamId`) and `request(op, body)` / `uploadFiles(...)` stay on `ctx.slack`.
|
|
98
|
+
- `ctx.thread` is no longer the chat-SDK `Thread`. `Thread`, `Message`, `Author`, `Attachment` are not re-exported anymore — use the channel-owned `SlackMessage` / `SlackAuthor` / `SlackAttachment` types.
|
|
99
|
+
- `StateAdapter` config option removed from `slackChannel(...)` — the channel no longer needs one.
|
|
100
|
+
- `slackChannel({ credentials: { signingSecret, webhookVerifier } })` semantics are unchanged. Signature verification is now an ash-owned `verify.ts` implementation that follows Slack's v0 protocol byte-for-byte (300-second skew, `timingSafeEqual` over `Buffer.from`).
|
|
101
|
+
|
|
102
|
+
In-tree consumers (`apps/support-agent`, `apps/weather-agent`, the `slack-custom-channel-portability` scenario) are migrated. Downstream agents (e.g. d0) will need the same rename pass.
|
|
103
|
+
|
|
104
|
+
### Patch Changes
|
|
105
|
+
|
|
106
|
+
- 7c416bb: feat(experimental-ash): emit Vercel agent summary at build time
|
|
107
|
+
|
|
108
|
+
`ash build` now writes a small, versioned `VercelAshAgentSummary` JSON
|
|
109
|
+
to `<appRoot>/.ash/agent-summary.json`. The Vercel dashboard reads it
|
|
110
|
+
back through a dedicated authenticated endpoint to render the project
|
|
111
|
+
overview card (tools, connections, channels, schedules, subagents, and
|
|
112
|
+
the resolved authored instructions) without making an HTTP roundtrip
|
|
113
|
+
into the deployed agent at request time.
|
|
114
|
+
|
|
115
|
+
Schema details:
|
|
116
|
+
|
|
117
|
+
- Stable kind: `"vercel-ash-agent-summary"`, `schemaVersion: 1`.
|
|
118
|
+
- Lives outside `.vercel/output/` so it is not part of the Build Output
|
|
119
|
+
API and is never served on the deployment URL.
|
|
120
|
+
- On Vercel, the build container uploads it as a top-level deployment
|
|
121
|
+
artifact (sibling to `deploy_metadata.json` and `turbo_summary.json`)
|
|
122
|
+
reachable only by authenticated team members. Self-hosted setups
|
|
123
|
+
pick it up from the same path on disk.
|
|
124
|
+
|
|
125
|
+
Public API additions:
|
|
126
|
+
|
|
127
|
+
- `VercelAshAgentSummary`, `VercelAshAgentEntry`, `VercelAshScheduleEntry`,
|
|
128
|
+
`VercelAshToolEntry`, `VercelAshSkillEntry`,
|
|
129
|
+
`VercelAshConnectionEntry` (with optional
|
|
130
|
+
`vercelConnect: { connector }` marker for Vercel Connect-backed
|
|
131
|
+
connections — absent for raw MCP / static-token / custom-callback
|
|
132
|
+
connections), `VercelAshChannelEntry` (with optional `adapterKind`),
|
|
133
|
+
`VercelAshSandboxEntry`, `VercelAshSubagentEntry`,
|
|
134
|
+
`VercelAshInstructionsEntry`, and `VercelAshDiagnosticsSummary`
|
|
135
|
+
exported from `experimental-ash/protocol/vercel-agent-summary`.
|
|
136
|
+
- Authored skills now surface in the summary as `skills[]` — name,
|
|
137
|
+
description, logical path, and `sourceKind` (`"markdown"`,
|
|
138
|
+
`"module"`, or `"skill-package"`) so the dashboard can tell flat
|
|
139
|
+
skills apart from packaged ones with sibling
|
|
140
|
+
`assets/references/scripts/` directories. Full markdown body is
|
|
141
|
+
intentionally omitted; overview shape only.
|
|
142
|
+
- `VERCEL_ASH_AGENT_SUMMARY_KIND`, `VERCEL_ASH_AGENT_SUMMARY_VERSION`,
|
|
143
|
+
and `VERCEL_ASH_AGENT_SUMMARY_OUTPUT_PATH` constants for consumers
|
|
144
|
+
that want to address the artifact by name.
|
|
145
|
+
- `normalizeChannelKindForDisplay()` helper for collapsing raw adapter
|
|
146
|
+
kinds to the closed display set.
|
|
147
|
+
- Optional `kindHint` on `ChannelConfig` so wrappers built on top of
|
|
148
|
+
`defineChannel` can declare which adapter family their channel
|
|
149
|
+
belongs to. `slackChannel()` now sets `kindHint: "slack"` so the
|
|
150
|
+
Vercel dashboard renders Slack-backed channels with a "slack" chip
|
|
151
|
+
instead of falling back to "unknown".
|
|
152
|
+
|
|
153
|
+
Compiler change:
|
|
154
|
+
|
|
155
|
+
- Bumps `COMPILED_AGENT_MANIFEST_VERSION` 21 → 22 to add optional
|
|
156
|
+
`adapterKind` on `CompiledChannelDefinition` (sourced from
|
|
157
|
+
`route.adapter.kind`). Required so the summary can render typed
|
|
158
|
+
channel chips.
|
|
159
|
+
|
|
160
|
+
Platform support shipped in vercel/api#72358 (build container
|
|
161
|
+
upload helper + `/v6/deployments/:id/files/ash-agent-summary` read
|
|
162
|
+
endpoint).
|
|
163
|
+
|
|
164
|
+
## 0.11.1
|
|
165
|
+
|
|
166
|
+
### Patch Changes
|
|
167
|
+
|
|
168
|
+
- 6bc3fe0: fix(slack): allow `slackChannel` to handle whichever twin event arrives first
|
|
169
|
+
|
|
170
|
+
Slack delivers two webhook events for every `@bot` channel mention — one
|
|
171
|
+
`event.type: "message"` and one `event.type: "app_mention"`, both carrying
|
|
172
|
+
the same `event.ts`. The chat SDK dedupes incoming events on `message.id`
|
|
173
|
+
(= Slack `event.ts`), so only the first of the twin events reaches the
|
|
174
|
+
mention listener. The userland filter `if (raw?.type !== "app_mention")
|
|
175
|
+
return;` would then drop that surviving event whenever the `message`
|
|
176
|
+
twin arrived first, silently swallowing the mention. Removing the filter
|
|
177
|
+
lets the listener handle whichever twin arrives; both carry identical
|
|
178
|
+
text/channel/team. This also unblocks DMs, which only deliver `message`
|
|
179
|
+
events (no `app_mention` twin).
|
|
180
|
+
|
|
3
181
|
## 0.11.0
|
|
4
182
|
|
|
5
183
|
### Minor Changes
|
|
@@ -121,21 +121,23 @@ import { slackChannel } from "experimental-ash/channels/slack";
|
|
|
121
121
|
export default slackChannel();
|
|
122
122
|
```
|
|
123
123
|
|
|
124
|
-
Handles mentions, typing indicators, message delivery, and HITL interactions
|
|
125
|
-
default `
|
|
126
|
-
indicator before the workflow runtime starts.
|
|
124
|
+
Handles app mentions, direct messages, typing indicators, message delivery, and HITL interactions
|
|
125
|
+
out of the box. The default `onAppMention` and `onDirectMessage` derive auth from the inbound Slack
|
|
126
|
+
actor and post a `"Thinking…"` typing indicator before the workflow runtime starts.
|
|
127
127
|
|
|
128
128
|
### Custom config
|
|
129
129
|
|
|
130
|
-
When you need custom rendering or event handling, pass a config object. `
|
|
131
|
-
to dispatch
|
|
132
|
-
|
|
130
|
+
When you need custom rendering or event handling, pass a config object. `onAppMention` decides
|
|
131
|
+
whether to dispatch a channel mention; `onDirectMessage` does the same for 1:1 DMs (`message`
|
|
132
|
+
events with `channel_type: "im"`); `events` lets you replace individual event handlers;
|
|
133
|
+
`onInteraction` handles non-HITL button clicks.
|
|
133
134
|
|
|
134
135
|
```ts
|
|
135
136
|
import { slackChannel } from "experimental-ash/channels/slack";
|
|
136
137
|
|
|
137
138
|
export default slackChannel({
|
|
138
|
-
|
|
139
|
+
onAppMention(ctx, message) {
|
|
140
|
+
if (!message.author) return null;
|
|
139
141
|
return {
|
|
140
142
|
auth: {
|
|
141
143
|
principalId: message.author.userId,
|
|
@@ -145,6 +147,17 @@ export default slackChannel({
|
|
|
145
147
|
},
|
|
146
148
|
};
|
|
147
149
|
},
|
|
150
|
+
onDirectMessage(ctx, message) {
|
|
151
|
+
if (!message.author) return null;
|
|
152
|
+
return {
|
|
153
|
+
auth: {
|
|
154
|
+
principalId: message.author.userId,
|
|
155
|
+
principalType: "user",
|
|
156
|
+
authenticator: "slack",
|
|
157
|
+
attributes: { surface: "im" },
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
},
|
|
148
161
|
events: {
|
|
149
162
|
"actions.requested"(event, ctx) {
|
|
150
163
|
const labels = event.actions.map((a) => (a.kind === "tool-call" ? a.toolName : a.kind));
|
|
@@ -163,7 +176,8 @@ export default slackChannel({
|
|
|
163
176
|
|
|
164
177
|
Fields you supply fully replace the corresponding default -- if you pass your own
|
|
165
178
|
`"message.completed"` handler, the default's behavior for that event is gone. Other defaults stay
|
|
166
|
-
in place.
|
|
179
|
+
in place. Direct messages require the Slack app to subscribe to `message.im` with the `im:history`
|
|
180
|
+
scope.
|
|
167
181
|
|
|
168
182
|
### Interactions
|
|
169
183
|
|
|
@@ -180,7 +194,8 @@ event handlers.
|
|
|
180
194
|
import { slackChannel } from "experimental-ash/channels/slack";
|
|
181
195
|
|
|
182
196
|
export default slackChannel({
|
|
183
|
-
|
|
197
|
+
onAppMention(ctx, message) {
|
|
198
|
+
if (!message.author) return null;
|
|
184
199
|
return {
|
|
185
200
|
auth: {
|
|
186
201
|
principalId: message.author.userId,
|
|
@@ -204,13 +219,13 @@ export default slackChannel({
|
|
|
204
219
|
|
|
205
220
|
### The two shapes
|
|
206
221
|
|
|
207
|
-
```
|
|
208
|
-
defineChannel({ routes: [...], events: {...} })
|
|
209
|
-
slackChannel({
|
|
222
|
+
```text
|
|
223
|
+
defineChannel({ routes: [...], events: {...} }) -- raw: you handle HTTP
|
|
224
|
+
slackChannel({ onAppMention?, onDirectMessage?, events?, onInteraction? }) -- slack: everything wired, override as needed
|
|
210
225
|
```
|
|
211
226
|
|
|
212
|
-
`slackChannel(config)` compiles down to `defineChannel` plus
|
|
213
|
-
dispatch.
|
|
227
|
+
`slackChannel(config)` compiles down to `defineChannel` plus typed inbound parsing and event
|
|
228
|
+
dispatch for app mentions, direct messages, and interactions.
|
|
214
229
|
|
|
215
230
|
For a Slack app backed by Vercel Connect, see [Slack channel setup](./slack.md) to create the Connect client
|
|
216
231
|
and channel file.
|
|
@@ -129,7 +129,8 @@ import { slackChannel } from "experimental-ash/channels/slack";
|
|
|
129
129
|
|
|
130
130
|
export default slackChannel({
|
|
131
131
|
credentials: connectSlackCredentials("slack/my-agent"),
|
|
132
|
-
|
|
132
|
+
onAppMention(ctx, message) {
|
|
133
|
+
if (!message.author) return null;
|
|
133
134
|
return {
|
|
134
135
|
auth: {
|
|
135
136
|
principalId: message.author.userId,
|
|
@@ -153,15 +154,21 @@ export default slackChannel({
|
|
|
153
154
|
|
|
154
155
|
## Hooks
|
|
155
156
|
|
|
156
|
-
`slackChannel()` exposes
|
|
157
|
-
|
|
158
|
-
- **`
|
|
159
|
-
with what `auth` context, and runs any pre-dispatch side effects (typing
|
|
160
|
-
feature-flag lookups). Return `{ auth }` to dispatch or `null` to silently
|
|
161
|
-
be sync or async; the framework awaits the result before dispatching.
|
|
162
|
-
logged, and drop the mention -- wrap best-effort side effects in
|
|
163
|
-
be non-fatal. The default `
|
|
164
|
-
posts a `"Thinking…"` typing indicator.
|
|
157
|
+
`slackChannel()` exposes three places to plug in custom behavior on the inbound webhook side:
|
|
158
|
+
|
|
159
|
+
- **`onAppMention(ctx, message)`** -- decides whether to dispatch a turn for an inbound
|
|
160
|
+
`app_mention`, with what `auth` context, and runs any pre-dispatch side effects (typing
|
|
161
|
+
indicators, logging, feature-flag lookups). Return `{ auth }` to dispatch or `null` to silently
|
|
162
|
+
drop the mention. May be sync or async; the framework awaits the result before dispatching.
|
|
163
|
+
Thrown errors are caught, logged, and drop the mention -- wrap best-effort side effects in
|
|
164
|
+
`try/catch` if you want them to be non-fatal. The default `onAppMention` derives a
|
|
165
|
+
workspace-scoped auth from the Slack actor and posts a `"Thinking…"` typing indicator.
|
|
166
|
+
- **`onDirectMessage(ctx, message)`** -- same contract as `onAppMention`, but for direct messages
|
|
167
|
+
(Slack `message` events with `channel_type: "im"`). The framework filters bot-authored messages
|
|
168
|
+
(`bot_id` set, including the bot's own replies) and message subtypes (edits, deletes, joins)
|
|
169
|
+
before this handler runs, so authors only see plain user-authored DMs. Requires the bot's Slack
|
|
170
|
+
app to subscribe to the `message.im` event with the `im:history` scope. The default
|
|
171
|
+
`onDirectMessage` matches the mention default.
|
|
165
172
|
- **`onInteraction(action, ctx)`** -- handler for Slack `block_actions` callbacks (button clicks,
|
|
166
173
|
selects, etc.) that are not consumed by the framework's HITL pipeline. Runs on the inbound
|
|
167
174
|
webhook side via `waitUntil`, so the channel returns `200 OK` to Slack immediately.
|
|
@@ -170,49 +177,66 @@ export default slackChannel({
|
|
|
170
177
|
(`turn.started`, `message.completed`, `session.failed`, etc.). They run inside the workflow context,
|
|
171
178
|
not on the inbound webhook side.
|
|
172
179
|
|
|
173
|
-
|
|
180
|
+
### Direct Messages
|
|
174
181
|
|
|
175
|
-
|
|
176
|
-
`thread.setState`, `thread.subscribe`, message queues, and locks. By default this is an in-memory
|
|
177
|
-
adapter scoped to the current process, which loses state on restart and is not coherent across
|
|
178
|
-
processes. For deployed agents, pass a production adapter (Redis, Postgres, etc.) implementing the
|
|
179
|
-
chat SDK `StateAdapter` contract. Construct it once at module top-level so all requests share one
|
|
180
|
-
connection pool:
|
|
182
|
+
Add `onDirectMessage` alongside `onAppMention` to handle 1:1 DMs:
|
|
181
183
|
|
|
182
184
|
```ts
|
|
183
|
-
import { createRedisState } from "@chat-adapter/state-redis";
|
|
184
185
|
import { slackChannel } from "experimental-ash/channels/slack";
|
|
185
186
|
|
|
186
|
-
const stateAdapter = createRedisState({ url: process.env.REDIS_URL! });
|
|
187
|
-
|
|
188
187
|
export default slackChannel({
|
|
189
|
-
|
|
188
|
+
onAppMention(ctx, message) {
|
|
189
|
+
if (!message.author) return null;
|
|
190
|
+
return {
|
|
191
|
+
auth: {
|
|
192
|
+
/* ... */
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
},
|
|
196
|
+
|
|
197
|
+
onDirectMessage(ctx, message) {
|
|
198
|
+
if (!message.author) return null;
|
|
199
|
+
return {
|
|
200
|
+
auth: {
|
|
201
|
+
principalId: message.author.userId,
|
|
202
|
+
principalType: "user",
|
|
203
|
+
authenticator: "slack",
|
|
204
|
+
attributes: { surface: "im" },
|
|
205
|
+
},
|
|
206
|
+
};
|
|
207
|
+
},
|
|
190
208
|
});
|
|
191
209
|
```
|
|
192
210
|
|
|
193
|
-
|
|
194
|
-
so
|
|
211
|
+
Slack threading semantics carry over: the bot's reply is posted as a threaded reply rooted at the
|
|
212
|
+
inbound user message, so each top-level DM scopes its own session. When the user replies inside an
|
|
213
|
+
existing thread (`thread_ts` is set on the inbound event), the bot continues that thread.
|
|
214
|
+
|
|
215
|
+
In Slack, install the app with the `im:history` and `chat:write` scopes and subscribe to
|
|
216
|
+
`message.im` under the bot's event subscriptions. Without those, Slack will not deliver DM events
|
|
217
|
+
to the webhook.
|
|
195
218
|
|
|
196
219
|
## Typing Indicators
|
|
197
220
|
|
|
198
221
|
Out of the box, `slackChannel()` posts typing statuses so the user sees feedback before the agent
|
|
199
222
|
starts thinking:
|
|
200
223
|
|
|
201
|
-
- **`Thinking...`** -- posted by the default `
|
|
202
|
-
inbound webhook side, before the workflow runtime starts.
|
|
224
|
+
- **`Thinking...`** -- posted by the default `onAppMention` and `onDirectMessage` hooks the moment
|
|
225
|
+
the inbound event arrives, on the webhook side, before the workflow runtime starts.
|
|
203
226
|
- **`Working...`** -- posted by the default `turn.started` event handler at the start of each turn
|
|
204
227
|
within the session, refreshing the typing indicator after the workflow runtime materializes.
|
|
205
228
|
- **Tool status** -- when an `actions.requested` event fires, the default handler updates the typing
|
|
206
229
|
indicator to show which tools are running.
|
|
207
230
|
|
|
208
|
-
To customize typing indicators, override `
|
|
209
|
-
handler does not affect the others -- the rest keep their defaults.
|
|
231
|
+
To customize typing indicators, override `onAppMention` / `onDirectMessage` and/or specific event
|
|
232
|
+
handlers. Replacing one handler does not affect the others -- the rest keep their defaults.
|
|
210
233
|
|
|
211
234
|
```ts
|
|
212
235
|
import { slackChannel } from "experimental-ash/channels/slack";
|
|
213
236
|
|
|
214
237
|
export default slackChannel({
|
|
215
|
-
async
|
|
238
|
+
async onAppMention(ctx, message) {
|
|
239
|
+
if (!message.author) return null;
|
|
216
240
|
await ctx.thread.startTyping(
|
|
217
241
|
message.text.includes("weather") ? "Checking the weather..." : "Thinking...",
|
|
218
242
|
);
|
|
@@ -110,9 +110,10 @@ See [Skills](./skills.md) for the full authoring model.
|
|
|
110
110
|
## Passing Custom Context From a Channel
|
|
111
111
|
|
|
112
112
|
Channels can inject custom typed durable context into the agent via the channel's `state` and
|
|
113
|
-
`context()` properties on `defineChannel`, or via the auth attributes returned from `
|
|
114
|
-
`slackChannel()`. This is useful when a channel needs to pass
|
|
115
|
-
ID, feature flags, etc.) that authored tools can read on the
|
|
113
|
+
`context()` properties on `defineChannel`, or via the auth attributes returned from `onAppMention`
|
|
114
|
+
or `onDirectMessage` on `slackChannel()`. This is useful when a channel needs to pass
|
|
115
|
+
platform-specific metadata (tenant ID, feature flags, etc.) that authored tools can read on the
|
|
116
|
+
same turn and on later turns.
|
|
116
117
|
|
|
117
118
|
### Defining a key
|
|
118
119
|
|
|
@@ -129,7 +130,7 @@ export const TenantKey = new ContextKey<string>("myapp.tenant");
|
|
|
129
130
|
|
|
130
131
|
### Setting context from a channel
|
|
131
132
|
|
|
132
|
-
Use `slackChannel()` and seed context via the `
|
|
133
|
+
Use `slackChannel()` and seed context via the `onAppMention` return value's auth attributes:
|
|
133
134
|
|
|
134
135
|
`agent/channels/slack.ts`
|
|
135
136
|
|
|
@@ -138,7 +139,8 @@ import { slackChannel } from "experimental-ash/channels/slack";
|
|
|
138
139
|
import { TenantKey } from "./keys.js";
|
|
139
140
|
|
|
140
141
|
export default slackChannel({
|
|
141
|
-
|
|
142
|
+
onAppMention(ctx, message) {
|
|
143
|
+
if (!message.author) return null;
|
|
142
144
|
const tenantId = lookupTenant(message);
|
|
143
145
|
return {
|
|
144
146
|
auth: {
|
|
@@ -161,7 +163,8 @@ export default slackChannel({
|
|
|
161
163
|
});
|
|
162
164
|
```
|
|
163
165
|
|
|
164
|
-
Auth lives on the return value of `
|
|
166
|
+
Auth lives on the return value of `onAppMention` (or `onDirectMessage` for 1:1 DMs), not on a
|
|
167
|
+
separate channel object.
|
|
165
168
|
|
|
166
169
|
### Reading context from a tool
|
|
167
170
|
|
|
@@ -67,13 +67,22 @@ Ash also exports lower-level runtime primitives such as `createToolLoopHarness(.
|
|
|
67
67
|
Channel and Slack types exported from `experimental-ash/channels/slack`:
|
|
68
68
|
|
|
69
69
|
- `slackChannel` - Slack channel factory; zero-config by default, accepts a `SlackChannelConfig`
|
|
70
|
-
to override `
|
|
70
|
+
to override `onAppMention`, `onDirectMessage`, individual event handlers, `onInteraction`, etc.
|
|
71
71
|
- `SlackChannelConfig` - config type for `slackChannel(...)`
|
|
72
|
-
- `SlackContext` - context
|
|
73
|
-
|
|
72
|
+
- `SlackContext` - pre-dispatch context for `onAppMention`, `onDirectMessage`, and `onInteraction`
|
|
73
|
+
(`thread`, `slack`)
|
|
74
|
+
- `SlackEventContext` - event-handler context (`thread`, `slack`, plus mutable `state`)
|
|
75
|
+
- `SlackHandle` - Slack identity handle with `channelId`, `threadTs`, `teamId`, `request()`,
|
|
76
|
+
`uploadFiles()`
|
|
77
|
+
- `SlackThread` - thread-scoped operations: `post`, `postEphemeral`, `startTyping`, `refresh`,
|
|
78
|
+
`recentMessages`, `mentionUser`, `threadId`
|
|
79
|
+
- `SlackMessage` - parsed inbound mention or DM payload (`text`, `markdown`, `author`,
|
|
80
|
+
`attachments`, `threadTs`, `channelId`, ...)
|
|
74
81
|
- `SlackInteractionAction` - action type for `onInteraction`
|
|
75
|
-
- `SlackMentionResult` - return type of `
|
|
76
|
-
|
|
82
|
+
- `SlackMentionResult` / `SlackInboundResult` - return type of `onAppMention` / `onDirectMessage`
|
|
83
|
+
(`{ auth } | null`)
|
|
84
|
+
- `Card`, `Button`, `Actions`, `Section`, `Modal`, `Table`, etc. - card builders re-exported for
|
|
85
|
+
rendering Slack messages
|
|
77
86
|
|
|
78
87
|
Channel types exported from `experimental-ash/channels`:
|
|
79
88
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{o as e}from"./paths-CWTvKBbf.js";import{t}from"./errors-DsO9xmQL.js";import{i as n}from"./package-DmsQgn4v.js";import{a as r,c as i,i as a,n as o,s,t as c}from"./prewarm-DIMA-oZ6.js";import{createRequire as l}from"node:module";import*as u from"node:path";import{dirname as d,isAbsolute as f,join as p,relative as m,resolve as h,sep as g}from"node:path";import{lstat as _,open as v,readFile as y,readdir as b,realpath as x,stat as S}from"node:fs/promises";import{existsSync as C,stat as w,unwatchFile as T,watch as E,watchFile as D}from"node:fs";import{EventEmitter as O}from"node:events";import{Readable as k}from"node:stream";import{type as ee}from"node:os";const A={FILE_TYPE:`files`,DIR_TYPE:`directories`,FILE_DIR_TYPE:`files_directories`,EVERYTHING_TYPE:`all`},j={root:`.`,fileFilter:e=>!0,directoryFilter:e=>!0,type:A.FILE_TYPE,lstat:!1,depth:2147483648,alwaysStat:!1,highWaterMark:4096};Object.freeze(j);const te=`READDIRP_RECURSIVE_ERROR`,ne=new Set([`ENOENT`,`EPERM`,`EACCES`,`ELOOP`,te]),re=[A.DIR_TYPE,A.EVERYTHING_TYPE,A.FILE_DIR_TYPE,A.FILE_TYPE],ie=new Set([A.DIR_TYPE,A.EVERYTHING_TYPE,A.FILE_DIR_TYPE]),ae=new Set([A.EVERYTHING_TYPE,A.FILE_DIR_TYPE,A.FILE_TYPE]),oe=e=>ne.has(e.code),se=process.platform===`win32`,M=e=>!0,N=e=>{if(e===void 0)return M;if(typeof e==`function`)return e;if(typeof e==`string`){let t=e.trim();return e=>e.basename===t}if(Array.isArray(e)){let t=e.map(e=>e.trim());return e=>t.some(t=>e.basename===t)}return M};var ce=class extends k{parents;reading;parent;_stat;_maxDepth;_wantsDir;_wantsFile;_wantsEverything;_root;_isDirent;_statsProp;_rdOptions;_fileFilter;_directoryFilter;constructor(e={}){super({objectMode:!0,autoDestroy:!0,highWaterMark:e.highWaterMark});let t={...j,...e},{root:n,type:r}=t;this._fileFilter=N(t.fileFilter),this._directoryFilter=N(t.directoryFilter);let i=t.lstat?_:S;se?this._stat=e=>i(e,{bigint:!0}):this._stat=i,this._maxDepth=t.depth!=null&&Number.isSafeInteger(t.depth)?t.depth:j.depth,this._wantsDir=r?ie.has(r):!1,this._wantsFile=r?ae.has(r):!1,this._wantsEverything=r===A.EVERYTHING_TYPE,this._root=h(n),this._isDirent=!t.alwaysStat,this._statsProp=this._isDirent?`dirent`:`stats`,this._rdOptions={encoding:`utf8`,withFileTypes:this._isDirent},this.parents=[this._exploreDir(n,1)],this.reading=!1,this.parent=void 0}async _read(e){if(!this.reading){this.reading=!0;try{for(;!this.destroyed&&e>0;){let t=this.parent,n=t&&t.files;if(n&&n.length>0){let{path:r,depth:i}=t,a=n.splice(0,e).map(e=>this._formatEntry(e,r)),o=await Promise.all(a);for(let t of o){if(!t)continue;if(this.destroyed)return;let n=await this._getEntryType(t);n===`directory`&&this._directoryFilter(t)?(i<=this._maxDepth&&this.parents.push(this._exploreDir(t.fullPath,i+1)),this._wantsDir&&(this.push(t),e--)):(n===`file`||this._includeAsFile(t))&&this._fileFilter(t)&&this._wantsFile&&(this.push(t),e--)}}else{let e=this.parents.pop();if(!e){this.push(null);break}if(this.parent=await e,this.destroyed)return}}}catch(e){this.destroy(e)}finally{this.reading=!1}}}async _exploreDir(e,t){let n;try{n=await b(e,this._rdOptions)}catch(e){this._onError(e)}return{files:n,depth:t,path:e}}async _formatEntry(e,t){let n,r=this._isDirent?e.name:e;try{let i=h(p(t,r));n={path:m(this._root,i),fullPath:i,basename:r},n[this._statsProp]=this._isDirent?e:await this._stat(i)}catch(e){this._onError(e);return}return n}_onError(e){oe(e)&&!this.destroyed?this.emit(`warn`,e):this.destroy(e)}async _getEntryType(e){if(!e&&this._statsProp in e)return``;let t=e[this._statsProp];if(t.isFile())return`file`;if(t.isDirectory())return`directory`;if(t&&t.isSymbolicLink()){let t=e.fullPath;try{let e=await x(t),n=await _(e);if(n.isFile())return`file`;if(n.isDirectory()){let n=e.length;if(t.startsWith(e)&&t.substr(n,1)===g){let n=Error(`Circular symlink detected: "${t}" points to "${e}"`);return n.code=te,this._onError(n)}return`directory`}}catch(e){return this._onError(e),``}}}_includeAsFile(e){let t=e&&e[this._statsProp];return t&&this._wantsEverything&&!t.isDirectory()}};function le(e,t={}){let n=t.entryType||t.type;if(n===`both`&&(n=A.FILE_DIR_TYPE),n&&(t.type=n),!e)throw Error(`readdirp: root argument is required. Usage: readdirp(root, options)`);if(typeof e!=`string`)throw TypeError(`readdirp: root argument must be a string. Usage: readdirp(root, options)`);if(n&&!re.includes(n))throw Error(`readdirp: Invalid type passed. Use one of ${re.join(`, `)}`);return t.root=e,new ce(t)}const P=()=>{},F=process.platform,I=F===`win32`,ue=F===`darwin`,de=F===`linux`,fe=F===`freebsd`,pe=ee()===`OS400`,L={ALL:`all`,READY:`ready`,ADD:`add`,CHANGE:`change`,ADD_DIR:`addDir`,UNLINK:`unlink`,UNLINK_DIR:`unlinkDir`,RAW:`raw`,ERROR:`error`},R=L,me={lstat:_,stat:S},z=`listeners`,B=`errHandlers`,V=`rawEmitters`,he=[z,B,V],ge=new Set(`3dm.3ds.3g2.3gp.7z.a.aac.adp.afdesign.afphoto.afpub.ai.aif.aiff.alz.ape.apk.appimage.ar.arj.asf.au.avi.bak.baml.bh.bin.bk.bmp.btif.bz2.bzip2.cab.caf.cgm.class.cmx.cpio.cr2.cur.dat.dcm.deb.dex.djvu.dll.dmg.dng.doc.docm.docx.dot.dotm.dra.DS_Store.dsk.dts.dtshd.dvb.dwg.dxf.ecelp4800.ecelp7470.ecelp9600.egg.eol.eot.epub.exe.f4v.fbs.fh.fla.flac.flatpak.fli.flv.fpx.fst.fvt.g3.gh.gif.graffle.gz.gzip.h261.h263.h264.icns.ico.ief.img.ipa.iso.jar.jpeg.jpg.jpgv.jpm.jxr.key.ktx.lha.lib.lvp.lz.lzh.lzma.lzo.m3u.m4a.m4v.mar.mdi.mht.mid.midi.mj2.mka.mkv.mmr.mng.mobi.mov.movie.mp3.mp4.mp4a.mpeg.mpg.mpga.mxu.nef.npx.numbers.nupkg.o.odp.ods.odt.oga.ogg.ogv.otf.ott.pages.pbm.pcx.pdb.pdf.pea.pgm.pic.png.pnm.pot.potm.potx.ppa.ppam.ppm.pps.ppsm.ppsx.ppt.pptm.pptx.psd.pya.pyc.pyo.pyv.qt.rar.ras.raw.resources.rgb.rip.rlc.rmf.rmvb.rpm.rtf.rz.s3m.s7z.scpt.sgi.shar.snap.sil.sketch.slk.smv.snk.so.stl.suo.sub.swf.tar.tbz.tbz2.tga.tgz.thmx.tif.tiff.tlz.ttc.ttf.txz.udf.uvh.uvi.uvm.uvp.uvs.uvu.viv.vob.war.wav.wax.wbmp.wdp.weba.webm.webp.whl.wim.wm.wma.wmv.wmx.woff.woff2.wrm.wvx.xbm.xif.xla.xlam.xls.xlsb.xlsm.xlsx.xlt.xltm.xltx.xm.xmind.xpi.xpm.xwd.xz.z.zip.zipx`.split(`.`)),_e=e=>ge.has(u.extname(e).slice(1).toLowerCase()),H=(e,t)=>{e instanceof Set?e.forEach(t):t(e)},U=(e,t,n)=>{let r=e[t];r instanceof Set||(e[t]=r=new Set([r])),r.add(n)},ve=e=>t=>{let n=e[t];n instanceof Set?n.clear():delete e[t]},W=(e,t,n)=>{let r=e[t];r instanceof Set?r.delete(n):r===n&&delete e[t]},ye=e=>e instanceof Set?e.size===0:!e,G=new Map;function be(e,t,n,r,i){let a=(t,r)=>{n(e),i(t,r,{watchedPath:e}),r&&e!==r&&K(u.resolve(e,r),z,u.join(e,r))};try{return E(e,{persistent:t.persistent},a)}catch(e){r(e);return}}const K=(e,t,n,r,i)=>{let a=G.get(e);a&&H(a[t],e=>{e(n,r,i)})},xe=(e,t,n,r)=>{let{listener:i,errHandler:a,rawEmitter:o}=r,s=G.get(t),c;if(!n.persistent)return c=be(e,n,i,a,o),c?c.close.bind(c):void 0;if(s)U(s,z,i),U(s,B,a),U(s,V,o);else{if(c=be(e,n,K.bind(null,t,z),a,K.bind(null,t,V)),!c)return;c.on(R.ERROR,async n=>{let r=K.bind(null,t,B);if(s&&(s.watcherUnusable=!0),I&&n.code===`EPERM`)try{await(await v(e,`r`)).close(),r(n)}catch{}else r(n)}),s={listeners:i,errHandlers:a,rawEmitters:o,watcher:c},G.set(t,s)}return()=>{W(s,z,i),W(s,B,a),W(s,V,o),ye(s.listeners)&&(s.watcher.close(),G.delete(t),he.forEach(ve(s)),s.watcher=void 0,Object.freeze(s))}},q=new Map,Se=(e,t,n,r)=>{let{listener:i,rawEmitter:a}=r,o=q.get(t),s=o&&o.options;return s&&(s.persistent<n.persistent||s.interval>n.interval)&&(T(t),o=void 0),o?(U(o,z,i),U(o,V,a)):(o={listeners:i,rawEmitters:a,options:n,watcher:D(t,n,(n,r)=>{H(o.rawEmitters,e=>{e(R.CHANGE,t,{curr:n,prev:r})});let i=n.mtimeMs;(n.size!==r.size||i>r.mtimeMs||i===0)&&H(o.listeners,t=>t(e,n))})},q.set(t,o)),()=>{W(o,z,i),W(o,V,a),ye(o.listeners)&&(q.delete(t),T(t),o.options=o.watcher=void 0,Object.freeze(o))}};var Ce=class{fsw;_boundHandleError;constructor(e){this.fsw=e,this._boundHandleError=t=>e._handleError(t)}_watchWithNodeFs(e,t){let n=this.fsw.options,r=u.dirname(e),i=u.basename(e);this.fsw._getWatchedDir(r).add(i);let a=u.resolve(e),o={persistent:n.persistent};t||=P;let s;return n.usePolling?(o.interval=n.interval!==n.binaryInterval&&_e(i)?n.binaryInterval:n.interval,s=Se(e,a,o,{listener:t,rawEmitter:this.fsw._emitRaw})):s=xe(e,a,o,{listener:t,errHandler:this._boundHandleError,rawEmitter:this.fsw._emitRaw}),s}_handleFile(e,t,n){if(this.fsw.closed)return;let r=u.dirname(e),i=u.basename(e),a=this.fsw._getWatchedDir(r),o=t;if(a.has(i))return;let s=async(t,n)=>{if(this.fsw._throttle(`watch`,e,5)){if(!n||n.mtimeMs===0)try{let n=await S(e);if(this.fsw.closed)return;let r=n.atimeMs,i=n.mtimeMs;if((!r||r<=i||i!==o.mtimeMs)&&this.fsw._emit(R.CHANGE,e,n),(ue||de||fe)&&o.ino!==n.ino){this.fsw._closeFile(t),o=n;let r=this._watchWithNodeFs(e,s);r&&this.fsw._addPathCloser(t,r)}else o=n}catch{this.fsw._remove(r,i)}else if(a.has(i)){let t=n.atimeMs,r=n.mtimeMs;(!t||t<=r||r!==o.mtimeMs)&&this.fsw._emit(R.CHANGE,e,n),o=n}}},c=this._watchWithNodeFs(e,s);if(!(n&&this.fsw.options.ignoreInitial)&&this.fsw._isntIgnored(e)){if(!this.fsw._throttle(R.ADD,e,0))return;this.fsw._emit(R.ADD,e,t)}return c}async _handleSymlink(e,t,n,r){if(this.fsw.closed)return;let i=e.fullPath,a=this.fsw._getWatchedDir(t);if(!this.fsw.options.followSymlinks){this.fsw._incrReadyCount();let t;try{t=await x(n)}catch{return this.fsw._emitReady(),!0}return this.fsw.closed?void 0:(a.has(r)?this.fsw._symlinkPaths.get(i)!==t&&(this.fsw._symlinkPaths.set(i,t),this.fsw._emit(R.CHANGE,n,e.stats)):(a.add(r),this.fsw._symlinkPaths.set(i,t),this.fsw._emit(R.ADD,n,e.stats)),this.fsw._emitReady(),!0)}if(this.fsw._symlinkPaths.has(i))return!0;this.fsw._symlinkPaths.set(i,!0)}_handleRead(e,t,n,r,i,a,o){e=u.join(e,``);let s=r?`${e}:${r}`:e;if(o=this.fsw._throttle(`readdir`,s,1e3),!o)return;let c=this.fsw._getWatchedDir(n.path),l=new Set,d=this.fsw._readdirp(e,{fileFilter:e=>n.filterPath(e),directoryFilter:e=>n.filterDir(e)});if(d)return d.on(`data`,async o=>{if(this.fsw.closed){d=void 0;return}let s=o.path,f=u.join(e,s);if(l.add(s),!(o.stats.isSymbolicLink()&&await this._handleSymlink(o,e,f,s))){if(this.fsw.closed){d=void 0;return}(s===r||!r&&!c.has(s))&&(this.fsw._incrReadyCount(),f=u.join(i,u.relative(i,f)),this._addToNodeFs(f,t,n,a+1))}}).on(R.ERROR,this._boundHandleError),new Promise((t,s)=>{if(!d)return s();d.once(`end`,()=>{if(this.fsw.closed){d=void 0;return}let s=o?o.clear():!1;t(void 0),c.getChildren().filter(t=>t!==e&&!l.has(t)).forEach(t=>{this.fsw._remove(e,t)}),d=void 0,s&&this._handleRead(e,!1,n,r,i,a,o)})})}async _handleDir(e,t,n,r,i,a,o){let s=this.fsw._getWatchedDir(u.dirname(e)),c=s.has(u.basename(e));!(n&&this.fsw.options.ignoreInitial)&&!i&&!c&&this.fsw._emit(R.ADD_DIR,e,t),s.add(u.basename(e)),this.fsw._getWatchedDir(e);let l,d=this.fsw.options.depth;if((d==null||r<=d)&&!this.fsw._symlinkPaths.has(o)){if(!i&&(await this._handleRead(e,n,a,i,e,r,void 0),this.fsw.closed))return;l=this._watchWithNodeFs(e,(t,n)=>{n&&n.mtimeMs===0||this._handleRead(t,!1,a,i,e,r,void 0)})}return l}async _addToNodeFs(e,t,n,r,i){let a=this.fsw._emitReady;if(this.fsw._isIgnored(e)||this.fsw.closed)return a(),!1;let o=this.fsw._getWatchHelpers(e);n&&(o.filterPath=e=>n.filterPath(e),o.filterDir=e=>n.filterDir(e));try{let n=await me[o.statMethod](o.watchPath);if(this.fsw.closed)return;if(this.fsw._isIgnored(o.watchPath,n))return a(),!1;let s=this.fsw.options.followSymlinks,c;if(n.isDirectory()){let a=u.resolve(e),l=s?await x(e):e;if(this.fsw.closed||(c=await this._handleDir(o.watchPath,n,t,r,i,o,l),this.fsw.closed))return;a!==l&&l!==void 0&&this.fsw._symlinkPaths.set(a,l)}else if(n.isSymbolicLink()){let i=s?await x(e):e;if(this.fsw.closed)return;let a=u.dirname(o.watchPath);if(this.fsw._getWatchedDir(a).add(o.watchPath),this.fsw._emit(R.ADD,o.watchPath,n),c=await this._handleDir(a,n,t,r,e,o,i),this.fsw.closed)return;i!==void 0&&this.fsw._symlinkPaths.set(u.resolve(e),i)}else c=this._handleFile(o.watchPath,n,t);return a(),c&&this.fsw._addPathCloser(e,c),!1}catch(t){if(this.fsw._handleError(t))return a(),e}}};const we=/\\/g,Te=/\/\//g,Ee=/\..*\.(sw[px])$|~$|\.subl.*\.tmp/,De=/^\.[/\\]/;function J(e){return Array.isArray(e)?e:[e]}const Y=e=>typeof e==`object`&&!!e&&!(e instanceof RegExp);function Oe(e){return typeof e==`function`?e:typeof e==`string`?t=>e===t:e instanceof RegExp?t=>e.test(t):typeof e==`object`&&e?t=>{if(e.path===t)return!0;if(e.recursive){let n=u.relative(e.path,t);return n?!n.startsWith(`..`)&&!u.isAbsolute(n):!1}return!1}:()=>!1}function ke(e){if(typeof e!=`string`)throw Error(`string expected`);e=u.normalize(e),e=e.replace(/\\/g,`/`);let t=!1;return e.startsWith(`//`)&&(t=!0),e=e.replace(Te,`/`),t&&(e=`/`+e),e}function Ae(e,t,n){let r=ke(t);for(let t=0;t<e.length;t++){let i=e[t];if(i(r,n))return!0}return!1}function je(e,t){if(e==null)throw TypeError(`anymatch: specify first argument`);let n=J(e).map(e=>Oe(e));return t==null?(e,t)=>Ae(n,e,t):Ae(n,t)}const Me=e=>{let t=J(e).flat();if(!t.every(e=>typeof e==`string`))throw TypeError(`Non-string provided as watch path: ${t}`);return t.map(Pe)},Ne=e=>{let t=e.replace(we,`/`),n=!1;return t.startsWith(`//`)&&(n=!0),t=t.replace(Te,`/`),n&&(t=`/`+t),t},Pe=e=>Ne(u.normalize(Ne(e))),Fe=(e=``)=>t=>typeof t==`string`?Pe(u.isAbsolute(t)?t:u.join(e,t)):t,Ie=(e,t)=>u.isAbsolute(e)?e:u.join(t,e),Le=Object.freeze(new Set);var Re=class{path;_removeWatcher;items;constructor(e,t){this.path=e,this._removeWatcher=t,this.items=new Set}add(e){let{items:t}=this;t&&e!==`.`&&e!==`..`&&t.add(e)}async remove(e){let{items:t}=this;if(!t||(t.delete(e),t.size>0))return;let n=this.path;try{await b(n)}catch{this._removeWatcher&&this._removeWatcher(u.dirname(n),u.basename(n))}}has(e){let{items:t}=this;if(t)return t.has(e)}getChildren(){let{items:e}=this;return e?[...e.values()]:[]}dispose(){this.items.clear(),this.path=``,this._removeWatcher=P,this.items=Le,Object.freeze(this)}},ze=class{fsw;path;watchPath;fullWatchPath;dirParts;followSymlinks;statMethod;constructor(e,t,n){this.fsw=n;let r=e;this.path=e=e.replace(De,``),this.watchPath=r,this.fullWatchPath=u.resolve(r),this.dirParts=[],this.dirParts.forEach(e=>{e.length>1&&e.pop()}),this.followSymlinks=t,this.statMethod=t?`stat`:`lstat`}entryPath(e){return u.join(this.watchPath,u.relative(this.watchPath,e.fullPath))}filterPath(e){let{stats:t}=e;if(t&&t.isSymbolicLink())return this.filterDir(e);let n=this.entryPath(e);return this.fsw._isntIgnored(n,t)&&this.fsw._hasReadPermissions(t)}filterDir(e){return this.fsw._isntIgnored(this.entryPath(e),e.stats)}},Be=class extends O{closed;options;_closers;_ignoredPaths;_throttled;_streams;_symlinkPaths;_watched;_pendingWrites;_pendingUnlinks;_readyCount;_emitReady;_closePromise;_userIgnored;_readyEmitted;_emitRaw;_boundRemove;_nodeFsHandler;constructor(e={}){super(),this.closed=!1,this._closers=new Map,this._ignoredPaths=new Set,this._throttled=new Map,this._streams=new Set,this._symlinkPaths=new Map,this._watched=new Map,this._pendingWrites=new Map,this._pendingUnlinks=new Map,this._readyCount=0,this._readyEmitted=!1;let t=e.awaitWriteFinish,n={stabilityThreshold:2e3,pollInterval:100},r={persistent:!0,ignoreInitial:!1,ignorePermissionErrors:!1,interval:100,binaryInterval:300,followSymlinks:!0,usePolling:!1,atomic:!0,...e,ignored:e.ignored?J(e.ignored):J([]),awaitWriteFinish:t===!0?n:typeof t==`object`?{...n,...t}:!1};pe&&(r.usePolling=!0),r.atomic===void 0&&(r.atomic=!r.usePolling);let i=process.env.CHOKIDAR_USEPOLLING;if(i!==void 0){let e=i.toLowerCase();e===`false`||e===`0`?r.usePolling=!1:e===`true`||e===`1`?r.usePolling=!0:r.usePolling=!!e}let a=process.env.CHOKIDAR_INTERVAL;a&&(r.interval=Number.parseInt(a,10));let o=0;this._emitReady=()=>{o++,o>=this._readyCount&&(this._emitReady=P,this._readyEmitted=!0,process.nextTick(()=>this.emit(L.READY)))},this._emitRaw=(...e)=>this.emit(L.RAW,...e),this._boundRemove=this._remove.bind(this),this.options=r,this._nodeFsHandler=new Ce(this),Object.freeze(r)}_addIgnoredPath(e){if(Y(e)){for(let t of this._ignoredPaths)if(Y(t)&&t.path===e.path&&t.recursive===e.recursive)return}this._ignoredPaths.add(e)}_removeIgnoredPath(e){if(this._ignoredPaths.delete(e),typeof e==`string`)for(let t of this._ignoredPaths)Y(t)&&t.path===e&&this._ignoredPaths.delete(t)}add(e,t,n){let{cwd:r}=this.options;this.closed=!1,this._closePromise=void 0;let i=Me(e);return r&&(i=i.map(e=>Ie(e,r))),i.forEach(e=>{this._removeIgnoredPath(e)}),this._userIgnored=void 0,this._readyCount||=0,this._readyCount+=i.length,Promise.all(i.map(async e=>{let r=await this._nodeFsHandler._addToNodeFs(e,!n,void 0,0,t);return r&&this._emitReady(),r})).then(e=>{this.closed||e.forEach(e=>{e&&this.add(u.dirname(e),u.basename(t||e))})}),this}unwatch(e){if(this.closed)return this;let t=Me(e),{cwd:n}=this.options;return t.forEach(e=>{!u.isAbsolute(e)&&!this._closers.has(e)&&(n&&(e=u.join(n,e)),e=u.resolve(e)),this._closePath(e),this._addIgnoredPath(e),this._watched.has(e)&&this._addIgnoredPath({path:e,recursive:!0}),this._userIgnored=void 0}),this}close(){if(this._closePromise)return this._closePromise;this.closed=!0,this.removeAllListeners();let e=[];return this._closers.forEach(t=>t.forEach(t=>{let n=t();n instanceof Promise&&e.push(n)})),this._streams.forEach(e=>e.destroy()),this._userIgnored=void 0,this._readyCount=0,this._readyEmitted=!1,this._watched.forEach(e=>e.dispose()),this._closers.clear(),this._watched.clear(),this._streams.clear(),this._symlinkPaths.clear(),this._throttled.clear(),this._closePromise=e.length?Promise.all(e).then(()=>void 0):Promise.resolve(),this._closePromise}getWatched(){let e={};return this._watched.forEach((t,n)=>{let r=(this.options.cwd?u.relative(this.options.cwd,n):n)||`.`;e[r]=t.getChildren().sort()}),e}emitWithAll(e,t){this.emit(e,...t),e!==L.ERROR&&this.emit(L.ALL,e,...t)}async _emit(e,t,n){if(this.closed)return;let r=this.options;I&&(t=u.normalize(t)),r.cwd&&(t=u.relative(r.cwd,t));let i=[t];n!=null&&i.push(n);let a=r.awaitWriteFinish,o;if(a&&(o=this._pendingWrites.get(t)))return o.lastChange=new Date,this;if(r.atomic){if(e===L.UNLINK)return this._pendingUnlinks.set(t,[e,...i]),setTimeout(()=>{this._pendingUnlinks.forEach((e,t)=>{this.emit(...e),this.emit(L.ALL,...e),this._pendingUnlinks.delete(t)})},typeof r.atomic==`number`?r.atomic:100),this;e===L.ADD&&this._pendingUnlinks.has(t)&&(e=L.CHANGE,this._pendingUnlinks.delete(t))}if(a&&(e===L.ADD||e===L.CHANGE)&&this._readyEmitted)return this._awaitWriteFinish(t,a.stabilityThreshold,e,(t,n)=>{t?(e=L.ERROR,i[0]=t,this.emitWithAll(e,i)):n&&(i.length>1?i[1]=n:i.push(n),this.emitWithAll(e,i))}),this;if(e===L.CHANGE&&!this._throttle(L.CHANGE,t,50))return this;if(r.alwaysStat&&n===void 0&&(e===L.ADD||e===L.ADD_DIR||e===L.CHANGE)){let e=r.cwd?u.join(r.cwd,t):t,n;try{n=await S(e)}catch{}if(!n||this.closed)return;i.push(n)}return this.emitWithAll(e,i),this}_handleError(e){let t=e&&e.code;return e&&t!==`ENOENT`&&t!==`ENOTDIR`&&(!this.options.ignorePermissionErrors||t!==`EPERM`&&t!==`EACCES`)&&this.emit(L.ERROR,e),e||this.closed}_throttle(e,t,n){this._throttled.has(e)||this._throttled.set(e,new Map);let r=this._throttled.get(e);if(!r)throw Error(`invalid throttle`);let i=r.get(t);if(i)return i.count++,!1;let a,o=()=>{let e=r.get(t),n=e?e.count:0;return r.delete(t),clearTimeout(a),e&&clearTimeout(e.timeoutObject),n};a=setTimeout(o,n);let s={timeoutObject:a,clear:o,count:0};return r.set(t,s),s}_incrReadyCount(){return this._readyCount++}_awaitWriteFinish(e,t,n,r){let i=this.options.awaitWriteFinish;if(typeof i!=`object`)return;let a=i.pollInterval,o,s=e;this.options.cwd&&!u.isAbsolute(e)&&(s=u.join(this.options.cwd,e));let c=new Date,l=this._pendingWrites;function d(n){w(s,(i,s)=>{if(i||!l.has(e)){i&&i.code!==`ENOENT`&&r(i);return}let c=Number(new Date);n&&s.size!==n.size&&(l.get(e).lastChange=c),c-l.get(e).lastChange>=t?(l.delete(e),r(void 0,s)):o=setTimeout(d,a,s)})}l.has(e)||(l.set(e,{lastChange:c,cancelWait:()=>(l.delete(e),clearTimeout(o),n)}),o=setTimeout(d,a))}_isIgnored(e,t){if(this.options.atomic&&Ee.test(e))return!0;if(!this._userIgnored){let{cwd:e}=this.options,t=(this.options.ignored||[]).map(Fe(e)),n=[...[...this._ignoredPaths].map(Fe(e)),...t];this._userIgnored=je(n,void 0)}return this._userIgnored(e,t)}_isntIgnored(e,t){return!this._isIgnored(e,t)}_getWatchHelpers(e){return new ze(e,this.options.followSymlinks,this)}_getWatchedDir(e){let t=u.resolve(e);return this._watched.has(t)||this._watched.set(t,new Re(t,this._boundRemove)),this._watched.get(t)}_hasReadPermissions(e){return this.options.ignorePermissionErrors?!0:!!(Number(e.mode)&256)}_remove(e,t,n){let r=u.join(e,t),i=u.resolve(r);if(n??=this._watched.has(r)||this._watched.has(i),!this._throttle(`remove`,r,100))return;!n&&this._watched.size===1&&this.add(e,t,!0),this._getWatchedDir(r).getChildren().forEach(e=>this._remove(r,e));let a=this._getWatchedDir(e),o=a.has(t);a.remove(t),this._symlinkPaths.has(i)&&this._symlinkPaths.delete(i);let s=r;if(this.options.cwd&&(s=u.relative(this.options.cwd,r)),this.options.awaitWriteFinish&&this._pendingWrites.has(s)&&this._pendingWrites.get(s).cancelWait()===L.ADD)return;this._watched.delete(r),this._watched.delete(i);let c=n?L.UNLINK_DIR:L.UNLINK;o&&!this._isIgnored(r)&&this._emit(c,r),this._closePath(r)}_closePath(e){this._closeFile(e);let t=u.dirname(e);this._getWatchedDir(t).remove(u.basename(e))}_closeFile(e){let t=this._closers.get(e);t&&(t.forEach(e=>e()),this._closers.delete(e))}_addPathCloser(e,t){if(!t)return;let n=this._closers.get(e);n||(n=[],this._closers.set(e,n)),n.push(t)}_readdirp(e,t){if(this.closed)return;let n=le(e,{type:L.ALL,alwaysStat:!0,lstat:!0,...t,depth:0});return this._streams.add(n),n.once(`close`,()=>{n=void 0}),n.once(`end`,()=>{n&&=(this._streams.delete(n),void 0)}),n}};function Ve(e,t={}){let n=new Be(t);return n.add(e),n}function He(e,t=!1){let n=e.length,r=0,i=``,a=0,o=16,s=0,c=0,l=0,u=0,d=0;function f(t,n){let i=0,a=0;for(;i<t||!n;){let t=e.charCodeAt(r);if(t>=48&&t<=57)a=a*16+t-48;else if(t>=65&&t<=70)a=a*16+t-65+10;else if(t>=97&&t<=102)a=a*16+t-97+10;else break;r++,i++}return i<t&&(a=-1),a}function p(e){r=e,i=``,a=0,o=16,d=0}function m(){let t=r;if(e.charCodeAt(r)===48)r++;else for(r++;r<e.length&&Q(e.charCodeAt(r));)r++;if(r<e.length&&e.charCodeAt(r)===46)if(r++,r<e.length&&Q(e.charCodeAt(r)))for(r++;r<e.length&&Q(e.charCodeAt(r));)r++;else return d=3,e.substring(t,r);let n=r;if(r<e.length&&(e.charCodeAt(r)===69||e.charCodeAt(r)===101))if(r++,(r<e.length&&e.charCodeAt(r)===43||e.charCodeAt(r)===45)&&r++,r<e.length&&Q(e.charCodeAt(r))){for(r++;r<e.length&&Q(e.charCodeAt(r));)r++;n=r}else d=3;return e.substring(t,n)}function h(){let t=``,i=r;for(;;){if(r>=n){t+=e.substring(i,r),d=2;break}let a=e.charCodeAt(r);if(a===34){t+=e.substring(i,r),r++;break}if(a===92){if(t+=e.substring(i,r),r++,r>=n){d=2;break}switch(e.charCodeAt(r++)){case 34:t+=`"`;break;case 92:t+=`\\`;break;case 47:t+=`/`;break;case 98:t+=`\b`;break;case 102:t+=`\f`;break;case 110:t+=`
|
|
1
|
+
import{o as e}from"./paths-BYaK6-t0.js";import{t}from"./errors-DsO9xmQL.js";import{i as n}from"./package-DmsQgn4v.js";import{a as r,c as i,i as a,n as o,s,t as c}from"./prewarm-QPhmJIsB.js";import{createRequire as l}from"node:module";import*as u from"node:path";import{dirname as d,isAbsolute as f,join as p,relative as m,resolve as h,sep as g}from"node:path";import{lstat as _,open as v,readFile as y,readdir as b,realpath as x,stat as S}from"node:fs/promises";import{existsSync as C,stat as w,unwatchFile as T,watch as E,watchFile as D}from"node:fs";import{EventEmitter as O}from"node:events";import{Readable as k}from"node:stream";import{type as ee}from"node:os";const A={FILE_TYPE:`files`,DIR_TYPE:`directories`,FILE_DIR_TYPE:`files_directories`,EVERYTHING_TYPE:`all`},j={root:`.`,fileFilter:e=>!0,directoryFilter:e=>!0,type:A.FILE_TYPE,lstat:!1,depth:2147483648,alwaysStat:!1,highWaterMark:4096};Object.freeze(j);const te=`READDIRP_RECURSIVE_ERROR`,ne=new Set([`ENOENT`,`EPERM`,`EACCES`,`ELOOP`,te]),re=[A.DIR_TYPE,A.EVERYTHING_TYPE,A.FILE_DIR_TYPE,A.FILE_TYPE],ie=new Set([A.DIR_TYPE,A.EVERYTHING_TYPE,A.FILE_DIR_TYPE]),ae=new Set([A.EVERYTHING_TYPE,A.FILE_DIR_TYPE,A.FILE_TYPE]),oe=e=>ne.has(e.code),se=process.platform===`win32`,M=e=>!0,N=e=>{if(e===void 0)return M;if(typeof e==`function`)return e;if(typeof e==`string`){let t=e.trim();return e=>e.basename===t}if(Array.isArray(e)){let t=e.map(e=>e.trim());return e=>t.some(t=>e.basename===t)}return M};var ce=class extends k{parents;reading;parent;_stat;_maxDepth;_wantsDir;_wantsFile;_wantsEverything;_root;_isDirent;_statsProp;_rdOptions;_fileFilter;_directoryFilter;constructor(e={}){super({objectMode:!0,autoDestroy:!0,highWaterMark:e.highWaterMark});let t={...j,...e},{root:n,type:r}=t;this._fileFilter=N(t.fileFilter),this._directoryFilter=N(t.directoryFilter);let i=t.lstat?_:S;se?this._stat=e=>i(e,{bigint:!0}):this._stat=i,this._maxDepth=t.depth!=null&&Number.isSafeInteger(t.depth)?t.depth:j.depth,this._wantsDir=r?ie.has(r):!1,this._wantsFile=r?ae.has(r):!1,this._wantsEverything=r===A.EVERYTHING_TYPE,this._root=h(n),this._isDirent=!t.alwaysStat,this._statsProp=this._isDirent?`dirent`:`stats`,this._rdOptions={encoding:`utf8`,withFileTypes:this._isDirent},this.parents=[this._exploreDir(n,1)],this.reading=!1,this.parent=void 0}async _read(e){if(!this.reading){this.reading=!0;try{for(;!this.destroyed&&e>0;){let t=this.parent,n=t&&t.files;if(n&&n.length>0){let{path:r,depth:i}=t,a=n.splice(0,e).map(e=>this._formatEntry(e,r)),o=await Promise.all(a);for(let t of o){if(!t)continue;if(this.destroyed)return;let n=await this._getEntryType(t);n===`directory`&&this._directoryFilter(t)?(i<=this._maxDepth&&this.parents.push(this._exploreDir(t.fullPath,i+1)),this._wantsDir&&(this.push(t),e--)):(n===`file`||this._includeAsFile(t))&&this._fileFilter(t)&&this._wantsFile&&(this.push(t),e--)}}else{let e=this.parents.pop();if(!e){this.push(null);break}if(this.parent=await e,this.destroyed)return}}}catch(e){this.destroy(e)}finally{this.reading=!1}}}async _exploreDir(e,t){let n;try{n=await b(e,this._rdOptions)}catch(e){this._onError(e)}return{files:n,depth:t,path:e}}async _formatEntry(e,t){let n,r=this._isDirent?e.name:e;try{let i=h(p(t,r));n={path:m(this._root,i),fullPath:i,basename:r},n[this._statsProp]=this._isDirent?e:await this._stat(i)}catch(e){this._onError(e);return}return n}_onError(e){oe(e)&&!this.destroyed?this.emit(`warn`,e):this.destroy(e)}async _getEntryType(e){if(!e&&this._statsProp in e)return``;let t=e[this._statsProp];if(t.isFile())return`file`;if(t.isDirectory())return`directory`;if(t&&t.isSymbolicLink()){let t=e.fullPath;try{let e=await x(t),n=await _(e);if(n.isFile())return`file`;if(n.isDirectory()){let n=e.length;if(t.startsWith(e)&&t.substr(n,1)===g){let n=Error(`Circular symlink detected: "${t}" points to "${e}"`);return n.code=te,this._onError(n)}return`directory`}}catch(e){return this._onError(e),``}}}_includeAsFile(e){let t=e&&e[this._statsProp];return t&&this._wantsEverything&&!t.isDirectory()}};function le(e,t={}){let n=t.entryType||t.type;if(n===`both`&&(n=A.FILE_DIR_TYPE),n&&(t.type=n),!e)throw Error(`readdirp: root argument is required. Usage: readdirp(root, options)`);if(typeof e!=`string`)throw TypeError(`readdirp: root argument must be a string. Usage: readdirp(root, options)`);if(n&&!re.includes(n))throw Error(`readdirp: Invalid type passed. Use one of ${re.join(`, `)}`);return t.root=e,new ce(t)}const P=()=>{},F=process.platform,I=F===`win32`,ue=F===`darwin`,de=F===`linux`,fe=F===`freebsd`,pe=ee()===`OS400`,L={ALL:`all`,READY:`ready`,ADD:`add`,CHANGE:`change`,ADD_DIR:`addDir`,UNLINK:`unlink`,UNLINK_DIR:`unlinkDir`,RAW:`raw`,ERROR:`error`},R=L,me={lstat:_,stat:S},z=`listeners`,B=`errHandlers`,V=`rawEmitters`,he=[z,B,V],ge=new Set(`3dm.3ds.3g2.3gp.7z.a.aac.adp.afdesign.afphoto.afpub.ai.aif.aiff.alz.ape.apk.appimage.ar.arj.asf.au.avi.bak.baml.bh.bin.bk.bmp.btif.bz2.bzip2.cab.caf.cgm.class.cmx.cpio.cr2.cur.dat.dcm.deb.dex.djvu.dll.dmg.dng.doc.docm.docx.dot.dotm.dra.DS_Store.dsk.dts.dtshd.dvb.dwg.dxf.ecelp4800.ecelp7470.ecelp9600.egg.eol.eot.epub.exe.f4v.fbs.fh.fla.flac.flatpak.fli.flv.fpx.fst.fvt.g3.gh.gif.graffle.gz.gzip.h261.h263.h264.icns.ico.ief.img.ipa.iso.jar.jpeg.jpg.jpgv.jpm.jxr.key.ktx.lha.lib.lvp.lz.lzh.lzma.lzo.m3u.m4a.m4v.mar.mdi.mht.mid.midi.mj2.mka.mkv.mmr.mng.mobi.mov.movie.mp3.mp4.mp4a.mpeg.mpg.mpga.mxu.nef.npx.numbers.nupkg.o.odp.ods.odt.oga.ogg.ogv.otf.ott.pages.pbm.pcx.pdb.pdf.pea.pgm.pic.png.pnm.pot.potm.potx.ppa.ppam.ppm.pps.ppsm.ppsx.ppt.pptm.pptx.psd.pya.pyc.pyo.pyv.qt.rar.ras.raw.resources.rgb.rip.rlc.rmf.rmvb.rpm.rtf.rz.s3m.s7z.scpt.sgi.shar.snap.sil.sketch.slk.smv.snk.so.stl.suo.sub.swf.tar.tbz.tbz2.tga.tgz.thmx.tif.tiff.tlz.ttc.ttf.txz.udf.uvh.uvi.uvm.uvp.uvs.uvu.viv.vob.war.wav.wax.wbmp.wdp.weba.webm.webp.whl.wim.wm.wma.wmv.wmx.woff.woff2.wrm.wvx.xbm.xif.xla.xlam.xls.xlsb.xlsm.xlsx.xlt.xltm.xltx.xm.xmind.xpi.xpm.xwd.xz.z.zip.zipx`.split(`.`)),_e=e=>ge.has(u.extname(e).slice(1).toLowerCase()),H=(e,t)=>{e instanceof Set?e.forEach(t):t(e)},U=(e,t,n)=>{let r=e[t];r instanceof Set||(e[t]=r=new Set([r])),r.add(n)},ve=e=>t=>{let n=e[t];n instanceof Set?n.clear():delete e[t]},W=(e,t,n)=>{let r=e[t];r instanceof Set?r.delete(n):r===n&&delete e[t]},ye=e=>e instanceof Set?e.size===0:!e,G=new Map;function be(e,t,n,r,i){let a=(t,r)=>{n(e),i(t,r,{watchedPath:e}),r&&e!==r&&K(u.resolve(e,r),z,u.join(e,r))};try{return E(e,{persistent:t.persistent},a)}catch(e){r(e);return}}const K=(e,t,n,r,i)=>{let a=G.get(e);a&&H(a[t],e=>{e(n,r,i)})},xe=(e,t,n,r)=>{let{listener:i,errHandler:a,rawEmitter:o}=r,s=G.get(t),c;if(!n.persistent)return c=be(e,n,i,a,o),c?c.close.bind(c):void 0;if(s)U(s,z,i),U(s,B,a),U(s,V,o);else{if(c=be(e,n,K.bind(null,t,z),a,K.bind(null,t,V)),!c)return;c.on(R.ERROR,async n=>{let r=K.bind(null,t,B);if(s&&(s.watcherUnusable=!0),I&&n.code===`EPERM`)try{await(await v(e,`r`)).close(),r(n)}catch{}else r(n)}),s={listeners:i,errHandlers:a,rawEmitters:o,watcher:c},G.set(t,s)}return()=>{W(s,z,i),W(s,B,a),W(s,V,o),ye(s.listeners)&&(s.watcher.close(),G.delete(t),he.forEach(ve(s)),s.watcher=void 0,Object.freeze(s))}},q=new Map,Se=(e,t,n,r)=>{let{listener:i,rawEmitter:a}=r,o=q.get(t),s=o&&o.options;return s&&(s.persistent<n.persistent||s.interval>n.interval)&&(T(t),o=void 0),o?(U(o,z,i),U(o,V,a)):(o={listeners:i,rawEmitters:a,options:n,watcher:D(t,n,(n,r)=>{H(o.rawEmitters,e=>{e(R.CHANGE,t,{curr:n,prev:r})});let i=n.mtimeMs;(n.size!==r.size||i>r.mtimeMs||i===0)&&H(o.listeners,t=>t(e,n))})},q.set(t,o)),()=>{W(o,z,i),W(o,V,a),ye(o.listeners)&&(q.delete(t),T(t),o.options=o.watcher=void 0,Object.freeze(o))}};var Ce=class{fsw;_boundHandleError;constructor(e){this.fsw=e,this._boundHandleError=t=>e._handleError(t)}_watchWithNodeFs(e,t){let n=this.fsw.options,r=u.dirname(e),i=u.basename(e);this.fsw._getWatchedDir(r).add(i);let a=u.resolve(e),o={persistent:n.persistent};t||=P;let s;return n.usePolling?(o.interval=n.interval!==n.binaryInterval&&_e(i)?n.binaryInterval:n.interval,s=Se(e,a,o,{listener:t,rawEmitter:this.fsw._emitRaw})):s=xe(e,a,o,{listener:t,errHandler:this._boundHandleError,rawEmitter:this.fsw._emitRaw}),s}_handleFile(e,t,n){if(this.fsw.closed)return;let r=u.dirname(e),i=u.basename(e),a=this.fsw._getWatchedDir(r),o=t;if(a.has(i))return;let s=async(t,n)=>{if(this.fsw._throttle(`watch`,e,5)){if(!n||n.mtimeMs===0)try{let n=await S(e);if(this.fsw.closed)return;let r=n.atimeMs,i=n.mtimeMs;if((!r||r<=i||i!==o.mtimeMs)&&this.fsw._emit(R.CHANGE,e,n),(ue||de||fe)&&o.ino!==n.ino){this.fsw._closeFile(t),o=n;let r=this._watchWithNodeFs(e,s);r&&this.fsw._addPathCloser(t,r)}else o=n}catch{this.fsw._remove(r,i)}else if(a.has(i)){let t=n.atimeMs,r=n.mtimeMs;(!t||t<=r||r!==o.mtimeMs)&&this.fsw._emit(R.CHANGE,e,n),o=n}}},c=this._watchWithNodeFs(e,s);if(!(n&&this.fsw.options.ignoreInitial)&&this.fsw._isntIgnored(e)){if(!this.fsw._throttle(R.ADD,e,0))return;this.fsw._emit(R.ADD,e,t)}return c}async _handleSymlink(e,t,n,r){if(this.fsw.closed)return;let i=e.fullPath,a=this.fsw._getWatchedDir(t);if(!this.fsw.options.followSymlinks){this.fsw._incrReadyCount();let t;try{t=await x(n)}catch{return this.fsw._emitReady(),!0}return this.fsw.closed?void 0:(a.has(r)?this.fsw._symlinkPaths.get(i)!==t&&(this.fsw._symlinkPaths.set(i,t),this.fsw._emit(R.CHANGE,n,e.stats)):(a.add(r),this.fsw._symlinkPaths.set(i,t),this.fsw._emit(R.ADD,n,e.stats)),this.fsw._emitReady(),!0)}if(this.fsw._symlinkPaths.has(i))return!0;this.fsw._symlinkPaths.set(i,!0)}_handleRead(e,t,n,r,i,a,o){e=u.join(e,``);let s=r?`${e}:${r}`:e;if(o=this.fsw._throttle(`readdir`,s,1e3),!o)return;let c=this.fsw._getWatchedDir(n.path),l=new Set,d=this.fsw._readdirp(e,{fileFilter:e=>n.filterPath(e),directoryFilter:e=>n.filterDir(e)});if(d)return d.on(`data`,async o=>{if(this.fsw.closed){d=void 0;return}let s=o.path,f=u.join(e,s);if(l.add(s),!(o.stats.isSymbolicLink()&&await this._handleSymlink(o,e,f,s))){if(this.fsw.closed){d=void 0;return}(s===r||!r&&!c.has(s))&&(this.fsw._incrReadyCount(),f=u.join(i,u.relative(i,f)),this._addToNodeFs(f,t,n,a+1))}}).on(R.ERROR,this._boundHandleError),new Promise((t,s)=>{if(!d)return s();d.once(`end`,()=>{if(this.fsw.closed){d=void 0;return}let s=o?o.clear():!1;t(void 0),c.getChildren().filter(t=>t!==e&&!l.has(t)).forEach(t=>{this.fsw._remove(e,t)}),d=void 0,s&&this._handleRead(e,!1,n,r,i,a,o)})})}async _handleDir(e,t,n,r,i,a,o){let s=this.fsw._getWatchedDir(u.dirname(e)),c=s.has(u.basename(e));!(n&&this.fsw.options.ignoreInitial)&&!i&&!c&&this.fsw._emit(R.ADD_DIR,e,t),s.add(u.basename(e)),this.fsw._getWatchedDir(e);let l,d=this.fsw.options.depth;if((d==null||r<=d)&&!this.fsw._symlinkPaths.has(o)){if(!i&&(await this._handleRead(e,n,a,i,e,r,void 0),this.fsw.closed))return;l=this._watchWithNodeFs(e,(t,n)=>{n&&n.mtimeMs===0||this._handleRead(t,!1,a,i,e,r,void 0)})}return l}async _addToNodeFs(e,t,n,r,i){let a=this.fsw._emitReady;if(this.fsw._isIgnored(e)||this.fsw.closed)return a(),!1;let o=this.fsw._getWatchHelpers(e);n&&(o.filterPath=e=>n.filterPath(e),o.filterDir=e=>n.filterDir(e));try{let n=await me[o.statMethod](o.watchPath);if(this.fsw.closed)return;if(this.fsw._isIgnored(o.watchPath,n))return a(),!1;let s=this.fsw.options.followSymlinks,c;if(n.isDirectory()){let a=u.resolve(e),l=s?await x(e):e;if(this.fsw.closed||(c=await this._handleDir(o.watchPath,n,t,r,i,o,l),this.fsw.closed))return;a!==l&&l!==void 0&&this.fsw._symlinkPaths.set(a,l)}else if(n.isSymbolicLink()){let i=s?await x(e):e;if(this.fsw.closed)return;let a=u.dirname(o.watchPath);if(this.fsw._getWatchedDir(a).add(o.watchPath),this.fsw._emit(R.ADD,o.watchPath,n),c=await this._handleDir(a,n,t,r,e,o,i),this.fsw.closed)return;i!==void 0&&this.fsw._symlinkPaths.set(u.resolve(e),i)}else c=this._handleFile(o.watchPath,n,t);return a(),c&&this.fsw._addPathCloser(e,c),!1}catch(t){if(this.fsw._handleError(t))return a(),e}}};const we=/\\/g,Te=/\/\//g,Ee=/\..*\.(sw[px])$|~$|\.subl.*\.tmp/,De=/^\.[/\\]/;function J(e){return Array.isArray(e)?e:[e]}const Y=e=>typeof e==`object`&&!!e&&!(e instanceof RegExp);function Oe(e){return typeof e==`function`?e:typeof e==`string`?t=>e===t:e instanceof RegExp?t=>e.test(t):typeof e==`object`&&e?t=>{if(e.path===t)return!0;if(e.recursive){let n=u.relative(e.path,t);return n?!n.startsWith(`..`)&&!u.isAbsolute(n):!1}return!1}:()=>!1}function ke(e){if(typeof e!=`string`)throw Error(`string expected`);e=u.normalize(e),e=e.replace(/\\/g,`/`);let t=!1;return e.startsWith(`//`)&&(t=!0),e=e.replace(Te,`/`),t&&(e=`/`+e),e}function Ae(e,t,n){let r=ke(t);for(let t=0;t<e.length;t++){let i=e[t];if(i(r,n))return!0}return!1}function je(e,t){if(e==null)throw TypeError(`anymatch: specify first argument`);let n=J(e).map(e=>Oe(e));return t==null?(e,t)=>Ae(n,e,t):Ae(n,t)}const Me=e=>{let t=J(e).flat();if(!t.every(e=>typeof e==`string`))throw TypeError(`Non-string provided as watch path: ${t}`);return t.map(Pe)},Ne=e=>{let t=e.replace(we,`/`),n=!1;return t.startsWith(`//`)&&(n=!0),t=t.replace(Te,`/`),n&&(t=`/`+t),t},Pe=e=>Ne(u.normalize(Ne(e))),Fe=(e=``)=>t=>typeof t==`string`?Pe(u.isAbsolute(t)?t:u.join(e,t)):t,Ie=(e,t)=>u.isAbsolute(e)?e:u.join(t,e),Le=Object.freeze(new Set);var Re=class{path;_removeWatcher;items;constructor(e,t){this.path=e,this._removeWatcher=t,this.items=new Set}add(e){let{items:t}=this;t&&e!==`.`&&e!==`..`&&t.add(e)}async remove(e){let{items:t}=this;if(!t||(t.delete(e),t.size>0))return;let n=this.path;try{await b(n)}catch{this._removeWatcher&&this._removeWatcher(u.dirname(n),u.basename(n))}}has(e){let{items:t}=this;if(t)return t.has(e)}getChildren(){let{items:e}=this;return e?[...e.values()]:[]}dispose(){this.items.clear(),this.path=``,this._removeWatcher=P,this.items=Le,Object.freeze(this)}},ze=class{fsw;path;watchPath;fullWatchPath;dirParts;followSymlinks;statMethod;constructor(e,t,n){this.fsw=n;let r=e;this.path=e=e.replace(De,``),this.watchPath=r,this.fullWatchPath=u.resolve(r),this.dirParts=[],this.dirParts.forEach(e=>{e.length>1&&e.pop()}),this.followSymlinks=t,this.statMethod=t?`stat`:`lstat`}entryPath(e){return u.join(this.watchPath,u.relative(this.watchPath,e.fullPath))}filterPath(e){let{stats:t}=e;if(t&&t.isSymbolicLink())return this.filterDir(e);let n=this.entryPath(e);return this.fsw._isntIgnored(n,t)&&this.fsw._hasReadPermissions(t)}filterDir(e){return this.fsw._isntIgnored(this.entryPath(e),e.stats)}},Be=class extends O{closed;options;_closers;_ignoredPaths;_throttled;_streams;_symlinkPaths;_watched;_pendingWrites;_pendingUnlinks;_readyCount;_emitReady;_closePromise;_userIgnored;_readyEmitted;_emitRaw;_boundRemove;_nodeFsHandler;constructor(e={}){super(),this.closed=!1,this._closers=new Map,this._ignoredPaths=new Set,this._throttled=new Map,this._streams=new Set,this._symlinkPaths=new Map,this._watched=new Map,this._pendingWrites=new Map,this._pendingUnlinks=new Map,this._readyCount=0,this._readyEmitted=!1;let t=e.awaitWriteFinish,n={stabilityThreshold:2e3,pollInterval:100},r={persistent:!0,ignoreInitial:!1,ignorePermissionErrors:!1,interval:100,binaryInterval:300,followSymlinks:!0,usePolling:!1,atomic:!0,...e,ignored:e.ignored?J(e.ignored):J([]),awaitWriteFinish:t===!0?n:typeof t==`object`?{...n,...t}:!1};pe&&(r.usePolling=!0),r.atomic===void 0&&(r.atomic=!r.usePolling);let i=process.env.CHOKIDAR_USEPOLLING;if(i!==void 0){let e=i.toLowerCase();e===`false`||e===`0`?r.usePolling=!1:e===`true`||e===`1`?r.usePolling=!0:r.usePolling=!!e}let a=process.env.CHOKIDAR_INTERVAL;a&&(r.interval=Number.parseInt(a,10));let o=0;this._emitReady=()=>{o++,o>=this._readyCount&&(this._emitReady=P,this._readyEmitted=!0,process.nextTick(()=>this.emit(L.READY)))},this._emitRaw=(...e)=>this.emit(L.RAW,...e),this._boundRemove=this._remove.bind(this),this.options=r,this._nodeFsHandler=new Ce(this),Object.freeze(r)}_addIgnoredPath(e){if(Y(e)){for(let t of this._ignoredPaths)if(Y(t)&&t.path===e.path&&t.recursive===e.recursive)return}this._ignoredPaths.add(e)}_removeIgnoredPath(e){if(this._ignoredPaths.delete(e),typeof e==`string`)for(let t of this._ignoredPaths)Y(t)&&t.path===e&&this._ignoredPaths.delete(t)}add(e,t,n){let{cwd:r}=this.options;this.closed=!1,this._closePromise=void 0;let i=Me(e);return r&&(i=i.map(e=>Ie(e,r))),i.forEach(e=>{this._removeIgnoredPath(e)}),this._userIgnored=void 0,this._readyCount||=0,this._readyCount+=i.length,Promise.all(i.map(async e=>{let r=await this._nodeFsHandler._addToNodeFs(e,!n,void 0,0,t);return r&&this._emitReady(),r})).then(e=>{this.closed||e.forEach(e=>{e&&this.add(u.dirname(e),u.basename(t||e))})}),this}unwatch(e){if(this.closed)return this;let t=Me(e),{cwd:n}=this.options;return t.forEach(e=>{!u.isAbsolute(e)&&!this._closers.has(e)&&(n&&(e=u.join(n,e)),e=u.resolve(e)),this._closePath(e),this._addIgnoredPath(e),this._watched.has(e)&&this._addIgnoredPath({path:e,recursive:!0}),this._userIgnored=void 0}),this}close(){if(this._closePromise)return this._closePromise;this.closed=!0,this.removeAllListeners();let e=[];return this._closers.forEach(t=>t.forEach(t=>{let n=t();n instanceof Promise&&e.push(n)})),this._streams.forEach(e=>e.destroy()),this._userIgnored=void 0,this._readyCount=0,this._readyEmitted=!1,this._watched.forEach(e=>e.dispose()),this._closers.clear(),this._watched.clear(),this._streams.clear(),this._symlinkPaths.clear(),this._throttled.clear(),this._closePromise=e.length?Promise.all(e).then(()=>void 0):Promise.resolve(),this._closePromise}getWatched(){let e={};return this._watched.forEach((t,n)=>{let r=(this.options.cwd?u.relative(this.options.cwd,n):n)||`.`;e[r]=t.getChildren().sort()}),e}emitWithAll(e,t){this.emit(e,...t),e!==L.ERROR&&this.emit(L.ALL,e,...t)}async _emit(e,t,n){if(this.closed)return;let r=this.options;I&&(t=u.normalize(t)),r.cwd&&(t=u.relative(r.cwd,t));let i=[t];n!=null&&i.push(n);let a=r.awaitWriteFinish,o;if(a&&(o=this._pendingWrites.get(t)))return o.lastChange=new Date,this;if(r.atomic){if(e===L.UNLINK)return this._pendingUnlinks.set(t,[e,...i]),setTimeout(()=>{this._pendingUnlinks.forEach((e,t)=>{this.emit(...e),this.emit(L.ALL,...e),this._pendingUnlinks.delete(t)})},typeof r.atomic==`number`?r.atomic:100),this;e===L.ADD&&this._pendingUnlinks.has(t)&&(e=L.CHANGE,this._pendingUnlinks.delete(t))}if(a&&(e===L.ADD||e===L.CHANGE)&&this._readyEmitted)return this._awaitWriteFinish(t,a.stabilityThreshold,e,(t,n)=>{t?(e=L.ERROR,i[0]=t,this.emitWithAll(e,i)):n&&(i.length>1?i[1]=n:i.push(n),this.emitWithAll(e,i))}),this;if(e===L.CHANGE&&!this._throttle(L.CHANGE,t,50))return this;if(r.alwaysStat&&n===void 0&&(e===L.ADD||e===L.ADD_DIR||e===L.CHANGE)){let e=r.cwd?u.join(r.cwd,t):t,n;try{n=await S(e)}catch{}if(!n||this.closed)return;i.push(n)}return this.emitWithAll(e,i),this}_handleError(e){let t=e&&e.code;return e&&t!==`ENOENT`&&t!==`ENOTDIR`&&(!this.options.ignorePermissionErrors||t!==`EPERM`&&t!==`EACCES`)&&this.emit(L.ERROR,e),e||this.closed}_throttle(e,t,n){this._throttled.has(e)||this._throttled.set(e,new Map);let r=this._throttled.get(e);if(!r)throw Error(`invalid throttle`);let i=r.get(t);if(i)return i.count++,!1;let a,o=()=>{let e=r.get(t),n=e?e.count:0;return r.delete(t),clearTimeout(a),e&&clearTimeout(e.timeoutObject),n};a=setTimeout(o,n);let s={timeoutObject:a,clear:o,count:0};return r.set(t,s),s}_incrReadyCount(){return this._readyCount++}_awaitWriteFinish(e,t,n,r){let i=this.options.awaitWriteFinish;if(typeof i!=`object`)return;let a=i.pollInterval,o,s=e;this.options.cwd&&!u.isAbsolute(e)&&(s=u.join(this.options.cwd,e));let c=new Date,l=this._pendingWrites;function d(n){w(s,(i,s)=>{if(i||!l.has(e)){i&&i.code!==`ENOENT`&&r(i);return}let c=Number(new Date);n&&s.size!==n.size&&(l.get(e).lastChange=c),c-l.get(e).lastChange>=t?(l.delete(e),r(void 0,s)):o=setTimeout(d,a,s)})}l.has(e)||(l.set(e,{lastChange:c,cancelWait:()=>(l.delete(e),clearTimeout(o),n)}),o=setTimeout(d,a))}_isIgnored(e,t){if(this.options.atomic&&Ee.test(e))return!0;if(!this._userIgnored){let{cwd:e}=this.options,t=(this.options.ignored||[]).map(Fe(e)),n=[...[...this._ignoredPaths].map(Fe(e)),...t];this._userIgnored=je(n,void 0)}return this._userIgnored(e,t)}_isntIgnored(e,t){return!this._isIgnored(e,t)}_getWatchHelpers(e){return new ze(e,this.options.followSymlinks,this)}_getWatchedDir(e){let t=u.resolve(e);return this._watched.has(t)||this._watched.set(t,new Re(t,this._boundRemove)),this._watched.get(t)}_hasReadPermissions(e){return this.options.ignorePermissionErrors?!0:!!(Number(e.mode)&256)}_remove(e,t,n){let r=u.join(e,t),i=u.resolve(r);if(n??=this._watched.has(r)||this._watched.has(i),!this._throttle(`remove`,r,100))return;!n&&this._watched.size===1&&this.add(e,t,!0),this._getWatchedDir(r).getChildren().forEach(e=>this._remove(r,e));let a=this._getWatchedDir(e),o=a.has(t);a.remove(t),this._symlinkPaths.has(i)&&this._symlinkPaths.delete(i);let s=r;if(this.options.cwd&&(s=u.relative(this.options.cwd,r)),this.options.awaitWriteFinish&&this._pendingWrites.has(s)&&this._pendingWrites.get(s).cancelWait()===L.ADD)return;this._watched.delete(r),this._watched.delete(i);let c=n?L.UNLINK_DIR:L.UNLINK;o&&!this._isIgnored(r)&&this._emit(c,r),this._closePath(r)}_closePath(e){this._closeFile(e);let t=u.dirname(e);this._getWatchedDir(t).remove(u.basename(e))}_closeFile(e){let t=this._closers.get(e);t&&(t.forEach(e=>e()),this._closers.delete(e))}_addPathCloser(e,t){if(!t)return;let n=this._closers.get(e);n||(n=[],this._closers.set(e,n)),n.push(t)}_readdirp(e,t){if(this.closed)return;let n=le(e,{type:L.ALL,alwaysStat:!0,lstat:!0,...t,depth:0});return this._streams.add(n),n.once(`close`,()=>{n=void 0}),n.once(`end`,()=>{n&&=(this._streams.delete(n),void 0)}),n}};function Ve(e,t={}){let n=new Be(t);return n.add(e),n}function He(e,t=!1){let n=e.length,r=0,i=``,a=0,o=16,s=0,c=0,l=0,u=0,d=0;function f(t,n){let i=0,a=0;for(;i<t||!n;){let t=e.charCodeAt(r);if(t>=48&&t<=57)a=a*16+t-48;else if(t>=65&&t<=70)a=a*16+t-65+10;else if(t>=97&&t<=102)a=a*16+t-97+10;else break;r++,i++}return i<t&&(a=-1),a}function p(e){r=e,i=``,a=0,o=16,d=0}function m(){let t=r;if(e.charCodeAt(r)===48)r++;else for(r++;r<e.length&&Q(e.charCodeAt(r));)r++;if(r<e.length&&e.charCodeAt(r)===46)if(r++,r<e.length&&Q(e.charCodeAt(r)))for(r++;r<e.length&&Q(e.charCodeAt(r));)r++;else return d=3,e.substring(t,r);let n=r;if(r<e.length&&(e.charCodeAt(r)===69||e.charCodeAt(r)===101))if(r++,(r<e.length&&e.charCodeAt(r)===43||e.charCodeAt(r)===45)&&r++,r<e.length&&Q(e.charCodeAt(r))){for(r++;r<e.length&&Q(e.charCodeAt(r));)r++;n=r}else d=3;return e.substring(t,n)}function h(){let t=``,i=r;for(;;){if(r>=n){t+=e.substring(i,r),d=2;break}let a=e.charCodeAt(r);if(a===34){t+=e.substring(i,r),r++;break}if(a===92){if(t+=e.substring(i,r),r++,r>=n){d=2;break}switch(e.charCodeAt(r++)){case 34:t+=`"`;break;case 92:t+=`\\`;break;case 47:t+=`/`;break;case 98:t+=`\b`;break;case 102:t+=`\f`;break;case 110:t+=`
|
|
2
2
|
`;break;case 114:t+=`\r`;break;case 116:t+=` `;break;case 117:let e=f(4,!0);e>=0?t+=String.fromCharCode(e):d=4;break;default:d=5}i=r;continue}if(a>=0&&a<=31)if(Z(a)){t+=e.substring(i,r),d=2;break}else d=6;r++}return t}function g(){if(i=``,d=0,a=r,c=s,u=l,r>=n)return a=n,o=17;let t=e.charCodeAt(r);if(X(t)){do r++,i+=String.fromCharCode(t),t=e.charCodeAt(r);while(X(t));return o=15}if(Z(t))return r++,i+=String.fromCharCode(t),t===13&&e.charCodeAt(r)===10&&(r++,i+=`
|
|
3
3
|
`),s++,l=r,o=14;switch(t){case 123:return r++,o=1;case 125:return r++,o=2;case 91:return r++,o=3;case 93:return r++,o=4;case 58:return r++,o=6;case 44:return r++,o=5;case 34:return r++,i=h(),o=10;case 47:let c=r-1;if(e.charCodeAt(r+1)===47){for(r+=2;r<n&&!Z(e.charCodeAt(r));)r++;return i=e.substring(c,r),o=12}if(e.charCodeAt(r+1)===42){r+=2;let t=n-1,a=!1;for(;r<t;){let t=e.charCodeAt(r);if(t===42&&e.charCodeAt(r+1)===47){r+=2,a=!0;break}r++,Z(t)&&(t===13&&e.charCodeAt(r)===10&&r++,s++,l=r)}return a||(r++,d=1),i=e.substring(c,r),o=13}return i+=String.fromCharCode(t),r++,o=16;case 45:if(i+=String.fromCharCode(t),r++,r===n||!Q(e.charCodeAt(r)))return o=16;case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return i+=m(),o=11;default:for(;r<n&&_(t);)r++,t=e.charCodeAt(r);if(a!==r){switch(i=e.substring(a,r),i){case`true`:return o=8;case`false`:return o=9;case`null`:return o=7}return o=16}return i+=String.fromCharCode(t),r++,o=16}}function _(e){if(X(e)||Z(e))return!1;switch(e){case 125:case 93:case 123:case 91:case 34:case 58:case 44:case 47:return!1}return!0}function v(){let e;do e=g();while(e>=12&&e<=15);return e}return{setPosition:p,getPosition:()=>r,scan:t?v:g,getToken:()=>o,getTokenValue:()=>i,getTokenOffset:()=>a,getTokenLength:()=>r-a,getTokenStartLine:()=>c,getTokenStartCharacter:()=>a-u,getTokenError:()=>d}}function X(e){return e===32||e===9}function Z(e){return e===10||e===13}function Q(e){return e>=48&&e<=57}var Ue;(function(e){e[e.lineFeed=10]=`lineFeed`,e[e.carriageReturn=13]=`carriageReturn`,e[e.space=32]=`space`,e[e._0=48]=`_0`,e[e._1=49]=`_1`,e[e._2=50]=`_2`,e[e._3=51]=`_3`,e[e._4=52]=`_4`,e[e._5=53]=`_5`,e[e._6=54]=`_6`,e[e._7=55]=`_7`,e[e._8=56]=`_8`,e[e._9=57]=`_9`,e[e.a=97]=`a`,e[e.b=98]=`b`,e[e.c=99]=`c`,e[e.d=100]=`d`,e[e.e=101]=`e`,e[e.f=102]=`f`,e[e.g=103]=`g`,e[e.h=104]=`h`,e[e.i=105]=`i`,e[e.j=106]=`j`,e[e.k=107]=`k`,e[e.l=108]=`l`,e[e.m=109]=`m`,e[e.n=110]=`n`,e[e.o=111]=`o`,e[e.p=112]=`p`,e[e.q=113]=`q`,e[e.r=114]=`r`,e[e.s=115]=`s`,e[e.t=116]=`t`,e[e.u=117]=`u`,e[e.v=118]=`v`,e[e.w=119]=`w`,e[e.x=120]=`x`,e[e.y=121]=`y`,e[e.z=122]=`z`,e[e.A=65]=`A`,e[e.B=66]=`B`,e[e.C=67]=`C`,e[e.D=68]=`D`,e[e.E=69]=`E`,e[e.F=70]=`F`,e[e.G=71]=`G`,e[e.H=72]=`H`,e[e.I=73]=`I`,e[e.J=74]=`J`,e[e.K=75]=`K`,e[e.L=76]=`L`,e[e.M=77]=`M`,e[e.N=78]=`N`,e[e.O=79]=`O`,e[e.P=80]=`P`,e[e.Q=81]=`Q`,e[e.R=82]=`R`,e[e.S=83]=`S`,e[e.T=84]=`T`,e[e.U=85]=`U`,e[e.V=86]=`V`,e[e.W=87]=`W`,e[e.X=88]=`X`,e[e.Y=89]=`Y`,e[e.Z=90]=`Z`,e[e.asterisk=42]=`asterisk`,e[e.backslash=92]=`backslash`,e[e.closeBrace=125]=`closeBrace`,e[e.closeBracket=93]=`closeBracket`,e[e.colon=58]=`colon`,e[e.comma=44]=`comma`,e[e.dot=46]=`dot`,e[e.doubleQuote=34]=`doubleQuote`,e[e.minus=45]=`minus`,e[e.openBrace=123]=`openBrace`,e[e.openBracket=91]=`openBracket`,e[e.plus=43]=`plus`,e[e.slash=47]=`slash`,e[e.formFeed=12]=`formFeed`,e[e.tab=9]=`tab`})(Ue||={}),Array(20).fill(0).map((e,t)=>` `.repeat(t)),Array(200).fill(0).map((e,t)=>`
|
|
4
4
|
`+` `.repeat(t)),Array(200).fill(0).map((e,t)=>`\r`+` `.repeat(t)),Array(200).fill(0).map((e,t)=>`\r
|