libretto 0.5.0 → 0.5.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.
Files changed (116) hide show
  1. package/README.md +106 -36
  2. package/dist/cli/cli.js +22 -97
  3. package/dist/cli/commands/browser.js +86 -59
  4. package/dist/cli/commands/execution.js +199 -86
  5. package/dist/cli/commands/init.js +30 -8
  6. package/dist/cli/commands/logs.js +4 -5
  7. package/dist/cli/commands/shared.js +30 -29
  8. package/dist/cli/commands/snapshot.js +26 -39
  9. package/dist/cli/core/ai-config.js +9 -2
  10. package/dist/cli/core/api-snapshot-analyzer.js +15 -5
  11. package/dist/cli/core/browser.js +132 -29
  12. package/dist/cli/core/context.js +4 -1
  13. package/dist/cli/core/session-telemetry.js +5 -2
  14. package/dist/cli/core/session.js +21 -8
  15. package/dist/cli/core/snapshot-analyzer.js +14 -31
  16. package/dist/cli/core/snapshot-api-config.js +2 -6
  17. package/dist/cli/core/telemetry.js +10 -2
  18. package/dist/cli/framework/simple-cli.js +45 -25
  19. package/dist/cli/router.js +14 -21
  20. package/dist/cli/workers/run-integration-runtime.js +24 -5
  21. package/dist/cli/workers/run-integration-worker-protocol.js +3 -1
  22. package/dist/cli/workers/run-integration-worker.js +1 -4
  23. package/dist/index.d.ts +1 -2
  24. package/dist/index.js +7 -10
  25. package/dist/runtime/download/download.js +5 -1
  26. package/dist/runtime/extract/extract.js +11 -2
  27. package/dist/runtime/network/network.js +8 -1
  28. package/dist/runtime/recovery/agent.js +6 -2
  29. package/dist/runtime/recovery/errors.js +3 -1
  30. package/dist/runtime/recovery/recovery.js +3 -1
  31. package/dist/shared/condense-dom/condense-dom.js +6 -13
  32. package/dist/shared/config/config.d.ts +1 -9
  33. package/dist/shared/config/config.js +0 -18
  34. package/dist/shared/config/index.d.ts +2 -1
  35. package/dist/shared/config/index.js +0 -10
  36. package/dist/shared/debug/pause.js +9 -3
  37. package/dist/shared/instrumentation/instrument.js +101 -5
  38. package/dist/shared/llm/ai-sdk-adapter.js +3 -1
  39. package/dist/shared/llm/client.js +3 -1
  40. package/dist/shared/logger/index.js +4 -1
  41. package/dist/shared/run/api.js +3 -1
  42. package/dist/shared/run/browser.js +7 -2
  43. package/dist/shared/state/session-state.d.ts +2 -1
  44. package/dist/shared/state/session-state.js +5 -2
  45. package/dist/shared/visualization/ghost-cursor.js +19 -10
  46. package/dist/shared/visualization/highlight.js +9 -6
  47. package/dist/shared/workflow/workflow.d.ts +4 -5
  48. package/dist/shared/workflow/workflow.js +3 -5
  49. package/package.json +6 -2
  50. package/scripts/check-skills-sync.mjs +25 -0
  51. package/scripts/compare-eval-summary.mjs +47 -0
  52. package/scripts/postinstall.mjs +15 -15
  53. package/scripts/prepare-release.sh +97 -0
  54. package/scripts/skills-libretto.mjs +103 -0
  55. package/scripts/summarize-evals.mjs +135 -0
  56. package/scripts/sync-skills.mjs +12 -0
  57. package/skills/libretto/SKILL.md +113 -49
  58. package/skills/libretto/references/code-generation-rules.md +208 -0
  59. package/skills/libretto/references/configuration-file-reference.md +53 -0
  60. package/skills/libretto/references/site-security-review.md +143 -0
  61. package/src/cli/cli.ts +23 -110
  62. package/src/cli/commands/browser.ts +94 -70
  63. package/src/cli/commands/execution.ts +233 -102
  64. package/src/cli/commands/init.ts +32 -9
  65. package/src/cli/commands/logs.ts +7 -7
  66. package/src/cli/commands/shared.ts +36 -37
  67. package/src/cli/commands/snapshot.ts +44 -59
  68. package/src/cli/core/ai-config.ts +12 -3
  69. package/src/cli/core/api-snapshot-analyzer.ts +17 -6
  70. package/src/cli/core/browser.ts +178 -41
  71. package/src/cli/core/context.ts +7 -2
  72. package/src/cli/core/session-telemetry.ts +19 -8
  73. package/src/cli/core/session.ts +21 -7
  74. package/src/cli/core/snapshot-analyzer.ts +26 -46
  75. package/src/cli/core/snapshot-api-config.ts +170 -175
  76. package/src/cli/core/telemetry.ts +16 -3
  77. package/src/cli/framework/simple-cli.ts +144 -77
  78. package/src/cli/router.ts +13 -21
  79. package/src/cli/workers/run-integration-runtime.ts +36 -9
  80. package/src/cli/workers/run-integration-worker-protocol.ts +2 -0
  81. package/src/cli/workers/run-integration-worker.ts +1 -4
  82. package/src/index.ts +73 -66
  83. package/src/runtime/download/download.ts +62 -58
  84. package/src/runtime/download/index.ts +5 -5
  85. package/src/runtime/extract/extract.ts +71 -61
  86. package/src/runtime/network/index.ts +3 -3
  87. package/src/runtime/network/network.ts +99 -93
  88. package/src/runtime/recovery/agent.ts +217 -212
  89. package/src/runtime/recovery/errors.ts +107 -104
  90. package/src/runtime/recovery/index.ts +3 -3
  91. package/src/runtime/recovery/recovery.ts +38 -35
  92. package/src/shared/condense-dom/condense-dom.ts +15 -18
  93. package/src/shared/config/config.ts +0 -19
  94. package/src/shared/config/index.ts +0 -5
  95. package/src/shared/debug/pause.ts +57 -51
  96. package/src/shared/instrumentation/errors.ts +64 -62
  97. package/src/shared/instrumentation/index.ts +5 -5
  98. package/src/shared/instrumentation/instrument.ts +339 -209
  99. package/src/shared/llm/ai-sdk-adapter.ts +58 -55
  100. package/src/shared/llm/client.ts +181 -174
  101. package/src/shared/llm/types.ts +39 -39
  102. package/src/shared/logger/index.ts +11 -4
  103. package/src/shared/logger/logger.ts +312 -306
  104. package/src/shared/logger/sinks.ts +118 -114
  105. package/src/shared/paths/paths.ts +50 -49
  106. package/src/shared/paths/repo-root.ts +17 -17
  107. package/src/shared/run/api.ts +5 -1
  108. package/src/shared/run/browser.ts +12 -3
  109. package/src/shared/state/index.ts +9 -9
  110. package/src/shared/state/session-state.ts +46 -43
  111. package/src/shared/visualization/ghost-cursor.ts +161 -148
  112. package/src/shared/visualization/highlight.ts +89 -86
  113. package/src/shared/visualization/index.ts +13 -13
  114. package/src/shared/workflow/workflow.ts +19 -25
  115. package/skills/libretto/references/reverse-engineering-network-requests.md +0 -39
  116. package/skills/libretto/references/user-action-log.md +0 -31
