PluginProbe
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin / 1.1.12
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin v1.1.12
1.1.12 1.1.11 1.1.10 1.1.9 1.1.8 1.1.7 1.1.6 1.1.5 1.1.4 1.1.3 1.1.2 1.1.1 1.1.0 1.0.1 1.0.0 0.9.8 0.9.7 0.9.6 0.9.4 0.9.5 0.9.3 0.9.2 0.9.1 0.9.0 0.8.9 All 36 releases
desktop-mode / includes / agents / privacy.php

privacy.php in OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin 1.1.12, at includes/agents/privacy.php

194 lines 5.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * OpenStation — Agents: Personal Data Export + Erasure hooks.
4 *
5 * Agents carry user-attributable data on their synthetic `wp_users`
6 * row (display name, login, role) and in the definition meta
7 * (description, instructions, abilities, triggers, model, rate limit,
8 * voice, face). One exporter + one eraser, both keyed off the target
9 * email: if it matches an agent's synthetic address, the exporter
10 * returns that definition and the eraser deletes the whole agent. The
11 * invocation log (`_desktop_mode_agent_runs`) is not exported; it goes
12 * with the agent's user row when the eraser deletes it. Human users who
13 * created agents are NOT considered owners for export/erasure purposes —
14 * agents are admin-managed assets that survive a human-user erasure.
15 *
16 * @package OpenStation
17 */
18
19 defined( 'ABSPATH' ) || exit;
20
21 /**
22 * Register the personal-data exporter under the `os-agents`
23 * group.
24 *
25 * @param array $exporters Existing exporter registry.
26 * @return array
27 */
28 function openstation_agents_register_personal_data_exporter( $exporters ) {
29 $exporters['os-agents'] = array(
30 'exporter_friendly_name' => __( 'OpenStation agents', 'desktop-mode' ),
31 'callback' => 'openstation_agents_personal_data_exporter',
32 );
33 return $exporters;
34 }
35 add_filter( 'wp_privacy_personal_data_exporters', 'openstation_agents_register_personal_data_exporter' );
36
37 /**
38 * Exporter callback.
39 *
40 * @param string $email_address Target user's email.
41 * @param int $page 1-indexed page (always done=true).
42 * @return array
43 */
44 function openstation_agents_personal_data_exporter( $email_address, $page = 1 ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed
45 $user = get_user_by( 'email', $email_address );
46 if ( ! $user || ! openstation_agent_is_agent( $user ) ) {
47 return array(
48 'data' => array(),
49 'done' => true,
50 );
51 }
52
53 $role = is_array( $user->roles ) && ! empty( $user->roles )
54 ? (string) reset( $user->roles )
55 : '';
56
57 $rows = array(
58 array(
59 'name' => __( 'Agent display name', 'desktop-mode' ),
60 'value' => (string) $user->display_name,
61 ),
62 array(
63 'name' => __( 'Agent user_login', 'desktop-mode' ),
64 'value' => (string) $user->user_login,
65 ),
66 array(
67 'name' => __( 'Role', 'desktop-mode' ),
68 'value' => $role,
69 ),
70 array(
71 'name' => __( 'Description', 'desktop-mode' ),
72 'value' => openstation_agent_get_description( (int) $user->ID ),
73 ),
74 array(
75 'name' => __( 'Instructions (system prompt)', 'desktop-mode' ),
76 'value' => openstation_agent_get_instructions( (int) $user->ID ),
77 ),
78 );
79
80 $abilities = openstation_agent_get_abilities( (int) $user->ID );
81 if ( ! empty( $abilities ) ) {
82 $rows[] = array(
83 'name' => __( 'Enabled abilities', 'desktop-mode' ),
84 'value' => implode( ', ', $abilities ),
85 );
86 }
87
88 $triggers = openstation_agent_get_triggers( (int) $user->ID );
89 if ( ! empty( $triggers ) ) {
90 $rows[] = array(
91 'name' => __( 'Triggers (JSON)', 'desktop-mode' ),
92 'value' => wp_json_encode( $triggers ),
93 );
94 }
95
96 $model = openstation_agent_get_model( (int) $user->ID );
97 if ( '' !== $model ) {
98 $rows[] = array(
99 'name' => __( 'Model override', 'desktop-mode' ),
100 'value' => $model,
101 );
102 }
103
104 $rate_limit = openstation_agent_get_rate_limit( (int) $user->ID );
105 if ( $rate_limit > 0 ) {
106 $rows[] = array(
107 'name' => __( 'Rate limit (per hour)', 'desktop-mode' ),
108 'value' => (string) $rate_limit,
109 );
110 }
111
112 $vibes = openstation_agent_get_vibes( (int) $user->ID );
113 if ( '' !== $vibes ) {
114 $rows[] = array(
115 'name' => __( 'Voice', 'desktop-mode' ),
116 'value' => $vibes,
117 );
118 }
119
120 $face = (string) get_user_meta( (int) $user->ID, OPENSTATION_AGENT_FACE_META, true );
121 if ( '' !== $face ) {
122 $rows[] = array(
123 'name' => __( 'Face (JSON)', 'desktop-mode' ),
124 'value' => $face,
125 );
126 }
127
128 return array(
129 'data' => array(
130 array(
131 'group_id' => 'os-agents',
132 'group_label' => __( 'OpenStation agents', 'desktop-mode' ),
133 'item_id' => 'agent-' . (int) $user->ID,
134 'data' => $rows,
135 ),
136 ),
137 'done' => true,
138 );
139 }
140
141 /**
142 * Register the personal-data eraser under the `os-agents`
143 * group.
144 *
145 * @param array $erasers Existing eraser registry.
146 * @return array
147 */
148 function openstation_agents_register_personal_data_eraser( $erasers ) {
149 $erasers['os-agents'] = array(
150 'eraser_friendly_name' => __( 'OpenStation agents', 'desktop-mode' ),
151 'callback' => 'openstation_agents_personal_data_eraser',
152 );
153 return $erasers;
154 }
155 add_filter( 'wp_privacy_personal_data_erasers', 'openstation_agents_register_personal_data_eraser' );
156
157 /**
158 * Eraser callback. When the target email belongs to an agent, fully
159 * delete it (the user row deletion removes every definition meta row).
160 * Non-agent emails are a no-op.
161 *
162 * @param string $email_address Target user's email.
163 * @param int $page 1-indexed page (always done=true).
164 * @return array
165 */
166 function openstation_agents_personal_data_eraser( $email_address, $page = 1 ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed
167 $user = get_user_by( 'email', $email_address );
168 if ( ! $user || ! openstation_agent_is_agent( $user ) ) {
169 return array(
170 'items_removed' => false,
171 'items_retained' => false,
172 'messages' => array(),
173 'done' => true,
174 );
175 }
176
177 $result = openstation_agent_delete( (int) $user->ID );
178 if ( is_wp_error( $result ) ) {
179 return array(
180 'items_removed' => false,
181 'items_retained' => true,
182 'messages' => array( $result->get_error_message() ),
183 'done' => true,
184 );
185 }
186
187 return array(
188 'items_removed' => true,
189 'items_retained' => false,
190 'messages' => array(),
191 'done' => true,
192 );
193 }
194