@openagt/dashboard 0.56.0 → 0.57.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 (212) hide show
  1. package/README.md +19 -1
  2. package/dist/built-in.d.ts +9 -0
  3. package/dist/built-in.d.ts.map +1 -1
  4. package/dist/built-in.js +19 -1
  5. package/dist/built-in.js.map +1 -1
  6. package/dist/cli/skills.d.ts +7 -9
  7. package/dist/cli/skills.d.ts.map +1 -1
  8. package/dist/cli/skills.js +25 -22
  9. package/dist/cli/skills.js.map +1 -1
  10. package/dist/client.d.ts +3 -0
  11. package/dist/client.d.ts.map +1 -1
  12. package/dist/client.js +3 -0
  13. package/dist/client.js.map +1 -1
  14. package/dist/clone-project.d.ts +10 -8
  15. package/dist/clone-project.d.ts.map +1 -1
  16. package/dist/clone-project.js +36 -47
  17. package/dist/clone-project.js.map +1 -1
  18. package/dist/cloud-scratch-refs.d.ts +9 -1
  19. package/dist/cloud-scratch-refs.d.ts.map +1 -1
  20. package/dist/cloud-scratch-refs.js +9 -2
  21. package/dist/cloud-scratch-refs.js.map +1 -1
  22. package/dist/daemon-runtime.d.ts.map +1 -1
  23. package/dist/daemon-runtime.js +37 -5
  24. package/dist/daemon-runtime.js.map +1 -1
  25. package/dist/daemon-services.d.ts.map +1 -1
  26. package/dist/daemon-services.js +4 -2
  27. package/dist/daemon-services.js.map +1 -1
  28. package/dist/daemon.d.ts.map +1 -1
  29. package/dist/daemon.js +7 -0
  30. package/dist/daemon.js.map +1 -1
  31. package/dist/dashboard/copy-logins.d.ts +1 -1
  32. package/dist/dashboard/copy-logins.d.ts.map +1 -1
  33. package/dist/dashboard/copy-logins.js +9 -6
  34. package/dist/dashboard/copy-logins.js.map +1 -1
  35. package/dist/dashboard/git-hosts.d.ts +1 -3
  36. package/dist/dashboard/git-hosts.d.ts.map +1 -1
  37. package/dist/dashboard/git-hosts.js +2 -2
  38. package/dist/dashboard/git-hosts.js.map +1 -1
  39. package/dist/dashboard/logins-sync.d.ts +25 -1
  40. package/dist/dashboard/logins-sync.d.ts.map +1 -1
  41. package/dist/dashboard/logins-sync.js +78 -15
  42. package/dist/dashboard/logins-sync.js.map +1 -1
  43. package/dist/dashboard/overview.d.ts +4 -2
  44. package/dist/dashboard/overview.d.ts.map +1 -1
  45. package/dist/dashboard/overview.js +7 -3
  46. package/dist/dashboard/overview.js.map +1 -1
  47. package/dist/dashboard/person.d.ts +13 -12
  48. package/dist/dashboard/person.d.ts.map +1 -1
  49. package/dist/dashboard/person.js +7 -21
  50. package/dist/dashboard/person.js.map +1 -1
  51. package/dist/dashboard/projects.d.ts.map +1 -1
  52. package/dist/dashboard/projects.js +5 -1
  53. package/dist/dashboard/projects.js.map +1 -1
  54. package/dist/dashboard/repos.d.ts +63 -0
  55. package/dist/dashboard/repos.d.ts.map +1 -0
  56. package/dist/dashboard/repos.js +131 -0
  57. package/dist/dashboard/repos.js.map +1 -0
  58. package/dist/dashboard/send-skills.d.ts +12 -1
  59. package/dist/dashboard/send-skills.d.ts.map +1 -1
  60. package/dist/dashboard/send-skills.js +11 -3
  61. package/dist/dashboard/send-skills.js.map +1 -1
  62. package/dist/dashboard/start-branch.d.ts.map +1 -1
  63. package/dist/dashboard/start-branch.js +5 -3
  64. package/dist/dashboard/start-branch.js.map +1 -1
  65. package/dist/dashboard/types.d.ts +26 -0
  66. package/dist/dashboard/types.d.ts.map +1 -1
  67. package/dist/dashboard-bundle/assets/host/module--PBDa8mk.js +1 -0
  68. package/dist/dashboard-bundle/assets/main-5Ke2be9l.js +152 -0
  69. package/dist/dashboard-bundle/assets/main-D9WdDo5V.css +2 -0
  70. package/dist/dashboard-bundle/assets/module-XkaUkYn0.js +19 -0
  71. package/dist/dashboard-bundle/index.html +4 -4
  72. package/dist/dashboard-rpc/agents.d.ts +64 -0
  73. package/dist/dashboard-rpc/agents.d.ts.map +1 -0
  74. package/dist/dashboard-rpc/agents.js +137 -0
  75. package/dist/dashboard-rpc/agents.js.map +1 -0
  76. package/dist/dashboard-rpc/copied-logins.d.ts +1 -1
  77. package/dist/dashboard-rpc/copied-logins.d.ts.map +1 -1
  78. package/dist/dashboard-rpc/copied-logins.js +7 -7
  79. package/dist/dashboard-rpc/copied-logins.js.map +1 -1
  80. package/dist/dashboard-rpc/hosted-repos.d.ts +42 -0
  81. package/dist/dashboard-rpc/hosted-repos.d.ts.map +1 -0
  82. package/dist/dashboard-rpc/hosted-repos.js +74 -0
  83. package/dist/dashboard-rpc/hosted-repos.js.map +1 -0
  84. package/dist/dashboard-rpc/index.d.ts +3 -2
  85. package/dist/dashboard-rpc/index.d.ts.map +1 -1
  86. package/dist/dashboard-rpc/index.js +5 -3
  87. package/dist/dashboard-rpc/index.js.map +1 -1
  88. package/dist/dashboard-rpc/logins.d.ts +1 -33
  89. package/dist/dashboard-rpc/logins.d.ts.map +1 -1
  90. package/dist/dashboard-rpc/logins.js +3 -51
  91. package/dist/dashboard-rpc/logins.js.map +1 -1
  92. package/dist/dashboard-rpc/modules.d.ts +4 -3
  93. package/dist/dashboard-rpc/modules.d.ts.map +1 -1
  94. package/dist/dashboard-rpc/modules.js +6 -5
  95. package/dist/dashboard-rpc/modules.js.map +1 -1
  96. package/dist/dashboard-rpc/person.d.ts +32 -1
  97. package/dist/dashboard-rpc/person.d.ts.map +1 -1
  98. package/dist/dashboard-rpc/person.js +49 -8
  99. package/dist/dashboard-rpc/person.js.map +1 -1
  100. package/dist/dashboard-rpc/personal-folder.d.ts +19 -2
  101. package/dist/dashboard-rpc/personal-folder.d.ts.map +1 -1
  102. package/dist/dashboard-rpc/personal-folder.js +24 -6
  103. package/dist/dashboard-rpc/personal-folder.js.map +1 -1
  104. package/dist/dashboard-rpc/project-agent-data.d.ts +12 -0
  105. package/dist/dashboard-rpc/project-agent-data.d.ts.map +1 -1
  106. package/dist/dashboard-rpc/project-agent-data.js +17 -2
  107. package/dist/dashboard-rpc/project-agent-data.js.map +1 -1
  108. package/dist/dashboard-rpc/projects.d.ts +62 -6
  109. package/dist/dashboard-rpc/projects.d.ts.map +1 -1
  110. package/dist/dashboard-rpc/projects.js +104 -15
  111. package/dist/dashboard-rpc/projects.js.map +1 -1
  112. package/dist/dashboard-rpc/reads.d.ts +1 -1
  113. package/dist/dashboard-rpc/reads.d.ts.map +1 -1
  114. package/dist/dashboard-rpc/reads.js +6 -2
  115. package/dist/dashboard-rpc/reads.js.map +1 -1
  116. package/dist/dashboard-rpc/runs-changed.d.ts.map +1 -1
  117. package/dist/dashboard-rpc/runs-changed.js +9 -3
  118. package/dist/dashboard-rpc/runs-changed.js.map +1 -1
  119. package/dist/dashboard-rpc/send-as.d.ts +42 -0
  120. package/dist/dashboard-rpc/send-as.d.ts.map +1 -0
  121. package/dist/dashboard-rpc/send-as.js +78 -0
  122. package/dist/dashboard-rpc/send-as.js.map +1 -0
  123. package/dist/dashboard-rpc/skills.d.ts +2 -1
  124. package/dist/dashboard-rpc/skills.d.ts.map +1 -1
  125. package/dist/dashboard-rpc/skills.js +6 -4
  126. package/dist/dashboard-rpc/skills.js.map +1 -1
  127. package/dist/module-types/dashboard/components/ui/confirm-dialog.d.ts +5 -1
  128. package/dist/module-types/dashboard/components/ui/row-item.d.ts +1 -2
  129. package/dist/module-types/dashboard/lib/route.d.ts +3 -3
  130. package/dist/module-types/dashboard/module/index.d.ts +2 -2
  131. package/dist/module-types/src/built-in.d.ts +9 -0
  132. package/dist/module-types/src/client.d.ts +3 -0
  133. package/dist/module-types/src/clone-project.d.ts +10 -8
  134. package/dist/module-types/src/dashboard/git-hosts.d.ts +1 -3
  135. package/dist/module-types/src/dashboard/logins-sync.d.ts +25 -1
  136. package/dist/module-types/src/dashboard/overview.d.ts +4 -2
  137. package/dist/module-types/src/dashboard/person.d.ts +13 -12
  138. package/dist/module-types/src/dashboard/repos.d.ts +62 -0
  139. package/dist/module-types/src/dashboard/send-skills.d.ts +12 -1
  140. package/dist/module-types/src/dashboard/types.d.ts +26 -0
  141. package/dist/module-types/src/dashboard-rpc/agents.d.ts +63 -0
  142. package/dist/module-types/src/dashboard-rpc/copied-logins.d.ts +1 -1
  143. package/dist/module-types/src/dashboard-rpc/hosted-repos.d.ts +41 -0
  144. package/dist/module-types/src/dashboard-rpc/index.d.ts +3 -2
  145. package/dist/module-types/src/dashboard-rpc/logins.d.ts +1 -33
  146. package/dist/module-types/src/dashboard-rpc/modules.d.ts +4 -3
  147. package/dist/module-types/src/dashboard-rpc/person.d.ts +32 -1
  148. package/dist/module-types/src/dashboard-rpc/personal-folder.d.ts +19 -2
  149. package/dist/module-types/src/dashboard-rpc/project-agent-data.d.ts +12 -0
  150. package/dist/module-types/src/dashboard-rpc/projects.d.ts +62 -6
  151. package/dist/module-types/src/dashboard-rpc/reads.d.ts +1 -1
  152. package/dist/module-types/src/dashboard-rpc/send-as.d.ts +41 -0
  153. package/dist/module-types/src/dashboard-rpc/skills.d.ts +2 -1
  154. package/dist/module-types/src/project-address.d.ts +8 -1
  155. package/dist/module-types/src/project-hooks.d.ts +12 -2
  156. package/dist/module-types/src/project-modules.d.ts +6 -0
  157. package/dist/module-types/src/project-skills/catalogue.d.ts +6 -9
  158. package/dist/module-types/src/registry.d.ts +13 -0
  159. package/dist/module-types/src/store/agent-store.d.ts +14 -0
  160. package/dist/module-types/src/store/branches.d.ts +7 -0
  161. package/dist/module-types/src/store/git-host.d.ts +1 -3
  162. package/dist/module-types/src/typed-repository.d.ts +16 -0
  163. package/dist/project-address.d.ts +8 -1
  164. package/dist/project-address.d.ts.map +1 -1
  165. package/dist/project-address.js +11 -4
  166. package/dist/project-address.js.map +1 -1
  167. package/dist/project-hooks.d.ts +12 -2
  168. package/dist/project-hooks.d.ts.map +1 -1
  169. package/dist/project-hooks.js +9 -2
  170. package/dist/project-hooks.js.map +1 -1
  171. package/dist/project-modules.d.ts +6 -0
  172. package/dist/project-modules.d.ts.map +1 -1
  173. package/dist/project-modules.js +13 -1
  174. package/dist/project-modules.js.map +1 -1
  175. package/dist/project-skills/catalogue.d.ts +6 -9
  176. package/dist/project-skills/catalogue.d.ts.map +1 -1
  177. package/dist/project-skills/catalogue.js +9 -8
  178. package/dist/project-skills/catalogue.js.map +1 -1
  179. package/dist/registry.d.ts +13 -0
  180. package/dist/registry.d.ts.map +1 -1
  181. package/dist/registry.js +43 -2
  182. package/dist/registry.js.map +1 -1
  183. package/dist/sessions-home.d.ts +11 -0
  184. package/dist/sessions-home.d.ts.map +1 -0
  185. package/dist/sessions-home.js +41 -0
  186. package/dist/sessions-home.js.map +1 -0
  187. package/dist/store/agent-store.d.ts +14 -0
  188. package/dist/store/agent-store.d.ts.map +1 -1
  189. package/dist/store/agent-store.js.map +1 -1
  190. package/dist/store/branches.d.ts +7 -0
  191. package/dist/store/branches.d.ts.map +1 -1
  192. package/dist/store/branches.js +37 -2
  193. package/dist/store/branches.js.map +1 -1
  194. package/dist/store/git-host.d.ts +1 -3
  195. package/dist/store/git-host.d.ts.map +1 -1
  196. package/dist/store/git-host.js +0 -14
  197. package/dist/store/git-host.js.map +1 -1
  198. package/dist/typed-repository.d.ts +17 -0
  199. package/dist/typed-repository.d.ts.map +1 -0
  200. package/dist/typed-repository.js +29 -0
  201. package/dist/typed-repository.js.map +1 -0
  202. package/dist/website/assets/entries/{entry-client-routing.C33s8xOY.js → entry-client-routing.CvPemUV2.js} +2 -2
  203. package/dist/website/assets/entries/{pages_go-to-dashboard.C3OBfFYB.js → pages_go-to-dashboard.CUCqKDCh.js} +1 -1
  204. package/dist/website/banner/index.html +1 -1
  205. package/dist/website/go-to-dashboard/index.html +3 -3
  206. package/dist/website/index.html +1 -1
  207. package/dist/website/press/index.html +1 -1
  208. package/package.json +18 -18
  209. package/dist/dashboard-bundle/assets/host/module-BMyNrbiB.js +0 -1
  210. package/dist/dashboard-bundle/assets/main-BK8YIg7v.js +0 -152
  211. package/dist/dashboard-bundle/assets/main-mnNPGbsz.css +0 -2
  212. package/dist/dashboard-bundle/assets/module-DY3Aigsz.js +0 -19
