planar 0.5.0__py3-none-any.whl → 0.8.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. planar/_version.py +1 -1
  2. planar/ai/agent.py +155 -283
  3. planar/ai/agent_base.py +170 -0
  4. planar/ai/agent_utils.py +7 -0
  5. planar/ai/pydantic_ai.py +638 -0
  6. planar/ai/test_agent_serialization.py +1 -1
  7. planar/app.py +64 -20
  8. planar/cli.py +39 -27
  9. planar/config.py +45 -36
  10. planar/db/db.py +2 -1
  11. planar/files/storage/azure_blob.py +343 -0
  12. planar/files/storage/base.py +7 -0
  13. planar/files/storage/config.py +70 -7
  14. planar/files/storage/s3.py +6 -6
  15. planar/files/storage/test_azure_blob.py +435 -0
  16. planar/logging/formatter.py +17 -4
  17. planar/logging/test_formatter.py +327 -0
  18. planar/registry_items.py +2 -1
  19. planar/routers/agents_router.py +3 -1
  20. planar/routers/files.py +11 -2
  21. planar/routers/models.py +14 -1
  22. planar/routers/test_agents_router.py +1 -1
  23. planar/routers/test_files_router.py +49 -0
  24. planar/routers/test_routes_security.py +5 -7
  25. planar/routers/test_workflow_router.py +270 -3
  26. planar/routers/workflow.py +95 -36
  27. planar/rules/models.py +36 -39
  28. planar/rules/test_data/account_dormancy_management.json +223 -0
  29. planar/rules/test_data/airline_loyalty_points_calculator.json +262 -0
  30. planar/rules/test_data/applicant_risk_assessment.json +435 -0
  31. planar/rules/test_data/booking_fraud_detection.json +407 -0
  32. planar/rules/test_data/cellular_data_rollover_system.json +258 -0
  33. planar/rules/test_data/clinical_trial_eligibility_screener.json +437 -0
  34. planar/rules/test_data/customer_lifetime_value.json +143 -0
  35. planar/rules/test_data/import_duties_calculator.json +289 -0
  36. planar/rules/test_data/insurance_prior_authorization.json +443 -0
  37. planar/rules/test_data/online_check_in_eligibility_system.json +254 -0
  38. planar/rules/test_data/order_consolidation_system.json +375 -0
  39. planar/rules/test_data/portfolio_risk_monitor.json +471 -0
  40. planar/rules/test_data/supply_chain_risk.json +253 -0
  41. planar/rules/test_data/warehouse_cross_docking.json +237 -0
  42. planar/rules/test_rules.py +750 -6
  43. planar/scaffold_templates/planar.dev.yaml.j2 +6 -6
  44. planar/scaffold_templates/planar.prod.yaml.j2 +9 -5
  45. planar/scaffold_templates/pyproject.toml.j2 +1 -1
  46. planar/security/auth_context.py +21 -0
  47. planar/security/{jwt_middleware.py → auth_middleware.py} +70 -17
  48. planar/security/authorization.py +9 -15
  49. planar/security/tests/test_auth_middleware.py +162 -0
  50. planar/sse/proxy.py +4 -9
  51. planar/test_app.py +92 -1
  52. planar/test_cli.py +81 -59
  53. planar/test_config.py +17 -14
  54. planar/testing/fixtures.py +325 -0
  55. planar/testing/planar_test_client.py +5 -2
  56. planar/utils.py +41 -1
  57. planar/workflows/execution.py +1 -1
  58. planar/workflows/orchestrator.py +5 -0
  59. planar/workflows/serialization.py +12 -6
  60. planar/workflows/step_core.py +3 -1
  61. planar/workflows/test_serialization.py +9 -1
  62. {planar-0.5.0.dist-info → planar-0.8.0.dist-info}/METADATA +30 -5
  63. planar-0.8.0.dist-info/RECORD +166 -0
  64. planar/.__init__.py.un~ +0 -0
  65. planar/._version.py.un~ +0 -0
  66. planar/.app.py.un~ +0 -0
  67. planar/.cli.py.un~ +0 -0
  68. planar/.config.py.un~ +0 -0
  69. planar/.context.py.un~ +0 -0
  70. planar/.db.py.un~ +0 -0
  71. planar/.di.py.un~ +0 -0
  72. planar/.engine.py.un~ +0 -0
  73. planar/.files.py.un~ +0 -0
  74. planar/.log_context.py.un~ +0 -0
  75. planar/.log_metadata.py.un~ +0 -0
  76. planar/.logging.py.un~ +0 -0
  77. planar/.object_registry.py.un~ +0 -0
  78. planar/.otel.py.un~ +0 -0
  79. planar/.server.py.un~ +0 -0
  80. planar/.session.py.un~ +0 -0
  81. planar/.sqlalchemy.py.un~ +0 -0
  82. planar/.task_local.py.un~ +0 -0
  83. planar/.test_app.py.un~ +0 -0
  84. planar/.test_config.py.un~ +0 -0
  85. planar/.test_object_config.py.un~ +0 -0
  86. planar/.test_sqlalchemy.py.un~ +0 -0
  87. planar/.test_utils.py.un~ +0 -0
  88. planar/.util.py.un~ +0 -0
  89. planar/.utils.py.un~ +0 -0
  90. planar/ai/.__init__.py.un~ +0 -0
  91. planar/ai/._models.py.un~ +0 -0
  92. planar/ai/.agent.py.un~ +0 -0
  93. planar/ai/.agent_utils.py.un~ +0 -0
  94. planar/ai/.events.py.un~ +0 -0
  95. planar/ai/.files.py.un~ +0 -0
  96. planar/ai/.models.py.un~ +0 -0
  97. planar/ai/.providers.py.un~ +0 -0
  98. planar/ai/.pydantic_ai.py.un~ +0 -0
  99. planar/ai/.pydantic_ai_agent.py.un~ +0 -0
  100. planar/ai/.pydantic_ai_provider.py.un~ +0 -0
  101. planar/ai/.step.py.un~ +0 -0
  102. planar/ai/.test_agent.py.un~ +0 -0
  103. planar/ai/.test_agent_serialization.py.un~ +0 -0
  104. planar/ai/.test_providers.py.un~ +0 -0
  105. planar/ai/.utils.py.un~ +0 -0
  106. planar/ai/providers.py +0 -1088
  107. planar/ai/test_agent.py +0 -1298
  108. planar/ai/test_providers.py +0 -463
  109. planar/db/.db.py.un~ +0 -0
  110. planar/files/.config.py.un~ +0 -0
  111. planar/files/.local.py.un~ +0 -0
  112. planar/files/.local_filesystem.py.un~ +0 -0
  113. planar/files/.model.py.un~ +0 -0
  114. planar/files/.models.py.un~ +0 -0
  115. planar/files/.s3.py.un~ +0 -0
  116. planar/files/.storage.py.un~ +0 -0
  117. planar/files/.test_files.py.un~ +0 -0
  118. planar/files/storage/.__init__.py.un~ +0 -0
  119. planar/files/storage/.base.py.un~ +0 -0
  120. planar/files/storage/.config.py.un~ +0 -0
  121. planar/files/storage/.context.py.un~ +0 -0
  122. planar/files/storage/.local_directory.py.un~ +0 -0
  123. planar/files/storage/.test_local_directory.py.un~ +0 -0
  124. planar/files/storage/.test_s3.py.un~ +0 -0
  125. planar/human/.human.py.un~ +0 -0
  126. planar/human/.test_human.py.un~ +0 -0
  127. planar/logging/.__init__.py.un~ +0 -0
  128. planar/logging/.attributes.py.un~ +0 -0
  129. planar/logging/.formatter.py.un~ +0 -0
  130. planar/logging/.logger.py.un~ +0 -0
  131. planar/logging/.otel.py.un~ +0 -0
  132. planar/logging/.tracer.py.un~ +0 -0
  133. planar/modeling/.mixin.py.un~ +0 -0
  134. planar/modeling/.storage.py.un~ +0 -0
  135. planar/modeling/orm/.planar_base_model.py.un~ +0 -0
  136. planar/object_config/.object_config.py.un~ +0 -0
  137. planar/routers/.__init__.py.un~ +0 -0
  138. planar/routers/.agents_router.py.un~ +0 -0
  139. planar/routers/.crud.py.un~ +0 -0
  140. planar/routers/.decision.py.un~ +0 -0
  141. planar/routers/.event.py.un~ +0 -0
  142. planar/routers/.file_attachment.py.un~ +0 -0
  143. planar/routers/.files.py.un~ +0 -0
  144. planar/routers/.files_router.py.un~ +0 -0
  145. planar/routers/.human.py.un~ +0 -0
  146. planar/routers/.info.py.un~ +0 -0
  147. planar/routers/.models.py.un~ +0 -0
  148. planar/routers/.object_config_router.py.un~ +0 -0
  149. planar/routers/.rule.py.un~ +0 -0
  150. planar/routers/.test_object_config_router.py.un~ +0 -0
  151. planar/routers/.test_workflow_router.py.un~ +0 -0
  152. planar/routers/.workflow.py.un~ +0 -0
  153. planar/rules/.decorator.py.un~ +0 -0
  154. planar/rules/.runner.py.un~ +0 -0
  155. planar/rules/.test_rules.py.un~ +0 -0
  156. planar/security/.jwt_middleware.py.un~ +0 -0
  157. planar/sse/.constants.py.un~ +0 -0
  158. planar/sse/.example.html.un~ +0 -0
  159. planar/sse/.hub.py.un~ +0 -0
  160. planar/sse/.model.py.un~ +0 -0
  161. planar/sse/.proxy.py.un~ +0 -0
  162. planar/testing/.client.py.un~ +0 -0
  163. planar/testing/.memory_storage.py.un~ +0 -0
  164. planar/testing/.planar_test_client.py.un~ +0 -0
  165. planar/testing/.predictable_tracer.py.un~ +0 -0
  166. planar/testing/.synchronizable_tracer.py.un~ +0 -0
  167. planar/testing/.test_memory_storage.py.un~ +0 -0
  168. planar/testing/.workflow_observer.py.un~ +0 -0
  169. planar/workflows/.__init__.py.un~ +0 -0
  170. planar/workflows/.builtin_steps.py.un~ +0 -0
  171. planar/workflows/.concurrency_tracing.py.un~ +0 -0
  172. planar/workflows/.context.py.un~ +0 -0
  173. planar/workflows/.contrib.py.un~ +0 -0
  174. planar/workflows/.decorators.py.un~ +0 -0
  175. planar/workflows/.durable_test.py.un~ +0 -0
  176. planar/workflows/.errors.py.un~ +0 -0
  177. planar/workflows/.events.py.un~ +0 -0
  178. planar/workflows/.exceptions.py.un~ +0 -0
  179. planar/workflows/.execution.py.un~ +0 -0
  180. planar/workflows/.human.py.un~ +0 -0
  181. planar/workflows/.lock.py.un~ +0 -0
  182. planar/workflows/.misc.py.un~ +0 -0
  183. planar/workflows/.model.py.un~ +0 -0
  184. planar/workflows/.models.py.un~ +0 -0
  185. planar/workflows/.notifications.py.un~ +0 -0
  186. planar/workflows/.orchestrator.py.un~ +0 -0
  187. planar/workflows/.runtime.py.un~ +0 -0
  188. planar/workflows/.serialization.py.un~ +0 -0
  189. planar/workflows/.step.py.un~ +0 -0
  190. planar/workflows/.step_core.py.un~ +0 -0
  191. planar/workflows/.sub_workflow_runner.py.un~ +0 -0
  192. planar/workflows/.sub_workflow_scheduler.py.un~ +0 -0
  193. planar/workflows/.test_concurrency.py.un~ +0 -0
  194. planar/workflows/.test_concurrency_detection.py.un~ +0 -0
  195. planar/workflows/.test_human.py.un~ +0 -0
  196. planar/workflows/.test_lock_timeout.py.un~ +0 -0
  197. planar/workflows/.test_orchestrator.py.un~ +0 -0
  198. planar/workflows/.test_race_conditions.py.un~ +0 -0
  199. planar/workflows/.test_serialization.py.un~ +0 -0
  200. planar/workflows/.test_suspend_deserialization.py.un~ +0 -0
  201. planar/workflows/.test_workflow.py.un~ +0 -0
  202. planar/workflows/.tracing.py.un~ +0 -0
  203. planar/workflows/.types.py.un~ +0 -0
  204. planar/workflows/.util.py.un~ +0 -0
  205. planar/workflows/.utils.py.un~ +0 -0
  206. planar/workflows/.workflow.py.un~ +0 -0
  207. planar/workflows/.workflow_wrapper.py.un~ +0 -0
  208. planar/workflows/.wrappers.py.un~ +0 -0
  209. planar-0.5.0.dist-info/RECORD +0 -289
  210. {planar-0.5.0.dist-info → planar-0.8.0.dist-info}/WHEEL +0 -0
  211. {planar-0.5.0.dist-info → planar-0.8.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,289 @@
1
+ {
2
+ "nodes": [
3
+ {
4
+ "type": "inputNode",
5
+ "content": {
6
+ "schema": "{\n \"type\": \"object\",\n \"properties\": {\n \"product\": {\n \"type\": \"object\",\n \"properties\": {\n \"category\": {\n \"type\": \"string\",\n \"description\": \"Product category\"\n },\n \"value\": {\n \"type\": \"number\",\n \"description\": \"Product value in USD\"\n },\n \"weight\": {\n \"type\": \"number\",\n \"description\": \"Product weight in kg\"\n },\n \"hsCode\": {\n \"type\": \"string\",\n \"description\": \"Harmonized System code\"\n }\n }\n },\n \"origin\": {\n \"type\": \"object\",\n \"properties\": {\n \"country\": {\n \"type\": \"string\",\n \"description\": \"Country of origin\"\n },\n \"hasFTA\": {\n \"type\": \"boolean\",\n \"description\": \"Has free trade agreement\"\n },\n \"preferentialTreatment\": {\n \"type\": \"boolean\",\n \"description\": \"Eligible for preferential treatment\"\n }\n }\n },\n \"destination\": {\n \"type\": \"object\",\n \"properties\": {\n \"country\": {\n \"type\": \"string\",\n \"description\": \"Destination country\"\n }\n }\n }\n }\n}"
7
+ },
8
+ "id": "input",
9
+ "name": "request",
10
+ "position": {
11
+ "x": 110,
12
+ "y": 114
13
+ }
14
+ },
15
+ {
16
+ "type": "decisionTableNode",
17
+ "content": {
18
+ "hitPolicy": "first",
19
+ "rules": [
20
+ {
21
+ "_id": "pc-1",
22
+ "i-category": "'electronics'",
23
+ "i-hsCode": "startsWith($, '85')",
24
+ "o-baseRate": "0.15",
25
+ "o-category": "'High-Tech Electronics'"
26
+ },
27
+ {
28
+ "_id": "pc-2",
29
+ "i-category": "'electronics'",
30
+ "i-hsCode": "startsWith($, '90')",
31
+ "o-baseRate": "0.12",
32
+ "o-category": "'Precision Electronics'"
33
+ },
34
+ {
35
+ "_id": "pc-3",
36
+ "i-category": "'textiles'",
37
+ "i-hsCode": "startsWith($, '61'), startsWith($, '62')",
38
+ "o-baseRate": "0.20",
39
+ "o-category": "'Clothing'"
40
+ },
41
+ {
42
+ "_id": "pc-4",
43
+ "i-category": "'textiles'",
44
+ "i-hsCode": "startsWith($, '63')",
45
+ "o-baseRate": "0.18",
46
+ "o-category": "'Home Textiles'"
47
+ },
48
+ {
49
+ "_id": "pc-5",
50
+ "i-category": "'food'",
51
+ "i-hsCode": "startsWith($, '02'), startsWith($, '03'), startsWith($, '04')",
52
+ "o-baseRate": "0.22",
53
+ "o-category": "'Perishable Food'"
54
+ },
55
+ {
56
+ "_id": "pc-6",
57
+ "i-category": "'food'",
58
+ "i-hsCode": "startsWith($, '19'), startsWith($, '20'), startsWith($, '21')",
59
+ "o-baseRate": "0.16",
60
+ "o-category": "'Processed Food'"
61
+ },
62
+ {
63
+ "_id": "pc-7",
64
+ "i-category": "'automotive'",
65
+ "i-hsCode": "startsWith($, '87')",
66
+ "o-baseRate": "0.25",
67
+ "o-category": "'Vehicles'"
68
+ },
69
+ {
70
+ "_id": "pc-8",
71
+ "i-category": "",
72
+ "i-hsCode": "",
73
+ "o-baseRate": "0.18",
74
+ "o-category": "'General Merchandise'"
75
+ }
76
+ ],
77
+ "inputs": [
78
+ {
79
+ "id": "i-category",
80
+ "name": "Product Category",
81
+ "field": "product.category"
82
+ },
83
+ {
84
+ "id": "i-hsCode",
85
+ "name": "HS Code",
86
+ "field": "product.hsCode"
87
+ }
88
+ ],
89
+ "outputs": [
90
+ {
91
+ "id": "o-baseRate",
92
+ "name": "Base Duty Rate",
93
+ "field": "classification.baseRate"
94
+ },
95
+ {
96
+ "id": "o-category",
97
+ "name": "Product Classification",
98
+ "field": "classification.category"
99
+ }
100
+ ],
101
+ "passThrough": true,
102
+ "inputField": null,
103
+ "outputPath": null,
104
+ "executionMode": "single"
105
+ },
106
+ "id": "product_classification",
107
+ "name": "product_classification",
108
+ "position": {
109
+ "x": 430,
110
+ "y": 114
111
+ }
112
+ },
113
+ {
114
+ "type": "decisionTableNode",
115
+ "content": {
116
+ "hitPolicy": "first",
117
+ "rules": [
118
+ {
119
+ "_id": "cr-1",
120
+ "i-origin": "'CN'",
121
+ "i-destination": "'US'",
122
+ "i-hasFTA": "false",
123
+ "o-countryMultiplier": "1.25",
124
+ "o-hasSanctions": "false"
125
+ },
126
+ {
127
+ "_id": "cr-2",
128
+ "i-origin": "'MX'",
129
+ "i-destination": "'US'",
130
+ "i-hasFTA": "true",
131
+ "o-countryMultiplier": "0.0",
132
+ "o-hasSanctions": "false"
133
+ },
134
+ {
135
+ "_id": "cr-3",
136
+ "i-origin": "'CA'",
137
+ "i-destination": "'US'",
138
+ "i-hasFTA": "true",
139
+ "o-countryMultiplier": "0.0",
140
+ "o-hasSanctions": "false"
141
+ },
142
+ {
143
+ "_id": "cr-4",
144
+ "i-origin": "'GB', 'DE', 'FR', 'IT', 'ES'",
145
+ "i-destination": "'US'",
146
+ "i-hasFTA": "false",
147
+ "o-countryMultiplier": "0.8",
148
+ "o-hasSanctions": "false"
149
+ },
150
+ {
151
+ "_id": "cr-5",
152
+ "i-origin": "'KP', 'IR'",
153
+ "i-destination": "'US'",
154
+ "i-hasFTA": "",
155
+ "o-countryMultiplier": "3.0",
156
+ "o-hasSanctions": "true"
157
+ },
158
+ {
159
+ "_id": "cr-6",
160
+ "i-origin": "'VN'",
161
+ "i-destination": "'US'",
162
+ "i-hasFTA": "false",
163
+ "o-countryMultiplier": "0.9",
164
+ "o-hasSanctions": "false"
165
+ },
166
+ {
167
+ "_id": "cr-7",
168
+ "i-origin": "",
169
+ "i-destination": "",
170
+ "i-hasFTA": "",
171
+ "o-countryMultiplier": "1.0",
172
+ "o-hasSanctions": "false"
173
+ }
174
+ ],
175
+ "inputs": [
176
+ {
177
+ "id": "i-origin",
178
+ "name": "Origin Country",
179
+ "field": "origin.country"
180
+ },
181
+ {
182
+ "id": "i-destination",
183
+ "name": "Destination Country",
184
+ "field": "destination.country"
185
+ },
186
+ {
187
+ "id": "i-hasFTA",
188
+ "name": "Has FTA",
189
+ "field": "origin.hasFTA"
190
+ }
191
+ ],
192
+ "outputs": [
193
+ {
194
+ "id": "o-countryMultiplier",
195
+ "name": "Country Multiplier",
196
+ "field": "countryRules.multiplier"
197
+ },
198
+ {
199
+ "id": "o-hasSanctions",
200
+ "name": "Has Sanctions",
201
+ "field": "countryRules.hasSanctions"
202
+ }
203
+ ],
204
+ "passThrough": true,
205
+ "inputField": null,
206
+ "outputPath": null,
207
+ "executionMode": "single"
208
+ },
209
+ "id": "country_rules",
210
+ "name": "country_rules",
211
+ "position": {
212
+ "x": 750,
213
+ "y": 114
214
+ }
215
+ },
216
+ {
217
+ "type": "expressionNode",
218
+ "content": {
219
+ "expressions": [
220
+ {
221
+ "id": "expr1",
222
+ "key": "baseDuty",
223
+ "value": "product.value * number(classification.baseRate)"
224
+ },
225
+ {
226
+ "id": "expr2",
227
+ "key": "countryAdjustment",
228
+ "value": "$.baseDuty * number(countryRules.multiplier)"
229
+ },
230
+ {
231
+ "id": "expr3",
232
+ "key": "additionalFees",
233
+ "value": "countryRules.hasSanctions == true ? product.value * 0.1 : 0"
234
+ },
235
+ {
236
+ "id": "expr4",
237
+ "key": "preferentialDiscount",
238
+ "value": "origin.preferentialTreatment == true ? $.countryAdjustment * 0.8 : $.countryAdjustment"
239
+ },
240
+ {
241
+ "id": "expr5",
242
+ "key": "minDuty",
243
+ "value": "$.countryAdjustment > 0 ? max([10, $.preferentialDiscount]) : 0"
244
+ },
245
+ {
246
+ "id": "expr6",
247
+ "key": "totalDuty",
248
+ "value": "$.minDuty + $.additionalFees"
249
+ },
250
+ {
251
+ "id": "expr7",
252
+ "key": "dutyRate",
253
+ "value": "$.totalDuty / product.value"
254
+ }
255
+ ],
256
+ "passThrough": false,
257
+ "inputField": null,
258
+ "outputPath": null,
259
+ "executionMode": "single"
260
+ },
261
+ "id": "duty_calculation",
262
+ "name": "duty_calculation",
263
+ "position": {
264
+ "x": 1070,
265
+ "y": 114
266
+ }
267
+ }
268
+ ],
269
+ "edges": [
270
+ {
271
+ "id": "edge1",
272
+ "sourceId": "input",
273
+ "targetId": "product_classification",
274
+ "type": "edge"
275
+ },
276
+ {
277
+ "id": "edge2",
278
+ "sourceId": "product_classification",
279
+ "targetId": "country_rules",
280
+ "type": "edge"
281
+ },
282
+ {
283
+ "id": "edge3",
284
+ "sourceId": "country_rules",
285
+ "targetId": "duty_calculation",
286
+ "type": "edge"
287
+ }
288
+ ]
289
+ }