opensteer 0.6.13 → 0.7.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 +256 -184
- package/dist/chunk-7QTHGTGN.js +32589 -0
- package/dist/chunk-7QTHGTGN.js.map +1 -0
- package/dist/cli/bin.cjs +38219 -0
- package/dist/cli/bin.cjs.map +1 -0
- package/dist/cli/bin.d.cts +1 -0
- package/dist/cli/bin.d.ts +1 -0
- package/dist/cli/bin.js +5612 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/index.cjs +31327 -16009
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +4440 -670
- package/dist/index.d.ts +4440 -670
- package/dist/index.js +438 -378
- package/dist/index.js.map +1 -0
- package/package.json +58 -62
- package/skills/README.md +21 -20
- package/skills/opensteer/SKILL.md +60 -194
- package/skills/opensteer/references/cli-reference.md +69 -113
- package/skills/opensteer/references/request-workflow.md +81 -0
- package/skills/opensteer/references/sdk-reference.md +101 -154
- package/CHANGELOG.md +0 -75
- package/bin/opensteer.mjs +0 -1423
- package/dist/browser-profile-client-CGXc0-P9.d.cts +0 -228
- package/dist/browser-profile-client-DHLzMf-K.d.ts +0 -228
- package/dist/chunk-2ES46WCO.js +0 -1437
- package/dist/chunk-3H5RRIMZ.js +0 -69
- package/dist/chunk-AVXUMEDG.js +0 -62
- package/dist/chunk-DN3GI5CH.js +0 -57
- package/dist/chunk-FAHE5DB2.js +0 -190
- package/dist/chunk-HBTSQ2V4.js +0 -15259
- package/dist/chunk-K5CL76MG.js +0 -81
- package/dist/chunk-U724TBY6.js +0 -1262
- package/dist/chunk-ZRCFF546.js +0 -77
- package/dist/cli/auth.cjs +0 -2022
- package/dist/cli/auth.d.cts +0 -114
- package/dist/cli/auth.d.ts +0 -114
- package/dist/cli/auth.js +0 -15
- package/dist/cli/local-profile.cjs +0 -197
- package/dist/cli/local-profile.d.cts +0 -18
- package/dist/cli/local-profile.d.ts +0 -18
- package/dist/cli/local-profile.js +0 -97
- package/dist/cli/profile.cjs +0 -18548
- package/dist/cli/profile.d.cts +0 -79
- package/dist/cli/profile.d.ts +0 -79
- package/dist/cli/profile.js +0 -1328
- package/dist/cli/server.cjs +0 -17232
- package/dist/cli/server.d.cts +0 -2
- package/dist/cli/server.d.ts +0 -2
- package/dist/cli/server.js +0 -977
- package/dist/cli/skills-installer.cjs +0 -230
- package/dist/cli/skills-installer.d.cts +0 -28
- package/dist/cli/skills-installer.d.ts +0 -28
- package/dist/cli/skills-installer.js +0 -201
- package/dist/extractor-4Q3TFZJB.js +0 -8
- package/dist/resolver-MGN64KCP.js +0 -7
- package/dist/types-Cr10igF3.d.cts +0 -345
- package/dist/types-Cr10igF3.d.ts +0 -345
- package/skills/electron/SKILL.md +0 -87
- package/skills/electron/references/opensteer-electron-recipes.md +0 -88
- package/skills/electron/references/opensteer-electron-workflow.md +0 -85
- package/skills/opensteer/references/examples.md +0 -118
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/sdk/opensteer.ts","../src/behavior/mouse.ts","../src/behavior/typing.ts","../src/behavior/scroll.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type {\n OpensteerArtifactReadInput,\n OpensteerArtifactReadOutput,\n CookieRecord,\n OpensteerAddInitScriptInput,\n OpensteerAddInitScriptOutput,\n OpensteerCaptchaSolveInput,\n OpensteerCaptchaSolveOutput,\n OpensteerCaptureScriptsInput,\n OpensteerCaptureScriptsOutput,\n OpensteerGetRecipeInput,\n OpensteerGetAuthRecipeInput,\n OpensteerActionResult,\n OpensteerComputerExecuteInput,\n OpensteerComputerExecuteOutput,\n OpensteerDomExtractOutput,\n OpensteerGetRequestPlanInput,\n OpensteerInferRequestPlanInput,\n OpensteerListRecipesInput,\n OpensteerListRecipesOutput,\n OpensteerListAuthRecipesInput,\n OpensteerListAuthRecipesOutput,\n OpensteerNetworkClearInput,\n OpensteerNetworkClearOutput,\n OpensteerNetworkDiffInput,\n OpensteerNetworkDiffOutput,\n OpensteerNetworkMinimizeInput,\n OpensteerNetworkMinimizeOutput,\n OpensteerNetworkQueryInput,\n OpensteerNetworkQueryOutput,\n OpensteerNetworkSaveInput,\n OpensteerNetworkSaveOutput,\n OpensteerInteractionCaptureInput,\n OpensteerInteractionCaptureOutput,\n OpensteerInteractionDiffInput,\n OpensteerInteractionDiffOutput,\n OpensteerInteractionGetInput,\n OpensteerInteractionGetOutput,\n OpensteerInteractionReplayInput,\n OpensteerInteractionReplayOutput,\n OpensteerPageActivateInput,\n OpensteerPageActivateOutput,\n OpensteerPageCloseInput,\n OpensteerPageCloseOutput,\n OpensteerPageEvaluateInput,\n OpensteerPageEvaluateOutput,\n OpensteerPageGotoInput,\n OpensteerPageGotoOutput,\n OpensteerPageListInput,\n OpensteerPageListOutput,\n OpensteerPageNewInput,\n OpensteerPageNewOutput,\n OpensteerPageSnapshotOutput,\n OpensteerListRequestPlansInput,\n OpensteerListRequestPlansOutput,\n OpensteerRawRequestInput,\n OpensteerRawRequestOutput,\n OpensteerRequestExecuteInput,\n OpensteerRequestExecuteOutput,\n OpensteerRunRecipeInput,\n OpensteerRunRecipeOutput,\n OpensteerRunAuthRecipeInput,\n OpensteerRunAuthRecipeOutput,\n OpensteerScriptBeautifyInput,\n OpensteerScriptBeautifyOutput,\n OpensteerScriptDeobfuscateInput,\n OpensteerScriptDeobfuscateOutput,\n OpensteerScriptSandboxInput,\n OpensteerScriptSandboxOutput,\n OpensteerReverseExportInput,\n OpensteerReverseExportOutput,\n OpensteerReverseDiscoverInput,\n OpensteerReverseDiscoverOutput,\n OpensteerReverseQueryInput,\n OpensteerReverseQueryOutput,\n OpensteerReversePackageCreateInput,\n OpensteerReversePackageCreateOutput,\n OpensteerReversePackageGetInput,\n OpensteerReversePackageGetOutput,\n OpensteerReversePackageListInput,\n OpensteerReversePackageListOutput,\n OpensteerReversePackagePatchInput,\n OpensteerReversePackagePatchOutput,\n OpensteerReversePackageRunInput,\n OpensteerReversePackageRunOutput,\n OpensteerReverseReportInput,\n OpensteerReverseReportOutput,\n OpensteerSessionCloseOutput,\n OpensteerSessionOpenInput,\n OpensteerSessionOpenOutput,\n OpensteerSnapshotMode,\n OpensteerTargetInput,\n OpensteerTransportProbeInput,\n OpensteerTransportProbeOutput,\n OpensteerWriteRecipeInput,\n OpensteerWriteAuthRecipeInput,\n OpensteerWriteRequestPlanInput,\n StorageSnapshot,\n} from \"@opensteer/protocol\";\n\nimport type { AuthRecipeRecord, RecipeRecord, RequestPlanRecord } from \"../registry.js\";\nimport { AttachedOpensteerSessionProxy } from \"../session-service/attached-session-proxy.js\";\nimport type {\n OpensteerDisconnectableRuntime,\n OpensteerSemanticRuntime,\n} from \"./semantic-runtime.js\";\nimport { OpensteerSessionRuntime, type OpensteerRuntimeOptions } from \"./runtime.js\";\nimport type {\n OpensteerInterceptScriptOptions,\n OpensteerRouteOptions,\n OpensteerRouteRegistration,\n} from \"./instrumentation.js\";\nimport {\n createOpensteerSemanticRuntime,\n type OpensteerCloudOptions,\n} from \"./runtime-resolution.js\";\n\nexport interface OpensteerTargetOptions {\n readonly element?: number;\n readonly selector?: string;\n readonly description?: string;\n readonly networkTag?: string;\n}\n\nexport interface OpensteerInputOptions extends OpensteerTargetOptions {\n readonly text: string;\n readonly pressEnter?: boolean;\n}\n\nexport interface OpensteerScrollOptions extends OpensteerTargetOptions {\n readonly direction: \"up\" | \"down\" | \"left\" | \"right\";\n readonly amount: number;\n}\n\nexport interface OpensteerExtractOptions {\n readonly description: string;\n readonly schema?: Record<string, unknown>;\n}\n\nexport interface OpensteerWaitForNetworkOptions extends OpensteerNetworkQueryInput {\n readonly timeoutMs?: number;\n readonly pollIntervalMs?: number;\n}\n\nexport interface OpensteerWaitForPageOptions {\n readonly openerPageRef?: string;\n readonly urlIncludes?: string;\n readonly timeoutMs?: number;\n readonly pollIntervalMs?: number;\n}\n\nexport type OpensteerGotoOptions = OpensteerPageGotoInput;\n\nexport type OpensteerComputerExecuteOptions = OpensteerComputerExecuteInput;\nexport type OpensteerComputerExecuteResult = OpensteerComputerExecuteOutput;\nexport type OpensteerNetworkQueryOptions = OpensteerNetworkQueryInput;\nexport type OpensteerNetworkQueryResult = OpensteerNetworkQueryOutput;\nexport type OpensteerNetworkSaveOptions = OpensteerNetworkSaveInput;\nexport type OpensteerNetworkSaveResult = OpensteerNetworkSaveOutput;\nexport type OpensteerNetworkMinimizeOptions = OpensteerNetworkMinimizeInput;\nexport type OpensteerNetworkMinimizeResult = OpensteerNetworkMinimizeOutput;\nexport type OpensteerNetworkDiffOptions = OpensteerNetworkDiffInput;\nexport type OpensteerNetworkDiffResult = OpensteerNetworkDiffOutput;\nexport type OpensteerNetworkProbeOptions = OpensteerTransportProbeInput;\nexport type OpensteerNetworkProbeResult = OpensteerTransportProbeOutput;\nexport type OpensteerReverseDiscoverOptions = OpensteerReverseDiscoverInput;\nexport type OpensteerReverseDiscoverResult = OpensteerReverseDiscoverOutput;\nexport type OpensteerReverseQueryOptions = OpensteerReverseQueryInput;\nexport type OpensteerReverseQueryResult = OpensteerReverseQueryOutput;\nexport type OpensteerReversePackageCreateOptions = OpensteerReversePackageCreateInput;\nexport type OpensteerReversePackageCreateResult = OpensteerReversePackageCreateOutput;\nexport type OpensteerReversePackageRunOptions = OpensteerReversePackageRunInput;\nexport type OpensteerReversePackageRunResult = OpensteerReversePackageRunOutput;\nexport type OpensteerReverseExportOptions = OpensteerReverseExportInput;\nexport type OpensteerReverseExportResult = OpensteerReverseExportOutput;\nexport type OpensteerReverseReportOptions = OpensteerReverseReportInput;\nexport type OpensteerReverseReportResult = OpensteerReverseReportOutput;\nexport type OpensteerReversePackageGetOptions = OpensteerReversePackageGetInput;\nexport type OpensteerReversePackageGetResult = OpensteerReversePackageGetOutput;\nexport type OpensteerReversePackageListOptions = OpensteerReversePackageListInput;\nexport type OpensteerReversePackageListResult = OpensteerReversePackageListOutput;\nexport type OpensteerReversePackagePatchOptions = OpensteerReversePackagePatchInput;\nexport type OpensteerReversePackagePatchResult = OpensteerReversePackagePatchOutput;\nexport type OpensteerInteractionCaptureOptions = OpensteerInteractionCaptureInput;\nexport type OpensteerInteractionCaptureResult = OpensteerInteractionCaptureOutput;\nexport type OpensteerInteractionGetOptions = OpensteerInteractionGetInput;\nexport type OpensteerInteractionGetResult = OpensteerInteractionGetOutput;\nexport type OpensteerInteractionDiffOptions = OpensteerInteractionDiffInput;\nexport type OpensteerInteractionDiffResult = OpensteerInteractionDiffOutput;\nexport type OpensteerInteractionReplayOptions = OpensteerInteractionReplayInput;\nexport type OpensteerInteractionReplayResult = OpensteerInteractionReplayOutput;\nexport type OpensteerNetworkClearOptions = OpensteerNetworkClearInput;\nexport type OpensteerNetworkClearResult = OpensteerNetworkClearOutput;\nexport type OpensteerRawRequestOptions = OpensteerRawRequestInput;\nexport type OpensteerRawRequestResult = OpensteerRawRequestOutput;\nexport type OpensteerRequestOptions = Omit<OpensteerRequestExecuteInput, \"key\">;\nexport type OpensteerRequestResult = OpensteerRequestExecuteOutput;\nexport type OpensteerCaptureScriptsOptions = OpensteerCaptureScriptsInput;\nexport type OpensteerCaptureScriptsResult = OpensteerCaptureScriptsOutput;\nexport type OpensteerScriptBeautifyOptions = OpensteerScriptBeautifyInput;\nexport type OpensteerScriptBeautifyResult = OpensteerScriptBeautifyOutput;\nexport type OpensteerScriptDeobfuscateOptions = OpensteerScriptDeobfuscateInput;\nexport type OpensteerScriptDeobfuscateResult = OpensteerScriptDeobfuscateOutput;\nexport type OpensteerScriptSandboxOptions = OpensteerScriptSandboxInput;\nexport type OpensteerScriptSandboxResult = OpensteerScriptSandboxOutput;\nexport type OpensteerArtifactReadOptions = OpensteerArtifactReadInput;\nexport type OpensteerArtifactReadResult = OpensteerArtifactReadOutput;\nexport type OpensteerCaptchaSolveOptions = OpensteerCaptchaSolveInput;\nexport type OpensteerCaptchaSolveResult = OpensteerCaptchaSolveOutput;\nexport type OpensteerAddInitScriptOptions = OpensteerAddInitScriptInput;\n\nexport interface OpensteerOptions extends OpensteerRuntimeOptions {\n readonly cloud?: boolean | OpensteerCloudOptions;\n}\n\nexport interface OpensteerAttachOptions {\n readonly name?: string;\n readonly rootDir?: string;\n}\n\nexport class Opensteer {\n private runtime!: OpensteerSemanticRuntime;\n private ownership!: \"owned\" | \"attached\";\n\n constructor(options: OpensteerOptions = {}) {\n this.runtime = createOpensteerSemanticRuntime({\n runtimeOptions: options,\n ...(options.cloud === undefined ? {} : { cloud: options.cloud }),\n });\n this.ownership = \"owned\";\n }\n\n static attach(options: OpensteerAttachOptions = {}): Opensteer {\n return Opensteer.fromRuntime(\n new AttachedOpensteerSessionProxy({\n ...(options.name === undefined ? {} : { name: options.name }),\n ...(options.rootDir === undefined ? {} : { rootDir: options.rootDir }),\n }),\n \"attached\",\n );\n }\n\n async open(input: string | OpensteerSessionOpenInput = {}): Promise<OpensteerSessionOpenOutput> {\n const normalized = typeof input === \"string\" ? { url: input } : input;\n if (this.ownership === \"attached\") {\n assertAttachedOpenInputAllowed(normalized);\n }\n\n return this.runtime.open(normalized);\n }\n\n async listPages(input: OpensteerPageListInput = {}): Promise<OpensteerPageListOutput> {\n return this.runtime.listPages(input);\n }\n\n async newPage(input: OpensteerPageNewInput = {}): Promise<OpensteerPageNewOutput> {\n return this.runtime.newPage(input);\n }\n\n async activatePage(input: OpensteerPageActivateInput): Promise<OpensteerPageActivateOutput> {\n return this.runtime.activatePage(input);\n }\n\n async closePage(input: OpensteerPageCloseInput = {}): Promise<OpensteerPageCloseOutput> {\n return this.runtime.closePage(input);\n }\n\n async goto(input: string | OpensteerGotoOptions): Promise<OpensteerPageGotoOutput> {\n return this.runtime.goto(typeof input === \"string\" ? { url: input } : input);\n }\n\n async evaluate(\n input: string | OpensteerPageEvaluateInput,\n ): Promise<OpensteerPageEvaluateOutput[\"value\"]> {\n const normalized =\n typeof input === \"string\"\n ? {\n script: input,\n }\n : input;\n const result = await this.runtime.evaluate(normalized);\n return result.value;\n }\n\n async evaluateJson(\n input: string | OpensteerPageEvaluateInput,\n ): Promise<OpensteerPageEvaluateOutput[\"value\"]> {\n return this.evaluate(input);\n }\n\n async addInitScript(\n input: string | OpensteerAddInitScriptInput,\n ): Promise<OpensteerAddInitScriptOutput> {\n const normalized =\n typeof input === \"string\"\n ? {\n script: input,\n }\n : input;\n return this.runtime.addInitScript(normalized);\n }\n\n async snapshot(\n input: OpensteerSnapshotMode | { readonly mode?: OpensteerSnapshotMode } = {},\n ): Promise<OpensteerPageSnapshotOutput> {\n const mode = typeof input === \"string\" ? input : input.mode;\n return this.runtime.snapshot(mode === undefined ? {} : { mode });\n }\n\n async click(input: OpensteerTargetOptions): Promise<OpensteerActionResult> {\n const normalized = normalizeTargetOptions(input);\n return this.runtime.click(normalized);\n }\n\n async hover(input: OpensteerTargetOptions): Promise<OpensteerActionResult> {\n const normalized = normalizeTargetOptions(input);\n return this.runtime.hover(normalized);\n }\n\n async input(input: OpensteerInputOptions): Promise<OpensteerActionResult> {\n const normalized = normalizeTargetOptions(input);\n return this.runtime.input({\n ...normalized,\n text: input.text,\n ...(input.pressEnter === undefined ? {} : { pressEnter: input.pressEnter }),\n });\n }\n\n async scroll(input: OpensteerScrollOptions): Promise<OpensteerActionResult> {\n const normalized = normalizeTargetOptions(input);\n return this.runtime.scroll({\n ...normalized,\n direction: input.direction,\n amount: input.amount,\n });\n }\n\n async extract(input: OpensteerExtractOptions): Promise<OpensteerDomExtractOutput[\"data\"]> {\n const result = await this.runtime.extract(input);\n return result.data;\n }\n\n async queryNetwork(\n input: OpensteerNetworkQueryOptions = {},\n ): Promise<OpensteerNetworkQueryResult> {\n return this.runtime.queryNetwork(input);\n }\n\n async waitForNetwork(\n input: OpensteerWaitForNetworkOptions,\n ): Promise<OpensteerNetworkQueryResult[\"records\"][number]> {\n const { timeoutMs, pollIntervalMs, ...query } = input;\n const timeoutAt = Date.now() + (timeoutMs ?? 30_000);\n const pollInterval = pollIntervalMs ?? 100;\n\n while (true) {\n const { records } = await this.runtime.queryNetwork({\n ...query,\n limit: 1,\n });\n if (records[0] !== undefined) {\n return records[0];\n }\n if (Date.now() >= timeoutAt) {\n throw new Error(\"waitForNetwork timed out\");\n }\n await delay(pollInterval);\n }\n }\n\n async waitForResponse(\n input: OpensteerWaitForNetworkOptions,\n ): Promise<OpensteerNetworkQueryResult[\"records\"][number]> {\n return this.waitForNetwork(input);\n }\n\n async waitForPage(\n input: OpensteerWaitForPageOptions = {},\n ): Promise<OpensteerPageListOutput[\"pages\"][number]> {\n const baseline = new Set((await this.runtime.listPages()).pages.map((page) => page.pageRef));\n const timeoutAt = Date.now() + (input.timeoutMs ?? 30_000);\n const pollIntervalMs = input.pollIntervalMs ?? 100;\n\n while (true) {\n const { pages } = await this.runtime.listPages();\n const match = pages.find((page) => {\n if (baseline.has(page.pageRef)) {\n return false;\n }\n if (input.openerPageRef !== undefined && page.openerPageRef !== input.openerPageRef) {\n return false;\n }\n if (input.urlIncludes !== undefined && !page.url.includes(input.urlIncludes)) {\n return false;\n }\n return true;\n });\n if (match !== undefined) {\n return match;\n }\n if (Date.now() >= timeoutAt) {\n throw new Error(\"waitForPage timed out\");\n }\n await delay(pollIntervalMs);\n }\n }\n\n async saveNetwork(input: OpensteerNetworkSaveOptions): Promise<OpensteerNetworkSaveResult> {\n return this.runtime.saveNetwork(input);\n }\n\n async minimizeNetwork(\n input: OpensteerNetworkMinimizeOptions,\n ): Promise<OpensteerNetworkMinimizeResult> {\n return this.runtime.minimizeNetwork(input);\n }\n\n async diffNetwork(input: OpensteerNetworkDiffOptions): Promise<OpensteerNetworkDiffResult> {\n return this.runtime.diffNetwork(input);\n }\n\n async probeNetwork(input: OpensteerNetworkProbeOptions): Promise<OpensteerNetworkProbeResult> {\n return this.runtime.probeNetwork(input);\n }\n\n async reverseDiscover(\n input: OpensteerReverseDiscoverOptions = {},\n ): Promise<OpensteerReverseDiscoverResult> {\n return this.runtime.discoverReverse(input);\n }\n\n async reverseQuery(input: OpensteerReverseQueryOptions): Promise<OpensteerReverseQueryResult> {\n return this.runtime.queryReverse(input);\n }\n\n async createReversePackage(\n input: OpensteerReversePackageCreateOptions,\n ): Promise<OpensteerReversePackageCreateResult> {\n return this.runtime.createReversePackage(input);\n }\n\n async runReversePackage(\n input: OpensteerReversePackageRunOptions,\n ): Promise<OpensteerReversePackageRunResult> {\n return this.runtime.runReversePackage(input);\n }\n\n async reverseExport(input: OpensteerReverseExportOptions): Promise<OpensteerReverseExportResult> {\n return this.runtime.exportReverse(input);\n }\n\n async reverseReport(input: OpensteerReverseReportOptions): Promise<OpensteerReverseReportResult> {\n return this.runtime.getReverseReport(input);\n }\n\n async getReversePackage(\n input: OpensteerReversePackageGetOptions,\n ): Promise<OpensteerReversePackageGetResult> {\n return this.runtime.getReversePackage(input);\n }\n\n async listReversePackages(\n input: OpensteerReversePackageListOptions = {},\n ): Promise<OpensteerReversePackageListResult> {\n return this.runtime.listReversePackages(input);\n }\n\n async patchReversePackage(\n input: OpensteerReversePackagePatchOptions,\n ): Promise<OpensteerReversePackagePatchResult> {\n return this.runtime.patchReversePackage(input);\n }\n\n async interactionCapture(\n input: OpensteerInteractionCaptureOptions,\n ): Promise<OpensteerInteractionCaptureResult> {\n return this.runtime.captureInteraction(input);\n }\n\n async getInteraction(\n input: OpensteerInteractionGetOptions,\n ): Promise<OpensteerInteractionGetResult> {\n return this.runtime.getInteraction(input);\n }\n\n async interactionDiff(\n input: OpensteerInteractionDiffOptions,\n ): Promise<OpensteerInteractionDiffResult> {\n return this.runtime.diffInteraction(input);\n }\n\n async interactionReplay(\n input: OpensteerInteractionReplayOptions,\n ): Promise<OpensteerInteractionReplayResult> {\n return this.runtime.replayInteraction(input);\n }\n\n async clearNetwork(\n input: OpensteerNetworkClearOptions = {},\n ): Promise<OpensteerNetworkClearResult> {\n return this.runtime.clearNetwork(input);\n }\n\n async captureScripts(\n input: OpensteerCaptureScriptsOptions = {},\n ): Promise<OpensteerCaptureScriptsResult> {\n return this.runtime.captureScripts(input);\n }\n\n async readArtifact(input: OpensteerArtifactReadOptions): Promise<OpensteerArtifactReadResult> {\n return this.runtime.readArtifact(input);\n }\n\n async beautifyScript(\n input: OpensteerScriptBeautifyOptions,\n ): Promise<OpensteerScriptBeautifyResult> {\n return this.runtime.beautifyScript(input);\n }\n\n async deobfuscateScript(\n input: OpensteerScriptDeobfuscateOptions,\n ): Promise<OpensteerScriptDeobfuscateResult> {\n return this.runtime.deobfuscateScript(input);\n }\n\n async sandboxScript(input: OpensteerScriptSandboxOptions): Promise<OpensteerScriptSandboxResult> {\n return this.runtime.sandboxScript(input);\n }\n\n async solveCaptcha(input: OpensteerCaptchaSolveOptions): Promise<OpensteerCaptchaSolveResult> {\n return this.runtime.solveCaptcha(input);\n }\n\n async getCookies(\n input: { readonly urls?: readonly string[] } = {},\n ): Promise<readonly CookieRecord[]> {\n return this.runtime.getCookies(input);\n }\n\n async getStorageSnapshot(\n input: {\n readonly includeSessionStorage?: boolean;\n readonly includeIndexedDb?: boolean;\n } = {},\n ): Promise<StorageSnapshot> {\n return this.runtime.getStorageSnapshot(input);\n }\n\n async writeRequestPlan(input: OpensteerWriteRequestPlanInput): Promise<RequestPlanRecord> {\n return this.runtime.writeRequestPlan(input);\n }\n\n async inferRequestPlan(input: OpensteerInferRequestPlanInput): Promise<RequestPlanRecord> {\n return this.runtime.inferRequestPlan(input);\n }\n\n async getRequestPlan(input: OpensteerGetRequestPlanInput): Promise<RequestPlanRecord> {\n return this.runtime.getRequestPlan(input);\n }\n\n async listRequestPlans(\n input: OpensteerListRequestPlansInput = {},\n ): Promise<OpensteerListRequestPlansOutput> {\n return this.runtime.listRequestPlans(input);\n }\n\n async writeAuthRecipe(input: OpensteerWriteAuthRecipeInput): Promise<AuthRecipeRecord> {\n return this.runtime.writeAuthRecipe(input);\n }\n\n async writeRecipe(input: OpensteerWriteRecipeInput): Promise<RecipeRecord> {\n return this.runtime.writeRecipe(input);\n }\n\n async getAuthRecipe(input: OpensteerGetAuthRecipeInput): Promise<AuthRecipeRecord> {\n return this.runtime.getAuthRecipe(input);\n }\n\n async getRecipe(input: OpensteerGetRecipeInput): Promise<RecipeRecord> {\n return this.runtime.getRecipe(input);\n }\n\n async listAuthRecipes(\n input: OpensteerListAuthRecipesInput = {},\n ): Promise<OpensteerListAuthRecipesOutput> {\n return this.runtime.listAuthRecipes(input);\n }\n\n async listRecipes(input: OpensteerListRecipesInput = {}): Promise<OpensteerListRecipesOutput> {\n return this.runtime.listRecipes(input);\n }\n\n async runAuthRecipe(input: OpensteerRunAuthRecipeInput): Promise<OpensteerRunAuthRecipeOutput> {\n return this.runtime.runAuthRecipe(input);\n }\n\n async runRecipe(input: OpensteerRunRecipeInput): Promise<OpensteerRunRecipeOutput> {\n return this.runtime.runRecipe(input);\n }\n\n async request(key: string, input: OpensteerRequestOptions = {}): Promise<OpensteerRequestResult> {\n return this.runtime.request({\n key,\n ...input,\n });\n }\n\n async rawRequest(input: OpensteerRawRequestOptions): Promise<OpensteerRawRequestResult> {\n return this.runtime.rawRequest(input);\n }\n\n async route(input: OpensteerRouteOptions): Promise<OpensteerRouteRegistration> {\n return this.requireOwnedInstrumentationRuntime(\"route\").route(input);\n }\n\n async interceptScript(\n input: OpensteerInterceptScriptOptions,\n ): Promise<OpensteerRouteRegistration> {\n return this.requireOwnedInstrumentationRuntime(\"interceptScript\").interceptScript(input);\n }\n\n async computerExecute(\n input: OpensteerComputerExecuteOptions,\n ): Promise<OpensteerComputerExecuteResult> {\n return this.runtime.computerExecute(input);\n }\n\n async close(): Promise<OpensteerSessionCloseOutput> {\n return this.runtime.close();\n }\n\n async disconnect(): Promise<void> {\n if (this.ownership === \"owned\") {\n await this.close();\n return;\n }\n\n if (isDisconnectableRuntime(this.runtime)) {\n await this.runtime.disconnect();\n }\n }\n\n private static fromRuntime(\n runtime: OpensteerSemanticRuntime,\n ownership: \"owned\" | \"attached\",\n ): Opensteer {\n const instance = Object.create(Opensteer.prototype) as Opensteer;\n instance.runtime = runtime;\n instance.ownership = ownership;\n return instance;\n }\n\n private requireOwnedInstrumentationRuntime(\n method: \"route\" | \"interceptScript\",\n ): OpensteerSessionRuntime {\n if (this.runtime instanceof OpensteerSessionRuntime) {\n return this.runtime;\n }\n throw new Error(`${method}() is only available on owned local SDK sessions.`);\n }\n}\n\nfunction assertAttachedOpenInputAllowed(input: OpensteerSessionOpenInput): void {\n if (input.browser !== undefined || input.context !== undefined || input.name !== undefined) {\n throw new Error(\n \"Opensteer.attach(...) reuses an existing session. open() may only receive url when attached.\",\n );\n }\n}\n\nfunction isDisconnectableRuntime(\n runtime: OpensteerSemanticRuntime,\n): runtime is OpensteerDisconnectableRuntime {\n return \"disconnect\" in runtime;\n}\n\nfunction normalizeTargetOptions(input: OpensteerTargetOptions): {\n readonly target: OpensteerTargetInput;\n readonly persistAsDescription?: string;\n readonly networkTag?: string;\n} {\n const hasElement = input.element !== undefined;\n const hasSelector = input.selector !== undefined;\n if (hasElement && hasSelector) {\n throw new Error(\"Specify exactly one of element, selector, or description.\");\n }\n\n if (hasElement) {\n return {\n target: {\n kind: \"element\",\n element: input.element!,\n },\n ...(input.description === undefined ? {} : { persistAsDescription: input.description }),\n ...(input.networkTag === undefined ? {} : { networkTag: input.networkTag }),\n };\n }\n\n if (hasSelector) {\n return {\n target: {\n kind: \"selector\",\n selector: input.selector!,\n },\n ...(input.description === undefined ? {} : { persistAsDescription: input.description }),\n ...(input.networkTag === undefined ? {} : { networkTag: input.networkTag }),\n };\n }\n\n if (input.description === undefined) {\n throw new Error(\"Specify exactly one of element, selector, or description.\");\n }\n\n return {\n target: {\n kind: \"description\",\n description: input.description,\n },\n ...(input.networkTag === undefined ? {} : { networkTag: input.networkTag }),\n };\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","export interface MousePathPoint {\n readonly x: number;\n readonly y: number;\n readonly t: number;\n}\n\nexport interface MousePath {\n readonly points: readonly MousePathPoint[];\n readonly durationMs: number;\n}\n\nexport function generateMousePath(input: {\n readonly start: { readonly x: number; readonly y: number };\n readonly end: { readonly x: number; readonly y: number };\n readonly durationMs?: number;\n readonly fps?: number;\n readonly jitter?: number;\n readonly curvature?: number;\n}): MousePath {\n const dx = input.end.x - input.start.x;\n const dy = input.end.y - input.start.y;\n const distance = Math.hypot(dx, dy);\n const durationMs = input.durationMs ?? Math.max(180, Math.round(distance * 2.2));\n const fps = input.fps ?? 60;\n const jitter = input.jitter ?? 3;\n const curvature = input.curvature ?? 0.3;\n const frameCount = Math.max(2, Math.round((durationMs / 1000) * fps));\n const normal = distance === 0 ? { x: 0, y: 1 } : { x: -dy / distance, y: dx / distance };\n const controlDistance = distance * curvature;\n const control1 = {\n x: input.start.x + dx * 0.33 + normal.x * controlDistance,\n y: input.start.y + dy * 0.33 + normal.y * controlDistance,\n };\n const control2 = {\n x: input.start.x + dx * 0.66 - normal.x * controlDistance * 0.6,\n y: input.start.y + dy * 0.66 - normal.y * controlDistance * 0.6,\n };\n\n const points: MousePathPoint[] = [];\n for (let index = 0; index <= frameCount; index += 1) {\n const linear = index / frameCount;\n const eased = easeInOutCubic(linear);\n const base = cubicBezier(input.start, control1, control2, input.end, eased);\n const noise = index === 0 || index === frameCount ? 0 : gaussianRandom() * jitter;\n points.push({\n x: base.x + normal.x * noise,\n y: base.y + normal.y * noise,\n t: Math.round(linear * durationMs),\n });\n }\n return {\n points,\n durationMs,\n };\n}\n\nexport function generateDragTrail(input: {\n readonly start: { readonly x: number; readonly y: number };\n readonly end: { readonly x: number; readonly y: number };\n readonly durationMs?: number;\n readonly fps?: number;\n}): MousePath {\n return generateMousePath({\n start: input.start,\n end: input.end,\n ...(input.durationMs === undefined ? {} : { durationMs: input.durationMs }),\n ...(input.fps === undefined ? {} : { fps: input.fps }),\n jitter: 1.5,\n curvature: 0.18,\n });\n}\n\nfunction cubicBezier(\n start: { readonly x: number; readonly y: number },\n control1: { readonly x: number; readonly y: number },\n control2: { readonly x: number; readonly y: number },\n end: { readonly x: number; readonly y: number },\n t: number,\n) {\n const inverse = 1 - t;\n return {\n x:\n inverse ** 3 * start.x +\n 3 * inverse ** 2 * t * control1.x +\n 3 * inverse * t ** 2 * control2.x +\n t ** 3 * end.x,\n y:\n inverse ** 3 * start.y +\n 3 * inverse ** 2 * t * control1.y +\n 3 * inverse * t ** 2 * control2.y +\n t ** 3 * end.y,\n };\n}\n\nfunction easeInOutCubic(t: number): number {\n return t < 0.5 ? 4 * t ** 3 : 1 - (-2 * t + 2) ** 3 / 2;\n}\n\nfunction gaussianRandom(): number {\n let u = 0;\n let v = 0;\n while (u === 0) {\n u = Math.random();\n }\n while (v === 0) {\n v = Math.random();\n }\n return Math.sqrt(-2 * Math.log(u)) * Math.cos(2 * Math.PI * v);\n}\n","export interface TypingCadenceSample {\n readonly character: string;\n readonly delayMs: number;\n}\n\nexport function generateTypingCadence(input: {\n readonly text: string;\n readonly baseDelayMs?: number;\n readonly jitterMs?: number;\n readonly hesitationProbability?: number;\n}): readonly TypingCadenceSample[] {\n const baseDelayMs = input.baseDelayMs ?? 75;\n const jitterMs = input.jitterMs ?? 35;\n const hesitationProbability = input.hesitationProbability ?? 0.08;\n\n return [...input.text].map((character, index) => {\n const previous = input.text[index - 1];\n const punctuationPause = /[.,!?;:]/.test(previous ?? \"\") ? 90 : 0;\n const whitespacePause = /\\s/.test(character) ? 30 : 0;\n const hesitation = Math.random() < hesitationProbability ? 120 + Math.random() * 180 : 0;\n const jitter = (Math.random() * 2 - 1) * jitterMs;\n return {\n character,\n delayMs: Math.max(\n 10,\n Math.round(baseDelayMs + punctuationPause + whitespacePause + hesitation + jitter),\n ),\n };\n });\n}\n","export interface ScrollPatternPoint {\n readonly deltaY: number;\n readonly t: number;\n}\n\nexport interface ScrollPattern {\n readonly points: readonly ScrollPatternPoint[];\n readonly durationMs: number;\n}\n\nexport function generateScrollPattern(input: {\n readonly distancePx: number;\n readonly durationMs?: number;\n readonly fps?: number;\n}): ScrollPattern {\n const durationMs =\n input.durationMs ?? Math.max(220, Math.round(Math.abs(input.distancePx) * 0.9));\n const fps = input.fps ?? 60;\n const frames = Math.max(2, Math.round((durationMs / 1000) * fps));\n let previousDistance = 0;\n const points: ScrollPatternPoint[] = [];\n for (let index = 0; index <= frames; index += 1) {\n const progress = easeInOutQuad(index / frames);\n const currentDistance = progress * input.distancePx;\n points.push({\n deltaY: Math.round(currentDistance - previousDistance),\n t: Math.round((index / frames) * durationMs),\n });\n previousDistance = currentDistance;\n }\n return {\n points,\n durationMs,\n };\n}\n\nfunction easeInOutQuad(t: number): number {\n return t < 0.5 ? 2 * t * t : 1 - (-2 * t + 2) ** 2 / 2;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,86 +1,82 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opensteer",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.7.1",
|
|
4
|
+
"description": "Opensteer browser automation, replay, and reverse-engineering toolkit.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
|
-
"
|
|
8
|
-
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/steerlabs/opensteer.git",
|
|
11
|
+
"directory": "packages/opensteer"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/steerlabs/opensteer/issues"
|
|
15
|
+
},
|
|
16
|
+
"homepage": "https://github.com/steerlabs/opensteer/tree/main/packages/opensteer#readme",
|
|
17
|
+
"keywords": [
|
|
18
|
+
"browser-automation",
|
|
19
|
+
"playwright",
|
|
20
|
+
"web-automation",
|
|
21
|
+
"agents",
|
|
22
|
+
"scraping",
|
|
23
|
+
"reverse-engineering"
|
|
24
|
+
],
|
|
25
|
+
"engines": {
|
|
26
|
+
"node": ">=22"
|
|
9
27
|
},
|
|
10
28
|
"main": "./dist/index.cjs",
|
|
11
29
|
"module": "./dist/index.js",
|
|
12
30
|
"types": "./dist/index.d.ts",
|
|
31
|
+
"bin": {
|
|
32
|
+
"opensteer": "./dist/cli/bin.js"
|
|
33
|
+
},
|
|
13
34
|
"exports": {
|
|
14
35
|
".": {
|
|
15
|
-
"
|
|
16
|
-
|
|
17
|
-
|
|
36
|
+
"import": {
|
|
37
|
+
"types": "./dist/index.d.ts",
|
|
38
|
+
"default": "./dist/index.js"
|
|
39
|
+
},
|
|
40
|
+
"require": {
|
|
41
|
+
"types": "./dist/index.d.cts",
|
|
42
|
+
"default": "./dist/index.cjs"
|
|
43
|
+
}
|
|
18
44
|
}
|
|
19
45
|
},
|
|
20
46
|
"files": [
|
|
21
47
|
"dist",
|
|
22
|
-
"
|
|
23
|
-
"skills",
|
|
24
|
-
"README.md",
|
|
25
|
-
"LICENSE",
|
|
26
|
-
"CHANGELOG.md"
|
|
48
|
+
"skills"
|
|
27
49
|
],
|
|
28
50
|
"dependencies": {
|
|
29
|
-
"@
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"@ai-sdk/openai": "^3.0.26",
|
|
33
|
-
"@ai-sdk/xai": "^3.0.57",
|
|
34
|
-
"@anthropic-ai/sdk": "^0.57.0",
|
|
35
|
-
"@google/genai": "^1.10.0",
|
|
36
|
-
"ai": "^6.0.77",
|
|
37
|
-
"cheerio": "^1.0.0-rc.12",
|
|
38
|
-
"dotenv": "^17.2.4",
|
|
39
|
-
"open": "^11.0.0",
|
|
40
|
-
"openai": "^6.25.0",
|
|
41
|
-
"playwright": "^1.50.0",
|
|
42
|
-
"skills": "1.4.3",
|
|
43
|
-
"ws": "^8.18.0",
|
|
44
|
-
"zod": "^4.3.6"
|
|
45
|
-
},
|
|
46
|
-
"devDependencies": {
|
|
47
|
-
"@types/node": "^22.10.0",
|
|
48
|
-
"@types/ws": "^8.5.13",
|
|
51
|
+
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
52
|
+
"cheerio": "^1.1.2",
|
|
53
|
+
"css-select": "^6.0.0",
|
|
49
54
|
"domhandler": "^5.0.3",
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
"
|
|
55
|
+
"prettier": "^3.8.1",
|
|
56
|
+
"sharp": "^0.34.5",
|
|
57
|
+
"skills": "^1.4.6",
|
|
58
|
+
"@opensteer/engine-playwright": "0.7.0"
|
|
54
59
|
},
|
|
55
|
-
"
|
|
56
|
-
"
|
|
60
|
+
"optionalDependencies": {
|
|
61
|
+
"webcrack": "^2.15.1"
|
|
57
62
|
},
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
"selectors",
|
|
61
|
-
"playwright",
|
|
62
|
-
"llm",
|
|
63
|
-
"agents"
|
|
64
|
-
],
|
|
65
|
-
"repository": {
|
|
66
|
-
"type": "git",
|
|
67
|
-
"url": "https://github.com/steerlabs/opensteer"
|
|
63
|
+
"peerDependencies": {
|
|
64
|
+
"@opensteer/engine-abp": "0.7.0"
|
|
68
65
|
},
|
|
69
|
-
"
|
|
70
|
-
|
|
71
|
-
|
|
66
|
+
"peerDependenciesMeta": {
|
|
67
|
+
"@opensteer/engine-abp": {
|
|
68
|
+
"optional": true
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
"devDependencies": {
|
|
72
|
+
"@opensteer/cloud-contracts": "0.7.0",
|
|
73
|
+
"@opensteer/engine-abp": "0.7.0",
|
|
74
|
+
"@opensteer/protocol": "0.7.0",
|
|
75
|
+
"@opensteer/browser-core": "0.7.0"
|
|
72
76
|
},
|
|
73
77
|
"scripts": {
|
|
74
|
-
"build": "tsup
|
|
75
|
-
"
|
|
76
|
-
"
|
|
77
|
-
"test:unit": "vitest run tests/html tests/element-path tests/config.test.ts tests/storage",
|
|
78
|
-
"test:actions": "vitest run tests/actions",
|
|
79
|
-
"test:integration": "vitest run tests/integration",
|
|
80
|
-
"test:ai": "vitest run tests/ai tests/e2e/ai-resolve.test.ts tests/e2e/ai-extract-products.test.ts",
|
|
81
|
-
"test:e2e": "vitest run tests/e2e",
|
|
82
|
-
"test:e2e:cua": "vitest run tests/e2e/cua-agent.test.ts",
|
|
83
|
-
"test:app:dev": "npm --prefix tests/test-app run dev",
|
|
84
|
-
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
78
|
+
"build": "tsup && node ../../scripts/sync-package-skills.mjs",
|
|
79
|
+
"clean": "rimraf dist skills",
|
|
80
|
+
"typecheck": "tsc --noEmit -p tsconfig.json"
|
|
85
81
|
}
|
|
86
82
|
}
|
package/skills/README.md
CHANGED
|
@@ -1,29 +1,30 @@
|
|
|
1
1
|
# Opensteer Skills
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
First-party Opensteer skills published from this repository for agents that use the upstream [`skills`](https://skills.sh) ecosystem.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Install
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
```text
|
|
10
|
-
skills/<skill-name>/
|
|
11
|
-
SKILL.md
|
|
12
|
-
references/
|
|
13
|
-
*.md
|
|
14
|
-
templates/
|
|
15
|
-
*
|
|
7
|
+
```bash
|
|
8
|
+
opensteer skills install
|
|
16
9
|
```
|
|
17
10
|
|
|
18
|
-
##
|
|
11
|
+
## Available Skills
|
|
12
|
+
|
|
13
|
+
- `opensteer`: browser automation, structured extraction, and browser-backed API reverse engineering with the Opensteer CLI and SDK
|
|
19
14
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
15
|
+
## Repository Layout
|
|
16
|
+
|
|
17
|
+
```text
|
|
18
|
+
skills/
|
|
19
|
+
opensteer/
|
|
20
|
+
SKILL.md
|
|
21
|
+
references/
|
|
22
|
+
cli-reference.md
|
|
23
|
+
sdk-reference.md
|
|
24
|
+
request-workflow.md
|
|
25
|
+
```
|
|
25
26
|
|
|
26
|
-
##
|
|
27
|
+
## Maintainers
|
|
27
28
|
|
|
28
|
-
- `
|
|
29
|
-
- `
|
|
29
|
+
- Run `pnpm run skills:check` to verify that the upstream `skills` CLI can discover this repository.
|
|
30
|
+
- Keep each skill self-contained under `skills/<name>/` and keep links relative.
|
|
@@ -1,224 +1,90 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: opensteer
|
|
3
|
-
description: "Browser automation,
|
|
3
|
+
description: "Browser automation, scraping, structured extraction, and browser-backed API reverse engineering with the Opensteer CLI and SDK. Use when a task needs to open pages, interact with elements, capture network traffic, write request plans, or turn a browser workflow into reusable code."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Opensteer
|
|
6
|
+
# Opensteer
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
**Writing a scraper script?** Follow Phase 2.
|
|
8
|
+
Use this skill when a task needs a real browser workflow, structured extraction, or browser-backed replay.
|
|
10
9
|
|
|
11
|
-
|
|
10
|
+
Choose the reference that matches the job:
|
|
12
11
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
**Step 1 — Set session and open the page.**
|
|
18
|
-
|
|
19
|
-
```bash
|
|
20
|
-
export OPENSTEER_SESSION=my-session
|
|
21
|
-
opensteer open https://example.com --name "my-scraper"
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
The `--name` value is the cache namespace. It must match `name:` in the SDK constructor (Phase 2). Pick a stable name now and do not change it.
|
|
25
|
-
|
|
26
|
-
**Step 2 — Snapshot and interact using counters.**
|
|
27
|
-
|
|
28
|
-
Use `snapshot action` for interactions. Use `snapshot extraction` for data. Each element in the output has a counter (`c="N"`). Use that number directly.
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
opensteer snapshot action
|
|
32
|
-
opensteer click 3
|
|
33
|
-
opensteer input 5 "laptop" --pressEnter
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
**Step 3 — Navigate and re-snapshot after every page change.**
|
|
37
|
-
|
|
38
|
-
```bash
|
|
39
|
-
opensteer navigate https://example.com/results
|
|
40
|
-
opensteer snapshot action
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
> Use `opensteer open` once at the start only. Use `opensteer navigate` for all subsequent pages — it includes a visual stability wait that `open` does not.
|
|
44
|
-
|
|
45
|
-
**Step 4 — Cache every action and extraction with `--description`.**
|
|
46
|
-
|
|
47
|
-
Re-run each action with `--description` added. This writes the resolved selector to the cache so scripts replay without counters.
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
opensteer click 3 --description "the products link"
|
|
51
|
-
opensteer input 5 "laptop" --pressEnter --description "the search input"
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
For data, the agent must define the extraction object from the snapshot.
|
|
12
|
+
- CLI exploration: [references/cli-reference.md](references/cli-reference.md)
|
|
13
|
+
- SDK automation: [references/sdk-reference.md](references/sdk-reference.md)
|
|
14
|
+
- Request capture and replay: [references/request-workflow.md](references/request-workflow.md)
|
|
55
15
|
|
|
56
|
-
|
|
57
|
-
- Decide the exact JSON object the task needs.
|
|
58
|
-
- Treat the extraction snapshot as a planning aid only. It is trimmed/filtered, so do not read final values from the snapshot HTML itself.
|
|
59
|
-
- Build the full `extract` schema yourself so every leaf field is explicitly bound with `{ element: N }`, `{ element: N, attribute: "..." }`, or `{ source: "current_url" }`.
|
|
60
|
-
- Always call `extract` to read the actual field values from the live page/runtime DOM.
|
|
61
|
-
- Use `--description` only to cache that extraction for replay. Do not rely on `--description` to tell Opensteer what data to collect.
|
|
62
|
-
- For arrays, include at least 2 representative items so Opensteer infers the repeating pattern.
|
|
63
|
-
- Do not replace `extract` with custom DOM parsing when the desired output can be expressed as a structured object.
|
|
16
|
+
## Default Workflow
|
|
64
17
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
```
|
|
18
|
+
1. Start with the CLI when you need to explore a site, inspect state, or prove the workflow on a real page.
|
|
19
|
+
2. Re-snapshot after each meaningful page or DOM change before reusing counters.
|
|
20
|
+
3. Add `--description` when you want selector persistence and later replay.
|
|
21
|
+
4. Move to the SDK when the workflow should become reusable code in the repository.
|
|
22
|
+
5. Move to request capture and request plans when the real target is a browser-backed API.
|
|
71
23
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
**Step 5 — Close when done.**
|
|
24
|
+
## CLI Exploration
|
|
75
25
|
|
|
76
26
|
```bash
|
|
77
|
-
opensteer
|
|
27
|
+
opensteer open https://example.com --name my-workflow
|
|
28
|
+
opensteer snapshot action --name my-workflow
|
|
29
|
+
opensteer click 3 --name my-workflow --description "primary button"
|
|
30
|
+
opensteer snapshot extraction --name my-workflow
|
|
31
|
+
opensteer extract --name my-workflow \
|
|
32
|
+
--description "page summary" \
|
|
33
|
+
--schema '{"title":{"selector":"title"},"url":{"source":"current_url"}}'
|
|
34
|
+
opensteer close --name my-workflow
|
|
78
35
|
```
|
|
79
36
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
---
|
|
37
|
+
Rules:
|
|
83
38
|
|
|
84
|
-
|
|
39
|
+
- Use `opensteer open` once to create the session, then use `goto`, actions, snapshots, and extraction against the same `--name`.
|
|
40
|
+
- Treat counter targets as snapshot-local. Always take a fresh `snapshot action` before reusing counters after the page changes.
|
|
41
|
+
- Use `snapshot extraction` plus `extract` for structured data. Do not treat snapshot HTML as the final data source.
|
|
42
|
+
- Use `--description` whenever the action or extraction should be replayable later.
|
|
85
43
|
|
|
86
|
-
|
|
44
|
+
## SDK Automation
|
|
87
45
|
|
|
88
|
-
```
|
|
46
|
+
```ts
|
|
89
47
|
import { Opensteer } from "opensteer";
|
|
90
48
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
await opensteer.launch({ headless: false }); // headless: false — many sites block headless
|
|
98
|
-
|
|
99
|
-
try {
|
|
100
|
-
await opensteer.goto("https://example.com");
|
|
49
|
+
const opensteer = new Opensteer({
|
|
50
|
+
name: "my-workflow",
|
|
51
|
+
rootDir: process.cwd(),
|
|
52
|
+
browser: { headless: true },
|
|
53
|
+
});
|
|
101
54
|
|
|
102
|
-
|
|
103
|
-
|
|
55
|
+
try {
|
|
56
|
+
await opensteer.open("https://example.com");
|
|
57
|
+
await opensteer.snapshot("action");
|
|
104
58
|
|
|
105
|
-
|
|
59
|
+
const data = await opensteer.extract({
|
|
60
|
+
description: "page summary",
|
|
61
|
+
schema: {
|
|
62
|
+
title: { selector: "title" },
|
|
63
|
+
url: { source: "current_url" },
|
|
64
|
+
},
|
|
65
|
+
});
|
|
106
66
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
await opensteer.close();
|
|
111
|
-
}
|
|
67
|
+
console.log(data);
|
|
68
|
+
} finally {
|
|
69
|
+
await opensteer.close();
|
|
112
70
|
}
|
|
113
|
-
|
|
114
|
-
run().catch((err) => { console.error(err); process.exit(1); });
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
> **SDK Rule**: Every browser action in a script MUST use an `opensteer.*` method.
|
|
118
|
-
|
|
119
|
-
**Before writing a script, verify:**
|
|
120
|
-
1. Every interaction uses `opensteer.click()`, `opensteer.input()`, `opensteer.hover()`, `opensteer.extract()` — not `page.*` equivalents
|
|
121
|
-
2. Every extraction uses `opensteer.extract({ description: "..." })` — not `page.evaluate()` for DOM data
|
|
122
|
-
3. Waits use `opensteer.waitForText()` — not `page.waitForSelector()` (unless no stable text exists)
|
|
123
|
-
|
|
124
|
-
**Critical method signatures:**
|
|
125
|
-
|
|
126
|
-
```typescript
|
|
127
|
-
await opensteer.goto(url);
|
|
128
|
-
await opensteer.goto(url, { timeout: 60000 });
|
|
129
|
-
|
|
130
|
-
await opensteer.click({ description: "..." });
|
|
131
|
-
await opensteer.input({ description: "...", text: "...", pressEnter: true });
|
|
132
|
-
await opensteer.hover({ description: "..." });
|
|
133
|
-
await opensteer.select({ description: "...", label: "Option A" });
|
|
134
|
-
await opensteer.scroll({ direction: "down", amount: 500 });
|
|
135
|
-
|
|
136
|
-
await opensteer.extract({ description: "..." }); // replay from cache
|
|
137
|
-
await opensteer.extract({ schema: { title: { element: 3 } }, description: "..." }); // explicit first cache
|
|
138
|
-
await opensteer.extract({
|
|
139
|
-
description: "article images with captions and credits",
|
|
140
|
-
schema: {
|
|
141
|
-
images: [
|
|
142
|
-
{
|
|
143
|
-
imageUrl: { element: 11, attribute: "src" },
|
|
144
|
-
alt: { element: 11, attribute: "alt" },
|
|
145
|
-
caption: { element: 14 },
|
|
146
|
-
credit: { element: 15 },
|
|
147
|
-
},
|
|
148
|
-
{
|
|
149
|
-
imageUrl: { element: 24, attribute: "src" },
|
|
150
|
-
alt: { element: 24, attribute: "alt" },
|
|
151
|
-
caption: { element: 27 },
|
|
152
|
-
credit: { element: 28 },
|
|
153
|
-
},
|
|
154
|
-
],
|
|
155
|
-
},
|
|
156
|
-
}); // first extraction run: agent defines the full object from the snapshot
|
|
157
|
-
|
|
158
|
-
await opensteer.waitForText("literal text"); // page-transition wait
|
|
159
|
-
|
|
160
|
-
// Do NOT add waits before opensteer actions — they handle waiting internally.
|
|
161
71
|
```
|
|
162
72
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
---
|
|
166
|
-
|
|
167
|
-
## Edge Cases
|
|
73
|
+
Rules:
|
|
168
74
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
# Connect (works even if Chrome has zero open tabs):
|
|
175
|
-
opensteer open --cdp-url http://localhost:9222 --name "my-scraper"
|
|
176
|
-
```
|
|
75
|
+
- Wrap owned sessions in `try/finally` and call `close()`.
|
|
76
|
+
- Use `Opensteer.attach(...)` plus `disconnect()` when you are attaching to an existing CLI-owned session.
|
|
77
|
+
- Prefer Opensteer methods over raw Playwright calls so actions, extraction, and replay semantics stay inside the product surface.
|
|
78
|
+
- Use `networkTag` on actions when you intend to inspect or promote the network traffic they trigger.
|
|
177
79
|
|
|
178
|
-
|
|
179
|
-
```bash
|
|
180
|
-
opensteer open https://example.com --browser real --name "my-scraper" # headless
|
|
181
|
-
opensteer open https://example.com --browser real --headed --name "my-scraper" # visible window
|
|
182
|
-
opensteer open https://example.com --browser real --profile "Profile 1" --headed # specific profile
|
|
183
|
-
```
|
|
184
|
-
`--browser real` clones your local Chrome profile. Defaults to headless — add `--headed` to see the window. Profile cloning takes several seconds; do not assume the command hung.
|
|
185
|
-
|
|
186
|
-
**Tab management:**
|
|
187
|
-
```bash
|
|
188
|
-
opensteer tabs
|
|
189
|
-
opensteer tab-new https://example.com
|
|
190
|
-
opensteer tab-switch 0
|
|
191
|
-
opensteer tab-close 1
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
**Debugging failures (diagnose in this order):**
|
|
195
|
-
1. SPA content not loaded — add `opensteer.waitForText()` before extraction.
|
|
196
|
-
2. Missing cache — re-run Phase 1 caching step for the page type that failed.
|
|
197
|
-
3. Obstacle blocking target — cookie banner, modal, or login wall. Dismiss it first.
|
|
198
|
-
4. Timeout on navigation — increase timeout: `opensteer navigate <url> --timeout 60000`.
|
|
199
|
-
5. CDP connection refused — verify `curl -s http://127.0.0.1:<port>/json/version` returns JSON.
|
|
200
|
-
6. Stale counters — take a fresh `snapshot action` and re-identify elements.
|
|
201
|
-
|
|
202
|
-
### Advanced: Direct Page Access (rare)
|
|
203
|
-
|
|
204
|
-
Use `opensteer.page` ONLY for these two patterns. There are no other valid uses.
|
|
205
|
-
|
|
206
|
-
**SPA selector guard** — when `waitForText` cannot work (no stable visible text):
|
|
207
|
-
```typescript
|
|
208
|
-
await opensteer.page.waitForSelector("css-selector");
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
**Internal API call** — site has REST/GraphQL endpoints and you need session cookies:
|
|
212
|
-
```typescript
|
|
213
|
-
await opensteer.goto("https://example.com");
|
|
214
|
-
const data = await opensteer.page.evaluate(async () => {
|
|
215
|
-
const res = await fetch("https://api.example.com/items?limit=100");
|
|
216
|
-
return res.json();
|
|
217
|
-
});
|
|
218
|
-
```
|
|
80
|
+
## Request Capture And Replay
|
|
219
81
|
|
|
220
|
-
|
|
82
|
+
Use Opensteer's reverse-engineering flow when the deliverable is a custom API or a replayable request plan:
|
|
221
83
|
|
|
222
|
-
|
|
84
|
+
1. Perform the browser action that triggers the request.
|
|
85
|
+
2. Inspect traffic with `queryNetwork()` or `opensteer network query`.
|
|
86
|
+
3. Retry the request with `rawRequest()` or `opensteer request raw`.
|
|
87
|
+
4. Promote the captured request with `inferRequestPlan()` or `opensteer plan infer`.
|
|
88
|
+
5. Replay it with `request()` or `opensteer request execute`.
|
|
223
89
|
|
|
224
|
-
|
|
90
|
+
Read [references/request-workflow.md](references/request-workflow.md) before implementing request-plan work.
|