PluginProbe
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin / 1.1.8
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin v1.1.8
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 0.8.8 0.8.7 0.8.6 All 33 releases
desktop-mode / includes / agents / privacy.php

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

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