Skip to content

Commit e16e7d9

Browse files
authored
Merge pull request #127 from KelvinTegelaar/master
[pull] master from KelvinTegelaar:master
2 parents 19d1050 + e02ac37 commit e16e7d9

70 files changed

Lines changed: 5196 additions & 199 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Config/DocsPublishedPages.txt

Lines changed: 431 additions & 0 deletions
Large diffs are not rendered by default.

Config/DocsSynonyms.json

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
{
2+
"_comment": "Query-expansion map for the SearchDocs MCP tool (Find-CippDoc). Keys are matched against the caller's query after tokenisation and stemming, so write them as ordinary words; the loader stems them. Values are expansion phrases scored at a damped weight, which is what lets a search for 'CA policy' reach pages that only ever say 'conditional access'. This is where most of the perceived semantic behaviour comes from without an embedding model, so it is worth extending whenever a real search misses.",
3+
"expansions": {
4+
"ca": ["conditional access policy"],
5+
"mfa": ["multifactor authentication", "multi factor"],
6+
"2fa": ["multifactor authentication"],
7+
"sso": ["single sign on", "saml", "identity provider"],
8+
"gdap": ["granular delegated admin privileges", "delegated access", "relationship"],
9+
"dap": ["delegated admin privileges"],
10+
"sam": ["secure application model", "service account", "application registration"],
11+
"bec": ["business email compromise", "compromise remediation", "indicators of compromise"],
12+
"bpa": ["best practice analyser", "report builder"],
13+
"cis": ["compliance benchmark test"],
14+
"spf": ["domain analyser", "email authentication", "dns record"],
15+
"dkim": ["domain analyser", "email authentication", "dns record"],
16+
"dmarc": ["domain analyser", "email authentication", "dns record"],
17+
"dns": ["domain analyser", "domain health"],
18+
"offboard": ["offboarding user removal"],
19+
"onboard": ["onboarding tenant setup wizard"],
20+
"standard": ["drift remediation baseline template"],
21+
"drift": ["standards deviation baseline"],
22+
"alert": ["alerting notification webhook"],
23+
"tenant": ["customer client organisation"],
24+
"intune": ["endpoint manager device management"],
25+
"autopilot": ["device enrolment provisioning"],
26+
"defender": ["security threat protection antivirus"],
27+
"exchange": ["exchange online mailbox email"],
28+
"exo": ["exchange online"],
29+
"spam": ["spamfilter quarantine mail flow"],
30+
"quarantine": ["spamfilter released message"],
31+
"mailbox": ["exchange mailbox permissions shared"],
32+
"license": ["licence sku subscription assignment"],
33+
"licence": ["license sku subscription assignment"],
34+
"sku": ["license subscription"],
35+
"role": ["permission access rbac custom role"],
36+
"permission": ["role access rbac consent"],
37+
"rbac": ["role based access control permission"],
38+
"log": ["audit log logbook activity history"],
39+
"audit": ["log logbook activity history"],
40+
"webhook": ["notification alert subscription"],
41+
"psa": ["integration halo autotask connectwise"],
42+
"rmm": ["integration ninja datto syncro"],
43+
"backup": ["restore recovery export"],
44+
"restore": ["backup recovery import"],
45+
"template": ["policy blueprint preset"],
46+
"policy": ["template configuration profile"],
47+
"group": ["distribution list security group team"],
48+
"user": ["account identity member"],
49+
"password": ["credential reset passwordless authentication method"],
50+
"device": ["endpoint computer workstation managed device"],
51+
"app": ["application enterprise application service principal"],
52+
"application": ["app enterprise application service principal"],
53+
"sharepoint": ["onedrive site document library"],
54+
"onedrive": ["sharepoint site storage"],
55+
"teams": ["team channel meeting collaboration"],
56+
"report": ["reporting export dashboard analytics"],
57+
"dashboard": ["overview home report"],
58+
"scheduler": ["scheduled task recurring job cron"],
59+
"queue": ["scheduled task job processing"],
60+
"error": ["troubleshooting failure issue problem"],
61+
"fail": ["troubleshooting error issue problem"],
62+
"troubleshoot": ["error failure diagnostic issue"],
63+
"install": ["deployment setup provisioning"],
64+
"deploy": ["installation setup provisioning"],
65+
"upgrade": ["update version migration"],
66+
"update": ["upgrade version release"],
67+
"api": ["endpoint integration rest client"],
68+
"mcp": ["model context protocol tool integration"],
69+
"copilot": ["microsoft copilot ai"],
70+
"hosted": ["cyberdrain hosted managed instance sponsor"],
71+
"selfhost": ["self hosted azure deployment"],
72+
"azure": ["subscription resource group function app"],
73+
"graph": ["microsoft graph api request"]
74+
}
75+
}