@@ -117,6 +117,32 @@ export interface StartAgentOptions {
117
117
  * start is forwarded, so the machine starts an ordinary local run and does not relay onward.
118
118
  */
119
119
  machine?: string;
120
+ /**
121
+ * The repos a session with no project has as context, by their folders on this computer: each is
122
+ * copied into the session's folder. Refused for a project, which works in its own checkout.
123
+ */
124
+ repos?: string[];
125
+ /**
126
+ * The account at the git host this session works as, by its login: one of the accounts the
127
+ * computer the run goes to has there. Absent, the one that computer's runs use. The run's record
128
+ * keeps it, and a resume goes on as it.
129
+ */
130
+ account?: string;
131
+ /**
132
+ * The agent the session is on, by its id (`~/.openagent/agents/<id>.json`): its skills and
133
+ * accounts. Absent, the default agent. The run's record keeps it, and a resume goes on with it.
134
+ */
135
+ agent?: string;
136
+ /** Skills the session gets on top of its agent's, by name: the "Skills" menu's picks for this session. Absent, none. */
137
+ skillsOn?: string[];
138
+ /** Skills of its agent's the session does not get, by name. Absent, none. */
139
+ skillsOff?: string[];
140
+ /**
141
+ * Which of the project's own skills stay in the session's checkout: `none`, or their names.
142
+ * Absent, every one. Refused for a session with no project. The run's record keeps these three,
143
+ * and a resume goes on with them.
144
+ */
145
+ projectSkills?: 'none' | string[];
120
146
  }
