@rockhopper-co/mcp-server 2.1.1 → 2.1.29-staging.368e439
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/CHANGELOG.md +18 -0
- package/dist/drive-search.d.ts +21 -1
- package/dist/drive-search.d.ts.map +1 -1
- package/dist/drive-search.js.map +1 -1
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +3 -2
- package/dist/prompts/index.js.map +1 -1
- package/dist/resources/orchestration-guide.md +4 -0
- package/dist/tools/drive-search.contract.d.ts +73 -2
- package/dist/tools/drive-search.contract.d.ts.map +1 -1
- package/dist/tools/drive-search.contract.js +160 -19
- package/dist/tools/drive-search.contract.js.map +1 -1
- package/dist/tools/drive-search.d.ts.map +1 -1
- package/dist/tools/drive-search.js +40 -13
- package/dist/tools/drive-search.js.map +1 -1
- package/dist/tools/get-versions.d.ts.map +1 -1
- package/dist/tools/get-versions.js +6 -1
- package/dist/tools/get-versions.js.map +1 -1
- package/dist/tools/write-versions.d.ts.map +1 -1
- package/dist/tools/write-versions.js +2 -1
- package/dist/tools/write-versions.js.map +1 -1
- package/dist/version-format.d.ts +32 -0
- package/dist/version-format.d.ts.map +1 -0
- package/dist/version-format.js +35 -0
- package/dist/version-format.js.map +1 -0
- package/package.json +3 -5
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,24 @@ All notable changes to this project are documented here. Follows
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and
|
|
5
5
|
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
+
## [Unreleased]
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- **Patch numbers are now assigned by the release pipeline, not by hand.** A
|
|
12
|
+
merge to `main` publishes `<major>.<minor>.<build number>` to the `latest`
|
|
13
|
+
dist-tag; a merge to `staging` publishes the matching
|
|
14
|
+
`<major>.<minor>.<build number>-staging.<commit>` prerelease to the `staging`
|
|
15
|
+
dist-tag. Expect the patch digit to jump — `2.1.0` to `2.1.29`, say — rather
|
|
16
|
+
than increment by one. Major and minor still mean what
|
|
17
|
+
[Semantic Versioning](https://semver.org/spec/v2.0.0.html) says they mean, and
|
|
18
|
+
are still chosen by a person; only the patch digit changed hands.
|
|
19
|
+
|
|
20
|
+
The reason is that a released version used to require someone to remember to
|
|
21
|
+
cut a git tag. On 2026-08-19 `2.1.1` reached the registry while `latest` stayed
|
|
22
|
+
on `2.1.0`, so every `npm install @rockhopper-co/mcp-server` kept receiving the
|
|
23
|
+
older package and nothing reported a problem. A merge now publishes on its own.
|
|
24
|
+
|
|
7
25
|
## [2.0.0] — 2026-08-16
|
|
8
26
|
|
|
9
27
|
Cuts everything that had accumulated under `[Unreleased]` below. Published by
|
package/dist/drive-search.d.ts
CHANGED
|
@@ -50,8 +50,28 @@ export type DriveSearchOutcome =
|
|
|
50
50
|
| 'no_matches'
|
|
51
51
|
/** The user picked one; its identifiers are in the result, ready to enroll. */
|
|
52
52
|
| 'confirmed'
|
|
53
|
-
/**
|
|
53
|
+
/**
|
|
54
|
+
* The user read the candidates and said none of them is the file. An
|
|
55
|
+
* ANSWER, and the reason it is separate from {@link dismissed}: it means the
|
|
56
|
+
* search itself missed, so trying a different word is the right next move.
|
|
57
|
+
*/
|
|
54
58
|
| 'declined'
|
|
59
|
+
/**
|
|
60
|
+
* The prompt closed without the user answering it (ENG-2789).
|
|
61
|
+
*
|
|
62
|
+
* Distinct from `declined` because the two describe opposite states of the
|
|
63
|
+
* user's knowledge, and collapsing them is a measured failure rather than a
|
|
64
|
+
* tidiness point: three consecutive prompts whose candidates were never on
|
|
65
|
+
* screen reported themselves as `declined`, which reads as "the user
|
|
66
|
+
* considered these and rejected them" and sent the model off to search
|
|
67
|
+
* again. Nobody had considered anything.
|
|
68
|
+
*/
|
|
69
|
+
| 'dismissed'
|
|
70
|
+
/**
|
|
71
|
+
* The user pasted the workbook's own address instead of picking a row.
|
|
72
|
+
* The URL is in the result, ready for `enroll_file`.
|
|
73
|
+
*/
|
|
74
|
+
| 'link_supplied'
|
|
55
75
|
/** This session has used its whole search budget. Refused BEFORE the call. */
|
|
56
76
|
| 'search_limit_reached'
|
|
57
77
|
/** No delegated Microsoft grant — the connect link is in the result. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drive-search.d.ts","sourceRoot":"","sources":["../src/drive-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAE9C,kFAAkF;AAClF,MAAM,MAAM,kBAAkB;AAC5B,0EAA0E;AACxE,YAAY;AACd,qDAAqD;GACnD,YAAY;AACd,+EAA+E;GAC7E,WAAW;AACb
|
|
1
|
+
{"version":3,"file":"drive-search.d.ts","sourceRoot":"","sources":["../src/drive-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAE9C,kFAAkF;AAClF,MAAM,MAAM,kBAAkB;AAC5B,0EAA0E;AACxE,YAAY;AACd,qDAAqD;GACnD,YAAY;AACd,+EAA+E;GAC7E,WAAW;AACb;;;;GAIG;GACD,UAAU;AACZ;;;;;;;;;GASG;GACD,WAAW;AACb;;;GAGG;GACD,eAAe;AACjB,8EAA8E;GAC5E,sBAAsB;AACxB,wEAAwE;GACtE,yBAAyB;AAC3B;;;;;;GAMG;GACD,mCAAmC;AACrC,uEAAuE;GACrE,oBAAoB;AACtB,mEAAmE;GACjE,qBAAqB;AACvB,0EAA0E;GACxE,mBAAmB,CAAC;AAExB;;;;;;GAMG;AACH,qBAAa,YAAY;IAGX,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFlC,OAAO,CAAC,IAAI,CAAK;gBAEY,KAAK,GAAE,MAAoC;IAExE,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED;;;;OAIG;IACH,KAAK,IAAI,OAAO;CAKjB;AAED,yEAAyE;AACzE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,eAAe,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAC;CACrD;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,iBAAiB;IAC5B,MAAM,CAAC,QAAQ,CAAC,cAAc,KAAK;IAEnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA2C;IAEhE,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI;IAS/D;;;;;;OAMG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IASvD,6EAA6E;IAC7E,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,SAAS,EAAE,GAAG,IAAI;CAGnD;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,SAAS,CAS5D;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,kBAAkB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,GACb,uBAAuB,CAiCzB;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAI1D;AAcD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAI9D;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,QAQuB,CAAC"}
|
package/dist/drive-search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drive-search.js","sourceRoot":"","sources":["../src/drive-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGrD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"drive-search.js","sourceRoot":"","sources":["../src/drive-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAE9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAE9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAIlD,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,GAAG,IAAI,CAgOvE"}
|
package/dist/prompts/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { assertChangeHistoryComplete } from '../not-ready.js';
|
|
3
|
+
import { formatVersion } from '../version-format.js';
|
|
3
4
|
export function registerPrompts(server, api) {
|
|
4
5
|
server.registerPrompt('summarize-file-changes', {
|
|
5
6
|
title: 'Summarize Recent Changes',
|
|
@@ -22,7 +23,7 @@ export function registerPrompts(server, api) {
|
|
|
22
23
|
]);
|
|
23
24
|
const recentVersions = versions.slice(0, 5);
|
|
24
25
|
const versionSummary = recentVersions
|
|
25
|
-
.map((v) => `-
|
|
26
|
+
.map((v) => `- ${formatVersion(v)}: ${v.description || 'No description'} (${v.createdAt})`)
|
|
26
27
|
.join('\n');
|
|
27
28
|
const changeSummary = changesPage.changes.length
|
|
28
29
|
? changesPage.changes
|
|
@@ -160,7 +161,7 @@ export function registerPrompts(server, api) {
|
|
|
160
161
|
`- Uncommitted changes: ${file.hasUncommittedChanges ? 'Yes' : 'No'}\n\n` +
|
|
161
162
|
`## Versions: ${versions.length} total\n` +
|
|
162
163
|
(latestVersion
|
|
163
|
-
? `Latest:
|
|
164
|
+
? `Latest: ${formatVersion(latestVersion)} (${latestVersion.createdAt})\n`
|
|
164
165
|
: 'No versions yet.\n') +
|
|
165
166
|
`\n## Comments: ${comments.length} total, ${unresolvedComments.length} unresolved\n` +
|
|
166
167
|
`## Reviews: ${reviews.length} total, ${pendingReviews.length} pending\n` +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -50,6 +50,10 @@ The two steps are one flow and the middle one is not optional:
|
|
|
50
50
|
|
|
51
51
|
Only files that came back from the search can be confirmed. A pick that names anything else answers `unknown_candidate` and adds nothing.
|
|
52
52
|
|
|
53
|
+
**`declined` and `dismissed` are not the same answer.** `declined` means the user read the candidates and said none of them is the file — the search missed, so try a different word. `dismissed` means the prompt closed without them answering it: they have told you nothing, so do **not** search again and do not treat it as a rejection. List the candidates in the conversation yourself, ask which one they meant, and say they can paste the workbook's link instead.
|
|
54
|
+
|
|
55
|
+
**`link_supplied`** means the user pasted the workbook's own address rather than picking a row. Call `enroll_file` with that `url` alone — no `driveMsId`, no `msId`.
|
|
56
|
+
|
|
53
57
|
**Searching is capped per session.** A fixed number of searches, after which `search_limit_reached` is the only answer and waiting does not restore it. Search deliberately — two or three well-chosen queries, not a browse. If the cap is reached, ask the user for the workbook link and use `enroll_file` directly.
|
|
54
58
|
|
|
55
59
|
**No Microsoft account connected?** `search_drive_files` answers `microsoft_not_connected` and hands back a sign-in link Rockhopper built. Give the user that link verbatim. Never compose a Microsoft sign-in URL yourself — a link the assistant made up sends the user's consent wherever whoever wrote it wanted.
|
|
@@ -46,13 +46,39 @@ export declare function toolResult(answer: DriveSearchAnswer): {
|
|
|
46
46
|
text: string;
|
|
47
47
|
}[];
|
|
48
48
|
};
|
|
49
|
-
/**
|
|
49
|
+
/**
|
|
50
|
+
* How one candidate reads to a user, without its identifiers.
|
|
51
|
+
*
|
|
52
|
+
* ENG-2787 — the enrolment marking comes FIRST, and that ordering is the whole
|
|
53
|
+
* fix. The flag was already on the wire; the client truncated it off the END of
|
|
54
|
+
* the row, so ten candidates rendered as
|
|
55
|
+
* `RE_Forecast.xlsx · /drives/b!YmtA8jQX3OSHJRQ88O…` and the tool
|
|
56
|
+
* description's promise that "each candidate comes back marked as already in
|
|
57
|
+
* Rockhopper or not" was true of the payload and false of the screen. A marking
|
|
58
|
+
* whose position depends on the length of a customer's file name is not
|
|
59
|
+
* visible; one at position zero always is.
|
|
60
|
+
*
|
|
61
|
+
* `lastModifiedAt` and `parentPath` are dropped for the same reason they did
|
|
62
|
+
* harm: an ISO timestamp and a raw `/drives/b!…` id are forty characters
|
|
63
|
+
* nobody can read, sitting in front of the one phrase that decides whether
|
|
64
|
+
* this row is worth picking. Both still appear in the prompt's own message,
|
|
65
|
+
* which wraps instead of truncating.
|
|
66
|
+
*/
|
|
50
67
|
export declare function candidateLabel(candidate: Candidate): string;
|
|
51
68
|
/** The numbered list the user picks from, and the model quotes back. */
|
|
52
69
|
export declare function renderCandidates(candidates: readonly Candidate[]): string;
|
|
53
70
|
/** The question the model puts to the user when no richer lane exists. */
|
|
54
71
|
export declare function confirmationPrompt(candidates: readonly Candidate[], token: string): string;
|
|
55
|
-
/**
|
|
72
|
+
/**
|
|
73
|
+
* The elicitation form both richer lanes send.
|
|
74
|
+
*
|
|
75
|
+
* NOTHING IS REQUIRED, and that is deliberate (ENG-2789). A required `choice`
|
|
76
|
+
* is what turned an unreadable prompt into a trap: the only visible buttons
|
|
77
|
+
* were Accept and Decline, and Accept was REFUSED because the invisible field
|
|
78
|
+
* was unset, leaving Decline as the sole affordance that did anything. An
|
|
79
|
+
* unanswered form now comes back as `dismissed` — a state the tool can name
|
|
80
|
+
* and act on — instead of a button the user is herded into pressing.
|
|
81
|
+
*/
|
|
56
82
|
export declare function confirmationForm(candidates: readonly Candidate[]): Omit<ElicitRequestFormParams, 'mode'>;
|
|
57
83
|
/** The answer that means "none of these" rather than a position. */
|
|
58
84
|
export declare const DECLINE_CHOICE = "none";
|
|
@@ -79,6 +105,51 @@ export declare function declinedAnswer(): {
|
|
|
79
105
|
text: string;
|
|
80
106
|
}[];
|
|
81
107
|
};
|
|
108
|
+
/**
|
|
109
|
+
* The answer when the prompt closed without the user answering it (ENG-2789).
|
|
110
|
+
*
|
|
111
|
+
* Its own outcome and not a flavour of `declined`, because the two say opposite
|
|
112
|
+
* things about what the user knows. `declined` means they read ten workbooks
|
|
113
|
+
* and none was theirs — searching again with a different word is the right next
|
|
114
|
+
* move. This means they never told us anything, and the honest next move is to
|
|
115
|
+
* put the same list to them in the conversation, where it cannot be collapsed.
|
|
116
|
+
* Folding them together is what let three unreadable prompts report themselves
|
|
117
|
+
* as a decision the user had made.
|
|
118
|
+
*/
|
|
119
|
+
export declare function dismissedAnswer(candidates?: readonly Candidate[]): {
|
|
120
|
+
isError?: true | undefined;
|
|
121
|
+
content: {
|
|
122
|
+
type: "text";
|
|
123
|
+
text: string;
|
|
124
|
+
}[];
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* The answer when the user pasted a link rather than picking a row (ENG-2784).
|
|
128
|
+
*
|
|
129
|
+
* The URL is the user's own typing, from a field only they can fill — it is
|
|
130
|
+
* not a model-chosen argument, and it is handed straight to `enroll_file`,
|
|
131
|
+
* which is the tool that resolves and validates it. Nothing here tries to
|
|
132
|
+
* parse it: `enroll_file`'s own description calls a pasted address "the only
|
|
133
|
+
* input that names one specific file with no guessing", and re-deriving that
|
|
134
|
+
* judgement in a second place is how two answers start to differ.
|
|
135
|
+
*/
|
|
136
|
+
export declare function linkSuppliedAnswer(url: string): {
|
|
137
|
+
isError?: true | undefined;
|
|
138
|
+
content: {
|
|
139
|
+
type: "text";
|
|
140
|
+
text: string;
|
|
141
|
+
}[];
|
|
142
|
+
};
|
|
143
|
+
/**
|
|
144
|
+
* A pasted value this tool will pass on, or `null`.
|
|
145
|
+
*
|
|
146
|
+
* The only check is that it is an http(s) address, and it exists so an empty
|
|
147
|
+
* box or a stray keystroke does not get announced to the model as "the user
|
|
148
|
+
* gave us the file". Anything further — which tenant, which drive, whether the
|
|
149
|
+
* file exists — is `enroll_file`'s to decide against Microsoft, not this
|
|
150
|
+
* tool's to guess from a string.
|
|
151
|
+
*/
|
|
152
|
+
export declare function usableLink(raw: unknown): string | null;
|
|
82
153
|
/** The answer when a confirmation names something this session never offered. */
|
|
83
154
|
export declare function unknownCandidateAnswer(): {
|
|
84
155
|
isError?: true | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drive-search.contract.d.ts","sourceRoot":"","sources":["../../src/tools/drive-search.contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,kBAAkB,EACxB,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,yBAAyB;;;;;;;;;iBAsDpC,CAAC;AAEH,eAAO,MAAM,wBAAwB,
|
|
1
|
+
{"version":3,"file":"drive-search.contract.d.ts","sourceRoot":"","sources":["../../src/tools/drive-search.contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAC5E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,kBAAkB,EACxB,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,yBAAyB;;;;;;;;;iBAsDpC,CAAC;AAEH,eAAO,MAAM,wBAAwB,QAoBQ,CAAC;AAE9C,eAAO,MAAM,wBAAwB;;;CAI3B,CAAC;AAEX,8EAA8E;AAC9E,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,kBAAkB,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,iBAAiB;;;;;;EAWnD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAE3D;AA4BD,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,SAAS,SAAS,EAAE,GAAG,MAAM,CAIzE;AAED,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,SAAS,SAAS,EAAE,EAChC,KAAK,EAAE,MAAM,GACZ,MAAM,CAUR;AA6BD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,SAAS,SAAS,EAAE,GAC/B,IAAI,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAuCvC;AAED,oEAAoE;AACpE,eAAO,MAAM,cAAc,SAAS,CAAC;AAErC;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS;;;;;;EA0BnD;AAED,iEAAiE;AACjE,wBAAgB,cAAc;;;;;;EAS7B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE;;;;;;EAehE;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM;;;;;;EAW7C;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAUtD;AAED,iFAAiF;AACjF,wBAAgB,sBAAsB;;;;;;EASrC;AAED,yEAAyE;AACzE,eAAO,MAAM,qBAAqB,QAIqC,CAAC;AAExE,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAS7E"}
|
|
@@ -69,6 +69,11 @@ export const DRIVE_SEARCH_DESCRIPTION = "Find a Microsoft Excel workbook in the
|
|
|
69
69
|
'identifiers to hand to `enroll_file`. Never enroll a file the user has not ' +
|
|
70
70
|
'named, and never claim a file is already in Rockhopper because one search ' +
|
|
71
71
|
'result looked similar. ' +
|
|
72
|
+
'Read the outcome rather than assuming: `declined` means the user saw the ' +
|
|
73
|
+
'candidates and rejected them, `dismissed` means the prompt closed with no ' +
|
|
74
|
+
'answer at all — put the list to them yourself and do not search again — ' +
|
|
75
|
+
'and `link_supplied` means they pasted the workbook address, which goes to ' +
|
|
76
|
+
'`enroll_file` as `url` on its own. ' +
|
|
72
77
|
'Searching is capped per session, so search deliberately rather than ' +
|
|
73
78
|
'browsing. Requires a connected Microsoft account — if none is connected, ' +
|
|
74
79
|
'this returns the link the user must open.';
|
|
@@ -95,16 +100,37 @@ export function toolResult(answer) {
|
|
|
95
100
|
...(answer.isError ? { isError: true } : {}),
|
|
96
101
|
};
|
|
97
102
|
}
|
|
98
|
-
/**
|
|
103
|
+
/**
|
|
104
|
+
* How one candidate reads to a user, without its identifiers.
|
|
105
|
+
*
|
|
106
|
+
* ENG-2787 — the enrolment marking comes FIRST, and that ordering is the whole
|
|
107
|
+
* fix. The flag was already on the wire; the client truncated it off the END of
|
|
108
|
+
* the row, so ten candidates rendered as
|
|
109
|
+
* `RE_Forecast.xlsx · /drives/b!YmtA8jQX3OSHJRQ88O…` and the tool
|
|
110
|
+
* description's promise that "each candidate comes back marked as already in
|
|
111
|
+
* Rockhopper or not" was true of the payload and false of the screen. A marking
|
|
112
|
+
* whose position depends on the length of a customer's file name is not
|
|
113
|
+
* visible; one at position zero always is.
|
|
114
|
+
*
|
|
115
|
+
* `lastModifiedAt` and `parentPath` are dropped for the same reason they did
|
|
116
|
+
* harm: an ISO timestamp and a raw `/drives/b!…` id are forty characters
|
|
117
|
+
* nobody can read, sitting in front of the one phrase that decides whether
|
|
118
|
+
* this row is worth picking. Both still appear in the prompt's own message,
|
|
119
|
+
* which wraps instead of truncating.
|
|
120
|
+
*/
|
|
99
121
|
export function candidateLabel(candidate) {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
122
|
+
return `${ENROLLMENT_NOTE[candidate.enrollmentState]} · ${candidate.name}`;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* The same facts MINUS the name, for the places that print the name already.
|
|
126
|
+
*
|
|
127
|
+
* A picker row has to stand alone, so {@link candidateLabel} repeats the name;
|
|
128
|
+
* prose that has just written `**Becklar_RMR_Model.xlsx**` has not.
|
|
129
|
+
*/
|
|
130
|
+
function candidateNote(candidate) {
|
|
131
|
+
return [ENROLLMENT_NOTE[candidate.enrollmentState]]
|
|
132
|
+
.concat(candidate.parentPath ?? [])
|
|
133
|
+
.join(' · ');
|
|
108
134
|
}
|
|
109
135
|
/**
|
|
110
136
|
* What each enrolment state MEANS to the person choosing, in their words.
|
|
@@ -122,7 +148,7 @@ const ENROLLMENT_NOTE = {
|
|
|
122
148
|
/** The numbered list the user picks from, and the model quotes back. */
|
|
123
149
|
export function renderCandidates(candidates) {
|
|
124
150
|
return candidates
|
|
125
|
-
.map((c, index) => `${index + 1}. **${c.name}** — ${
|
|
151
|
+
.map((c, index) => `${index + 1}. **${c.name}** — ${candidateNote(c)}`)
|
|
126
152
|
.join('\n');
|
|
127
153
|
}
|
|
128
154
|
/** The question the model puts to the user when no richer lane exists. */
|
|
@@ -135,11 +161,43 @@ export function confirmationPrompt(candidates, token) {
|
|
|
135
161
|
`confirm_index: <their number> and confirm_token: "${token}", or ` +
|
|
136
162
|
'confirm_index: 0 if none of these is the file.');
|
|
137
163
|
}
|
|
138
|
-
/**
|
|
164
|
+
/**
|
|
165
|
+
* What the user READS before they touch anything (ENG-2789).
|
|
166
|
+
*
|
|
167
|
+
* The candidates are written into the message because the message is the only
|
|
168
|
+
* part of an elicitation this client renders unprompted. The prompt David
|
|
169
|
+
* photographed on 2026-08-19 showed exactly two things on screen — this
|
|
170
|
+
* sentence, and a field collapsed to the words `not set` — while ten workbooks
|
|
171
|
+
* sat behind a `→` documented in a footnote under the buttons. Three
|
|
172
|
+
* consecutive real attempts returned `declined` from a prompt whose options
|
|
173
|
+
* were never on screen.
|
|
174
|
+
*
|
|
175
|
+
* So the list is prose now, and the field is a way to answer a question the
|
|
176
|
+
* user has already read rather than the only place the question exists.
|
|
177
|
+
*/
|
|
178
|
+
function pickerMessage(candidates) {
|
|
179
|
+
return (`Which of these ${candidates.length} workbooks did you mean? ` +
|
|
180
|
+
'Rockhopper will not add anything until you say.\n\n' +
|
|
181
|
+
`${renderCandidates(candidates)}\n\n` +
|
|
182
|
+
'Pick one by number in the File field below.\n\n' +
|
|
183
|
+
'If none of them is the right file, you can paste the workbook\'s own ' +
|
|
184
|
+
'link instead: open it in your browser and copy the address from the bar ' +
|
|
185
|
+
'into the Link field. That names the file exactly, so nothing has to be ' +
|
|
186
|
+
'guessed from its name.');
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* The elicitation form both richer lanes send.
|
|
190
|
+
*
|
|
191
|
+
* NOTHING IS REQUIRED, and that is deliberate (ENG-2789). A required `choice`
|
|
192
|
+
* is what turned an unreadable prompt into a trap: the only visible buttons
|
|
193
|
+
* were Accept and Decline, and Accept was REFUSED because the invisible field
|
|
194
|
+
* was unset, leaving Decline as the sole affordance that did anything. An
|
|
195
|
+
* unanswered form now comes back as `dismissed` — a state the tool can name
|
|
196
|
+
* and act on — instead of a button the user is herded into pressing.
|
|
197
|
+
*/
|
|
139
198
|
export function confirmationForm(candidates) {
|
|
140
199
|
return {
|
|
141
|
-
message:
|
|
142
|
-
'you pick one.',
|
|
200
|
+
message: pickerMessage(candidates),
|
|
143
201
|
requestedSchema: {
|
|
144
202
|
type: 'object',
|
|
145
203
|
properties: {
|
|
@@ -152,15 +210,27 @@ export function confirmationForm(candidates) {
|
|
|
152
210
|
...candidates.map((_, index) => String(index + 1)),
|
|
153
211
|
DECLINE_CHOICE,
|
|
154
212
|
],
|
|
213
|
+
// Numbered so a row the client truncates is still resolvable
|
|
214
|
+
// against the list in the message above it.
|
|
155
215
|
enumNames: [
|
|
156
|
-
...candidates.map((c) => candidateLabel(c)),
|
|
216
|
+
...candidates.map((c, index) => `${index + 1}. ${candidateLabel(c)}`),
|
|
157
217
|
'None of these',
|
|
158
218
|
],
|
|
159
219
|
title: 'File',
|
|
160
220
|
description: 'The workbook to add to Rockhopper.',
|
|
161
221
|
},
|
|
222
|
+
// ENG-2784. The link route used to be spoken only to the MODEL, in the
|
|
223
|
+
// text returned after the user had already given up: whether they ever
|
|
224
|
+
// heard it depended on the assistant choosing to relay it. A recovery
|
|
225
|
+
// path that needs the agent to speak IS the defect, so it is a field on
|
|
226
|
+
// the prompt the user is already looking at.
|
|
227
|
+
link: {
|
|
228
|
+
type: 'string',
|
|
229
|
+
title: 'Link',
|
|
230
|
+
description: 'Or paste the workbook\'s address here — open it in your browser ' +
|
|
231
|
+
'and copy the address from the bar.',
|
|
232
|
+
},
|
|
162
233
|
},
|
|
163
|
-
required: ['choice'],
|
|
164
234
|
},
|
|
165
235
|
};
|
|
166
236
|
}
|
|
@@ -187,7 +257,7 @@ export function confirmedAnswer(candidate) {
|
|
|
187
257
|
}
|
|
188
258
|
return toolResult({
|
|
189
259
|
outcome: 'confirmed',
|
|
190
|
-
text: `The user confirmed "${candidate.name}" (${
|
|
260
|
+
text: `The user confirmed "${candidate.name}" (${candidateNote(candidate)}). ` +
|
|
191
261
|
'Now call `enroll_file` with the `driveMsId` and `msId` below. ' +
|
|
192
262
|
'`enroll_file` will ask who may see the file — put that question to the ' +
|
|
193
263
|
'user too, and never answer it yourself.',
|
|
@@ -203,11 +273,82 @@ export function confirmedAnswer(candidate) {
|
|
|
203
273
|
export function declinedAnswer() {
|
|
204
274
|
return toolResult({
|
|
205
275
|
outcome: 'declined',
|
|
206
|
-
text: 'The user
|
|
207
|
-
'them to describe the workbook differently
|
|
208
|
-
'paste its SharePoint or OneDrive link for
|
|
276
|
+
text: 'The user looked at the candidates and said none of them is the file, ' +
|
|
277
|
+
'so nothing was added. Ask them to describe the workbook differently ' +
|
|
278
|
+
'and search again, or to paste its SharePoint or OneDrive link for ' +
|
|
279
|
+
'`enroll_file`.',
|
|
209
280
|
});
|
|
210
281
|
}
|
|
282
|
+
/**
|
|
283
|
+
* The answer when the prompt closed without the user answering it (ENG-2789).
|
|
284
|
+
*
|
|
285
|
+
* Its own outcome and not a flavour of `declined`, because the two say opposite
|
|
286
|
+
* things about what the user knows. `declined` means they read ten workbooks
|
|
287
|
+
* and none was theirs — searching again with a different word is the right next
|
|
288
|
+
* move. This means they never told us anything, and the honest next move is to
|
|
289
|
+
* put the same list to them in the conversation, where it cannot be collapsed.
|
|
290
|
+
* Folding them together is what let three unreadable prompts report themselves
|
|
291
|
+
* as a decision the user had made.
|
|
292
|
+
*/
|
|
293
|
+
export function dismissedAnswer(candidates) {
|
|
294
|
+
const list = candidates?.length
|
|
295
|
+
? `\n\n${renderCandidates(candidates)}\n\n`
|
|
296
|
+
: ' ';
|
|
297
|
+
return toolResult({
|
|
298
|
+
outcome: 'dismissed',
|
|
299
|
+
text: 'The user closed the file picker without answering it, so nothing was ' +
|
|
300
|
+
'added and they have told us nothing about which file they meant. Do ' +
|
|
301
|
+
'NOT treat this as a rejection and do not search again yet.' +
|
|
302
|
+
list +
|
|
303
|
+
'List these candidates in the conversation, ask which one they meant, ' +
|
|
304
|
+
'and say they can paste the workbook\'s OneDrive or SharePoint link ' +
|
|
305
|
+
'instead if none is right.',
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* The answer when the user pasted a link rather than picking a row (ENG-2784).
|
|
310
|
+
*
|
|
311
|
+
* The URL is the user's own typing, from a field only they can fill — it is
|
|
312
|
+
* not a model-chosen argument, and it is handed straight to `enroll_file`,
|
|
313
|
+
* which is the tool that resolves and validates it. Nothing here tries to
|
|
314
|
+
* parse it: `enroll_file`'s own description calls a pasted address "the only
|
|
315
|
+
* input that names one specific file with no guessing", and re-deriving that
|
|
316
|
+
* judgement in a second place is how two answers start to differ.
|
|
317
|
+
*/
|
|
318
|
+
export function linkSuppliedAnswer(url) {
|
|
319
|
+
return toolResult({
|
|
320
|
+
outcome: 'link_supplied',
|
|
321
|
+
text: 'The user did not pick from the list. They pasted the workbook\'s own ' +
|
|
322
|
+
'address instead, which names the file exactly. Call `enroll_file` with ' +
|
|
323
|
+
'the `url` below and nothing else — no `driveMsId`, no `msId`. ' +
|
|
324
|
+
'`enroll_file` will ask who may see the file; put that question to the ' +
|
|
325
|
+
'user too, and never answer it yourself.',
|
|
326
|
+
detail: { url },
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* A pasted value this tool will pass on, or `null`.
|
|
331
|
+
*
|
|
332
|
+
* The only check is that it is an http(s) address, and it exists so an empty
|
|
333
|
+
* box or a stray keystroke does not get announced to the model as "the user
|
|
334
|
+
* gave us the file". Anything further — which tenant, which drive, whether the
|
|
335
|
+
* file exists — is `enroll_file`'s to decide against Microsoft, not this
|
|
336
|
+
* tool's to guess from a string.
|
|
337
|
+
*/
|
|
338
|
+
export function usableLink(raw) {
|
|
339
|
+
if (typeof raw !== 'string')
|
|
340
|
+
return null;
|
|
341
|
+
const trimmed = raw.trim();
|
|
342
|
+
if (!trimmed)
|
|
343
|
+
return null;
|
|
344
|
+
try {
|
|
345
|
+
const { protocol } = new URL(trimmed);
|
|
346
|
+
return protocol === 'https:' || protocol === 'http:' ? trimmed : null;
|
|
347
|
+
}
|
|
348
|
+
catch {
|
|
349
|
+
return null;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
211
352
|
/** The answer when a confirmation names something this session never offered. */
|
|
212
353
|
export function unknownCandidateAnswer() {
|
|
213
354
|
return toolResult({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drive-search.contract.js","sourceRoot":"","sources":["../../src/tools/drive-search.contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,2BAA2B,GAG5B,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,oEAAoE;QAClE,kEAAkE,CACrE;IACH,KAAK,EAAE,CAAC;SACL,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;SAC1B,QAAQ,EAAE;SACV,QAAQ,CACP,mEAAmE;QACjE,kEAAkE;QAClE,sEAAsE;QACtE,oBAAoB,CACvB;IACH,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,EAAE;SACV,QAAQ,CAAC,wDAAwD,CAAC;IACrE;;;;;;;;;;;OAWG;IACH,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,QAAQ,CACP,8DAA8D;QAC5D,oEAAoE;QACpE,sEAAsE;QACtE,sDAAsD;QACtD,sDAAsD,CACzD;IACH,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,uEAAuE;QACrE,uCAAuC,CAC1C;CACJ,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,wBAAwB,GACnC,6EAA6E;IAC7E,8EAA8E;IAC9E,mCAAmC;IACnC,kEAAkE;IAClE,sEAAsE;IACtE,2EAA2E;IAC3E,6EAA6E;IAC7E,4EAA4E;IAC5E,2EAA2E;IAC3E,6EAA6E;IAC7E,4EAA4E;IAC5E,yBAAyB;IACzB,sEAAsE;IACtE,2EAA2E;IAC3E,2CAA2C,CAAC;AAE9C,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,YAAY,EAAE,IAAI;IAClB,uDAAuD;IACvD,aAAa,EAAE,IAAI;CACX,CAAC;AAUX;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,MAAyB;IAClD,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;IACtE,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;aACnD;SACF;QACD,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtD,CAAC;AACJ,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"drive-search.contract.js","sourceRoot":"","sources":["../../src/tools/drive-search.contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drive-search.d.ts","sourceRoot":"","sources":["../../src/tools/drive-search.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,SAAS,EAEf,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EACL,iBAAiB,EACjB,YAAY,EAOb,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"drive-search.d.ts","sourceRoot":"","sources":["../../src/tools/drive-search.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,SAAS,EAEf,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EACL,iBAAiB,EACjB,YAAY,EAOb,MAAM,oBAAoB,CAAC;AAyB5B;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,SAAS,EACd,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAA;CAAE,GAChE,IAAI,CAwMN;AAiCD,+EAA+E;AAC/E,YAAY,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -2,7 +2,7 @@ import { randomUUID } from 'node:crypto';
|
|
|
2
2
|
import { inputRequired, inputResponse, } from '@modelcontextprotocol/server';
|
|
3
3
|
import { CandidateRegistry, SearchBudget, classifyDriveSearchFailure, ADMIN_CONSENT_TEXT, isAdminConsentRequired, isNoDelegatedToken, toCandidate, } from '../drive-search.js';
|
|
4
4
|
import { log } from '../logger.js';
|
|
5
|
-
import { BUDGET_EXHAUSTED_TEXT, DECLINE_CHOICE, DRIVE_SEARCH_ANNOTATIONS, DRIVE_SEARCH_DESCRIPTION, DRIVE_SEARCH_INPUT_SCHEMA, confirmationForm, confirmationPrompt, confirmedAnswer, connectPrompt, declinedAnswer, toolResult, unknownCandidateAnswer, } from './drive-search.contract.js';
|
|
5
|
+
import { BUDGET_EXHAUSTED_TEXT, DECLINE_CHOICE, DRIVE_SEARCH_ANNOTATIONS, DRIVE_SEARCH_DESCRIPTION, DRIVE_SEARCH_INPUT_SCHEMA, confirmationForm, confirmationPrompt, confirmedAnswer, connectPrompt, declinedAnswer, dismissedAnswer, linkSuppliedAnswer, toolResult, unknownCandidateAnswer, usableLink, } from './drive-search.contract.js';
|
|
6
6
|
import { CONFIRM_KEY, readRequestState, selectLane, } from './drive-search-lanes.js';
|
|
7
7
|
/**
|
|
8
8
|
* ENG-2204 (SP08) — the half of ENG-1647 that ENG-2200 did not fix.
|
|
@@ -48,6 +48,34 @@ export function registerDriveSearchTool(server, api, session) {
|
|
|
48
48
|
const candidate = registry.resolve(nonce, position - 1);
|
|
49
49
|
return candidate ? confirmedAnswer(candidate) : unknownCandidateAnswer();
|
|
50
50
|
}
|
|
51
|
+
/** The set this session offered under `nonce`, for re-asking in prose. */
|
|
52
|
+
function offered(nonce) {
|
|
53
|
+
return (nonce ? registry.recall(nonce) : null) ?? undefined;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Read a filled-in elicitation form.
|
|
57
|
+
*
|
|
58
|
+
* Order matters and it is not the obvious one: a pasted LINK beats a picked
|
|
59
|
+
* row. The link is the user typing the file's own address, which
|
|
60
|
+
* `enroll_file` calls the only input that names one file with no guessing,
|
|
61
|
+
* while a row is a position in a list a search produced. If someone took the
|
|
62
|
+
* trouble to paste an address, that is the file they mean.
|
|
63
|
+
*
|
|
64
|
+
* An EMPTY form is `dismissed`, never `declined`. Nothing is required any
|
|
65
|
+
* more (ENG-2789), so Accept with nothing filled in is a reachable state, and
|
|
66
|
+
* it means the user answered nothing — which is a different fact from "none
|
|
67
|
+
* of these is my file" and leads to a different next move.
|
|
68
|
+
*/
|
|
69
|
+
function resolveForm(nonce, content) {
|
|
70
|
+
const filled = content;
|
|
71
|
+
const link = usableLink(filled?.link);
|
|
72
|
+
if (link)
|
|
73
|
+
return linkSuppliedAnswer(link);
|
|
74
|
+
const choice = filled?.choice;
|
|
75
|
+
if (choice === undefined || choice === '')
|
|
76
|
+
return dismissedAnswer(offered(nonce));
|
|
77
|
+
return resolvePick(nonce, choice);
|
|
78
|
+
}
|
|
51
79
|
/**
|
|
52
80
|
* Put the question through the best lane this request can reach.
|
|
53
81
|
*
|
|
@@ -66,14 +94,14 @@ export function registerDriveSearchTool(server, api, session) {
|
|
|
66
94
|
if (lane === 'elicitation' && ctx?.mcpReq?.elicitInput) {
|
|
67
95
|
try {
|
|
68
96
|
const answer = await ctx.mcpReq.elicitInput({ ...form, mode: 'form' });
|
|
69
|
-
if (answer?.action === 'accept')
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
//
|
|
75
|
-
//
|
|
76
|
-
return
|
|
97
|
+
if (answer?.action === 'accept')
|
|
98
|
+
return resolveForm(nonce, answer.content);
|
|
99
|
+
// Declined or cancelled. Neither is an error — a person is allowed to
|
|
100
|
+
// close a prompt — and neither is `declined` either: the user pressed a
|
|
101
|
+
// button, they did not tell us anything about these ten files. Saying
|
|
102
|
+
// "the user rejected the candidates" here is the ENG-2789 failure, and
|
|
103
|
+
// it is how three unreadable prompts reported themselves as decisions.
|
|
104
|
+
return dismissedAnswer(candidates);
|
|
77
105
|
}
|
|
78
106
|
catch {
|
|
79
107
|
// The client advertised elicitation and could not deliver it. Falling
|
|
@@ -99,11 +127,10 @@ export function registerDriveSearchTool(server, api, session) {
|
|
|
99
127
|
// return a different set than the one the user was looking at.
|
|
100
128
|
const embedded = inputResponse(ctx?.mcpReq?.inputResponses, CONFIRM_KEY);
|
|
101
129
|
if (embedded.kind === 'elicit') {
|
|
130
|
+
const answered = readRequestState(ctx);
|
|
102
131
|
if (embedded.action !== 'accept')
|
|
103
|
-
return
|
|
104
|
-
|
|
105
|
-
?.choice;
|
|
106
|
-
return resolvePick(readRequestState(ctx), choice ?? DECLINE_CHOICE);
|
|
132
|
+
return dismissedAnswer(offered(answered));
|
|
133
|
+
return resolveForm(answered, embedded.content);
|
|
107
134
|
}
|
|
108
135
|
// The universal lane's confirmation: the model relaying a number the
|
|
109
136
|
// user said out loud. Same resolution, same server-side lookup.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drive-search.js","sourceRoot":"","sources":["../../src/tools/drive-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,aAAa,EACb,aAAa,GAId,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,0BAA0B,EAC1B,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,WAAW,GAEZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,wBAAwB,EACxB,wBAAwB,EACxB,yBAAyB,EACzB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,cAAc,EACd,UAAU,EACV,sBAAsB,
|
|
1
|
+
{"version":3,"file":"drive-search.js","sourceRoot":"","sources":["../../src/tools/drive-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-versions.d.ts","sourceRoot":"","sources":["../../src/tools/get-versions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAE9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"get-versions.d.ts","sourceRoot":"","sources":["../../src/tools/get-versions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAE9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGlD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,SAAS,GACb,IAAI,CAsEN"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatVersion } from '../version-format.js';
|
|
2
3
|
export function registerGetVersionsTool(server, api) {
|
|
3
4
|
server.registerTool('get_file_versions', {
|
|
4
5
|
title: 'Get File Versions',
|
|
@@ -16,7 +17,11 @@ export function registerGetVersionsTool(server, api) {
|
|
|
16
17
|
const versions = await api.getFileVersions(fileMsId);
|
|
17
18
|
const summary = versions
|
|
18
19
|
.map((v) => {
|
|
19
|
-
|
|
20
|
+
// ENG-2750 — a negative-semver discard marker renders as what it
|
|
21
|
+
// is. The `[discarded]` tag below stays: it reports `wasDiscarded`,
|
|
22
|
+
// a separate field, so a discard recorded WITHOUT the negative
|
|
23
|
+
// marker keeps its flag.
|
|
24
|
+
const ver = formatVersion(v);
|
|
20
25
|
const flags = [
|
|
21
26
|
v.wasDiscarded ? 'discarded' : null,
|
|
22
27
|
v.wasReverted ? 'reverted' : null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-versions.js","sourceRoot":"","sources":["../../src/tools/get-versions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"get-versions.js","sourceRoot":"","sources":["../../src/tools/get-versions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,UAAU,uBAAuB,CACrC,MAAiB,EACjB,GAAc;IAEd,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EACT,wDAAwD;YACxD,mFAAmF;QACrF,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;SAClE,CAAC;QACF,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,QAAQ;iBACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACT,iEAAiE;gBACjE,oEAAoE;gBACpE,+DAA+D;gBAC/D,yBAAyB;gBACzB,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;gBAC7B,MAAM,KAAK,GAAG;oBACZ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI;oBACnC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;iBAClC;qBACE,MAAM,CAAC,OAAO,CAAC;qBACf,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO,CACL,OAAO,GAAG,WAAW,CAAC,CAAC,UAAU,OAAO,CAAC,CAAC,SAAS,EAAE;oBACrD,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC5C,wDAAwD;oBACxD,2DAA2D;oBAC3D,4DAA4D;oBAC5D,mCAAmC;oBACnC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,gBAAgB;wBACjC,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,gBAAgB,EAAE;wBAC/C,CAAC,CAAC,EAAE,CAAC;oBACP,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAC7B,CAAC;YACJ,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,QAAQ,CAAC,MAAM;4BACnB,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,mBAAmB,OAAO,EAAE;4BAChD,CAAC,CAAC,kCAAkC;qBACvC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBAC1F;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-versions.d.ts","sourceRoot":"","sources":["../../src/tools/write-versions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAE9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"write-versions.d.ts","sourceRoot":"","sources":["../../src/tools/write-versions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAE9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAmBlD,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,SAAS,GACb,IAAI,CAyJN"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatVersion } from '../version-format.js';
|
|
2
3
|
function bumpVersion(major, minor, patch, type) {
|
|
3
4
|
switch (type) {
|
|
4
5
|
case 'major':
|
|
@@ -62,7 +63,7 @@ export function registerWriteVersionTools(server, api) {
|
|
|
62
63
|
enrolledFileMsId: fileMsId,
|
|
63
64
|
version: { ...next, description },
|
|
64
65
|
});
|
|
65
|
-
const tag =
|
|
66
|
+
const tag = formatVersion(version);
|
|
66
67
|
return {
|
|
67
68
|
content: [
|
|
68
69
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-versions.js","sourceRoot":"","sources":["../../src/tools/write-versions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"write-versions.js","sourceRoot":"","sources":["../../src/tools/write-versions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ENG-2750 — the one place a Rockhopper version number becomes text.
|
|
3
|
+
*
|
|
4
|
+
* The backend records a provisional pre-discard snapshot by NEGATING all three
|
|
5
|
+
* semver components (`convergence-orchestrator.service.ts:178`) and identifies
|
|
6
|
+
* one by `isDiscard = version.majorVersion < 0`
|
|
7
|
+
* (`file-versions.service.ts:781`; documented on `TVersion` in
|
|
8
|
+
* `dto/create-file-version.dto.ts` and `FileVersion.discardConfirmedAt`).
|
|
9
|
+
*
|
|
10
|
+
* Interpolating the three numbers raw published that internal marker as a
|
|
11
|
+
* version number — staging printed `- **v-2.0.0** (id: 814)`. This client's
|
|
12
|
+
* consumer is a model, so the string is not cosmetic: `v-2.0.0` is quotable to
|
|
13
|
+
* a customer, sorts ahead of v0.0.1, and reads as a legal argument value.
|
|
14
|
+
*
|
|
15
|
+
* Every renderer in this package goes through here so a marker the backend
|
|
16
|
+
* adds later has exactly one place to be taught.
|
|
17
|
+
*/
|
|
18
|
+
/** The three semver columns, as carried on `FileVersion` and on a create response. */
|
|
19
|
+
export interface VersionNumberParts {
|
|
20
|
+
majorVersion: number;
|
|
21
|
+
minorVersion: number;
|
|
22
|
+
patchVersion: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Render a version for a human or a model to read.
|
|
26
|
+
*
|
|
27
|
+
* An ordinary version renders `v2.3.1`. A discard snapshot renders
|
|
28
|
+
* `discard of v2.0.0` — what it is, naming the version it snapshotted, with no
|
|
29
|
+
* invented positive number and nothing hidden.
|
|
30
|
+
*/
|
|
31
|
+
export declare function formatVersion(v: VersionNumberParts): string;
|
|
32
|
+
//# sourceMappingURL=version-format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-format.d.ts","sourceRoot":"","sources":["../src/version-format.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,sFAAsF;AACtF,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAS3D"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ENG-2750 — the one place a Rockhopper version number becomes text.
|
|
3
|
+
*
|
|
4
|
+
* The backend records a provisional pre-discard snapshot by NEGATING all three
|
|
5
|
+
* semver components (`convergence-orchestrator.service.ts:178`) and identifies
|
|
6
|
+
* one by `isDiscard = version.majorVersion < 0`
|
|
7
|
+
* (`file-versions.service.ts:781`; documented on `TVersion` in
|
|
8
|
+
* `dto/create-file-version.dto.ts` and `FileVersion.discardConfirmedAt`).
|
|
9
|
+
*
|
|
10
|
+
* Interpolating the three numbers raw published that internal marker as a
|
|
11
|
+
* version number — staging printed `- **v-2.0.0** (id: 814)`. This client's
|
|
12
|
+
* consumer is a model, so the string is not cosmetic: `v-2.0.0` is quotable to
|
|
13
|
+
* a customer, sorts ahead of v0.0.1, and reads as a legal argument value.
|
|
14
|
+
*
|
|
15
|
+
* Every renderer in this package goes through here so a marker the backend
|
|
16
|
+
* adds later has exactly one place to be taught.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Render a version for a human or a model to read.
|
|
20
|
+
*
|
|
21
|
+
* An ordinary version renders `v2.3.1`. A discard snapshot renders
|
|
22
|
+
* `discard of v2.0.0` — what it is, naming the version it snapshotted, with no
|
|
23
|
+
* invented positive number and nothing hidden.
|
|
24
|
+
*/
|
|
25
|
+
export function formatVersion(v) {
|
|
26
|
+
if (v.majorVersion < 0) {
|
|
27
|
+
// Every component is negated at the write site, so recover each one.
|
|
28
|
+
const major = Math.abs(v.majorVersion);
|
|
29
|
+
const minor = Math.abs(v.minorVersion);
|
|
30
|
+
const patch = Math.abs(v.patchVersion);
|
|
31
|
+
return `discard of v${major}.${minor}.${patch}`;
|
|
32
|
+
}
|
|
33
|
+
return `v${v.majorVersion}.${v.minorVersion}.${v.patchVersion}`;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=version-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-format.js","sourceRoot":"","sources":["../src/version-format.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AASH;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,CAAqB;IACjD,IAAI,CAAC,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QACvB,qEAAqE;QACrE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QACvC,OAAO,eAAe,KAAK,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;IAClD,CAAC;IACD,OAAO,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;AAClE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rockhopper-co/mcp-server",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.29-staging.368e439",
|
|
4
4
|
"description": "Rockhopper MCP server — expose file metadata, versions, reviews, and comments to AI tools",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -36,10 +36,7 @@
|
|
|
36
36
|
"generate:postman": "tsx scripts/generate-postman-collection.ts && tsx scripts/generate-postman-environments.ts",
|
|
37
37
|
"generate:postman:check": "npm run generate:postman && git diff --exit-code -- postman/",
|
|
38
38
|
"prepare": "npm run build",
|
|
39
|
-
"prepublishOnly": "npm run build"
|
|
40
|
-
"release:patch": "npm version patch -m 'release: v%s' && git push && git push --tags",
|
|
41
|
-
"release:minor": "npm version minor -m 'release: v%s' && git push && git push --tags",
|
|
42
|
-
"release:major": "npm version major -m 'release: v%s' && git push && git push --tags"
|
|
39
|
+
"prepublishOnly": "npm run build"
|
|
43
40
|
},
|
|
44
41
|
"engines": {
|
|
45
42
|
"node": ">=20.0.0"
|
|
@@ -58,6 +55,7 @@
|
|
|
58
55
|
"@vitest/coverage-v8": "^4.1.10",
|
|
59
56
|
"eslint": "^10.7.0",
|
|
60
57
|
"globals": "^17.11.0",
|
|
58
|
+
"js-yaml": "^5.3.0",
|
|
61
59
|
"tsx": "^4.23.1",
|
|
62
60
|
"typescript": "^6.0.3",
|
|
63
61
|
"typescript-eslint": "^8.65.0",
|