Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
6500d56
feat(plugins): load directory plugins that generate, present, search,…
jasper-yl Nov 12, 2026
45a20ee
feat(plugins): give each plugin a scaling group of host processes and…
jasper-yl Nov 13, 2026
ac19e83
build(integrations): rebuild plugin bundles from the current operatio…
jasper-yl Nov 13, 2026
72bcf5b
fix(plugins): require the caller's artifact.write for tag, handle, an…
jasper-yl Nov 14, 2026
22fadfe
fix(plugins): enforce the caller's revisions inside user-change write…
jasper-yl Nov 14, 2026
91989f7
docs(develop): state the revision and permission checks core enforces…
jasper-yl Nov 14, 2026
b913b72
fix(archive): restore Artifact revisions exported by released versions
jasper-yl Nov 14, 2026
2c9adbe
build(integrations): regenerate Dify, Desktop IPC, and the access aud…
jasper-yl Nov 14, 2026
90caf8f
fix(api): describe built-in-or-plugin Artifact request bodies with anyOf
jasper-yl Nov 14, 2026
98324a4
build(desktop): regenerate the contract identity for the anyOf Artifa…
jasper-yl Nov 14, 2026
2d9d9e9
build(deps): relock the Bub harness and evaluation projects for tzlocal
jasper-yl Nov 14, 2026
baa391f
build(dify): regenerate the contract for the anyOf Artifact request b…
jasper-yl Nov 14, 2026
3779a89
test(api): expect anyOf for the built-in-or-plugin Artifact create body
jasper-yl Nov 14, 2026
ff04afd
test: expect the client's omitted plugin search fields in the Bub har…
jasper-yl Nov 14, 2026
2fa44d8
fix(plugins): follow master's move of access control into the built-i…
jasper-yl Nov 14, 2026
2c4519f
build: regenerate the Desktop contract identity and review persistenc…
jasper-yl Nov 14, 2026
3427cee
build(integrations): rebuild the DSH pet bundle from the plugin opera…
jasper-yl Nov 14, 2026
407b2cd
test(desktop): qualify the plugin interfaces contract
jasper-yl Nov 14, 2026
546a5e0
feat(plugins): reload changed plugin directories, upgrade plugin data…
jasper-yl Nov 13, 2026
7f6cd1e
chore(release): review the plugin profile unregistration for upgrade …
jasper-yl Nov 13, 2026
8b24d7c
fix(plugins): keep version snapshot directories deletable
jasper-yl Nov 13, 2026
e747e94
build(integrations): rebuild plugin bundles with the plugin route des…
jasper-yl Nov 13, 2026
7022449
build(desktop): regenerate the contract identity after rebasing onto …
jasper-yl Nov 14, 2026
069edca
test(bub): classify the plugin route description operation in the acc…
jasper-yl Nov 14, 2026
983924a
fix(plugins): import the plugin access profile helpers from the built…
jasper-yl Nov 14, 2026
dd75d91
build: regenerate the Desktop contract identity and review persistenc…
jasper-yl Nov 14, 2026
8effced
build(integrations): rebuild the DSH pet bundle with the plugin route…
jasper-yl Nov 14, 2026
ab7b36d
test(desktop): qualify the plugin reload contract
jasper-yl Nov 14, 2026
1255054
feat(sources): collect with Source plugins through the Server's runne…
jasper-yl Nov 13, 2026
a6acd15
fix(sources): keep the device runner free of server dependencies and …
jasper-yl Nov 13, 2026
99e0e4d
build: regenerate the Desktop contract identity and classify Source r…
jasper-yl Nov 14, 2026
006e9d9
test(bub): classify the Source runner listing and sync in the access …
jasper-yl Nov 14, 2026
297efd7
fix(sources): use the built-in runtime's worker security in the colle…
jasper-yl Nov 14, 2026
055199c
build: regenerate the Desktop contract identity and review persistenc…
jasper-yl Nov 14, 2026
c90fd01
build(integrations): rebuild the DSH bundles from the Source collecti…
jasper-yl Nov 14, 2026
01d7ce8
test(desktop): qualify the Source plugins contract
jasper-yl Nov 14, 2026
c9aecfa
fix(dashboard): close the navigation group loop and list plugin pages…
jasper-yl Nov 14, 2026
737484d
feat(dashboard): show a loading indicator until a plugin page has loaded
jasper-yl Nov 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 94 additions & 0 deletions desktop/VALIDATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -3432,3 +3432,97 @@ profiles retain their original source, contract, artifact and evidence identitie
This is local SQLite protocol qualification, not an installed WebView or
credential-persistence test, other-platform qualification, external database
deployment, gateway transport acceptance, or release approval.


