@openagt/dashboard 0.9.0 → 0.11.0

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 (223) hide show
  1. package/README.md +9 -17
  2. package/dist/built-in.d.ts +45 -16
  3. package/dist/built-in.d.ts.map +1 -1
  4. package/dist/built-in.js +95 -32
  5. package/dist/built-in.js.map +1 -1
  6. package/dist/cli.d.ts +4 -10
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +11 -67
  9. package/dist/cli.js.map +1 -1
  10. package/dist/client.d.ts +2 -1
  11. package/dist/client.d.ts.map +1 -1
  12. package/dist/client.js +3 -4
  13. package/dist/client.js.map +1 -1
  14. package/dist/daemon-runtime.d.ts +12 -12
  15. package/dist/daemon-runtime.d.ts.map +1 -1
  16. package/dist/daemon-runtime.js +97 -37
  17. package/dist/daemon-runtime.js.map +1 -1
  18. package/dist/daemon.d.ts +3 -14
  19. package/dist/daemon.d.ts.map +1 -1
  20. package/dist/daemon.js +15 -26
  21. package/dist/daemon.js.map +1 -1
  22. package/dist/dashboard/bridge-endpoints.d.ts +5 -5
  23. package/dist/dashboard/bridge-endpoints.js +5 -5
  24. package/dist/dashboard/http.d.ts +1 -1
  25. package/dist/dashboard/http.js +1 -1
  26. package/dist/dashboard/machine-call.d.ts +10 -0
  27. package/dist/dashboard/machine-call.d.ts.map +1 -0
  28. package/dist/dashboard/machine-call.js +86 -0
  29. package/dist/dashboard/machine-call.js.map +1 -0
  30. package/dist/dashboard/relay-endpoints.d.ts +26 -17
  31. package/dist/dashboard/relay-endpoints.d.ts.map +1 -1
  32. package/dist/dashboard/relay-endpoints.js +70 -27
  33. package/dist/dashboard/relay-endpoints.js.map +1 -1
  34. package/dist/dashboard/remote-run.d.ts +77 -32
  35. package/dist/dashboard/remote-run.d.ts.map +1 -1
  36. package/dist/dashboard/remote-run.js +120 -42
  37. package/dist/dashboard/remote-run.js.map +1 -1
  38. package/dist/dashboard/rpc-serve.d.ts +19 -25
  39. package/dist/dashboard/rpc-serve.d.ts.map +1 -1
  40. package/dist/dashboard/rpc-serve.js +11 -22
  41. package/dist/dashboard/rpc-serve.js.map +1 -1
  42. package/dist/dashboard/screen.d.ts +53 -0
  43. package/dist/dashboard/screen.d.ts.map +1 -0
  44. package/dist/dashboard/screen.js +175 -0
  45. package/dist/dashboard/screen.js.map +1 -0
  46. package/dist/dashboard/server.d.ts +18 -19
  47. package/dist/dashboard/server.d.ts.map +1 -1
  48. package/dist/dashboard/server.js +52 -81
  49. package/dist/dashboard/server.js.map +1 -1
  50. package/dist/dashboard/start-branch.d.ts +32 -0
  51. package/dist/dashboard/start-branch.d.ts.map +1 -0
  52. package/dist/dashboard/start-branch.js +47 -0
  53. package/dist/dashboard/start-branch.js.map +1 -0
  54. package/dist/dashboard/types.d.ts +6 -14
  55. package/dist/dashboard/types.d.ts.map +1 -1
  56. package/dist/dashboard/web-start-endpoints.d.ts +2 -2
  57. package/dist/dashboard/web-start-endpoints.js +1 -1
  58. package/dist/dashboard-bundle/assets/main-9Xb8Ao4p.css +2 -0
  59. package/dist/dashboard-bundle/assets/main-DTyyQ0jM.js +140 -0
  60. package/dist/dashboard-bundle/assets/{module-v213KWfH.js → module-DKd-4BTU.js} +4 -4
  61. package/dist/dashboard-bundle/host/module.js +1 -1
  62. package/dist/dashboard-bundle/index.html +3 -3
  63. package/dist/dashboard-rpc/context.d.ts +4 -4
  64. package/dist/dashboard-rpc/context.js +5 -5
  65. package/dist/dashboard-rpc/context.js.map +1 -1
  66. package/dist/dashboard-rpc/control.d.ts +1 -1
  67. package/dist/dashboard-rpc/control.js +7 -7
  68. package/dist/dashboard-rpc/control.js.map +1 -1
  69. package/dist/dashboard-rpc/events.d.ts +1 -1
  70. package/dist/dashboard-rpc/events.js +1 -1
  71. package/dist/dashboard-rpc/index.d.ts +2 -1
  72. package/dist/dashboard-rpc/index.d.ts.map +1 -1
  73. package/dist/dashboard-rpc/index.js +5 -3
  74. package/dist/dashboard-rpc/index.js.map +1 -1
  75. package/dist/dashboard-rpc/machines.d.ts +52 -0
  76. package/dist/dashboard-rpc/machines.d.ts.map +1 -0
  77. package/dist/dashboard-rpc/machines.js +82 -0
  78. package/dist/dashboard-rpc/machines.js.map +1 -0
  79. package/dist/dashboard-rpc/modules.d.ts +1 -1
  80. package/dist/dashboard-rpc/modules.js +2 -2
  81. package/dist/dashboard-rpc/modules.js.map +1 -1
  82. package/dist/dashboard-rpc/projects.d.ts +2 -0
  83. package/dist/dashboard-rpc/projects.d.ts.map +1 -1
  84. package/dist/dashboard-rpc/projects.js +10 -2
  85. package/dist/dashboard-rpc/projects.js.map +1 -1
  86. package/dist/dashboard-rpc/reads.d.ts +3 -4
  87. package/dist/dashboard-rpc/reads.d.ts.map +1 -1
  88. package/dist/dashboard-rpc/reads.js +5 -6
  89. package/dist/dashboard-rpc/reads.js.map +1 -1
  90. package/dist/dashboard-rpc/relay-agent.d.ts +3 -3
  91. package/dist/dashboard-rpc/relay-agent.js +3 -3
  92. package/dist/dashboard-rpc/relay-dispatch.d.ts +4 -4
  93. package/dist/dashboard-rpc/relay-dispatch.d.ts.map +1 -1
  94. package/dist/dashboard-rpc/relay-dispatch.js +7 -7
  95. package/dist/dashboard-rpc/relay-dispatch.js.map +1 -1
  96. package/dist/dashboard-rpc/skills.d.ts +80 -0
  97. package/dist/dashboard-rpc/skills.d.ts.map +1 -0
  98. package/dist/dashboard-rpc/skills.js +84 -0
  99. package/dist/dashboard-rpc/skills.js.map +1 -0
  100. package/dist/dashboard-rpc/test-context.js +1 -1
  101. package/dist/dashboard-rpc/test-context.js.map +1 -1
  102. package/dist/events.d.ts +4 -3
  103. package/dist/events.d.ts.map +1 -1
  104. package/dist/loopback-host.d.ts +3 -5
  105. package/dist/loopback-host.d.ts.map +1 -1
  106. package/dist/loopback-host.js +3 -5
  107. package/dist/loopback-host.js.map +1 -1
  108. package/dist/machine-link.d.ts +21 -0
  109. package/dist/machine-link.d.ts.map +1 -0
  110. package/dist/machine-link.js +20 -0
  111. package/dist/machine-link.js.map +1 -0
  112. package/dist/module-server.d.ts +1 -1
  113. package/dist/module-types/dashboard/components/ui/switch.d.ts +7 -0
  114. package/dist/module-types/dashboard/lib/draft-handoff.d.ts +5 -9
  115. package/dist/module-types/dashboard/module/index.d.ts +46 -0
  116. package/dist/module-types/src/built-in.d.ts +45 -16
  117. package/dist/module-types/src/client.d.ts +2 -1
  118. package/dist/module-types/src/dashboard/bridge-endpoints.d.ts +5 -5
  119. package/dist/module-types/src/dashboard/http.d.ts +1 -1
  120. package/dist/module-types/src/dashboard/machine-call.d.ts +9 -0
  121. package/dist/module-types/src/dashboard/remote-run.d.ts +77 -32
  122. package/dist/module-types/src/dashboard/rpc-serve.d.ts +19 -25
  123. package/dist/module-types/src/dashboard/start-branch.d.ts +31 -0
  124. package/dist/module-types/src/dashboard/types.d.ts +6 -14
  125. package/dist/module-types/src/dashboard-rpc/context.d.ts +4 -4
  126. package/dist/module-types/src/dashboard-rpc/control.d.ts +1 -1
  127. package/dist/module-types/src/dashboard-rpc/events.d.ts +1 -1
  128. package/dist/module-types/src/dashboard-rpc/index.d.ts +2 -1
  129. package/dist/module-types/src/dashboard-rpc/machines.d.ts +51 -0
  130. package/dist/module-types/src/dashboard-rpc/modules.d.ts +1 -1
  131. package/dist/module-types/src/dashboard-rpc/projects.d.ts +2 -0
  132. package/dist/module-types/src/dashboard-rpc/reads.d.ts +3 -4
  133. package/dist/module-types/src/dashboard-rpc/relay-agent.d.ts +3 -3
  134. package/dist/module-types/src/dashboard-rpc/skills.d.ts +79 -0
  135. package/dist/module-types/src/events.d.ts +4 -3
  136. package/dist/module-types/src/loopback-host.d.ts +3 -5
  137. package/dist/module-types/src/machine-link.d.ts +20 -0
  138. package/dist/module-types/src/openagent-dir.d.ts +3 -5
  139. package/dist/module-types/src/project-commands.d.ts +4 -0
  140. package/dist/module-types/src/project-hooks.d.ts +8 -5
  141. package/dist/module-types/src/project-modules.d.ts +8 -6
  142. package/dist/module-types/src/registry.d.ts +59 -16
  143. package/dist/module-types/src/repository-address.d.ts +22 -0
  144. package/dist/module-types/src/screens.d.ts +13 -0
  145. package/dist/module-types/src/store/agent-store.d.ts +2 -2
  146. package/dist/module-types/src/store/branches.d.ts +1 -1
  147. package/dist/module-types/src/store/git-host.d.ts +1 -1
  148. package/dist/module-types/src/store/queue.d.ts +1 -1
  149. package/dist/module-types/src/store/runs.d.ts +1 -1
  150. package/dist/module-types/src/store/tickets.d.ts +1 -1
  151. package/dist/module-types/src/version.d.ts +1 -0
  152. package/dist/openagent-dir.d.ts +3 -5
  153. package/dist/openagent-dir.d.ts.map +1 -1
  154. package/dist/openagent-dir.js +3 -5
  155. package/dist/openagent-dir.js.map +1 -1
  156. package/dist/package-services.d.ts +27 -0
  157. package/dist/package-services.d.ts.map +1 -0
  158. package/dist/package-services.js +62 -0
  159. package/dist/package-services.js.map +1 -0
  160. package/dist/project-commands.d.ts +4 -0
  161. package/dist/project-commands.d.ts.map +1 -1
  162. package/dist/project-commands.js.map +1 -1
  163. package/dist/project-hooks.d.ts +8 -5
  164. package/dist/project-hooks.d.ts.map +1 -1
  165. package/dist/project-hooks.js +9 -6
  166. package/dist/project-hooks.js.map +1 -1
  167. package/dist/project-modules.d.ts +8 -6
  168. package/dist/project-modules.d.ts.map +1 -1
  169. package/dist/project-modules.js +7 -13
  170. package/dist/project-modules.js.map +1 -1
  171. package/dist/project.d.ts.map +1 -1
  172. package/dist/project.js +1 -2
  173. package/dist/project.js.map +1 -1
  174. package/dist/registry.d.ts +59 -16
  175. package/dist/registry.d.ts.map +1 -1
  176. package/dist/registry.js +91 -20
  177. package/dist/registry.js.map +1 -1
  178. package/dist/repository-address.d.ts +23 -0
  179. package/dist/repository-address.d.ts.map +1 -0
  180. package/dist/repository-address.js +38 -0
  181. package/dist/repository-address.js.map +1 -0
  182. package/dist/screens.d.ts +14 -0
  183. package/dist/screens.d.ts.map +1 -0
  184. package/dist/screens.js +40 -0
  185. package/dist/screens.js.map +1 -0
  186. package/dist/store/agent-store.d.ts +2 -2
  187. package/dist/store/agent-store.d.ts.map +1 -1
  188. package/dist/store/branches.d.ts +1 -1
  189. package/dist/store/branches.js +1 -1
  190. package/dist/store/git-host.d.ts +1 -1
  191. package/dist/store/git-host.js +2 -2
  192. package/dist/store/git-host.js.map +1 -1
  193. package/dist/store/queue.d.ts +1 -1
  194. package/dist/store/queue.js +1 -1
  195. package/dist/store/runs.d.ts +1 -1
  196. package/dist/store/runs.js +1 -1
  197. package/dist/store/test-branches.d.ts +0 -8
  198. package/dist/store/test-branches.d.ts.map +1 -1
  199. package/dist/store/test-branches.js +0 -24
  200. package/dist/store/test-branches.js.map +1 -1
  201. package/dist/store/tickets.d.ts +1 -1
  202. package/dist/store/tickets.js +1 -1
  203. package/dist/version.d.ts +2 -0
  204. package/dist/version.d.ts.map +1 -0
  205. package/dist/version.js +26 -0
  206. package/dist/version.js.map +1 -0
  207. package/package.json +19 -13
  208. package/dist/dashboard-bundle/assets/main-B98UOA3_.js +0 -140
  209. package/dist/dashboard-bundle/assets/main-ByRjbCiA.css +0 -2
  210. package/dist/dashboard-rpc/devices.d.ts +0 -9
  211. package/dist/dashboard-rpc/devices.d.ts.map +0 -1
  212. package/dist/dashboard-rpc/devices.js +0 -12
  213. package/dist/dashboard-rpc/devices.js.map +0 -1
  214. package/dist/install.d.ts +0 -31
  215. package/dist/install.d.ts.map +0 -1
  216. package/dist/install.js +0 -54
  217. package/dist/install.js.map +0 -1
  218. package/dist/module-types/src/dashboard-rpc/devices.d.ts +0 -8
  219. package/dist/module-types/src/openagent-gitignore.d.ts +0 -11
  220. package/dist/openagent-gitignore.d.ts +0 -12
  221. package/dist/openagent-gitignore.d.ts.map +0 -1
  222. package/dist/openagent-gitignore.js +0 -19
  223. package/dist/openagent-gitignore.js.map +0 -1
