@agent-workspace/cli 0.2.1 → 0.5.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 (91) hide show
  1. package/dist/commands/artifact.d.ts +1 -0
  2. package/dist/commands/artifact.d.ts.map +1 -1
  3. package/dist/commands/artifact.js +76 -15
  4. package/dist/commands/artifact.js.map +1 -1
  5. package/dist/commands/contract.d.ts +32 -0
  6. package/dist/commands/contract.d.ts.map +1 -0
  7. package/dist/commands/contract.js +237 -0
  8. package/dist/commands/contract.js.map +1 -0
  9. package/dist/commands/identity.d.ts.map +1 -1
  10. package/dist/commands/identity.js +3 -2
  11. package/dist/commands/identity.js.map +1 -1
  12. package/dist/commands/init.d.ts.map +1 -1
  13. package/dist/commands/init.js +6 -0
  14. package/dist/commands/init.js.map +1 -1
  15. package/dist/commands/inspect.d.ts.map +1 -1
  16. package/dist/commands/inspect.js +30 -0
  17. package/dist/commands/inspect.js.map +1 -1
  18. package/dist/commands/memory.d.ts +12 -1
  19. package/dist/commands/memory.d.ts.map +1 -1
  20. package/dist/commands/memory.js +72 -18
  21. package/dist/commands/memory.js.map +1 -1
  22. package/dist/commands/project.d.ts +23 -0
  23. package/dist/commands/project.d.ts.map +1 -0
  24. package/dist/commands/project.js +181 -0
  25. package/dist/commands/project.js.map +1 -0
  26. package/dist/commands/reputation.d.ts +25 -0
  27. package/dist/commands/reputation.d.ts.map +1 -0
  28. package/dist/commands/reputation.js +227 -0
  29. package/dist/commands/reputation.js.map +1 -0
  30. package/dist/commands/status.d.ts +5 -0
  31. package/dist/commands/status.d.ts.map +1 -0
  32. package/dist/commands/status.js +182 -0
  33. package/dist/commands/status.js.map +1 -0
  34. package/dist/commands/swarm.d.ts +40 -0
  35. package/dist/commands/swarm.d.ts.map +1 -0
  36. package/dist/commands/swarm.js +373 -0
  37. package/dist/commands/swarm.js.map +1 -0
  38. package/dist/commands/task.d.ts +41 -0
  39. package/dist/commands/task.d.ts.map +1 -0
  40. package/dist/commands/task.js +381 -0
  41. package/dist/commands/task.js.map +1 -0
  42. package/dist/commands/validate.d.ts +3 -1
  43. package/dist/commands/validate.d.ts.map +1 -1
  44. package/dist/commands/validate.js +101 -3
  45. package/dist/commands/validate.js.map +1 -1
  46. package/dist/index.js +198 -20
  47. package/dist/index.js.map +1 -1
  48. package/dist/lib/artifact.d.ts +2 -8
  49. package/dist/lib/artifact.d.ts.map +1 -1
  50. package/dist/lib/artifact.js +3 -21
  51. package/dist/lib/artifact.js.map +1 -1
  52. package/dist/lib/artifact.test.d.ts +2 -0
  53. package/dist/lib/artifact.test.d.ts.map +1 -0
  54. package/dist/lib/artifact.test.js +41 -0
  55. package/dist/lib/artifact.test.js.map +1 -0
  56. package/dist/lib/contract.d.ts +27 -0
  57. package/dist/lib/contract.d.ts.map +1 -0
  58. package/dist/lib/contract.js +83 -0
  59. package/dist/lib/contract.js.map +1 -0
  60. package/dist/lib/frontmatter.d.ts +2 -11
  61. package/dist/lib/frontmatter.d.ts.map +1 -1
  62. package/dist/lib/frontmatter.js +2 -25
  63. package/dist/lib/frontmatter.js.map +1 -1
  64. package/dist/lib/project.d.ts +54 -0
  65. package/dist/lib/project.d.ts.map +1 -0
  66. package/dist/lib/project.js +153 -0
  67. package/dist/lib/project.js.map +1 -0
  68. package/dist/lib/reputation.d.ts +20 -0
  69. package/dist/lib/reputation.d.ts.map +1 -0
  70. package/dist/lib/reputation.js +51 -0
  71. package/dist/lib/reputation.js.map +1 -0
  72. package/dist/lib/reputation.test.d.ts +2 -0
  73. package/dist/lib/reputation.test.d.ts.map +1 -0
  74. package/dist/lib/reputation.test.js +112 -0
  75. package/dist/lib/reputation.test.js.map +1 -0
  76. package/dist/lib/schema.d.ts.map +1 -1
  77. package/dist/lib/schema.js +9 -5
  78. package/dist/lib/schema.js.map +1 -1
  79. package/dist/lib/swarm.d.ts +22 -0
  80. package/dist/lib/swarm.d.ts.map +1 -0
  81. package/dist/lib/swarm.js +59 -0
  82. package/dist/lib/swarm.js.map +1 -0
  83. package/dist/lib/workspace.d.ts +3 -9
  84. package/dist/lib/workspace.d.ts.map +1 -1
  85. package/dist/lib/workspace.js +6 -42
  86. package/dist/lib/workspace.js.map +1 -1
  87. package/dist/lib/workspace.test.d.ts +2 -0
  88. package/dist/lib/workspace.test.d.ts.map +1 -0
  89. package/dist/lib/workspace.test.js +36 -0
  90. package/dist/lib/workspace.test.js.map +1 -0
  91. package/package.json +8 -2