## Server 3427cee7 plugin interfaces protocol qualification

`sqlite-plugin-interfaces-3427cee7-v1` qualifies all thirteen Desktop protocol operations against
Server source `3427cee715b00e7c054f2855afaff8142d624dde`, which adds directory plugins, removes the
managed Artifact plugin framework, and describes built-in-or-plugin Artifact create and replace
bodies with `anyOf`.

- Normalized OpenAPI SHA-256: `6e532edd31a2d4ebb632c1a1aae87826a4013f0c92d6fda1d1c53b08a8c1b70b`.
- Wheel: `powercontext-1.5.2.dev163+g3427cee71-py3-none-any.whl`.
- Wheel SHA-256: `b63c19dfc6a58de15de142f051185178943a6566ee738d1abe8dad205e0479f6`.
- Native debug probe SHA-256 (built without debug info): `fe29a7d6426a2062b4bd1d950741761f2a526f23960a3bd0a8141a29c28b454a`.

On 2026-11-14, Linux 7.0 x86_64 (Ubuntu 24.04, glibc 2.39) and Python 3.12.3 passed anonymous loopback,
static Bearer, HTTPS with explicit CA/base path, and enforced Provider modes of the unchanged
`desktop/tests/real_server.py` through the ordinary product ConnectionManager. The probe was built with
the product Cargo lock without `ci-fixtures` and selected this bundled qualification; the client and
qualified contract digests are identical. `bundled_product_qualification_covers_every_desktop_operation`
passed against the same records. The wheel and report are retained under ignored
`desktop/.artifacts/plugin-interfaces/` and `desktop/.artifacts/real-server.json`.
This qualifies the observed local SQLite protocol; it does not establish installed WebView, native
credential persistence, other operating systems, native database upgrades or release acceptance.

Reproduce against the recorded artifact:

```sh
cargo build --locked --manifest-path desktop/src-tauri/Cargo.toml --example server_probe
uv run --no-sync python desktop/tests/real_server.py \
--product-qualification sqlite-plugin-interfaces-3427cee7-v1 \
--wheel desktop/.artifacts/plugin-interfaces/powercontext-1.5.2.dev163+g3427cee71-py3-none-any.whl
```


## Server 8effcedd plugin reload protocol qualification

`sqlite-plugin-reload-8effcedd-v1` qualifies all thirteen Desktop protocol operations against
Server source `8effceddefa0c431554288d1b7f439868686c3fb`, which reloads plugin directories, describes
plugin routes, and adds version fields to the plugin listing.

- Normalized OpenAPI SHA-256: `ad0fa0e1209f2dc60935416ae8d54826335b82b35b81c999e3ae77a21325f0ef`.
- Wheel: `powercontext-1.5.2.dev173+g8effcedde-py3-none-any.whl`.
- Wheel SHA-256: `605e1d795c7ec2779ccf83070f9478a1e8c2f45bedffb078b974ed03b1d835d7`.
- Native debug probe SHA-256 (built without debug info): `1e0302e3e55c68059eb3fdbe60ad4638b61319bc8ef0e825d4f94302e89ca566`.

On 2026-11-14, Linux 7.0 x86_64 (Ubuntu 24.04, glibc 2.39) and Python 3.12.3 passed anonymous loopback,
static Bearer, HTTPS with explicit CA/base path, and enforced Provider modes of the unchanged
`desktop/tests/real_server.py` through the ordinary product ConnectionManager. The probe was built with
the product Cargo lock without `ci-fixtures` and selected this bundled qualification; the client and
qualified contract digests are identical. `bundled_product_qualification_covers_every_desktop_operation`
passed against the same records. The wheel and report are retained under ignored
`desktop/.artifacts/plugin-reload/` and `desktop/.artifacts/real-server.json`.
This qualifies the observed local SQLite protocol; it does not establish installed WebView, native
credential persistence, other operating systems, native database upgrades or release acceptance.

Reproduce against the recorded artifact:

```sh
cargo build --locked --manifest-path desktop/src-tauri/Cargo.toml --example server_probe
uv run --no-sync python desktop/tests/real_server.py \
--product-qualification sqlite-plugin-reload-8effcedd-v1 \
--wheel desktop/.artifacts/plugin-reload/powercontext-1.5.2.dev173+g8effcedde-py3-none-any.whl
```


## Server c90fd018 Source plugins protocol qualification