121
147
  /**
122
148
  * The outcome of a Start attempt (#345): the id of the run the project's start hook began, or why
@@ -0,0 +1,63 @@
1
+ import { type AgentAccounts, type AgentRecord } from '@openagt/agent-data';
2
+ import { type AccountResult } from './accounts.js';
3
+ import { type AgentLoginsOn } from '../dashboard/logins-sync.js';
4
+ export type { AgentAccounts, AgentRecord } from '@openagt/agent-data';
5
+ export type { AgentLoginsOn } from '../dashboard/logins-sync.js';
6
+ /** One skill an agent can be given. */
7
+ export interface AgentSkillChoice {
8
+ name: string;
9
+ /** The one line the skill's text says of itself. */
10
+ description: string;
11
+ }
12
+ export interface AgentsView {
13
+ /** Every agent, the default first. */
14
+ agents: AgentRecord[];
15
+ /** The skills to pick from, in groups: the default agent's first, then the catalogue's. */
16
+ skills: {
17
+ title: string;
18
+ skills: AgentSkillChoice[];
19
+ }[];
20
+ /** OpenAgent's GitHub accounts on this computer. */
21
+ github?: {
22
+ accounts: string[];
23
+ };
24
+ /** The Claude accounts of the Permissions page, by id and name. */
25
+ claude: {
26
+ id: string;
27
+ name: string;
28
+ }[];
29
+ /** The Codex accounts, the same way. */
30
+ codex: {
31
+ id: string;
32
+ name: string;
33
+ }[];
34
+ }
35
+ /** Every agent, and what one can be given. (`onAgents` names the runs' list already.) */
36
+ export declare function onAgentsList(): Promise<AgentsView>;
37
+ /** What the page sends to save an agent: a new one has no id yet. */
38
+ export interface AgentChange {
39
+ id?: string;
40
+ name: string;
41
+ skills: string[];
42
+ accounts: AgentAccounts;
43
+ /** Whether its sessions get the project's own skills. */
44
+ projectSkills: boolean;
45
+ }
46
+ /**
47
+ * Save an agent: a new one under the id its name gives, an existing one under its own. The name
48
+ * must give an id, every skill must be one this computer carries, and every account one it knows;
49
+ * else nothing is written and the reason is said.
50
+ */
51
+ export declare function sendSaveAgent(change: AgentChange): Promise<({
52
+ ok: true;
53
+ id: string;
54
+ } | {
55
+ ok: false;
56
+ error: string;
57
+ }) & Partial<AccountResult>>;
58
+ /** How the agents' GitHub accounts stand on each device of the person's. A server copies to no device: none. */
59
+ export declare function onAgentLogins(): Promise<AgentLoginsOn[]>;
60
+ /** Copy the agents' GitHub accounts to every device again, now: the press for one that failed. */
61
+ export declare function sendCopyAgentLogins(): Promise<AccountResult>;
62
+ /** Remove an agent; the default agent stays. */
63
+ export declare function sendRemoveAgent(id: string): Promise<AccountResult>;
@@ -23,7 +23,7 @@ export type CopiedView = {
23
23
  ok: false;
24
24
  error: string;
25
25
  };