@@ -0,0 +1,54 @@
1
+ import type { ProjectFrontmatter, TaskFrontmatter, ProjectMember, ReputationDimension } from "@agent-workspace/core";
2
+ import type { WorkspaceFile } from "@agent-workspace/core";
3
+ /**
4
+ * Validate a slug
5
+ */
6
+ export declare function validateSlug(slug: string): boolean;
7
+ /**
8
+ * Get the file path for a project slug
9
+ */
10
+ export declare function slugToProjectPath(workspaceRoot: string, slug: string): string;
11
+ /**
12
+ * Get the tasks directory for a project slug
13
+ */
14
+ export declare function slugToTaskDir(workspaceRoot: string, projectSlug: string): string;
15
+ /**
16
+ * Get the file path for a task within a project
17
+ */
18
+ export declare function slugToTaskPath(workspaceRoot: string, projectSlug: string, taskSlug: string): string;
19
+ /**
20
+ * Load a project by slug
21
+ */
22
+ export declare function loadProject(workspaceRoot: string, slug: string): Promise<WorkspaceFile<ProjectFrontmatter>>;
23
+ /**
24
+ * List all projects in the workspace
25
+ */
26
+ export declare function listProjects(workspaceRoot: string): Promise<WorkspaceFile<ProjectFrontmatter>[]>;
27
+ /**
28
+ * Load a task by project slug and task slug
29
+ */
30
+ export declare function loadTask(workspaceRoot: string, projectSlug: string, taskSlug: string): Promise<WorkspaceFile<TaskFrontmatter>>;
31
+ /**
32
+ * List all tasks for a project
33
+ */
34
+ export declare function listTasks(workspaceRoot: string, projectSlug: string): Promise<WorkspaceFile<TaskFrontmatter>[]>;
35
+ /**
36
+ * Ensure the tasks directory exists for a project
37
+ */
38
+ export declare function ensureTaskDir(workspaceRoot: string, projectSlug: string): Promise<void>;
39
+ /**
40
+ * Recalculate taskCount and completedCount for a project from its tasks.
41
+ */
42
+ export declare function computeProjectCounts(workspaceRoot: string, projectSlug: string): Promise<{
43
+ taskCount: number;
44
+ completedCount: number;
45
+ }>;
46
+ /**
47
+ * Check reputation gates for a project member.
48
+ * Returns warnings for any scores below the threshold.
49
+ */
50
+ export declare function checkReputationGates(member: ProjectMember, dimensions: Record<string, ReputationDimension> | undefined, domainCompetence: Record<string, ReputationDimension> | undefined, now?: Date): {
51
+ passed: boolean;
52
+ warnings: string[];
53
+ };
54
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,mBAAmB,EACpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAK3D;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,GACX,MAAM,CAER;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB,MAAM,CAER;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,MAAM,CAER;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC,CAG5C;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,CAAC,kBAAkB,CAAC,EAAE,CAAC,CA0B9C;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,CAGzC;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC,EAAE,CAAC,CA0B3C;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,CAOxD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,GAAG,SAAS,EAC3D,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,GAAG,SAAS,EACjE,GAAG,GAAE,IAAiB,GACrB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CA2CzC"}
@@ -0,0 +1,153 @@
1
+ import { readdir, mkdir } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { PROJECTS_DIR } from "@agent-workspace/core";
4
+ import { parseWorkspaceFile } from "./frontmatter.js";
5
+ import { computeDecayedScore } from "./reputation.js";
6
+ const SLUG_PATTERN = /^[a-z0-9][a-z0-9-]*$/;
7
+ /**
8
+ * Validate a slug
9
+ */
10
+ export function validateSlug(slug) {
11
+ return SLUG_PATTERN.test(slug);
12
+ }
13
+ /**
14
+ * Get the file path for a project slug
15
+ */
16
+ export function slugToProjectPath(workspaceRoot, slug) {
17
+ return join(workspaceRoot, PROJECTS_DIR, `${slug}.md`);
18
+ }
19
+ /**
20
+ * Get the tasks directory for a project slug
21
+ */
22
+ export function slugToTaskDir(workspaceRoot, projectSlug) {
23
+ return join(workspaceRoot, PROJECTS_DIR, projectSlug, "tasks");
24
+ }
25
+ /**
26
+ * Get the file path for a task within a project
27
+ */
28
+ export function slugToTaskPath(workspaceRoot, projectSlug, taskSlug) {
29
+ return join(workspaceRoot, PROJECTS_DIR, projectSlug, "tasks", `${taskSlug}.md`);
30
+ }
31
+ /**
32
+ * Load a project by slug
33
+ */
34
+ export async function loadProject(workspaceRoot, slug) {
35
+ const filePath = slugToProjectPath(workspaceRoot, slug);
36
+ return parseWorkspaceFile(filePath);
37
+ }
38
+ /**
39
+ * List all projects in the workspace
40
+ */
41
+ export async function listProjects(workspaceRoot) {
42
+ const projDir = join(workspaceRoot, PROJECTS_DIR);
43
+ let entries;
44
+ try {
45
+ entries = await readdir(projDir);
46
+ }
47
+ catch {
48
+ return [];
49
+ }
50
+ const mdFiles = entries.filter((f) => f.endsWith(".md")).sort();
51
+ const projects = [];
52
+ for (const f of mdFiles) {
53
+ try {
54
+ const parsed = await parseWorkspaceFile(join(projDir, f));
55
+ if (parsed.frontmatter.type === "project") {
56
+ projects.push(parsed);
57
+ }
58
+ }
59
+ catch {
60
+ // Skip unparseable files
61
+ }
62
+ }
63
+ return projects;
64
+ }
65
+ /**
66
+ * Load a task by project slug and task slug
67
+ */
68
+ export async function loadTask(workspaceRoot, projectSlug, taskSlug) {
69
+ const filePath = slugToTaskPath(workspaceRoot, projectSlug, taskSlug);
70
+ return parseWorkspaceFile(filePath);
71
+ }
72
+ /**
73
+ * List all tasks for a project
74
+ */
75
+ export async function listTasks(workspaceRoot, projectSlug) {
76
+ const taskDir = slugToTaskDir(workspaceRoot, projectSlug);
77
+ let entries;
78
+ try {
79
+ entries = await readdir(taskDir);
80
+ }
81
+ catch {
82
+ return [];
83
+ }
84
+ const mdFiles = entries.filter((f) => f.endsWith(".md")).sort();
85
+ const tasks = [];
86
+ for (const f of mdFiles) {
87
+ try {
88
+ const parsed = await parseWorkspaceFile(join(taskDir, f));
89
+ if (parsed.frontmatter.type === "task") {
90
+ tasks.push(parsed);
91
+ }
92
+ }
93
+ catch {
94
+ // Skip unparseable files
95
+ }
96
+ }
97
+ return tasks;
98
+ }
99
+ /**
100
+ * Ensure the tasks directory exists for a project
101
+ */
102
+ export async function ensureTaskDir(workspaceRoot, projectSlug) {
103
+ const taskDir = slugToTaskDir(workspaceRoot, projectSlug);
104
+ await mkdir(taskDir, { recursive: true });
105
+ }
106
+ /**
107
+ * Recalculate taskCount and completedCount for a project from its tasks.
108
+ */
109
+ export async function computeProjectCounts(workspaceRoot, projectSlug) {
110
+ const tasks = await listTasks(workspaceRoot, projectSlug);
111
+ const taskCount = tasks.length;
112
+ const completedCount = tasks.filter((t) => t.frontmatter.status === "completed").length;
113
+ return { taskCount, completedCount };
114
+ }
115
+ /**
116
+ * Check reputation gates for a project member.
117
+ * Returns warnings for any scores below the threshold.
118
+ */
119
+ export function checkReputationGates(member, dimensions, domainCompetence, now = new Date()) {
120
+ const warnings = [];
121
+ if (!member.minReputation) {
122
+ return { passed: true, warnings };
123
+ }
124
+ for (const [gate, minScore] of Object.entries(member.minReputation)) {
125
+ // Handle domain-competence gates (e.g., "domain-competence:ai-research")
126
+ if (gate.startsWith("domain-competence:")) {
127
+ const domain = gate.slice("domain-competence:".length);
128
+ const dim = domainCompetence?.[domain];
129
+ if (!dim) {
130
+ warnings.push(`No domain data for "${domain}" (required: ${minScore})`);
131
+ continue;
132
+ }
133
+ const decayed = computeDecayedScore(dim, now);
134
+ if (decayed < minScore) {
135
+ warnings.push(`${domain} domain score ${decayed.toFixed(2)} < required ${minScore}`);
136
+ }
137
+ }
138
+ else {
139
+ // Standard dimension gate
140
+ const dim = dimensions?.[gate];
141
+ if (!dim) {
142
+ warnings.push(`No data for dimension "${gate}" (required: ${minScore})`);
143
+ continue;
144
+ }
145
+ const decayed = computeDecayedScore(dim, now);
146
+ if (decayed < minScore) {
147
+ warnings.push(`${gate} score ${decayed.toFixed(2)} < required ${minScore}`);
148
+ }
149
+ }
150
+ }
151
+ return { passed: warnings.length === 0, warnings };
152
+ }
153
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { ReputationProfileFrontmatter } from "@agent-workspace/core";
2
+ import type { WorkspaceFile } from "@agent-workspace/core";
3
+ import { computeConfidence, computeDecayedScore, updateDimension, validateSlug } from "@agent-workspace/utils";
4
+ export { computeConfidence, computeDecayedScore, updateDimension, validateSlug };
5
+ export declare const DEFAULT_ALPHA = 0.15;
6
+ export declare const DEFAULT_DECAY_RATE = 0.02;
7
+ export declare const SCORE_FLOOR = 0.5;
8
+ /**
9
+ * Get the file path for a reputation profile slug
10
+ */
11
+ export declare function slugToProfilePath(workspaceRoot: string, slug: string): string;
12
+ /**
13
+ * Load a reputation profile by slug
14
+ */
15
+ export declare function loadProfile(workspaceRoot: string, slug: string): Promise<WorkspaceFile<ReputationProfileFrontmatter>>;
16
+ /**
17
+ * List all reputation profiles in the workspace
18
+ */
19
+ export declare function listProfiles(workspaceRoot: string): Promise<WorkspaceFile<ReputationProfileFrontmatter>[]>;
20
+ //# sourceMappingURL=reputation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reputation.d.ts","sourceRoot":"","sources":["../../src/lib/reputation.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,YAAY,EAEb,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,eAAe,EAAE,YAAY,EAAE,CAAC;AAGjF,eAAO,MAAM,aAAa,OAAwB,CAAC;AACnD,eAAO,MAAM,kBAAkB,OAAwB,CAAC;AACxD,eAAO,MAAM,WAAW,MAAsB,CAAC;AAE/C;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,aAAa,CAAC,4BAA4B,CAAC,CAAC,CAGtD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAwBxD"}
@@ -0,0 +1,51 @@
1
+ import { readdir } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { REPUTATION_DIR, REPUTATION_EWMA_ALPHA, REPUTATION_DECAY_RATE, REPUTATION_BASELINE, } from "@agent-workspace/core";
4
+ import { computeConfidence, computeDecayedScore, updateDimension, validateSlug, parseWorkspaceFile, } from "@agent-workspace/utils";
5
+ // Re-export from @agent-workspace/utils for backwards compatibility
6
+ export { computeConfidence, computeDecayedScore, updateDimension, validateSlug };
7
+ // Re-export constants for backwards compatibility
8
+ export const DEFAULT_ALPHA = REPUTATION_EWMA_ALPHA;
9
+ export const DEFAULT_DECAY_RATE = REPUTATION_DECAY_RATE;
10
+ export const SCORE_FLOOR = REPUTATION_BASELINE;
11
+ /**
12
+ * Get the file path for a reputation profile slug
13
+ */
14
+ export function slugToProfilePath(workspaceRoot, slug) {
15
+ return join(workspaceRoot, REPUTATION_DIR, `${slug}.md`);
16
+ }
17
+ /**
18
+ * Load a reputation profile by slug
19
+ */
20
+ export async function loadProfile(workspaceRoot, slug) {
21
+ const filePath = slugToProfilePath(workspaceRoot, slug);
22
+ return parseWorkspaceFile(filePath);
23
+ }
24
+ /**
25
+ * List all reputation profiles in the workspace
26
+ */
27
+ export async function listProfiles(workspaceRoot) {
28
+ const repDir = join(workspaceRoot, REPUTATION_DIR);
29
+ let files;
30
+ try {
31
+ files = await readdir(repDir);
32
+ }
33
+ catch {
34
+ return [];
35
+ }
36
+ const mdFiles = files.filter((f) => f.endsWith(".md")).sort();
37
+ const profiles = [];
38
+ for (const f of mdFiles) {
39
+ try {
40
+ const parsed = await parseWorkspaceFile(join(repDir, f));
41
+ if (parsed.frontmatter.type === "reputation-profile") {
42
+ profiles.push(parsed);
43
+ }
44
+ }
45
+ catch {
46
+ // Skip unparseable files
47
+ }
48
+ }
49
+ return profiles;
50
+ }
51
+ //# sourceMappingURL=reputation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reputation.js","sourceRoot":"","sources":["../../src/lib/reputation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,YAAY,EACZ,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;AAEhC,oEAAoE;AACpE,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,eAAe,EAAE,YAAY,EAAE,CAAC;AAEjF,kDAAkD;AAClD,MAAM,CAAC,MAAM,aAAa,GAAG,qBAAqB,CAAC;AACnD,MAAM,CAAC,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;AACxD,MAAM,CAAC,MAAM,WAAW,GAAG,mBAAmB,CAAC;AAE/C;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,aAAqB,EAAE,IAAY;IACnE,OAAO,IAAI,CAAC,aAAa,EAAE,cAAc,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,aAAqB,EACrB,IAAY;IAEZ,MAAM,QAAQ,GAAG,iBAAiB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IACxD,OAAO,kBAAkB,CAA+B,QAAQ,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,aAAqB;IAErB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IACnD,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9D,MAAM,QAAQ,GAAkD,EAAE,CAAC;IAEnE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAA+B,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;YACvF,IAAI,MAAM,CAAC,WAAW,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;gBACrD,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=reputation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reputation.test.d.ts","sourceRoot":"","sources":["../../src/lib/reputation.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,112 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { validateSlug, slugToProfilePath, computeDecayedScore, updateDimension, computeConfidence, DEFAULT_ALPHA, DEFAULT_DECAY_RATE, SCORE_FLOOR, } from "./reputation.js";
3
+ describe("reputation utilities", () => {
4
+ describe("validateSlug", () => {
5
+ it("accepts valid lowercase alphanumeric slugs", () => {
6
+ expect(validateSlug("agent-name")).toBe(true);
7
+ expect(validateSlug("agent123")).toBe(true);
8
+ expect(validateSlug("a")).toBe(true);
9
+ });
10
+ it("rejects invalid slugs", () => {
11
+ expect(validateSlug("")).toBe(false);
12
+ expect(validateSlug("Agent-Name")).toBe(false);
13
+ expect(validateSlug("-starts-hyphen")).toBe(false);
14
+ });
15
+ });
16
+ describe("slugToProfilePath", () => {
17
+ it("generates correct file path", () => {
18
+ expect(slugToProfilePath("/workspace", "agent-name")).toBe("/workspace/reputation/agent-name.md");
19
+ });
20
+ });
21
+ describe("computeConfidence", () => {
22
+ it("returns 0 for zero samples", () => {
23
+ expect(computeConfidence(0)).toBe(0);
24
+ });
25
+ it("increases with sample size", () => {
26
+ const c1 = computeConfidence(1);
27
+ const c5 = computeConfidence(5);
28
+ const c10 = computeConfidence(10);
29
+ expect(c1).toBeGreaterThan(0);
30
+ expect(c5).toBeGreaterThan(c1);
31
+ expect(c10).toBeGreaterThan(c5);
32
+ });
33
+ it("asymptotes toward 1", () => {
34
+ const c100 = computeConfidence(100);
35
+ expect(c100).toBeLessThanOrEqual(1);
36
+ expect(c100).toBeGreaterThan(0.9);
37
+ });
38
+ });
39
+ describe("computeDecayedScore", () => {
40
+ const baseDate = new Date("2024-01-15T12:00:00Z");
41
+ it("returns original score if no time has passed", () => {
42
+ const dim = {
43
+ score: 0.8,
44
+ confidence: 0.5,
45
+ sampleSize: 5,
46
+ lastSignal: baseDate.toISOString(),
47
+ };
48
+ const decayed = computeDecayedScore(dim, baseDate);
49
+ expect(decayed).toBe(0.8);
50
+ });
51
+ it("decays score toward 0.5 over time", () => {
52
+ const dim = {
53
+ score: 0.9,
54
+ confidence: 0.5,
55
+ sampleSize: 5,
56
+ lastSignal: baseDate.toISOString(),
57
+ };
58
+ // 6 months later
59
+ const futureDate = new Date("2024-07-15T12:00:00Z");
60
+ const decayed = computeDecayedScore(dim, futureDate);
61
+ expect(decayed).toBeLessThan(0.9);
62
+ expect(decayed).toBeGreaterThan(0.5);
63
+ });
64
+ it("decays low scores up toward 0.5", () => {
65
+ const dim = {
66
+ score: 0.2,
67
+ confidence: 0.5,
68
+ sampleSize: 5,
69
+ lastSignal: baseDate.toISOString(),
70
+ };
71
+ // 6 months later
72
+ const futureDate = new Date("2024-07-15T12:00:00Z");
73
+ const decayed = computeDecayedScore(dim, futureDate);
74
+ expect(decayed).toBeGreaterThan(0.2);
75
+ expect(decayed).toBeLessThan(0.5);
76
+ });
77
+ });
78
+ describe("updateDimension", () => {
79
+ it("creates new dimension for first signal", () => {
80
+ const now = new Date("2024-01-15T12:00:00Z");
81
+ const dim = updateDimension(undefined, 0.8, now);
82
+ expect(dim.score).toBe(0.8);
83
+ expect(dim.sampleSize).toBe(1);
84
+ expect(dim.lastSignal).toBe(now.toISOString());
85
+ expect(dim.confidence).toBeGreaterThan(0);
86
+ });
87
+ it("updates existing dimension with EWMA", () => {
88
+ const oldDate = new Date("2024-01-15T12:00:00Z");
89
+ const existing = {
90
+ score: 0.5,
91
+ confidence: 0.09,
92
+ sampleSize: 1,
93
+ lastSignal: oldDate.toISOString(),
94
+ };
95
+ const newDate = new Date("2024-01-16T12:00:00Z");
96
+ const updated = updateDimension(existing, 1.0, newDate);
97
+ // EWMA with alpha=0.15: 0.15 * 1.0 + 0.85 * ~0.5
98
+ expect(updated.score).toBeGreaterThan(0.5);
99
+ expect(updated.score).toBeLessThan(1.0);
100
+ expect(updated.sampleSize).toBe(2);
101
+ expect(updated.confidence).toBeGreaterThan(existing.confidence);
102
+ });
103
+ });
104
+ describe("constants", () => {
105
+ it("has expected default values", () => {
106
+ expect(DEFAULT_ALPHA).toBe(0.15);
107
+ expect(DEFAULT_DECAY_RATE).toBe(0.02);
108
+ expect(SCORE_FLOOR).toBe(0.5);
109
+ });
110
+ });
111
+ });
112
+ //# sourceMappingURL=reputation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reputation.test.js","sourceRoot":"","sources":["../../src/lib/reputation.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/lib/schema.ts"],"names":[],"mappings":"AAwCA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CA0B3B;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CAqB3B"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/lib/schema.ts"],"names":[],"mappings":"AAgEA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CA0B3B;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqB/F"}
@@ -1,17 +1,21 @@
1
1
  import { readFile } from "node:fs/promises";
