libretto 0.6.11 → 0.6.13

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 (130) hide show
  1. package/README.md +7 -8
  2. package/README.template.md +7 -8
  3. package/dist/cli/cli.js +0 -22
  4. package/dist/cli/commands/browser.js +18 -24
  5. package/dist/cli/commands/execution.js +254 -234
  6. package/dist/cli/commands/experiments.js +100 -0
  7. package/dist/cli/commands/setup.js +3 -310
  8. package/dist/cli/commands/shared.js +10 -0
  9. package/dist/cli/commands/snapshot.js +46 -64
  10. package/dist/cli/commands/status.js +1 -40
  11. package/dist/cli/core/browser.js +303 -124
  12. package/dist/cli/core/config.js +5 -6
  13. package/dist/cli/core/context.js +4 -0
  14. package/dist/cli/core/daemon/config.js +0 -6
  15. package/dist/cli/core/daemon/daemon.js +497 -90
  16. package/dist/cli/core/daemon/ipc.js +170 -129
  17. package/dist/cli/core/daemon/snapshot.js +48 -9
  18. package/dist/cli/core/experiments.js +39 -0
  19. package/dist/cli/core/session.js +5 -4
  20. package/dist/cli/core/skill-version.js +2 -1
  21. package/dist/cli/core/workflow-runner/runner.js +147 -0
  22. package/dist/cli/core/workflow-runtime.js +60 -0
  23. package/dist/cli/index.js +0 -2
  24. package/dist/cli/router.js +4 -3
  25. package/dist/shared/debug/pause-handler.d.ts +9 -0
  26. package/dist/shared/debug/pause-handler.js +15 -0
  27. package/dist/shared/debug/pause.d.ts +1 -2
  28. package/dist/shared/debug/pause.js +13 -36
  29. package/dist/shared/instrumentation/instrument.js +4 -4
  30. package/dist/shared/ipc/child-process-transport.d.ts +7 -0
  31. package/dist/shared/ipc/child-process-transport.js +60 -0
  32. package/dist/shared/ipc/child-process-transport.spec.d.ts +2 -0
  33. package/dist/shared/ipc/child-process-transport.spec.js +68 -0
  34. package/dist/shared/ipc/ipc.d.ts +46 -0
  35. package/dist/shared/ipc/ipc.js +165 -0
  36. package/dist/shared/ipc/ipc.spec.d.ts +2 -0
  37. package/dist/shared/ipc/ipc.spec.js +114 -0
  38. package/dist/shared/ipc/socket-transport.d.ts +9 -0
  39. package/dist/shared/ipc/socket-transport.js +143 -0
  40. package/dist/shared/ipc/socket-transport.spec.d.ts +2 -0
  41. package/dist/shared/ipc/socket-transport.spec.js +117 -0
  42. package/dist/shared/package-manager.d.ts +7 -0
  43. package/dist/shared/package-manager.js +60 -0
  44. package/dist/shared/paths/paths.d.ts +1 -8
  45. package/dist/shared/paths/paths.js +1 -49
  46. package/dist/shared/snapshot/capture-snapshot.d.ts +9 -0
  47. package/dist/shared/snapshot/capture-snapshot.js +463 -0
  48. package/dist/shared/snapshot/diff-snapshots.d.ts +72 -0
  49. package/dist/shared/snapshot/diff-snapshots.js +358 -0
  50. package/dist/shared/snapshot/render-snapshot.d.ts +39 -0
  51. package/dist/shared/snapshot/render-snapshot.js +651 -0
  52. package/dist/shared/snapshot/snapshot.spec.d.ts +2 -0
  53. package/dist/shared/snapshot/snapshot.spec.js +333 -0
  54. package/dist/shared/snapshot/types.d.ts +40 -0
  55. package/dist/shared/snapshot/types.js +0 -0
  56. package/dist/shared/snapshot/wait-for-page-stable.d.ts +17 -0
  57. package/dist/shared/snapshot/wait-for-page-stable.js +281 -0
  58. package/dist/shared/state/session-state.d.ts +1 -0
  59. package/dist/shared/state/session-state.js +1 -0
  60. package/docs/experiments.md +67 -0
  61. package/docs/releasing.md +8 -6
  62. package/package.json +5 -2
  63. package/skills/libretto/SKILL.md +19 -19
  64. package/skills/libretto/references/configuration-file-reference.md +6 -12
  65. package/skills/libretto/references/pages-and-page-targeting.md +1 -1
  66. package/skills/libretto-readonly/SKILL.md +2 -9
  67. package/src/cli/AGENTS.md +7 -0
  68. package/src/cli/cli.ts +0 -23
  69. package/src/cli/commands/browser.ts +14 -18
  70. package/src/cli/commands/execution.ts +303 -271
  71. package/src/cli/commands/experiments.ts +120 -0
  72. package/src/cli/commands/setup.ts +3 -400
  73. package/src/cli/commands/shared.ts +20 -0
  74. package/src/cli/commands/snapshot.ts +54 -94
  75. package/src/cli/commands/status.ts +1 -48
  76. package/src/cli/core/browser.ts +372 -150
  77. package/src/cli/core/config.ts +4 -5
  78. package/src/cli/core/context.ts +4 -0
  79. package/src/cli/core/daemon/config.ts +35 -19
  80. package/src/cli/core/daemon/daemon.ts +645 -107
  81. package/src/cli/core/daemon/ipc.ts +319 -214
  82. package/src/cli/core/daemon/snapshot.ts +71 -15
  83. package/src/cli/core/experiments.ts +56 -0
  84. package/src/cli/core/resolve-model.ts +5 -0
  85. package/src/cli/core/session.ts +5 -4
  86. package/src/cli/core/skill-version.ts +2 -1
  87. package/src/cli/core/workflow-runner/runner.ts +237 -0
  88. package/src/cli/core/workflow-runtime.ts +86 -0
  89. package/src/cli/index.ts +0 -1
  90. package/src/cli/router.ts +4 -3
  91. package/src/shared/debug/pause-handler.ts +20 -0
  92. package/src/shared/debug/pause.ts +14 -48
  93. package/src/shared/instrumentation/instrument.ts +4 -4
  94. package/src/shared/ipc/AGENTS.md +24 -0
  95. package/src/shared/ipc/child-process-transport.spec.ts +86 -0
  96. package/src/shared/ipc/child-process-transport.ts +96 -0
  97. package/src/shared/ipc/ipc.spec.ts +161 -0
  98. package/src/shared/ipc/ipc.ts +288 -0
  99. package/src/shared/ipc/socket-transport.spec.ts +141 -0
  100. package/src/shared/ipc/socket-transport.ts +189 -0
  101. package/src/shared/package-manager.ts +76 -0
  102. package/src/shared/paths/paths.ts +0 -72
  103. package/src/shared/snapshot/capture-snapshot.ts +615 -0
  104. package/src/shared/snapshot/diff-snapshots.ts +579 -0
  105. package/src/shared/snapshot/render-snapshot.ts +962 -0
  106. package/src/shared/snapshot/snapshot.spec.ts +388 -0
  107. package/src/shared/snapshot/types.ts +43 -0
  108. package/src/shared/snapshot/wait-for-page-stable.ts +425 -0
  109. package/src/shared/state/session-state.ts +1 -0
  110. package/dist/cli/commands/ai.js +0 -109
  111. package/dist/cli/core/ai-model.js +0 -192
  112. package/dist/cli/core/api-snapshot-analyzer.js +0 -86
  113. package/dist/cli/core/daemon/index.js +0 -16
  114. package/dist/cli/core/daemon/spawn.js +0 -90
  115. package/dist/cli/core/pause-signals.js +0 -29
  116. package/dist/cli/core/snapshot-analyzer.js +0 -666
  117. package/dist/cli/workers/run-integration-runtime.js +0 -235
  118. package/dist/cli/workers/run-integration-worker-protocol.js +0 -17
  119. package/dist/cli/workers/run-integration-worker.js +0 -64
  120. package/scripts/summarize-evals.mjs +0 -135
  121. package/src/cli/commands/ai.ts +0 -143
  122. package/src/cli/core/ai-model.ts +0 -298
  123. package/src/cli/core/api-snapshot-analyzer.ts +0 -110
  124. package/src/cli/core/daemon/index.ts +0 -24
  125. package/src/cli/core/daemon/spawn.ts +0 -171
  126. package/src/cli/core/pause-signals.ts +0 -35
  127. package/src/cli/core/snapshot-analyzer.ts +0 -855
  128. package/src/cli/workers/run-integration-runtime.ts +0 -326
  129. package/src/cli/workers/run-integration-worker-protocol.ts +0 -19
  130. package/src/cli/workers/run-integration-worker.ts +0 -72