26
- /** What the server keeps from the person's computers, without how full each is: what a computer compares its own with. */
26
+ /** What this device keeps from the person's computers, without how full each is: what a computer compares its own with. A device that is no server keeps git hosts' accounts alone. */
27
27
  export declare function onCopiedLogins(): Promise<CopiedView>;
28
28
  /**
29
29
  * Take a login a computer of the person's handed over: it goes where its tool reads it, in place
@@ -0,0 +1,41 @@
1
+ /** A repository at a git host, not looked for on this computer. */
2
+ export interface HostedRepo {
3
+ /** `<host>/<owner>/<name>`: what a clone is asked for. */
4
+ address: string;
5
+ url: string;
6
+ private: boolean;
7
+ description?: string;
8
+ /** Why it is listed: the account it is one of, or the owner the person named. */
9
+ from: string;
10
+ }
11
+ /** How old the kept lists may be before a read asks the hosts again, behind the answer. */
12
+ export declare const HOSTED_MAX_AGE_MS: number;
13
+ /** How long a first read waits for the hosts before it answers with nothing yet. */
14
+ export declare const HOSTED_FIRST_WAIT_MS = 1500;
15
+ /** What a read answers: the lists as kept, and whether the hosts are being asked now. */
16
+ export interface HostedRead {
17
+ repos: HostedRepo[];
18
+ loading: boolean;
19
+ }
20
+ /** What a listing is asked through: the host's package, and OpenAgent's accounts and the person's owners. */
21
+ export declare const hostedWiring: {
22
+ run: (host: string, args: string[]) => Promise<{
23
+ ok: true;
24
+ output: unknown;
25
+ } | {
26
+ ok: false;
27
+ error: string;
28
+ }>;
29
+ hosts: () => Promise<import("./send-as.js").SendAsHost[]>;
30
+ owners: () => Promise<string[]>;
31
+ now: () => number;
32
+ };
33
+ /**
34
+ * The hosts' repositories as kept. The first read waits {@link HOSTED_FIRST_WAIT_MS} at most, and
35
+ * then says they are still being read; a read of old lists answers them and asks again behind.
36
+ */
37
+ export declare function readHosted(): Promise<HostedRead>;
38
+ /** Ask the hosts again now, and answer what they listed: after the person named another owner. */
39
+ export declare function refreshHosted(): Promise<HostedRepo[]>;
40
+ /** Forget the kept lists: for a test. */
41
+ export declare function forgetHosted(): void;
@@ -1,7 +1,7 @@
1
1
  export { onAgents, onStartedName, onModuleAgents, onAgent, onAgentsDoing, onDocs, onQueue, onOverview, onRecentAgents, onInterventions, onActivity, onDashboard, onGitHostHome, onRepositoryOffer, onGitStatus, onProjectFiles, onRetainedWorktrees, onAgentWorktree, onAgentMainBranch, onAgentHandoff, onBridgeQuestion, onBridgeStatus, onBridgeToken, onBridgeEvents, onBridgeAnswer, onBridgeBrowser } from './reads.js';
2
2
  export { sendStop, sendChoice, sendBridgeAnswer, sendBridgeAnswerCancel, sendBridgeBrowser, sendMessage, sendStart, sendOpenInApp, sendRemoveWorktree, sendDeleteAgent, sendOpenPullRequest, sendPush, sendMergeBranch, sendMerge, sendCreateRepository } from './control.js';
3
3
  export { streamAgentEvents, type LiveFeedEvent, type PartialMessage, type StreamSync } from './events.js';
4
- export { onProjects, sendAddProject, sendStartedAgain, onCloneTarget, sendAddProjectFromAddress, sendRemoveProject, sendShareRecords, sendPickProjectDirectory, onOnboarding, onCommands, onStartBranches, onStartCheck, onCloneCheck, type ProjectLauncher } from './projects.js';
4
+ export { onProjects, sendAddProject, sendStartedAgain, onCloneTarget, sendAddProjectFromAddress, sendRemoveProject, sendShareRecords, sendPickProjectDirectory, onRepos, sendAddRepoFolder, onOnboarding, onCommands, onStartBranches, onStartCheck, onCloneCheck, type ProjectLauncher } from './projects.js';
5
5
  export { onPreferences, savePreferences, patchPreferences, onProjectPresets, saveProjectPresets, onEditors, type SavePreferencesResult, type PatchPreferencesResult, } from './preferences.js';
6
6
  export { type EditorInfo } from '../dashboard/open-in-app.js';
7
7
  export { onQuota } from './quota.js';
@@ -11,7 +11,8 @@ export { onModules, runModuleCommand, runComputerCommand, runComputerCommandOn,
11
11
  export { onProjectSkills, sendChangeSkills, sendProjectSkills, type ProjectSkills, type ProjectSkill, type ChangeSkillsResult } from './skills.js';
12
12
  export { onPerson, type Person } from './person.js';
13
13
  export { onGitHostPeople, type HostPerson } from './people.js';
14
- export { onGitHosts, sendUseGitHostAccount, sendForgetGitHostAccount, sendGitHostLogin, sendGitHostInstall, onAgentState, sendAgentFix, onProjectAccounts, sendProjectAccounts, type GitHostsView, type GitHostRow, type GitHostAccount, type GitHostProvider, type AgentState, type ProjectAccountsView, type ProjectAgentAccounts } from './logins.js';
14
+ export { onAgentsList, sendSaveAgent, sendRemoveAgent, onAgentLogins, sendCopyAgentLogins, type AgentsView, type AgentChange, type AgentSkillChoice, type AgentLoginsOn } from './agents.js';
15
+ export { onGitHosts, sendUseGitHostAccount, sendForgetGitHostAccount, sendGitHostLogin, sendGitHostInstall, onAgentState, sendAgentFix, type GitHostsView, type GitHostRow, type GitHostAccount, type GitHostProvider, type AgentState } from './logins.js';
15
16
  export { onPersonalFolder, sendSyncPersonalFolder, sendStopSyncingPersonalFolder, type PersonalFolderView } from './personal-folder.js';
16
17
  export { onProjectAgentData, type ProjectAgentData, type KeptData } from './project-agent-data.js';
17
18
  export { onServerLogins, sendUseLoginsOn, sendAllowLogins, sendSettleLogin, type ServerLoginsView, type ServerLogins, type LoginThere } from './server-logins.js';
@@ -47,7 +47,7 @@ export declare const gitHostPackages: {
47
47
  error: string;
48
48
  }>;
49
49
  };
