sweetlink 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/CHANGELOG.md +12 -0
- package/LICENSE +21 -0
- package/README.md +237 -0
- package/dist/daemon/src/codename.d.ts +8 -0
- package/dist/daemon/src/codename.d.ts.map +1 -0
- package/dist/daemon/src/codename.js +42 -0
- package/dist/daemon/src/codename.js.map +1 -0
- package/dist/daemon/src/index.d.ts +3 -0
- package/dist/daemon/src/index.d.ts.map +1 -0
- package/dist/daemon/src/index.js +675 -0
- package/dist/daemon/src/index.js.map +1 -0
- package/dist/shared/src/env.d.ts +24 -0
- package/dist/shared/src/env.d.ts.map +1 -0
- package/dist/shared/src/env.js +39 -0
- package/dist/shared/src/env.js.map +1 -0
- package/dist/shared/src/index.d.ts +211 -0
- package/dist/shared/src/index.d.ts.map +1 -0
- package/dist/shared/src/index.js +73 -0
- package/dist/shared/src/index.js.map +1 -0
- package/dist/shared/src/node.d.ts +12 -0
- package/dist/shared/src/node.d.ts.map +1 -0
- package/dist/shared/src/node.js +67 -0
- package/dist/shared/src/node.js.map +1 -0
- package/dist/src/codex.d.ts +11 -0
- package/dist/src/codex.d.ts.map +1 -0
- package/dist/src/codex.js +67 -0
- package/dist/src/codex.js.map +1 -0
- package/dist/src/commands/click.d.ts +3 -0
- package/dist/src/commands/click.d.ts.map +1 -0
- package/dist/src/commands/click.js +93 -0
- package/dist/src/commands/click.js.map +1 -0
- package/dist/src/commands/run-js.d.ts +4 -0
- package/dist/src/commands/run-js.d.ts.map +1 -0
- package/dist/src/commands/run-js.js +28 -0
- package/dist/src/commands/run-js.js.map +1 -0
- package/dist/src/commands/trust-ca.d.ts +3 -0
- package/dist/src/commands/trust-ca.d.ts.map +1 -0
- package/dist/src/commands/trust-ca.js +43 -0
- package/dist/src/commands/trust-ca.js.map +1 -0
- package/dist/src/core/config-file.d.ts +41 -0
- package/dist/src/core/config-file.d.ts.map +1 -0
- package/dist/src/core/config-file.js +284 -0
- package/dist/src/core/config-file.js.map +1 -0
- package/dist/src/core/config.d.ts +23 -0
- package/dist/src/core/config.d.ts.map +1 -0
- package/dist/src/core/config.js +132 -0
- package/dist/src/core/config.js.map +1 -0
- package/dist/src/core/env.d.ts +11 -0
- package/dist/src/core/env.d.ts.map +1 -0
- package/dist/src/core/env.js +30 -0
- package/dist/src/core/env.js.map +1 -0
- package/dist/src/devtools-registry.d.ts +3 -0
- package/dist/src/devtools-registry.d.ts.map +1 -0
- package/dist/src/devtools-registry.js +294 -0
- package/dist/src/devtools-registry.js.map +1 -0
- package/dist/src/env.d.ts +16 -0
- package/dist/src/env.d.ts.map +1 -0
- package/dist/src/env.js +17 -0
- package/dist/src/env.js.map +1 -0
- package/dist/src/http.d.ts +2 -0
- package/dist/src/http.d.ts.map +1 -0
- package/dist/src/http.js +53 -0
- package/dist/src/http.js.map +1 -0
- package/dist/src/index.d.ts +19 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +1941 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/runtime/browser/client.d.ts +10 -0
- package/dist/src/runtime/browser/client.d.ts.map +1 -0
- package/dist/src/runtime/browser/client.js +497 -0
- package/dist/src/runtime/browser/client.js.map +1 -0
- package/dist/src/runtime/browser/commands/index.d.ts +10 -0
- package/dist/src/runtime/browser/commands/index.d.ts.map +1 -0
- package/dist/src/runtime/browser/commands/index.js +219 -0
- package/dist/src/runtime/browser/commands/index.js.map +1 -0
- package/dist/src/runtime/browser/dom-to-image-loader.d.ts +6 -0
- package/dist/src/runtime/browser/dom-to-image-loader.d.ts.map +1 -0
- package/dist/src/runtime/browser/dom-to-image-loader.js +50 -0
- package/dist/src/runtime/browser/dom-to-image-loader.js.map +1 -0
- package/dist/src/runtime/browser/index.d.ts +4 -0
- package/dist/src/runtime/browser/index.d.ts.map +1 -0
- package/dist/src/runtime/browser/index.js +4 -0
- package/dist/src/runtime/browser/index.js.map +1 -0
- package/dist/src/runtime/browser/module-loader.d.ts +6 -0
- package/dist/src/runtime/browser/module-loader.d.ts.map +1 -0
- package/dist/src/runtime/browser/module-loader.js +26 -0
- package/dist/src/runtime/browser/module-loader.js.map +1 -0
- package/dist/src/runtime/browser/screenshot/hooks.d.ts +71 -0
- package/dist/src/runtime/browser/screenshot/hooks.d.ts.map +1 -0
- package/dist/src/runtime/browser/screenshot/hooks.js +219 -0
- package/dist/src/runtime/browser/screenshot/hooks.js.map +1 -0
- package/dist/src/runtime/browser/screenshot/index.d.ts +9 -0
- package/dist/src/runtime/browser/screenshot/index.d.ts.map +1 -0
- package/dist/src/runtime/browser/screenshot/index.js +90 -0
- package/dist/src/runtime/browser/screenshot/index.js.map +1 -0
- package/dist/src/runtime/browser/screenshot/renderers/dom-to-image.d.ts +13 -0
- package/dist/src/runtime/browser/screenshot/renderers/dom-to-image.d.ts.map +1 -0
- package/dist/src/runtime/browser/screenshot/renderers/dom-to-image.js +51 -0
- package/dist/src/runtime/browser/screenshot/renderers/dom-to-image.js.map +1 -0
- package/dist/src/runtime/browser/screenshot/renderers/html2canvas.d.ts +12 -0
- package/dist/src/runtime/browser/screenshot/renderers/html2canvas.d.ts.map +1 -0
- package/dist/src/runtime/browser/screenshot/renderers/html2canvas.js +136 -0
- package/dist/src/runtime/browser/screenshot/renderers/html2canvas.js.map +1 -0
- package/dist/src/runtime/browser/screenshot/targets.d.ts +6 -0
- package/dist/src/runtime/browser/screenshot/targets.d.ts.map +1 -0
- package/dist/src/runtime/browser/screenshot/targets.js +53 -0
- package/dist/src/runtime/browser/screenshot/targets.js.map +1 -0
- package/dist/src/runtime/browser/screenshot/utils.d.ts +9 -0
- package/dist/src/runtime/browser/screenshot/utils.d.ts.map +1 -0
- package/dist/src/runtime/browser/screenshot/utils.js +471 -0
- package/dist/src/runtime/browser/screenshot/utils.js.map +1 -0
- package/dist/src/runtime/browser/selector-discovery.d.ts +9 -0
- package/dist/src/runtime/browser/selector-discovery.d.ts.map +1 -0
- package/dist/src/runtime/browser/selector-discovery.js +218 -0
- package/dist/src/runtime/browser/selector-discovery.js.map +1 -0
- package/dist/src/runtime/browser/storage/session-storage.d.ts +13 -0
- package/dist/src/runtime/browser/storage/session-storage.d.ts.map +1 -0
- package/dist/src/runtime/browser/storage/session-storage.js +119 -0
- package/dist/src/runtime/browser/storage/session-storage.js.map +1 -0
- package/dist/src/runtime/browser/types.d.ts +96 -0
- package/dist/src/runtime/browser/types.d.ts.map +1 -0
- package/dist/src/runtime/browser/types.js +6 -0
- package/dist/src/runtime/browser/types.js.map +1 -0
- package/dist/src/runtime/browser/utils/console.d.ts +5 -0
- package/dist/src/runtime/browser/utils/console.d.ts.map +1 -0
- package/dist/src/runtime/browser/utils/console.js +54 -0
- package/dist/src/runtime/browser/utils/console.js.map +1 -0
- package/dist/src/runtime/browser/utils/environment.d.ts +3 -0
- package/dist/src/runtime/browser/utils/environment.d.ts.map +1 -0
- package/dist/src/runtime/browser/utils/environment.js +13 -0
- package/dist/src/runtime/browser/utils/environment.js.map +1 -0
- package/dist/src/runtime/browser/utils/errors.d.ts +3 -0
- package/dist/src/runtime/browser/utils/errors.d.ts.map +1 -0
- package/dist/src/runtime/browser/utils/errors.js +42 -0
- package/dist/src/runtime/browser/utils/errors.js.map +1 -0
- package/dist/src/runtime/browser/utils/number.d.ts +2 -0
- package/dist/src/runtime/browser/utils/number.d.ts.map +1 -0
- package/dist/src/runtime/browser/utils/number.js +2 -0
- package/dist/src/runtime/browser/utils/number.js.map +1 -0
- package/dist/src/runtime/browser/utils/object.d.ts +3 -0
- package/dist/src/runtime/browser/utils/object.d.ts.map +1 -0
- package/dist/src/runtime/browser/utils/object.js +9 -0
- package/dist/src/runtime/browser/utils/object.js.map +1 -0
- package/dist/src/runtime/browser/utils/sanitize.d.ts +2 -0
- package/dist/src/runtime/browser/utils/sanitize.d.ts.map +1 -0
- package/dist/src/runtime/browser/utils/sanitize.js +28 -0
- package/dist/src/runtime/browser/utils/sanitize.js.map +1 -0
- package/dist/src/runtime/browser/utils/time.d.ts +2 -0
- package/dist/src/runtime/browser/utils/time.d.ts.map +1 -0
- package/dist/src/runtime/browser/utils/time.js +7 -0
- package/dist/src/runtime/browser/utils/time.js.map +1 -0
- package/dist/src/runtime/chrome/constants.d.ts +5 -0
- package/dist/src/runtime/chrome/constants.d.ts.map +1 -0
- package/dist/src/runtime/chrome/constants.js +5 -0
- package/dist/src/runtime/chrome/constants.js.map +1 -0
- package/dist/src/runtime/chrome/cookies.d.ts +20 -0
- package/dist/src/runtime/chrome/cookies.d.ts.map +1 -0
- package/dist/src/runtime/chrome/cookies.js +139 -0
- package/dist/src/runtime/chrome/cookies.js.map +1 -0
- package/dist/src/runtime/chrome/diagnostics.d.ts +6 -0
- package/dist/src/runtime/chrome/diagnostics.d.ts.map +1 -0
- package/dist/src/runtime/chrome/diagnostics.js +49 -0
- package/dist/src/runtime/chrome/diagnostics.js.map +1 -0
- package/dist/src/runtime/chrome/focus.d.ts +2 -0
- package/dist/src/runtime/chrome/focus.d.ts.map +1 -0
- package/dist/src/runtime/chrome/focus.js +41 -0
- package/dist/src/runtime/chrome/focus.js.map +1 -0
- package/dist/src/runtime/chrome/launch.d.ts +23 -0
- package/dist/src/runtime/chrome/launch.d.ts.map +1 -0
- package/dist/src/runtime/chrome/launch.js +102 -0
- package/dist/src/runtime/chrome/launch.js.map +1 -0
- package/dist/src/runtime/chrome/puppeteer.d.ts +7 -0
- package/dist/src/runtime/chrome/puppeteer.d.ts.map +1 -0
- package/dist/src/runtime/chrome/puppeteer.js +87 -0
- package/dist/src/runtime/chrome/puppeteer.js.map +1 -0
- package/dist/src/runtime/chrome/reuse/constants.d.ts +4 -0
- package/dist/src/runtime/chrome/reuse/constants.d.ts.map +1 -0
- package/dist/src/runtime/chrome/reuse/constants.js +4 -0
- package/dist/src/runtime/chrome/reuse/constants.js.map +1 -0
- package/dist/src/runtime/chrome/reuse.d.ts +13 -0
- package/dist/src/runtime/chrome/reuse.d.ts.map +1 -0
- package/dist/src/runtime/chrome/reuse.js +183 -0
- package/dist/src/runtime/chrome/reuse.js.map +1 -0
- package/dist/src/runtime/chrome/session.d.ts +13 -0
- package/dist/src/runtime/chrome/session.d.ts.map +1 -0
- package/dist/src/runtime/chrome/session.js +47 -0
- package/dist/src/runtime/chrome/session.js.map +1 -0
- package/dist/src/runtime/chrome.d.ts +9 -0
- package/dist/src/runtime/chrome.d.ts.map +1 -0
- package/dist/src/runtime/chrome.js +10 -0
- package/dist/src/runtime/chrome.js.map +1 -0
- package/dist/src/runtime/cookies.d.ts +37 -0
- package/dist/src/runtime/cookies.d.ts.map +1 -0
- package/dist/src/runtime/cookies.js +592 -0
- package/dist/src/runtime/cookies.js.map +1 -0
- package/dist/src/runtime/devstack.d.ts +14 -0
- package/dist/src/runtime/devstack.d.ts.map +1 -0
- package/dist/src/runtime/devstack.js +174 -0
- package/dist/src/runtime/devstack.js.map +1 -0
- package/dist/src/runtime/devtools/background.d.ts +5 -0
- package/dist/src/runtime/devtools/background.d.ts.map +1 -0
- package/dist/src/runtime/devtools/background.js +109 -0
- package/dist/src/runtime/devtools/background.js.map +1 -0
- package/dist/src/runtime/devtools/cdp.d.ts +16 -0
- package/dist/src/runtime/devtools/cdp.d.ts.map +1 -0
- package/dist/src/runtime/devtools/cdp.js +392 -0
- package/dist/src/runtime/devtools/cdp.js.map +1 -0
- package/dist/src/runtime/devtools/config.d.ts +12 -0
- package/dist/src/runtime/devtools/config.d.ts.map +1 -0
- package/dist/src/runtime/devtools/config.js +78 -0
- package/dist/src/runtime/devtools/config.js.map +1 -0
- package/dist/src/runtime/devtools/constants.d.ts +10 -0
- package/dist/src/runtime/devtools/constants.d.ts.map +1 -0
- package/dist/src/runtime/devtools/constants.js +18 -0
- package/dist/src/runtime/devtools/constants.js.map +1 -0
- package/dist/src/runtime/devtools/diagnostics.d.ts +8 -0
- package/dist/src/runtime/devtools/diagnostics.d.ts.map +1 -0
- package/dist/src/runtime/devtools/diagnostics.js +189 -0
- package/dist/src/runtime/devtools/diagnostics.js.map +1 -0
- package/dist/src/runtime/devtools/oauth.d.ts +9 -0
- package/dist/src/runtime/devtools/oauth.d.ts.map +1 -0
- package/dist/src/runtime/devtools/oauth.js +130 -0
- package/dist/src/runtime/devtools/oauth.js.map +1 -0
- package/dist/src/runtime/devtools/types.d.ts +108 -0
- package/dist/src/runtime/devtools/types.d.ts.map +1 -0
- package/dist/src/runtime/devtools/types.js +2 -0
- package/dist/src/runtime/devtools/types.js.map +1 -0
- package/dist/src/runtime/devtools.d.ts +8 -0
- package/dist/src/runtime/devtools.d.ts.map +1 -0
- package/dist/src/runtime/devtools.js +9 -0
- package/dist/src/runtime/devtools.js.map +1 -0
- package/dist/src/runtime/next-devtools.d.ts +2 -0
- package/dist/src/runtime/next-devtools.d.ts.map +1 -0
- package/dist/src/runtime/next-devtools.js +72 -0
- package/dist/src/runtime/next-devtools.js.map +1 -0
- package/dist/src/runtime/screenshot.d.ts +78 -0
- package/dist/src/runtime/screenshot.d.ts.map +1 -0
- package/dist/src/runtime/screenshot.js +232 -0
- package/dist/src/runtime/screenshot.js.map +1 -0
- package/dist/src/runtime/scripts.d.ts +16 -0
- package/dist/src/runtime/scripts.d.ts.map +1 -0
- package/dist/src/runtime/scripts.js +110 -0
- package/dist/src/runtime/scripts.js.map +1 -0
- package/dist/src/runtime/session.d.ts +64 -0
- package/dist/src/runtime/session.d.ts.map +1 -0
- package/dist/src/runtime/session.js +205 -0
- package/dist/src/runtime/session.js.map +1 -0
- package/dist/src/runtime/smoke.d.ts +36 -0
- package/dist/src/runtime/smoke.d.ts.map +1 -0
- package/dist/src/runtime/smoke.js +417 -0
- package/dist/src/runtime/smoke.js.map +1 -0
- package/dist/src/runtime/url.d.ts +10 -0
- package/dist/src/runtime/url.d.ts.map +1 -0
- package/dist/src/runtime/url.js +147 -0
- package/dist/src/runtime/url.js.map +1 -0
- package/dist/src/screenshot-hooks.d.ts +13 -0
- package/dist/src/screenshot-hooks.d.ts.map +1 -0
- package/dist/src/screenshot-hooks.js +56 -0
- package/dist/src/screenshot-hooks.js.map +1 -0
- package/dist/src/shared/env.d.ts +23 -0
- package/dist/src/shared/env.d.ts.map +1 -0
- package/dist/src/shared/env.js +38 -0
- package/dist/src/shared/env.js.map +1 -0
- package/dist/src/shared/index.d.ts +211 -0
- package/dist/src/shared/index.d.ts.map +1 -0
- package/dist/src/shared/index.js +73 -0
- package/dist/src/shared/index.js.map +1 -0
- package/dist/src/shared/node.d.ts +12 -0
- package/dist/src/shared/node.d.ts.map +1 -0
- package/dist/src/shared/node.js +67 -0
- package/dist/src/shared/node.js.map +1 -0
- package/dist/src/token.d.ts +4 -0
- package/dist/src/token.d.ts.map +1 -0
- package/dist/src/token.js +58 -0
- package/dist/src/token.js.map +1 -0
- package/dist/src/types.d.ts +17 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/util/app-label.d.ts +5 -0
- package/dist/src/util/app-label.d.ts.map +1 -0
- package/dist/src/util/app-label.js +21 -0
- package/dist/src/util/app-label.js.map +1 -0
- package/dist/src/util/errors.d.ts +9 -0
- package/dist/src/util/errors.d.ts.map +1 -0
- package/dist/src/util/errors.js +56 -0
- package/dist/src/util/errors.js.map +1 -0
- package/dist/src/util/path.d.ts +3 -0
- package/dist/src/util/path.d.ts.map +1 -0
- package/dist/src/util/path.js +6 -0
- package/dist/src/util/path.js.map +1 -0
- package/dist/src/util/regex.d.ts +4 -0
- package/dist/src/util/regex.d.ts.map +1 -0
- package/dist/src/util/regex.js +5 -0
- package/dist/src/util/regex.js.map +1 -0
- package/dist/src/util/time.d.ts +3 -0
- package/dist/src/util/time.d.ts.map +1 -0
- package/dist/src/util/time.js +7 -0
- package/dist/src/util/time.js.map +1 -0
- package/package.json +86 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.1.0 — 2025-11-22 (Initial release)
|
|
4
|
+
|
|
5
|
+
### Highlights
|
|
6
|
+
- **Agent-ready CLI + daemon** to drive a controlled Chrome window, reuse an authenticated tab, stream DevTools telemetry, and reconnect after hot reloads.
|
|
7
|
+
- **Session & smoke automation**: `open`, `sessions`, and `smoke --routes` commands with configurable route presets, readiness-based timeouts, and console/network buffering.
|
|
8
|
+
- **Diagnostics-first runs**: Next.js MCP (`/_next/mcp`) error summaries with source-mapped stacks, overlay/Puppeteer fallbacks, cookie priming, and TLS health checks so failures surface immediately.
|
|
9
|
+
- **Screenshots & selectors**: JPEG capture via Puppeteer/HTML renderer plus selector discovery helpers for downstream automation.
|
|
10
|
+
- **OAuth & TLS helpers**: pluggable OAuth automation script hook (Twitter example) and `sweetlink trust-ca` to install the mkcert CA for daemon HTTPS.
|
|
11
|
+
- **Browser runtime export**: `sweetlink/runtime/browser` for in-app clients (status callbacks, reconnect, storage adapters), demonstrated by the bundled demo app with live session indicator.
|
|
12
|
+
- **Config & docs**: project-walking `sweetlink.json` with env overrides, neutral example config, MIT license, and refreshed README/browser guide.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Peter Steinberger
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
# SweetLink 🍭
|
|
2
|
+
|
|
3
|
+
SweetLink is the agent-ready way to "connect your agent to your web app. Like Playwright, but it works in your current tab. Close the loop." It drives a real browser session through the SweetLink daemon so you can authenticate, capture screenshots, run smoke tests, and gather DevTools telemetry without wiring up a headless automation stack.
|
|
4
|
+
|
|
5
|
+
> **Note:** This README is the canonical copy. When updating docs for the public `steipete/sweetlink` repository, edit here first and then sync the changes.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- **Session management** – list active sessions, inspect console/network buffers, and reconnect after hot reloads.
|
|
10
|
+
- **Controlled Chrome launch** – spin up a DevTools-enabled browser, sync cookies from your main profile, and auto-approve the Twitter OAuth consent flow.
|
|
11
|
+
- **Smoke tests** – sweep configurable route presets (dashboard, reports, search, billing, settings) and flag authentication or runtime errors.
|
|
12
|
+
- **Screenshots & selectors** – capture JPEGs via Puppeteer/HTML renderers and discover DOM selectors for automation.
|
|
13
|
+
- **DevTools telemetry** – stream console/network logs to disk, dump diagnostics when a session fails to register, call Next.js DevTools (`/_next/mcp`) for structured error summaries, and click the OAuth authorize button on demand.
|
|
14
|
+
|
|
15
|
+
## Prerequisites
|
|
16
|
+
|
|
17
|
+
- Node.js 22+
|
|
18
|
+
- `pnpm` (managed via Corepack)
|
|
19
|
+
- TLS requirements: `brew install mkcert nss`
|
|
20
|
+
- SweetLink daemon (`apps/sweetlink/daemon`) running locally or via `pnpm sweetlink:daemon`
|
|
21
|
+
- Trust the local certificate once: `pnpm sweetlink trust-ca`
|
|
22
|
+
|
|
23
|
+
## Installation
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
pnpm install
|
|
27
|
+
pnpm run build
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
> Working from the Sweetistics monorepo? Follow the workspace-specific guide in `docs/cli/sweetlink.md` instead of this README.
|
|
31
|
+
|
|
32
|
+
## Usage
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
pnpm sweetlink --help
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Common workflows:
|
|
39
|
+
|
|
40
|
+
- `pnpm sweetlink open --controlled --path /dashboard` – launch/reuse the controlled Chrome window.
|
|
41
|
+
- `pnpm sweetlink open --url http://localhost:4100/dashboard` – target a non-default host/port for one-off runs.
|
|
42
|
+
- `pnpm sweetlink sessions` – view active sessions (codename, heartbeat, socket state, buffered console errors).
|
|
43
|
+
- `pnpm sweetlink smoke --routes main` – sweep the configured dashboard/search/settings routes.
|
|
44
|
+
- `pnpm sweetlink devtools authorize` – force-click the OAuth consent button when Twitter prompts.
|
|
45
|
+
|
|
46
|
+
When a session fails to register, the CLI now emits a DevTools snapshot and Puppeteer scrape (overlay/body text) so build/runtime errors surface immediately.
|
|
47
|
+
|
|
48
|
+
#### Timeouts & readiness
|
|
49
|
+
|
|
50
|
+
Every `sweetlink open` waits until one of three things happens:
|
|
51
|
+
|
|
52
|
+
1. The controlled tab re-registers with the daemon (happy path).
|
|
53
|
+
2. The page reports it has finished loading but SweetLink still isn’t online, in which case we dump DevTools + Next.js diagnostics immediately.
|
|
54
|
+
3. The command exceeds `--timeout` seconds (default `45`) and bails with the same diagnostics. Increase `--timeout <seconds>` if you intentionally run on a slow dev stack.
|
|
55
|
+
|
|
56
|
+
Because the readiness check follows the page rather than a fixed delay, healthy sessions attach quickly while failures are surfaced within the configured timeout window.
|
|
57
|
+
|
|
58
|
+
#### Next.js DevTools errors
|
|
59
|
+
|
|
60
|
+
If the target app exposes the Next.js MCP endpoint (the default for `pnpm next dev`), SweetLink automatically calls `/_next/mcp` → `get_errors` whenever a navigation looks suspicious. The CLI prints the same markdown summary you would see in the Next.js overlay—complete with source-mapped stack traces—then falls back to the existing overlay/Puppeteer scraping for non-Next projects. No extra configuration is required as long as `next-devtools` is registered in `config/mcporter.json` (it is by default in the Sweetistics repo).
|
|
61
|
+
|
|
62
|
+
### TLS onboarding
|
|
63
|
+
|
|
64
|
+
SweetLink defaults to `https://localhost:4455` for daemon traffic. Run `pnpm sweetlink trust-ca` once per machine to install the mkcert certificate authority, then open `https://localhost:4455` in the browser profile you plan to automate and accept the prompt. The demo app surfaces a “Daemon TLS” banner—if it shows “not trusted,” click “Open Daemon Certificate,” accept the warning, then hit “Retry Check” before enabling SweetLink.
|
|
65
|
+
|
|
66
|
+
**Heads-up:** the daemon reuses the same certificate/key stored in `~/.sweetlink/certs`, but browsers remember trust decisions per profile. The first time a profile (or a remote-debugging instance) hits `https://localhost:4455`, expect one warning screen—accept it once and the profile stays trusted.
|
|
67
|
+
|
|
68
|
+
## Architecture
|
|
69
|
+
|
|
70
|
+
SweetLink consists of two cooperating pieces:
|
|
71
|
+
|
|
72
|
+
- **CLI** – a Node.js client that parses your commands (`open`, `smoke`, `sessions`, etc.), reads `sweetlink.json`, and establishes a control session with your browser.
|
|
73
|
+
- **Daemon** – a long-lived service (`pnpm sweetlink:daemon`) that launches or attaches to a DevTools-enabled Chrome instance, forwards console/network telemetry, and executes remote evaluations on behalf of the CLI.
|
|
74
|
+
|
|
75
|
+
The typical flow looks like this:
|
|
76
|
+
|
|
77
|
+
1. You start the daemon once per workstation. It spins up (or reconnects to) Chromium with the remote debugging port exposed and registers a secure WebSocket endpoint.
|
|
78
|
+
2. Running `pnpm sweetlink open --controlled` prompts the CLI to locate `sweetlink.json`, resolve runtime defaults (hosts, smoke routes, OAuth automation scripts), and request a session token from the daemon using your admin key.
|
|
79
|
+
3. The daemon launches the controlled browser window (or reuses the existing one), hydrates it with cookies from your configured `cookieMappings`, and signals the CLI when the target page is healthy (`healthChecks.paths` + optional `servers` checks).
|
|
80
|
+
4. Commands like `sweetlink smoke` or `sweetlink devtools authorize` stream instructions to the daemon. The daemon executes them via DevTools Protocol or Puppeteer, shipping back console output, screenshots, and failure diagnostics in real time.
|
|
81
|
+
5. When the CLI exits, the daemon keeps the browser alive so the next command can reuse the authenticated context; run `pnpm sweetlink sessions` to inspect or detach lingering sessions.
|
|
82
|
+
|
|
83
|
+
Because the CLI and daemon communicate over secure WebSockets, you can run the daemon locally or on a remote VM. Set `daemonUrl` in `sweetlink.json` (or `SWEETLINK_DAEMON_URL`) to tunnel to the remote instance, while keeping the same CLI workflows.
|
|
84
|
+
|
|
85
|
+
## Configuration
|
|
86
|
+
|
|
87
|
+
### Generic usage
|
|
88
|
+
|
|
89
|
+
SweetLink resolves defaults from (highest priority first):
|
|
90
|
+
|
|
91
|
+
1. CLI flags (e.g. `--url`, `--app-url`, `--daemon-url`, `--port`)
|
|
92
|
+
2. `sweetlink.json` (or `sweetlink.config.json`) located in or above the current working directory (SweetLink walks up parent directories until it finds one)
|
|
93
|
+
3. Environment variables (`SWEETLINK_APP_URL`, `SWEETLINK_DAEMON_URL`, `SWEETLINK_PROD_URL`)
|
|
94
|
+
4. Fallback `http://localhost:3000`
|
|
95
|
+
|
|
96
|
+
Start by copying `sweetlink.example.json` from the repo root. It ships with a neutral baseline config:
|
|
97
|
+
|
|
98
|
+
```json
|
|
99
|
+
{
|
|
100
|
+
"appUrl": "http://localhost:4100",
|
|
101
|
+
"prodUrl": "https://demo.acme.app",
|
|
102
|
+
"daemonUrl": "https://localhost:4455",
|
|
103
|
+
"port": 4100,
|
|
104
|
+
"healthChecks": {
|
|
105
|
+
"paths": ["/api/health"]
|
|
106
|
+
},
|
|
107
|
+
"cookieMappings": [
|
|
108
|
+
{
|
|
109
|
+
"hosts": ["example.dev", "*.example.dev", "localhost", "127.0.0.1"],
|
|
110
|
+
"origins": [
|
|
111
|
+
"https://app.example.dev",
|
|
112
|
+
"https://auth.example.dev",
|
|
113
|
+
"https://api.example.dev"
|
|
114
|
+
]
|
|
115
|
+
}
|
|
116
|
+
]
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Place the config file in your project root (or any parent directory). With the file in place, `pnpm sweetlink open --controlled --foreground` will automatically point at `http://localhost:4100` unless an explicit `--url`/`--app-url` is provided. The CLI also exposes `--port` to temporarily rewrite the local host port without editing the JSON file. `healthChecks.paths` lets you point the readiness probe at specific endpoints (for example `/api/health`). `cookieMappings` declares extra origins to harvest cookies from (such as OAuth provider cookies when you reuse a signed-in Chrome profile). `smokeRoutes.defaults` overrides the built-in route sweep, and `smokeRoutes.presets` lets you register new comma-delimited shortcuts (the built-ins `main`, `settings`, `billing-only`, and `pulse-only` remain available). Hosts accept plain domains or wildcard-prefixed entries (`*.example.dev`), and origins must be fully-qualified URLs. Omit `daemonUrl`, `prodUrl`, `healthChecks`, `smokeRoutes`, or `cookieMappings` to keep SweetLink’s defaults for those targets.
|
|
121
|
+
|
|
122
|
+
- Update any `pnpm --filter` commands, tmux helpers, or scripts that referenced the old scope (for example `pnpm --filter sweetlink run build`).
|
|
123
|
+
- Prefer the new environment variables for admin keys: `SWEETLINK_LOCAL_ADMIN_API_KEY` (dev shells) and `SWEETLINK_ADMIN_API_KEY` (prod shells). Legacy `SWEETISTICS_*` vars continue to work, but plan to remove them once every integration is updated.
|
|
124
|
+
- Copy the neutral `sweetlink.example.json` from the repo root when onboarding SweetLink into another project so you start from generic hostnames/domains instead of the monorepo’s internal defaults.
|
|
125
|
+
|
|
126
|
+
### Config keys at a glance
|
|
127
|
+
|
|
128
|
+
- `appLabel` – Friendly display name used in CLI help, prompts, and error messages. Set it via config, `--app-label`, or the `SWEETLINK_APP_LABEL` env; defaults to “your application”.
|
|
129
|
+
- `appUrl` – Default URL SweetLink opens in dev mode. Pair it with `port` when your local server is not on 3000. CLI flags (`--url`, `--app-url`) or `SWEETLINK_APP_URL` override it.
|
|
130
|
+
- `prodUrl` – Base URL for `--env prod` runs (smoke tests, screenshots). Falls back to the same origin as `appUrl` when omitted or when `SWEETLINK_PROD_URL` is unset.
|
|
131
|
+
- `daemonUrl` – Location of the SweetLink daemon. Defaults to `https://localhost:4455`; override when you run the daemon remotely.
|
|
132
|
+
- `adminKey` – Admin API key used when the CLI requests short-lived session tokens. Provide it via config/`--admin-key`, `SWEETLINK_LOCAL_ADMIN_API_KEY` (preferred for dev), `SWEETLINK_ADMIN_API_KEY` (prod), or the legacy `SWEETISTICS_*` variables for backwards compatibility.
|
|
133
|
+
- `port` – Injected into `appUrl` when no explicit host is provided. Handy for per-service configs (`4100`, `5173`, etc.).
|
|
134
|
+
- `healthChecks.paths` – Additional paths the CLI and watchdog probe before assuming the app is healthy. Include JSON APIs or custom `/healthz` endpoints to catch silent failures.
|
|
135
|
+
- `cookieMappings` – List of `{ hosts, origins }` entries that teach SweetLink which Chrome profiles to harvest cookies from. Map every hostname your app serves (including wildcards) to the origins you need (auth providers, REST APIs, CDNs). SweetLink combines these with the primary origin for the target URL; no extra domains are assumed automatically.
|
|
136
|
+
- `smokeRoutes.defaults` – Ordered array of routes visited by `pnpm sweetlink smoke`. Include additional views or dashboards specific to your app.
|
|
137
|
+
- `smokeRoutes.presets` – Named presets (`{ "admin": ["admin/users", "admin/settings"] }`) that become `pnpm sweetlink smoke --routes admin`.
|
|
138
|
+
- `servers` – Optional list of commands that start/check your local server per environment. Useful when you want SweetLink to boot your app automatically before running automation.
|
|
139
|
+
- `oauthScript` – Absolute or relative path to an OAuth automation script (ESM module). When set, SweetLink loads the module at runtime and calls its `authorize(context)` export to approve third-party consent dialogs.
|
|
140
|
+
|
|
141
|
+
SweetLink reads the config once at start-up. When you edit `sweetlink.json` rerun the CLI command to pick up the new defaults. Multiple projects on the same machine can keep their own config files; SweetLink stops at the first file it finds while walking up the directory tree, so place project-specific configs as close to the repo root as possible.
|
|
142
|
+
See `apps/sweetlink/docs/config.md` for a full configuration reference (including environment overrides).
|
|
143
|
+
|
|
144
|
+
### OAuth automation scripts
|
|
145
|
+
|
|
146
|
+
Out of the box SweetLink no longer ships opinionated OAuth heuristics. Instead you can point `oauthScript` at a small ESM module that exports an `authorize(context)` function. The helper receives a `SweetLinkOauthAuthorizeContext` with DevTools and Puppeteer helpers, so you can fully control how SweetLink approves third-party consent prompts. A ready-to-use implementation for Twitter/X lives at `apps/sweetlink/examples/oauth/twitter-oauth-automation.ts`; copy it into your project (or tweak it) and set `oauthScript` to that path to re-enable the previous behaviour. If the script is omitted, SweetLink will log that auto-authorization is disabled and leave the prompt untouched.
|
|
147
|
+
|
|
148
|
+
You can also specify the script through runtime inputs:
|
|
149
|
+
|
|
150
|
+
- CLI flag: `pnpm sweetlink open --controlled --oauth-script ./path/to/oauth-handler.ts`
|
|
151
|
+
- Environment variable: `SWEETLINK_OAUTH_SCRIPT=./path/to/oauth-handler.ts pnpm sweetlink open --controlled …`
|
|
152
|
+
|
|
153
|
+
SweetLink resolves paths relative to the current working directory (or uses absolute paths unchanged). Configuration order still applies: CLI flag → config file `oauthScript` → `SWEETLINK_OAUTH_SCRIPT` env → disabled.
|
|
154
|
+
|
|
155
|
+
Each automation module must export a single async function:
|
|
156
|
+
|
|
157
|
+
```ts
|
|
158
|
+
import type { SweetLinkOauthAutomation } from 'sweetlink';
|
|
159
|
+
|
|
160
|
+
const automation: SweetLinkOauthAutomation = {
|
|
161
|
+
async authorize(context) {
|
|
162
|
+
// use context.fetchTabs / context.evaluateInDevToolsTab / context.connectPuppeteer
|
|
163
|
+
// to locate and click the consent button
|
|
164
|
+
return { handled: false, reason: 'button-not-found' };
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
export default automation;
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
See the Twitter example for a complete script that works with X’s current consent UI (stacked DOM selectors, login fallback detection, Puppeteer retries).
|
|
172
|
+
|
|
173
|
+
## Browser Runtime API
|
|
174
|
+
|
|
175
|
+
SweetLink’s browser client is now a first-class export. Instead of copying 1,500+ lines of glue from the Sweetistics repo, pull in the runtime directly:
|
|
176
|
+
|
|
177
|
+
```ts
|
|
178
|
+
import {
|
|
179
|
+
createSessionStorageAdapter,
|
|
180
|
+
createSweetLinkClient,
|
|
181
|
+
} from 'sweetlink/runtime/browser';
|
|
182
|
+
|
|
183
|
+
const storage = createSessionStorageAdapter();
|
|
184
|
+
|
|
185
|
+
export const sweetLinkClient = createSweetLinkClient({
|
|
186
|
+
storage,
|
|
187
|
+
status: {
|
|
188
|
+
onStatusSnapshot: (snapshot) => setSweetLinkStatus(snapshot),
|
|
189
|
+
},
|
|
190
|
+
autoReconnectHandshake: () => fetch('/api/admin/sweetlink/remote-handshake', { method: 'POST' }).then((res) => res.json()),
|
|
191
|
+
});
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
The runtime mirrors everything we ship in production: websocket lifecycle, console buffering, screenshot hooks/renderers, selector discovery, and auto-reconnect with stored-session resume. Tests can import `sweetLinkBrowserTestHelpers` to reuse `createHookRunner`, `stripDataUrlPrefix`, and `commandSelectorSummary` without reaching into private modules.
|
|
195
|
+
|
|
196
|
+
👉 See [`apps/sweetlink/browser.md`](./browser.md) for a step-by-step integration guide (handshake endpoint, custom storage adapters, DOM events) plus a reference implementation you can copy into other apps.
|
|
197
|
+
|
|
198
|
+
## Example App
|
|
199
|
+
|
|
200
|
+
Looking for a minimal integration? Launch the demo web app under `apps/sweetlink/examples/basic-web`:
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
cd examples/basic-web
|
|
204
|
+
pnpm dev
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
The Vite dev server auto-reloads whenever you tweak the example UI. The site exposes a single page with an “Enable SweetLink” button. Clicking it calls the included `/api/sweetlink/handshake` route, registers with your locally running daemon, and keeps the socket alive so you can attach via `pnpm sweetlink console demo`. The example bundles a small browser client that handles the `register`, `heartbeat`, and `runScript` command flow so you can verify end-to-end behaviour without touching your production app. A status chip at the top of the page shows the active SweetLink codename so developers can confirm which CLI session is currently linked.
|
|
208
|
+
|
|
209
|
+
Once attached, experiment with commands such as:
|
|
210
|
+
|
|
211
|
+
1. `pnpm sweetlink run-js demo --code "demo.updateKpi(87)"` – change the KPI badge value.
|
|
212
|
+
2. `pnpm sweetlink run-js demo --code "demo.toggleBadge()"` – flip the feature badge between `beta` and `stable`.
|
|
213
|
+
3. `pnpm sweetlink screenshot demo --selector "#screenshot-card"` – capture the pre-styled analytics card.
|
|
214
|
+
|
|
215
|
+
*Tip:* Every time you use a copy icon, the demo logs a “Copied … command” entry in the status panel. Tail them from the CLI via `pnpm sweetlink devtools console --tail 50` to confirm clipboard-driven workflows are firing.
|
|
216
|
+
|
|
217
|
+
Scroll further down to the **Automation prompt library** for ready-to-paste prompts you can drop into Codex, Claude, or Cursor once a session is live.
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
Keep watching the status log (and DevTools tail) while you automate—the demo surfaces every clipboard copy, handshake, and CLI action there so you know exactly what ran.
|
|
221
|
+
|
|
222
|
+
## Local Checks
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
pnpm lint
|
|
226
|
+
pnpm test
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## License
|
|
230
|
+
|
|
231
|
+
SweetLink (CLI, daemon, and shared packages) is licensed under the MIT License. See `apps/sweetlink/LICENSE` for the full text.
|
|
232
|
+
|
|
233
|
+
## TLS Onboarding
|
|
234
|
+
|
|
235
|
+
SweetLink’s daemon defaults to `https://localhost:4455`. Run `pnpm sweetlink trust-ca` once per machine to install the mkcert certificate authority, then visit `https://localhost:4455` in the browser profile you plan to automate and accept the prompt. The example app (run `pnpm dev` inside `examples/basic-web`) now performs a preflight check via `/api/sweetlink/status`: it blocks the “Enable SweetLink” button until the daemon is reachable and the certificate is trusted, with quick actions to open the daemon URL or retry the check.
|
|
236
|
+
|
|
237
|
+
When automating, you can poll `/api/sweetlink/status` the same way—only proceed when `reachable` and `tlsTrusted` are both true.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface CodenameOptions {
|
|
2
|
+
readonly slugFactory?: () => string;
|
|
3
|
+
readonly saltFactory?: () => string;
|
|
4
|
+
readonly timestampFactory?: () => number;
|
|
5
|
+
}
|
|
6
|
+
export declare function generateSessionCodename(existing: Iterable<string>, options?: CodenameOptions): string;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=codename.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codename.d.ts","sourceRoot":"","sources":["../../../daemon/src/codename.ts"],"names":[],"mappings":"AAGA,UAAU,eAAe;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC;IACpC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC;IACpC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,MAAM,CAAC;CAC1C;AA0BD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,GAAE,eAAoB,GAAG,MAAM,CA0BzG"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { randomInt } from 'node:crypto';
|
|
2
|
+
import { generateSlug } from 'random-word-slugs';
|
|
3
|
+
const MAX_ATTEMPTS = 12;
|
|
4
|
+
const ensureNonEmptyString = (value, label) => {
|
|
5
|
+
if (typeof value !== 'string' || value.trim().length === 0) {
|
|
6
|
+
throw new TypeError(`${label} must return a non-empty string`);
|
|
7
|
+
}
|
|
8
|
+
return value;
|
|
9
|
+
};
|
|
10
|
+
const defaultSlugFactory = () => {
|
|
11
|
+
const slug = generateSlug(2, {
|
|
12
|
+
partsOfSpeech: ['adjective', 'noun'],
|
|
13
|
+
format: 'kebab',
|
|
14
|
+
});
|
|
15
|
+
return ensureNonEmptyString(slug, 'slugFactory');
|
|
16
|
+
};
|
|
17
|
+
const defaultSaltFactory = () => randomInt(36 ** 2)
|
|
18
|
+
.toString(36)
|
|
19
|
+
.padStart(2, '0');
|
|
20
|
+
const defaultTimestampFactory = () => Date.now();
|
|
21
|
+
export function generateSessionCodename(existing, options = {}) {
|
|
22
|
+
const used = new Set(existing);
|
|
23
|
+
const slugFactory = options.slugFactory ?? defaultSlugFactory;
|
|
24
|
+
const saltFactory = options.saltFactory ?? defaultSaltFactory;
|
|
25
|
+
const timestampFactory = options.timestampFactory ?? defaultTimestampFactory;
|
|
26
|
+
for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt += 1) {
|
|
27
|
+
const candidate = ensureNonEmptyString(slugFactory(), 'slugFactory');
|
|
28
|
+
if (!used.has(candidate)) {
|
|
29
|
+
return candidate;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const withSalt = `${ensureNonEmptyString(slugFactory(), 'slugFactory')}-${ensureNonEmptyString(saltFactory(), 'saltFactory')}`;
|
|
33
|
+
if (!used.has(withSalt)) {
|
|
34
|
+
return withSalt;
|
|
35
|
+
}
|
|
36
|
+
const timestamp = timestampFactory();
|
|
37
|
+
if (typeof timestamp !== 'number' || Number.isNaN(timestamp)) {
|
|
38
|
+
throw new TypeError('timestampFactory must return a numeric timestamp');
|
|
39
|
+
}
|
|
40
|
+
return `${withSalt}-${Math.abs(timestamp).toString(36).slice(-2)}`;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=codename.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codename.js","sourceRoot":"","sources":["../../../daemon/src/codename.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAQjD,MAAM,YAAY,GAAG,EAAE,CAAC;AAExB,MAAM,oBAAoB,GAAG,CAAC,KAAc,EAAE,KAAa,EAAU,EAAE;IACrE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,iCAAiC,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,GAAW,EAAE;IACtC,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,EAAE;QAC3B,aAAa,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC;QACpC,MAAM,EAAE,OAAO;KAChB,CAAC,CAAC;IACH,OAAO,oBAAoB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAC9B,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;KACf,QAAQ,CAAC,EAAE,CAAC;KACZ,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAEtB,MAAM,uBAAuB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AAEjD,MAAM,UAAU,uBAAuB,CAAC,QAA0B,EAAE,UAA2B,EAAE;IAC/F,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/B,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,kBAAkB,CAAC;IAC9D,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,kBAAkB,CAAC;IAC9D,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,uBAAuB,CAAC;IAE7E,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,YAAY,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QAC3D,MAAM,SAAS,GAAG,oBAAoB,CAAC,WAAW,EAAE,EAAE,aAAa,CAAC,CAAC;QACrE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACzB,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,oBAAoB,CAAC,WAAW,EAAE,EAAE,aAAa,CAAC,IAAI,oBAAoB,CAC5F,WAAW,EAAE,EACb,aAAa,CACd,EAAE,CAAC;IACJ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;IACrC,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,SAAS,CAAC,kDAAkD,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,GAAG,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../daemon/src/index.ts"],"names":[],"mappings":";AAEA,OAAO,eAAe,CAAC"}
|