@@ -0,0 +1,51 @@
1
+ /** A saved machine as the browser sees it: no key. */
2
+ export interface Machine {
3
+ id: string;
4
+ label: string;
5
+ url: string;
6
+ }
7
+ export type AddMachineResult = {
8
+ ok: true;
9
+ machine: Machine;
10
+ } | {
11
+ ok: false;
12
+ error: string;
13
+ };
14
+ /** The saved machines, newest first. */
15
+ export declare function onMachines(): Promise<Machine[]>;
16
+ /**
17
+ * Save the machine a pasted link names: the link another OpenAgent gives for a new device. This
18
+ * computer is let in there with the link's code, once, and keeps the key it is answered. Adding
19
+ * a machine again, with a new link, replaces its name and the key, and the key it had there
20
+ * before is taken out.
21
+ */
22
+ export declare function sendAddMachine(pasted: string, label?: string): Promise<AddMachineResult>;
23
+ export type RemoveMachineResult = {
24
+ ok: true;
25
+ } | {
26
+ ok: false;
27
+ error: string;
28
+ };
29
+ /**
30
+ * Take a saved machine off the list, and this computer out of the machine: its key there stops
31
+ * working. Not while a run is at work there, which is read with that key. Taking the key out is
32
+ * not waited for: a machine that cannot be reached right now keeps it until this computer is
33
+ * removed there, among its devices.
34
+ */
35
+ export declare function sendRemoveMachine(id: string): Promise<RemoveMachineResult>;
36
+ /** Whether each saved machine answers right now, by id: one short call to each, with this computer's key. */
37
+ export declare function onMachinesReachable(): Promise<Record<string, boolean>>;
38
+ /** This computer's OpenAgent, and the one each saved machine runs. */
39
+ export interface MachineVersions {
40
+ /** This computer's own. */
41
+ version: string;
42
+ /** Each saved machine, with its version when it answers and says. */
43
+ machines: (Machine & {
44
+ version?: string;
45
+ })[];
46
+ }
47
+ /**
48
+ * The saved machines with the OpenAgent each runs, beside this computer's own: how a page tells
49
+ * that a machine fell behind this computer. One short call to each, with this computer's key.
50
+ */
51
+ export declare function onMachineVersions(): Promise<MachineVersions>;
@@ -38,7 +38,7 @@ export declare function runModuleCommand(projectId: string, pkg: string, args: s
38
38
  * Call read `name` of a module's server part in one project: how a module's browser part reads
39
39
  * what a command cannot answer fast enough. Refused for an unknown project, a package that is not
40
40
  * a module of that project, and a module with no server part. A read whose input names a run this
41
- * daemon relays to a connected device (`input.agentId`) is read over there, by that device's own
41
+ * daemon relays to a saved machine (`input.agentId`) is read over there, by that machine's own
42
42
  * copy of the module, since the run's checkout is there.
43
43
  */
44
44
  export declare function readModule(projectId: string, pkg: string, name: string, input: unknown): Promise<ModuleReadResult>;
@@ -58,6 +58,8 @@ export interface ProjectLauncher {
58
58
  gitHost: boolean;
59
59
  /** Whether the project's repository has an `origin` remote; without one nothing can be published, so the publish menu stops at the commit. */
60
60
  remote: boolean;
61
+ /** The address the project's repository was cloned from, the name another machine knows the project by; absent, the project cannot be sent to one. */
62
+ address?: string;
61
63
  /**
62
64
  * The two branches an agent can start from here, for the launcher's "start from" chip: `main`,
63
65
  * the name of origin's default branch, and `local`, the branch the project's folder is on now.
@@ -31,7 +31,7 @@ import type { BridgeAnswer, BridgeContact, BridgeVersion } from '../dashboard/br
31
31
  * may have just self-healed a dead agent to `stopped` (#716), and that freshly-archived row can
32
32
  * lag `listAgents` by a poll — keeping it regardless leaves the row visible with no flicker.
33
33
  *
34
- * An agent relayed to a connected device (#1067) lives only in the daemon's memory, never on disk, so
34
+ * An agent relayed to a saved machine (#1067) lives only in the daemon's memory, never on disk, so
35
35
  * its in-memory stub is merged in too (#1077): that is what re-opens it after a dashboard reload
36
36
  * instead of losing it.
37
37
  */
@@ -168,9 +168,8 @@ export declare function onBridgeStatus(): Promise<{
168
168
  *
169
169
  * Only while the bridge is on, so a daemon with the feature off never hands the secret to a
170
170
  * page. Revealing it here is not a new exposure: anyone who can load this dashboard can already
171
- * start runs on this machine, and on a non-loopback bind their browser is holding the same token
172
- * as a cookie. What it replaces is the alternative, which was telling people to open
173
- * `~/.openagent.json` and copy a field out of it.
171
+ * start runs on this machine. What it replaces is the alternative, which was telling people to
172
+ * open `~/.openagent.json` and copy a field out of it.
174
173
  */
175
174
  export declare function onBridgeToken(): Promise<string | null>;
176
175
  /**
@@ -1,8 +1,8 @@
1
1
  /**
2
- * Run a run-scoped RPC locally, or relay it to the device when `agentId` names an agent this daemon is
3
- * relaying to a connected one (#1067 slice 2). For an ordinary local agent the remote lookup is empty and
2
+ * Run a run-scoped RPC locally, or relay it to the machine when `agentId` names an agent this daemon is
3
+ * relaying to a saved one (#1067 slice 2). For an ordinary local agent the remote lookup is empty and
4
4
  * `local()` runs unchanged. For a remote agent there is no local checkout, so the call is forwarded to the
5
- * device over the token; if the device is unreachable, `unreachable` is returned - the same empty/error
5
+ * machine with this computer's key there; if the machine is unreachable, or no longer lets this computer in, `unreachable` is returned - the same empty/error
6
6
  * shape `local()` gives on a failed read - so the caller never special-cases a remote agent.
7
7
  */
8
8
  export declare function relayOr<T>(agentId: string | undefined, fn: string, args: unknown[], local: () => Promise<T>, unreachable: T): Promise<T>;
@@ -0,0 +1,79 @@
1
+ import { type Standing } from '@openagt/init';
2
+ /**
3
+ * A project's skills, as the dashboard shows and changes them (#2023): the same list with ticks
4
+ * `npx @openagt/init` shows in a terminal, read and written through that package's own code, so
5
+ * the two cannot drift apart. A project has a skill when the skill's text is in its folder; the
6
+ * dashboard writes and deletes those files, and offers the one commit that holds them.
7
+ */
8
+ /** One skill of the list, as it stands in the project. */
9
+ export interface ProjectSkill {
10
+ name: string;
11
+ /** The one line the skill's text says of itself. */
12
+ description: string;
13
+ /** How the project's text stands against the one this dashboard carries; `absent` when the project does not hold the skill. */
14
+ standing: Standing;
15
+ /** Whether the skill is in the folder but not yet on the branch agents start from: an agent started from it does not have the skill. */
16
+ waiting: boolean;
17
+ }
18
+ export interface ProjectSkills {
19
+ /** How many skills the project has, of how many there are: the ones in its folder, and the basic ones every run gets. */
20
+ has: number;
21
+ of: number;
22
+ /** The list's groups; `ticked` says whether a group's skills are ticked in a project that has none yet. */
23
+ groups: {
24
+ title: string;
25
+ ticked: boolean;
26
+ skills: ProjectSkill[];
27
+ }[];
28
+ /** Whether the scheduler starts with the dashboard for this project, on this machine. */
29
+ scheduler: boolean;
30
+ /** The branch agents start from, by its name: the remote's default branch, else the branch the folder is on. Absent where there is none. */
31
+ startBranch?: string;
32
+ /** How many skill files stand written or deleted in the folder with no commit yet. */
33
+ uncommitted: number;
34
+ /** Whether the folder is a git repository: without one there is nothing to commit. */
35
+ git: boolean;
36
+ /** Whether the project has a remote: without one a commit on this machine is all agents need. */
37
+ remote: boolean;
38
+ }
39
+ /** The project's skills; `null` when the project is unknown here. */
40
+ export declare function onProjectSkills(projectId: string): Promise<ProjectSkills | null>;
41
+ /** What a change of skills answered: what was written and deleted, what was left as it is, and the scheduler when the change switched it. */
42
+ export type ChangeSkillsResult = {
43
+ ok: true;
44
+ written: string[];
45
+ removed: string[];
46
+ left: {
47
+ path: string;
48
+ reason: string;
49
+ }[];
50
+ scheduler?: 'on' | 'off';
51
+ schedulerError?: string;
52
+ } | {
53
+ ok: false;
54
+ error: string;
55
+ };
56
+ /**
57
+ * Write and delete skills in a project's folder, and switch its scheduler: what the "Add skills"
58
+ * screen saves. Only the names of the list are taken; anything else is refused whole. A scheduler
59
+ * switched on starts at once, by its own line, as it would have at this dashboard's opening.
60
+ * Nothing is committed here: `sendCommitSkills` is the person's next press.
61
+ */
62
+ export declare function sendChangeSkills(projectId: string, change: {
63
+ write?: string[];
64
+ remove?: string[];
65
+ scheduler?: boolean;
66
+ }): Promise<ChangeSkillsResult>;
67
+ /**
68
+ * One commit of skill files that stand uncommitted in the project's folder, on the branch the
69
+ * folder is on: the files of the skills `only` names, after a change that wrote or deleted them,
70
+ * else every uncommitted skill file. Never a push.
71
+ */
72
+ export declare function sendCommitSkills(projectId: string, only?: string[]): Promise<{
73
+ ok: true;
74
+ committed: boolean;
75
+ commit?: string;
76
+ } | {
77
+ ok: false;
78
+ error: string;
79
+ }>;
@@ -102,11 +102,12 @@ export type OpenAgentEvent = {
102
102
  event: DriverEvent;
103
103
  }
104
104
  /**
105
- * A live screen something the agent ran is showing: a page on this machine's loopback, shown in
106
- * the chat where the line is, while it is the newest open screen at that address and the run
105
+ * A live screen something the agent ran is showing: where it answers, on the loopback of the
106
+ * computer the run is on, live while it is the newest open screen at that address and the run
107
107
  * has not ended. `label` names what it showed then. The same address with `ended` says the
108
108
  * screen has gone. A diary line a command appends itself (agent-driver's `DIARY_ENV`);
109
- * OpenAgent knows nothing of what the page is.
109
+ * OpenAgent passes a watcher's calls on to the address (dashboard/screen.ts) and knows nothing
110
+ * of what the screen is.
110
111
  */
111
112
  | {
112
113
  kind: 'screen';
@@ -1,11 +1,9 @@
1
1
  /**
2
- * Loopback-address helpers, shared by the daemon (deciding whether a bind gates behind the
3
- * token, #1051) and the RPC mount (rejecting a rebound `Host`). A leaf module on purpose:
4
- * `daemon.ts` imports the dashboard, so the mount cannot import these back out of it.
2
+ * Loopback-address helpers, for the RPC mount (rejecting a cross-origin page and a rebound `Host`).
5
3
  */
6
4
  /**
7
- * True when `host` is a loopback address the browser reaches without leaving the machine (#1051).
8
- * A bind-all (`0.0.0.0`, `::`) or a routable address is not, and gates behind the shared token.
5
+ * True when `host` is a loopback address the browser reaches without leaving the machine.
6
+ * A bind-all (`0.0.0.0`, `::`) or a routable address is not.
9
7
  *
10
8
  * The IPv4 check matches the whole `127.0.0.0/8` range but only as an address: a bare
11
9
  * `startsWith('127.')` also accepts a *registrable name* like `127.evil.com`, which is exactly the
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Read the link another computer's OpenAgent gives for a new device (its Settings, Devices, Add
3
+ * device): where this computer is let in, and the code that lets it in once. The code rides the
4
+ * link after the `#`. A server's link carries one thing more after the code and a dot: what the
5
+ * server's key is known by. Not a web address is `null`, and so is a link with no code.
6
+ *
7
+ * A leaf with no Node in it: the dashboard reads a paste with it as the person types, and the
8
+ * daemon reads it again before it asks to be let in.
9
+ */
10
+ export interface MachineLink {
11
+ /** Where the other OpenAgent answers, as an origin (`http://studio.local:4201`). */
12
+ url: string;
13
+ /** Where this computer asks to be let in, and later takes itself out: the link without its code. */
14
+ door: string;
15
+ /** The code, good once. */
16
+ code: string;
17
+ /** What the machine's key is known by, when the link says: a call then goes only to a machine that shows that key. */
18
+ pin?: string;
19
+ }
20
+ export declare function parseMachineLink(pasted: string): MachineLink | null;
@@ -2,9 +2,7 @@
2
2
  * The directory, under a project root, that holds OpenAgent's own files.
3
3
  *
4
4
  * Its own module so every reader and writer of the directory (the hooks file, the project's saved
5
- * prompts, the activation's `.gitignore`, a run's card, diary and inbox) spells it the same way.
6
- *
7
- * Nothing of the product's rides on a branch of its own any more: the agent archives are the
8
- * `logs` skill's runs, on the shared `agent-data` branch that `@openagt/agent-data` names (#1769).
5
+ * prompts, a run's card, diary and inbox) spells it the same way. The name itself is
6
+ * `@openagt/agent-data`'s, which also makes the directory when a folder becomes a project.
9
7
  */
10
- export declare const OPENAGENT_DIR = ".openagent";
8
+ export { OPENAGENT_DIR } from '@openagt/agent-data/names';
@@ -13,6 +13,10 @@ export interface ProjectCommand {
13
13
  name: string;
14
14
  /** The `description` of the skill's front matter, when it has one. */
15
15
  description?: string;
16
+ /** The branch the skill has yet to reach, by name, when its text is in the folder but not on the branch agents start from: an agent started from that branch does not have the command. */
17
+ waiting?: string;
18
+ /** With `waiting`: whether the branch the folder is on has the skill, so an agent started from that branch does have the command. */
19
+ here?: true;
16
20
  }
17
21
  /**
18
22
  * The project's commands, by name: the skills whose front matter says
@@ -2,8 +2,8 @@
2
2
  * A project's hooks (#1774): the shell lines a project's own `.openagent/hooks.yml` names to
3
3
  * run when the dashboard opens and when it closes, the two lines that start a run and continue
4
4
  * one, and the line that says whether a run can start here at all. The daemon calls no tool by
5
- * name: it runs whatever the file says, in the project, with the project's installed tools and
6
- * then the built-in packages' on the PATH, so a line reaches its tool with nothing fetched from npm. Per
5
+ * name: it runs whatever the file says, in the project, with the commands of the packages
6
+ * OpenAgent brings and then the project's installed tools on the PATH, so a line reaches its tool with nothing fetched from npm. Per
7
7
  * user, since `.openagent/` is ignored: a hook is this machine's, and a teammate's pull
8
8
  * changes nothing.
9
9
  *
@@ -49,6 +49,8 @@ export interface RunHooksOptions {
49
49
  timeoutMs?: number;
50
50
  /** The environment the lines run with; default the daemon's own. */
51
51
  env?: NodeJS.ProcessEnv;
52
+ /** The lines to run, of the ones the file holds; every line when absent. */
53
+ only?: readonly string[];
52
54
  }
53
55
  /**
54
56
  * Run a project's `open` or `close` lines, in order, each through `sh -c` with the project's
@@ -122,8 +124,9 @@ export declare function runCheckHook(cwd: string, input: {
122
124
  driver?: string;
123
125
  }, opts?: Omit<RunHooksOptions, 'log'>): Promise<CheckHookResult>;
124
126
  /**
125
- * The environment a line runs with: the PATH led by the project's installed tools, then the
126
- * built-in packages' own commands, so a tool named in a line is the project's copy when it
127
- * installed one and the dashboard's otherwise, and never a package fetched by name.
127
+ * The environment a line runs with: the PATH led by the commands of the packages OpenAgent
128
+ * brings, then the project's installed tools. So a tool of OpenAgent's named in a line is always
129
+ * OpenAgent's copy, the one its pages and its data go through too, any other tool is the
130
+ * project's, and nothing is a package fetched by name.
128
131
  */
129
132
  export declare function hookEnv(cwd: string, env: NodeJS.ProcessEnv): Promise<NodeJS.ProcessEnv>;
@@ -2,11 +2,12 @@ import { type PackageCommandResult } from '@openagt/agent-data';
2
2
  /**
3
3
  * A package that adds to the dashboard (#1774): its browser part, named by its
4
4
  * `exports["./dashboard"]`, and optionally its server part, named by `exports["./server"]`.
5
- * OpenAgent names no package: any dependency of the project that exports `./dashboard` is a
6
- * module, whoever wrote it, and OpenAgent's own built-in modules come the same way.
5
+ * Any dependency of the project that exports `./dashboard` is a module, whoever wrote it, and the
6
+ * packages OpenAgent brings itself come the same way, for the projects that have them
7
+ * (`built-in.ts`).
7
8
  */
8
9
  export interface ProjectModule {
9
- /** The package's name, as the project's package.json lists it. */
10
+ /** The package's name. */
10
11
  package: string;
11
12
  /** The package's version, when its package.json says one. */
12
13
  version?: string;
@@ -21,8 +22,9 @@ export interface ProjectModule {
21
22
  }
22
23
  /**
23
24
  * The modules a project has: each of its dependencies whose package.json exports `./dashboard` to
24
- * a file that exists inside the package, plus the modules among OpenAgent's built-in packages (`built-in.ts`). A project that
25
- * depends on a built-in module's package itself gets its own copy. Sorted by name.
25
+ * a file that exists inside the package, plus the modules among the packages OpenAgent brings to
26
+ * this project (`built-in.ts`): a skill's page where the project holds the skill's text. Sorted
27
+ * by name.
26
28
  */
27
29
  export declare function readProjectModules(root: string): Promise<ProjectModule[]>;
28
30
  /** The one module of this project that `name` names, or undefined. */
@@ -38,7 +40,7 @@ export type ModuleCommandResult = PackageCommandResult;
38
40
  /**
39
41
  * Run one of a module package's own commands in the project, with the given arguments, and read
40
42
  * its standard output as JSON. This is how a module reads its data: the same command an agent runs
41
- * (`npx logs`), so the module and the agent see the same thing and OpenAgent knows neither.
43
+ * (`npx @openagt/skill-logs@0.1`), so the module and the agent see the same thing and OpenAgent knows neither.
42
44
  *
43
45
  * `command` picks one of the package's commands; a package with exactly one needs none. The
44
46
  * command runs with Node (a package's commands are Node scripts), in the project root, never
@@ -3,8 +3,9 @@ import { type PublishPick } from './publish-levels.js';
3
3
  * The multi-project registry (#390): the list of projects the user has
4
4
  * installed OpenAgent into, kept as a single JSON file `.bashrc`-style —
5
5
  * `$HOME/.openagent.json` — so it is the user's responsibility to re-create
6
- * per machine. The same file also holds the user's dashboard preferences (#410),
7
- * so the daemon owns one user file and the UI never needs localStorage.
6
+ * per machine. The same file also holds the user's dashboard preferences (#410)
7
+ * and the machines they saved, so the daemon owns one user file and the UI never
8
+ * needs localStorage.
8
9
  */
9
10
  /** One registered project. */
10
11
  export interface ProjectRecord {
@@ -15,6 +16,25 @@ export interface ProjectRecord {
15
16
  /** ISO timestamp the project was added. */
16
17
  addedAt: string;
17
18
  }
19
+ /**
20
+ * A saved machine: another computer running OpenAgent that a run can be sent to. Kept in this
21
+ * file, the person's own, so every browser on this computer shows the same machines and the
22
+ * key that reaches one never leaves the two machines.
23
+ */
24
+ export interface MachineRecord {
25
+ /** The machine's address, which is also what names it: saving the same address again replaces it. */
26
+ id: string;
27
+ /** The name the person gave it, or its host when they gave none. */
28
+ label: string;
29
+ /** Where its OpenAgent answers, as an origin (`http://studio.local:4201`). */
30
+ url: string;
31
+ /** This computer's own key on that machine. Never handed to a browser. */
32
+ key: string;
33
+ /** Where this computer was let in there, and where it takes itself out when the machine is removed. */
34
+ door: string;
35
+ /** What the machine's key is known by, when its link said: every call goes only to a machine that shows that key. */
36
+ pin?: string;
37
+ }
18
38
  /**
19
39
  * The dashboard's Global options (#410), persisted next to the project list so they
20
40
  * survive restarts without localStorage — the daemon reads/writes them, the SPA reads
@@ -104,11 +124,16 @@ export interface Registry {
104
124
  projects: ProjectRecord[];
105
125
  preferences: Preferences;
106
126
  /**
107
- * The shared daemon token (#1051): generated on the first non-loopback bind and reused after.
108
- * A top-level field, deliberately not a {@link Preferences} one, so it is never shipped to the
109
- * browser bundle. Absent on a loopback-only machine.
127
+ * The browser bridge's key (#1237): generated when the bridge is first switched on and reused
128
+ * after. A top-level field, deliberately not a {@link Preferences} one, so it is never shipped
129
+ * to the browser bundle. Absent on a machine that never had the bridge on.
110
130
  */
111
- daemonToken?: string;
131
+ bridgeToken?: string;
132
+ /**
133
+ * The saved machines. Top-level like {@link bridgeToken}, and for the same reason: each one
134
+ * carries a key, so the list is never part of what the browser is handed.
135
+ */
136
+ machines?: MachineRecord[];
112
137
  }
113
138
  /** A read/write handle for the user preferences, wired into the dashboard's context by the daemon. */
114
139
  export interface PreferencesStore {
@@ -122,7 +147,7 @@ export interface PreferencesStore {
122
147
  }
123
148
  /** The registry file name: a single file under `$XDG_CONFIG_HOME` (dotted under `$HOME`). */
124
149
  export declare const REGISTRY_FILE = "openagent.json";
125
- /** Owner read/write only: the file holds the daemon token (#1051). */
150
+ /** Owner read/write only: the file holds the bridge's key and the saved machines' keys. */
126
151
  export declare const REGISTRY_FILE_MODE = 384;
127
152
  /**
128
153
  * Deterministic, URL-safe id for a project path: the sanitized basename plus a
@@ -151,7 +176,7 @@ export interface RegistryFs {
151
176
  rename?(from: string, to: string): Promise<void>;
152
177
  /**
153
178
  * Narrow a file's permissions. Optional, and best-effort at the call site: this file holds the
154
- * daemon token (#1051), so it is written owner-only — but a
179
+ * bridge's key and the saved machines' keys, so it is written owner-only — but a
155
180
  * filesystem that cannot express that (Windows, a FAT volume) must not fail the write.
156
181
  */
157
182
  chmod?(path: string, mode: number): Promise<void>;
@@ -205,15 +230,33 @@ export declare function writePreferences(preferences: Preferences, fs?: Registry
205
230
  */
206
231
  export declare function patchPreferences(patch: Preferences, fs?: RegistryFs, env?: NodeJS.ProcessEnv): Promise<Preferences>;
207
232
  /**
208
- * The shared daemon token (#1051): read the persisted one, or generate + persist it now. Called
209
- * only on a non-loopback bind, so a loopback-only machine never grows one. Serialized with the
210
- * other mutators so two concurrent binds can't each write a different token. `base64url` of 32
211
- * random bytes: URL-safe, so it drops straight into a `?token=` without encoding.
233
+ * The browser bridge's key (#1237): read the persisted one, or generate + persist it now. Called
234
+ * only with the bridge switched on, so a machine that never had it on never grows one. Serialized
235
+ * with the other mutators so two concurrent starts can't each write a different key.
236
+ */
237
+ export declare function ensureBridgeToken(fs?: RegistryFs, env?: NodeJS.ProcessEnv): Promise<string>;
238
+ /** The persisted bridge key, or `undefined` when none exists. A pure read: it never generates one. */
239
+ export declare function readBridgeToken(fs?: RegistryFs, env?: NodeJS.ProcessEnv): Promise<string | undefined>;
240
+ /** The saved machines, newest first. Forgiving like every read of this file: none on a bad file. */
241
+ export declare function listMachines(fs?: RegistryFs, env?: NodeJS.ProcessEnv): Promise<MachineRecord[]>;
242
+ /**
243
+ * Save a machine, newest first. One per address: saving an address again replaces its name and
244
+ * its key, which is how a machine whose key changed is fixed. Answers the stored record, and the
245
+ * records it took the place of (the one saved at that address before, the oldest past the cap):
246
+ * each still holds a key the caller takes out of its machine.
212
247
  */
213
- export declare function ensureDaemonToken(fs?: RegistryFs, env?: NodeJS.ProcessEnv): Promise<string>;
214
- /** The persisted daemon token (#1051), or `undefined` when none exists. A pure read, so a process
215
- * that only prints the reachable URL never generates one. */
216
- export declare function readDaemonToken(fs?: RegistryFs, env?: NodeJS.ProcessEnv): Promise<string | undefined>;
248
+ export declare function addMachine(machine: {
249
+ url: string;
250
+ key: string;
251
+ door: string;
252
+ pin?: string;
253
+ label?: string;
254
+ }, fs?: RegistryFs, env?: NodeJS.ProcessEnv): Promise<{
255
+ record: MachineRecord;
256
+ displaced: MachineRecord[];
257
+ }>;
258
+ /** Take a saved machine off the list, by id. Answers the one that was there. */
259
+ export declare function removeMachine(id: string, fs?: RegistryFs, env?: NodeJS.ProcessEnv): Promise<MachineRecord | undefined>;
217
260
  /** A {@link PreferencesStore} bound to the real registry file, wired by the daemon so the
218
261
  * dashboard's preferences RPCs read/write the user's home file.
219
262
  *
@@ -0,0 +1,22 @@
1
+ import { type GitRunner } from '@openagt/agent-data';
2
+ /**
3
+ * The one name a project has on every machine: where its repository was cloned from, as
4
+ * `host/path` (`github.com/me/shop`). A project's id is made from its folder's path, which is
5
+ * another path on another machine, so a run sent to a machine names its project by this.
6
+ *
7
+ * The same repository reads the same whichever way it was cloned: the scheme, a user before the
8
+ * host, a port, a trailing `.git` or slash are dropped, and letters are lowered, since the git
9
+ * hosts match names without regard to case. Not an address at all (a path on this disk, a
10
+ * `file:` address) is none.
11
+ *
12
+ * What it does not see through: a host that serves the two ways under two names or two paths
13
+ * (`ssh.github.com`, Azure DevOps). Such a project reads as two, and the other machine says it
14
+ * does not have it.
15
+ */
16
+ export declare function addressOfRemote(remote: string): string | undefined;
17
+ /**
18
+ * The address of the repository at `cwd`: its `origin` remote, the one every push goes to. A
19
+ * project with no `origin`, or one that is a folder on this disk, has none and runs on this
20
+ * machine only.
21
+ */
22
+ export declare function repositoryAddress(cwd: string, git?: GitRunner): Promise<string | undefined>;
@@ -0,0 +1,13 @@
1
+ import type { OpenAgentEvent } from './events.js';
2
+ /**
3
+ * Which of a run's `screen` lines are live and which are hidden. Live: the newest line at its
4
+ * address with no `ended` line for it after, and no run `end` after it other than one waiting on
5
+ * an answer. Every `ended` line is hidden: the screen going is said by its line no longer being
6
+ * live.
7
+ */
8
+ export declare function foldScreenRows(events: readonly OpenAgentEvent[]): {
9
+ live: Set<OpenAgentEvent>;
10
+ hidden: Set<OpenAgentEvent>;
11
+ };
12
+ /** Where a run's live screen answers: the address of its newest live `screen` line, or nothing. */
13
+ export declare function liveScreen(events: readonly OpenAgentEvent[]): string | undefined;
@@ -157,12 +157,12 @@ export interface AgentMeta {
157
157
  browserStreamPort?: number;
158
158
  /**
159
159
  * Where this run executes (#1050/#1053/#610): `actions` for a GitHub Actions run, `web` for a
160
- * Claude Code cloud session, `remote` when relayed to a connected device (#1067), absent for a
160
+ * Claude Code cloud session, `remote` when relayed to a saved machine (#1067), absent for a
161
161
  * local run. Persisted so the agent view can tell a burst-mode Actions run from a stalled live
162
162
  * feed, show a cloud agent's session link after a reload, and gate the browser pane off (#1053).
163
163
  */
164
164
  target?: 'local' | 'actions' | 'remote' | 'web';
165
- /** The connected device a remote agent (#1067) executes on, for the session list + notice after a reload. */
165
+ /** The saved machine a remote agent (#1067) executes on, for the session list + notice after a reload. */
166
166
  remoteLabel?: string;
167
167
  /**
168
168
  * The flow this agent started under (#1467): `build` for the scope→build orchestration, `prompt`
@@ -149,7 +149,7 @@ export declare function parseCheckouts(output: unknown): Checkout[];
149
149
  /** The states read back from a provider's `show`: the objects with a branch and the three verdicts, lists cleaned; anything else is no state. */
150
150
  export declare function parseBranchStates(output: unknown): BranchState[];
151
151
  /**
152
- * The production {@link BranchesReader}: the project's provider, looked up by its package.json,
152
+ * The production {@link BranchesReader}: the project's provider, looked up among the packages the project has (`built-in.ts`),
153
153
  * one source per project kept while the same command provides — so the cache holds across the
154
154
  * many reads of one poll, and a project that installs, swaps or drops its provider is read the new
155
155
  * way within {@link CACHE_MS}. `changed(root)` forgets that project's reads, so the next read runs
@@ -101,7 +101,7 @@ export type GitHostReader = GitHostFor & {
101
101
  /** The rows read back from a provider's `requests`: the objects with the facts a request needs; anything else is no request. */
102
102
  export declare function parseRequests(output: unknown): GitHostRequest[];
103
103
  /**
104
- * The production {@link GitHostReader}: the project's provider, looked up by its package.json, one
104
+ * The production {@link GitHostReader}: the project's provider, looked up among the packages the project has (`built-in.ts`), one
105
105
  * source per project kept while the same command provides, so a project that installs, swaps or
106
106
  * drops its git host is read the new way within {@link CACHE_MS}. `changed(root)` forgets the
107
107
  * project, so the next ask looks its provider up again.
@@ -32,7 +32,7 @@ export type QueueReader = QueueFor & {
32
32
  /** Entries read back from a provider's output: the non-empty strings of an array, trimmed; anything else is no entries. */
33
33
  export declare function parseQueueEntries(output: unknown): string[];
34
34
  /**
35
- * The production {@link QueueReader}: the project's provider, looked up by its package.json, one
35
+ * The production {@link QueueReader}: the project's provider, looked up among the packages the project has (`built-in.ts`), one
36
36
  * source per project kept while the same command provides — so the cache holds across the many
37
37
  * reads of one poll, and a project that installs, swaps or drops its provider is read the new way
38
38
  * within {@link CACHE_MS}. `changed(root)` forgets that project's read, so the next read runs the
@@ -94,7 +94,7 @@ export declare function isRunId(id: string): boolean;
94
94
  */
95
95
  export declare function parseRunCard(input: unknown): RunCard | undefined;
96
96
  /**
97
- * The production {@link RunsFor}: the project's provider, looked up by its package.json, one
97
+ * The production {@link RunsFor}: the project's provider, looked up among the packages the project has (`built-in.ts`), one
98
98
  * source per project kept while the same command provides — so the cache holds across the many
99
99
  * reads of one poll, and a project that installs, swaps or drops its provider is read the new way
100
100
  * within {@link CACHE_MS}. `changed(root)` forgets that project's reads, so the next read runs the
@@ -59,7 +59,7 @@ export type TicketsReader = TicketsFor & {
59
59
  /** The rows read back from a provider's output: the objects with the five plain facts, everything else as printed; anything else is no ticket. */
60
60
  export declare function parseTickets(output: unknown): Ticket[];
61
61
  /**
62
- * The production {@link TicketsReader}: the project's provider, looked up by its package.json, one
62
+ * The production {@link TicketsReader}: the project's provider, looked up among the packages the project has (`built-in.ts`), one
63
63
  * source per project kept while the same command provides — so the cache holds across the many
64
64
  * reads of one poll, and a project that installs, swaps or drops its provider is read the new way
65
65
  * within {@link CACHE_MS}. `changed(root)` forgets that project's read, so the next read runs the
@@ -0,0 +1 @@
1
+ export declare function openagentVersion(): string;
@@ -2,10 +2,8 @@
2
2
  * The directory, under a project root, that holds OpenAgent's own files.
3
3
  *
4
4
  * Its own module so every reader and writer of the directory (the hooks file, the project's saved
5
- * prompts, the activation's `.gitignore`, a run's card, diary and inbox) spells it the same way.
6
- *
7
- * Nothing of the product's rides on a branch of its own any more: the agent archives are the
8
- * `logs` skill's runs, on the shared `agent-data` branch that `@openagt/agent-data` names (#1769).
5
+ * prompts, a run's card, diary and inbox) spells it the same way. The name itself is
6
+ * `@openagt/agent-data`'s, which also makes the directory when a folder becomes a project.
9
7
  */
10
- export declare const OPENAGENT_DIR = ".openagent";
8
+ export { OPENAGENT_DIR } from '@openagt/agent-data/names';
11
9
  //# sourceMappingURL=openagent-dir.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openagent-dir.d.ts","sourceRoot":"","sources":["../src/openagent-dir.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,eAAe,CAAA"}
1
+ {"version":3,"file":"openagent-dir.d.ts","sourceRoot":"","sources":["../src/openagent-dir.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA"}
@@ -2,10 +2,8 @@
2
2
  * The directory, under a project root, that holds OpenAgent's own files.
3
3
  *
4
4
  * Its own module so every reader and writer of the directory (the hooks file, the project's saved
5
- * prompts, the activation's `.gitignore`, a run's card, diary and inbox) spells it the same way.
6
- *
7
- * Nothing of the product's rides on a branch of its own any more: the agent archives are the
8
- * `logs` skill's runs, on the shared `agent-data` branch that `@openagt/agent-data` names (#1769).
5
+ * prompts, a run's card, diary and inbox) spells it the same way. The name itself is
6
+ * `@openagt/agent-data`'s, which also makes the directory when a folder becomes a project.
9
7
  */
10
- export const OPENAGENT_DIR = '.openagent';
8
+ export { OPENAGENT_DIR } from '@openagt/agent-data/names';
11
9
  //# sourceMappingURL=openagent-dir.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"openagent-dir.js","sourceRoot":"","sources":["../src/openagent-dir.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,YAAY,CAAA"}
1
+ {"version":3,"file":"openagent-dir.js","sourceRoot":"","sources":["../src/openagent-dir.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA"}