huly-mcp-selfhost 3.3.0 → 3.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 (217) hide show
  1. package/.env.example +11 -0
  2. package/CHANGELOG.md +22 -0
  3. package/README.md +126 -17
  4. package/dist/guides/costs.md +2 -1
  5. package/dist/guides/workflow.md +3 -1
  6. package/dist/index.js +105034 -46
  7. package/dist/setup.js +4 -0
  8. package/package.json +12 -11
  9. package/dist/connection.d.ts +0 -78
  10. package/dist/connection.js +0 -271
  11. package/dist/connection.js.map +0 -1
  12. package/dist/env.d.ts +0 -1
  13. package/dist/env.js +0 -17
  14. package/dist/env.js.map +0 -1
  15. package/dist/guard.d.ts +0 -39
  16. package/dist/guard.js +0 -165
  17. package/dist/guard.js.map +0 -1
  18. package/dist/index.d.ts +0 -2
  19. package/dist/index.js.map +0 -1
  20. package/dist/junit-cli.d.ts +0 -8
  21. package/dist/junit-cli.js +0 -106
  22. package/dist/junit-cli.js.map +0 -1
  23. package/dist/registry.d.ts +0 -18
  24. package/dist/registry.js +0 -318
  25. package/dist/registry.js.map +0 -1
  26. package/dist/resources.d.ts +0 -19
  27. package/dist/resources.js +0 -255
  28. package/dist/resources.js.map +0 -1
  29. package/dist/schemas.d.ts +0 -1559
  30. package/dist/schemas.js +0 -1086
  31. package/dist/schemas.js.map +0 -1
  32. package/dist/server.d.ts +0 -29
  33. package/dist/server.js +0 -215
  34. package/dist/server.js.map +0 -1
  35. package/dist/tools/activity.d.ts +0 -10
  36. package/dist/tools/activity.js +0 -62
  37. package/dist/tools/activity.js.map +0 -1
  38. package/dist/tools/agent.d.ts +0 -156
  39. package/dist/tools/agent.js +0 -523
  40. package/dist/tools/agent.js.map +0 -1
  41. package/dist/tools/attachments.d.ts +0 -31
  42. package/dist/tools/attachments.js +0 -61
  43. package/dist/tools/attachments.js.map +0 -1
  44. package/dist/tools/calendar.d.ts +0 -49
  45. package/dist/tools/calendar.js +0 -116
  46. package/dist/tools/calendar.js.map +0 -1
  47. package/dist/tools/cards.d.ts +0 -87
  48. package/dist/tools/cards.js +0 -246
  49. package/dist/tools/cards.js.map +0 -1
  50. package/dist/tools/channels.d.ts +0 -118
  51. package/dist/tools/channels.js +0 -211
  52. package/dist/tools/channels.js.map +0 -1
  53. package/dist/tools/comments.d.ts +0 -42
  54. package/dist/tools/comments.js +0 -77
  55. package/dist/tools/comments.js.map +0 -1
  56. package/dist/tools/components.d.ts +0 -45
  57. package/dist/tools/components.js +0 -107
  58. package/dist/tools/components.js.map +0 -1
  59. package/dist/tools/contacts.d.ts +0 -69
  60. package/dist/tools/contacts.js +0 -130
  61. package/dist/tools/contacts.js.map +0 -1
  62. package/dist/tools/crm.d.ts +0 -61
  63. package/dist/tools/crm.js +0 -117
  64. package/dist/tools/crm.js.map +0 -1
  65. package/dist/tools/documents.d.ts +0 -100
  66. package/dist/tools/documents.js +0 -294
  67. package/dist/tools/documents.js.map +0 -1
  68. package/dist/tools/drive.d.ts +0 -107
  69. package/dist/tools/drive.js +0 -277
  70. package/dist/tools/drive.js.map +0 -1
  71. package/dist/tools/fields.d.ts +0 -33
  72. package/dist/tools/fields.js +0 -124
  73. package/dist/tools/fields.js.map +0 -1
  74. package/dist/tools/generic.d.ts +0 -72
  75. package/dist/tools/generic.js +0 -242
  76. package/dist/tools/generic.js.map +0 -1
  77. package/dist/tools/github.d.ts +0 -21
  78. package/dist/tools/github.js +0 -80
  79. package/dist/tools/github.js.map +0 -1
  80. package/dist/tools/hr.d.ts +0 -97
  81. package/dist/tools/hr.js +0 -150
  82. package/dist/tools/hr.js.map +0 -1
  83. package/dist/tools/inbox.d.ts +0 -23
  84. package/dist/tools/inbox.js +0 -76
  85. package/dist/tools/inbox.js.map +0 -1
  86. package/dist/tools/inventory.d.ts +0 -61
  87. package/dist/tools/inventory.js +0 -103
  88. package/dist/tools/inventory.js.map +0 -1
  89. package/dist/tools/issues.d.ts +0 -112
  90. package/dist/tools/issues.js +0 -474
  91. package/dist/tools/issues.js.map +0 -1
  92. package/dist/tools/labels.d.ts +0 -87
  93. package/dist/tools/labels.js +0 -232
  94. package/dist/tools/labels.js.map +0 -1
  95. package/dist/tools/log-time.d.ts +0 -25
  96. package/dist/tools/log-time.js +0 -95
  97. package/dist/tools/log-time.js.map +0 -1
  98. package/dist/tools/meetings.d.ts +0 -30
  99. package/dist/tools/meetings.js +0 -78
  100. package/dist/tools/meetings.js.map +0 -1
  101. package/dist/tools/members.d.ts +0 -8
  102. package/dist/tools/members.js +0 -33
  103. package/dist/tools/members.js.map +0 -1
  104. package/dist/tools/message-templates.d.ts +0 -54
  105. package/dist/tools/message-templates.js +0 -88
  106. package/dist/tools/message-templates.js.map +0 -1
  107. package/dist/tools/milestones.d.ts +0 -56
  108. package/dist/tools/milestones.js +0 -172
  109. package/dist/tools/milestones.js.map +0 -1
  110. package/dist/tools/organizations.d.ts +0 -37
  111. package/dist/tools/organizations.js +0 -88
  112. package/dist/tools/organizations.js.map +0 -1
  113. package/dist/tools/overview.d.ts +0 -55
  114. package/dist/tools/overview.js +0 -395
  115. package/dist/tools/overview.js.map +0 -1
  116. package/dist/tools/planner.d.ts +0 -60
  117. package/dist/tools/planner.js +0 -145
  118. package/dist/tools/planner.js.map +0 -1
  119. package/dist/tools/process.d.ts +0 -50
  120. package/dist/tools/process.js +0 -137
  121. package/dist/tools/process.js.map +0 -1
  122. package/dist/tools/products.d.ts +0 -17
  123. package/dist/tools/products.js +0 -45
  124. package/dist/tools/products.js.map +0 -1
  125. package/dist/tools/projects.d.ts +0 -41
  126. package/dist/tools/projects.js +0 -93
  127. package/dist/tools/projects.js.map +0 -1
  128. package/dist/tools/qms.d.ts +0 -57
  129. package/dist/tools/qms.js +0 -171
  130. package/dist/tools/qms.js.map +0 -1
  131. package/dist/tools/recruiting.d.ts +0 -112
  132. package/dist/tools/recruiting.js +0 -203
  133. package/dist/tools/recruiting.js.map +0 -1
  134. package/dist/tools/relations.d.ts +0 -72
  135. package/dist/tools/relations.js +0 -192
  136. package/dist/tools/relations.js.map +0 -1
  137. package/dist/tools/search.d.ts +0 -23
  138. package/dist/tools/search.js +0 -60
  139. package/dist/tools/search.js.map +0 -1
  140. package/dist/tools/sharing.d.ts +0 -62
  141. package/dist/tools/sharing.js +0 -149
  142. package/dist/tools/sharing.js.map +0 -1
  143. package/dist/tools/statuses.d.ts +0 -19
  144. package/dist/tools/statuses.js +0 -93
  145. package/dist/tools/statuses.js.map +0 -1
  146. package/dist/tools/surveys.d.ts +0 -22
  147. package/dist/tools/surveys.js +0 -53
  148. package/dist/tools/surveys.js.map +0 -1
  149. package/dist/tools/templates.d.ts +0 -95
  150. package/dist/tools/templates.js +0 -260
  151. package/dist/tools/templates.js.map +0 -1
  152. package/dist/tools/test-automation.d.ts +0 -81
  153. package/dist/tools/test-automation.js +0 -225
  154. package/dist/tools/test-automation.js.map +0 -1
  155. package/dist/tools/testing.d.ts +0 -234
  156. package/dist/tools/testing.js +0 -401
  157. package/dist/tools/testing.js.map +0 -1
  158. package/dist/tools/workspace-admin.d.ts +0 -55
  159. package/dist/tools/workspace-admin.js +0 -117
  160. package/dist/tools/workspace-admin.js.map +0 -1
  161. package/dist/tools/workspaces.d.ts +0 -6
  162. package/dist/tools/workspaces.js +0 -19
  163. package/dist/tools/workspaces.js.map +0 -1
  164. package/dist/utils/attributes.d.ts +0 -37
  165. package/dist/utils/attributes.js +0 -188
  166. package/dist/utils/attributes.js.map +0 -1
  167. package/dist/utils/classes.d.ts +0 -51
  168. package/dist/utils/classes.js +0 -73
  169. package/dist/utils/classes.js.map +0 -1
  170. package/dist/utils/content.d.ts +0 -11
  171. package/dist/utils/content.js +0 -86
  172. package/dist/utils/content.js.map +0 -1
  173. package/dist/utils/errors.d.ts +0 -11
  174. package/dist/utils/errors.js +0 -24
  175. package/dist/utils/errors.js.map +0 -1
  176. package/dist/utils/files.d.ts +0 -5
  177. package/dist/utils/files.js +0 -50
  178. package/dist/utils/files.js.map +0 -1
  179. package/dist/utils/format.d.ts +0 -8
  180. package/dist/utils/format.js +0 -57
  181. package/dist/utils/format.js.map +0 -1
  182. package/dist/utils/junit.d.ts +0 -13
  183. package/dist/utils/junit.js +0 -81
  184. package/dist/utils/junit.js.map +0 -1
  185. package/dist/utils/markdown.d.ts +0 -14
  186. package/dist/utils/markdown.js +0 -149
  187. package/dist/utils/markdown.js.map +0 -1
  188. package/dist/utils/meeting.d.ts +0 -13
  189. package/dist/utils/meeting.js +0 -118
  190. package/dist/utils/meeting.js.map +0 -1
  191. package/dist/utils/people.d.ts +0 -25
  192. package/dist/utils/people.js +0 -80
  193. package/dist/utils/people.js.map +0 -1
  194. package/dist/utils/redact.d.ts +0 -3
  195. package/dist/utils/redact.js +0 -26
  196. package/dist/utils/redact.js.map +0 -1
  197. package/dist/utils/resolve.d.ts +0 -17
  198. package/dist/utils/resolve.js +0 -54
  199. package/dist/utils/resolve.js.map +0 -1
  200. package/dist/utils/spec.d.ts +0 -10
  201. package/dist/utils/spec.js +0 -90
  202. package/dist/utils/spec.js.map +0 -1
  203. package/dist/utils/storage.d.ts +0 -7
  204. package/dist/utils/storage.js +0 -86
  205. package/dist/utils/storage.js.map +0 -1
  206. package/dist/utils/tasks.d.ts +0 -22
  207. package/dist/utils/tasks.js +0 -81
  208. package/dist/utils/tasks.js.map +0 -1
  209. package/dist/watch.d.ts +0 -62
  210. package/dist/watch.js +0 -405
  211. package/dist/watch.js.map +0 -1
  212. package/scripts/cleanup-issues.js +0 -141
  213. package/scripts/copy-guides.js +0 -18
  214. package/scripts/demo.js +0 -201
  215. package/scripts/import-csv.js +0 -250
  216. package/scripts/sample-tasks.csv +0 -11
  217. package/scripts/setup.js +0 -163
