libretto 0.6.11 → 0.6.12

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 (119) hide show
  1. package/README.md +4 -0
  2. package/README.template.md +4 -0
  3. package/dist/cli/cli.js +4 -3
  4. package/dist/cli/commands/ai.js +3 -2
  5. package/dist/cli/commands/browser.js +17 -17
  6. package/dist/cli/commands/execution.js +254 -234
  7. package/dist/cli/commands/experiments.js +100 -0
  8. package/dist/cli/commands/setup.js +20 -34
  9. package/dist/cli/commands/shared.js +10 -0
  10. package/dist/cli/commands/snapshot.js +81 -9
  11. package/dist/cli/commands/status.js +5 -4
  12. package/dist/cli/core/ai-model.js +6 -3
  13. package/dist/cli/core/browser.js +300 -121
  14. package/dist/cli/core/config.js +4 -2
  15. package/dist/cli/core/context.js +4 -0
  16. package/dist/cli/core/daemon/config.js +0 -6
  17. package/dist/cli/core/daemon/daemon.js +535 -89
  18. package/dist/cli/core/daemon/ipc.js +170 -129
  19. package/dist/cli/core/daemon/snapshot.js +72 -6
  20. package/dist/cli/core/experiments.js +66 -0
  21. package/dist/cli/core/session.js +5 -4
  22. package/dist/cli/core/skill-version.js +2 -1
  23. package/dist/cli/core/snapshot-analyzer.js +4 -3
  24. package/dist/cli/core/workflow-runner/runner.js +147 -0
  25. package/dist/cli/core/workflow-runtime.js +60 -0
  26. package/dist/cli/router.js +4 -1
  27. package/dist/shared/debug/pause-handler.d.ts +9 -0
  28. package/dist/shared/debug/pause-handler.js +15 -0
  29. package/dist/shared/debug/pause.d.ts +1 -2
  30. package/dist/shared/debug/pause.js +13 -36
  31. package/dist/shared/ipc/child-process-transport.d.ts +7 -0
  32. package/dist/shared/ipc/child-process-transport.js +60 -0
  33. package/dist/shared/ipc/child-process-transport.spec.d.ts +2 -0
  34. package/dist/shared/ipc/child-process-transport.spec.js +68 -0
  35. package/dist/shared/ipc/ipc.d.ts +46 -0
  36. package/dist/shared/ipc/ipc.js +165 -0
  37. package/dist/shared/ipc/ipc.spec.d.ts +2 -0
  38. package/dist/shared/ipc/ipc.spec.js +114 -0
  39. package/dist/shared/ipc/socket-transport.d.ts +9 -0
  40. package/dist/shared/ipc/socket-transport.js +143 -0
  41. package/dist/shared/ipc/socket-transport.spec.d.ts +2 -0
  42. package/dist/shared/ipc/socket-transport.spec.js +117 -0
  43. package/dist/shared/package-manager.d.ts +7 -0
  44. package/dist/shared/package-manager.js +60 -0
  45. package/dist/shared/paths/paths.d.ts +1 -8
  46. package/dist/shared/paths/paths.js +1 -49
  47. package/dist/shared/snapshot/capture-snapshot.d.ts +9 -0
  48. package/dist/shared/snapshot/capture-snapshot.js +463 -0
  49. package/dist/shared/snapshot/diff-snapshots.d.ts +72 -0
  50. package/dist/shared/snapshot/diff-snapshots.js +358 -0
  51. package/dist/shared/snapshot/render-snapshot.d.ts +39 -0
  52. package/dist/shared/snapshot/render-snapshot.js +651 -0
  53. package/dist/shared/snapshot/snapshot.spec.d.ts +2 -0
  54. package/dist/shared/snapshot/snapshot.spec.js +333 -0
  55. package/dist/shared/snapshot/types.d.ts +40 -0
  56. package/dist/shared/snapshot/types.js +0 -0
  57. package/dist/shared/snapshot/wait-for-page-stable.d.ts +17 -0
  58. package/dist/shared/snapshot/wait-for-page-stable.js +281 -0
  59. package/dist/shared/state/session-state.d.ts +1 -0
  60. package/dist/shared/state/session-state.js +1 -0
  61. package/docs/experiments.md +67 -0
  62. package/package.json +4 -2
  63. package/skills/libretto/SKILL.md +3 -1
  64. package/skills/libretto-readonly/SKILL.md +1 -1
  65. package/src/cli/AGENTS.md +7 -0
  66. package/src/cli/cli.ts +4 -3
  67. package/src/cli/commands/ai.ts +3 -2
  68. package/src/cli/commands/browser.ts +13 -11
  69. package/src/cli/commands/execution.ts +303 -271
  70. package/src/cli/commands/experiments.ts +120 -0
  71. package/src/cli/commands/setup.ts +18 -36
  72. package/src/cli/commands/shared.ts +20 -0
  73. package/src/cli/commands/snapshot.ts +99 -11
  74. package/src/cli/commands/status.ts +5 -4
  75. package/src/cli/core/ai-model.ts +6 -3
  76. package/src/cli/core/browser.ts +369 -147
  77. package/src/cli/core/config.ts +3 -1
  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 +686 -106
  81. package/src/cli/core/daemon/ipc.ts +330 -214
  82. package/src/cli/core/daemon/snapshot.ts +106 -8
  83. package/src/cli/core/experiments.ts +85 -0
  84. package/src/cli/core/session.ts +5 -4
  85. package/src/cli/core/skill-version.ts +2 -1
  86. package/src/cli/core/snapshot-analyzer.ts +4 -3
  87. package/src/cli/core/workflow-runner/runner.ts +237 -0
  88. package/src/cli/core/workflow-runtime.ts +85 -0
  89. package/src/cli/router.ts +4 -1
  90. package/src/shared/debug/pause-handler.ts +20 -0
  91. package/src/shared/debug/pause.ts +14 -48
  92. package/src/shared/ipc/AGENTS.md +24 -0
  93. package/src/shared/ipc/child-process-transport.spec.ts +86 -0
  94. package/src/shared/ipc/child-process-transport.ts +96 -0
  95. package/src/shared/ipc/ipc.spec.ts +161 -0
  96. package/src/shared/ipc/ipc.ts +288 -0
  97. package/src/shared/ipc/socket-transport.spec.ts +141 -0
  98. package/src/shared/ipc/socket-transport.ts +189 -0
  99. package/src/shared/package-manager.ts +76 -0
  100. package/src/shared/paths/paths.ts +0 -72
  101. package/src/shared/snapshot/capture-snapshot.ts +615 -0
  102. package/src/shared/snapshot/diff-snapshots.ts +579 -0
  103. package/src/shared/snapshot/render-snapshot.ts +962 -0
  104. package/src/shared/snapshot/snapshot.spec.ts +388 -0
  105. package/src/shared/snapshot/types.ts +43 -0
  106. package/src/shared/snapshot/wait-for-page-stable.ts +425 -0
  107. package/src/shared/state/session-state.ts +1 -0
  108. package/dist/cli/core/daemon/index.js +0 -16
  109. package/dist/cli/core/daemon/spawn.js +0 -90
  110. package/dist/cli/core/pause-signals.js +0 -29
  111. package/dist/cli/workers/run-integration-runtime.js +0 -235
  112. package/dist/cli/workers/run-integration-worker-protocol.js +0 -17
  113. package/dist/cli/workers/run-integration-worker.js +0 -64
  114. package/src/cli/core/daemon/index.ts +0 -24
  115. package/src/cli/core/daemon/spawn.ts +0 -171
  116. package/src/cli/core/pause-signals.ts +0 -35
  117. package/src/cli/workers/run-integration-runtime.ts +0 -326
  118. package/src/cli/workers/run-integration-worker-protocol.ts +0 -19
  119. package/src/cli/workers/run-integration-worker.ts +0 -72