@@ -26,6 +26,7 @@ export const LibrettoConfigSchema = z
26
26
  windowPosition: WindowPositionConfigSchema.optional(),
27
27
  provider: z.string().optional(),
28
28
  sessionMode: SessionAccessModeSchema.optional(),
29
+ experiments: z.record(z.string(), z.boolean()).optional(),
29
30
  })
30
31
  .passthrough();
31
32
  export type LibrettoConfig = z.infer<typeof LibrettoConfigSchema>;
@@ -40,7 +41,6 @@ function formatExpectedConfigExample(): string {
40
41
  return JSON.stringify(
41
42
  {
42
43
  version: CURRENT_CONFIG_VERSION,
43
- snapshotModel: "openai/gpt-5.4",
44
44
  viewport: {
45
45
  width: 1280,
46
46
  height: 800,
@@ -64,10 +64,9 @@ function invalidConfigError(configPath: string, detail?: string): Error {
64
64
  "Expected config example:",
65
65
  formatExpectedConfigExample(),
66
66
  "Notes:",
67
- ' - "snapshotModel", "viewport", "windowPosition", and "sessionMode" are optional.',
68
- ' - "snapshotModel" must be a provider/model string like "openai/gpt-5.4" or "anthropic/claude-sonnet-4-6".',
69
- "Fix the file to match this shape, or delete it and rerun:",
70
- ` npx libretto ai configure openai | anthropic | gemini | vertex | openrouter`,
67
+ ' - "viewport", "windowPosition", and "sessionMode" are optional.',
68
+ ' - "snapshotModel" is deprecated and ignored by snapshot.',
69
+ "Fix the file to match this shape, or delete it and rerun setup.",
71
70
  ]
72
71
  .filter(Boolean)
73
72
  .join("\n"),
@@ -38,6 +38,10 @@ export function getSessionActionsLogPath(session: string): string {
38
38
  return join(getSessionDir(session), "actions.jsonl");
39
39
  }
40
40
 
41
+ export function getSessionProviderClosePath(session: string): string {
42
+ return join(getSessionDir(session), "provider-close.json");
43
+ }
44
+
41
45
  export function getSessionSnapshotsDir(session: string): string {
42
46
  return join(getSessionDir(session), "snapshots");
43
47
  }
@@ -4,18 +4,20 @@
4
4
  * Serialized as JSON in `process.argv[2]` when spawning the daemon.
5
5
  */
6
6
 
7
+ import type { Experiments } from "../experiments.js";
8
+
7
9
  /**
8
10
  * Config for daemon-managed browser launch (`libretto open`).
9
11
  * The daemon owns the browser lifecycle and will close it on shutdown.
10
12
  */
11
- export type DaemonLaunchConfig = {
12
- port: number;
13
- url: string;
14
- session: string;
13
+ export type DaemonBrowserLaunchConfig = {
14
+ kind: "launch";
15
15
  headed: boolean;
16
16
  viewport: { width: number; height: number };
17
17
  storageStatePath?: string;
18
18
  windowPosition?: { x: number; y: number };
19
+ remoteDebuggingPort?: number;
20
+ initialUrl?: string;
19
21
  };
20
22
 
21
23
  /**
@@ -23,24 +25,38 @@ export type DaemonLaunchConfig = {
23
25
  * The daemon borrows the CDP connection and will disconnect (not close) on
24
26
  * shutdown — the browser outlives the session.
25
27
  */
26
- export type DaemonConnectConfig = {
27
- mode: "connect";
28
- session: string;
28
+ export type DaemonBrowserConnectConfig = {
29
+ kind: "connect";
29
30
  cdpEndpoint: string;
30
- /** If set, the daemon navigates to this URL after connecting. */
31
- url?: string;
31
+ initialUrl?: string;
32
32
  };
33
33
 
34
34
  /**
35
- * Discriminated union passed as JSON in `process.argv[2]`.
36
- * Launch configs omit `mode` for backward compatibility with existing
37
- * `runOpen()` callers any config without `mode: "connect"` is treated
38
- * as a launch config.
35
+ * Config for a daemon-owned cloud browser provider. The daemon creates the
36
+ * provider session during startup, connects over CDP, and closes the provider
37
+ * session during daemon shutdown.
39
38
  */
40
- export type DaemonConfig = DaemonLaunchConfig | DaemonConnectConfig;
39
+ export type DaemonBrowserProviderConfig = {
40
+ kind: "provider";
41
+ providerName: string;
42
+ initialUrl?: string;
43
+ };
41
44
 
42
- export function isConnectConfig(
43
- config: DaemonConfig,
44
- ): config is DaemonConnectConfig {
45
- return "mode" in config && config.mode === "connect";
46
- }
45
+ export type DaemonWorkflowConfig = {
46
+ integrationPath: string;
47
+ params?: unknown;
48
+ visualize?: boolean;
49
+ stayOpenOnSuccess?: boolean;
50
+ tsconfigPath?: string;
51
+ authProfileDomain?: string;
52
+ };
53
+
54
+ export type DaemonConfig = {
55
+ session: string;
56
+ experiments: Experiments;
57
+ browser:
58
+ | DaemonBrowserLaunchConfig
59
+ | DaemonBrowserConnectConfig
60
+ | DaemonBrowserProviderConfig;
61
+ workflow?: DaemonWorkflowConfig;
62
+ };