diff --git a/plugin/wasmguest/caps/caps_roundtrip_test.go b/plugin/wasmguest/caps/caps_roundtrip_test.go
index b27c3a4..90b5f12 100644
--- a/plugin/wasmguest/caps/caps_roundtrip_test.go
+++ b/plugin/wasmguest/caps/caps_roundtrip_test.go
@@ -742,6 +742,127 @@ func TestCapabilityRoundTrip(t *testing.T) {
}
},
},
+ // --- remaining provisioner methods (WO-WZ-019) ---
+ {
+ name: "provisioner_ensure_data_table", wantMethod: "provisioner.ensure_data_table",
+ resp: &abiv1.ProvisionerEnsureDataTableResponse{},
+ run: func(t *testing.T, cs plugin.CoreServices) {
+ err := cs.Provisioner.EnsureDataTable(plugin.DataTableConfig{
+ Key: "playgrounds", Name: "Playgrounds", Description: "d",
+ Schema: []byte(`{"fields":[]}`), PrimaryKey: "id",
+ })
+ if err != nil {
+ t.Fatal(err)
+ }
+ },
+ },
+ {
+ name: "provisioner_ensure_setting", wantMethod: "provisioner.ensure_setting",
+ resp: &abiv1.ProvisionerEnsureSettingResponse{},
+ run: func(t *testing.T, cs plugin.CoreServices) {
+ if err := cs.Provisioner.EnsureSetting("review_dimensions", map[string]any{"max": float64(5)}); err != nil {
+ t.Fatal(err)
+ }
+ },
+ },
+ {
+ name: "provisioner_override_site_settings", wantMethod: "provisioner.override_site_settings",
+ resp: &abiv1.ProvisionerOverrideSiteSettingsResponse{},
+ run: func(t *testing.T, cs plugin.CoreServices) {
+ if err := cs.Provisioner.OverrideSiteSettings(map[string]any{"default_template": "homepage"}); err != nil {
+ t.Fatal(err)
+ }
+ },
+ },
+ {
+ name: "provisioner_register_embedding_config", wantMethod: "provisioner.register_embedding_config",
+ resp: &abiv1.ProvisionerRegisterEmbeddingConfigResponse{},
+ run: func(t *testing.T, cs plugin.CoreServices) {
+ err := cs.Provisioner.RegisterEmbeddingConfig(plugin.EmbeddingConfigDef{
+ TableKey: "playgrounds", TextTemplate: "{{name}}", Enabled: true,
+ })
+ if err != nil {
+ t.Fatal(err)
+ }
+ },
+ },
+ {
+ name: "provisioner_ensure_embed", wantMethod: "provisioner.ensure_embed",
+ resp: &abiv1.ProvisionerEnsureEmbedResponse{},
+ run: func(t *testing.T, cs plugin.CoreServices) {
+ err := cs.Provisioner.EnsureEmbed(plugin.EmbedConfig{
+ Key: "playground-card", Title: "Playground Card", Description: "d",
+ Icon: "📍", LabelField: "name", Template: "
{{name}}
",
+ DataSource: plugin.EmbedDataSource{Type: "row", TableKey: "playgrounds"},
+ })
+ if err != nil {
+ t.Fatal(err)
+ }
+ },
+ },
+ {
+ name: "provisioner_ensure_job_schedule", wantMethod: "provisioner.ensure_job_schedule",
+ resp: &abiv1.ProvisionerEnsureJobScheduleResponse{},
+ run: func(t *testing.T, cs plugin.CoreServices) {
+ err := cs.Provisioner.EnsureJobSchedule(plugin.JobScheduleConfig{
+ JobType: "bounty_rotation", CronExpression: "0 3 * * *", Config: []byte(`{"n":3}`),
+ })
+ if err != nil {
+ t.Fatal(err)
+ }
+ },
+ },
+ {
+ name: "provisioner_update_data_table_row_field", wantMethod: "provisioner.update_data_table_row_field",
+ resp: &abiv1.ProvisionerUpdateDataTableRowFieldResponse{},
+ run: func(t *testing.T, cs plugin.CoreServices) {
+ if err := cs.Provisioner.UpdateDataTableRowField(ctx, idRow, "status", "active"); err != nil {
+ t.Fatal(err)
+ }
+ },
+ },
+ {
+ name: "provisioner_disable_orphaned_job_schedules", wantMethod: "provisioner.disable_orphaned_job_schedules",
+ resp: &abiv1.ProvisionerDisableOrphanedJobSchedulesResponse{},
+ run: func(t *testing.T, cs plugin.CoreServices) {
+ if err := cs.Provisioner.DisableOrphanedJobSchedules([]string{"bounty_rotation", "reindex"}); err != nil {
+ t.Fatal(err)
+ }
+ },
+ },
+ {
+ name: "provisioner_ensure_plugin", wantMethod: "provisioner.ensure_plugin",
+ resp: &abiv1.ProvisionerEnsurePluginResponse{},
+ run: func(t *testing.T, cs plugin.CoreServices) {
+ if err := cs.Provisioner.EnsurePlugin("symposium"); err != nil {
+ t.Fatal(err)
+ }
+ },
+ },
+ {
+ name: "provisioner_ensure_custom_color", wantMethod: "provisioner.ensure_custom_color",
+ resp: &abiv1.ProvisionerEnsureCustomColorResponse{},
+ run: func(t *testing.T, cs plugin.CoreServices) {
+ err := cs.Provisioner.EnsureCustomColor(plugin.CustomColorConfig{
+ Name: "brand", LightValue: "oklch(0.7 0.1 200)", DarkValue: "oklch(0.4 0.1 200)", Source: "myplugin",
+ })
+ if err != nil {
+ t.Fatal(err)
+ }
+ },
+ },
+ // --- jobs.progress (WO-WZ-019; sent by the job dispatch path, not a
+ // CoreServices stub, so the case drives the transport directly) ---
+ {
+ name: "jobs_progress", wantMethod: "jobs.progress",
+ resp: &abiv1.JobsProgressResponse{},
+ run: func(t *testing.T, _ plugin.CoreServices) {
+ req := &abiv1.JobsProgressRequest{Current: 2, Total: 5, Message: "halfway"}
+ if err := f.call("jobs.progress", req, &abiv1.JobsProgressResponse{}); err != nil {
+ t.Fatal(err)
+ }
+ },
+ },
}
for _, tc := range cases {
diff --git a/plugin/wasmguest/caps/testdata/golden/jobs_progress_req.pb b/plugin/wasmguest/caps/testdata/golden/jobs_progress_req.pb
new file mode 100644
index 0000000..555d89c
--- /dev/null
+++ b/plugin/wasmguest/caps/testdata/golden/jobs_progress_req.pb
@@ -0,0 +1 @@
+halfway
\ No newline at end of file
diff --git a/plugin/wasmguest/caps/testdata/golden/jobs_progress_resp.pb b/plugin/wasmguest/caps/testdata/golden/jobs_progress_resp.pb
new file mode 100644
index 0000000..e69de29
diff --git a/plugin/wasmguest/caps/testdata/golden/provisioner_disable_orphaned_job_schedules_req.pb b/plugin/wasmguest/caps/testdata/golden/provisioner_disable_orphaned_job_schedules_req.pb
new file mode 100644
index 0000000..0eba592
--- /dev/null
+++ b/plugin/wasmguest/caps/testdata/golden/provisioner_disable_orphaned_job_schedules_req.pb
@@ -0,0 +1,3 @@
+
+bounty_rotation
+reindex
\ No newline at end of file
diff --git a/plugin/wasmguest/caps/testdata/golden/provisioner_disable_orphaned_job_schedules_resp.pb b/plugin/wasmguest/caps/testdata/golden/provisioner_disable_orphaned_job_schedules_resp.pb
new file mode 100644
index 0000000..e69de29
diff --git a/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_custom_color_req.pb b/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_custom_color_req.pb
new file mode 100644
index 0000000..ed99cc1
--- /dev/null
+++ b/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_custom_color_req.pb
@@ -0,0 +1,2 @@
+
+brandoklch(0.7 0.1 200)oklch(0.4 0.1 200)"myplugin
\ No newline at end of file
diff --git a/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_custom_color_resp.pb b/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_custom_color_resp.pb
new file mode 100644
index 0000000..e69de29
diff --git a/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_data_table_req.pb b/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_data_table_req.pb
new file mode 100644
index 0000000..cdf29e9
--- /dev/null
+++ b/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_data_table_req.pb
@@ -0,0 +1,2 @@
+
+playgroundsPlaygroundsd"
{"fields":[]}*id
\ No newline at end of file
diff --git a/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_data_table_resp.pb b/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_data_table_resp.pb
new file mode 100644
index 0000000..e69de29
diff --git a/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_embed_req.pb b/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_embed_req.pb
new file mode 100644
index 0000000..a4d0fc2
--- /dev/null
+++ b/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_embed_req.pb
@@ -0,0 +1,2 @@
+
+playground-cardPlayground Cardd"📍*name2{{name}}
:rowBplaygrounds
\ No newline at end of file
diff --git a/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_embed_resp.pb b/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_embed_resp.pb
new file mode 100644
index 0000000..e69de29
diff --git a/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_job_schedule_req.pb b/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_job_schedule_req.pb
new file mode 100644
index 0000000..8e76632
--- /dev/null
+++ b/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_job_schedule_req.pb
@@ -0,0 +1,2 @@
+
+bounty_rotation 0 3 * * *{"n":3}
\ No newline at end of file
diff --git a/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_job_schedule_resp.pb b/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_job_schedule_resp.pb
new file mode 100644
index 0000000..e69de29
diff --git a/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_plugin_req.pb b/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_plugin_req.pb
new file mode 100644
index 0000000..d592105
--- /dev/null
+++ b/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_plugin_req.pb
@@ -0,0 +1,2 @@
+
+ symposium
\ No newline at end of file
diff --git a/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_plugin_resp.pb b/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_plugin_resp.pb
new file mode 100644
index 0000000..e69de29
diff --git a/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_setting_req.pb b/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_setting_req.pb
new file mode 100644
index 0000000..21449b9
--- /dev/null
+++ b/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_setting_req.pb
@@ -0,0 +1,2 @@
+
+review_dimensions {"max":5}
\ No newline at end of file
diff --git a/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_setting_resp.pb b/plugin/wasmguest/caps/testdata/golden/provisioner_ensure_setting_resp.pb
new file mode 100644
index 0000000..e69de29
diff --git a/plugin/wasmguest/caps/testdata/golden/provisioner_override_site_settings_req.pb b/plugin/wasmguest/caps/testdata/golden/provisioner_override_site_settings_req.pb
new file mode 100644
index 0000000..2cd8036
--- /dev/null
+++ b/plugin/wasmguest/caps/testdata/golden/provisioner_override_site_settings_req.pb
@@ -0,0 +1,2 @@
+
+{"default_template":"homepage"}
\ No newline at end of file
diff --git a/plugin/wasmguest/caps/testdata/golden/provisioner_override_site_settings_resp.pb b/plugin/wasmguest/caps/testdata/golden/provisioner_override_site_settings_resp.pb
new file mode 100644
index 0000000..e69de29
diff --git a/plugin/wasmguest/caps/testdata/golden/provisioner_register_embedding_config_req.pb b/plugin/wasmguest/caps/testdata/golden/provisioner_register_embedding_config_req.pb
new file mode 100644
index 0000000..fd29f12
--- /dev/null
+++ b/plugin/wasmguest/caps/testdata/golden/provisioner_register_embedding_config_req.pb
@@ -0,0 +1,2 @@
+
+playgrounds{{name}}
\ No newline at end of file
diff --git a/plugin/wasmguest/caps/testdata/golden/provisioner_register_embedding_config_resp.pb b/plugin/wasmguest/caps/testdata/golden/provisioner_register_embedding_config_resp.pb
new file mode 100644
index 0000000..e69de29
diff --git a/plugin/wasmguest/caps/testdata/golden/provisioner_update_data_table_row_field_req.pb b/plugin/wasmguest/caps/testdata/golden/provisioner_update_data_table_row_field_req.pb
new file mode 100644
index 0000000..b032156
--- /dev/null
+++ b/plugin/wasmguest/caps/testdata/golden/provisioner_update_data_table_row_field_req.pb
@@ -0,0 +1,2 @@
+
+$bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbbstatus"active"
\ No newline at end of file
diff --git a/plugin/wasmguest/caps/testdata/golden/provisioner_update_data_table_row_field_resp.pb b/plugin/wasmguest/caps/testdata/golden/provisioner_update_data_table_row_field_resp.pb
new file mode 100644
index 0000000..e69de29