@@ -3,6 +3,7 @@ import { dirname } from "node:path";
3
3
  import { z } from "zod";
4
4
  import { SessionAccessModeSchema } from "../../shared/state/index.js";
5
5
  import { LIBRETTO_CONFIG_PATH } from "./context.js";
6
+ import { librettoCommand } from "../../shared/package-manager.js";
6
7
 
7
8
  export const CURRENT_CONFIG_VERSION = 1;
8
9
 
@@ -26,6 +27,7 @@ export const LibrettoConfigSchema = z
26
27
  windowPosition: WindowPositionConfigSchema.optional(),
27
28
  provider: z.string().optional(),
28
29
  sessionMode: SessionAccessModeSchema.optional(),
30
+ experiments: z.record(z.string(), z.boolean()).optional(),
29
31
  })
30
32
  .passthrough();
31
33
  export type LibrettoConfig = z.infer<typeof LibrettoConfigSchema>;
@@ -67,7 +69,7 @@ function invalidConfigError(configPath: string, detail?: string): Error {
67
69
  ' - "snapshotModel", "viewport", "windowPosition", and "sessionMode" are optional.',
68
70
  ' - "snapshotModel" must be a provider/model string like "openai/gpt-5.4" or "anthropic/claude-sonnet-4-6".',
69
71
  "Fix the file to match this shape, or delete it and rerun:",
70
- ` npx libretto ai configure openai | anthropic | gemini | vertex | openrouter`,
72
+ ` ${librettoCommand("ai configure openai | anthropic | gemini | vertex | openrouter")}`,
71
73
  ]
72
74
  .filter(Boolean)
73
75
  .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
+ };