@agentrhq/webcmd 0.2.5 → 0.3.1
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/README.md +13 -2
- package/cli-manifest.json +217 -13
- package/clis/_shared/site-auth.js +3 -3
- package/clis/_shared/site-auth.test.js +4 -4
- package/clis/chatgpt/ask.js +1 -1
- package/clis/chatgpt/ask.test.js +11 -0
- package/clis/chatgpt/commands.test.js +102 -1
- package/clis/chatgpt/deep-research-result.js +45 -3
- package/clis/chatgpt/image.js +22 -2
- package/clis/chatgpt/project-file-add.js +24 -1
- package/clis/chatgpt/utils.js +258 -52
- package/clis/chatgpt/utils.test.js +259 -1
- package/clis/claude/ask.js +21 -1
- package/clis/facebook/feed.js +110 -24
- package/clis/facebook/feed.test.js +62 -0
- package/clis/facebook/search.js +185 -38
- package/clis/facebook/search.test.js +95 -50
- package/clis/instagram/explore.js +30 -12
- package/clis/instagram/explore.test.js +77 -0
- package/clis/instagram/post.js +14 -1
- package/clis/instagram/reel.js +13 -1
- package/clis/linkedin/company.js +153 -0
- package/clis/linkedin/company.test.js +111 -0
- package/clis/linkedin/connections.js +135 -0
- package/clis/linkedin/connections.test.js +141 -0
- package/clis/mercury/reimbursement-draft.js +12 -1
- package/clis/slock/whoami.test.js +2 -2
- package/clis/twitter/article-evaluate.test.js +27 -0
- package/clis/twitter/article.js +73 -16
- package/clis/twitter/article.test.js +209 -0
- package/clis/twitter/download.js +6 -1
- package/clis/twitter/post.js +14 -1
- package/clis/twitter/profile.js +1 -1
- package/clis/twitter/profile.test.js +8 -0
- package/clis/twitter/quote.js +11 -1
- package/clis/twitter/reply.js +11 -1
- package/dist/src/browser/base-page.d.ts +26 -0
- package/dist/src/browser/base-page.js +23 -8
- package/dist/src/browser/base-page.test.js +45 -12
- package/dist/src/browser/command-catalog.d.ts +6 -0
- package/dist/src/browser/command-catalog.js +259 -0
- package/dist/src/browser/command-catalog.test.d.ts +1 -0
- package/dist/src/browser/command-catalog.test.js +79 -0
- package/dist/src/browser/daemon-client.d.ts +2 -1
- package/dist/src/browser/runtime/local-cloak/actions.js +4 -1
- package/dist/src/browser/runtime/local-cloak/darwin-background-launch.d.ts +17 -0
- package/dist/src/browser/runtime/local-cloak/darwin-background-launch.js +106 -0
- package/dist/src/browser/runtime/local-cloak/darwin-background-launch.test.d.ts +1 -0
- package/dist/src/browser/runtime/local-cloak/darwin-background-launch.test.js +65 -0
- package/dist/src/browser/runtime/local-cloak/provider.test.js +36 -0
- package/dist/src/browser/runtime/local-cloak/session-manager.d.ts +10 -2
- package/dist/src/browser/runtime/local-cloak/session-manager.js +25 -9
- package/dist/src/browser/runtime/local-cloak/session-manager.test.js +36 -0
- package/dist/src/browser/target-resolver.d.ts +1 -0
- package/dist/src/browser/target-resolver.js +99 -4
- package/dist/src/browser/target-resolver.test.js +141 -1
- package/dist/src/build-manifest.d.ts +6 -0
- package/dist/src/build-manifest.js +18 -1
- package/dist/src/build-manifest.test.js +57 -1
- package/dist/src/builtin-command-surface.d.ts +9 -0
- package/dist/src/builtin-command-surface.js +16 -0
- package/dist/src/check-hosted-contract.test.d.ts +1 -0
- package/dist/src/check-hosted-contract.test.js +56 -0
- package/dist/src/cli.js +63 -110
- package/dist/src/cli.test.js +82 -6
- package/dist/src/command-presentation.d.ts +95 -0
- package/dist/src/command-presentation.js +486 -0
- package/dist/src/command-presentation.test.d.ts +1 -0
- package/dist/src/command-presentation.test.js +97 -0
- package/dist/src/command-surface.d.ts +43 -0
- package/dist/src/command-surface.js +205 -0
- package/dist/src/command-surface.test.d.ts +1 -0
- package/dist/src/command-surface.test.js +406 -0
- package/dist/src/commanderAdapter.d.ts +5 -1
- package/dist/src/commanderAdapter.js +12 -55
- package/dist/src/commanderAdapter.test.js +15 -3
- package/dist/src/commands/auth.js +3 -2
- package/dist/src/commands/auth.test.js +6 -6
- package/dist/src/community-plugin-sync.d.ts +11 -0
- package/dist/src/community-plugin-sync.js +138 -0
- package/dist/src/community-plugin-sync.test.d.ts +1 -0
- package/dist/src/community-plugin-sync.test.js +123 -0
- package/dist/src/completion-fast.d.ts +4 -4
- package/dist/src/completion-fast.js +15 -34
- package/dist/src/completion-shared.d.ts +4 -0
- package/dist/src/completion-shared.js +38 -0
- package/dist/src/completion.js +3 -27
- package/dist/src/completion.test.js +31 -2
- package/dist/src/docs-sync-review-cli.test.d.ts +1 -0
- package/dist/src/docs-sync-review-cli.test.js +322 -0
- package/dist/src/docs-sync-review.d.ts +117 -0
- package/dist/src/docs-sync-review.js +475 -0
- package/dist/src/docs-sync-review.test.d.ts +1 -0
- package/dist/src/docs-sync-review.test.js +324 -0
- package/dist/src/errors.d.ts +12 -3
- package/dist/src/errors.js +11 -7
- package/dist/src/errors.test.js +14 -1
- package/dist/src/execution.d.ts +1 -2
- package/dist/src/execution.js +4 -45
- package/dist/src/generate-release-notes-cli.test.js +11 -1
- package/dist/src/help.d.ts +4 -0
- package/dist/src/help.js +50 -255
- package/dist/src/help.test.js +27 -1
- package/dist/src/hosted/args.d.ts +4 -0
- package/dist/src/hosted/args.js +4 -0
- package/dist/src/hosted/args.test.d.ts +1 -0
- package/dist/src/hosted/args.test.js +49 -0
- package/dist/src/hosted/availability.d.ts +13 -0
- package/dist/src/hosted/availability.js +16 -0
- package/dist/src/hosted/availability.test.d.ts +1 -0
- package/dist/src/hosted/availability.test.js +180 -0
- package/dist/src/hosted/browser-args.d.ts +18 -0
- package/dist/src/hosted/browser-args.js +152 -0
- package/dist/src/hosted/browser-args.test.d.ts +1 -0
- package/dist/src/hosted/browser-args.test.js +182 -0
- package/dist/src/hosted/client.d.ts +59 -0
- package/dist/src/hosted/client.js +510 -0
- package/dist/src/hosted/client.test.d.ts +1 -0
- package/dist/src/hosted/client.test.js +738 -0
- package/dist/src/hosted/config.d.ts +55 -0
- package/dist/src/hosted/config.js +112 -0
- package/dist/src/hosted/config.test.d.ts +1 -0
- package/dist/src/hosted/config.test.js +81 -0
- package/dist/src/hosted/contract.d.ts +94 -0
- package/dist/src/hosted/contract.js +208 -0
- package/dist/src/hosted/contract.test.d.ts +1 -0
- package/dist/src/hosted/contract.test.js +361 -0
- package/dist/src/hosted/credentials.d.ts +38 -0
- package/dist/src/hosted/credentials.js +248 -0
- package/dist/src/hosted/credentials.test.d.ts +1 -0
- package/dist/src/hosted/credentials.test.js +93 -0
- package/dist/src/hosted/file-contract.test.d.ts +1 -0
- package/dist/src/hosted/file-contract.test.js +174 -0
- package/dist/src/hosted/files.d.ts +29 -0
- package/dist/src/hosted/files.js +296 -0
- package/dist/src/hosted/files.test.d.ts +1 -0
- package/dist/src/hosted/files.test.js +231 -0
- package/dist/src/hosted/main-lifecycle.test.d.ts +1 -0
- package/dist/src/hosted/main-lifecycle.test.js +213 -0
- package/dist/src/hosted/manifest.d.ts +14 -0
- package/dist/src/hosted/manifest.js +47 -0
- package/dist/src/hosted/manifest.test.d.ts +1 -0
- package/dist/src/hosted/manifest.test.js +164 -0
- package/dist/src/hosted/output-parity.test.d.ts +1 -0
- package/dist/src/hosted/output-parity.test.js +108 -0
- package/dist/src/hosted/root-command-surface.test.d.ts +1 -0
- package/dist/src/hosted/root-command-surface.test.js +646 -0
- package/dist/src/hosted/runner.d.ts +19 -0
- package/dist/src/hosted/runner.js +705 -0
- package/dist/src/hosted/runner.test.d.ts +1 -0
- package/dist/src/hosted/runner.test.js +1607 -0
- package/dist/src/hosted/setup.d.ts +10 -0
- package/dist/src/hosted/setup.js +79 -0
- package/dist/src/hosted/setup.test.d.ts +1 -0
- package/dist/src/hosted/setup.test.js +195 -0
- package/dist/src/hosted/types.d.ts +175 -0
- package/dist/src/hosted/types.js +1 -0
- package/dist/src/main.js +123 -97
- package/dist/src/manifest-types.d.ts +2 -0
- package/dist/src/output.d.ts +17 -2
- package/dist/src/output.js +88 -81
- package/dist/src/output.test.js +141 -51
- package/dist/src/pipeline/executor.test.js +1 -0
- package/dist/src/pipeline/steps/download.test.js +1 -0
- package/dist/src/plugin-create-cli.test.d.ts +1 -0
- package/dist/src/plugin-create-cli.test.js +37 -0
- package/dist/src/plugin-manifest.d.ts +12 -0
- package/dist/src/plugin-manifest.js +16 -0
- package/dist/src/plugin-manifest.test.js +19 -1
- package/dist/src/plugin-scaffold.d.ts +4 -1
- package/dist/src/plugin-scaffold.js +4 -1
- package/dist/src/plugin-scaffold.test.js +23 -8
- package/dist/src/plugin.js +4 -1
- package/dist/src/plugin.test.js +13 -0
- package/dist/src/registry.d.ts +2 -0
- package/dist/src/release-notes.d.ts +6 -1
- package/dist/src/release-notes.js +192 -4
- package/dist/src/release-notes.test.js +143 -4
- package/dist/src/root-command-surface.d.ts +31 -0
- package/dist/src/root-command-surface.js +106 -0
- package/dist/src/serialization.d.ts +1 -16
- package/dist/src/serialization.js +5 -55
- package/dist/src/stream-write.d.ts +12 -0
- package/dist/src/stream-write.js +91 -0
- package/dist/src/stream-write.test.d.ts +1 -0
- package/dist/src/stream-write.test.js +186 -0
- package/dist/src/types.d.ts +5 -0
- package/dist/src/utils.d.ts +1 -1
- package/dist/src/utils.js +2 -8
- package/dist/src/utils.test.js +50 -0
- package/hosted-contract.json +36748 -0
- package/package.json +6 -1
- package/scripts/check-hosted-contract.mjs +108 -0
- package/scripts/docs-sync-review.ts +332 -0
- package/scripts/generate-release-notes.ts +1 -1
- package/scripts/sync-community-plugins.ts +14 -0
- package/skills/smart-search/SKILL.md +14 -3
- package/skills/webcmd-autofix/SKILL.md +26 -37
- package/skills/webcmd-usage/SKILL.md +21 -7
- package/clis/antigravity/SKILL.md +0 -38
package/README.md
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
<img width="
|
|
1
|
+
<img width="2056" height="765" alt="ChatGPT Image Jul 15, 2026, 12_14_45 PM" src="https://github.com/user-attachments/assets/5bcba7ee-588c-4839-9927-4f151055cdf6" />
|
|
2
|
+
|
|
2
3
|
|
|
3
4
|
<p align="center">
|
|
4
5
|
<a href="https://www.npmjs.com/package/@agentrhq/webcmd">
|
|
@@ -258,7 +259,17 @@ webcmd plugin uninstall <name>
|
|
|
258
259
|
webcmd plugin create <name>
|
|
259
260
|
```
|
|
260
261
|
|
|
261
|
-
|
|
262
|
+
`plugin create` prompts for the author's display name and GitHub handle. For non-interactive use, pass `--author-name <name>` and `--author-handle <handle>`.
|
|
263
|
+
|
|
264
|
+
Use plugins for private company workflows, community adapters, or experiments that are not ready for the built-in registry. This repo is also a plugin monorepo: community plugins promoted here live under [`plugins/`](./plugins/) and are advertised through [`webcmd-plugin.json`](./webcmd-plugin.json).
|
|
265
|
+
|
|
266
|
+
<!-- webcmd-community-plugins:start -->
|
|
267
|
+
### Community plugins
|
|
268
|
+
|
|
269
|
+
| Plugin | Description | Author |
|
|
270
|
+
| --- | --- | --- |
|
|
271
|
+
| [`skyscanner`](./plugins/skyscanner/) | Skyscanner flight search commands for Webcmd | [Rishabh](https://github.com/rishabhraj36) |
|
|
272
|
+
<!-- webcmd-community-plugins:end -->
|
|
262
273
|
|
|
263
274
|
## Writing Adapters
|
|
264
275
|
|
package/cli-manifest.json
CHANGED
|
@@ -3733,7 +3733,7 @@
|
|
|
3733
3733
|
{
|
|
3734
3734
|
"site": "chatgpt",
|
|
3735
3735
|
"name": "deep-research-result",
|
|
3736
|
-
"description": "Read a
|
|
3736
|
+
"description": "Read a ChatGPT Deep Research report or progress from the conversation payload",
|
|
3737
3737
|
"access": "read",
|
|
3738
3738
|
"domain": "chatgpt.com",
|
|
3739
3739
|
"strategy": "cookie",
|
|
@@ -3773,6 +3773,15 @@
|
|
|
3773
3773
|
"status",
|
|
3774
3774
|
"report",
|
|
3775
3775
|
"sources",
|
|
3776
|
+
"progress",
|
|
3777
|
+
"asyncTaskConversationId",
|
|
3778
|
+
"widgetSessionId",
|
|
3779
|
+
"asyncStatus",
|
|
3780
|
+
"venusMessageType",
|
|
3781
|
+
"venusStatus",
|
|
3782
|
+
"waitingForUserUntil",
|
|
3783
|
+
"planTitle",
|
|
3784
|
+
"planId",
|
|
3776
3785
|
"url",
|
|
3777
3786
|
"method",
|
|
3778
3787
|
"diagnostics"
|
|
@@ -3890,7 +3899,20 @@
|
|
|
3890
3899
|
"name": "image",
|
|
3891
3900
|
"type": "str",
|
|
3892
3901
|
"required": false,
|
|
3893
|
-
"help": "Local image path to attach before prompting; comma-separated paths are supported"
|
|
3902
|
+
"help": "Local image path to attach before prompting; comma-separated paths are supported",
|
|
3903
|
+
"file": {
|
|
3904
|
+
"direction": "input",
|
|
3905
|
+
"pathKind": "file",
|
|
3906
|
+
"multiple": true,
|
|
3907
|
+
"separator": ",",
|
|
3908
|
+
"contentTypes": [
|
|
3909
|
+
"image/jpeg",
|
|
3910
|
+
"image/png",
|
|
3911
|
+
"image/gif",
|
|
3912
|
+
"image/webp"
|
|
3913
|
+
],
|
|
3914
|
+
"maxBytes": 26214400
|
|
3915
|
+
}
|
|
3894
3916
|
},
|
|
3895
3917
|
{
|
|
3896
3918
|
"name": "project",
|
|
@@ -3903,7 +3925,13 @@
|
|
|
3903
3925
|
"name": "op",
|
|
3904
3926
|
"type": "str",
|
|
3905
3927
|
"required": false,
|
|
3906
|
-
"help": "Output directory (default: ~/Pictures/chatgpt)"
|
|
3928
|
+
"help": "Output directory (default: ~/Pictures/chatgpt)",
|
|
3929
|
+
"file": {
|
|
3930
|
+
"direction": "output",
|
|
3931
|
+
"pathKind": "directory",
|
|
3932
|
+
"multiple": false,
|
|
3933
|
+
"defaultPath": "~/Pictures/chatgpt"
|
|
3934
|
+
}
|
|
3907
3935
|
},
|
|
3908
3936
|
{
|
|
3909
3937
|
"name": "sd",
|
|
@@ -4056,7 +4084,25 @@
|
|
|
4056
4084
|
"type": "str",
|
|
4057
4085
|
"required": true,
|
|
4058
4086
|
"positional": true,
|
|
4059
|
-
"help": "Local file path(s) to upload; comma-separated paths are supported"
|
|
4087
|
+
"help": "Local file path(s) to upload; comma-separated paths are supported",
|
|
4088
|
+
"file": {
|
|
4089
|
+
"direction": "input",
|
|
4090
|
+
"pathKind": "file",
|
|
4091
|
+
"multiple": true,
|
|
4092
|
+
"separator": ",",
|
|
4093
|
+
"contentTypes": [
|
|
4094
|
+
"application/pdf",
|
|
4095
|
+
"text/plain",
|
|
4096
|
+
"text/markdown",
|
|
4097
|
+
"text/csv",
|
|
4098
|
+
"application/json",
|
|
4099
|
+
"image/jpeg",
|
|
4100
|
+
"image/png",
|
|
4101
|
+
"image/gif",
|
|
4102
|
+
"image/webp"
|
|
4103
|
+
],
|
|
4104
|
+
"maxBytes": 26214400
|
|
4105
|
+
}
|
|
4060
4106
|
},
|
|
4061
4107
|
{
|
|
4062
4108
|
"name": "id",
|
|
@@ -4795,7 +4841,24 @@
|
|
|
4795
4841
|
"name": "file",
|
|
4796
4842
|
"type": "str",
|
|
4797
4843
|
"required": false,
|
|
4798
|
-
"help": "Attach a file (image, PDF, text) with the prompt"
|
|
4844
|
+
"help": "Attach a file (image, PDF, text) with the prompt",
|
|
4845
|
+
"file": {
|
|
4846
|
+
"direction": "input",
|
|
4847
|
+
"pathKind": "file",
|
|
4848
|
+
"multiple": false,
|
|
4849
|
+
"contentTypes": [
|
|
4850
|
+
"application/pdf",
|
|
4851
|
+
"text/plain",
|
|
4852
|
+
"text/markdown",
|
|
4853
|
+
"text/csv",
|
|
4854
|
+
"application/json",
|
|
4855
|
+
"image/jpeg",
|
|
4856
|
+
"image/png",
|
|
4857
|
+
"image/gif",
|
|
4858
|
+
"image/webp"
|
|
4859
|
+
],
|
|
4860
|
+
"maxBytes": 26214400
|
|
4861
|
+
}
|
|
4799
4862
|
}
|
|
4800
4863
|
],
|
|
4801
4864
|
"columns": [
|
|
@@ -8495,7 +8558,7 @@
|
|
|
8495
8558
|
"type": "js",
|
|
8496
8559
|
"modulePath": "facebook/search.js",
|
|
8497
8560
|
"sourceFile": "facebook/search.js",
|
|
8498
|
-
"navigateBefore":
|
|
8561
|
+
"navigateBefore": false
|
|
8499
8562
|
},
|
|
8500
8563
|
{
|
|
8501
8564
|
"site": "facebook",
|
|
@@ -11587,7 +11650,20 @@
|
|
|
11587
11650
|
"type": "str",
|
|
11588
11651
|
"required": false,
|
|
11589
11652
|
"valueRequired": true,
|
|
11590
|
-
"help": "Comma-separated media paths (images/videos, up to 10)"
|
|
11653
|
+
"help": "Comma-separated media paths (images/videos, up to 10)",
|
|
11654
|
+
"file": {
|
|
11655
|
+
"direction": "input",
|
|
11656
|
+
"pathKind": "file",
|
|
11657
|
+
"multiple": true,
|
|
11658
|
+
"separator": ",",
|
|
11659
|
+
"contentTypes": [
|
|
11660
|
+
"image/jpeg",
|
|
11661
|
+
"image/png",
|
|
11662
|
+
"image/webp",
|
|
11663
|
+
"video/mp4"
|
|
11664
|
+
],
|
|
11665
|
+
"maxBytes": 262144000
|
|
11666
|
+
}
|
|
11591
11667
|
},
|
|
11592
11668
|
{
|
|
11593
11669
|
"name": "content",
|
|
@@ -11659,7 +11735,16 @@
|
|
|
11659
11735
|
"type": "str",
|
|
11660
11736
|
"required": false,
|
|
11661
11737
|
"valueRequired": true,
|
|
11662
|
-
"help": "Path to a single .mp4 video file"
|
|
11738
|
+
"help": "Path to a single .mp4 video file",
|
|
11739
|
+
"file": {
|
|
11740
|
+
"direction": "input",
|
|
11741
|
+
"pathKind": "file",
|
|
11742
|
+
"multiple": false,
|
|
11743
|
+
"contentTypes": [
|
|
11744
|
+
"video/mp4"
|
|
11745
|
+
],
|
|
11746
|
+
"maxBytes": 262144000
|
|
11747
|
+
}
|
|
11663
11748
|
},
|
|
11664
11749
|
{
|
|
11665
11750
|
"name": "content",
|
|
@@ -12670,6 +12755,40 @@
|
|
|
12670
12755
|
"modulePath": "lichess/user.js",
|
|
12671
12756
|
"sourceFile": "lichess/user.js"
|
|
12672
12757
|
},
|
|
12758
|
+
{
|
|
12759
|
+
"site": "linkedin",
|
|
12760
|
+
"name": "company",
|
|
12761
|
+
"description": "Read a LinkedIn company page: industry, size, HQ, founded, website, followers, and about text",
|
|
12762
|
+
"access": "read",
|
|
12763
|
+
"domain": "www.linkedin.com",
|
|
12764
|
+
"strategy": "cookie",
|
|
12765
|
+
"browser": true,
|
|
12766
|
+
"args": [
|
|
12767
|
+
{
|
|
12768
|
+
"name": "company",
|
|
12769
|
+
"type": "string",
|
|
12770
|
+
"required": true,
|
|
12771
|
+
"positional": true,
|
|
12772
|
+
"help": "Company universal name, /company/<name> path, or full URL"
|
|
12773
|
+
}
|
|
12774
|
+
],
|
|
12775
|
+
"columns": [
|
|
12776
|
+
"name",
|
|
12777
|
+
"industry",
|
|
12778
|
+
"size",
|
|
12779
|
+
"headquarters",
|
|
12780
|
+
"founded",
|
|
12781
|
+
"website",
|
|
12782
|
+
"specialties",
|
|
12783
|
+
"followers",
|
|
12784
|
+
"about",
|
|
12785
|
+
"url"
|
|
12786
|
+
],
|
|
12787
|
+
"type": "js",
|
|
12788
|
+
"modulePath": "linkedin/company.js",
|
|
12789
|
+
"sourceFile": "linkedin/company.js",
|
|
12790
|
+
"navigateBefore": "https://www.linkedin.com"
|
|
12791
|
+
},
|
|
12673
12792
|
{
|
|
12674
12793
|
"site": "linkedin",
|
|
12675
12794
|
"name": "connect",
|
|
@@ -12728,6 +12847,36 @@
|
|
|
12728
12847
|
"sourceFile": "linkedin/connect.js",
|
|
12729
12848
|
"navigateBefore": true
|
|
12730
12849
|
},
|
|
12850
|
+
{
|
|
12851
|
+
"site": "linkedin",
|
|
12852
|
+
"name": "connections",
|
|
12853
|
+
"description": "List your LinkedIn first-degree connections with names, headlines, and profile URLs",
|
|
12854
|
+
"access": "read",
|
|
12855
|
+
"domain": "www.linkedin.com",
|
|
12856
|
+
"strategy": "cookie",
|
|
12857
|
+
"browser": true,
|
|
12858
|
+
"args": [
|
|
12859
|
+
{
|
|
12860
|
+
"name": "limit",
|
|
12861
|
+
"type": "int",
|
|
12862
|
+
"default": 20,
|
|
12863
|
+
"required": false,
|
|
12864
|
+
"help": "Number of connections to return (max 500)"
|
|
12865
|
+
}
|
|
12866
|
+
],
|
|
12867
|
+
"columns": [
|
|
12868
|
+
"rank",
|
|
12869
|
+
"name",
|
|
12870
|
+
"occupation",
|
|
12871
|
+
"public_id",
|
|
12872
|
+
"connected_at",
|
|
12873
|
+
"url"
|
|
12874
|
+
],
|
|
12875
|
+
"type": "js",
|
|
12876
|
+
"modulePath": "linkedin/connections.js",
|
|
12877
|
+
"sourceFile": "linkedin/connections.js",
|
|
12878
|
+
"navigateBefore": "https://www.linkedin.com"
|
|
12879
|
+
},
|
|
12731
12880
|
{
|
|
12732
12881
|
"site": "linkedin",
|
|
12733
12882
|
"name": "inbox",
|
|
@@ -14536,7 +14685,20 @@
|
|
|
14536
14685
|
"name": "receipt",
|
|
14537
14686
|
"type": "str",
|
|
14538
14687
|
"required": true,
|
|
14539
|
-
"help": "Local receipt/proof file path"
|
|
14688
|
+
"help": "Local receipt/proof file path",
|
|
14689
|
+
"file": {
|
|
14690
|
+
"direction": "input",
|
|
14691
|
+
"pathKind": "file",
|
|
14692
|
+
"multiple": false,
|
|
14693
|
+
"contentTypes": [
|
|
14694
|
+
"image/jpeg",
|
|
14695
|
+
"image/png",
|
|
14696
|
+
"image/gif",
|
|
14697
|
+
"image/webp",
|
|
14698
|
+
"application/pdf"
|
|
14699
|
+
],
|
|
14700
|
+
"maxBytes": 26214400
|
|
14701
|
+
}
|
|
14540
14702
|
},
|
|
14541
14703
|
{
|
|
14542
14704
|
"name": "amount",
|
|
@@ -23992,7 +24154,12 @@
|
|
|
23992
24154
|
"type": "str",
|
|
23993
24155
|
"default": "./twitter-downloads",
|
|
23994
24156
|
"required": false,
|
|
23995
|
-
"help": "Output directory (default ./twitter-downloads). A per-source subdir is created inside."
|
|
24157
|
+
"help": "Output directory (default ./twitter-downloads). A per-source subdir is created inside.",
|
|
24158
|
+
"file": {
|
|
24159
|
+
"direction": "output",
|
|
24160
|
+
"pathKind": "directory",
|
|
24161
|
+
"multiple": false
|
|
24162
|
+
}
|
|
23996
24163
|
}
|
|
23997
24164
|
],
|
|
23998
24165
|
"columns": [
|
|
@@ -24657,7 +24824,20 @@
|
|
|
24657
24824
|
"name": "images",
|
|
24658
24825
|
"type": "string",
|
|
24659
24826
|
"required": false,
|
|
24660
|
-
"help": "Image paths, comma-separated, max 4 (jpg/png/gif/webp)"
|
|
24827
|
+
"help": "Image paths, comma-separated, max 4 (jpg/png/gif/webp)",
|
|
24828
|
+
"file": {
|
|
24829
|
+
"direction": "input",
|
|
24830
|
+
"pathKind": "file",
|
|
24831
|
+
"multiple": true,
|
|
24832
|
+
"separator": ",",
|
|
24833
|
+
"contentTypes": [
|
|
24834
|
+
"image/jpeg",
|
|
24835
|
+
"image/png",
|
|
24836
|
+
"image/gif",
|
|
24837
|
+
"image/webp"
|
|
24838
|
+
],
|
|
24839
|
+
"maxBytes": 26214400
|
|
24840
|
+
}
|
|
24661
24841
|
}
|
|
24662
24842
|
],
|
|
24663
24843
|
"columns": [
|
|
@@ -24734,7 +24914,19 @@
|
|
|
24734
24914
|
"name": "image",
|
|
24735
24915
|
"type": "str",
|
|
24736
24916
|
"required": false,
|
|
24737
|
-
"help": "Optional local image path to attach to the quote tweet"
|
|
24917
|
+
"help": "Optional local image path to attach to the quote tweet",
|
|
24918
|
+
"file": {
|
|
24919
|
+
"direction": "input",
|
|
24920
|
+
"pathKind": "file",
|
|
24921
|
+
"multiple": false,
|
|
24922
|
+
"contentTypes": [
|
|
24923
|
+
"image/jpeg",
|
|
24924
|
+
"image/png",
|
|
24925
|
+
"image/gif",
|
|
24926
|
+
"image/webp"
|
|
24927
|
+
],
|
|
24928
|
+
"maxBytes": 26214400
|
|
24929
|
+
}
|
|
24738
24930
|
},
|
|
24739
24931
|
{
|
|
24740
24932
|
"name": "image-url",
|
|
@@ -24780,7 +24972,19 @@
|
|
|
24780
24972
|
"name": "image",
|
|
24781
24973
|
"type": "str",
|
|
24782
24974
|
"required": false,
|
|
24783
|
-
"help": "Optional local image path to attach to the reply"
|
|
24975
|
+
"help": "Optional local image path to attach to the reply",
|
|
24976
|
+
"file": {
|
|
24977
|
+
"direction": "input",
|
|
24978
|
+
"pathKind": "file",
|
|
24979
|
+
"multiple": false,
|
|
24980
|
+
"contentTypes": [
|
|
24981
|
+
"image/jpeg",
|
|
24982
|
+
"image/png",
|
|
24983
|
+
"image/gif",
|
|
24984
|
+
"image/webp"
|
|
24985
|
+
],
|
|
24986
|
+
"maxBytes": 26214400
|
|
24987
|
+
}
|
|
24784
24988
|
},
|
|
24785
24989
|
{
|
|
24786
24990
|
"name": "image-url",
|
|
@@ -72,7 +72,7 @@ export function registerSiteAuthCommands(config) {
|
|
|
72
72
|
? { refresh: async (page, kwargs) => normalizeRefreshResult(await config.refresh(page, kwargs)) }
|
|
73
73
|
: {}),
|
|
74
74
|
},
|
|
75
|
-
func: async (page) => tryProbe(config, page, 'identity'),
|
|
75
|
+
func: async (page) => [await tryProbe(config, page, 'identity')],
|
|
76
76
|
});
|
|
77
77
|
|
|
78
78
|
cli({
|
|
@@ -92,7 +92,7 @@ export function registerSiteAuthCommands(config) {
|
|
|
92
92
|
columns: ['status', ...commandColumns(config)],
|
|
93
93
|
func: async (page, kwargs) => {
|
|
94
94
|
try {
|
|
95
|
-
return { status: 'already_logged_in', ...await tryProbe(config, page, 'identity') };
|
|
95
|
+
return [{ status: 'already_logged_in', ...await tryProbe(config, page, 'identity') }];
|
|
96
96
|
} catch (error) {
|
|
97
97
|
if (!isAuthRequired(error)) throw error;
|
|
98
98
|
}
|
|
@@ -106,7 +106,7 @@ export function registerSiteAuthCommands(config) {
|
|
|
106
106
|
await page.wait(Math.min(POLL_INTERVAL_MS / 1000, Math.max(0.2, (deadline - Date.now()) / 1000)));
|
|
107
107
|
try {
|
|
108
108
|
const identity = await tryProbe(config, page, 'poll');
|
|
109
|
-
return { status: 'login_complete', ...identity };
|
|
109
|
+
return [{ status: 'login_complete', ...identity }];
|
|
110
110
|
} catch (error) {
|
|
111
111
|
if (!isAuthRequired(error)) throw error;
|
|
112
112
|
lastAuthMessage = getErrorMessage(error);
|
|
@@ -47,11 +47,11 @@ describe('site auth command helper', () => {
|
|
|
47
47
|
const cmd = getRegistry().get('auth-helper-whoami/whoami');
|
|
48
48
|
const page = pageMock();
|
|
49
49
|
|
|
50
|
-
await expect(cmd.func(page, {})).resolves.toEqual({
|
|
50
|
+
await expect(cmd.func(page, {})).resolves.toEqual([{
|
|
51
51
|
logged_in: true,
|
|
52
52
|
site: 'auth-helper-whoami',
|
|
53
53
|
username: 'alice',
|
|
54
|
-
});
|
|
54
|
+
}]);
|
|
55
55
|
expect(page.goto).not.toHaveBeenCalled();
|
|
56
56
|
});
|
|
57
57
|
|
|
@@ -70,12 +70,12 @@ describe('site auth command helper', () => {
|
|
|
70
70
|
const cmd = getRegistry().get('auth-helper-login/login');
|
|
71
71
|
const page = pageMock();
|
|
72
72
|
|
|
73
|
-
await expect(cmd.func(page, { timeout: 1 })).resolves.toEqual({
|
|
73
|
+
await expect(cmd.func(page, { timeout: 1 })).resolves.toEqual([{
|
|
74
74
|
status: 'login_complete',
|
|
75
75
|
logged_in: true,
|
|
76
76
|
site: 'auth-helper-login',
|
|
77
77
|
username: 'alice',
|
|
78
|
-
});
|
|
78
|
+
}]);
|
|
79
79
|
expect(page.goto).toHaveBeenCalledWith('https://example.com/login');
|
|
80
80
|
expect(page.wait).toHaveBeenCalled();
|
|
81
81
|
expect(poll).toHaveBeenCalledTimes(2);
|
package/clis/chatgpt/ask.js
CHANGED
|
@@ -105,7 +105,7 @@ export const askCommand = cli({
|
|
|
105
105
|
if (Date.now() - settleStart > timeout * 1000) {
|
|
106
106
|
throw new CommandExecutionError('ChatGPT conversation is still generating; wait for it to finish before sending another message.');
|
|
107
107
|
}
|
|
108
|
-
await page.
|
|
108
|
+
await page.sleep(3);
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
const baselineMessages = await getVisibleMessages(page);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { askCommand } from './ask.js';
|
|
3
|
+
|
|
4
|
+
describe('chatgpt ask polling', () => {
|
|
5
|
+
it('uses pure sleep while waiting for an active generation to finish', () => {
|
|
6
|
+
const source = askCommand.func.toString();
|
|
7
|
+
|
|
8
|
+
expect(source).toContain('await page.sleep(3)');
|
|
9
|
+
expect(source).not.toContain('await page.wait(3)');
|
|
10
|
+
});
|
|
11
|
+
});
|
|
@@ -130,7 +130,24 @@ describe('chatgpt browser command registration', () => {
|
|
|
130
130
|
expect.objectContaining({ name: 'timeout', type: 'int', default: 120 }),
|
|
131
131
|
expect.objectContaining({ name: 'stable', type: 'int', default: 6 }),
|
|
132
132
|
]));
|
|
133
|
-
expect(command.columns).toEqual([
|
|
133
|
+
expect(command.columns).toEqual([
|
|
134
|
+
'conversationId',
|
|
135
|
+
'status',
|
|
136
|
+
'report',
|
|
137
|
+
'sources',
|
|
138
|
+
'progress',
|
|
139
|
+
'asyncTaskConversationId',
|
|
140
|
+
'widgetSessionId',
|
|
141
|
+
'asyncStatus',
|
|
142
|
+
'venusMessageType',
|
|
143
|
+
'venusStatus',
|
|
144
|
+
'waitingForUserUntil',
|
|
145
|
+
'planTitle',
|
|
146
|
+
'planId',
|
|
147
|
+
'url',
|
|
148
|
+
'method',
|
|
149
|
+
'diagnostics',
|
|
150
|
+
]);
|
|
134
151
|
});
|
|
135
152
|
|
|
136
153
|
it('does not return a success row when no completed deep research report exists', async () => {
|
|
@@ -178,6 +195,90 @@ describe('chatgpt browser command registration', () => {
|
|
|
178
195
|
.rejects.toBeInstanceOf(EmptyResultError);
|
|
179
196
|
});
|
|
180
197
|
|
|
198
|
+
it('returns structured deep research progress without a completed report', async () => {
|
|
199
|
+
const command = getRegistry().get('chatgpt/deep-research-result');
|
|
200
|
+
const payload = {
|
|
201
|
+
conversation_id: 'requested123',
|
|
202
|
+
mapping: {
|
|
203
|
+
progress_node: {
|
|
204
|
+
message: {
|
|
205
|
+
metadata: {
|
|
206
|
+
chatgpt_sdk: {
|
|
207
|
+
widget_state: JSON.stringify({
|
|
208
|
+
status: 'waiting_for_user_response_on_plan',
|
|
209
|
+
waiting_for_user_response_on_plan_until: '2026-07-02T02:29:48.298274Z',
|
|
210
|
+
plan: { plan_id: 'plan-demo', title: 'Research plan' },
|
|
211
|
+
}),
|
|
212
|
+
response_metadata: {
|
|
213
|
+
async_task_conversation_id: 'async-conversation-123',
|
|
214
|
+
'openai/widgetSessionId': 'widget-session-123',
|
|
215
|
+
'openai/asyncStatus': 7,
|
|
216
|
+
venus_message_type: 'initial_loading_message',
|
|
217
|
+
},
|
|
218
|
+
},
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
};
|
|
224
|
+
const page = {
|
|
225
|
+
goto: vi.fn().mockResolvedValue(undefined),
|
|
226
|
+
wait: vi.fn().mockResolvedValue(undefined),
|
|
227
|
+
startNetworkCapture: vi.fn().mockResolvedValue(true),
|
|
228
|
+
readNetworkCapture: vi.fn().mockResolvedValue([]),
|
|
229
|
+
getCookies: vi.fn().mockResolvedValue([]),
|
|
230
|
+
evaluate: vi.fn((script) => {
|
|
231
|
+
const source = String(script);
|
|
232
|
+
if (source === 'window.location.href') return Promise.resolve('https://chatgpt.com/');
|
|
233
|
+
if (source.includes("fetch('/backend-api/conversation/requested123'")) {
|
|
234
|
+
return Promise.resolve({
|
|
235
|
+
ok: true,
|
|
236
|
+
status: 200,
|
|
237
|
+
contentType: 'application/json',
|
|
238
|
+
text: JSON.stringify(payload),
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
if (source.includes("document.querySelectorAll('iframe')")) {
|
|
242
|
+
return Promise.resolve({
|
|
243
|
+
url: 'https://chatgpt.com/c/requested123',
|
|
244
|
+
title: 'ChatGPT',
|
|
245
|
+
iframes: [],
|
|
246
|
+
deepResearchIframe: null,
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
if (source.includes('composerSelectors') && source.includes('hasComposer')) {
|
|
250
|
+
return Promise.resolve({
|
|
251
|
+
url: 'https://chatgpt.com/c/requested123',
|
|
252
|
+
title: 'ChatGPT',
|
|
253
|
+
hasComposer: true,
|
|
254
|
+
isLoggedIn: true,
|
|
255
|
+
hasLoginGate: false,
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
if (source.includes('Stop generating') || source.includes('Thinking')) return Promise.resolve(false);
|
|
259
|
+
return Promise.resolve(undefined);
|
|
260
|
+
}),
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
await expect(command.func(page, { id: 'requested123' })).resolves.toEqual([
|
|
264
|
+
expect.objectContaining({
|
|
265
|
+
conversationId: 'requested123',
|
|
266
|
+
status: 'waiting_for_user',
|
|
267
|
+
report: '',
|
|
268
|
+
sources: [],
|
|
269
|
+
asyncTaskConversationId: 'async-conversation-123',
|
|
270
|
+
widgetSessionId: 'widget-session-123',
|
|
271
|
+
asyncStatus: 7,
|
|
272
|
+
venusMessageType: 'initial_loading_message',
|
|
273
|
+
venusStatus: 'waiting_for_user_response_on_plan',
|
|
274
|
+
waitingForUserUntil: '2026-07-02T02:29:48.298274Z',
|
|
275
|
+
planTitle: 'Research plan',
|
|
276
|
+
planId: 'plan-demo',
|
|
277
|
+
method: 'conversation-widget-progress',
|
|
278
|
+
}),
|
|
279
|
+
]);
|
|
280
|
+
});
|
|
281
|
+
|
|
181
282
|
it('typed-fails malformed deep research source rows instead of falling back to empty success', async () => {
|
|
182
283
|
const command = getRegistry().get('chatgpt/deep-research-result');
|
|
183
284
|
const report = `# Executive Summary\n\n${'Completed Deep Research report paragraph with enough detail to pass extraction heuristics. '.repeat(12)}\n\n## Sources`;
|
|
@@ -13,11 +13,20 @@ import {
|
|
|
13
13
|
waitForChatGPTDeepResearchResult,
|
|
14
14
|
} from './utils.js';
|
|
15
15
|
|
|
16
|
+
function hasDeepResearchProgress(result) {
|
|
17
|
+
return !!result
|
|
18
|
+
&& result.status !== 'completed'
|
|
19
|
+
&& result.progress
|
|
20
|
+
&& typeof result.progress === 'object'
|
|
21
|
+
&& !Array.isArray(result.progress)
|
|
22
|
+
&& Object.keys(result.progress).length > 0;
|
|
23
|
+
}
|
|
24
|
+
|
|
16
25
|
export const deepResearchResultCommand = cli({
|
|
17
26
|
site: 'chatgpt',
|
|
18
27
|
name: 'deep-research-result',
|
|
19
28
|
access: 'read',
|
|
20
|
-
description: 'Read a
|
|
29
|
+
description: 'Read a ChatGPT Deep Research report or progress from the conversation payload',
|
|
21
30
|
domain: CHATGPT_DOMAIN,
|
|
22
31
|
strategy: Strategy.COOKIE,
|
|
23
32
|
browser: true,
|
|
@@ -29,7 +38,24 @@ export const deepResearchResultCommand = cli({
|
|
|
29
38
|
{ name: 'timeout', type: 'int', default: 120, help: 'Max seconds to wait when --wait is true' },
|
|
30
39
|
{ name: 'stable', type: 'int', default: 6, help: 'Seconds the report text must remain unchanged when --wait is true' },
|
|
31
40
|
],
|
|
32
|
-
columns: [
|
|
41
|
+
columns: [
|
|
42
|
+
'conversationId',
|
|
43
|
+
'status',
|
|
44
|
+
'report',
|
|
45
|
+
'sources',
|
|
46
|
+
'progress',
|
|
47
|
+
'asyncTaskConversationId',
|
|
48
|
+
'widgetSessionId',
|
|
49
|
+
'asyncStatus',
|
|
50
|
+
'venusMessageType',
|
|
51
|
+
'venusStatus',
|
|
52
|
+
'waitingForUserUntil',
|
|
53
|
+
'planTitle',
|
|
54
|
+
'planId',
|
|
55
|
+
'url',
|
|
56
|
+
'method',
|
|
57
|
+
'diagnostics',
|
|
58
|
+
],
|
|
33
59
|
func: async (page, kwargs) => {
|
|
34
60
|
const id = parseChatGPTConversationId(kwargs.id);
|
|
35
61
|
const shouldWait = normalizeBooleanFlag(kwargs.wait, false);
|
|
@@ -59,7 +85,14 @@ export const deepResearchResultCommand = cli({
|
|
|
59
85
|
? await waitForChatGPTDeepResearchResult(page, { conversationId: id, timeoutSeconds: timeout, stableSeconds })
|
|
60
86
|
: await getChatGPTDeepResearchResult(page, { conversationId: id, useBridgeProbes: true });
|
|
61
87
|
|
|
62
|
-
if (result.status !== 'completed'
|
|
88
|
+
if (result.status !== 'completed' && !hasDeepResearchProgress(result)) {
|
|
89
|
+
throw new EmptyResultError(
|
|
90
|
+
'chatgpt deep-research-result',
|
|
91
|
+
`No completed Deep Research report was found for conversation ${id}.`,
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (result.status === 'completed' && !result.report) {
|
|
63
96
|
throw new EmptyResultError(
|
|
64
97
|
'chatgpt deep-research-result',
|
|
65
98
|
`No completed Deep Research report was found for conversation ${id}.`,
|
|
@@ -71,6 +104,15 @@ export const deepResearchResultCommand = cli({
|
|
|
71
104
|
status: result.status,
|
|
72
105
|
report: result.report || '',
|
|
73
106
|
sources: result.sources || [],
|
|
107
|
+
progress: result.progress || {},
|
|
108
|
+
asyncTaskConversationId: result.asyncTaskConversationId || '',
|
|
109
|
+
widgetSessionId: result.widgetSessionId || '',
|
|
110
|
+
asyncStatus: result.asyncStatus ?? '',
|
|
111
|
+
venusMessageType: result.venusMessageType || '',
|
|
112
|
+
venusStatus: result.venusStatus || '',
|
|
113
|
+
waitingForUserUntil: result.waitingForUserUntil || '',
|
|
114
|
+
planTitle: result.planTitle || '',
|
|
115
|
+
planId: result.planId || '',
|
|
74
116
|
url: result.url || targetUrl,
|
|
75
117
|
method: result.method || '',
|
|
76
118
|
diagnostics: result.diagnostics || {},
|
package/clis/chatgpt/image.js
CHANGED
|
@@ -71,9 +71,29 @@ export const imageCommand = cli({
|
|
|
71
71
|
defaultFormat: 'plain',
|
|
72
72
|
args: [
|
|
73
73
|
{ name: 'prompt', positional: true, required: true, help: 'Image prompt to send to ChatGPT' },
|
|
74
|
-
{
|
|
74
|
+
{
|
|
75
|
+
name: 'image',
|
|
76
|
+
help: 'Local image path to attach before prompting; comma-separated paths are supported',
|
|
77
|
+
file: {
|
|
78
|
+
direction: 'input',
|
|
79
|
+
pathKind: 'file',
|
|
80
|
+
multiple: true,
|
|
81
|
+
separator: ',',
|
|
82
|
+
contentTypes: ['image/jpeg', 'image/png', 'image/gif', 'image/webp'],
|
|
83
|
+
maxBytes: 26_214_400,
|
|
84
|
+
},
|
|
85
|
+
},
|
|
75
86
|
{ name: 'project', valueRequired: true, help: 'Start image generation inside a ChatGPT project ID or /g/g-p-<id> URL' },
|
|
76
|
-
{
|
|
87
|
+
{
|
|
88
|
+
name: 'op',
|
|
89
|
+
help: 'Output directory (default: ~/Pictures/chatgpt)',
|
|
90
|
+
file: {
|
|
91
|
+
direction: 'output',
|
|
92
|
+
pathKind: 'directory',
|
|
93
|
+
multiple: false,
|
|
94
|
+
defaultPath: '~/Pictures/chatgpt',
|
|
95
|
+
},
|
|
96
|
+
},
|
|
77
97
|
{ name: 'sd', type: 'boolean', default: false, help: 'Skip download shorthand; only show ChatGPT link' },
|
|
78
98
|
{ name: 'timeout', type: 'int', required: false, default: 240, help: 'Max seconds for the overall command (default: 240)' },
|
|
79
99
|
],
|