Config/openapi.json

Lines changed: 143 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4670,10 +4670,20 @@
46704670
}
46714671
},
46724672
"TemplateGuid": {
4673-
"type": "string"
4673+
"type": "string",
4674+
"description": "The deploy drawer and wizard send the chosen row's GUID as TemplateList.value, not as TemplateID. Template display names are not unique - re-imports create same-named twins - so resolving by display name below can land on a different row than the one the user picked. The selected RowKey must win whenever the request carries one. String rather than Guid: built-in templates are stored with their filename as RowKey."
46744675
},
46754676
"TemplateID": {
4676-
"type": "string"
4677+
"type": "string",
4678+
"description": "The deploy drawer and wizard send the chosen row's GUID as TemplateList.value, not as TemplateID. Template display names are not unique - re-imports create same-named twins - so resolving by display name below can land on a different row than the one the user picked. The selected RowKey must win whenever the request carries one. String rather than Guid: built-in templates are stored with their filename as RowKey."
4679+
},
4680+
"TemplateList": {
4681+
"allOf": [
4682+
{
4683+
"$ref": "#/components/schemas/LabelValue"
4684+
}
4685+
],
4686+
"description": "The deploy drawer and wizard send the chosen row's GUID as TemplateList.value, not as TemplateID. Template display names are not unique - re-imports create same-named twins - so resolving by display name below can land on a different row than the one the user picked. The selected RowKey must win whenever the request carries one. String rather than Guid: built-in templates are stored with their filename as RowKey."
46774687
},
46784688
"TemplateType": {
46794689
"type": "string"
@@ -38916,6 +38926,86 @@
3891638926
"x-cipp-role": "CIPP.Core.Read"
3891738927
}
3891838928
},
38929+
"/api/ListCippDocs": {
38930+
"get": {
38931+
"summary": "Search the CIPP documentation, or fetch one documentation page in full.",
38932+
"operationId": "ListCippDocs",
38933+
"tags": [
38934+
"CIPP > Core"
38935+
],
38936+
"description": "Searches the GitBook documentation shipped with this build and returns matching sections,\neach with an excerpt and links back to docs.cipp.app and to the file on GitHub. Pages under\nuser-documentation also report the CIPP route they document, so a screen can be traced to\nits docs and back.\n\nPass path on its own to list the pages under a documentation subtree or a CIPP route, or\nwith full=true to return one page's entire text. This backs the SearchDocs and GetDoc MCP\ntools and is available to the UI and API clients on the same terms.",
38937+
"parameters": [
38938+
{
38939+
"name": "full",
38940+
"in": "query",
38941+
"description": "Return the whole page rather than matching sections. Requires path.",
38942+
"required": false,
38943+
"schema": {
38944+
"type": "string"
38945+
}
38946+
},
38947+
{
38948+
"name": "limit",
38949+
"in": "query",
38950+
"description": "Maximum results to return (default 8, max 25).",
38951+
"required": false,
38952+
"schema": {
38953+
"type": "string"
38954+
}
38955+
},
38956+
{
38957+
"name": "path",
38958+
"in": "query",
38959+
"description": "A documentation subtree ('user-documentation/identity') or a CIPP route ('/identity/administration/users').",
38960+
"required": true,
38961+
"schema": {
38962+
"type": "string"
38963+
}
38964+
},
38965+
{
38966+
"name": "query",
38967+
"in": "query",
38968+
"description": "Keywords or a plain-language question, e.g. 'how do I set up GDAP'.",
38969+
"required": false,
38970+
"schema": {
38971+
"type": "string"
38972+
}
38973+
}
38974+
],
38975+
"responses": {
38976+
"200": {
38977+
"description": "Success",
38978+
"content": {
38979+
"application/json": {
38980+
"schema": {
38981+
"type": "array",
38982+
"items": {
38983+
"type": "object",
38984+
"description": "Not described statically: this endpoint returns the upstream response as-is, so its fields are determined by the upstream API rather than by CIPP. Call the endpoint to see the actual shape, or add a response schema in backend/Config/openapi-overrides."
38985+
}
38986+
}
38987+
}
38988+
}
38989+
},
38990+
"401": {
38991+
"description": "Unauthorized - invalid or missing bearer token"
38992+
},
38993+
"403": {
38994+
"description": "Forbidden - caller lacks the required RBAC role"
38995+
},
38996+
"500": {
38997+
"description": "Internal server error"
38998+
}
38999+
},
39000+
"security": [
39001+
{
39002+
"bearerAuth": []
39003+
}
39004+
],
39005+
"x-cipp-role": "CIPP.Core.Read",
39006+
"x-cipp-any-tenant": true
39007+
}
39008+
},
3891939009
"/api/ListCippQueue": {
3892039010
"get": {
3892139011
"summary": "ListCippQueue",
@@ -46309,21 +46399,24 @@
4630946399
"type": "object",
4631046400
"description": "Derived from the fields written into the storage table it reads, and the fields the endpoint selects onto each record, and the columns the CIPP UI renders. Fields taken from the storage writers may be omitted by this endpoint, and the response may carry computed fields not listed here.",
4631146401
"properties": {
46402+
"corrupt": {
46403+
"x-cipp-field-source": "backend"
46404+
},
4631246405
"description": {
46313-
"x-cipp-field-source": "frontend"
46406+
"x-cipp-field-source": "backend,frontend"
4631446407
},
4631546408
"displayName": {
46316-
"x-cipp-field-source": "frontend"
46409+
"x-cipp-field-source": "backend,frontend"
4631746410
},
4631846411
"ETag": {
4631946412
"type": "string",
4632046413
"x-cipp-field-source": "storage"
4632146414
},
4632246415
"guid": {
46323-
"x-cipp-field-source": "storage"
46416+
"x-cipp-field-source": "storage,backend"
4632446417
},
4632546418
"isSynced": {
46326-
"x-cipp-field-source": "frontend"
46419+
"x-cipp-field-source": "backend,frontend"
4632746420
},
4632846421
"JSON": {
4632946422
"x-cipp-field-source": "storage"
@@ -46332,7 +46425,7 @@
4633246425
"x-cipp-field-source": "backend"
4633346426
},
4633446427
"package": {
46335-
"x-cipp-field-source": "storage,frontend"
46428+
"x-cipp-field-source": "storage,backend,frontend"
4633646429
},
4633746430
"PartitionKey": {
4633846431
"x-cipp-field-source": "storage"
@@ -46348,7 +46441,7 @@
4634846441
"x-cipp-field-source": "storage"
4634946442
},
4635046443
"source": {
46351-
"x-cipp-field-source": "storage"
46444+
"x-cipp-field-source": "storage,backend"
4635246445
},
4635346446
"templateCount": {
4635446447
"x-cipp-field-source": "backend"
@@ -49144,6 +49237,48 @@
4914449237
"x-cipp-role": "Tenant.Relationship.Read"
4914549238
}
4914649239
},
49240+
"/api/ListPartnerTenantInfo": {
49241+
"get": {
49242+
"summary": "ListPartnerTenantInfo",
49243+
"operationId": "ListPartnerTenantInfo",
49244+
"tags": [
49245+
"CIPP > Core"
49246+
],
49247+
"description": "Reports whether the CIPP host tenant is a Microsoft Partner tenant, so the frontend can\ndecide whether partner-only flows (GDAP onboarding, reseller invites, GDAP permission\nchecks) apply to this instance.\n\nMarked AnyTenant deliberately. This answers a question about the CIPP instance, not\nabout a tenant the caller wants to act on, and Get-CippPartnerTenantInfo pins the lookup\nto $env:TenantID. Without the flag, Test-CIPPAccess falls back to $env:TenantID as the\ntenant filter and denies any custom role that blocks the partner tenant, which silently\ngreys out partner-only UI for roles that are otherwise fully permitted.",
49248+
"responses": {
49249+
"200": {
49250+
"description": "Success",
49251+
"content": {
49252+
"application/json": {
49253+
"schema": {
49254+
"type": "array",
49255+
"items": {
49256+
"type": "object",
49257+
"description": "Not described statically: this endpoint returns the upstream response as-is, so its fields are determined by the upstream API rather than by CIPP. Call the endpoint to see the actual shape, or add a response schema in backend/Config/openapi-overrides."
49258+
}
49259+
}
49260+
}
49261+
}
49262+
},
49263+
"401": {
49264+
"description": "Unauthorized - invalid or missing bearer token"
49265+
},
49266+
"403": {
49267+
"description": "Forbidden - caller lacks the required RBAC role"
49268+
},
49269+
"500": {
49270+
"description": "Internal server error"
49271+
}
49272+
},
49273+
"security": [
49274+
{
49275+
"bearerAuth": []
49276+
}
49277+
],
49278+
"x-cipp-role": "CIPP.Core.Read",
49279+
"x-cipp-any-tenant": true
49280+
}
49281+
},
4914749282
"/api/ListPendingWebhooks": {
4914849283
"get": {
4914949284
"summary": "ListPendingWebhooks",
2.5 KB
Binary file not shown.

Modules/AzBobbyTables/3.6.2/AzBobbyTables.psd1

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ CmdletsToExport = @(
7575
'Remove-AzDataTableEntity'
7676
'Remove-AzDataTableLargeEntity'
7777
'Update-AzDataTableEntity'
78+
'Update-AzDataTableLargeEntity'
7879
'New-AzDataTableContext'
7980
'Remove-AzDataTable'
8081
'New-AzDataTable'

Modules/AzBobbyTables/3.6.2/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ The format is based on and uses the types of changes according to [Keep a Change
77
### Added
88

99
- Added `Add-AzDataTableLargeEntity`, `Get-AzDataTableLargeEntity` and `Remove-AzDataTableLargeEntity` for working with entities that exceed the Azure Table Storage size limits (64 KiB per string property, 1 MiB per entity). Oversized string properties are split into chunk properties recorded in a `SplitOverProps` JSON manifest, and entities that are still too large are distributed over multiple rows marked with `OriginalEntityId` and `PartIndex`; reads reassemble the original entity transparently and removes delete all part rows. The existing entity cmdlets are unaffected.
10+
- Added `Update-AzDataTableLargeEntity` for updating entities that exceed the Azure Table Storage size limits. Unlike the upsert operation types of `Add-AzDataTableLargeEntity`, entities that do not exist cause an error instead of being created. `UpdateReplace` rewrites the logical entity and removes part rows the new version no longer uses; `UpdateMerge` merges a plain single-row entity in place, and reads, merges and rewrites entities that were split for size, since merging onto physical rows directly would corrupt reassembly.
1011

1112
### Fixed
1213

1314
- `Get-AzDataTableEntity` no longer fails with `400 InvalidInput` when `-First` is given a value above 1000. The page-size hint introduced in 3.6.1 was passed to the service unclamped, and Azure Table Storage rejects a page size over its limit of 1000 rather than capping it. The hint is now clamped to that limit. Results are unchanged: the hint only sizes each page, so requests for more than 1000 entities are served by paging, as they were before 3.6.1.
15+
- `Update-AzDataTableEntity` no longer creates entities that do not exist when called with `-Force` or with entities that carry no ETag. Batched update actions were submitted without an `If-Match` header in those cases, which the table service treats as an insert-or-merge. Update actions now always carry `If-Match` (`*` when no ETag applies), matching the non-batched path and the documented behavior.
1416

1517
## [3.6.1] - 2026-07-29
1618

Binary file not shown.

0 commit comments

Comments
 (0)