@rockhopper-co/mcp-server 0.7.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +68 -0
- package/README.md +31 -0
- package/dist/api-client.d.ts +83 -3
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +171 -10
- package/dist/api-client.js.map +1 -1
- package/dist/auth/device-grant-client.d.ts.map +1 -1
- package/dist/auth/device-grant-client.js +3 -1
- package/dist/auth/device-grant-client.js.map +1 -1
- package/dist/cli.js +39 -1
- package/dist/cli.js.map +1 -1
- package/dist/correlation.d.ts +9 -0
- package/dist/correlation.d.ts.map +1 -0
- package/dist/correlation.js +26 -0
- package/dist/correlation.js.map +1 -0
- package/dist/logger.d.ts +42 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +159 -0
- package/dist/logger.js.map +1 -0
- package/dist/not-ready.d.ts +95 -0
- package/dist/not-ready.d.ts.map +1 -0
- package/dist/not-ready.js +151 -0
- package/dist/not-ready.js.map +1 -0
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +8 -0
- package/dist/prompts/index.js.map +1 -1
- package/dist/resources/changes.d.ts.map +1 -1
- package/dist/resources/changes.js +6 -0
- package/dist/resources/changes.js.map +1 -1
- package/dist/resources/orchestration-guide.md +23 -3
- package/dist/resources/teams.d.ts.map +1 -1
- package/dist/resources/teams.js +7 -1
- package/dist/resources/teams.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +40 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/get-cell-history.d.ts.map +1 -1
- package/dist/tools/get-cell-history.js +28 -4
- package/dist/tools/get-cell-history.js.map +1 -1
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +13 -1
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/write-reviews.d.ts.map +1 -1
- package/dist/tools/write-reviews.js +58 -4
- package/dist/tools/write-reviews.js.map +1 -1
- package/dist/types.d.ts +58 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/zod-schemas.d.ts +30 -54
- package/dist/zod-schemas.d.ts.map +1 -1
- package/dist/zod-schemas.js +24 -0
- package/dist/zod-schemas.js.map +1 -1
- package/package.json +22 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"changes.d.ts","sourceRoot":"","sources":["../../src/resources/changes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"changes.d.ts","sourceRoot":"","sources":["../../src/resources/changes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGlD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,SAAS,GACb,IAAI,CA0CN"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { assertChangeHistoryComplete } from '../not-ready.js';
|
|
2
3
|
export function registerChangeResources(server, api) {
|
|
3
4
|
// KI-078 (ENG-1381): template only, no per-file expansion into resources/list.
|
|
4
5
|
// Previously this enumerated only files with `hasUncommittedChanges === true` —
|
|
@@ -16,6 +17,11 @@ export function registerChangeResources(server, api) {
|
|
|
16
17
|
// different cursor — though most clients will treat this as a
|
|
17
18
|
// single read. Resource shape is now the paginated envelope, not
|
|
18
19
|
// a bare array.
|
|
20
|
+
// Plan 02 ruling 5 (STRICT) — a resource read has no `isError` channel,
|
|
21
|
+
// so an incomplete window must THROW. The SDK renders that as a protocol
|
|
22
|
+
// error, which is the only shape here that cannot be mistaken for an
|
|
23
|
+
// empty change set.
|
|
24
|
+
await assertChangeHistoryComplete(api, fileMsId);
|
|
19
25
|
const page = await api.getUnattributedChangesPaginated(fileMsId);
|
|
20
26
|
return {
|
|
21
27
|
contents: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"changes.js","sourceRoot":"","sources":["../../src/resources/changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"changes.js","sourceRoot":"","sources":["../../src/resources/changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAG3E,OAAO,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAE9D,MAAM,UAAU,uBAAuB,CACrC,MAAiB,EACjB,GAAc;IAEd,+EAA+E;IAC/E,gFAAgF;IAChF,+DAA+D;IAC/D,MAAM,CAAC,gBAAgB,CACrB,sBAAsB,EACtB,IAAI,gBAAgB,CAAC,uCAAuC,EAAE;QAC5D,IAAI,EAAE,SAAS;KAChB,CAAC,EACF;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EACT,uEAAuE;QACzE,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC1B,mEAAmE;QACnE,uEAAuE;QACvE,8DAA8D;QAC9D,8DAA8D;QAC9D,iEAAiE;QACjE,gBAAgB;QAChB,wEAAwE;QACxE,yEAAyE;QACzE,qEAAqE;QACrE,oBAAoB;QACpB,MAAM,2BAA2B,CAAC,GAAG,EAAE,QAAkB,CAAC,CAAC;QAE3D,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,+BAA+B,CACpD,QAAkB,CACnB,CAAC;QACF,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;iBACpC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -4,19 +4,27 @@ This guide explains how to combine Rockhopper's MCP tools and resources correctl
|
|
|
4
4
|
|
|
5
5
|
## 1. Identity and IDs
|
|
6
6
|
|
|
7
|
-
Rockhopper uses
|
|
7
|
+
Rockhopper uses four distinct identifiers. Mixing them is the most common cause of tool-call errors.
|
|
8
8
|
|
|
9
9
|
| ID | Type | Where it comes from | Where it goes |
|
|
10
10
|
|----|------|---------------------|---------------|
|
|
11
11
|
| `fileMsId` | string | `list_files` response, `rockhopper://files` resource | Tools that act on a file: `get_file_versions`, `get_file_comments`, `add_comment`, `create_version`, `discard_changes`, `get_cell_history`, `get_unattributed_changes`, `rename_file` |
|
|
12
12
|
| `versionId` | number | `get_file_versions` response (`internalId` field), `create_version` response | Tools that act on a specific version snapshot: `get_reviews`, `create_review_request`, `approve_review`, `cancel_review` |
|
|
13
13
|
| `versionInternalId` | number | `get_file_comments` response (comments scope to a version) | Comment-thread tools: `add_comment`, `reply_to_comment`, `resolve_comment` |
|
|
14
|
+
| user / team id | uuid string **or** number | `rockhopper://teams/{teamId}` resource — each record carries an `id` (uuid) and an `internalId` (number) | `reviewerIds` on `create_review_request`; the `{teamId}` in `rockhopper://teams/{teamId}` |
|
|
14
15
|
|
|
15
16
|
Decision tree:
|
|
16
17
|
|
|
17
18
|
- **Reading file metadata** → `fileMsId`.
|
|
18
19
|
- **Writing a comment** → `fileMsId` (the server auto-resolves the latest version) OR `versionInternalId` if commenting on a historical version.
|
|
19
20
|
- **Acting on a review** → `versionId`.
|
|
21
|
+
- **Naming a person or a team** → their `id` (uuid).
|
|
22
|
+
|
|
23
|
+
### Users and teams take two spellings; send the uuid
|
|
24
|
+
|
|
25
|
+
A user or team can be named by its `id` (a uuid, e.g. `0198f3a1-2b4c-7d8e-9f01-23456789abcd`) or by its legacy `internalId` (a number). Both are accepted and both name the same record, and the two can be mixed inside one `reviewerIds` array.
|
|
26
|
+
|
|
27
|
+
**Send the uuid.** The numeric form is accepted until **2027-09-14** and is removed after that date. Nothing else in this guide takes a uuid — `versionId`, `versionInternalId` and comment ids stay numeric.
|
|
20
28
|
|
|
21
29
|
If a tool returns an error like "expected versionId but received fileMsId", you used the wrong identifier — check the tool description for which type it accepts.
|
|
22
30
|
|
|
@@ -32,6 +40,18 @@ Standard sequence to inspect a file:
|
|
|
32
40
|
- Reviews → `get_reviews(versionId)`. Pass a `versionId` from step 2.
|
|
33
41
|
- Uncommitted changes → `get_unattributed_changes(fileMsId)` (only useful if `hasUncommittedChanges === true`).
|
|
34
42
|
|
|
43
|
+
### `CHANGE_HISTORY_NOT_READY` — never report it as "no changes"
|
|
44
|
+
|
|
45
|
+
`get_cell_history`, `get_unattributed_changes`, the `rockhopper://files/{id}/changes`
|
|
46
|
+
resource and the change prompts all serve change history strictly: while Rockhopper is
|
|
47
|
+
still computing a file's history they refuse, and the refusal carries
|
|
48
|
+
`{"status":"not_ready", "reason": …, "retryAfterSeconds": N}` with `isError: true`
|
|
49
|
+
(the resource and prompts throw).
|
|
50
|
+
|
|
51
|
+
A refusal means **nothing is known yet**. It is not an empty history, not zero changes,
|
|
52
|
+
and not evidence that the file is unmodified. Wait `retryAfterSeconds` and ask again;
|
|
53
|
+
never answer a user's question about what changed from a not-ready response.
|
|
54
|
+
|
|
35
55
|
## 3. Commenting workflow
|
|
36
56
|
|
|
37
57
|
Comments are scoped to a version. The default version is the latest **committed** one.
|
|
@@ -49,7 +69,7 @@ Comments on historical versions:
|
|
|
49
69
|
|
|
50
70
|
Reviews follow a strict state machine: **`pending` → `approved`** or **`pending` → `cancelled`**. No other transitions are valid.
|
|
51
71
|
|
|
52
|
-
1. `create_review_request({ versionId,
|
|
72
|
+
1. `create_review_request({ versionId, reviewerIds, subject, description? })` — creates a `pending` review. Only the file owner / workspace member with edit rights can create. `reviewerIds` is an array of user ids, **not** email addresses; read them from `rockhopper://teams/{teamId}` and send each member's `id` (uuid).
|
|
53
73
|
2. `approve_review({ reviewId })` — moves `pending` → `approved`. **Only** assigned reviewers can approve.
|
|
54
74
|
3. `cancel_review({ reviewId })` — moves `pending` → `cancelled`. **Only** the requester can cancel.
|
|
55
75
|
|
|
@@ -74,7 +94,7 @@ Two distinct concepts. Tools work with one or the other; do not mix.
|
|
|
74
94
|
- **Committed history** — version snapshots created by `create_version`. Surfaced by `get_file_versions`, `get_cell_history`. Immutable.
|
|
75
95
|
- **Uncommitted changes** — cell edits the user has made since the last `create_version`. Surfaced by `get_unattributed_changes`. Mutable; consumed by the next `create_version` or `discard_changes` call.
|
|
76
96
|
|
|
77
|
-
|
|
97
|
+
Note: on files served from the change ledger (most Microsoft files), `get_cell_history` also includes live edits not yet captured by a committed version — those entries carry the literal versionId `uncommitted`. On files still served from the legacy store, only committed values appear; use `get_unattributed_changes` for pending edits there.
|
|
78
98
|
|
|
79
99
|
## 7. Cross-cloud differences
|
|
80
100
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"teams.d.ts","sourceRoot":"","sources":["../../src/resources/teams.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,SAAS,GACb,IAAI,
|
|
1
|
+
{"version":3,"file":"teams.d.ts","sourceRoot":"","sources":["../../src/resources/teams.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,SAAS,GACb,IAAI,CAgCN"}
|
package/dist/resources/teams.js
CHANGED
|
@@ -7,7 +7,13 @@ export function registerTeamResources(server, api) {
|
|
|
7
7
|
description: 'Details for a specific team including members and roles',
|
|
8
8
|
mimeType: 'application/json',
|
|
9
9
|
}, async (uri, { teamId }) => {
|
|
10
|
-
|
|
10
|
+
// ENG-2230: NOT `Number(teamId)`. A team is keyed on a version-7 uuid
|
|
11
|
+
// (ENG-1966) and `Number('0198f3a1-…')` is `NaN`, which would request
|
|
12
|
+
// `/teams/NaN` — a uuid refused on the customer's machine, the same
|
|
13
|
+
// defect class as the reviewerIds schema. The raw path variable is
|
|
14
|
+
// interpolated straight into the URL, so a numeric id produces a
|
|
15
|
+
// byte-identical request to what `Number()` produced before.
|
|
16
|
+
const team = await api.getTeam(Array.isArray(teamId) ? teamId[0] : teamId);
|
|
11
17
|
return {
|
|
12
18
|
contents: [
|
|
13
19
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"teams.js","sourceRoot":"","sources":["../../src/resources/teams.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAI3E,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,GAAc;IAEd,MAAM,CAAC,gBAAgB,CACrB,aAAa,EACb,IAAI,gBAAgB,CAAC,6BAA6B,EAAE;QAClD,IAAI,EAAE,SAAS;KAChB,CAAC,EACF;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,yDAAyD;QACtE,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACxB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"teams.js","sourceRoot":"","sources":["../../src/resources/teams.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAI3E,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,GAAc;IAEd,MAAM,CAAC,gBAAgB,CACrB,aAAa,EACb,IAAI,gBAAgB,CAAC,6BAA6B,EAAE;QAClD,IAAI,EAAE,SAAS;KAChB,CAAC,EACF;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,yDAAyD;QACtE,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACxB,sEAAsE;QACtE,sEAAsE;QACtE,oEAAoE;QACpE,mEAAmE;QACnE,iEAAiE;QACjE,6DAA6D;QAC7D,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAC5B,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAC3C,CAAC;QACF,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;iBACpC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAK5C,OAAO,EAAiB,KAAK,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAqD5E,wBAAgB,YAAY,CAC1B,SAAS,EAAE,SAAS,EACpB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,SAAS,CAiCX"}
|
package/dist/server.js
CHANGED
|
@@ -1,12 +1,50 @@
|
|
|
1
1
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { runWithCorrelationId } from './correlation.js';
|
|
3
|
+
import { log, serviceVersion } from './logger.js';
|
|
2
4
|
import { registerPrompts } from './prompts/index.js';
|
|
3
5
|
import { registerResources } from './resources/index.js';
|
|
4
6
|
import { registerTools } from './tools/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Phase 1.1 / KI-226 + Phase 1.5 / KI-225 — wrap every tool handler once.
|
|
9
|
+
* Intercepting `registerTool` here (vs. wrapping each of the ~16 handlers)
|
|
10
|
+
* means all current and future tools are covered automatically. The wrapper:
|
|
11
|
+
* - runs the handler inside {@link runWithCorrelationId}, so every outbound
|
|
12
|
+
* `ApiClient` call it makes — including multi-call fan-outs like search —
|
|
13
|
+
* shares one `X-Correlation-Id` (1.1), and
|
|
14
|
+
* - times the handler and logs a `tool_call` / `tool_call_failed` line to
|
|
15
|
+
* the local diagnostic file (1.5). Only the tool NAME is logged — never
|
|
16
|
+
* the tool arguments, which may carry file refs / PII.
|
|
17
|
+
* The handler callback is always the last positional argument to
|
|
18
|
+
* `registerTool`; the loose casts insulate this seam from the SDK's generic
|
|
19
|
+
* `ToolCallback` union. On a handler throw we log then re-throw — behavior
|
|
20
|
+
* (the error surfacing to the SDK) is preserved.
|
|
21
|
+
*/
|
|
22
|
+
function installCorrelationScope(server) {
|
|
23
|
+
const baseRegisterTool = server.registerTool.bind(server);
|
|
24
|
+
server.registerTool = ((name, config, cb) => {
|
|
25
|
+
const handler = cb;
|
|
26
|
+
const wrapped = (...args) => runWithCorrelationId(async () => {
|
|
27
|
+
const start = Date.now();
|
|
28
|
+
try {
|
|
29
|
+
const result = await handler(...args);
|
|
30
|
+
log.info({ event: 'tool_call', tool: name, durationMs: Date.now() - start, outcome: 'ok' }, 'tool_call');
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
log.error({ event: 'tool_call_failed', tool: name, durationMs: Date.now() - start, err }, 'tool_call_failed');
|
|
35
|
+
throw err;
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
return baseRegisterTool(name, config, wrapped);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
5
41
|
export function createServer(apiClient, options) {
|
|
6
42
|
const readOnly = options?.scope === 'read-only';
|
|
7
43
|
const server = new McpServer({
|
|
8
44
|
name: 'rockhopper',
|
|
9
|
-
|
|
45
|
+
// ENG-1955: read from package.json (see logger.ts) so the version a
|
|
46
|
+
// client sees in `initialize` is the version it is actually running.
|
|
47
|
+
version: serviceVersion,
|
|
10
48
|
}, {
|
|
11
49
|
instructions: readOnly
|
|
12
50
|
? 'Rockhopper MCP server for reading Excel file metadata. ' +
|
|
@@ -22,6 +60,7 @@ export function createServer(apiClient, options) {
|
|
|
22
60
|
'rename_file) require a read-write scoped token. ' +
|
|
23
61
|
'File IDs use the platformId field (e.g. from list_files output).',
|
|
24
62
|
});
|
|
63
|
+
installCorrelationScope(server);
|
|
25
64
|
registerResources(server, apiClient);
|
|
26
65
|
registerTools(server, apiClient, options);
|
|
27
66
|
registerPrompts(server, apiClient);
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,aAAa,EAA6B,MAAM,kBAAkB,CAAC;AAE5E,MAAM,UAAU,YAAY,CAC1B,SAAoB,EACpB,OAA8B;IAE9B,MAAM,QAAQ,GAAG,OAAO,EAAE,KAAK,KAAK,WAAW,CAAC;IAEhD,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;QACE,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,aAAa,EAA6B,MAAM,kBAAkB,CAAC;AAE5E;;;;;;;;;;;;;;GAcG;AACH,SAAS,uBAAuB,CAAC,MAAiB;IAChD,MAAM,gBAAgB,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,CAAC,YAAY,GAAG,CAAC,CACrB,IAAY,EACZ,MAAe,EACf,EAAW,EAC0B,EAAE;QACvC,MAAM,OAAO,GAAG,EAAqC,CAAC;QACtD,MAAM,OAAO,GAAG,CAAC,GAAG,IAAe,EAAW,EAAE,CAC9C,oBAAoB,CAAC,KAAK,IAAI,EAAE;YAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;gBACtC,GAAG,CAAC,IAAI,CACN,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EACjF,WAAW,CACZ,CAAC;gBACF,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,KAAK,CACP,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,EAC9E,kBAAkB,CACnB,CAAC;gBACF,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,CAAC;QACL,OACE,gBAKD,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3B,CAAC,CAA+B,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,SAAoB,EACpB,OAA8B;IAE9B,MAAM,QAAQ,GAAG,OAAO,EAAE,KAAK,KAAK,WAAW,CAAC;IAEhD,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;QACE,IAAI,EAAE,YAAY;QAClB,oEAAoE;QACpE,qEAAqE;QACrE,OAAO,EAAE,cAAc;KACxB,EACD;QACE,YAAY,EAAE,QAAQ;YACpB,CAAC,CAAC,yDAAyD;gBACzD,oEAAoE;gBACpE,gDAAgD;gBAChD,gEAAgE;gBAChE,kEAAkE;YACpE,CAAC,CAAC,0DAA0D;gBAC1D,oEAAoE;gBACpE,iEAAiE;gBACjE,0EAA0E;gBAC1E,kEAAkE;gBAClE,kDAAkD;gBAClD,kEAAkE;KACvE,CACF,CAAC;IAEF,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACrC,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC1C,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEnC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-cell-history.d.ts","sourceRoot":"","sources":["../../src/tools/get-cell-history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"get-cell-history.d.ts","sourceRoot":"","sources":["../../src/tools/get-cell-history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAOlD,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,SAAS,GACb,IAAI,CAkFN"}
|
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { assertChangeHistoryComplete, isNotReady, notReadyToolResult, } from '../not-ready.js';
|
|
2
3
|
export function registerGetCellHistoryTool(server, api) {
|
|
3
4
|
server.registerTool('get_cell_history', {
|
|
4
5
|
title: 'Get Cell History',
|
|
5
6
|
description: 'Get the change history for a specific cell in an enrolled file. ' +
|
|
6
|
-
'Shows how the cell value changed across versions.'
|
|
7
|
+
'Shows how the cell value changed across versions. ' +
|
|
8
|
+
// Plan 02 ruling 5 — the contract belongs in the description, not only
|
|
9
|
+
// in the payload: a model deciding "nothing changed" reads the tool
|
|
10
|
+
// doc, not the error envelope.
|
|
11
|
+
'Answers CHANGE_HISTORY_NOT_READY (isError) while Rockhopper is still ' +
|
|
12
|
+
'computing this history. That is NOT an empty history — nothing is ' +
|
|
13
|
+
'known yet; retry after the stated interval and never report an ' +
|
|
14
|
+
'absence of changes from it.',
|
|
7
15
|
inputSchema: {
|
|
8
16
|
fileMsId: z.string().describe('Platform ID of the enrolled file'),
|
|
9
17
|
sheetName: z.string().describe('Name of the worksheet'),
|
|
@@ -17,11 +25,22 @@ export function registerGetCellHistoryTool(server, api) {
|
|
|
17
25
|
},
|
|
18
26
|
}, async ({ fileMsId, sheetName, cellAddress }) => {
|
|
19
27
|
try {
|
|
28
|
+
// Plan 02 ruling 5 (STRICT): completeness FIRST. A pending fold means
|
|
29
|
+
// the change-log window is mid-rewrite, so rows served now are a
|
|
30
|
+
// partial view an assistant would summarise as the whole truth.
|
|
31
|
+
await assertChangeHistoryComplete(api, fileMsId);
|
|
20
32
|
const history = await api.getCellHistory(fileMsId, sheetName, cellAddress);
|
|
33
|
+
// ENG-1638 (P3-2): a ledger-served entry carries a backend-rendered
|
|
34
|
+
// `formatted` line — 'vX.Y.Z: <value> — <provenance> (driven by
|
|
35
|
+
// <human>) — <ts>' — print it verbatim. The legacy normalized
|
|
36
|
+
// fallback (not-eligible file / Google / old backend) has only the
|
|
37
|
+
// four core fields; keep the original rendering for it.
|
|
21
38
|
const summary = history
|
|
22
|
-
.map((h) =>
|
|
23
|
-
|
|
24
|
-
|
|
39
|
+
.map((h) => h.formatted
|
|
40
|
+
? `- ${h.formatted}`
|
|
41
|
+
: `- Version ${h.versionId}: **${JSON.stringify(h.value)}**` +
|
|
42
|
+
(h.changedBy ? ` — by ${h.changedBy}` : '') +
|
|
43
|
+
` — ${h.changedAt}`)
|
|
25
44
|
.join('\n');
|
|
26
45
|
return {
|
|
27
46
|
content: [
|
|
@@ -35,6 +54,11 @@ export function registerGetCellHistoryTool(server, api) {
|
|
|
35
54
|
};
|
|
36
55
|
}
|
|
37
56
|
catch (error) {
|
|
57
|
+
// A not-ready answer is a refusal, never an error string: the generic
|
|
58
|
+
// branch below hands the model prose it may read as "the tool is
|
|
59
|
+
// broken, answer from what I already have".
|
|
60
|
+
if (isNotReady(error))
|
|
61
|
+
return notReadyToolResult(error);
|
|
38
62
|
return {
|
|
39
63
|
content: [
|
|
40
64
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-cell-history.js","sourceRoot":"","sources":["../../src/tools/get-cell-history.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"get-cell-history.js","sourceRoot":"","sources":["../../src/tools/get-cell-history.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,2BAA2B,EAC3B,UAAU,EACV,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,UAAU,0BAA0B,CACxC,MAAiB,EACjB,GAAc;IAEd,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EACT,kEAAkE;YAClE,oDAAoD;YACpD,uEAAuE;YACvE,oEAAoE;YACpE,+BAA+B;YAC/B,uEAAuE;YACvE,oEAAoE;YACpE,iEAAiE;YACjE,6BAA6B;QAC/B,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;YACjE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YACvD,WAAW,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,QAAQ,CAAC,8CAA8C,CAAC;SAC5D;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,EAAE;QAC7C,IAAI,CAAC;YACH,sEAAsE;YACtE,iEAAiE;YACjE,gEAAgE;YAChE,MAAM,2BAA2B,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAEjD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,cAAc,CACtC,QAAQ,EACR,SAAS,EACT,WAAW,CACZ,CAAC;YAEF,oEAAoE;YACpE,gEAAgE;YAChE,8DAA8D;YAC9D,mEAAmE;YACnE,wDAAwD;YACxD,MAAM,OAAO,GAAG,OAAO;iBACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACT,CAAC,CAAC,SAAS;gBACT,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE;gBACpB,CAAC,CAAC,aAAa,CAAC,CAAC,SAAS,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI;oBAC1D,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3C,MAAM,CAAC,CAAC,SAAS,EAAE,CACxB;iBACA,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,OAAO,CAAC,MAAM;4BAClB,CAAC,CAAC,QAAQ,WAAW,QAAQ,SAAS,OAAO,OAAO,CAAC,MAAM,kBAAkB,OAAO,EAAE;4BACtF,CAAC,CAAC,wBAAwB,WAAW,QAAQ,SAAS,IAAI;qBAC7D;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sEAAsE;YACtE,iEAAiE;YACjE,4CAA4C;YAC5C,IAAI,UAAU,CAAC,KAAK,CAAC;gBAAE,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;YACxD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,+BAA+B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBAC9F;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAOlD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,SAAS,GACb,IAAI,CAuNN"}
|
package/dist/tools/search.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { assertChangeHistoryComplete, isNotReady, notReadyToolResult, } from '../not-ready.js';
|
|
2
3
|
export function registerSearchTool(server, api) {
|
|
3
4
|
server.registerTool('search_files', {
|
|
4
5
|
title: 'Search Files',
|
|
@@ -58,7 +59,12 @@ export function registerSearchTool(server, api) {
|
|
|
58
59
|
'every change on a single worksheet (no pagination — bounded by ' +
|
|
59
60
|
'sheet size); (2) omit `sheetName` for the file-wide cursor-paginated ' +
|
|
60
61
|
'view (rows are capped per response with a summary line; pass `cursor` ' +
|
|
61
|
-
'returned by the previous call to fetch the next page).'
|
|
62
|
+
'returned by the previous call to fetch the next page). ' +
|
|
63
|
+
// Plan 02 ruling 5 — "No unattributed changes" is a factual claim, and
|
|
64
|
+
// it is only made after completeness is proven.
|
|
65
|
+
'Answers CHANGE_HISTORY_NOT_READY (isError) while Rockhopper is still ' +
|
|
66
|
+
"computing this file's changes. That is NOT \"no changes\" — retry " +
|
|
67
|
+
'after the stated interval instead of reporting an absence.',
|
|
62
68
|
inputSchema: {
|
|
63
69
|
fileMsId: z.string().describe('Platform ID of the enrolled file'),
|
|
64
70
|
sheetName: z
|
|
@@ -81,6 +87,10 @@ export function registerSearchTool(server, api) {
|
|
|
81
87
|
},
|
|
82
88
|
}, async ({ fileMsId, sheetName, cursor }) => {
|
|
83
89
|
try {
|
|
90
|
+
// Plan 02 ruling 5 (STRICT): gate BOTH modes. The commit-diff fold
|
|
91
|
+
// retracts and rewrites the uncommitted window, so a pending fold
|
|
92
|
+
// means this list is mid-rewrite in either shape.
|
|
93
|
+
await assertChangeHistoryComplete(api, fileMsId);
|
|
84
94
|
if (sheetName) {
|
|
85
95
|
// Sheet-filtered mode: bounded by sheet size, no pagination needed.
|
|
86
96
|
// Audit (2026-05-23) measured: `Summary` sheet on a 12 MB file
|
|
@@ -155,6 +165,8 @@ export function registerSearchTool(server, api) {
|
|
|
155
165
|
};
|
|
156
166
|
}
|
|
157
167
|
catch (error) {
|
|
168
|
+
if (isNotReady(error))
|
|
169
|
+
return notReadyToolResult(error);
|
|
158
170
|
return {
|
|
159
171
|
content: [
|
|
160
172
|
{
|
package/dist/tools/search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-reviews.d.ts","sourceRoot":"","sources":["../../src/tools/write-reviews.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"write-reviews.d.ts","sourceRoot":"","sources":["../../src/tools/write-reviews.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAyDlD,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,SAAS,GACb,IAAI,CA2LN"}
|
|
@@ -1,11 +1,62 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* ENG-2230 — a reviewer id in EITHER spelling: the version-7 uuid, or the
|
|
4
|
+
* legacy numeric internal id.
|
|
5
|
+
*
|
|
6
|
+
* This schema runs on the CUSTOMER'S machine, inside the published tool
|
|
7
|
+
* definition. That is the whole reason this ticket exists: the previous
|
|
8
|
+
* `z.array(z.number().int().positive())` refused a uuid before any request
|
|
9
|
+
* left the process, in all 10 versions published since 0.2.0, so no backend
|
|
10
|
+
* change could rescue it. Both branches are load-bearing — dropping the
|
|
11
|
+
* numeric one would break every customer still on an older version, which is
|
|
12
|
+
* exactly the population the 400-day window exists to protect.
|
|
13
|
+
*
|
|
14
|
+
* The uuid branch deliberately mirrors the BACKEND predicate
|
|
15
|
+
* (`src/common/identifiers/resource-identifier.ts:37`) character for
|
|
16
|
+
* character rather than using zod's `z.uuid()`. Zod refuses a uuid whose
|
|
17
|
+
* version or variant nibble is non-RFC; the backend accepts it on purpose,
|
|
18
|
+
* because "a predicate that refuses on the VERSION nibble makes a row
|
|
19
|
+
* unreachable by its own primary key the moment one value disagrees". A
|
|
20
|
+
* client-side validator stricter than the server is this ticket's own defect
|
|
21
|
+
* in a narrower form — a row the backend would resolve, refused on a machine
|
|
22
|
+
* we cannot redeploy.
|
|
23
|
+
*
|
|
24
|
+
* Existence is settled by the backend lookup, which is authoritative. Shape
|
|
25
|
+
* is settled here, which is not.
|
|
26
|
+
*
|
|
27
|
+
* Both cases are accepted because PostgreSQL normalises uuid case, so `018F…`
|
|
28
|
+
* and `018f…` are the same row. The class is spelled `[0-9a-fA-F]` rather than
|
|
29
|
+
* `[0-9a-f]` with the `/i` flag on purpose: this schema is converted to JSON
|
|
30
|
+
* Schema and advertised in `tools/list`, and JSON Schema `pattern` carries no
|
|
31
|
+
* case-insensitivity flag —
|
|
32
|
+
* an `/i` regex emits a lowercase-only pattern, so a client that pre-validates
|
|
33
|
+
* against the advertised schema would refuse an uppercase uuid that the zod
|
|
34
|
+
* schema and the backend both accept. Writing the class out keeps the
|
|
35
|
+
* advertised contract and the enforced one identical.
|
|
36
|
+
*/
|
|
37
|
+
const UUID_TEXT = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;
|
|
38
|
+
/**
|
|
39
|
+
* The refusal text an AI client reads before deciding what to retry with. Zod's
|
|
40
|
+
* default for the string branch is "must match pattern /^[0-9a-f]{8}…/", which
|
|
41
|
+
* names only the branch that failed and hides that a number is equally fine —
|
|
42
|
+
* so it is set on both the branch and the union.
|
|
43
|
+
*/
|
|
44
|
+
const REVIEWER_ID_ERROR = 'must be a user id — either a uuid (preferred) or a positive integer internal id';
|
|
45
|
+
const reviewerIdSchema = z.union([
|
|
46
|
+
z.number().int().positive(),
|
|
47
|
+
z.string().regex(UUID_TEXT, REVIEWER_ID_ERROR),
|
|
48
|
+
], { error: REVIEWER_ID_ERROR });
|
|
2
49
|
export function registerWriteReviewTools(server, api) {
|
|
3
50
|
server.registerTool('create_review_request', {
|
|
4
51
|
title: 'Create Review Request',
|
|
5
52
|
description: 'Request a review for a specific file version. Assigns reviewers who ' +
|
|
6
53
|
'will be notified to approve or comment on the version. ' +
|
|
7
|
-
'
|
|
8
|
-
'
|
|
54
|
+
'A reviewer ID is either the user\'s uuid (preferred) or the legacy ' +
|
|
55
|
+
'numeric internal ID — both are accepted. Read either one from the ' +
|
|
56
|
+
'rockhopper://teams/{teamId} resource, which lists each member\'s user ' +
|
|
57
|
+
'record with both an "id" (uuid) and an "internalId" (number); use it to ' +
|
|
58
|
+
'resolve platform IDs (msId / googleId) to a reviewer ID first. ' +
|
|
59
|
+
'The numeric form is accepted until 2027-09-14 and removed after — send the uuid.',
|
|
9
60
|
inputSchema: {
|
|
10
61
|
versionId: z
|
|
11
62
|
.number()
|
|
@@ -21,9 +72,12 @@ export function registerWriteReviewTools(server, api) {
|
|
|
21
72
|
.optional()
|
|
22
73
|
.describe('Optional description of what to review'),
|
|
23
74
|
reviewerIds: z
|
|
24
|
-
.array(
|
|
75
|
+
.array(reviewerIdSchema)
|
|
25
76
|
.min(1)
|
|
26
|
-
.describe('
|
|
77
|
+
.describe('User IDs of the reviewers to assign. Each entry is either the ' +
|
|
78
|
+
"user's uuid (preferred) or the legacy numeric internal ID; the " +
|
|
79
|
+
'two spellings can be mixed in one array. The numeric form is ' +
|
|
80
|
+
'accepted until 2027-09-14 and removed after.'),
|
|
27
81
|
},
|
|
28
82
|
annotations: {
|
|
29
83
|
readOnlyHint: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-reviews.js","sourceRoot":"","sources":["../../src/tools/write-reviews.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,wBAAwB,CACtC,MAAiB,EACjB,GAAc;IAEd,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACT,sEAAsE;YACtE,yDAAyD;YACzD,wEAAwE;YACxE,
|
|
1
|
+
{"version":3,"file":"write-reviews.js","sourceRoot":"","sources":["../../src/tools/write-reviews.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,SAAS,GACb,+EAA+E,CAAC;AAElF;;;;;GAKG;AACH,MAAM,iBAAiB,GACrB,iFAAiF,CAAC;AAEpF,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAC9B;IACE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAC3B,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,iBAAiB,CAAC;CAC/C,EACD,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAC7B,CAAC;AAEF,MAAM,UAAU,wBAAwB,CACtC,MAAiB,EACjB,GAAc;IAEd,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACT,sEAAsE;YACtE,yDAAyD;YACzD,qEAAqE;YACrE,oEAAoE;YACpE,wEAAwE;YACxE,0EAA0E;YAC1E,iEAAiE;YACjE,kFAAkF;QACpF,WAAW,EAAE;YACX,SAAS,EAAE,CAAC;iBACT,MAAM,EAAE;iBACR,QAAQ,CAAC,2CAA2C,CAAC;YACxD,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,GAAG,CAAC;iBACR,QAAQ,CAAC,qCAAqC,CAAC;YAClD,WAAW,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,GAAG,CAAC,IAAI,CAAC;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,wCAAwC,CAAC;YACrD,WAAW,EAAE,CAAC;iBACX,KAAK,CAAC,gBAAgB,CAAC;iBACvB,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CACP,gEAAgE;gBAC9D,iEAAiE;gBACjE,+DAA+D;gBAC/D,8CAA8C,CACjD;SACJ;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,KAAK;SACtB;KACF,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE;QACzD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,mBAAmB,CAAC;gBAC3C,SAAS;gBACT,OAAO;gBACP,WAAW;gBACX,WAAW;aACZ,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EACF,+BAA+B,MAAM,CAAC,EAAE,MAAM;4BAC9C,aAAa,MAAM,CAAC,OAAO,KAAK;4BAChC,WAAW,MAAM,CAAC,MAAM,IAAI;4BAC5B,eAAe,WAAW,CAAC,MAAM,cAAc;qBAClD;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBAC3F;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,gBAAgB;QACvB,WAAW,EACT,gEAAgE;QAClE,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;YACpE,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,CAAC,IAAI,CAAC;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,yBAAyB,CAAC;SACvC;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;SACrB;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;QAC5B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAE5D,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EACF,UAAU,MAAM,CAAC,EAAE,YAAY;4BAC/B,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;qBACtC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,sBAAsB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBACrF;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,kEAAkE;YAClE,sGAAsG;QACxG,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,CAAC,oCAAoC,CAAC;SAClD;QACD,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,IAAI;SACrB;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAC7C,gFAAgF;YAChF,mEAAmE;YACnE,IAAI,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,CAAC;gBAC/C,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,UAAU,QAAQ,qCAAqC,MAAM,CAAC,MAAM,IAAI;yBAC/E;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAEnD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EACF,UAAU,SAAS,CAAC,EAAE,eAAe;4BACrC,aAAa,SAAS,CAAC,OAAO,GAAG;qBACpC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBAC3F;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An identifier naming a `user`, `team` or `workspace` row — the three tables
|
|
3
|
+
* ENG-1966 re-keyed onto time-ordered (version 7) uuids.
|
|
4
|
+
*
|
|
5
|
+
* Both spellings name the same row on the wire, and both are accepted by the
|
|
6
|
+
* backend (`resource-identifier.ts` / `ResourceIdResolver`, backend #1717).
|
|
7
|
+
* David decided on 2026-08-10 that the numeric form is accepted for **400
|
|
8
|
+
* days** and dropped **on or after 2027-09-14** — a window set by token
|
|
9
|
+
* lifetime (the JWT `sub` claim IS the numeric user id and personal access
|
|
10
|
+
* tokens run to 365 days), not by how fast anything deploys.
|
|
11
|
+
*
|
|
12
|
+
* Prefer the uuid in new code. The numeric form stays typed here because this
|
|
13
|
+
* package ships to customers over npm and we do not control when they upgrade:
|
|
14
|
+
* narrowing it would break every caller written against a published version.
|
|
15
|
+
*/
|
|
16
|
+
export type RockhopperId = number | string;
|
|
1
17
|
export interface Team {
|
|
18
|
+
/**
|
|
19
|
+
* Version-7 uuid (ENG-1966). Optional only because a backend older than the
|
|
20
|
+
* re-key does not serve it; it is the identifier to migrate onto.
|
|
21
|
+
*/
|
|
22
|
+
id?: string;
|
|
2
23
|
internalId: number;
|
|
3
24
|
name: string;
|
|
4
25
|
description: string | null;
|
|
@@ -13,13 +34,27 @@ export interface TeamMember {
|
|
|
13
34
|
createdAt: string;
|
|
14
35
|
}
|
|
15
36
|
export interface UserSummary {
|
|
37
|
+
/**
|
|
38
|
+
* Version-7 uuid (ENG-1966) — the spelling to pass as a reviewer id.
|
|
39
|
+
* Optional only because a backend older than the re-key does not serve it.
|
|
40
|
+
*/
|
|
41
|
+
id?: string;
|
|
16
42
|
internalId: number;
|
|
17
43
|
firstName: string | null;
|
|
18
44
|
lastName: string | null;
|
|
19
45
|
email: string;
|
|
20
46
|
username: string | null;
|
|
47
|
+
/**
|
|
48
|
+
* ENG-1756: platform identity of the user — msId (Microsoft) / googleId
|
|
49
|
+
* (Google). `/users/me` serializes both; the CLI uses whichever is set as
|
|
50
|
+
* the `X-Driving-Human` value on agent writes (decision 15).
|
|
51
|
+
*/
|
|
52
|
+
msId?: string | null;
|
|
53
|
+
googleId?: string | null;
|
|
21
54
|
}
|
|
22
55
|
export interface Workspace {
|
|
56
|
+
/** Version-7 uuid (ENG-1966). Optional: older backends do not serve it. */
|
|
57
|
+
id?: string;
|
|
23
58
|
internalId: number;
|
|
24
59
|
workspaceDescription: string | null;
|
|
25
60
|
enrolledFiles: EnrolledFile[];
|
|
@@ -118,6 +153,16 @@ export interface CellHistoryEntry {
|
|
|
118
153
|
value: unknown;
|
|
119
154
|
changedBy: string | null;
|
|
120
155
|
changedAt: string;
|
|
156
|
+
/** Post-change formula (the ledger `f` facet). */
|
|
157
|
+
formula?: string | null;
|
|
158
|
+
/** Raw ledger provenance (`human_direct`, `ai_auto`, `reconcile_repair`…). */
|
|
159
|
+
provenance?: string;
|
|
160
|
+
/** Raw actor kind (`human`, `agent`, …). */
|
|
161
|
+
actorKind?: string | null;
|
|
162
|
+
/** Resolved human who drove an agent edit (P1-8). */
|
|
163
|
+
drivingHuman?: string | null;
|
|
164
|
+
/** Backend-rendered line: `vX.Y.Z: <value> — <provenance> (driven by <human>) — <ts>`. */
|
|
165
|
+
formatted?: string;
|
|
121
166
|
}
|
|
122
167
|
export interface ReviewActivity {
|
|
123
168
|
id: number;
|
|
@@ -125,4 +170,17 @@ export interface ReviewActivity {
|
|
|
125
170
|
createdAt: string;
|
|
126
171
|
user?: UserSummary;
|
|
127
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* `GET /file-versions/file/:fileMsId/fold-status` (KI-1399) — the backend's
|
|
175
|
+
* authoritative queue read. Plan 02 ruling 5 uses it as the completeness
|
|
176
|
+
* precondition for every change-history surface here.
|
|
177
|
+
*/
|
|
178
|
+
export interface FoldStatus {
|
|
179
|
+
fileMsId?: string;
|
|
180
|
+
/** True while a commit-diff fold is queued, retrying or running. */
|
|
181
|
+
foldPending: boolean;
|
|
182
|
+
/** Version the pending fold will rewrite the window for; null when none. */
|
|
183
|
+
foldTargetVersionId: number | null;
|
|
184
|
+
checkedAt?: string;
|
|
185
|
+
}
|
|
128
186
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|