50
- /** Runs use `login` at `host` from now on; the terminal's own account stays as it is. */
50
+ /** Runs use `login`, one of OpenAgent's own accounts at `host`, from now on. */
51
51
  export declare function sendUseGitHostAccount(host: string, login: string): Promise<AccountResult>;
52
52
  /**
53
53
  * Take an account off at `host`, on this computer: its tool forgets it, and its token goes on
@@ -91,35 +91,3 @@ export declare function onAgentState(driver?: string): Promise<AgentState>;
91
91
  * in {@link onAgentState}.
92
92
  */
93
93
  export declare function sendAgentFix(driver: string): Promise<AccountResult>;
94
- /** A project's own accounts, beside the computer's: shown for a kind the computer has two or more of, or that the project names already. */
95
- export interface ProjectAccountsView {
96
- gitHost?: {
97
- host: string;
98
- name: string;
99
- /** The host's word for a pull request. */
100
- requestWord: string;
101
- accounts: string[];
102
- /** The computer's runs' account. */
103
- computer?: string;
104
- /** The project's own, when it names one. */
105
- project?: string;
106
- };
107
- claude?: ProjectAgentAccounts;
108
- codex?: ProjectAgentAccounts;
109
- }
110
- /** One agent's accounts a project may pick from, and its own few. */
111
- export interface ProjectAgentAccounts {
112
- accounts: {
113
- id: string;
114
- name: string;
115
- }[];
116
- /** The project's own few, by id, when it names some. */
117
- project?: string[];
118
- }
119
- export declare function onProjectAccounts(projectId: string): Promise<ProjectAccountsView | null>;
120
- /** Change a project's own accounts: a value sets one, `null` goes back to the computer's. Kept on this computer, never in the repository. */
121
- export declare function sendProjectAccounts(projectId: string, change: {
122
- gitHost?: string | null;
123
- claude?: string[] | null;
124
- codex?: string[] | null;
125
- }): Promise<AccountResult>;
@@ -15,9 +15,10 @@ export interface DashboardModule {
15
15
  }
16
16
  /**
17
17
  * Every module the dashboard loads (#1774), one per package. First the computer's, which are
18
- * there with no project added. Then every module any registered project brings, with the projects
19
- * that have it: with no project picked the sidebar and the pages are every project's, and the
20
- * dashboard narrows them itself to a picked project's. A package several projects install is loaded once, from
18
+ * there with no project added. Then every module whose pages a registered project shows, with
19
+ * the projects that show them: with no project picked the sidebar and the pages are every
20
+ * project's, and the dashboard narrows them itself to a picked project's. A package several
21
+ * projects install is loaded once, from
21
22
  * the first of them in the registry's order; its page then reads each project through that
22
23
  * project's own command. A project that cannot be read contributes nothing.
23
24
  */
@@ -1,4 +1,35 @@
1
1
  import { type Person } from '../dashboard/person.js';
2
2
  export type { Person } from '../dashboard/person.js';
3
- /** The person at this dashboard, for the foot of its sidebar (`readPerson`): another person's, for a page their device opened. */
3
+ /** The person at this dashboard, for the foot of its sidebar and Settings › Profile (`readPerson`): another person's, for a page their device opened. */
4
4
  export declare function onPerson(): Promise<Person>;
5
+ /** Call the person `name` in OpenAgent, on every computer of theirs: the picture stays as it was. */
6
+ export declare function sendSavePersonName(name: string): Promise<{
7
+ ok: true;
8
+ } | {
9
+ ok: false;
10
+ error: string;
11
+ }>;
12
+ /** Show no picture of the person: their initials instead. */
13
+ export declare function sendRemovePersonPicture(): Promise<{
14
+ ok: true;
15
+ } | {
16
+ ok: false;
17
+ error: string;
18
+ }>;
19
+ /**
20
+ * Copy the name and picture of GitHub's public profile of `login` into the person's own, once:
21
+ * read with no login, and never again after this press.
22
+ */
23
+ export declare function sendSyncPersonFromGitHub(login: string): Promise<{
24
+ ok: true;
25
+ } | {
26
+ ok: false;
27
+ error: string;
28
+ }>;
29
+ /** Forget the person's own name and picture: git's name, or this computer's user, again. */
30
+ export declare function sendForgetPerson(): Promise<{
31
+ ok: true;
32
+ } | {
33
+ ok: false;
34
+ error: string;
35
+ }>;
@@ -1,13 +1,30 @@
1
+ import { type SendAsHost } from './send-as.js';
2
+ export type { SendAsHost } from './send-as.js';
1
3
  import { type PersonalFolderShown } from '../personal-folder-shown.js';
2
4
  export interface PersonalFolderView extends PersonalFolderShown {
3
5
  /** Commits made here that have not reached the repository yet. */
4
6
  unsent: number;
5
7
  /** The projects of this computer that keep their agent data in it, by name. */
6
8
  projects: string[];
9
+ /** The login of OpenAgent's account it is sent as, when it syncs. */
10
+ account?: string;
11
+ /** OpenAgent's accounts at each host: what it may be sent as. */
12
+ hosts: SendAsHost[];
7
13
  }
8
14
  export declare function onPersonalFolder(): Promise<PersonalFolderView>;