@@ -1,22 +1,25 @@
1
1
  import { z } from "zod";
2
- import type { LoggerApi } from "../../shared/logger/index.js";
3
2
  import {
4
3
  runClose as runCloseWithLogger,
5
4
  runCloseAll as runCloseAllWithLogger,
5
+ runConnect as runConnectWithLogger,
6
6
  runOpen,
7
7
  runPages,
8
8
  runSave,
9
9
  } from "../core/browser.js";
10
- import { withSessionLogger } from "../core/context.js";
11
- import { assertSessionAvailableForStart } from "../core/session.js";
10
+ import { createLoggerForSession, withSessionLogger } from "../core/context.js";
11
+ import {
12
+ assertSessionAvailableForStart,
13
+ validateSessionName,
14
+ } from "../core/session.js";
12
15
  import { SimpleCLI } from "../framework/simple-cli.js";
13
16
  import {
14
- loadSessionStateMiddleware,
15
- resolveSessionMiddleware,
16
17
  sessionOption,
18
+ withAutoSession,
19
+ withRequiredSession,
17
20
  } from "./shared.js";
18
21
 
19
- function parseViewportArg(
22
+ export function parseViewportArg(
20
23
  viewportArg: string | undefined,
21
24
  ): { width: number; height: number } | undefined {
22
25
  if (!viewportArg) return undefined;
@@ -63,19 +66,40 @@ export const openInput = SimpleCLI.input({
63
66
  "Cannot pass both --headed and --headless.",
64
67
  );
65
68
 
66
- export function createOpenCommand(logger: LoggerApi) {
67
- return SimpleCLI.command({
68
- description: "Launch browser and open URL (headed by default)",
69
- })
70
- .input(openInput)
71
- .use(resolveSessionMiddleware)
72
- .handle(async ({ input, ctx }) => {
73
- assertSessionAvailableForStart(ctx.session, logger);
74
- const headed = input.headed || !input.headless;
75
- const viewport = parseViewportArg(input.viewport);
76
- await runOpen(input.url!, headed, ctx.session, logger, { viewport });
77
- });
78
- }
69
+ export const openCommand = SimpleCLI.command({
70
+ description: "Launch browser and open URL (headed by default)",
71
+ })
72
+ .input(openInput)
73
+ .use(withAutoSession())
74
+ .handle(async ({ input, ctx }) => {
75
+ assertSessionAvailableForStart(ctx.session, ctx.logger);
76
+ const headed = input.headed || !input.headless;
77
+ const viewport = parseViewportArg(input.viewport);
78
+ await runOpen(input.url!, headed, ctx.session, ctx.logger, { viewport });
79
+ });
80
+
81
+ export const connectInput = SimpleCLI.input({
82
+ positionals: [
83
+ SimpleCLI.positional("cdpUrl", z.string().optional(), {
84
+ help: "CDP endpoint URL (e.g. http://127.0.0.1:9222)",
85
+ }),
86
+ ],
87
+ named: {
88
+ session: sessionOption(),
89
+ },
90
+ }).refine(
91
+ (input) => Boolean(input.cdpUrl),
92
+ `Usage: libretto connect <cdp-url> --session <name>`,
93
+ );
94
+
95
+ export const connectCommand = SimpleCLI.command({
96
+ description: "Connect to an existing Chrome DevTools Protocol (CDP) endpoint",
97
+ })
98
+ .input(connectInput)
99
+ .use(withAutoSession())
100
+ .handle(async ({ input, ctx }) => {
101
+ await runConnectWithLogger(input.cdpUrl!, ctx.session, ctx.logger);
102
+ });
79
103
 
80
104
  export const saveInput = SimpleCLI.input({
81
105
  positionals: [
@@ -88,20 +112,17 @@ export const saveInput = SimpleCLI.input({
88
112
  },
89
113
  }).refine(
90
114
  (input) => Boolean(input.urlOrDomain),
91
- `Usage: libretto save <url|domain> [--session <name>]`,
115
+ `Usage: libretto save <url|domain> --session <name>`,
92
116
  );
93
117
 
94
- export function createSaveCommand(logger: LoggerApi) {
95
- return SimpleCLI.command({
96
- description: "Save current browser session",
97
- })
98
- .input(saveInput)
99
- .use(resolveSessionMiddleware)
100
- .use(loadSessionStateMiddleware)
101
- .handle(async ({ input, ctx }) => {
102
- await runSave(input.urlOrDomain!, ctx.session, logger);
103
- });
104
- }
118
+ export const saveCommand = SimpleCLI.command({
119
+ description: "Save current browser session",
120
+ })
121
+ .input(saveInput)
122
+ .use(withRequiredSession())
123
+ .handle(async ({ input, ctx }) => {
124
+ await runSave(input.urlOrDomain!, ctx.session, ctx.logger);
125
+ });
105
126
 
106
127
  export const pagesInput = SimpleCLI.input({
107
128
  positionals: [],
@@ -110,53 +131,56 @@ export const pagesInput = SimpleCLI.input({
110
131
  },
111
132
  });
112
133
 
113
- export function createPagesCommand(logger: LoggerApi) {
114
- return SimpleCLI.command({
115
- description: "List open pages in the session",
116
- })
117
- .input(pagesInput)
118
- .use(resolveSessionMiddleware)
119
- .use(loadSessionStateMiddleware)
120
- .handle(async ({ ctx }) => {
121
- await runPages(ctx.session, logger);
122
- });
123
- }
134
+ export const pagesCommand = SimpleCLI.command({
135
+ description: "List open pages in the session",
136
+ })
137
+ .input(pagesInput)
138
+ .use(withRequiredSession())
139
+ .handle(async ({ ctx }) => {
140
+ await runPages(ctx.session, ctx.logger);
141
+ });
124
142
 
125
143
  export const closeInput = SimpleCLI.input({
126
144
  positionals: [],
127
145
  named: {
128
146
  session: sessionOption(),
129
- all: SimpleCLI.flag({ help: "Close all tracked sessions in this workspace" }),
130
- force: SimpleCLI.flag({ help: "Force kill sessions that ignore SIGTERM (requires --all)" }),
147
+ all: SimpleCLI.flag({
148
+ help: "Close all tracked sessions in this workspace",
149
+ }),
150
+ force: SimpleCLI.flag({
151
+ help: "Force kill sessions that ignore SIGTERM (requires --all)",
152
+ }),
131
153
  },
132
- });
154
+ }).refine(
155
+ (input) => input.all || input.session,
156
+ `Usage: libretto close --session <name>\nUsage: libretto close --all [--force]`,
157
+ );
133
158
 
134
- export function createCloseCommand(logger: LoggerApi) {
135
- return SimpleCLI.command({
136
- description: "Close the browser",
137
- })
138
- .input(closeInput)
139
- .use(resolveSessionMiddleware)
140
- .handle(async ({ input, ctx }) => {
141
- if (input.force && !input.all) {
142
- throw new Error(`Usage: libretto close --all [--force]`);
143
- }
144
- if (input.all) {
145
- await runCloseAllWithLogger(logger, { force: input.force });
146
- return;
147
- }
148
- await runCloseWithLogger(ctx.session, logger);
149
- });
150
- }
159
+ export const closeCommand = SimpleCLI.command({
160
+ description: "Close the browser",
161
+ })
162
+ .input(closeInput)
163
+ .handle(async ({ input }) => {
164
+ if (input.force && !input.all) {
165
+ throw new Error(`Usage: libretto close --all [--force]`);
166
+ }
167
+ if (input.all) {
168
+ const logger = createLoggerForSession("cli");
169
+ await runCloseAllWithLogger(logger, { force: input.force });
170
+ return;
171
+ }
172
+ validateSessionName(input.session!);
173
+ const logger = createLoggerForSession(input.session!);
174
+ await runCloseWithLogger(input.session!, logger);
175
+ });
151
176
 
152
- export function createBrowserCommands(logger: LoggerApi) {
153
- return {
154
- open: createOpenCommand(logger),
155
- save: createSaveCommand(logger),
156
- pages: createPagesCommand(logger),
157
- close: createCloseCommand(logger),
158
- };
159
- }
177
+ export const browserCommands = {
178
+ open: openCommand,
179
+ connect: connectCommand,
180
+ save: saveCommand,
181
+ pages: pagesCommand,
182
+ close: closeCommand,
183
+ };
160
184
 
161
185
  export async function runClose(session: string): Promise<void> {
162
186
  await withSessionLogger(session, async (logger) => {