2
2
  import { SCHEMA_MAP, getSchemaPath } from "@agent-workspace/core";
3
- // Dynamic import to handle CJS/ESM interop
4
3
  let ajvInstance = null;
5
4
  const schemaCache = new Map();
6
5
  async function getAjv() {
7
6
  if (!ajvInstance) {
8
7
  const AjvModule = await import("ajv");
9
8
  const AjvFormatsModule = await import("ajv-formats");
10
- const Ajv = AjvModule.default?.default ?? AjvModule.default ?? AjvModule;
9
+ // Handle ESM/CJS interop
10
+ const AjvClass = AjvModule.default?.default ??
11
+ AjvModule.default ??
12
+ AjvModule;
11
13
  const addFormats = AjvFormatsModule.default?.default ??
12
14
  AjvFormatsModule.default ??
13
15
  AjvFormatsModule;
14
- ajvInstance = new Ajv({ allErrors: true, strict: false });
16
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
+ ajvInstance = new AjvClass({ allErrors: true, strict: false });
18
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
19
  addFormats(ajvInstance);
16
20
  }
17
21
  return ajvInstance;
@@ -48,7 +52,7 @@ export async function validateFrontmatter(type, data) {
48
52
  if (valid) {
49
53
  return { valid: true, errors: [] };
50
54
  }
51
- const errors = (validate.errors || []).map((e) => `${e.instancePath || "/"}: ${e.message}`);
55
+ const errors = (validate.errors ?? []).map((e) => `${e.instancePath || "/"}: ${e.message}`);
52
56
  return { valid: false, errors };
53
57
  }
54
58
  catch (err) {
@@ -70,7 +74,7 @@ export async function validateManifest(data) {
70
74
  if (valid) {
71
75
  return { valid: true, errors: [] };
72
76
  }
73
- const errors = (validate.errors || []).map((e) => `${e.instancePath || "/"}: ${e.message}`);
77
+ const errors = (validate.errors ?? []).map((e) => `${e.instancePath || "/"}: ${e.message}`);
74
78
  return { valid: false, errors };
75
79
  }
76
80
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/lib/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/lib/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { SwarmFrontmatter, WorkspaceFile } from "@agent-workspace/core";
2
+ /**
3
+ * Validate a swarm slug
4
+ */
5
+ export declare function validateSlug(slug: string): boolean;
6
+ /**
7
+ * Get the file path for a swarm slug
8
+ */
9
+ export declare function slugToSwarmPath(workspaceRoot: string, slug: string): string;
10
+ /**
11
+ * Load a swarm by slug
12
+ */
13
+ export declare function loadSwarm(workspaceRoot: string, slug: string): Promise<WorkspaceFile<SwarmFrontmatter>>;
14
+ /**
15
+ * List all swarms in the workspace
16
+ */
17
+ export declare function listSwarms(workspaceRoot: string): Promise<WorkspaceFile<SwarmFrontmatter>[]>;
18
+ /**
19
+ * Ensure the swarms directory exists
20
+ */
21
+ export declare function ensureSwarmsDir(workspaceRoot: string): Promise<void>;
22
+ //# sourceMappingURL=swarm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swarm.d.ts","sourceRoot":"","sources":["../../src/lib/swarm.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAK7E;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAG1C;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAwB5C;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1E"}
@@ -0,0 +1,59 @@
1
+ import { readdir, mkdir } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { SWARMS_DIR } from "@agent-workspace/core";
4
+ import { parseWorkspaceFile } from "./frontmatter.js";
5
+ const SLUG_PATTERN = /^[a-z0-9][a-z0-9-]*$/;
6
+ /**
7
+ * Validate a swarm slug
8
+ */
9
+ export function validateSlug(slug) {
10
+ return SLUG_PATTERN.test(slug);
11
+ }
12
+ /**
13
+ * Get the file path for a swarm slug
14
+ */
15
+ export function slugToSwarmPath(workspaceRoot, slug) {
16
+ return join(workspaceRoot, SWARMS_DIR, `${slug}.md`);
17
+ }
18
+ /**
19
+ * Load a swarm by slug
20
+ */
21
+ export async function loadSwarm(workspaceRoot, slug) {
22
+ const filePath = slugToSwarmPath(workspaceRoot, slug);
23
+ return parseWorkspaceFile(filePath);
24
+ }
25
+ /**
26
+ * List all swarms in the workspace
27
+ */
28
+ export async function listSwarms(workspaceRoot) {
29
+ const swarmsDir = join(workspaceRoot, SWARMS_DIR);
30
+ let entries;
31
+ try {
32
+ entries = await readdir(swarmsDir);
33
+ }
34
+ catch {
35
+ return [];
36
+ }
37
+ const mdFiles = entries.filter((f) => f.endsWith(".md")).sort();
38
+ const swarms = [];
39
+ for (const f of mdFiles) {
40
+ try {
41
+ const parsed = await parseWorkspaceFile(join(swarmsDir, f));
42
+ if (parsed.frontmatter.type === "swarm") {
43
+ swarms.push(parsed);
44
+ }
45
+ }
46
+ catch {
47
+ // Skip unparseable files
48
+ }
49
+ }
50
+ return swarms;
51
+ }
52
+ /**
53
+ * Ensure the swarms directory exists
54
+ */
55
+ export async function ensureSwarmsDir(workspaceRoot) {
56
+ const swarmsDir = join(workspaceRoot, SWARMS_DIR);
57
+ await mkdir(swarmsDir, { recursive: true });
58
+ }
59
+ //# sourceMappingURL=swarm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swarm.js","sourceRoot":"","sources":["../../src/lib/swarm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,YAAY,GAAG,sBAAsB,CAAC;AAE5C;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,aAAqB,EAAE,IAAY;IACjE,OAAO,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,aAAqB,EACrB,IAAY;IAEZ,MAAM,QAAQ,GAAG,eAAe,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IACtD,OAAO,kBAAkB,CAAmB,QAAQ,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,aAAqB;IAErB,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IAClD,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAChE,MAAM,MAAM,GAAsC,EAAE,CAAC;IAErD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAmB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9E,IAAI,MAAM,CAAC,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,aAAqB;IACzD,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IAClD,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9C,CAAC"}
@@ -1,4 +1,6 @@
1
1
  import { type WorkspaceManifest } from "@agent-workspace/core";
2
+ import { findWorkspaceRoot, loadManifest, fileExists } from "@agent-workspace/utils";
3
+ export { findWorkspaceRoot, loadManifest, fileExists };
2
4
  export interface WorkspaceInfo {
3
5
  root: string;
4
6
  manifest: WorkspaceManifest;
@@ -14,14 +16,6 @@ export interface WorkspaceInfo {
14
16
  }[];
15
17
  };
16
18
  }
17
- /**
18
- * Find workspace root by walking up from cwd looking for .awp/workspace.json
19
- */
20
- export declare function findWorkspaceRoot(startDir?: string): Promise<string | null>;
21
- /**
22
- * Load workspace manifest
23
- */
24
- export declare function loadManifest(workspaceRoot: string): Promise<WorkspaceManifest>;
25
19
  /**
26
20
  * Gather full workspace info for inspection/validation
27
21
  */
@@ -33,5 +27,5 @@ export declare function generateWorkspaceId(): string;
33
27
  /**
34
28
  * Create default workspace manifest
35
29
  */
36
- export declare function createDefaultManifest(name: string, agentName: string): WorkspaceManifest;
30
+ export declare function createDefaultManifest(name: string, _agentName?: string): WorkspaceManifest;
37
31
  //# sourceMappingURL=workspace.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/lib/workspace.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAG/B,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,KAAK,EAAE;QACL,QAAQ,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,OAAO,CAAC;YAAC,KAAK,EAAE,OAAO,CAAA;SAAE,EAAE,CAAC;QAC9D,QAAQ,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,OAAO,CAAA;SAAE,EAAE,CAAC;KAC/C,CAAC;CACH;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAcxB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAI5B;AAcD;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,CAAC,CA8BxB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAK5C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,iBAAiB,CAenB"}
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/lib/workspace.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAIrF,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;AAEvD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,KAAK,EAAE;QACL,QAAQ,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,OAAO,CAAC;YAAC,KAAK,EAAE,OAAO,CAAA;SAAE,EAAE,CAAC;QAC9D,QAAQ,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,OAAO,CAAA;SAAE,EAAE,CAAC;KAC/C,CAAC;CACH;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA8BpF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAK5C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAe1F"}