9
- /** Sync the personal folder with the person's repository: what it has comes in, every record here goes out. */
10
- export declare function sendSyncPersonalFolder(typed: string): Promise<{
15
+ /**
16
+ * Sync the personal folder with the person's repository, sent as `login`, one of OpenAgent's
17
+ * accounts at its host: what it has comes in, every record here goes out. Never as the person's
18
+ * own login: with no account there, nothing is sent.
19
+ */
20
+ export declare function sendSyncPersonalFolder(typed: string, login?: string): Promise<{
21
+ ok: true;
22
+ } | {
23
+ ok: false;
24
+ error: string;
25
+ }>;
26
+ /** Send the personal folder as another of OpenAgent's accounts from now on. */
27
+ export declare function sendPersonalFolderAs(login: string): Promise<{
11
28
  ok: true;
12
29
  } | {
13
30
  ok: false;
@@ -1,3 +1,4 @@
1
+ import { type SendAsHost } from './send-as.js';
1
2
  import { type PersonalFolderShown } from '../personal-folder-shown.js';
2
3
  /** One kind of the project's data the skills keep: how many, and the skill that keeps them. */
3
4
  export interface KeptData {
@@ -14,6 +15,17 @@ export interface ProjectAgentData {
14
15
  /** Whether the project has a remote to keep its data on. */
15
16
  canShare: boolean;
16
17
  kept: KeptData[];
18
+ /** The login of OpenAgent's account it is sent as, while shared. */
19
+ account?: string;
20
+ /** OpenAgent's accounts at the remote's host: what it may be sent as. None for a remote that asks no login. */
21
+ accounts?: SendAsHost;
17
22
  }
18
23
  /** Where the project's agent data is and what is kept; `null` for a project with no folder on this computer. */
19
24
  export declare function onProjectAgentData(projectId: string): Promise<ProjectAgentData | null>;
25
+ /** Send the shared project's data as another of OpenAgent's accounts from now on. */
26
+ export declare function sendProjectDataAs(projectId: string, login: string): Promise<{
27
+ ok: true;
28
+ } | {
29
+ ok: false;
30
+ error: string;
31
+ }>;
@@ -1,6 +1,8 @@
1
1
  import { type ProjectCommand } from '../project-commands.js';
2
+ import { type HostedRepo } from './hosted-repos.js';
2
3
  import { type StartReadiness } from '../project-hooks.js';
3
4
  import { type StartFromPick } from '../registry.js';
5
+ import { type FoundRepo } from '../dashboard/repos.js';
4
6
  import { type PickDirectoryResult } from '../pick-directory.js';
5
7
  import type { ProjectSummary } from '../dashboard/projects.js';
6
8
  import type { OwnProject } from '../dashboard/elsewhere.js';
@@ -17,11 +19,9 @@ export declare function onOwnProjects(): Promise<OwnProject[]>;
17
19
  * Projects list. Like `sendStart` this needs the daemon (it spawns git + writes the shared
18
20
  * registry), so it calls the daemon's own `addProject` closure off the wired dashboard context.
19
21
  * Returns the daemon's {@link AddProjectResult}.
20
- *
21
- * `share` is the person's answer, asked before the add: whether the agents' records may go to the
22
- * repository's remote. Nothing is pushed for a project added with `false`.
22
+ * The agents' records stay on this machine; the project's Agent data page shares them later.
23
23
  */
24
- export declare function sendAddProject(path: string, share: boolean): Promise<AddProjectResult>;
24
+ export declare function sendAddProject(path: string): Promise<AddProjectResult>;
25
25
  /**
26
26
  * A second `openagent` started while this dashboard listens on its port (#2141): it serves
27
27
  * nothing itself, and hands over the folder it was started in, if it is in a repository. The
@@ -47,7 +47,7 @@ export declare function onCloneTarget(address: string): Promise<{
47
47
  * folder is then added as {@link sendAddProject} adds one. A folder already there with this
48
48
  * repository in it is added as it is. The answer says where the project is.
49
49
  */
50
- export declare function sendAddProjectFromAddress(address: string, share: boolean): Promise<AddProjectResult>;
50
+ export declare function sendAddProjectFromAddress(address: string): Promise<AddProjectResult>;
51
51
  /**
52
52
  * Remove a project from the dashboard: it leaves the Projects list. Nothing in its folder is
53
53
  * deleted unless `files` is true: then what OpenAgent left there is removed too, and the answer
@@ -63,7 +63,7 @@ export declare function sendRemoveProject(projectId: string, files: boolean): Pr
63
63
  * where they were; off, back to the personal folder. A project with no remote has nothing to
64
64
  * share with, and is refused.
65
65
  */
66
- export declare function sendShareRecords(projectId: string, on: boolean): Promise<{
66
+ export declare function sendShareRecords(projectId: string, on: boolean, login?: string): Promise<{
67
67
  ok: true;
68
68
  } | {
69
69
  ok: false;
@@ -76,6 +76,62 @@ export declare function sendShareRecords(projectId: string, on: boolean): Promis
76
76
  * comes back as `path: null`.
77
77
  */
78
78
  export declare function sendPickProjectDirectory(): Promise<PickDirectoryResult>;
79
+ /** The repos on this computer that are not projects yet, the ones at the git hosts not here, and whether a folder can be added to look in. */
80
+ export interface ReposRead {
81
+ repos: FoundRepo[];
82
+ /** The repositories OpenAgent's accounts and the owners the person named have at the hosts, none of them on this computer: picked, one is cloned. */
83
+ hosted: HostedRepo[];
84
+ /** The hosts are being asked: the picker asks again shortly. */
85
+ hostedLoading: boolean;
86
+ /** This computer can show a folder dialog, so the picker offers "Search another folder…". */
87
+ canAddFolder: boolean;
88
+ }
89
+ /**
90
+ * The repos a new session can start in besides the projects (Rom's "a project is a sticky repo"):
91
+ * every repository the daemon's crawl found on this computer, less those that are projects
92
+ * already. The kept list, so the picker opens at once; an old one is crawled again behind it.
93
+ */
94
+ export declare function onRepos(): Promise<ReposRead>;
95
+ /** Settings › Repos: where repos are looked for, on this computer and at the git hosts. */
96
+ export interface RepoSources {
97
+ /** The folders the person added, looked in beside the home folder. */
98
+ folders: string[];
99
+ /** The users and organizations at a git host whose repositories are listed, as `<host>/<name>`. */
100
+ owners: string[];
101
+ }
102
+ export declare function onRepoSources(): Promise<RepoSources>;
103
+ /** List one more user's or organization's repositories: `vikejs`, `github.com/vikejs` or its page's address. GitHub when no host is named. */
104
+ export declare function sendAddRepoOwner(typed: string): Promise<{
105
+ ok: true;
106
+ } | {
107
+ ok: false;
108
+ error: string;
109
+ }>;
110
+ /** Stop listing an owner's repositories. */
111
+ export declare function sendRemoveRepoOwner(owner: string): Promise<{
112
+ ok: true;
113
+ } | {
114
+ ok: false;
115
+ error: string;
116
+ }>;
117
+ /** Stop looking for repos in a folder the person added. */
118
+ export declare function sendRemoveRepoFolder(folder: string): Promise<{
119
+ ok: true;
120
+ } | {
121
+ ok: false;
122
+ error: string;
123
+ }>;
124
+ /**
125
+ * "Search another folder…": the OS folder dialog, and the folder picked joins those the crawl
126
+ * looks in, which then runs again before the answer. A dismissed dialog adds nothing.
127
+ */
128
+ export declare function sendAddRepoFolder(): Promise<{
129
+ ok: true;
130
+ added: boolean;
131
+ } | {
132
+ ok: false;
133
+ error: string;
134
+ }>;
79
135
  /**
80
136
  * The Onboarding checklist's one server-side fact (#958): the directory this server runs in,
81
137
  * so the first step can offer "Add {cwd} as project" without the user typing a path.
@@ -167,7 +167,7 @@ export declare function onDocs(projectId: string): Promise<WorkspaceDoc[]>;
167
167
  export declare function onQueue(): Promise<ProjectQueue[]>;
168
168
  /** The cross-project Overview (#437): what is running now, the queue size, and recent projects. */
169
169
  export declare function onOverview(): Promise<Overview>;
170
- /** Recent sessions pooled across every project (#shared-shell), newest first, for the home rail. */
170
+ /** Recent sessions pooled across every project and the sessions with no project (#shared-shell), newest first, for the home rail. */
171
171
  export declare function onRecentAgents(): Promise<RecentAgent[]>;
172
172
  /**
173
173
  * The cross-project interventions queue (#632, Queue #624): open PRs that need review, newest first,
@@ -0,0 +1,41 @@
1
+ import { type GitRunner, type RemoteAccount } from '@openagt/agent-data';
2
+ /** OpenAgent's accounts at one host: what a "Send as" select offers. */
3
+ export interface SendAsHost {
4
+ host: string;
5
+ /** The logins GitHub still takes, by name. */
6
+ logins: string[];
7
+ /** The one runs use, picked first where none is named yet. */
8
+ runs?: string;
9
+ }
10
+ /** OpenAgent's accounts at each host a package answers for. */
11
+ export declare function accountsByHost(): Promise<SendAsHost[]>;
12
+ /** What a repository at `host` keeps to be sent as `login`: what its git host's package says of that account, kept a few minutes. */
13
+ export declare function remoteAccount(host: string, login?: string): Promise<{
14
+ ok: true;
15
+ account: RemoteAccount;
16
+ } | {
17
+ ok: false;
18
+ error: string;
19
+ }>;
20
+ /** The account a repository at a typed address is cloned as: the one runs use at its host; none where OpenAgent has none there. */
21
+ export declare function cloneAccountFor(typed: string): Promise<RemoteAccount | undefined>;
22
+ /** The host the repository at `root` has its origin on; none for no origin, or one in a folder on this disk. */
23
+ export declare function originHost(root: string): Promise<string | undefined>;
24
+ /**
25
+ * The account a repository's own branches are sent as by a press of the person's (the Skills
26
+ * page's Send, the clean-up of Claude Code web's branches): the one kept for it at its Share
27
+ * switch, else the one runs use at its host. Nothing for a remote that is a folder on this disk,
28
+ * which asks no login.
29
+ */
30
+ export declare function originAccountOf(root: string): Promise<{
31
+ ok: true;
32
+ account?: RemoteAccount;
33
+ } | {
34
+ ok: false;
35
+ error: string;
36
+ }>;
37
+ /**
38
+ * git for the repository at `root`, its talks with origin going as {@link originAccountOf} says:
39
+ * never as the person's own login. With no account to go as, those talks are refused in words.
40
+ */
41
+ export declare function originGit(root: string): Promise<GitRunner>;
@@ -20,7 +20,6 @@ export interface ProjectSkills {
20
20
  /** The list's groups; `ticked` says whether a group's skills are ticked in a project that has none yet. */
21
21
  groups: {
22
22
  title: string;
23
- ticked: boolean;
24
23
  skills: ProjectSkill[];
25
24
  }[];
26
25
  /** 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. */
@@ -40,6 +39,8 @@ export interface ProjectSkills {
40
39
  branch?: string;
41
40
  /** Whether the branch the folder is on has every waiting skill: an agent started from it has them now. */
42
41
  local: boolean;
42
+ /** Every skill the project holds, by name, as a run's checkout has them: the list's, and the project's own; what the launcher's Skills menu offers per session. */
43
+ held: string[];
43
44
  }
44
45
  /** The project's skills; `null` when the project is unknown here. */
45
46
  export declare function onProjectSkills(projectId: string): Promise<ProjectSkills | null>;
@@ -6,6 +6,13 @@
6
6
  */
7
7
  export declare const OVERVIEW_SEGMENT = "overview";
8
8
  export declare const SETTINGS_SEGMENT = "settings";
9
+ /**
10
+ * The id the sessions with no project go by where a project's id would be, and their address:
11
+ * `/session` is the "New agent session" page with no project, `/session/<agentId>` one of those
12
+ * sessions. A project's id always ends in `-<hash>`, so no project has it, and no project's
13
+ * address or module's page takes the word.
14
+ */
15
+ export declare const SESSIONS_ID = "session";
9
16
  /**
10
17
  * Whether a segment can name a page a module adds (#1774): a lowercase letter, then lowercase
11
18
  * letters and digits, and not a word the dashboard keeps. Whichever module claims the segment gets
@@ -13,7 +20,7 @@ export declare const SETTINGS_SEGMENT = "settings";
13
20
  * that adds it.
14
21
  */
15
22
  export declare function isPageSegment(segment: string): boolean;
16
- /** Each registered project's address, and the project an address or an id names. */
23
+ /** Each registered project's address, and the project an address or an id names; the sessions with no project's too ({@link SESSIONS_ID}). */
17
24
  export interface ProjectAddresses {
18
25
  /** The project's address: its name, or its id where the name cannot be one. An unknown id is its own address. */
19
26
  addressOf(projectId: string): string;
@@ -59,7 +59,7 @@ export interface RunHooksOptions {
59
59
  * goes there. Never throws.
60
60
  */
61
61
  export declare function runProjectHooks(cwd: string, kind: HookKind, opts?: RunHooksOptions): Promise<void>;
62
- /** What a `start` line is given: the prompt, and the coding agent, model, publish level branch to start from and pull request's branch when the person picked them. */
62
+ /** What a `start` line is given: the prompt, and the coding agent, model, publish level, branch to start from, pull request's branch and repos when the person picked them. */
63
63
  export interface StartHookInput {
64
64
  prompt: string;
65
65
  driver?: string;
@@ -72,6 +72,16 @@ export interface StartHookInput {
72
72
  base?: string;
73
73
  /** The branch the run's pull request goes into; the repository's default branch when absent. */
74
74
  prBase?: string;
75
+ /** The folders of the repos a session with no project has as context: one per line in `REPOS`. */
76
+ repos?: readonly string[];
77
+ /** The account at the git host the session works as, by its login: in the environment, as `nameRun` is, so no line has to carry it. */
78
+ account?: string;
79
+ /** The agent the session is on, by its id: in the environment the same way. */
80
+ agent?: string;
81
+ /** The session's picks of skills, in the environment the same way: names on top of its agent's, names of its agent's left out, and which of the project's own stay (`none`, or names). */
82
+ skillsOn?: readonly string[];
83
+ skillsOff?: readonly string[];
84
+ projectSkills?: 'none' | readonly string[];
75
85
  /**
76
86
  * Whether the run is given a short name by a small model (the person's setting). `false` reaches
77
87
  * the run's own tool through the environment rather than the line, so no project's `hooks.yml`
@@ -112,7 +122,7 @@ export type RunHookResult = {
112
122
  };
113
123
  /**
114
124
  * Run the project's `start` line: the prompt in `PROMPT`, the picks in `DRIVER`, `MODEL`, `EFFORT`,
115
- * `PUBLISH`, `BASE` and `PR_BASE` when made. The line answers one JSON document on stdout whose `id` names the
125
+ * `PUBLISH`, `BASE`, `PR_BASE` and `REPOS` (one folder per line) when made. The line answers one JSON document on stdout whose `id` names the
116
126
  * run it started, and whose `driver` may name the coding agent that runs it.
117
127
  */
118
128
  export declare function runStartHook(cwd: string, input: StartHookInput, opts?: Omit<RunHooksOptions, 'log'>): Promise<RunHookResult>;
@@ -65,6 +65,12 @@ input?: string): Promise<ModuleCommandResult>;
65
65
  * by name.
66
66
  */
67
67
  export declare function readProjectModules(root: string): Promise<ProjectModule[]>;
68
+ /**
69
+ * The modules whose pages and cards the project shows: {@link readProjectModules}, less the logs
70
+ * package's where the project did not pick its skill (`built-in.ts`). The others' commands still
71
+ * run there.
72
+ */
73
+ export declare function readProjectPages(root: string): Promise<ProjectModule[]>;
68
74
  /** The one module of this project that `name` names, or undefined. */
69
75
  export declare function findProjectModule(root: string, name: string): Promise<ProjectModule | undefined>;
70
76
  /**
@@ -1,9 +1,8 @@
1
1
  /**
2
- * The skills a project can pick on the dashboard's Skills page (#2023), in its groups, with what
3
- * is ticked the first time. Every group is ticked except the skills that are useless until something of
4
- * their own is set up. The skills every run gets by default are not here (the branches skill,
5
- * and the ones its command names): they come with every run, with nothing written in the
6
- * project.
2
+ * The skills a project can pick on the dashboard's Skills page (#2023), in its groups. None is
3
+ * ticked the first time: the person picks what the project needs. The skills every run gets by
4
+ * default are not here (the branches skill, and the ones its command names): they come with every
5
+ * run, with nothing written in the project.
7
6
  *
8
7
  * Each skill's text is its own package's `SKILL.md`, read from this package's install, so the
9
8
  * dashboard carries the texts of the versions it was published with.
@@ -11,8 +10,6 @@
11
10
  export interface SkillGroup {
12
11
  title: string;
13
12
  skills: readonly string[];
14
- /** Whether the group's skills are ticked in a project that has none of them yet. */
15
- ticked: boolean;
16
13
  }
17
14
  export declare const GROUPS: readonly SkillGroup[];
18
15
  /** Every skill of the list, in its order. */
@@ -20,8 +17,8 @@ export declare const SKILL_NAMES: readonly string[];
20
17
  /**
21
18
  * The scheduler's skill: written, it also gets the two lines that start the scheduler while the
22
19
  * dashboard is open, in the project's hooks file, which is this machine's and outside git; deleted,
23
- * it takes them out. Ticked by default: every automation starts switched off, so the scheduler
24
- * starts no agent until a person says so.
20
+ * it takes them out. Every automation starts switched off, so the scheduler starts no agent until
21
+ * a person says so.
25
22
  */
26
23
  export declare const SCHEDULER = "scheduler";
27
24
  /** One skill as the dashboard carries it. */
@@ -149,6 +149,11 @@ export interface Preferences {
149
149
  * listed starts from its main branch**, so the default stores nothing.
150
150
  */
151
151
  startFrom?: Record<string, StartFromPick>;
152
+ /**
153
+ * The agent a run started from the launcher is on, by its id (`~/.openagent/agents/<id>.json`).
154
+ * The launcher's "Agent" pick writes it. **Absent = the default agent.**
155
+ */
156
+ agent?: string;
152
157
  /**
153
158
  * Where a run started from the launcher goes: a saved machine, by its id. The "Run on" pick
154
159
  * writes it, and the page picks it again at its next opening. **Absent = this machine.** A
@@ -240,6 +245,8 @@ export interface Registry {
240
245
  name?: string;
241
246
  /** The computers the person removed, the newest last (computers-sync.ts). */
242
247
  forgotten?: ForgottenMachine[];
248
+ /** The folders the person added to look for repos in, besides the home folder (dashboard/repos.ts), absolute. */
249
+ repoFolders?: string[];
243
250
  }
244
251
  /** A read/write handle for the user preferences, wired into the dashboard's context by the daemon. */
245
252
  export interface PreferencesStore {
@@ -320,6 +327,12 @@ export declare function addProject(path: string, addedAt: string, fs?: RegistryF
320
327
  * a project whose folder is gone is removed like any other.
321
328
  */
322
329
  export declare function removeProject(id: string, fs?: RegistryFs, env?: NodeJS.ProcessEnv): Promise<ProjectRecord | undefined>;
330
+ /** The folders the person added to look for repos in (dashboard/repos.ts). Forgiving, like {@link listProjects}. */
331
+ export declare function listRepoFolders(fs?: RegistryFs, env?: NodeJS.ProcessEnv): Promise<string[]>;
332
+ /** Add a folder to look for repos in, by its absolute path; one already there is not added again. */
333
+ export declare function addRepoFolder(folder: string, fs?: RegistryFs, env?: NodeJS.ProcessEnv): Promise<void>;
334
+ /** Stop looking for repos in a folder the person added; one not there changes nothing. */
335
+ export declare function removeRepoFolder(folder: string, fs?: RegistryFs, env?: NodeJS.ProcessEnv): Promise<void>;
323
336
  /** The user's dashboard preferences (#410), or `{}` when none are stored. */
324
337
  export declare function readPreferences(fs?: RegistryFs, env?: NodeJS.ProcessEnv): Promise<Preferences>;
325
338
  /** Persist the dashboard preferences (#410), sanitized, preserving the project list. */