@openagt/dashboard 0.33.1 → 0.35.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.
- package/dist/built-in.d.ts.map +1 -1
- package/dist/built-in.js +1 -1
- package/dist/built-in.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +3 -0
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/copy-logins.js +5 -5
- package/dist/dashboard/copy-logins.js.map +1 -1
- package/dist/dashboard/git-hosts.d.ts +38 -0
- package/dist/dashboard/git-hosts.d.ts.map +1 -0
- package/dist/dashboard/git-hosts.js +53 -0
- package/dist/dashboard/git-hosts.js.map +1 -0
- package/dist/dashboard/machine-logins.d.ts +2 -2
- package/dist/dashboard/machine-logins.js +2 -2
- package/dist/dashboard/person.d.ts +1 -1
- package/dist/dashboard/person.js +1 -1
- package/dist/dashboard/relay-endpoints.d.ts +4 -3
- package/dist/dashboard/relay-endpoints.d.ts.map +1 -1
- package/dist/dashboard/relay-endpoints.js +13 -5
- package/dist/dashboard/relay-endpoints.js.map +1 -1
- package/dist/dashboard/remote-run.d.ts +16 -4
- package/dist/dashboard/remote-run.d.ts.map +1 -1
- package/dist/dashboard/remote-run.js +41 -8
- package/dist/dashboard/remote-run.js.map +1 -1
- package/dist/dashboard/send-skills.js +1 -1
- package/dist/dashboard/send-skills.js.map +1 -1
- package/dist/dashboard/start-branch.js +1 -1
- package/dist/dashboard/start-branch.js.map +1 -1
- package/dist/dashboard-bundle/assets/main-DN0tccor.css +2 -0
- package/dist/dashboard-bundle/assets/main-DRAtR1K3.js +148 -0
- package/dist/dashboard-bundle/assets/module-BO3UMgK4.js +14 -0
- package/dist/dashboard-bundle/host/module.js +1 -1
- package/dist/dashboard-bundle/index.html +3 -3
- package/dist/dashboard-rpc/accounts.d.ts +82 -0
- package/dist/dashboard-rpc/accounts.d.ts.map +1 -0
- package/dist/dashboard-rpc/accounts.js +224 -0
- package/dist/dashboard-rpc/accounts.js.map +1 -0
- package/dist/dashboard-rpc/index.d.ts +3 -1
- package/dist/dashboard-rpc/index.d.ts.map +1 -1
- package/dist/dashboard-rpc/index.js +6 -2
- package/dist/dashboard-rpc/index.js.map +1 -1
- package/dist/dashboard-rpc/logins.d.ts +98 -0
- package/dist/dashboard-rpc/logins.d.ts.map +1 -0
- package/dist/dashboard-rpc/logins.js +203 -0
- package/dist/dashboard-rpc/logins.js.map +1 -0
- package/dist/dashboard-rpc/machines.d.ts +24 -2
- package/dist/dashboard-rpc/machines.d.ts.map +1 -1
- package/dist/dashboard-rpc/machines.js +37 -7
- package/dist/dashboard-rpc/machines.js.map +1 -1
- package/dist/dashboard-rpc/projects.js +1 -1
- package/dist/dashboard-rpc/projects.js.map +1 -1
- package/dist/dashboard-rpc/skills.d.ts +3 -4
- package/dist/dashboard-rpc/skills.d.ts.map +1 -1
- package/dist/dashboard-rpc/skills.js +4 -1
- package/dist/dashboard-rpc/skills.js.map +1 -1
- package/dist/local-bin.d.ts +8 -0
- package/dist/local-bin.d.ts.map +1 -0
- package/dist/local-bin.js +16 -0
- package/dist/local-bin.js.map +1 -0
- package/dist/module-types/dashboard/components/Waiting.d.ts +10 -0
- package/dist/module-types/dashboard/lib/machines.d.ts +2 -0
- package/dist/module-types/dashboard/lib/settings-crumb.d.ts +15 -0
- package/dist/module-types/dashboard/lib/use-narrow.d.ts +3 -0
- package/dist/module-types/dashboard/module/index.d.ts +22 -7
- package/dist/module-types/dashboard/rpc/machines.d.ts +7 -0
- package/dist/module-types/src/dashboard/git-hosts.d.ts +37 -0
- package/dist/module-types/src/dashboard/machine-logins.d.ts +2 -2
- package/dist/module-types/src/dashboard/person.d.ts +1 -1
- package/dist/module-types/src/dashboard/remote-run.d.ts +16 -4
- package/dist/module-types/src/dashboard-rpc/accounts.d.ts +81 -0
- package/dist/module-types/src/dashboard-rpc/index.d.ts +3 -1
- package/dist/module-types/src/dashboard-rpc/logins.d.ts +97 -0
- package/dist/module-types/src/dashboard-rpc/machines.d.ts +24 -2
- package/dist/module-types/src/dashboard-rpc/skills.d.ts +3 -4
- package/dist/module-types/src/project-hooks.d.ts +5 -0
- package/dist/module-types/src/project-skills/apply.d.ts +35 -0
- package/dist/module-types/src/project-skills/branch.d.ts +29 -0
- package/dist/module-types/src/project-skills/catalogue.d.ts +39 -0
- package/dist/module-types/src/project-skills/change.d.ts +29 -0
- package/dist/module-types/src/project-skills/commit.d.ts +16 -0
- package/dist/module-types/src/project-skills/project.d.ts +42 -0
- package/dist/module-types/src/project-skills/skill-file.d.ts +16 -0
- package/dist/module-types/src/registry.d.ts +15 -0
- package/dist/project-hooks.d.ts +5 -0
- package/dist/project-hooks.d.ts.map +1 -1
- package/dist/project-hooks.js +4 -1
- package/dist/project-hooks.js.map +1 -1
- package/dist/project-skills/apply.d.ts +36 -0
- package/dist/project-skills/apply.d.ts.map +1 -0
- package/dist/project-skills/apply.js +89 -0
- package/dist/project-skills/apply.js.map +1 -0
- package/dist/project-skills/branch.d.ts +30 -0
- package/dist/project-skills/branch.d.ts.map +1 -0
- package/dist/project-skills/branch.js +82 -0
- package/dist/project-skills/branch.js.map +1 -0
- package/dist/project-skills/catalogue.d.ts +40 -0
- package/dist/project-skills/catalogue.d.ts.map +1 -0
- package/dist/project-skills/catalogue.js +39 -0
- package/dist/project-skills/catalogue.js.map +1 -0
- package/dist/project-skills/change.d.ts +30 -0
- package/dist/project-skills/change.d.ts.map +1 -0
- package/dist/project-skills/change.js +29 -0
- package/dist/project-skills/change.js.map +1 -0
- package/dist/project-skills/commit.d.ts +17 -0
- package/dist/project-skills/commit.d.ts.map +1 -0
- package/dist/project-skills/commit.js +40 -0
- package/dist/project-skills/commit.js.map +1 -0
- package/dist/project-skills/project.d.ts +43 -0
- package/dist/project-skills/project.d.ts.map +1 -0
- package/dist/project-skills/project.js +60 -0
- package/dist/project-skills/project.js.map +1 -0
- package/dist/project-skills/skill-file.d.ts +17 -0
- package/dist/project-skills/skill-file.d.ts.map +1 -0
- package/dist/project-skills/skill-file.js +39 -0
- package/dist/project-skills/skill-file.js.map +1 -0
- package/dist/project-skills/test-project.d.ts +6 -0
- package/dist/project-skills/test-project.d.ts.map +1 -0
- package/dist/project-skills/test-project.js +31 -0
- package/dist/project-skills/test-project.js.map +1 -0
- package/dist/quota-boundary.d.ts.map +1 -1
- package/dist/quota-boundary.js +7 -3
- package/dist/quota-boundary.js.map +1 -1
- package/dist/registry.d.ts +15 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +36 -2
- package/dist/registry.js.map +1 -1
- package/package.json +32 -16
- package/dist/dashboard-bundle/assets/main-BJEMTscF.js +0 -144
- package/dist/dashboard-bundle/assets/main-aHhLUwxc.css +0 -2
- package/dist/dashboard-bundle/assets/module-D7LI75mm.js +0 -14
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { SCHEDULER, SKILL_NAMES } from './catalogue.js';
|
|
2
|
+
import { removeSkill, setScheduler, writeSkill } from './apply.js';
|
|
3
|
+
/** Whether `name` is a skill of the list. */
|
|
4
|
+
export function isKnown(name) {
|
|
5
|
+
return SKILL_NAMES.includes(name);
|
|
6
|
+
}
|
|
7
|
+
export async function applyChange(root, change) {
|
|
8
|
+
const changed = { written: [], removed: [], paths: [], left: [] };
|
|
9
|
+
for (const name of change.write ?? []) {
|
|
10
|
+
const touched = await writeSkill(root, name);
|
|
11
|
+
changed.written.push(name);
|
|
12
|
+
changed.paths.push(...touched.paths);
|
|
13
|
+
changed.left.push(...touched.left);
|
|
14
|
+
}
|
|
15
|
+
for (const name of change.remove ?? []) {
|
|
16
|
+
const touched = await removeSkill(root, name);
|
|
17
|
+
if (touched.paths.length > 0)
|
|
18
|
+
changed.removed.push(name);
|
|
19
|
+
changed.paths.push(...touched.paths);
|
|
20
|
+
changed.left.push(...touched.left);
|
|
21
|
+
}
|
|
22
|
+
const scheduler = change.write?.includes(SCHEDULER) ? true : change.remove?.includes(SCHEDULER) ? false : undefined;
|
|
23
|
+
if (scheduler !== undefined) {
|
|
24
|
+
const outcome = await setScheduler(root, scheduler);
|
|
25
|
+
changed.scheduler = outcome.ok ? { on: scheduler, changed: outcome.changed } : { on: scheduler, error: outcome.error };
|
|
26
|
+
}
|
|
27
|
+
return changed;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=change.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change.js","sourceRoot":"","sources":["../../src/project-skills/change.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAsBlE,6CAA6C;AAC7C,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,MAAc;IAC5D,MAAM,OAAO,GAAY,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;IAC1E,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC5C,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;QACpC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpC,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC7C,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACxD,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;QACpC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpC,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;IACnH,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;QACnD,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAA;IACxH,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type GitRunner } from '@openagt/agent-data';
|
|
2
|
+
/**
|
|
3
|
+
* The one commit of a change to a project's skills (#2023): only the skill files it wrote or
|
|
4
|
+
* deleted, on the branch the person is on, and nothing else they have open. Never a push: the person pushes, or
|
|
5
|
+
* opens a pull request where the default branch is protected.
|
|
6
|
+
*/
|
|
7
|
+
export type CommitOutcome = {
|
|
8
|
+
ok: true;
|
|
9
|
+
committed: boolean;
|
|
10
|
+
commit?: string;
|
|
11
|
+
} | {
|
|
12
|
+
ok: false;
|
|
13
|
+
error: string;
|
|
14
|
+
};
|
|
15
|
+
/** Commit what stands at `paths` (from the project's root) under `message`: a file written, a file deleted. Nothing changed there is no commit. */
|
|
16
|
+
export declare function commitPaths(root: string, paths: readonly string[], message: string, git?: GitRunner): Promise<CommitOutcome>;
|
|
17
|
+
//# sourceMappingURL=commit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../src/project-skills/commit.ts"],"names":[],"mappings":"AAEA,OAAO,EAA4B,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAE9E;;;;GAIG;AAEH,MAAM,MAAM,aAAa,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAE5G,mJAAmJ;AACnJ,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,SAA2B,GAAG,OAAO,CAAC,aAAa,CAAC,CAqBnJ"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { lstat } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { gitReason, nodeGitRunner } from '@openagt/agent-data';
|
|
4
|
+
/** Commit what stands at `paths` (from the project's root) under `message`: a file written, a file deleted. Nothing changed there is no commit. */
|
|
5
|
+
export async function commitPaths(root, paths, message, git = nodeGitRunner()) {
|
|
6
|
+
try {
|
|
7
|
+
// A path that is neither on disk nor known to git is nothing to commit, and git refuses to be handed one.
|
|
8
|
+
const tracked = new Set((await git(['ls-files', '-z', '--', ...paths], root)).split('\0').filter(Boolean));
|
|
9
|
+
const real = [];
|
|
10
|
+
for (const path of new Set(paths)) {
|
|
11
|
+
if (tracked.has(path) || (await lstat(join(root, path)).then(() => true, () => false)))
|
|
12
|
+
real.push(path);
|
|
13
|
+
}
|
|
14
|
+
if (real.length === 0)
|
|
15
|
+
return { ok: true, committed: false };
|
|
16
|
+
// A path one of the project's ignore rules covers can never be committed: said before anything is staged.
|
|
17
|
+
const ignored = (await git(['check-ignore', '--', ...real], root).catch(() => '')).split('\n').filter(Boolean);
|
|
18
|
+
if (ignored.length > 0)
|
|
19
|
+
return { ok: false, error: `git ignores ${ignored[0]}${ignored.length > 1 ? ` and ${ignored.length - 1} more` : ''}: an ignore rule of this project, or of yours, covers it` };
|
|
20
|
+
await git(['add', '-A', '--', ...real], root);
|
|
21
|
+
const staged = (await git(['diff', '--cached', '--name-only', '-z', '--', ...real], root)).split('\0').filter(Boolean);
|
|
22
|
+
if (staged.length === 0)
|
|
23
|
+
return { ok: true, committed: false };
|
|
24
|
+
// With paths, git commits those paths alone and leaves whatever else is staged where it was.
|
|
25
|
+
await git(['commit', '-q', '-m', message, '--', ...staged], root);
|
|
26
|
+
return { ok: true, committed: true, commit: (await git(['rev-parse', '--short', 'HEAD'], root)).trim() };
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
return { ok: false, error: reason(err) };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** Why git refused, in its own last words: a failing hook and a missing identity say so on their last lines, after the command's echo. */
|
|
33
|
+
function reason(err) {
|
|
34
|
+
const said = gitReason(err);
|
|
35
|
+
if (!said.startsWith('Command failed:'))
|
|
36
|
+
return said;
|
|
37
|
+
const lines = (err instanceof Error ? err.message : String(err)).split('\n').map(line => line.trim()).filter(line => line && !line.startsWith('hint:'));
|
|
38
|
+
return lines.length > 1 ? lines.at(-1) : 'git refused the commit';
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=commit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/project-skills/commit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type GitRunner } from '@openagt/agent-data';
|
|
2
|
+
import { type CarriedSkill } from './catalogue.js';
|
|
3
|
+
/**
|
|
4
|
+
* What a project has, read off its files (#2023): a project has a skill when the skill's text is
|
|
5
|
+
* in it, where the coding agents read it. Nothing else is asked: no `package.json`, no list kept
|
|
6
|
+
* anywhere. A folder deleted by hand is a skill removed.
|
|
7
|
+
*/
|
|
8
|
+
/** Where a skill's text is written, and where it is linked for Claude Code. Codex reads the first. */
|
|
9
|
+
export declare const TEXTS_DIR = ".agents/skills";
|
|
10
|
+
export declare const LINKS_DIR = ".claude/skills";
|
|
11
|
+
/**
|
|
12
|
+
* How a skill stands in a project:
|
|
13
|
+
* - `absent`: the project does not hold it.
|
|
14
|
+
* - `current`: its text is the one the dashboard carries.
|
|
15
|
+
* - `newer`: the dashboard carries a newer text than the one the project was given.
|
|
16
|
+
* - `changed`: the project's text was changed by hand since it was written.
|
|
17
|
+
* - `own`: the project holds a text under this name that OpenAgent did not write (no stamp).
|
|
18
|
+
* - `ahead`: the project's text is from a newer OpenAgent than this one.
|
|
19
|
+
*/
|
|
20
|
+
export type Standing = 'absent' | 'current' | 'newer' | 'changed' | 'own' | 'ahead';
|
|
21
|
+
export interface SkillState {
|
|
22
|
+
name: string;
|
|
23
|
+
standing: Standing;
|
|
24
|
+
/** The file the project's text is in, from the project's root; absent when the project holds none. */
|
|
25
|
+
file?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface ProjectState {
|
|
28
|
+
skills: SkillState[];
|
|
29
|
+
/** Whether the folder is a git repository. */
|
|
30
|
+
git: boolean;
|
|
31
|
+
/** Whether a dashboard knows the folder as a project: its `.openagent/` is there. */
|
|
32
|
+
activated: boolean;
|
|
33
|
+
/** Whether the project has a remote named `origin`. */
|
|
34
|
+
remote: boolean;
|
|
35
|
+
/** Whether that remote is on GitHub, the one git host there is a skill for. */
|
|
36
|
+
github: boolean;
|
|
37
|
+
}
|
|
38
|
+
/** How the project's text of one skill stands against the one the dashboard carries. */
|
|
39
|
+
export declare function standingOf(file: string, carried: CarriedSkill): Exclude<Standing, 'absent'>;
|
|
40
|
+
export declare function readProject(root: string, git?: GitRunner): Promise<ProjectState>;
|
|
41
|
+
/** The skills a project holds, by name. */
|
|
42
|
+
export declare function held(state: ProjectState): string[];
|
|
43
|
+
//# sourceMappingURL=project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/project-skills/project.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAElF,OAAO,EAA8B,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAG9E;;;;GAIG;AAEH,sGAAsG;AACtG,eAAO,MAAM,SAAS,mBAAmB,CAAA;AACzC,eAAO,MAAM,SAAS,mBAAmB,CAAA;AAEzC;;;;;;;;GAQG;AACH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,OAAO,CAAA;AAEnF,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,QAAQ,CAAA;IAClB,sGAAsG;IACtG,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,UAAU,EAAE,CAAA;IACpB,8CAA8C;IAC9C,GAAG,EAAE,OAAO,CAAA;IACZ,qFAAqF;IACrF,SAAS,EAAE,OAAO,CAAA;IAClB,uDAAuD;IACvD,MAAM,EAAE,OAAO,CAAA;IACf,+EAA+E;IAC/E,MAAM,EAAE,OAAO,CAAA;CAChB;AAWD,wFAAwF;AACxF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAO3F;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,SAA2B,GAAG,OAAO,CAAC,YAAY,CAAC,CAiBvG;AAED,2CAA2C;AAC3C,wBAAgB,IAAI,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,EAAE,CAElD"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { lstat, readFile, stat } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { nodeGitRunner, OPENAGENT_DIR } from '@openagt/agent-data';
|
|
4
|
+
import { homeUrlFromRemote } from '@openagt/skill-github';
|
|
5
|
+
import { carriedSkills, SKILL_NAMES } from './catalogue.js';
|
|
6
|
+
import { olderThan, unstamped } from './skill-file.js';
|
|
7
|
+
/**
|
|
8
|
+
* What a project has, read off its files (#2023): a project has a skill when the skill's text is
|
|
9
|
+
* in it, where the coding agents read it. Nothing else is asked: no `package.json`, no list kept
|
|
10
|
+
* anywhere. A folder deleted by hand is a skill removed.
|
|
11
|
+
*/
|
|
12
|
+
/** Where a skill's text is written, and where it is linked for Claude Code. Codex reads the first. */
|
|
13
|
+
export const TEXTS_DIR = '.agents/skills';
|
|
14
|
+
export const LINKS_DIR = '.claude/skills';
|
|
15
|
+
/** The file a project's text of `name` is in, from the project's root: the folder written first, else Claude Code's. */
|
|
16
|
+
async function textFile(root, name) {
|
|
17
|
+
for (const dir of [TEXTS_DIR, LINKS_DIR]) {
|
|
18
|
+
const file = `${dir}/${name}/SKILL.md`;
|
|
19
|
+
if (await stat(join(root, file)).then(s => s.isFile(), () => false))
|
|
20
|
+
return file;
|
|
21
|
+
}
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
/** How the project's text of one skill stands against the one the dashboard carries. */
|
|
25
|
+
export function standingOf(file, carried) {
|
|
26
|
+
// A checkout that turned the line ends into CRLF holds the same text.
|
|
27
|
+
const { version, text } = unstamped(file.replaceAll('\r\n', '\n'));
|
|
28
|
+
if (text === carried.text)
|
|
29
|
+
return 'current';
|
|
30
|
+
if (version === undefined)
|
|
31
|
+
return 'own';
|
|
32
|
+
if (olderThan(version, carried.version))
|
|
33
|
+
return 'newer';
|
|
34
|
+
return olderThan(carried.version, version) ? 'ahead' : 'changed';
|
|
35
|
+
}
|
|
36
|
+
export async function readProject(root, git = nodeGitRunner()) {
|
|
37
|
+
const carried = await carriedSkills();
|
|
38
|
+
const skills = [];
|
|
39
|
+
for (const name of SKILL_NAMES) {
|
|
40
|
+
const file = await textFile(root, name);
|
|
41
|
+
if (file === undefined)
|
|
42
|
+
skills.push({ name, standing: 'absent' });
|
|
43
|
+
else
|
|
44
|
+
skills.push({ name, standing: standingOf(await readFile(join(root, file), 'utf8'), carried.get(name)), file });
|
|
45
|
+
}
|
|
46
|
+
const inRepo = await git(['rev-parse', '--is-inside-work-tree'], root).then(out => out.trim() === 'true', () => false);
|
|
47
|
+
const remote = inRepo ? await git(['remote', 'get-url', 'origin'], root).then(out => out.trim(), () => '') : '';
|
|
48
|
+
return {
|
|
49
|
+
skills,
|
|
50
|
+
git: inRepo,
|
|
51
|
+
activated: await lstat(join(root, OPENAGENT_DIR)).then(entry => entry.isDirectory(), () => false),
|
|
52
|
+
remote: remote !== '',
|
|
53
|
+
github: homeUrlFromRemote(remote) !== undefined,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/** The skills a project holds, by name. */
|
|
57
|
+
export function held(state) {
|
|
58
|
+
return state.skills.filter(skill => skill.standing !== 'absent').map(skill => skill.name);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/project-skills/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A skill's text as the dashboard writes it into a project: the package's `SKILL.md`, with the
|
|
3
|
+
* version it is from stamped into its front matter as `metadata.version`. The stamp is what lets a
|
|
4
|
+
* later dashboard tell three things apart when a project's text is not the one it carries:
|
|
5
|
+
* the project's is older (a newer text is there to take), the project's was changed by hand (it is
|
|
6
|
+
* never written over unasked), or the reader itself is the older one (it says nothing).
|
|
7
|
+
*/
|
|
8
|
+
/** `text` with `version` stamped at the end of its front matter. A text with no front matter is given one. */
|
|
9
|
+
export declare function stamped(text: string, version: string): string;
|
|
10
|
+
/** A written file read back: the version it was stamped with, when it has a stamp, and the text without it. */
|
|
11
|
+
export declare function unstamped(file: string): {
|
|
12
|
+
version?: string;
|
|
13
|
+
text: string;
|
|
14
|
+
};
|
|
15
|
+
/** Whether version `a` is older than `b`, by their numbers: `0.1.2` is older than `0.1.10`. Anything that is not three numbers compares as equal. */
|
|
16
|
+
export declare function olderThan(a: string, b: string): boolean;
|
|
17
|
+
//# sourceMappingURL=skill-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-file.d.ts","sourceRoot":"","sources":["../../src/project-skills/skill-file.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,8GAA8G;AAC9G,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAK7D;AAED,+GAA+G;AAC/G,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAI1E;AAED,qJAAqJ;AACrJ,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAUvD"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A skill's text as the dashboard writes it into a project: the package's `SKILL.md`, with the
|
|
3
|
+
* version it is from stamped into its front matter as `metadata.version`. The stamp is what lets a
|
|
4
|
+
* later dashboard tell three things apart when a project's text is not the one it carries:
|
|
5
|
+
* the project's is older (a newer text is there to take), the project's was changed by hand (it is
|
|
6
|
+
* never written over unasked), or the reader itself is the older one (it says nothing).
|
|
7
|
+
*/
|
|
8
|
+
const STAMP = /\nmetadata:\n version: ([0-9A-Za-z.+-]+)\n---\n/;
|
|
9
|
+
/** `text` with `version` stamped at the end of its front matter. A text with no front matter is given one. */
|
|
10
|
+
export function stamped(text, version) {
|
|
11
|
+
const stamp = `metadata:\n version: ${version}\n`;
|
|
12
|
+
const end = text.startsWith('---\n') ? text.indexOf('\n---\n', 3) : -1;
|
|
13
|
+
if (end === -1)
|
|
14
|
+
return `---\n${stamp}---\n${text}`;
|
|
15
|
+
return `${text.slice(0, end + 1)}${stamp}${text.slice(end + 1)}`;
|
|
16
|
+
}
|
|
17
|
+
/** A written file read back: the version it was stamped with, when it has a stamp, and the text without it. */
|
|
18
|
+
export function unstamped(file) {
|
|
19
|
+
const match = file.startsWith('---\n') ? STAMP.exec(file) : null;
|
|
20
|
+
if (!match || match.index > file.indexOf('\n---\n', 3))
|
|
21
|
+
return { text: file };
|
|
22
|
+
return { version: match[1], text: `${file.slice(0, match.index)}\n---\n${file.slice(match.index + match[0].length)}` };
|
|
23
|
+
}
|
|
24
|
+
/** Whether version `a` is older than `b`, by their numbers: `0.1.2` is older than `0.1.10`. Anything that is not three numbers compares as equal. */
|
|
25
|
+
export function olderThan(a, b) {
|
|
26
|
+
const parts = (v) => {
|
|
27
|
+
const match = /^(\d+)\.(\d+)\.(\d+)/.exec(v);
|
|
28
|
+
return match ? [Number(match[1]), Number(match[2]), Number(match[3])] : undefined;
|
|
29
|
+
};
|
|
30
|
+
const x = parts(a);
|
|
31
|
+
const y = parts(b);
|
|
32
|
+
if (!x || !y)
|
|
33
|
+
return false;
|
|
34
|
+
for (let i = 0; i < 3; i++)
|
|
35
|
+
if (x[i] !== y[i])
|
|
36
|
+
return x[i] < y[i];
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=skill-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-file.js","sourceRoot":"","sources":["../../src/project-skills/skill-file.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,KAAK,GAAG,kDAAkD,CAAA;AAEhE,8GAA8G;AAC9G,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,OAAe;IACnD,MAAM,KAAK,GAAG,yBAAyB,OAAO,IAAI,CAAA;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACtE,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,QAAQ,KAAK,QAAQ,IAAI,EAAE,CAAA;IAClD,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAA;AAClE,CAAC;AAED,+GAA+G;AAC/G,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAChE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IAC7E,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAA;AACzH,CAAC;AAED,qJAAqJ;AACrJ,MAAM,UAAU,SAAS,CAAC,CAAS,EAAE,CAAS;IAC5C,MAAM,KAAK,GAAG,CAAC,CAAS,EAAwB,EAAE;QAChD,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC5C,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACnF,CAAC,CAAA;IACD,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IAClB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IAClB,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAA;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;IACnE,OAAO,KAAK,CAAA;AACd,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** A folder for a test: empty, or a git repository with one commit on `main` and an identity of its own. */
|
|
2
|
+
export declare function folder(git: boolean): Promise<string>;
|
|
3
|
+
/** Git in `root`: its stdout. */
|
|
4
|
+
export declare function run(root: string, ...args: string[]): Promise<string>;
|
|
5
|
+
export declare const gone: (root: string) => Promise<void>;
|
|
6
|
+
//# sourceMappingURL=test-project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-project.d.ts","sourceRoot":"","sources":["../../src/project-skills/test-project.ts"],"names":[],"mappings":"AAaA,4GAA4G;AAC5G,wBAAsB,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAY1D;AAED,iCAAiC;AACjC,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAE1E;AAED,eAAO,MAAM,IAAI,SAAU,MAAM,KAAG,OAAO,CAAC,IAAI,CAA+C,CAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { mkdtemp, realpath, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { promisify } from 'node:util';
|
|
6
|
+
// A folder made a repository by a test has no identity of its own to commit under, and a
|
|
7
|
+
// machine may have none either (GitHub's runner): the tests bring one, as a person's machine does.
|
|
8
|
+
for (const who of ['AUTHOR', 'COMMITTER']) {
|
|
9
|
+
process.env[`GIT_${who}_NAME`] ??= 'tester';
|
|
10
|
+
process.env[`GIT_${who}_EMAIL`] ??= 'tester@example.com';
|
|
11
|
+
}
|
|
12
|
+
/** A folder for a test: empty, or a git repository with one commit on `main` and an identity of its own. */
|
|
13
|
+
export async function folder(git) {
|
|
14
|
+
const root = await realpath(await mkdtemp(join(tmpdir(), 'openagent-skills-')));
|
|
15
|
+
if (git) {
|
|
16
|
+
await run(root, 'init', '-q', '-b', 'main');
|
|
17
|
+
await run(root, 'config', 'user.email', 'tester@example.com');
|
|
18
|
+
await run(root, 'config', 'user.name', 'tester');
|
|
19
|
+
await run(root, 'config', 'commit.gpgsign', 'false');
|
|
20
|
+
await writeFile(join(root, 'README.md'), '# a project\n');
|
|
21
|
+
await run(root, 'add', '-A');
|
|
22
|
+
await run(root, 'commit', '-q', '-m', 'init');
|
|
23
|
+
}
|
|
24
|
+
return root;
|
|
25
|
+
}
|
|
26
|
+
/** Git in `root`: its stdout. */
|
|
27
|
+
export async function run(root, ...args) {
|
|
28
|
+
return (await promisify(execFile)('git', args, { cwd: root })).stdout;
|
|
29
|
+
}
|
|
30
|
+
export const gone = (root) => rm(root, { recursive: true, force: true });
|
|
31
|
+
//# sourceMappingURL=test-project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-project.js","sourceRoot":"","sources":["../../src/project-skills/test-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAErC,yFAAyF;AACzF,mGAAmG;AACnG,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAA;IAC3C,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,QAAQ,CAAC,KAAK,oBAAoB,CAAA;AAC1D,CAAC;AAED,4GAA4G;AAC5G,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,GAAY;IACvC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAA;IAC/E,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;QAC3C,MAAM,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,oBAAoB,CAAC,CAAA;QAC7D,MAAM,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;QAChD,MAAM,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAA;QACpD,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,eAAe,CAAC,CAAA;QACzD,MAAM,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;QAC5B,MAAM,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IAC/C,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,iCAAiC;AACjC,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAY,EAAE,GAAG,IAAc;IACvD,OAAO,CAAC,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAA;AACvE,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,IAAY,EAAiB,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quota-boundary.d.ts","sourceRoot":"","sources":["../src/quota-boundary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAE9D,6BAA6B;AAC7B,eAAO,MAAM,aAAa,QAA0B,CAAA;AAQpD,gEAAgE;AAChE,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAA;IAChB,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,4CAA4C;IAC5C,GAAG,EAAE,MAAM,CAAA;IACX,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAA;CAChB;AAuCD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA6B3E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa,CAKjF;
|
|
1
|
+
{"version":3,"file":"quota-boundary.d.ts","sourceRoot":"","sources":["../src/quota-boundary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAE9D,6BAA6B;AAC7B,eAAO,MAAM,aAAa,QAA0B,CAAA;AAQpD,gEAAgE;AAChE,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAA;IAChB,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,4CAA4C;IAC5C,GAAG,EAAE,MAAM,CAAA;IACX,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAA;CAChB;AAuCD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA6B3E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa,CAKjF;AAQD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAI1G"}
|
package/dist/quota-boundary.js
CHANGED
|
@@ -119,6 +119,12 @@ export function boundaryFromResetsAt(resetsAt, now) {
|
|
|
119
119
|
const day = Math.min(WEEK_DAYS, Math.floor(elapsedMs / ONE_DAY_MS) + 1);
|
|
120
120
|
return { startsAt, resetsAt, day, percent: (elapsedMs / QUOTA_WEEK_MS) * 100 };
|
|
121
121
|
}
|
|
122
|
+
/** When the week resets: the exact time where the reading has it (a turn's rate-limit line), else read off the agent's words. */
|
|
123
|
+
function weekResetsAt(week, now) {
|
|
124
|
+
if (week.resetsAt !== undefined)
|
|
125
|
+
return week.resetsAt;
|
|
126
|
+
return week.resetsAtText ? parseResetsAt(week.resetsAtText, now) : undefined;
|
|
127
|
+
}
|
|
122
128
|
/**
|
|
123
129
|
* Where the boundary sits for the account's own week, as the agent reported it (#879).
|
|
124
130
|
*
|
|
@@ -127,9 +133,7 @@ export function boundaryFromResetsAt(resetsAt, now) {
|
|
|
127
133
|
*/
|
|
128
134
|
export function weekBoundary(windows, now) {
|
|
129
135
|
const week = windows.find(w => w.kind === 'week');
|
|
130
|
-
|
|
131
|
-
return undefined;
|
|
132
|
-
const resetsAt = parseResetsAt(week.resetsAtText, now);
|
|
136
|
+
const resetsAt = week && weekResetsAt(week, now);
|
|
133
137
|
return resetsAt === undefined ? undefined : boundaryFromResetsAt(resetsAt, now);
|
|
134
138
|
}
|
|
135
139
|
//# sourceMappingURL=quota-boundary.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quota-boundary.js","sourceRoot":"","sources":["../src/quota-boundary.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"quota-boundary.js","sourceRoot":"","sources":["../src/quota-boundary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,6BAA6B;AAC7B,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;AAEpD,0BAA0B;AAC1B,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;AAEtC,6DAA6D;AAC7D,MAAM,SAAS,GAAG,CAAC,CAAA;AAcnB,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;AAEnG;;;GAGG;AACH,MAAM,SAAS,GAAG,+FAA+F,CAAA;AAEjH,qDAAqD;AACrD,SAAS,YAAY,CAAC,EAAU,EAAE,IAAY;IAC5C,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QAC7C,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,SAAS;KAClB,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;IACpB,MAAM,IAAI,GAAG,CAAC,IAAkC,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,CAAC,CAAA;IACpG,4EAA4E;IAC5E,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAA;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC1G,OAAO,KAAK,GAAG,EAAE,CAAA;AACnB,CAAC;AAED,sGAAsG;AACtG,SAAS,gBAAgB,CAAC,IAAY,EAAE,KAAa,EAAE,GAAW,EAAE,IAAY,EAAE,MAAc,EAAE,IAAY;IAC5G,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IACzD,MAAM,KAAK,GAAG,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAC7C,6EAA6E;IAC7E,wEAAwE;IACxE,MAAM,MAAM,GAAG,IAAI,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IAC/C,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,GAAW;IACrD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IACzC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAA;IAC5B,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAA;IAC9E,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAA;IACjE,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IACjC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;IAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC/B,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,EAAE;QAAE,OAAO,SAAS,CAAA;IAC/C,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/E,MAAM,MAAM,GAAG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IAChE,MAAM,IAAI,GAAG,QAAQ,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAA;IAEjF,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,CAAA;IAC9C,IAAI,IAAwB,CAAA;IAC5B,KAAK,MAAM,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC;QACvD,IAAI,EAAU,CAAA;QACd,IAAI,CAAC;YACH,EAAE,GAAG,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,0EAA0E;YAC1E,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,4EAA4E;QAC5E,qBAAqB;QACrB,IAAI,IAAI,IAAI,CAAC,EAAE,GAAG,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,GAAG;YAAE,SAAQ;QACxE,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC;YAAE,IAAI,GAAG,EAAE,CAAA;IAChF,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAgB,EAAE,GAAW;IAChE,MAAM,QAAQ,GAAG,QAAQ,GAAG,aAAa,CAAA;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,QAAQ,EAAE,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;IACtE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA;IACvE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,SAAS,GAAG,aAAa,CAAC,GAAG,GAAG,EAAE,CAAA;AAChF,CAAC;AAED,iIAAiI;AACjI,SAAS,YAAY,CAAC,IAAuB,EAAE,GAAW;IACxD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,QAAQ,CAAA;IACrD,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AAC9E,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,OAAqC,EAAE,GAAW;IAC7E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAA;IACjD,MAAM,QAAQ,GAAG,IAAI,IAAI,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAChD,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;AACjF,CAAC"}
|
package/dist/registry.d.ts
CHANGED
|
@@ -48,6 +48,11 @@ export interface MachineRecord {
|
|
|
48
48
|
owner?: string;
|
|
49
49
|
/** The person was told, once, that their logins are copied to that other person's computer. */
|
|
50
50
|
told?: true;
|
|
51
|
+
/**
|
|
52
|
+
* The ids the machine is listed under at the doors of the machines it saved, as it last said:
|
|
53
|
+
* kept, so it is known to be in at this computer's door too while it does not answer.
|
|
54
|
+
*/
|
|
55
|
+
listed?: string[];
|
|
51
56
|
}
|
|
52
57
|
/** A GitHub account as a person on a computer is known by: letters, digits and single dashes, at most 39. */
|
|
53
58
|
export declare function isAccount(value: unknown): value is string;
|
|
@@ -321,8 +326,18 @@ export declare function nameMachine(machine: {
|
|
|
321
326
|
id: string;
|
|
322
327
|
key: string;
|
|
323
328
|
}, host: string, fs?: RegistryFs, env?: NodeJS.ProcessEnv): Promise<boolean>;
|
|
329
|
+
/**
|
|
330
|
+
* Keep the ids a saved machine said it is listed under at the doors it saved, when they changed.
|
|
331
|
+
* `key` is the key the machine was asked with: a machine saved anew since keeps what it says itself.
|
|
332
|
+
*/
|
|
333
|
+
export declare function noteListed(machine: {
|
|
334
|
+
id: string;
|
|
335
|
+
key: string;
|
|
336
|
+
}, listed: string[], fs?: RegistryFs, env?: NodeJS.ProcessEnv): Promise<void>;
|
|
324
337
|
/** Write down that the person was told their logins are copied to a saved machine of another person's. Answers whether it is saved. */
|
|
325
338
|
export declare function tellMachine(id: string, fs?: RegistryFs, env?: NodeJS.ProcessEnv): Promise<boolean>;
|
|
339
|
+
/** Give a saved machine the name the person picked. Answers the machine as saved; nothing when it is not saved, or the name is empty. */
|
|
340
|
+
export declare function renameMachine(id: string, label: string, fs?: RegistryFs, env?: NodeJS.ProcessEnv): Promise<MachineRecord | undefined>;
|
|
326
341
|
/** Take a saved machine off the list, by id. Answers the one that was there. */
|
|
327
342
|
export declare function removeMachine(id: string, fs?: RegistryFs, env?: NodeJS.ProcessEnv): Promise<MachineRecord | undefined>;
|
|
328
343
|
/** A {@link PreferencesStore} bound to the real registry file, wired by the daemon so the
|
package/dist/registry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAGrE;;;;;;;GAOG;AAEH,8BAA8B;AAC9B,MAAM,WAAW,aAAa;IAC5B,iDAAiD;IACjD,EAAE,EAAE,MAAM,CAAA;IACV,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,qGAAqG;IACrG,EAAE,EAAE,MAAM,CAAA;IACV,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAA;IACb,8EAA8E;IAC9E,GAAG,EAAE,MAAM,CAAA;IACX,0EAA0E;IAC1E,GAAG,EAAE,MAAM,CAAA;IACX,uGAAuG;IACvG,IAAI,EAAE,MAAM,CAAA;IACZ,qHAAqH;IACrH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+FAA+F;IAC/F,IAAI,CAAC,EAAE,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/registry.js
CHANGED
|
@@ -199,16 +199,19 @@ function sanitizeMachines(value) {
|
|
|
199
199
|
break;
|
|
200
200
|
if (typeof raw !== 'object' || raw === null)
|
|
201
201
|
continue;
|
|
202
|
-
const { label, url, key, door, pin, host, owner, told } = raw;
|
|
202
|
+
const { label, url, key, door, pin, host, owner, told, listed } = raw;
|
|
203
|
+
const ids = Array.isArray(listed) ? listed.filter((id) => typeof id === 'string' && DEVICE_ID.test(id)).slice(0, MACHINE_LIMITS.count) : [];
|
|
203
204
|
if (typeof label !== 'string' || typeof url !== 'string' || typeof key !== 'string' || typeof door !== 'string')
|
|
204
205
|
continue;
|
|
205
206
|
if (!url || !key || !door || seen.has(url))
|
|
206
207
|
continue;
|
|
207
208
|
seen.add(url);
|
|
208
|
-
machines.push({ id: url, label: label.trim().slice(0, MACHINE_LIMITS.label) || url, url, key, door, ...(typeof pin === 'string' && pin ? { pin } : {}), ...(isHostName(host) ? { host } : {}), ...(isAccount(owner) ? { owner } : {}), ...(told === true ? { told: true } : {}) });
|
|
209
|
+
machines.push({ id: url, label: label.trim().slice(0, MACHINE_LIMITS.label) || url, url, key, door, ...(typeof pin === 'string' && pin ? { pin } : {}), ...(isHostName(host) ? { host } : {}), ...(isAccount(owner) ? { owner } : {}), ...(told === true ? { told: true } : {}), ...(ids.length ? { listed: ids } : {}) });
|
|
209
210
|
}
|
|
210
211
|
return machines;
|
|
211
212
|
}
|
|
213
|
+
/** What a door names a device by. */
|
|
214
|
+
const DEVICE_ID = /^[a-z0-9]{6,32}$/;
|
|
212
215
|
/**
|
|
213
216
|
* Read the whole registry. Forgiving: a missing / unreadable / malformed file — or one in a shape
|
|
214
217
|
* this no longer writes — yields an empty registry, never throws. Projects are deduped by resolved
|
|
@@ -443,6 +446,22 @@ export async function nameMachine(machine, host, fs = nodeRegistryFs(), env = pr
|
|
|
443
446
|
return true;
|
|
444
447
|
});
|
|
445
448
|
}
|
|
449
|
+
/**
|
|
450
|
+
* Keep the ids a saved machine said it is listed under at the doors it saved, when they changed.
|
|
451
|
+
* `key` is the key the machine was asked with: a machine saved anew since keeps what it says itself.
|
|
452
|
+
*/
|
|
453
|
+
export async function noteListed(machine, listed, fs = nodeRegistryFs(), env = process.env) {
|
|
454
|
+
const ids = listed.filter(id => DEVICE_ID.test(id)).slice(0, MACHINE_LIMITS.count);
|
|
455
|
+
await serialize(async () => {
|
|
456
|
+
const registry = await readRegistry(fs, env);
|
|
457
|
+
const saved = (registry.machines ?? []).find(candidate => candidate.id === machine.id);
|
|
458
|
+
if (!saved || saved.key !== machine.key || (saved.listed ?? []).join(' ') === ids.join(' '))
|
|
459
|
+
return;
|
|
460
|
+
const { listed: _old, ...rest } = saved;
|
|
461
|
+
const kept = ids.length ? { ...rest, listed: ids } : rest;
|
|
462
|
+
await writeRegistry({ ...registry, machines: (registry.machines ?? []).map(candidate => (candidate.id === machine.id ? kept : candidate)) }, fs, env);
|
|
463
|
+
});
|
|
464
|
+
}
|
|
446
465
|
/** Write down that the person was told their logins are copied to a saved machine of another person's. Answers whether it is saved. */
|
|
447
466
|
export async function tellMachine(id, fs = nodeRegistryFs(), env = process.env) {
|
|
448
467
|
return serialize(async () => {
|
|
@@ -456,6 +475,21 @@ export async function tellMachine(id, fs = nodeRegistryFs(), env = process.env)
|
|
|
456
475
|
return true;
|
|
457
476
|
});
|
|
458
477
|
}
|
|
478
|
+
/** Give a saved machine the name the person picked. Answers the machine as saved; nothing when it is not saved, or the name is empty. */
|
|
479
|
+
export async function renameMachine(id, label, fs = nodeRegistryFs(), env = process.env) {
|
|
480
|
+
const name = label.trim().slice(0, MACHINE_LIMITS.label);
|
|
481
|
+
if (!name)
|
|
482
|
+
return undefined;
|
|
483
|
+
return serialize(async () => {
|
|
484
|
+
const registry = await readRegistry(fs, env);
|
|
485
|
+
const saved = (registry.machines ?? []).find(candidate => candidate.id === id);
|
|
486
|
+
if (!saved)
|
|
487
|
+
return undefined;
|
|
488
|
+
const renamed = { ...saved, label: name };
|
|
489
|
+
await writeRegistry({ ...registry, machines: (registry.machines ?? []).map(machine => (machine.id === id ? renamed : machine)) }, fs, env);
|
|
490
|
+
return renamed;
|
|
491
|
+
});
|
|
492
|
+
}
|
|
459
493
|
/** Take a saved machine off the list, by id. Answers the one that was there. */
|
|
460
494
|
export async function removeMachine(id, fs = nodeRegistryFs(), env = process.env) {
|
|
461
495
|
return serialize(async () => {
|