`sqlite-source-plugins-c90fd018-v1` qualifies all thirteen Desktop protocol operations against
Server source `c90fd0182dbf726ea6e0d0b9ccb5c4dc3a3d288b`, which adds Source plugin collection runners and
targets and removes the Source management operations.

- Normalized OpenAPI SHA-256: `6ac08e129deb33a55e59c618005dfc14ac5a1df4d1df31b94e669e89dd314e40`.
- Wheel: `powercontext-1.5.2.dev181+gc90fd0182-py3-none-any.whl`.
- Wheel SHA-256: `3593d8fcda89d620414ad65dc628c70edb38c0a9d8450b3aa5e6d7865f3134d0`.
- Native debug probe SHA-256 (built without debug info): `edb3cf2828f9f91bf5962eefe5ac123bb95d401a1553003840aadc4d0e5fe521`.

On 2026-11-14, Linux 7.0 x86_64 (Ubuntu 24.04, glibc 2.39) and Python 3.12.3 passed anonymous loopback,
static Bearer, HTTPS with explicit CA/base path, and enforced Provider modes of the unchanged
`desktop/tests/real_server.py` through the ordinary product ConnectionManager. The probe was built with
the product Cargo lock without `ci-fixtures` and selected this bundled qualification; the client and
qualified contract digests are identical. `bundled_product_qualification_covers_every_desktop_operation`
passed against the same records. The wheel and report are retained under ignored
`desktop/.artifacts/source-plugins/` and `desktop/.artifacts/real-server.json`.
This qualifies the observed local SQLite protocol; it does not establish installed WebView, native
credential persistence, other operating systems, native database upgrades or release acceptance.

Reproduce against the recorded artifact:

```sh
cargo build --locked --manifest-path desktop/src-tauri/Cargo.toml --example server_probe
uv run --no-sync python desktop/tests/real_server.py \
--product-qualification sqlite-source-plugins-c90fd018-v1 \
--wheel desktop/.artifacts/source-plugins/powercontext-1.5.2.dev181+gc90fd0182-py3-none-any.whl
```
66 changes: 66 additions & 0 deletions desktop/src-tauri/src/connections/compatibility.json
Original file line number Diff line number Diff line change
Expand Up @@ -1684,5 +1684,71 @@
"search_memory"
],
"evidence": "desktop/VALIDATION.md#server-a211ba84-merged-gateway-contract-protocol-qualification"
},
{
"id": "sqlite-plugin-interfaces-3427cee7-v1",
"serverCommit": "3427cee715b00e7c054f2855afaff8142d624dde",
"contractSha256": "6e532edd31a2d4ebb632c1a1aae87826a4013f0c92d6fda1d1c53b08a8c1b70b",
"artifactSha256": "b63c19dfc6a58de15de142f051185178943a6566ee738d1abe8dad205e0479f6",
"operations": [
"get_access_principal",
"get_artifact_revision",
"get_capabilities",
"get_connection_identity",
"get_default_scope",
"get_liveness",
"get_readiness",
"get_scope",
"get_server_info",
"get_stats",
"list_scopes",
"remember_memory",
"search_memory"
],
"evidence": "desktop/VALIDATION.md#server-3427cee7-plugin-interfaces-protocol-qualification"
},
{
"id": "sqlite-plugin-reload-8effcedd-v1",
"serverCommit": "8effceddefa0c431554288d1b7f439868686c3fb",
"contractSha256": "ad0fa0e1209f2dc60935416ae8d54826335b82b35b81c999e3ae77a21325f0ef",
"artifactSha256": "605e1d795c7ec2779ccf83070f9478a1e8c2f45bedffb078b974ed03b1d835d7",
"operations": [
"get_access_principal",
"get_artifact_revision",
"get_capabilities",
"get_connection_identity",
"get_default_scope",
"get_liveness",
"get_readiness",
"get_scope",
"get_server_info",
"get_stats",
"list_scopes",
"remember_memory",
"search_memory"
],
"evidence": "desktop/VALIDATION.md#server-8effcedd-plugin-reload-protocol-qualification"
},
{
"id": "sqlite-source-plugins-c90fd018-v1",
"serverCommit": "c90fd0182dbf726ea6e0d0b9ccb5c4dc3a3d288b",
"contractSha256": "6ac08e129deb33a55e59c618005dfc14ac5a1df4d1df31b94e669e89dd314e40",
"artifactSha256": "3593d8fcda89d620414ad65dc628c70edb38c0a9d8450b3aa5e6d7865f3134d0",
"operations": [
"get_access_principal",
"get_artifact_revision",
"get_capabilities",
"get_connection_identity",
"get_default_scope",
"get_liveness",
"get_readiness",
"get_scope",
"get_server_info",
"get_stats",
"list_scopes",
"remember_memory",
"search_memory"
],
"evidence": "desktop/VALIDATION.md#server-c90fd018-source-plugins-protocol-qualification"
}
]
2 changes: 1 addition & 1 deletion desktop/src-tauri/src/transport/operations.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"contractSha256": "382b67847c63cf8cdd6561a85053ddf1bde2673a03934e03f208dde6b8430acc",
"contractSha256": "6ac08e129deb33a55e59c618005dfc14ac5a1df4d1df31b94e669e89dd314e40",
"operations": {
"get_liveness": {
"method": "GET",
Expand Down
57 changes: 0 additions & 57 deletions desktop/src-tauri/src/transport/wire.rs
Original file line number Diff line number Diff line change
Expand Up @@ -444,16 +444,6 @@ pub struct ArtifactRevision {
pub family: String,
#[serde(rename = "artifact_id")]
pub artifact_id: String,
/// Persisted schema version for a custom Artifact family.
#[ts(optional)]
#[ts(type = "string | null")]
#[serde(
rename = "schema_version",
default,
with = "::serde_with::rust::double_option",
skip_serializing_if = "Option::is_none"
)]
pub schema_version: Option<Option<String>>,
#[serde(rename = "revision")]
pub revision: i64,
#[ts(type = "Record<string, unknown>")]
Expand Down Expand Up @@ -523,7 +513,6 @@ impl ArtifactRevision {
scope_id,
family,
artifact_id,
schema_version: None,
revision,
content,
sources,
Expand Down Expand Up @@ -872,12 +861,6 @@ impl CandidateInventoryStatistics {
#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize, TS)]
#[serde(deny_unknown_fields)]
pub struct Capabilities {
#[ts(optional)]
#[serde(
rename = "custom_artifact_schemas",
skip_serializing_if = "Option::is_none"
)]
pub custom_artifact_schemas: Option<Vec<CustomArtifactFamilySchema>>,
#[ts(optional)]
#[serde(rename = "prompts", skip_serializing_if = "Option::is_none")]
pub prompts: Option<std::collections::HashMap<String, PromptCapability>>,
Expand Down Expand Up @@ -946,7 +929,6 @@ impl Capabilities {
context_versions: Vec<PreparedContextSchema>,
) -> Capabilities {
Capabilities {
custom_artifact_schemas: None,
prompts: None,
artifact_dreaming: None,
artifact_dreaming_operations: None,
Expand Down Expand Up @@ -1109,44 +1091,6 @@ impl ContractVersion {
}
}

#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize, TS)]
#[serde(deny_unknown_fields)]
pub struct CustomArtifactFamilySchema {
#[serde(rename = "family")]
pub family: String,
#[serde(rename = "schema_version")]
pub schema_version: String,
#[ts(type = "Record<string, unknown>")]
#[serde(rename = "content_schema")]
pub content_schema: std::collections::HashMap<String, serde_json::Value>,
/// Legacy persisted text fields; new plugins use search.
#[serde(rename = "search_fields")]
pub search_fields: Vec<String>,
/// Persistent declarative indexes and supported search modes.
#[ts(type = "Record<string, unknown>")]
#[ts(optional)]
#[serde(rename = "search", skip_serializing_if = "Option::is_none")]
pub search: Option<std::collections::HashMap<String, serde_json::Value>>,
}

impl CustomArtifactFamilySchema {
#[allow(clippy::too_many_arguments)]
pub fn new(
family: String,
schema_version: String,
content_schema: std::collections::HashMap<String, serde_json::Value>,
search_fields: Vec<String>,
) -> CustomArtifactFamilySchema {
CustomArtifactFamilySchema {
family,
schema_version,
content_schema,
search_fields,
search: None,
}
}
}

#[derive(
Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize, TS, Default,
)]
Expand Down Expand Up @@ -3046,7 +2990,6 @@ pub fn declarations(config: &ts_rs::Config) -> Vec<String> {
<ContextProtectionCapabilities as ts_rs::TS>::decl(config),
<ContextProtectionCapabilitiesLimits as ts_rs::TS>::decl(config),
<ContractVersion as ts_rs::TS>::decl(config),
<CustomArtifactFamilySchema as ts_rs::TS>::decl(config),
<DreamOperation as ts_rs::TS>::decl(config),
<Effect as ts_rs::TS>::decl(config),
<ExactScopeSelection as ts_rs::TS>::decl(config),
Expand Down
Loading
Loading