package/dist/resources.js DELETED
@@ -1,255 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.GUIDES = void 0;
7
- exports.completeWorkspace = completeWorkspace;
8
- exports.completeProject = completeProject;
9
- exports.completeIssue = completeIssue;
10
- exports.readGuide = readGuide;
11
- exports.registerResources = registerResources;
12
- exports.registerPrompts = registerPrompts;
13
- exports.modifiedOn = modifiedOn;
14
- exports.registerSubscriptions = registerSubscriptions;
15
- // MCP resources (issues/documents addressable as huly:// URIs, e.g. @-mentions in Claude Code)
16
- // and prompts (ready-made workflows, shown as slash commands in Claude Code).
17
- const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
18
- const completable_js_1 = require("@modelcontextprotocol/sdk/server/completable.js");
19
- const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
20
- const zod_1 = require("zod");
21
- const fs_1 = require("fs");
22
- const path_1 = require("path");
23
- const tracker_1 = __importDefault(require("@hcengineering/tracker"));
24
- const task_1 = __importDefault(require("@hcengineering/task"));
25
- const core_1 = require("@hcengineering/core");
26
- const connection_1 = require("./connection");
27
- const people_1 = require("./utils/people");
28
- const agent_1 = require("./tools/agent");
29
- const documents_1 = require("./tools/documents");
30
- const DONE = new Set([task_1.default.statusCategory.Won, task_1.default.statusCategory.Lost]);
31
- /** Open issues assigned to me, newest first — offered as huly:// resources. */
32
- async function myOpenIssues(limit = 30) {
33
- const out = [];
34
- for (const ws of await (0, connection_1.listWorkspaces)()) {
35
- try {
36
- const client = await (0, connection_1.getConnection)(ws.url);
37
- const me = await (0, people_1.currentPerson)(client);
38
- const statuses = await client.findAll(tracker_1.default.class.IssueStatus, {});
39
- const open = statuses.filter((s) => !DONE.has(s.category)).map((s) => s._id);
40
- const issues = await client.findAll(tracker_1.default.class.Issue, { assignee: me._id, status: { $in: open } }, { sort: { modifiedOn: core_1.SortingOrder.Descending }, limit });
41
- for (const i of issues)
42
- out.push({ uri: `huly://${ws.url}/issue/${i.identifier}`, name: `${i.identifier}: ${i.title}`, description: `Open issue in ${ws.name}` });
43
- }
44
- catch { /* a workspace that cannot be read just contributes nothing */ }
45
- }
46
- return out.slice(0, limit);
47
- }
48
- // ── Argument completions (MCP completion/complete) ───────────────────────────
49
- // Clients that support completions suggest workspaces, projects and issue ids while typing.
50
- const MAX = 100;
51
- const starts = (values, prefix) => values.filter((v) => v.toLowerCase().startsWith(prefix.toLowerCase())).slice(0, MAX);
52
- async function completeWorkspace(prefix) {
53
- try {
54
- return starts((await (0, connection_1.listWorkspaces)()).map((w) => w.url), prefix);
55
- }
56
- catch {
57
- return [];
58
- }
59
- }
60
- async function completeProject(prefix, workspace) {
61
- try {
62
- const client = await (0, connection_1.getConnection)(workspace);
63
- const projects = (await client.findAll(tracker_1.default.class.Project, {})).filter((p) => p.archived !== true);
64
- return starts(projects.map((p) => p.identifier).sort(), prefix);
65
- }
66
- catch {
67
- return [];
68
- }
69
- }
70
- async function completeIssue(prefix, workspace) {
71
- try {
72
- const client = await (0, connection_1.getConnection)(workspace);
73
- const m = /^([A-Za-z][A-Za-z0-9]*)(?:-(\d*))?$/.exec(prefix.trim());
74
- if (m == null) {
75
- // No project typed yet: offer my open issues, newest first.
76
- const me = await (0, people_1.currentPerson)(client);
77
- const mine = await client.findAll(tracker_1.default.class.Issue, { assignee: me._id }, { sort: { modifiedOn: core_1.SortingOrder.Descending }, limit: 50 });
78
- return mine.map((i) => i.identifier);
79
- }
80
- if (m[2] == null) {
81
- const projects = await completeProject(m[1], workspace);
82
- return projects.length === 1 ? projects.map((p) => `${p}-`) : projects;
83
- }
84
- const project = await client.findOne(tracker_1.default.class.Project, { identifier: m[1].toUpperCase() });
85
- if (project == null)
86
- return [];
87
- const issues = await client.findAll(tracker_1.default.class.Issue, { space: project._id }, { sort: { modifiedOn: core_1.SortingOrder.Descending }, limit: 500 });
88
- return starts(issues.map((i) => i.identifier), prefix);
89
- }
90
- catch {
91
- return [];
92
- }
93
- }
94
- const ws = (ctx) => ctx?.arguments?.workspace;
95
- const wsArg = () => (0, completable_js_1.completable)(zod_1.z.string(), async (v) => await completeWorkspace(v));
96
- const issueArg = () => (0, completable_js_1.completable)(zod_1.z.string(), async (v, ctx) => await completeIssue(v, ws(ctx)));
97
- const projectArg = () => (0, completable_js_1.completable)(zod_1.z.string(), async (v, ctx) => await completeProject(v, ws(ctx)));
98
- // ── Guides: the plugin skill as plain resources, so every MCP client (not only Claude Code) gets them ──
99
- exports.GUIDES = {
100
- workflow: { file: 'SKILL.md', title: 'Huly workflow for agents', description: 'Repo rules first, pick up/hand back issues, status flow, creating without duplicates' },
101
- costs: { file: 'costs.md', title: 'Cheapest Huly call per question', description: 'Which call answers which question with the least output (measured sizes)' },
102
- onboarding: { file: 'onboarding.md', title: 'Bringing a project into Huly', description: 'Status set, components, milestones, TODO scan, architecture document' },
103
- features: { file: 'features.md', title: 'All of Huly for a software project', description: 'Labels, templates, test management, documents, drive, custom fields, cards — tools and toolsets' }
104
- };
105
- /** Guide text: dist/guides (build output) or, when running from source, the plugin skill itself. */
106
- function readGuide(name) {
107
- const g = exports.GUIDES[name];
108
- if (g == null)
109
- throw new Error(`Unknown guide: ${name}. Available: ${Object.keys(exports.GUIDES).join(', ')}`);
110
- let text;
111
- try {
112
- text = (0, fs_1.readFileSync)((0, path_1.join)(__dirname, 'guides', `${name}.md`), 'utf8');
113
- }
114
- catch {
115
- text = (0, fs_1.readFileSync)((0, path_1.join)(__dirname, '..', 'plugin', 'skills', 'huly', g.file), 'utf8').replace(/\r\n/g, '\n').replace(/^---\n[\s\S]*?\n---\n+/, '');
116
- }
117
- // Links between the skill files become links between the resources.
118
- return text.replace(/\]\((SKILL|costs|onboarding|features)\.md\)/g, (_m, f) => `](huly://guide/${f === 'SKILL' ? 'workflow' : f})`);
119
- }
120
- function registerResources(server) {
121
- for (const [name, g] of Object.entries(exports.GUIDES)) {
122
- server.registerResource(`guide-${name}`, `huly://guide/${name}`, { title: g.title, description: g.description, mimeType: 'text/markdown' }, async (uri) => ({ contents: [{ uri: uri.href, mimeType: 'text/markdown', text: readGuide(name) }] }));
123
- }
124
- server.registerResource('issue', new mcp_js_1.ResourceTemplate('huly://{workspace}/issue/{identifier}', {
125
- list: async () => ({ resources: (await myOpenIssues()).map((r) => ({ ...r, mimeType: 'text/markdown' })) }),
126
- complete: {
127
- workspace: async (v) => await completeWorkspace(v),
128
- identifier: async (v, ctx) => await completeIssue(v, ws(ctx))
129
- }
130
- }), { title: 'Huly issue', description: 'Issue with description, sub-issues, blockers, PRs and comments', mimeType: 'text/markdown' }, async (uri, vars) => ({
131
- contents: [{ uri: uri.href, mimeType: 'text/markdown', text: await (0, agent_1.issueContext)(String(vars.workspace), String(vars.identifier)) }]
132
- }));
133
- server.registerResource('document', new mcp_js_1.ResourceTemplate('huly://{workspace}/document/{id}', { list: undefined, complete: { workspace: async (v) => await completeWorkspace(v) } }), { title: 'Huly document', description: 'Document with its content', mimeType: 'text/markdown' }, async (uri, vars) => {
134
- const result = await (0, documents_1.getDocument)({ workspace: String(vars.workspace), documentId: String(vars.id) });
135
- return { contents: [{ uri: uri.href, mimeType: 'text/markdown', text: result.content[0].text }] };
136
- });
137
- }
138
- const user = (text) => ({ messages: [{ role: 'user', content: { type: 'text', text } }] });
139
- function registerPrompts(server) {
140
- server.registerPrompt('setup', {
141
- title: 'Set up Huly for a project',
142
- description: 'Ask how Huly should be used for a project, write the rules for your project instructions, optionally import it',
143
- argsSchema: { repository: zod_1.z.string().optional(), workspace: zod_1.z.string().optional() }
144
- }, ({ repository, workspace }) => user(`Set up how you use Huly for ${repository != null ? `the repository ${repository}` : 'my current project'}${workspace != null ? ` (workspace ${workspace})` : ''}.\n\n` +
145
- '1. Find the project: ' + (repository != null ? 'call find_project_for_repo with the repository; ' : '') +
146
- 'otherwise list_workspaces and list_projects and suggest the one that fits. Never create a Huly project — if none fits, suggest a short key and ask me to create it.\n' +
147
- '2. Ask me in one message, with numbered options and your recommendation first: (a) role of Huly — leads / overview only / not used; ' +
148
- '(b) where new issues go — code bugs on GitHub and product topics in Huly / everything in Huly / only when I ask; ' +
149
- '(c) initiative — act and keep status current / propose first / only on request; (d) efficiency — normal / token-saving / minimal.\n' +
150
- '3. Write a short "## Huly" rules section from my answers (workspace, project, where issues go, duplicate check, component + milestone on every issue, ' +
151
- 'status flow, initiative, efficiency) and give it to me to paste into my project instructions (CLAUDE.md, AGENTS.md, Cursor rules or the project instructions of this app).\n' +
152
- '4. Ask which imports I want (components, milestones, status set, TODO/FIXME proposals, architecture document) and do them as described in resource huly://guide/onboarding, ' +
153
- 'dry runs first. For efficient calls follow huly://guide/costs. End with what was created and what I still have to do.'));
154
- server.registerPrompt('start', {
155
- title: 'Start working on an issue',
156
- description: 'Pick up an issue, load its context and propose a plan',
157
- argsSchema: { workspace: wsArg(), identifier: issueArg() }
158
- }, ({ workspace, identifier }) => user(`Start work on Huly issue ${identifier} in workspace ${workspace}: call start_work, read the context it returns ` +
159
- '(description, sub-issues, blockers, PRs, comments). If it is blocked by open issues, say so before doing anything. ' +
160
- 'Then propose a short implementation plan and use the suggested branch name.'));
161
- server.registerPrompt('finish', {
162
- title: 'Finish an issue',
163
- description: 'Post a work summary, link the PR and move the issue to review',
164
- argsSchema: { workspace: wsArg(), identifier: issueArg(), pullRequest: zod_1.z.string().optional() }
165
- }, ({ workspace, identifier, pullRequest }) => user(`Finish Huly issue ${identifier} in workspace ${workspace}: summarise what was changed and how it was verified ` +
166
- `(be honest about anything not verified), then call finish_work with that summary${pullRequest != null ? ` and pullRequest "${pullRequest}"` : ''}.`));
167
- server.registerPrompt('plan', {
168
- title: 'Turn a plan into issues',
169
- description: 'Epic + sub-issues from a goal or plan, with duplicate check',
170
- argsSchema: { workspace: wsArg(), projectIdentifier: projectArg(), goal: zod_1.z.string() }
171
- }, ({ workspace, projectIdentifier, goal }) => user(`Break this down into a Huly epic with sub-issues in project ${projectIdentifier} (workspace ${workspace}):\n\n${goal}\n\n` +
172
- 'Look up components and milestones first (list_components, list_milestones) and assign each child the fitting ones. ' +
173
- 'Express ordering with blockedBy. Call create_issue_tree with dryRun=true, show me the plan, and only create it after I confirm.'));
174
- server.registerPrompt('triage', {
175
- title: 'Triage my inbox',
176
- description: 'Go through unread notifications and suggest actions',
177
- argsSchema: { workspace: wsArg() }
178
- }, ({ workspace }) => user(`Triage my Huly inbox in workspace ${workspace}: call triage_inbox once (unread items with what changed), group them by urgency, and for each ` +
179
- 'suggest one action (reply, start work, delegate, mark read). Do not change anything until I pick.'));
180
- server.registerPrompt('standup', {
181
- title: 'Stand-up summary',
182
- description: 'What I did since the last working day, today, blockers',
183
- argsSchema: { workspace: wsArg(), since: zod_1.z.string().optional() }
184
- }, ({ workspace, since }) => user(`Write my stand-up for Huly workspace ${workspace}: call standup once${since != null ? ` with since="${since}"` : ''} — it already covers ` +
185
- 'what I did, what is in progress, blockers and today. Format: Done / In progress / Blocked / Next — short bullet points with issue ids.'));
186
- }
187
- // ── Resource subscriptions (resources/subscribe → notifications/resources/updated) ──
188
- // Huly pushes no per-document events to this client, so subscribed issues/documents are
189
- // polled for a newer modifiedOn. The timer only runs while something is subscribed.
190
- /** modifiedOn of the object behind a huly:// URI, or undefined if it cannot be read. */
191
- async function modifiedOn(uri) {
192
- const m = /^huly:\/\/([^/]+)\/(issue|document)\/(.+)$/.exec(uri);
193
- if (m == null)
194
- return undefined;
195
- try {
196
- const client = await (0, connection_1.getConnection)(decodeURIComponent(m[1]));
197
- const id = decodeURIComponent(m[3]);
198
- const doc = m[2] === 'issue'
199
- ? await client.findOne(tracker_1.default.class.Issue, { identifier: id })
200
- : await client.findOne('document:class:Document', { _id: id });
201
- return doc?.modifiedOn;
202
- }
203
- catch {
204
- return undefined;
205
- }
206
- }
207
- function registerSubscriptions(server, pollMs = Number(process.env.HULY_SUBSCRIBE_POLL_MS ?? 30_000)) {
208
- const subscriptions = new Map();
209
- let timer;
210
- let polling = false;
211
- const poll = async () => {
212
- if (polling)
213
- return;
214
- polling = true;
215
- try {
216
- for (const [uri, last] of subscriptions) {
217
- const now = await modifiedOn(uri);
218
- if (now != null && last != null && now > last) {
219
- subscriptions.set(uri, now);
220
- await server.server.sendResourceUpdated({ uri }).catch(() => { });
221
- }
222
- else if (last == null && now != null) {
223
- subscriptions.set(uri, now);
224
- }
225
- }
226
- }
227
- finally {
228
- polling = false;
229
- }
230
- };
231
- const sync = () => {
232
- if (subscriptions.size > 0 && timer == null) {
233
- timer = setInterval(() => { void poll(); }, Math.max(5_000, pollMs));
234
- timer.unref();
235
- }
236
- else if (subscriptions.size === 0 && timer != null) {
237
- clearInterval(timer);
238
- timer = undefined;
239
- }
240
- };
241
- server.server.registerCapabilities({ resources: { subscribe: true, listChanged: true } });
242
- server.server.setRequestHandler(types_js_1.SubscribeRequestSchema, async (req) => {
243
- subscriptions.set(req.params.uri, await modifiedOn(req.params.uri));
244
- sync();
245
- return {};
246
- });
247
- server.server.setRequestHandler(types_js_1.UnsubscribeRequestSchema, async (req) => {
248
- subscriptions.delete(req.params.uri);
249
- sync();
250
- return {};
251
- });
252
- server.server.onclose = () => { subscriptions.clear(); sync(); };
253
- return { poll, subscriptions };
254
- }
255
- //# sourceMappingURL=resources.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resources.js","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"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"}