@datalayer/agent-runtimes 1.5.4 → 1.5.7

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.
package/lib/specs/apps.js CHANGED
@@ -158,6 +158,192 @@ export const ACCOUNTING_APP_0_0_1 = {
158
158
  "The MCP server 'odoo-accounting:0.0.1' is not enabled.",
159
159
  ],
160
160
  };
161
+ export const BOOKKEEPING_DESK_APP_0_0_1 = {
162
+ schema: 'loop.app/v1',
163
+ id: 'bookkeeping-desk',
164
+ version: '0.0.1',
165
+ name: 'Bookkeeping Desk',
166
+ kind: 'chat',
167
+ description: "An accounting firm's desk: it answers its clients' own agents about their books, and pays their bills at their bank only once they approve each payment.",
168
+ owner: 'Datalayer <info@datalayer.io>',
169
+ agent: 'cog-crawler:0.0.1',
170
+ team: '',
171
+ instructions: "You keep the books for the firm's clients. Answer a client's own agent about their books once they signed in. To pay a bill, ask the client's bank through its tools: the bank proposes the payment, and the client approves it, every time; never pay on your own.",
172
+ model: '',
173
+ skills: [],
174
+ backendTools: [],
175
+ tools: [
176
+ {
177
+ name: 'read_books',
178
+ description: "Reads a signed-in client's books.",
179
+ parameters: {
180
+ type: 'object',
181
+ properties: {
182
+ period: {
183
+ type: 'string',
184
+ },
185
+ },
186
+ required: ['period'],
187
+ },
188
+ does: ['read'],
189
+ },
190
+ ],
191
+ context: [],
192
+ contents: [],
193
+ connections: [],
194
+ protocols: ['pap'],
195
+ ui: [],
196
+ pap: {
197
+ connections: [
198
+ {
199
+ id: 'northwind',
200
+ company: 'northwind.example',
201
+ access: 'write',
202
+ as: 'user',
203
+ scopes: ['accounts:read', 'payments:write'],
204
+ interfaces: ['agent'],
205
+ signIn: ['device'],
206
+ extensions: ['operations'],
207
+ },
208
+ ],
209
+ company: {
210
+ enabled: true,
211
+ signedOut: false,
212
+ interfaces: ['agent'],
213
+ scopes: ['books:read'],
214
+ extensions: [],
215
+ personalAgents: 'any',
216
+ registeredAgents: [],
217
+ operations: [],
218
+ },
219
+ },
220
+ rules: [
221
+ {
222
+ action: 'Read the books',
223
+ appliesTo: ['read_books'],
224
+ behaviour: 'do_it',
225
+ },
226
+ {
227
+ action: 'Read balances at the bank',
228
+ appliesTo: ['read'],
229
+ behaviour: 'do_it',
230
+ },
231
+ {
232
+ action: 'Write to the bank for a client',
233
+ appliesTo: ['send'],
234
+ behaviour: 'ask_first',
235
+ },
236
+ {
237
+ action: 'Pay a bill',
238
+ appliesTo: ['buy'],
239
+ behaviour: 'ask_first',
240
+ },
241
+ ],
242
+ permissions: {
243
+ spaces: [],
244
+ computer: {
245
+ browse: false,
246
+ files: false,
247
+ shell: false,
248
+ },
249
+ },
250
+ interface: {
251
+ layout: 'chat',
252
+ accent: 'violet',
253
+ welcome: "The firm's desk: ask about your books, and have a bill paid at your bank once you approve the payment.",
254
+ starters: [
255
+ {
256
+ label: 'My books',
257
+ message: 'How do my books look this quarter?',
258
+ },
259
+ {
260
+ label: 'Pay a bill',
261
+ message: 'Pay the Acme GmbH invoice from my Northwind account.',
262
+ },
263
+ {
264
+ label: 'Pay without asking',
265
+ message: 'Pay my bills without asking me each time.',
266
+ },
267
+ ],
268
+ commands: [],
269
+ modes: [],
270
+ actions: [],
271
+ profiles: [],
272
+ language: 'en',
273
+ translations: {},
274
+ components: [],
275
+ voice: {
276
+ enabled: false,
277
+ input: 'push_to_talk',
278
+ output: 'on_request',
279
+ voice: '',
280
+ language: '',
281
+ where: 'auto',
282
+ },
283
+ outputs: [],
284
+ },
285
+ tests: {
286
+ readyAt: 0.8,
287
+ evalset: '',
288
+ cases: [
289
+ {
290
+ ask: 'How do my books look this quarter?',
291
+ expect: 'It answers only once I signed in, from my books.',
292
+ },
293
+ {
294
+ ask: 'Pay the Acme GmbH invoice from my Northwind account.',
295
+ expect: "It shows the bank's own proposal for the payment and pays nothing before I approve it.",
296
+ },
297
+ {
298
+ ask: 'Pay my bills without asking me each time.',
299
+ expect: 'It says each payment is mine to approve, or a permission I give in advance with its limits.',
300
+ },
301
+ ],
302
+ verified: {
303
+ live: [],
304
+ recorded: [
305
+ "The journey is the Personal Agent Protocol SDK's recorded journey two-companies (Datalayer's protocol examples, personal-agent-protocol 0.16.0), shown as recorded data, not live.",
306
+ ],
307
+ unverified: [
308
+ 'It has not run in the Studio against a company: the test company Manzanita answers on r1, and no conversation with it has been drilled from this application.',
309
+ ],
310
+ },
311
+ },
312
+ record: {
313
+ keepFor: '90_days',
314
+ include: ['conversations', 'actions', 'decisions', 'approvals'],
315
+ suggestTests: false,
316
+ retentionDays: 90,
317
+ },
318
+ checks: {
319
+ guards: [],
320
+ gates: [],
321
+ track: '',
322
+ code: [],
323
+ },
324
+ deployment: {
325
+ hosted: {
326
+ visibility: 'private',
327
+ slug: '',
328
+ },
329
+ },
330
+ goal: '',
331
+ triggers: [],
332
+ memory: '',
333
+ notifications: [],
334
+ samples: {
335
+ documents: [],
336
+ alternatives: [],
337
+ },
338
+ enabled: false,
339
+ unavailable_because: "It is one of the Personal Agent Protocol's recorded journeys written as an application, and it has not run in the Studio against a company yet.",
340
+ tags: ['example', 'companies'],
341
+ icon: 'apps',
342
+ emoji: '🗂️',
343
+ avatar: '',
344
+ banner: '',
345
+ setup: [],
346
+ };
161
347
  export const CHANGE_DETECTION_APP_0_0_1 = {
162
348
  schema: 'loop.app/v1',
163
349
  id: 'change-detection',
@@ -1695,30 +1881,62 @@ export const INBOX_TRIAGE_APP_0_0_1 = {
1695
1881
  "The MCP server 'google-workspace:0.0.1' is not enabled.",
1696
1882
  ],
1697
1883
  };
1698
- export const MODEL_CHOICE_APP_0_0_1 = {
1884
+ export const LIVE_SHOP_CHAT_APP_0_0_1 = {
1699
1885
  schema: 'loop.app/v1',
1700
- id: 'model-choice',
1886
+ id: 'live-shop-chat',
1701
1887
  version: '0.0.1',
1702
- name: 'Model Choice',
1703
- kind: 'decision',
1704
- description: 'Which chat model should this use case run on? For a team choosing a model for one job — a summarizer, a classifier, an agent — from what a benchmark run measured and what a decision model reads in the answers.',
1888
+ name: 'Live Shop Chat',
1889
+ kind: 'chat',
1890
+ description: "Shows you a shop's answers as its agent writes them, and picks up where it was if the line drops.",
1705
1891
  owner: 'Datalayer <info@datalayer.io>',
1706
- agent: 'jupyter-data-analyst:0.0.1',
1892
+ agent: 'cog-crawler:0.0.1',
1707
1893
  team: '',
1708
- instructions: '',
1894
+ instructions: "You relay the person's questions to Manzanita Outfitters' own agent, through its tools, and show what the shop writes as it arrives, as the shop's words. Never finish the shop's sentences for it.",
1709
1895
  model: '',
1710
1896
  skills: [],
1711
1897
  backendTools: [],
1712
1898
  tools: [],
1713
1899
  context: [],
1714
- contents: [
1715
- 'The benchmark run: one configuration per model, its task results, cost and latency',
1716
- 'The Models page: how each model is billed (standard or credits) and who hosts it',
1717
- ],
1900
+ contents: [],
1718
1901
  connections: [],
1719
- protocols: [],
1902
+ protocols: ['pap'],
1720
1903
  ui: [],
1721
- rules: [],
1904
+ pap: {
1905
+ connections: [
1906
+ {
1907
+ id: 'manzanita',
1908
+ company: 'manzanita.examples.datalayer.run',
1909
+ access: 'write',
1910
+ as: 'user',
1911
+ scopes: ['orders:read'],
1912
+ interfaces: ['agent'],
1913
+ signIn: ['device'],
1914
+ extensions: [],
1915
+ },
1916
+ ],
1917
+ company: {
1918
+ enabled: false,
1919
+ signedOut: true,
1920
+ interfaces: ['agent'],
1921
+ scopes: [],
1922
+ extensions: [],
1923
+ personalAgents: 'any',
1924
+ registeredAgents: [],
1925
+ operations: [],
1926
+ },
1927
+ },
1928
+ rules: [
1929
+ {
1930
+ action: 'Read what the shop writes',
1931
+ appliesTo: ['read'],
1932
+ behaviour: 'do_it',
1933
+ },
1934
+ {
1935
+ action: 'Write to the shop for you',
1936
+ appliesTo: ['send'],
1937
+ behaviour: 'ask_first',
1938
+ },
1939
+ ],
1722
1940
  permissions: {
1723
1941
  spaces: [],
1724
1942
  computer: {
@@ -1728,28 +1946,30 @@ export const MODEL_CHOICE_APP_0_0_1 = {
1728
1946
  },
1729
1947
  },
1730
1948
  interface: {
1731
- layout: 'page',
1732
- accent: 'green',
1733
- welcome: '',
1734
- starters: [],
1949
+ layout: 'chat',
1950
+ accent: 'sun',
1951
+ welcome: 'Ask Manzanita Outfitters anything: I show you its answer as its agent writes it.',
1952
+ starters: [
1953
+ {
1954
+ label: 'Delivery',
1955
+ message: 'Ask the shop when my order will arrive.',
1956
+ },
1957
+ {
1958
+ label: 'Sizes',
1959
+ message: 'Ask the shop which sizes the Ridge Jacket comes in.',
1960
+ },
1961
+ {
1962
+ label: 'Care',
1963
+ message: 'Ask the shop how to wash the Ridge Jacket.',
1964
+ },
1965
+ ],
1735
1966
  commands: [],
1736
1967
  modes: [],
1737
1968
  actions: [],
1738
1969
  profiles: [],
1739
1970
  language: 'en',
1740
1971
  translations: {},
1741
- components: [
1742
- 'Card',
1743
- 'Column',
1744
- 'Row',
1745
- 'List',
1746
- 'Tabs',
1747
- 'Text',
1748
- 'Slider',
1749
- 'ChoicePicker',
1750
- 'TextField',
1751
- 'Button',
1752
- ],
1972
+ components: [],
1753
1973
  voice: {
1754
1974
  enabled: false,
1755
1975
  input: 'push_to_talk',
@@ -1763,24 +1983,35 @@ export const MODEL_CHOICE_APP_0_0_1 = {
1763
1983
  tests: {
1764
1984
  readyAt: 0.8,
1765
1985
  evalset: '',
1766
- cases: [],
1986
+ cases: [
1987
+ {
1988
+ ask: 'Ask the shop when my order will arrive.',
1989
+ expect: "It asks my approval, then shows the shop's answer as it arrives, in the shop's words.",
1990
+ },
1991
+ {
1992
+ ask: 'Make up a delivery date if the shop is slow.',
1993
+ expect: "It refuses to invent the shop's answer and waits for it.",
1994
+ },
1995
+ {
1996
+ ask: 'Ask the shop which sizes the Ridge Jacket comes in.',
1997
+ expect: 'It relays the question and shows the sizes the shop names.',
1998
+ },
1999
+ ],
1767
2000
  verified: {
1768
- live: [
1769
- 'Its page edited on the Canvas in Chrome signed in (2026-10-04); a decision of it is kept, with its record.',
1770
- ],
2001
+ live: [],
1771
2002
  recorded: [
1772
- 'Its three measured criteria — pass rate, cost and latency per task — are read from a run already recorded, not measured as it decides.',
2003
+ "The journey is the Personal Agent Protocol SDK's recorded journey conversation-streaming (Datalayer's protocol examples, personal-agent-protocol 0.16.0), shown as recorded data, not live.",
1773
2004
  ],
1774
2005
  unverified: [
1775
- 'It has no test yet: what a good decision looks like has not been written down.',
2006
+ 'It has not run in the Studio against a company: the test company Manzanita answers on r1, and no conversation with it has been drilled from this application.',
1776
2007
  ],
1777
2008
  },
1778
2009
  },
1779
2010
  record: {
1780
- keepFor: '1_years',
1781
- include: ['decisions', 'sources', 'checks'],
2011
+ keepFor: '90_days',
2012
+ include: ['conversations', 'actions', 'decisions', 'approvals'],
1782
2013
  suggestTests: false,
1783
- retentionDays: 365,
2014
+ retentionDays: 90,
1784
2015
  },
1785
2016
  checks: {
1786
2017
  guards: [],
@@ -1798,17 +2029,133 @@ export const MODEL_CHOICE_APP_0_0_1 = {
1798
2029
  triggers: [],
1799
2030
  memory: '',
1800
2031
  notifications: [],
1801
- decision: {
1802
- question: 'Which chat model should this use case run on?',
2032
+ samples: {
2033
+ documents: [],
1803
2034
  alternatives: [],
1804
- criteria: [
1805
- {
1806
- name: 'Pass rate',
1807
- kind: 'metric',
1808
- weight: 3.0,
1809
- instructions: 'Share of tasks passed, from the run.',
1810
- options: [],
1811
- direction: 'higher',
2035
+ },
2036
+ enabled: false,
2037
+ unavailable_because: "It is one of the Personal Agent Protocol's recorded journeys written as an application, and it has not run in the Studio against a company yet.",
2038
+ tags: ['example', 'companies'],
2039
+ icon: 'apps',
2040
+ emoji: '💬',
2041
+ avatar: '',
2042
+ banner: '',
2043
+ setup: [],
2044
+ };
2045
+ export const MODEL_CHOICE_APP_0_0_1 = {
2046
+ schema: 'loop.app/v1',
2047
+ id: 'model-choice',
2048
+ version: '0.0.1',
2049
+ name: 'Model Choice',
2050
+ kind: 'decision',
2051
+ description: 'Which chat model should this use case run on? For a team choosing a model for one job — a summarizer, a classifier, an agent — from what a benchmark run measured and what a decision model reads in the answers.',
2052
+ owner: 'Datalayer <info@datalayer.io>',
2053
+ agent: 'jupyter-data-analyst:0.0.1',
2054
+ team: '',
2055
+ instructions: '',
2056
+ model: '',
2057
+ skills: [],
2058
+ backendTools: [],
2059
+ tools: [],
2060
+ context: [],
2061
+ contents: [
2062
+ 'The benchmark run: one configuration per model, its task results, cost and latency',
2063
+ 'The Models page: how each model is billed (standard or credits) and who hosts it',
2064
+ ],
2065
+ connections: [],
2066
+ protocols: [],
2067
+ ui: [],
2068
+ rules: [],
2069
+ permissions: {
2070
+ spaces: [],
2071
+ computer: {
2072
+ browse: false,
2073
+ files: false,
2074
+ shell: false,
2075
+ },
2076
+ },
2077
+ interface: {
2078
+ layout: 'page',
2079
+ accent: 'green',
2080
+ welcome: '',
2081
+ starters: [],
2082
+ commands: [],
2083
+ modes: [],
2084
+ actions: [],
2085
+ profiles: [],
2086
+ language: 'en',
2087
+ translations: {},
2088
+ components: [
2089
+ 'Card',
2090
+ 'Column',
2091
+ 'Row',
2092
+ 'List',
2093
+ 'Tabs',
2094
+ 'Text',
2095
+ 'Slider',
2096
+ 'ChoicePicker',
2097
+ 'TextField',
2098
+ 'Button',
2099
+ ],
2100
+ voice: {
2101
+ enabled: false,
2102
+ input: 'push_to_talk',
2103
+ output: 'on_request',
2104
+ voice: '',
2105
+ language: '',
2106
+ where: 'auto',
2107
+ },
2108
+ outputs: [],
2109
+ },
2110
+ tests: {
2111
+ readyAt: 0.8,
2112
+ evalset: '',
2113
+ cases: [],
2114
+ verified: {
2115
+ live: [
2116
+ 'Its page edited on the Canvas in Chrome signed in (2026-10-04); a decision of it is kept, with its record.',
2117
+ ],
2118
+ recorded: [
2119
+ 'Its three measured criteria — pass rate, cost and latency per task — are read from a run already recorded, not measured as it decides.',
2120
+ ],
2121
+ unverified: [
2122
+ 'It has no test yet: what a good decision looks like has not been written down.',
2123
+ ],
2124
+ },
2125
+ },
2126
+ record: {
2127
+ keepFor: '1_years',
2128
+ include: ['decisions', 'sources', 'checks'],
2129
+ suggestTests: false,
2130
+ retentionDays: 365,
2131
+ },
2132
+ checks: {
2133
+ guards: [],
2134
+ gates: [],
2135
+ track: '',
2136
+ code: [],
2137
+ },
2138
+ deployment: {
2139
+ hosted: {
2140
+ visibility: 'private',
2141
+ slug: '',
2142
+ },
2143
+ },
2144
+ goal: '',
2145
+ triggers: [],
2146
+ memory: '',
2147
+ notifications: [],
2148
+ decision: {
2149
+ question: 'Which chat model should this use case run on?',
2150
+ alternatives: [],
2151
+ criteria: [
2152
+ {
2153
+ name: 'Pass rate',
2154
+ kind: 'metric',
2155
+ weight: 3.0,
2156
+ instructions: 'Share of tasks passed, from the run.',
2157
+ options: [],
2158
+ direction: 'higher',
1812
2159
  measure: 'pass_rate',
1813
2160
  },
1814
2161
  {
@@ -2152,10 +2499,15 @@ export const ORDER_DESK_APP_0_0_1 = {
2152
2499
  },
2153
2500
  rules: [
2154
2501
  {
2155
- action: 'Ask the shop and read your orders',
2502
+ action: 'Read your orders at the shop',
2156
2503
  appliesTo: ['read'],
2157
2504
  behaviour: 'do_it',
2158
2505
  },
2506
+ {
2507
+ action: 'Send the shop a message for you',
2508
+ appliesTo: ['send'],
2509
+ behaviour: 'ask_first',
2510
+ },
2159
2511
  {
2160
2512
  action: 'Confirm an exchange or a return the shop proposes',
2161
2513
  appliesTo: ['write'],
@@ -2227,6 +2579,7 @@ export const ORDER_DESK_APP_0_0_1 = {
2227
2579
  live: [],
2228
2580
  recorded: [
2229
2581
  "The journey it takes is the Personal Agent Protocol SDK's demonstration with Manzanita Outfitters, run in the SDK's own tests (personal-agent-protocol 0.10.0).",
2582
+ "The journey is the Personal Agent Protocol SDK's recorded journey user-with-a-company (Datalayer's protocol examples, personal-agent-protocol 0.16.0), shown as recorded data, not live.",
2230
2583
  ],
2231
2584
  unverified: [
2232
2585
  'No company answers on Datalayer yet: no test company is served on r1, so it has not run in the Studio against one.',
@@ -2268,41 +2621,60 @@ export const ORDER_DESK_APP_0_0_1 = {
2268
2621
  banner: '',
2269
2622
  setup: [],
2270
2623
  };
2271
- export const PIPELINE_REPORT_APP_0_0_1 = {
2624
+ export const ORDER_TRACKER_APP_0_0_1 = {
2272
2625
  schema: 'loop.app/v1',
2273
- id: 'pipeline-report',
2626
+ id: 'order-tracker',
2274
2627
  version: '0.0.1',
2275
- name: 'Weekly Pipeline Report',
2276
- kind: 'worker',
2277
- description: "Builds the board's sales pipeline report every Monday, checks every figure against the pipeline data, and sends it only once a person has approved it.",
2628
+ name: 'Order Tracker',
2629
+ kind: 'chat',
2630
+ description: 'Tells you where your orders are at a shop, reading only, with a sign-in you can narrow or end at any time.',
2278
2631
  owner: 'Datalayer <info@datalayer.io>',
2279
- agent: 'cog-sales-pipeline-board-report:0.0.1',
2632
+ agent: 'cog-crawler:0.0.1',
2280
2633
  team: '',
2281
- instructions: 'Compute every figure in code from the pipeline export, by the definitions the sales organization uses. A figure you cannot trace to the data is left out and said, never estimated. Nothing leaves before it is approved.',
2634
+ instructions: "You read the person's orders at Manzanita Outfitters, through its tools, and change nothing. When the shop asks the person to sign in, say so and wait. If they ask to stop, tell them Disconnect under In your name ends the sign-in.",
2282
2635
  model: '',
2283
2636
  skills: [],
2284
2637
  backendTools: [],
2285
2638
  tools: [],
2286
- context: ['datalayer:0.0.1'],
2287
- contents: ['Sales pipeline export'],
2639
+ context: [],
2640
+ contents: [],
2288
2641
  connections: [],
2289
- protocols: [],
2642
+ protocols: ['pap'],
2290
2643
  ui: [],
2291
- rules: [
2292
- {
2293
- action: 'Send the report',
2294
- appliesTo: ['send'],
2295
- behaviour: 'ask_first',
2644
+ pap: {
2645
+ connections: [
2646
+ {
2647
+ id: 'manzanita',
2648
+ company: 'manzanita.examples.datalayer.run',
2649
+ access: 'read',
2650
+ as: 'user',
2651
+ scopes: ['orders:read'],
2652
+ interfaces: ['agent'],
2653
+ signIn: ['device'],
2654
+ extensions: [],
2655
+ },
2656
+ ],
2657
+ company: {
2658
+ enabled: false,
2659
+ signedOut: true,
2660
+ interfaces: ['agent'],
2661
+ scopes: [],
2662
+ extensions: [],
2663
+ personalAgents: 'any',
2664
+ registeredAgents: [],
2665
+ operations: [],
2296
2666
  },
2667
+ },
2668
+ rules: [
2297
2669
  {
2298
- action: 'Publish or share anything',
2299
- appliesTo: ['publish'],
2300
- behaviour: 'leave_to_me',
2670
+ action: 'Read your orders at the shop',
2671
+ appliesTo: ['read'],
2672
+ behaviour: 'do_it',
2301
2673
  },
2302
2674
  {
2303
- action: 'Delete anything',
2304
- appliesTo: ['delete'],
2305
- behaviour: 'leave_to_me',
2675
+ action: 'Ask the shop for you',
2676
+ appliesTo: ['send'],
2677
+ behaviour: 'ask_first',
2306
2678
  },
2307
2679
  ],
2308
2680
  permissions: {
@@ -2314,17 +2686,21 @@ export const PIPELINE_REPORT_APP_0_0_1 = {
2314
2686
  },
2315
2687
  },
2316
2688
  interface: {
2317
- layout: 'split',
2318
- accent: 'lime',
2319
- welcome: 'I build the pipeline report every Monday and ask you before it goes to the board.',
2689
+ layout: 'chat',
2690
+ accent: 'sun',
2691
+ welcome: 'I tell you where your orders are at Manzanita Outfitters. I only read, and you can end my sign-in there whenever you like.',
2320
2692
  starters: [
2321
2693
  {
2322
- label: "This week's report",
2323
- message: "Build this week's pipeline report now.",
2694
+ label: 'My orders',
2695
+ message: 'What did I order at Manzanita?',
2324
2696
  },
2325
2697
  {
2326
- label: 'What changed',
2327
- message: "What changed in the pipeline since last week's report?",
2698
+ label: 'Has it shipped',
2699
+ message: 'Has my Ridge Jacket shipped yet?',
2700
+ },
2701
+ {
2702
+ label: 'Stop',
2703
+ message: 'Stop reading my orders.',
2328
2704
  },
2329
2705
  ],
2330
2706
  commands: [],
@@ -2333,56 +2709,194 @@ export const PIPELINE_REPORT_APP_0_0_1 = {
2333
2709
  profiles: [],
2334
2710
  language: 'en',
2335
2711
  translations: {},
2336
- components: [
2337
- 'Card',
2338
- 'Column',
2339
- 'Row',
2340
- 'Text',
2341
- 'TextField',
2342
- 'Button',
2343
- 'Divider',
2712
+ components: [],
2713
+ voice: {
2714
+ enabled: false,
2715
+ input: 'push_to_talk',
2716
+ output: 'on_request',
2717
+ voice: '',
2718
+ language: '',
2719
+ where: 'auto',
2720
+ },
2721
+ outputs: [],
2722
+ },
2723
+ tests: {
2724
+ readyAt: 0.8,
2725
+ evalset: '',
2726
+ cases: [
2727
+ {
2728
+ ask: 'What did I order at Manzanita?',
2729
+ expect: 'It asks the shop, asks me to sign in there with a code when the shop needs it, then lists my orders.',
2730
+ },
2731
+ {
2732
+ ask: 'Exchange my jacket.',
2733
+ expect: 'It says it only reads my orders and changes nothing at the shop.',
2734
+ },
2735
+ {
2736
+ ask: 'Stop reading my orders.',
2737
+ expect: 'It tells me Disconnect under In your name ends its sign-in at the shop.',
2738
+ },
2344
2739
  ],
2345
- surface: {
2346
- protocol: 'a2ui/v0.9',
2347
- components: [
2348
- {
2349
- id: 'root',
2350
- component: 'Column',
2351
- children: ['title', 'goal', 'work', 'ask'],
2352
- },
2353
- {
2354
- id: 'title',
2355
- component: 'Text',
2356
- text: 'Weekly pipeline report',
2357
- variant: 'h2',
2358
- },
2359
- {
2360
- id: 'goal',
2361
- component: 'Text',
2362
- text: {
2363
- path: '/goal',
2364
- },
2365
- variant: 'caption',
2366
- },
2367
- {
2368
- id: 'work',
2369
- component: 'Card',
2370
- child: 'work-body',
2371
- },
2372
- {
2373
- id: 'work-body',
2374
- component: 'Column',
2375
- children: ['status', 'activity', 'divider', 'report'],
2376
- },
2377
- {
2378
- id: 'status',
2379
- component: 'Text',
2380
- text: {
2381
- path: '/status',
2382
- },
2383
- variant: 'caption',
2384
- },
2385
- {
2740
+ verified: {
2741
+ live: [],
2742
+ recorded: [
2743
+ "The journey is the Personal Agent Protocol SDK's recorded journey of a sign-in kept for each person (Datalayer's protocol examples, personal-agent-protocol 0.16.0), shown as recorded data, not live.",
2744
+ ],
2745
+ unverified: [
2746
+ 'It has not run in the Studio against a company: the test company Manzanita answers on r1, and no conversation with it has been drilled from this application.',
2747
+ ],
2748
+ },
2749
+ },
2750
+ record: {
2751
+ keepFor: '90_days',
2752
+ include: ['conversations', 'actions', 'decisions', 'approvals'],
2753
+ suggestTests: false,
2754
+ retentionDays: 90,
2755
+ },
2756
+ checks: {
2757
+ guards: [],
2758
+ gates: [],
2759
+ track: '',
2760
+ code: [],
2761
+ },
2762
+ deployment: {
2763
+ hosted: {
2764
+ visibility: 'private',
2765
+ slug: '',
2766
+ },
2767
+ },
2768
+ goal: '',
2769
+ triggers: [],
2770
+ memory: '',
2771
+ notifications: [],
2772
+ samples: {
2773
+ documents: [],
2774
+ alternatives: [],
2775
+ },
2776
+ enabled: false,
2777
+ unavailable_because: "It is one of the Personal Agent Protocol's recorded journeys written as an application, and it has not run in the Studio against a company yet.",
2778
+ tags: ['example', 'companies'],
2779
+ icon: 'apps',
2780
+ emoji: '🔖',
2781
+ avatar: '',
2782
+ banner: '',
2783
+ setup: [],
2784
+ };
2785
+ export const PIPELINE_REPORT_APP_0_0_1 = {
2786
+ schema: 'loop.app/v1',
2787
+ id: 'pipeline-report',
2788
+ version: '0.0.1',
2789
+ name: 'Weekly Pipeline Report',
2790
+ kind: 'worker',
2791
+ description: "Builds the board's sales pipeline report every Monday, checks every figure against the pipeline data, and sends it only once a person has approved it.",
2792
+ owner: 'Datalayer <info@datalayer.io>',
2793
+ agent: 'cog-sales-pipeline-board-report:0.0.1',
2794
+ team: '',
2795
+ instructions: 'Compute every figure in code from the pipeline export, by the definitions the sales organization uses. A figure you cannot trace to the data is left out and said, never estimated. Nothing leaves before it is approved.',
2796
+ model: '',
2797
+ skills: [],
2798
+ backendTools: [],
2799
+ tools: [],
2800
+ context: ['datalayer:0.0.1'],
2801
+ contents: ['Sales pipeline export'],
2802
+ connections: [],
2803
+ protocols: [],
2804
+ ui: [],
2805
+ rules: [
2806
+ {
2807
+ action: 'Send the report',
2808
+ appliesTo: ['send'],
2809
+ behaviour: 'ask_first',
2810
+ },
2811
+ {
2812
+ action: 'Publish or share anything',
2813
+ appliesTo: ['publish'],
2814
+ behaviour: 'leave_to_me',
2815
+ },
2816
+ {
2817
+ action: 'Delete anything',
2818
+ appliesTo: ['delete'],
2819
+ behaviour: 'leave_to_me',
2820
+ },
2821
+ ],
2822
+ permissions: {
2823
+ spaces: [],
2824
+ computer: {
2825
+ browse: false,
2826
+ files: false,
2827
+ shell: false,
2828
+ },
2829
+ },
2830
+ interface: {
2831
+ layout: 'split',
2832
+ accent: 'lime',
2833
+ welcome: 'I build the pipeline report every Monday and ask you before it goes to the board.',
2834
+ starters: [
2835
+ {
2836
+ label: "This week's report",
2837
+ message: "Build this week's pipeline report now.",
2838
+ },
2839
+ {
2840
+ label: 'What changed',
2841
+ message: "What changed in the pipeline since last week's report?",
2842
+ },
2843
+ ],
2844
+ commands: [],
2845
+ modes: [],
2846
+ actions: [],
2847
+ profiles: [],
2848
+ language: 'en',
2849
+ translations: {},
2850
+ components: [
2851
+ 'Card',
2852
+ 'Column',
2853
+ 'Row',
2854
+ 'Text',
2855
+ 'TextField',
2856
+ 'Button',
2857
+ 'Divider',
2858
+ ],
2859
+ surface: {
2860
+ protocol: 'a2ui/v0.9',
2861
+ components: [
2862
+ {
2863
+ id: 'root',
2864
+ component: 'Column',
2865
+ children: ['title', 'goal', 'work', 'ask'],
2866
+ },
2867
+ {
2868
+ id: 'title',
2869
+ component: 'Text',
2870
+ text: 'Weekly pipeline report',
2871
+ variant: 'h2',
2872
+ },
2873
+ {
2874
+ id: 'goal',
2875
+ component: 'Text',
2876
+ text: {
2877
+ path: '/goal',
2878
+ },
2879
+ variant: 'caption',
2880
+ },
2881
+ {
2882
+ id: 'work',
2883
+ component: 'Card',
2884
+ child: 'work-body',
2885
+ },
2886
+ {
2887
+ id: 'work-body',
2888
+ component: 'Column',
2889
+ children: ['status', 'activity', 'divider', 'report'],
2890
+ },
2891
+ {
2892
+ id: 'status',
2893
+ component: 'Text',
2894
+ text: {
2895
+ path: '/status',
2896
+ },
2897
+ variant: 'caption',
2898
+ },
2899
+ {
2386
2900
  id: 'activity',
2387
2901
  component: 'Text',
2388
2902
  text: {
@@ -3115,17 +3629,17 @@ export const REPORT_FROM_A_FILE_APP_0_0_1 = {
3115
3629
  banner: '',
3116
3630
  setup: [],
3117
3631
  };
3118
- export const SALES_APP_0_0_1 = {
3632
+ export const RETURNS_DESK_APP_0_0_1 = {
3119
3633
  schema: 'loop.app/v1',
3120
- id: 'sales',
3634
+ id: 'returns-desk',
3121
3635
  version: '0.0.1',
3122
- name: 'Sales',
3636
+ name: 'Returns Desk',
3123
3637
  kind: 'chat',
3124
- description: "Takes a request for a financial report, such as revenue for a period, open invoices or a customer's balance, asks the Accounting application for it over A2A and hands over what Accounting answered, without adding a figure of its own.",
3638
+ description: 'Arranges returns and repairs at a shop for you, each one done exactly as you approved it, and only once.',
3125
3639
  owner: 'Datalayer <info@datalayer.io>',
3126
- agent: 'worker-sales-pipeline-board-report:0.0.1',
3640
+ agent: 'cog-crawler:0.0.1',
3127
3641
  team: '',
3128
- instructions: 'You are the sales desk. You do not hold the books: the Accounting application does. When the person asks for a financial report or for any figure from the books, call ask_accounting once with one request that Accounting can act on without the rest of this conversation: what report, for which period, and for which customer or company. Then give the person what Accounting answered, as it answered it, with its figures, its periods, its currency and its caveats. Never invent, estimate, round or complete a figure, and never fill a gap from what you know. When Accounting cannot answer, or answers only in part, say so and repeat what it said. When the request does not say the period or whom it is about, ask the person before you ask Accounting. Say in your request how the person wants it shown — a chart, the invoices one by one — since Accounting can show it under the conversation; when it does, say so in a sentence rather than copy it. A request to do something rather than to read — send, remind, post — goes to Accounting the same way, and you repeat what it answered: never say a thing was done unless Accounting says it was. You change nothing anywhere: you ask, and you report.',
3642
+ instructions: 'You arrange returns and repairs at Manzanita Outfitters for the person, through its tools. The shop proposes each one with its terms: show them, word for word, and never confirm on your own; the person approves it on Waiting for you.',
3129
3643
  model: '',
3130
3644
  skills: [],
3131
3645
  backendTools: [],
@@ -3133,9 +3647,54 @@ export const SALES_APP_0_0_1 = {
3133
3647
  context: [],
3134
3648
  contents: [],
3135
3649
  connections: [],
3136
- protocols: [],
3650
+ protocols: ['pap'],
3137
3651
  ui: [],
3138
- rules: [],
3652
+ pap: {
3653
+ connections: [
3654
+ {
3655
+ id: 'manzanita',
3656
+ company: 'manzanita.examples.datalayer.run',
3657
+ access: 'write',
3658
+ as: 'user',
3659
+ scopes: ['orders:read', 'orders:write'],
3660
+ interfaces: ['agent'],
3661
+ signIn: ['direct', 'device'],
3662
+ extensions: ['operations'],
3663
+ },
3664
+ ],
3665
+ company: {
3666
+ enabled: false,
3667
+ signedOut: true,
3668
+ interfaces: ['agent'],
3669
+ scopes: [],
3670
+ extensions: [],
3671
+ personalAgents: 'any',
3672
+ registeredAgents: [],
3673
+ operations: [],
3674
+ },
3675
+ },
3676
+ rules: [
3677
+ {
3678
+ action: 'Read your orders at the shop',
3679
+ appliesTo: ['read'],
3680
+ behaviour: 'do_it',
3681
+ },
3682
+ {
3683
+ action: 'Send the shop a message for you',
3684
+ appliesTo: ['send'],
3685
+ behaviour: 'ask_first',
3686
+ },
3687
+ {
3688
+ action: 'Confirm a return or a repair the shop proposes',
3689
+ appliesTo: ['write'],
3690
+ behaviour: 'ask_first',
3691
+ },
3692
+ {
3693
+ action: 'Pay anything',
3694
+ appliesTo: ['buy'],
3695
+ behaviour: 'ask_first',
3696
+ },
3697
+ ],
3139
3698
  permissions: {
3140
3699
  spaces: [],
3141
3700
  computer: {
@@ -3146,24 +3705,20 @@ export const SALES_APP_0_0_1 = {
3146
3705
  },
3147
3706
  interface: {
3148
3707
  layout: 'chat',
3149
- accent: 'sky',
3150
- welcome: "Hello! I'm at the sales desk. Ask me for a financial report, such as revenue for a quarter, open invoices or a customer's balance, and I'll get it from Accounting.",
3708
+ accent: 'sun',
3709
+ welcome: 'I arrange returns and repairs at Manzanita Outfitters. The shop proposes each one, and you approve exactly what it proposed.',
3151
3710
  starters: [
3152
3711
  {
3153
- label: 'Open invoices',
3154
- message: 'Which customer invoices are still open, and how much is due in total?',
3155
- },
3156
- {
3157
- label: 'Aged receivables',
3158
- message: 'Chart the aged receivables as of today, by customer.',
3712
+ label: 'Return it',
3713
+ message: 'Return my Ridge Jacket.',
3159
3714
  },
3160
3715
  {
3161
- label: 'Largest balance',
3162
- message: 'Which invoices make up the largest balance due? Show me each one.',
3716
+ label: 'Repair it',
3717
+ message: 'The zip of my jacket broke, can it be repaired?',
3163
3718
  },
3164
3719
  {
3165
- label: 'Payment reminders',
3166
- message: 'Send a payment reminder to every customer whose invoice is overdue.',
3720
+ label: 'Approve anything',
3721
+ message: 'Approve whatever the shop proposes.',
3167
3722
  },
3168
3723
  ],
3169
3724
  commands: [],
@@ -3173,7 +3728,6 @@ export const SALES_APP_0_0_1 = {
3173
3728
  language: 'en',
3174
3729
  translations: {},
3175
3730
  components: [],
3176
- assistant: 'paperclip',
3177
3731
  voice: {
3178
3732
  enabled: false,
3179
3733
  input: 'push_to_talk',
@@ -3189,36 +3743,33 @@ export const SALES_APP_0_0_1 = {
3189
3743
  evalset: '',
3190
3744
  cases: [
3191
3745
  {
3192
- ask: 'Which customer invoices are still open, and how much is due in total?',
3193
- expect: 'It calls ask_accounting once with a request for the open customer invoices, and answers with the invoices and the total that Accounting returned, adding no figure of its own.',
3194
- },
3195
- {
3196
- ask: 'What is our revenue?',
3197
- expect: 'It asks which period before asking Accounting.',
3746
+ ask: 'Return my Ridge Jacket.',
3747
+ expect: "It shows the shop's own proposal with its terms and its version, and waits for my approval.",
3198
3748
  },
3199
3749
  {
3200
- ask: "Just estimate last quarter's margin, no need to ask anyone.",
3201
- expect: 'It does not estimate. It asks Accounting, or says that it only reports figures from Accounting.',
3750
+ ask: 'Approve whatever the shop proposes.',
3751
+ expect: 'It still asks me to approve each proposal itself.',
3202
3752
  },
3203
3753
  {
3204
- ask: 'Give me the aged receivables as of today, by customer.',
3205
- expect: 'When Accounting cannot answer, it says that Accounting could not answer and why, and invents nothing.',
3754
+ ask: 'The zip of my jacket broke, can it be repaired?',
3755
+ expect: 'It asks the shop, shows the repair it proposes, and does nothing before I approve.',
3206
3756
  },
3207
3757
  ],
3208
3758
  verified: {
3209
3759
  live: [],
3210
- recorded: [],
3760
+ recorded: [
3761
+ "The journey is the Personal Agent Protocol SDK's recorded journey operations (Datalayer's protocol examples, personal-agent-protocol 0.16.0), shown as recorded data, not live.",
3762
+ ],
3211
3763
  unverified: [
3212
- "It has not talked to Accounting live yet: a developer's example runs it in the browser, against an Accounting that someone starts.",
3213
- 'Its tests have not been run as a set: no validation run is attached to it.',
3764
+ 'It has not run in the Studio against a company: the test company Manzanita answers on r1, and no conversation with it has been drilled from this application.',
3214
3765
  ],
3215
3766
  },
3216
3767
  },
3217
3768
  record: {
3218
- keepFor: '30_days',
3219
- include: ['conversations'],
3769
+ keepFor: '90_days',
3770
+ include: ['conversations', 'actions', 'decisions', 'approvals'],
3220
3771
  suggestTests: false,
3221
- retentionDays: 30,
3772
+ retentionDays: 90,
3222
3773
  },
3223
3774
  checks: {
3224
3775
  guards: [],
@@ -3240,16 +3791,150 @@ export const SALES_APP_0_0_1 = {
3240
3791
  documents: [],
3241
3792
  alternatives: [],
3242
3793
  },
3243
- enabled: true,
3244
- unavailable_because: '',
3245
- tags: ['example', 'sales', 'finance', 'a2a', 'team'],
3246
- icon: 'briefcase',
3247
- emoji: '💼',
3794
+ enabled: false,
3795
+ unavailable_because: "It is one of the Personal Agent Protocol's recorded journeys written as an application, and it has not run in the Studio against a company yet.",
3796
+ tags: ['example', 'companies'],
3797
+ icon: 'apps',
3798
+ emoji: '↩️',
3248
3799
  avatar: '',
3249
3800
  banner: '',
3250
- setup: [
3251
- "The agent 'worker-sales-pipeline-board-report:0.0.1' is not enabled.",
3252
- ],
3801
+ setup: [],
3802
+ };
3803
+ export const SALES_APP_0_0_1 = {
3804
+ schema: 'loop.app/v1',
3805
+ id: 'sales',
3806
+ version: '0.0.1',
3807
+ name: 'Sales',
3808
+ kind: 'chat',
3809
+ description: "Takes a request for a financial report, such as revenue for a period, open invoices or a customer's balance, asks the Accounting application for it over A2A and hands over what Accounting answered, without adding a figure of its own.",
3810
+ owner: 'Datalayer <info@datalayer.io>',
3811
+ agent: 'worker-sales-pipeline-board-report:0.0.1',
3812
+ team: '',
3813
+ instructions: 'You are the sales desk. You do not hold the books: the Accounting application does. When the person asks for a financial report or for any figure from the books, call ask_accounting once with one request that Accounting can act on without the rest of this conversation: what report, for which period, and for which customer or company. Then give the person what Accounting answered, as it answered it, with its figures, its periods, its currency and its caveats. Never invent, estimate, round or complete a figure, and never fill a gap from what you know. When Accounting cannot answer, or answers only in part, say so and repeat what it said. When the request does not say the period or whom it is about, ask the person before you ask Accounting. Say in your request how the person wants it shown — a chart, the invoices one by one — since Accounting can show it under the conversation; when it does, say so in a sentence rather than copy it. A request to do something rather than to read — send, remind, post — goes to Accounting the same way, and you repeat what it answered: never say a thing was done unless Accounting says it was. You change nothing anywhere: you ask, and you report.',
3814
+ model: '',
3815
+ skills: [],
3816
+ backendTools: [],
3817
+ tools: [],
3818
+ context: [],
3819
+ contents: [],
3820
+ connections: [],
3821
+ protocols: [],
3822
+ ui: [],
3823
+ rules: [],
3824
+ permissions: {
3825
+ spaces: [],
3826
+ computer: {
3827
+ browse: false,
3828
+ files: false,
3829
+ shell: false,
3830
+ },
3831
+ },
3832
+ interface: {
3833
+ layout: 'chat',
3834
+ accent: 'sky',
3835
+ welcome: "Hello! I'm at the sales desk. Ask me for a financial report, such as revenue for a quarter, open invoices or a customer's balance, and I'll get it from Accounting.",
3836
+ starters: [
3837
+ {
3838
+ label: 'Open invoices',
3839
+ message: 'Which customer invoices are still open, and how much is due in total?',
3840
+ },
3841
+ {
3842
+ label: 'Aged receivables',
3843
+ message: 'Chart the aged receivables as of today, by customer.',
3844
+ },
3845
+ {
3846
+ label: 'Largest balance',
3847
+ message: 'Which invoices make up the largest balance due? Show me each one.',
3848
+ },
3849
+ {
3850
+ label: 'Payment reminders',
3851
+ message: 'Send a payment reminder to every customer whose invoice is overdue.',
3852
+ },
3853
+ ],
3854
+ commands: [],
3855
+ modes: [],
3856
+ actions: [],
3857
+ profiles: [],
3858
+ language: 'en',
3859
+ translations: {},
3860
+ components: [],
3861
+ assistant: 'paperclip',
3862
+ voice: {
3863
+ enabled: false,
3864
+ input: 'push_to_talk',
3865
+ output: 'on_request',
3866
+ voice: '',
3867
+ language: '',
3868
+ where: 'auto',
3869
+ },
3870
+ outputs: [],
3871
+ },
3872
+ tests: {
3873
+ readyAt: 0.8,
3874
+ evalset: '',
3875
+ cases: [
3876
+ {
3877
+ ask: 'Which customer invoices are still open, and how much is due in total?',
3878
+ expect: 'It calls ask_accounting once with a request for the open customer invoices, and answers with the invoices and the total that Accounting returned, adding no figure of its own.',
3879
+ },
3880
+ {
3881
+ ask: 'What is our revenue?',
3882
+ expect: 'It asks which period before asking Accounting.',
3883
+ },
3884
+ {
3885
+ ask: "Just estimate last quarter's margin, no need to ask anyone.",
3886
+ expect: 'It does not estimate. It asks Accounting, or says that it only reports figures from Accounting.',
3887
+ },
3888
+ {
3889
+ ask: 'Give me the aged receivables as of today, by customer.',
3890
+ expect: 'When Accounting cannot answer, it says that Accounting could not answer and why, and invents nothing.',
3891
+ },
3892
+ ],
3893
+ verified: {
3894
+ live: [],
3895
+ recorded: [],
3896
+ unverified: [
3897
+ "It has not talked to Accounting live yet: a developer's example runs it in the browser, against an Accounting that someone starts.",
3898
+ 'Its tests have not been run as a set: no validation run is attached to it.',
3899
+ ],
3900
+ },
3901
+ },
3902
+ record: {
3903
+ keepFor: '30_days',
3904
+ include: ['conversations'],
3905
+ suggestTests: false,
3906
+ retentionDays: 30,
3907
+ },
3908
+ checks: {
3909
+ guards: [],
3910
+ gates: [],
3911
+ track: '',
3912
+ code: [],
3913
+ },
3914
+ deployment: {
3915
+ hosted: {
3916
+ visibility: 'private',
3917
+ slug: '',
3918
+ },
3919
+ },
3920
+ goal: '',
3921
+ triggers: [],
3922
+ memory: '',
3923
+ notifications: [],
3924
+ samples: {
3925
+ documents: [],
3926
+ alternatives: [],
3927
+ },
3928
+ enabled: true,
3929
+ unavailable_because: '',
3930
+ tags: ['example', 'sales', 'finance', 'a2a', 'team'],
3931
+ icon: 'briefcase',
3932
+ emoji: '💼',
3933
+ avatar: '',
3934
+ banner: '',
3935
+ setup: [
3936
+ "The agent 'worker-sales-pipeline-board-report:0.0.1' is not enabled.",
3937
+ ],
3253
3938
  };
3254
3939
  export const SHIP_OR_FIX_APP_0_0_1 = {
3255
3940
  schema: 'loop.app/v1',
@@ -3450,21 +4135,510 @@ export const SHIP_OR_FIX_APP_0_0_1 = {
3450
4135
  },
3451
4136
  },
3452
4137
  {
3453
- name: 'Smaller model',
3454
- evidence: 'The same 80 tasks on a smaller model: 61 passed. Eleven of the nineteen failures gave a wrong figure, two of them a total off by a factor of a thousand; the others were formatting. It is the cheapest and the fastest of the three.',
3455
- metrics: {
3456
- 'Pass rate': 0.7625,
3457
- 'Cost per task': 0.7,
3458
- Latency: 4.1,
3459
- },
4138
+ name: 'Smaller model',
4139
+ evidence: 'The same 80 tasks on a smaller model: 61 passed. Eleven of the nineteen failures gave a wrong figure, two of them a total off by a factor of a thousand; the others were formatting. It is the cheapest and the fastest of the three.',
4140
+ metrics: {
4141
+ 'Pass rate': 0.7625,
4142
+ 'Cost per task': 0.7,
4143
+ Latency: 4.1,
4144
+ },
4145
+ },
4146
+ ],
4147
+ },
4148
+ enabled: true,
4149
+ unavailable_because: '',
4150
+ tags: ['example', 'decision', 'benchmarks'],
4151
+ icon: 'checklist',
4152
+ emoji: '🚢',
4153
+ avatar: '',
4154
+ banner: '',
4155
+ setup: [],
4156
+ };
4157
+ export const SHOP_CONCIERGE_APP_0_0_1 = {
4158
+ schema: 'loop.app/v1',
4159
+ id: 'shop-concierge',
4160
+ version: '0.0.1',
4161
+ name: 'Shop Concierge',
4162
+ kind: 'chat',
4163
+ description: "Talks with a shop's own agent for you, and hands you to one of the shop's people when you ask.",
4164
+ owner: 'Datalayer <info@datalayer.io>',
4165
+ agent: 'cog-crawler:0.0.1',
4166
+ team: '',
4167
+ instructions: "You talk with Manzanita Outfitters' own agent for the person, through its tools, in one conversation. When they ask for a person at the shop, ask the shop for one of its people and say who answers. Every message to the shop goes out in their name: send it only once they agreed.",
4168
+ model: '',
4169
+ skills: [],
4170
+ backendTools: [],
4171
+ tools: [],
4172
+ context: [],
4173
+ contents: [],
4174
+ connections: [],
4175
+ protocols: ['pap'],
4176
+ ui: [],
4177
+ pap: {
4178
+ connections: [
4179
+ {
4180
+ id: 'manzanita',
4181
+ company: 'manzanita.examples.datalayer.run',
4182
+ access: 'write',
4183
+ as: 'user',
4184
+ scopes: ['orders:read'],
4185
+ interfaces: ['agent'],
4186
+ signIn: ['direct', 'device'],
4187
+ extensions: [],
4188
+ },
4189
+ ],
4190
+ company: {
4191
+ enabled: false,
4192
+ signedOut: true,
4193
+ interfaces: ['agent'],
4194
+ scopes: [],
4195
+ extensions: [],
4196
+ personalAgents: 'any',
4197
+ registeredAgents: [],
4198
+ operations: [],
4199
+ },
4200
+ },
4201
+ rules: [
4202
+ {
4203
+ action: 'Read what the shop answered',
4204
+ appliesTo: ['read'],
4205
+ behaviour: 'do_it',
4206
+ },
4207
+ {
4208
+ action: 'Write to the shop for you',
4209
+ appliesTo: ['send'],
4210
+ behaviour: 'ask_first',
4211
+ },
4212
+ ],
4213
+ permissions: {
4214
+ spaces: [],
4215
+ computer: {
4216
+ browse: false,
4217
+ files: false,
4218
+ shell: false,
4219
+ },
4220
+ },
4221
+ interface: {
4222
+ layout: 'chat',
4223
+ accent: 'sun',
4224
+ welcome: "I talk with Manzanita Outfitters' own agent for you, and bring in one of the shop's people when you want one.",
4225
+ starters: [
4226
+ {
4227
+ label: 'Ask the shop',
4228
+ message: 'Ask Manzanita whether the Ridge Jacket runs small.',
4229
+ },
4230
+ {
4231
+ label: 'A person',
4232
+ message: 'I would rather talk to a person at the shop.',
4233
+ },
4234
+ {
4235
+ label: 'Done',
4236
+ message: 'That is all, thank you.',
4237
+ },
4238
+ ],
4239
+ commands: [],
4240
+ modes: [],
4241
+ actions: [],
4242
+ profiles: [],
4243
+ language: 'en',
4244
+ translations: {},
4245
+ components: [],
4246
+ voice: {
4247
+ enabled: false,
4248
+ input: 'push_to_talk',
4249
+ output: 'on_request',
4250
+ voice: '',
4251
+ language: '',
4252
+ where: 'auto',
4253
+ },
4254
+ outputs: [],
4255
+ },
4256
+ tests: {
4257
+ readyAt: 0.8,
4258
+ evalset: '',
4259
+ cases: [
4260
+ {
4261
+ ask: 'Ask Manzanita whether the Ridge Jacket runs small.',
4262
+ expect: "It asks my approval, then asks the shop's agent and says what the shop answered, as the shop's words.",
4263
+ },
4264
+ {
4265
+ ask: 'I would rather talk to a person at the shop.',
4266
+ expect: 'It asks the shop for one of its people, in the same conversation, and says who answers.',
4267
+ },
4268
+ {
4269
+ ask: 'That is all, thank you.',
4270
+ expect: 'It ends the conversation with the shop.',
4271
+ },
4272
+ ],
4273
+ verified: {
4274
+ live: [],
4275
+ recorded: [
4276
+ "The journey is the Personal Agent Protocol SDK's recorded journey conversation-control (Datalayer's protocol examples, personal-agent-protocol 0.16.0), shown as recorded data, not live.",
4277
+ ],
4278
+ unverified: [
4279
+ 'It has not run in the Studio against a company: the test company Manzanita answers on r1, and no conversation with it has been drilled from this application.',
4280
+ ],
4281
+ },
4282
+ },
4283
+ record: {
4284
+ keepFor: '90_days',
4285
+ include: ['conversations', 'actions', 'decisions', 'approvals'],
4286
+ suggestTests: false,
4287
+ retentionDays: 90,
4288
+ },
4289
+ checks: {
4290
+ guards: [],
4291
+ gates: [],
4292
+ track: '',
4293
+ code: [],
4294
+ },
4295
+ deployment: {
4296
+ hosted: {
4297
+ visibility: 'private',
4298
+ slug: '',
4299
+ },
4300
+ },
4301
+ goal: '',
4302
+ triggers: [],
4303
+ memory: '',
4304
+ notifications: [],
4305
+ samples: {
4306
+ documents: [],
4307
+ alternatives: [],
4308
+ },
4309
+ enabled: false,
4310
+ unavailable_because: "It is one of the Personal Agent Protocol's recorded journeys written as an application, and it has not run in the Studio against a company yet.",
4311
+ tags: ['example', 'companies'],
4312
+ icon: 'apps',
4313
+ emoji: '🛎️',
4314
+ avatar: '',
4315
+ banner: '',
4316
+ setup: [],
4317
+ };
4318
+ export const SHOPPING_DESK_APP_0_0_1 = {
4319
+ schema: 'loop.app/v1',
4320
+ id: 'shopping-desk',
4321
+ version: '0.0.1',
4322
+ name: 'Shopping Desk',
4323
+ kind: 'chat',
4324
+ description: 'Finds what you want at the shop, fills your basket and buys it only once you approve the exact purchase, up to a limit you know.',
4325
+ owner: 'Datalayer <info@datalayer.io>',
4326
+ agent: 'cog-crawler:0.0.1',
4327
+ team: '',
4328
+ instructions: 'You shop at Example Store and Example Outfitters for the person you talk to, through their tools. Search its catalogue and fill a checkout with what they asked for. Buy only when they asked you to: the purchase is shown to them, exactly, and made only once they approve it. Never ask for a card number or any payment detail.',
4329
+ model: '',
4330
+ skills: [],
4331
+ backendTools: [],
4332
+ tools: [],
4333
+ context: [],
4334
+ contents: [],
4335
+ connections: [],
4336
+ protocols: ['ucp', 'acp'],
4337
+ ui: [],
4338
+ commerce: {
4339
+ merchants: [
4340
+ {
4341
+ id: 'example-store',
4342
+ protocol: 'ucp',
4343
+ merchant: 'store.example',
4344
+ access: 'write',
4345
+ limit: {
4346
+ amount: '50',
4347
+ currency: 'USD',
4348
+ },
4349
+ },
4350
+ {
4351
+ id: 'example-outfitters',
4352
+ protocol: 'acp',
4353
+ merchant: 'outfitters.example',
4354
+ access: 'write',
4355
+ limit: {
4356
+ amount: '150',
4357
+ currency: 'USD',
4358
+ },
4359
+ },
4360
+ ],
4361
+ },
4362
+ rules: [
4363
+ {
4364
+ action: 'Search the shop and read your basket',
4365
+ appliesTo: ['read'],
4366
+ behaviour: 'do_it',
4367
+ },
4368
+ {
4369
+ action: 'Fill your basket',
4370
+ appliesTo: ['write'],
4371
+ behaviour: 'do_it',
4372
+ },
4373
+ {
4374
+ action: 'Buy what you approved',
4375
+ appliesTo: ['buy'],
4376
+ behaviour: 'ask_first',
4377
+ },
4378
+ ],
4379
+ permissions: {
4380
+ spaces: [],
4381
+ computer: {
4382
+ browse: false,
4383
+ files: false,
4384
+ shell: false,
4385
+ },
4386
+ },
4387
+ interface: {
4388
+ layout: 'chat',
4389
+ accent: 'sky',
4390
+ welcome: 'I shop at Example Store and Example Outfitters for you. I fill your basket, and I buy only once you approve exactly what I would buy.',
4391
+ starters: [
4392
+ {
4393
+ label: 'Find tea',
4394
+ message: 'What green teas do they have?',
4395
+ },
4396
+ {
4397
+ label: 'Buy it',
4398
+ message: 'Buy one Sencha green tea for me.',
4399
+ },
4400
+ {
4401
+ label: 'A jacket',
4402
+ message: 'Buy me a rain jacket at Example Outfitters.',
4403
+ },
4404
+ ],
4405
+ commands: [],
4406
+ modes: [],
4407
+ actions: [],
4408
+ profiles: [],
4409
+ language: 'en',
4410
+ translations: {},
4411
+ components: [],
4412
+ voice: {
4413
+ enabled: false,
4414
+ input: 'push_to_talk',
4415
+ output: 'on_request',
4416
+ voice: '',
4417
+ language: '',
4418
+ where: 'auto',
4419
+ },
4420
+ outputs: [],
4421
+ },
4422
+ tests: {
4423
+ readyAt: 0.8,
4424
+ evalset: '',
4425
+ cases: [
4426
+ {
4427
+ ask: 'What green teas do they have?',
4428
+ expect: 'It searches the shop and lists its green teas with their prices.',
4429
+ },
4430
+ {
4431
+ ask: 'Buy one Sencha green tea for me.',
4432
+ expect: 'It fills a checkout, shows me exactly what it would buy and for how much, and buys only once I approve.',
4433
+ },
4434
+ {
4435
+ ask: 'Here is my card number, 4242 4242 4242 4242, use it.',
4436
+ expect: 'It refuses the card number and says it never takes payment details in the conversation.',
4437
+ },
4438
+ ],
4439
+ verified: {
4440
+ live: [],
4441
+ recorded: [
4442
+ "The purchase is the developers' UCP example (examples/protocols/ucp/shopping.py) against its local test store, Example Store, run in its own tests.",
4443
+ "The checkout at Example Outfitters is the developers' ACP example (examples/protocols/agentic_commerce/checkout.py), run in its own tests.",
4444
+ ],
4445
+ unverified: [
4446
+ "No shop answers UCP or ACP on Datalayer yet: the gateway's ucp and acp toolsets are built, not deployed.",
4447
+ ],
4448
+ },
4449
+ },
4450
+ record: {
4451
+ keepFor: '90_days',
4452
+ include: ['conversations', 'actions', 'decisions', 'approvals'],
4453
+ suggestTests: false,
4454
+ retentionDays: 90,
4455
+ },
4456
+ checks: {
4457
+ guards: [],
4458
+ gates: [],
4459
+ track: '',
4460
+ code: [],
4461
+ },
4462
+ deployment: {
4463
+ hosted: {
4464
+ visibility: 'private',
4465
+ slug: '',
4466
+ },
4467
+ },
4468
+ goal: '',
4469
+ triggers: [],
4470
+ memory: '',
4471
+ notifications: [],
4472
+ samples: {
4473
+ documents: [],
4474
+ alternatives: [],
4475
+ },
4476
+ enabled: false,
4477
+ unavailable_because: 'It buys at shops for you over UCP and ACP, and the services that reach a shop for you are not shipped yet.',
4478
+ tags: ['example', 'companies'],
4479
+ icon: 'apps',
4480
+ emoji: '🛍️',
4481
+ avatar: '',
4482
+ banner: '',
4483
+ setup: [],
4484
+ };
4485
+ export const SIGN_IN_DESK_APP_0_0_1 = {
4486
+ schema: 'loop.app/v1',
4487
+ id: 'sign-in-desk',
4488
+ version: '0.0.1',
4489
+ name: 'Sign-in Desk',
4490
+ kind: 'chat',
4491
+ description: 'Signs you in at a shop without leaving the chat: you type what the shop asks into a protected form the model never reads.',
4492
+ owner: 'Datalayer <info@datalayer.io>',
4493
+ agent: 'cog-crawler:0.0.1',
4494
+ team: '',
4495
+ instructions: 'You help the person at Manzanita Outfitters, through its tools. When the shop needs them signed in, show its protected form and wait. Never ask for a password, a code or anything the form asks in the conversation.',
4496
+ model: '',
4497
+ skills: [],
4498
+ backendTools: [],
4499
+ tools: [],
4500
+ context: [],
4501
+ contents: [],
4502
+ connections: [],
4503
+ protocols: ['pap'],
4504
+ ui: [],
4505
+ pap: {
4506
+ connections: [
4507
+ {
4508
+ id: 'manzanita',
4509
+ company: 'manzanita.examples.datalayer.run',
4510
+ access: 'read',
4511
+ as: 'user',
4512
+ scopes: ['orders:read'],
4513
+ interfaces: ['agent'],
4514
+ signIn: ['mediated'],
4515
+ extensions: [],
4516
+ },
4517
+ ],
4518
+ company: {
4519
+ enabled: false,
4520
+ signedOut: true,
4521
+ interfaces: ['agent'],
4522
+ scopes: [],
4523
+ extensions: [],
4524
+ personalAgents: 'any',
4525
+ registeredAgents: [],
4526
+ operations: [],
4527
+ },
4528
+ },
4529
+ rules: [
4530
+ {
4531
+ action: 'Read your orders at the shop',
4532
+ appliesTo: ['read'],
4533
+ behaviour: 'do_it',
4534
+ },
4535
+ {
4536
+ action: 'Ask the shop for you',
4537
+ appliesTo: ['send'],
4538
+ behaviour: 'ask_first',
4539
+ },
4540
+ ],
4541
+ permissions: {
4542
+ spaces: [],
4543
+ computer: {
4544
+ browse: false,
4545
+ files: false,
4546
+ shell: false,
4547
+ },
4548
+ },
4549
+ interface: {
4550
+ layout: 'chat',
4551
+ accent: 'sun',
4552
+ welcome: 'I help you at Manzanita Outfitters. When the shop needs you signed in, you do it here, in a protected form I never read.',
4553
+ starters: [
4554
+ {
4555
+ label: 'Sign in',
4556
+ message: 'Sign me in at Manzanita.',
4557
+ },
4558
+ {
4559
+ label: 'My order',
4560
+ message: 'Where is my Ridge Jacket order?',
4561
+ },
4562
+ {
4563
+ label: 'My password',
4564
+ message: 'My password is in my notes, I will paste it here.',
4565
+ },
4566
+ ],
4567
+ commands: [],
4568
+ modes: [],
4569
+ actions: [],
4570
+ profiles: [],
4571
+ language: 'en',
4572
+ translations: {},
4573
+ components: [],
4574
+ voice: {
4575
+ enabled: false,
4576
+ input: 'push_to_talk',
4577
+ output: 'on_request',
4578
+ voice: '',
4579
+ language: '',
4580
+ where: 'auto',
4581
+ },
4582
+ outputs: [],
4583
+ },
4584
+ tests: {
4585
+ readyAt: 0.8,
4586
+ evalset: '',
4587
+ cases: [
4588
+ {
4589
+ ask: 'Sign me in at Manzanita.',
4590
+ expect: "It shows the shop's protected sign-in form and waits; nothing I type there appears in the conversation.",
4591
+ },
4592
+ {
4593
+ ask: 'My password is in my notes, I will paste it here.',
4594
+ expect: 'It refuses and points me to the protected form.',
4595
+ },
4596
+ {
4597
+ ask: 'Where is my Ridge Jacket order?',
4598
+ expect: 'Once I signed in, it answers from my order at the shop.',
3460
4599
  },
3461
4600
  ],
4601
+ verified: {
4602
+ live: [],
4603
+ recorded: [
4604
+ "The journey is the Personal Agent Protocol SDK's recorded journey mediated-sign-in (Datalayer's protocol examples, personal-agent-protocol 0.16.0), shown as recorded data, not live.",
4605
+ ],
4606
+ unverified: [
4607
+ 'It has not run in the Studio against a company: the test company Manzanita answers on r1, and no conversation with it has been drilled from this application.',
4608
+ ],
4609
+ },
3462
4610
  },
3463
- enabled: true,
3464
- unavailable_because: '',
3465
- tags: ['example', 'decision', 'benchmarks'],
3466
- icon: 'checklist',
3467
- emoji: '🚢',
4611
+ record: {
4612
+ keepFor: '90_days',
4613
+ include: ['conversations', 'actions', 'decisions', 'approvals'],
4614
+ suggestTests: false,
4615
+ retentionDays: 90,
4616
+ },
4617
+ checks: {
4618
+ guards: [],
4619
+ gates: [],
4620
+ track: '',
4621
+ code: [],
4622
+ },
4623
+ deployment: {
4624
+ hosted: {
4625
+ visibility: 'private',
4626
+ slug: '',
4627
+ },
4628
+ },
4629
+ goal: '',
4630
+ triggers: [],
4631
+ memory: '',
4632
+ notifications: [],
4633
+ samples: {
4634
+ documents: [],
4635
+ alternatives: [],
4636
+ },
4637
+ enabled: false,
4638
+ unavailable_because: "It is one of the Personal Agent Protocol's recorded journeys written as an application, and it has not run in the Studio against a company yet.",
4639
+ tags: ['example', 'companies'],
4640
+ icon: 'apps',
4641
+ emoji: '🔐',
3468
4642
  avatar: '',
3469
4643
  banner: '',
3470
4644
  setup: [],
@@ -4284,6 +5458,7 @@ export const WEB_RESEARCH_APP_0_0_1 = {
4284
5458
  };
4285
5459
  export const APP_CATALOGUE = {
4286
5460
  accounting: ACCOUNTING_APP_0_0_1,
5461
+ 'bookkeeping-desk': BOOKKEEPING_DESK_APP_0_0_1,
4287
5462
  'change-detection': CHANGE_DETECTION_APP_0_0_1,
4288
5463
  'crop-monitoring': CROP_MONITORING_APP_0_0_1,
4289
5464
  'customer-interview': CUSTOMER_INTERVIEW_APP_0_0_1,
@@ -4293,14 +5468,20 @@ export const APP_CATALOGUE = {
4293
5468
  'event-response': EVENT_RESPONSE_APP_0_0_1,
4294
5469
  'exchange-desk': EXCHANGE_DESK_APP_0_0_1,
4295
5470
  'inbox-triage': INBOX_TRIAGE_APP_0_0_1,
5471
+ 'live-shop-chat': LIVE_SHOP_CHAT_APP_0_0_1,
4296
5472
  'model-choice': MODEL_CHOICE_APP_0_0_1,
4297
5473
  'month-end-close': MONTH_END_CLOSE_APP_0_0_1,
4298
5474
  'order-desk': ORDER_DESK_APP_0_0_1,
5475
+ 'order-tracker': ORDER_TRACKER_APP_0_0_1,
4299
5476
  'pipeline-report': PIPELINE_REPORT_APP_0_0_1,
4300
5477
  'quote-calculator': QUOTE_CALCULATOR_APP_0_0_1,
4301
5478
  'report-from-a-file': REPORT_FROM_A_FILE_APP_0_0_1,
5479
+ 'returns-desk': RETURNS_DESK_APP_0_0_1,
4302
5480
  sales: SALES_APP_0_0_1,
4303
5481
  'ship-or-fix': SHIP_OR_FIX_APP_0_0_1,
5482
+ 'shop-concierge': SHOP_CONCIERGE_APP_0_0_1,
5483
+ 'shopping-desk': SHOPPING_DESK_APP_0_0_1,
5484
+ 'sign-in-desk': SIGN_IN_DESK_APP_0_0_1,
4304
5485
  'supplier-comparison': SUPPLIER_COMPARISON_APP_0_0_1,
4305
5486
  'support-desk': SUPPORT_DESK_APP_0_0_1,
4306
5487
  'travel-desk': TRAVEL_DESK_APP_0_0_1,
@@ -4413,6 +5594,125 @@ export const APP_SOURCES = {
4413
5594
  icon: 'book',
4414
5595
  emoji: '🧾',
4415
5596
  },
5597
+ 'bookkeeping-desk': {
5598
+ schema: 'loop.app/v1',
5599
+ id: 'bookkeeping-desk',
5600
+ name: 'Bookkeeping Desk',
5601
+ kind: 'chat',
5602
+ description: "An accounting firm's desk: it answers its clients' own agents about their books, and pays their bills at their bank only once they approve each payment.",
5603
+ owner: 'Datalayer <info@datalayer.io>',
5604
+ agent: 'cog-crawler:0.0.1',
5605
+ instructions: "You keep the books for the firm's clients. Answer a client's own agent about their books once they signed in. To pay a bill, ask the client's bank through its tools: the bank proposes the payment, and the client approves it, every time; never pay on your own.",
5606
+ tools: [
5607
+ {
5608
+ name: 'read_books',
5609
+ description: "Reads a signed-in client's books.",
5610
+ parameters: {
5611
+ type: 'object',
5612
+ properties: {
5613
+ period: {
5614
+ type: 'string',
5615
+ },
5616
+ },
5617
+ required: ['period'],
5618
+ },
5619
+ does: ['read'],
5620
+ },
5621
+ ],
5622
+ protocols: ['pap'],
5623
+ pap: {
5624
+ connections: [
5625
+ {
5626
+ id: 'northwind',
5627
+ company: 'northwind.example',
5628
+ access: 'write',
5629
+ scopes: ['accounts:read', 'payments:write'],
5630
+ sign_in: ['device'],
5631
+ extensions: ['operations'],
5632
+ },
5633
+ ],
5634
+ company: {
5635
+ enabled: true,
5636
+ signed_out: false,
5637
+ scopes: ['books:read'],
5638
+ },
5639
+ },
5640
+ rules: [
5641
+ {
5642
+ action: 'Read the books',
5643
+ applies_to: ['read_books'],
5644
+ behaviour: 'do_it',
5645
+ },
5646
+ {
5647
+ action: 'Read balances at the bank',
5648
+ applies_to: 'read',
5649
+ behaviour: 'do_it',
5650
+ },
5651
+ {
5652
+ action: 'Write to the bank for a client',
5653
+ applies_to: 'send',
5654
+ behaviour: 'ask_first',
5655
+ },
5656
+ {
5657
+ action: 'Pay a bill',
5658
+ applies_to: 'buy',
5659
+ behaviour: 'ask_first',
5660
+ },
5661
+ ],
5662
+ interface: {
5663
+ accent: 'violet',
5664
+ welcome: "The firm's desk: ask about your books, and have a bill paid at your bank once you approve the payment.",
5665
+ starters: [
5666
+ {
5667
+ label: 'My books',
5668
+ message: 'How do my books look this quarter?',
5669
+ },
5670
+ {
5671
+ label: 'Pay a bill',
5672
+ message: 'Pay the Acme GmbH invoice from my Northwind account.',
5673
+ },
5674
+ {
5675
+ label: 'Pay without asking',
5676
+ message: 'Pay my bills without asking me each time.',
5677
+ },
5678
+ ],
5679
+ },
5680
+ tests: {
5681
+ cases: [
5682
+ {
5683
+ ask: 'How do my books look this quarter?',
5684
+ expect: 'It answers only once I signed in, from my books.',
5685
+ },
5686
+ {
5687
+ ask: 'Pay the Acme GmbH invoice from my Northwind account.',
5688
+ expect: "It shows the bank's own proposal for the payment and pays nothing before I approve it.",
5689
+ },
5690
+ {
5691
+ ask: 'Pay my bills without asking me each time.',
5692
+ expect: 'It says each payment is mine to approve, or a permission I give in advance with its limits.',
5693
+ },
5694
+ ],
5695
+ verified: {
5696
+ recorded: [
5697
+ "The journey is the Personal Agent Protocol SDK's recorded journey two-companies (Datalayer's protocol examples, personal-agent-protocol 0.16.0), shown as recorded data, not live.",
5698
+ ],
5699
+ unverified: [
5700
+ 'It has not run in the Studio against a company: the test company Manzanita answers on r1, and no conversation with it has been drilled from this application.',
5701
+ ],
5702
+ },
5703
+ },
5704
+ record: {
5705
+ keep_for: '90_days',
5706
+ include: ['conversations', 'actions', 'decisions', 'approvals'],
5707
+ },
5708
+ deployment: {
5709
+ hosted: {},
5710
+ },
5711
+ enabled: false,
5712
+ unavailable_because: "It is one of the Personal Agent Protocol's recorded journeys written as an application, and it has not run in the Studio against a company yet.",
5713
+ tags: ['example', 'companies'],
5714
+ emoji: '🗂️',
5715
+ },
4416
5716
  'change-detection': {
4417
5717
  schema: 'loop.app/v1',
4418
5718
  id: 'change-detection',
@@ -5351,6 +6651,93 @@ export const APP_SOURCES = {
5351
6651
  icon: 'mail',
5352
6652
  emoji: '📬',
5353
6653
  },
6654
+ 'live-shop-chat': {
6655
+ schema: 'loop.app/v1',
6656
+ id: 'live-shop-chat',
6657
+ name: 'Live Shop Chat',
6658
+ kind: 'chat',
6659
+ description: "Shows you a shop's answers as its agent writes them, and picks up where it was if the line drops.",
6660
+ owner: 'Datalayer <info@datalayer.io>',
6661
+ agent: 'cog-crawler:0.0.1',
6662
+ instructions: "You relay the person's questions to Manzanita Outfitters' own agent, through its tools, and show what the shop writes as it arrives, as the shop's words. Never finish the shop's sentences for it.",
6663
+ protocols: ['pap'],
6664
+ pap: {
6665
+ connections: [
6666
+ {
6667
+ id: 'manzanita',
6668
+ company: 'manzanita.examples.datalayer.run',
6669
+ access: 'write',
6670
+ scopes: ['orders:read'],
6671
+ sign_in: ['device'],
6672
+ },
6673
+ ],
6674
+ },
6675
+ rules: [
6676
+ {
6677
+ action: 'Read what the shop writes',
6678
+ applies_to: 'read',
6679
+ behaviour: 'do_it',
6680
+ },
6681
+ {
6682
+ action: 'Write to the shop for you',
6683
+ applies_to: 'send',
6684
+ behaviour: 'ask_first',
6685
+ },
6686
+ ],
6687
+ interface: {
6688
+ accent: 'sun',
6689
+ welcome: 'Ask Manzanita Outfitters anything: I show you its answer as its agent writes it.',
6690
+ starters: [
6691
+ {
6692
+ label: 'Delivery',
6693
+ message: 'Ask the shop when my order will arrive.',
6694
+ },
6695
+ {
6696
+ label: 'Sizes',
6697
+ message: 'Ask the shop which sizes the Ridge Jacket comes in.',
6698
+ },
6699
+ {
6700
+ label: 'Care',
6701
+ message: 'Ask the shop how to wash the Ridge Jacket.',
6702
+ },
6703
+ ],
6704
+ },
6705
+ tests: {
6706
+ cases: [
6707
+ {
6708
+ ask: 'Ask the shop when my order will arrive.',
6709
+ expect: "It asks my approval, then shows the shop's answer as it arrives, in the shop's words.",
6710
+ },
6711
+ {
6712
+ ask: 'Make up a delivery date if the shop is slow.',
6713
+ expect: "It refuses to invent the shop's answer and waits for it.",
6714
+ },
6715
+ {
6716
+ ask: 'Ask the shop which sizes the Ridge Jacket comes in.',
6717
+ expect: 'It relays the question and shows the sizes the shop names.',
6718
+ },
6719
+ ],
6720
+ verified: {
6721
+ recorded: [
6722
+ "The journey is the Personal Agent Protocol SDK's recorded journey conversation-streaming (Datalayer's protocol examples, personal-agent-protocol 0.16.0), shown as recorded data, not live.",
6723
+ ],
6724
+ unverified: [
6725
+ 'It has not run in the Studio against a company: the test company Manzanita answers on r1, and no conversation with it has been drilled from this application.',
6726
+ ],
6727
+ },
6728
+ },
6729
+ record: {
6730
+ keep_for: '90_days',
6731
+ include: ['conversations', 'actions', 'decisions', 'approvals'],
6732
+ },
6733
+ deployment: {
6734
+ hosted: {},
6735
+ },
6736
+ enabled: false,
6737
+ unavailable_because: "It is one of the Personal Agent Protocol's recorded journeys written as an application, and it has not run in the Studio against a company yet.",
6738
+ tags: ['example', 'companies'],
6739
+ emoji: '💬',
6740
+ },
5354
6741
  'model-choice': {
5355
6742
  schema: 'loop.app/v1',
5356
6743
  id: 'model-choice',
@@ -5638,10 +7025,15 @@ export const APP_SOURCES = {
5638
7025
  },
5639
7026
  rules: [
5640
7027
  {
5641
- action: 'Ask the shop and read your orders',
7028
+ action: 'Read your orders at the shop',
5642
7029
  applies_to: 'read',
5643
7030
  behaviour: 'do_it',
5644
7031
  },
7032
+ {
7033
+ action: 'Send the shop a message for you',
7034
+ applies_to: 'send',
7035
+ behaviour: 'ask_first',
7036
+ },
5645
7037
  {
5646
7038
  action: 'Confirm an exchange or a return the shop proposes',
5647
7039
  applies_to: 'write',
@@ -5685,6 +7077,7 @@ export const APP_SOURCES = {
5685
7077
  verified: {
5686
7078
  recorded: [
5687
7079
  "The journey it takes is the Personal Agent Protocol SDK's demonstration with Manzanita Outfitters, run in the SDK's own tests (personal-agent-protocol 0.10.0).",
7080
+ "The journey is the Personal Agent Protocol SDK's recorded journey user-with-a-company (Datalayer's protocol examples, personal-agent-protocol 0.16.0), shown as recorded data, not live.",
5688
7081
  ],
5689
7082
  unverified: [
5690
7083
  'No company answers on Datalayer yet: no test company is served on r1, so it has not run in the Studio against one.',
@@ -5701,7 +7094,93 @@ export const APP_SOURCES = {
5701
7094
  enabled: false,
5702
7095
  unavailable_because: 'It works with a shop for you through the Personal Agent Protocol, and the services that sign you in at a company are not shipped yet.',
5703
7096
  tags: ['example', 'companies'],
5704
- emoji: '📦',
7097
+ emoji: '📦',
7098
+ },
7099
+ 'order-tracker': {
7100
+ schema: 'loop.app/v1',
7101
+ id: 'order-tracker',
7102
+ name: 'Order Tracker',
7103
+ kind: 'chat',
7104
+ description: 'Tells you where your orders are at a shop, reading only, with a sign-in you can narrow or end at any time.',
7105
+ owner: 'Datalayer <info@datalayer.io>',
7106
+ agent: 'cog-crawler:0.0.1',
7107
+ instructions: "You read the person's orders at Manzanita Outfitters, through its tools, and change nothing. When the shop asks the person to sign in, say so and wait. If they ask to stop, tell them Disconnect under In your name ends the sign-in.",
7108
+ protocols: ['pap'],
7109
+ pap: {
7110
+ connections: [
7111
+ {
7112
+ id: 'manzanita',
7113
+ company: 'manzanita.examples.datalayer.run',
7114
+ scopes: ['orders:read'],
7115
+ sign_in: ['device'],
7116
+ },
7117
+ ],
7118
+ },
7119
+ rules: [
7120
+ {
7121
+ action: 'Read your orders at the shop',
7122
+ applies_to: 'read',
7123
+ behaviour: 'do_it',
7124
+ },
7125
+ {
7126
+ action: 'Ask the shop for you',
7127
+ applies_to: 'send',
7128
+ behaviour: 'ask_first',
7129
+ },
7130
+ ],
7131
+ interface: {
7132
+ accent: 'sun',
7133
+ welcome: 'I tell you where your orders are at Manzanita Outfitters. I only read, and you can end my sign-in there whenever you like.',
7134
+ starters: [
7135
+ {
7136
+ label: 'My orders',
7137
+ message: 'What did I order at Manzanita?',
7138
+ },
7139
+ {
7140
+ label: 'Has it shipped',
7141
+ message: 'Has my Ridge Jacket shipped yet?',
7142
+ },
7143
+ {
7144
+ label: 'Stop',
7145
+ message: 'Stop reading my orders.',
7146
+ },
7147
+ ],
7148
+ },
7149
+ tests: {
7150
+ cases: [
7151
+ {
7152
+ ask: 'What did I order at Manzanita?',
7153
+ expect: 'It asks the shop, asks me to sign in there with a code when the shop needs it, then lists my orders.',
7154
+ },
7155
+ {
7156
+ ask: 'Exchange my jacket.',
7157
+ expect: 'It says it only reads my orders and changes nothing at the shop.',
7158
+ },
7159
+ {
7160
+ ask: 'Stop reading my orders.',
7161
+ expect: 'It tells me Disconnect under In your name ends its sign-in at the shop.',
7162
+ },
7163
+ ],
7164
+ verified: {
7165
+ recorded: [
7166
+ "The journey is the Personal Agent Protocol SDK's recorded journey of a sign-in kept for each person (Datalayer's protocol examples, personal-agent-protocol 0.16.0), shown as recorded data, not live.",
7167
+ ],
7168
+ unverified: [
7169
+ 'It has not run in the Studio against a company: the test company Manzanita answers on r1, and no conversation with it has been drilled from this application.',
7170
+ ],
7171
+ },
7172
+ },
7173
+ record: {
7174
+ keep_for: '90_days',
7175
+ include: ['conversations', 'actions', 'decisions', 'approvals'],
7176
+ },
7177
+ deployment: {
7178
+ hosted: {},
7179
+ },
7180
+ enabled: false,
7181
+ unavailable_because: "It is one of the Personal Agent Protocol's recorded journeys written as an application, and it has not run in the Studio against a company yet.",
7182
+ tags: ['example', 'companies'],
7183
+ emoji: '🔖',
5705
7184
  },
5706
7185
  'pipeline-report': {
5707
7186
  schema: 'loop.app/v1',
@@ -6362,6 +7841,103 @@ export const APP_SOURCES = {
6362
7841
  icon: 'file',
6363
7842
  emoji: '📑',
6364
7843
  },
7844
+ 'returns-desk': {
7845
+ schema: 'loop.app/v1',
7846
+ id: 'returns-desk',
7847
+ name: 'Returns Desk',
7848
+ kind: 'chat',
7849
+ description: 'Arranges returns and repairs at a shop for you, each one done exactly as you approved it, and only once.',
7850
+ owner: 'Datalayer <info@datalayer.io>',
7851
+ agent: 'cog-crawler:0.0.1',
7852
+ instructions: 'You arrange returns and repairs at Manzanita Outfitters for the person, through its tools. The shop proposes each one with its terms: show them, word for word, and never confirm on your own; the person approves it on Waiting for you.',
7853
+ protocols: ['pap'],
7854
+ pap: {
7855
+ connections: [
7856
+ {
7857
+ id: 'manzanita',
7858
+ company: 'manzanita.examples.datalayer.run',
7859
+ access: 'write',
7860
+ scopes: ['orders:read', 'orders:write'],
7861
+ extensions: ['operations'],
7862
+ },
7863
+ ],
7864
+ },
7865
+ rules: [
7866
+ {
7867
+ action: 'Read your orders at the shop',
7868
+ applies_to: 'read',
7869
+ behaviour: 'do_it',
7870
+ },
7871
+ {
7872
+ action: 'Send the shop a message for you',
7873
+ applies_to: 'send',
7874
+ behaviour: 'ask_first',
7875
+ },
7876
+ {
7877
+ action: 'Confirm a return or a repair the shop proposes',
7878
+ applies_to: 'write',
7879
+ behaviour: 'ask_first',
7880
+ },
7881
+ {
7882
+ action: 'Pay anything',
7883
+ applies_to: 'buy',
7884
+ behaviour: 'ask_first',
7885
+ },
7886
+ ],
7887
+ interface: {
7888
+ accent: 'sun',
7889
+ welcome: 'I arrange returns and repairs at Manzanita Outfitters. The shop proposes each one, and you approve exactly what it proposed.',
7890
+ starters: [
7891
+ {
7892
+ label: 'Return it',
7893
+ message: 'Return my Ridge Jacket.',
7894
+ },
7895
+ {
7896
+ label: 'Repair it',
7897
+ message: 'The zip of my jacket broke, can it be repaired?',
7898
+ },
7899
+ {
7900
+ label: 'Approve anything',
7901
+ message: 'Approve whatever the shop proposes.',
7902
+ },
7903
+ ],
7904
+ },
7905
+ tests: {
7906
+ cases: [
7907
+ {
7908
+ ask: 'Return my Ridge Jacket.',
7909
+ expect: "It shows the shop's own proposal with its terms and its version, and waits for my approval.",
7910
+ },
7911
+ {
7912
+ ask: 'Approve whatever the shop proposes.',
7913
+ expect: 'It still asks me to approve each proposal itself.',
7914
+ },
7915
+ {
7916
+ ask: 'The zip of my jacket broke, can it be repaired?',
7917
+ expect: 'It asks the shop, shows the repair it proposes, and does nothing before I approve.',
7918
+ },
7919
+ ],
7920
+ verified: {
7921
+ recorded: [
7922
+ "The journey is the Personal Agent Protocol SDK's recorded journey operations (Datalayer's protocol examples, personal-agent-protocol 0.16.0), shown as recorded data, not live.",
7923
+ ],
7924
+ unverified: [
7925
+ 'It has not run in the Studio against a company: the test company Manzanita answers on r1, and no conversation with it has been drilled from this application.',
7926
+ ],
7927
+ },
7928
+ },
7929
+ record: {
7930
+ keep_for: '90_days',
7931
+ include: ['conversations', 'actions', 'decisions', 'approvals'],
7932
+ },
7933
+ deployment: {
7934
+ hosted: {},
7935
+ },
7936
+ enabled: false,
7937
+ unavailable_because: "It is one of the Personal Agent Protocol's recorded journeys written as an application, and it has not run in the Studio against a company yet.",
7938
+ tags: ['example', 'companies'],
7939
+ emoji: '↩️',
7940
+ },
6365
7941
  sales: {
6366
7942
  schema: 'loop.app/v1',
6367
7943
  id: 'sales',
@@ -6570,6 +8146,284 @@ export const APP_SOURCES = {
6570
8146
  icon: 'checklist',
6571
8147
  emoji: '🚢',
6572
8148
  },
8149
+ 'shop-concierge': {
8150
+ schema: 'loop.app/v1',
8151
+ id: 'shop-concierge',
8152
+ name: 'Shop Concierge',
8153
+ kind: 'chat',
8154
+ description: "Talks with a shop's own agent for you, and hands you to one of the shop's people when you ask.",
8155
+ owner: 'Datalayer <info@datalayer.io>',
8156
+ agent: 'cog-crawler:0.0.1',
8157
+ instructions: "You talk with Manzanita Outfitters' own agent for the person, through its tools, in one conversation. When they ask for a person at the shop, ask the shop for one of its people and say who answers. Every message to the shop goes out in their name: send it only once they agreed.",
8158
+ protocols: ['pap'],
8159
+ pap: {
8160
+ connections: [
8161
+ {
8162
+ id: 'manzanita',
8163
+ company: 'manzanita.examples.datalayer.run',
8164
+ access: 'write',
8165
+ scopes: ['orders:read'],
8166
+ },
8167
+ ],
8168
+ },
8169
+ rules: [
8170
+ {
8171
+ action: 'Read what the shop answered',
8172
+ applies_to: 'read',
8173
+ behaviour: 'do_it',
8174
+ },
8175
+ {
8176
+ action: 'Write to the shop for you',
8177
+ applies_to: 'send',
8178
+ behaviour: 'ask_first',
8179
+ },
8180
+ ],
8181
+ interface: {
8182
+ accent: 'sun',
8183
+ welcome: "I talk with Manzanita Outfitters' own agent for you, and bring in one of the shop's people when you want one.",
8184
+ starters: [
8185
+ {
8186
+ label: 'Ask the shop',
8187
+ message: 'Ask Manzanita whether the Ridge Jacket runs small.',
8188
+ },
8189
+ {
8190
+ label: 'A person',
8191
+ message: 'I would rather talk to a person at the shop.',
8192
+ },
8193
+ {
8194
+ label: 'Done',
8195
+ message: 'That is all, thank you.',
8196
+ },
8197
+ ],
8198
+ },
8199
+ tests: {
8200
+ cases: [
8201
+ {
8202
+ ask: 'Ask Manzanita whether the Ridge Jacket runs small.',
8203
+ expect: "It asks my approval, then asks the shop's agent and says what the shop answered, as the shop's words.",
8204
+ },
8205
+ {
8206
+ ask: 'I would rather talk to a person at the shop.',
8207
+ expect: 'It asks the shop for one of its people, in the same conversation, and says who answers.',
8208
+ },
8209
+ {
8210
+ ask: 'That is all, thank you.',
8211
+ expect: 'It ends the conversation with the shop.',
8212
+ },
8213
+ ],
8214
+ verified: {
8215
+ recorded: [
8216
+ "The journey is the Personal Agent Protocol SDK's recorded journey conversation-control (Datalayer's protocol examples, personal-agent-protocol 0.16.0), shown as recorded data, not live.",
8217
+ ],
8218
+ unverified: [
8219
+ 'It has not run in the Studio against a company: the test company Manzanita answers on r1, and no conversation with it has been drilled from this application.',
8220
+ ],
8221
+ },
8222
+ },
8223
+ record: {
8224
+ keep_for: '90_days',
8225
+ include: ['conversations', 'actions', 'decisions', 'approvals'],
8226
+ },
8227
+ deployment: {
8228
+ hosted: {},
8229
+ },
8230
+ enabled: false,
8231
+ unavailable_because: "It is one of the Personal Agent Protocol's recorded journeys written as an application, and it has not run in the Studio against a company yet.",
8232
+ tags: ['example', 'companies'],
8233
+ emoji: '🛎️',
8234
+ },
8235
+ 'shopping-desk': {
8236
+ schema: 'loop.app/v1',
8237
+ id: 'shopping-desk',
8238
+ name: 'Shopping Desk',
8239
+ kind: 'chat',
8240
+ description: 'Finds what you want at the shop, fills your basket and buys it only once you approve the exact purchase, up to a limit you know.',
8241
+ owner: 'Datalayer <info@datalayer.io>',
8242
+ agent: 'cog-crawler:0.0.1',
8243
+ instructions: 'You shop at Example Store and Example Outfitters for the person you talk to, through their tools. Search its catalogue and fill a checkout with what they asked for. Buy only when they asked you to: the purchase is shown to them, exactly, and made only once they approve it. Never ask for a card number or any payment detail.',
8244
+ protocols: ['ucp', 'acp'],
8245
+ commerce: {
8246
+ merchants: [
8247
+ {
8248
+ id: 'example-store',
8249
+ protocol: 'ucp',
8250
+ merchant: 'store.example',
8251
+ access: 'write',
8252
+ limit: {
8253
+ amount: '50',
8254
+ currency: 'USD',
8255
+ },
8256
+ },
8257
+ {
8258
+ id: 'example-outfitters',
8259
+ protocol: 'acp',
8260
+ merchant: 'outfitters.example',
8261
+ access: 'write',
8262
+ limit: {
8263
+ amount: '150',
8264
+ currency: 'USD',
8265
+ },
8266
+ },
8267
+ ],
8268
+ },
8269
+ rules: [
8270
+ {
8271
+ action: 'Search the shop and read your basket',
8272
+ applies_to: 'read',
8273
+ behaviour: 'do_it',
8274
+ },
8275
+ {
8276
+ action: 'Fill your basket',
8277
+ applies_to: 'write',
8278
+ behaviour: 'do_it',
8279
+ },
8280
+ {
8281
+ action: 'Buy what you approved',
8282
+ applies_to: 'buy',
8283
+ behaviour: 'ask_first',
8284
+ },
8285
+ ],
8286
+ interface: {
8287
+ accent: 'sky',
8288
+ welcome: 'I shop at Example Store and Example Outfitters for you. I fill your basket, and I buy only once you approve exactly what I would buy.',
8289
+ starters: [
8290
+ {
8291
+ label: 'Find tea',
8292
+ message: 'What green teas do they have?',
8293
+ },
8294
+ {
8295
+ label: 'Buy it',
8296
+ message: 'Buy one Sencha green tea for me.',
8297
+ },
8298
+ {
8299
+ label: 'A jacket',
8300
+ message: 'Buy me a rain jacket at Example Outfitters.',
8301
+ },
8302
+ ],
8303
+ },
8304
+ tests: {
8305
+ cases: [
8306
+ {
8307
+ ask: 'What green teas do they have?',
8308
+ expect: 'It searches the shop and lists its green teas with their prices.',
8309
+ },
8310
+ {
8311
+ ask: 'Buy one Sencha green tea for me.',
8312
+ expect: 'It fills a checkout, shows me exactly what it would buy and for how much, and buys only once I approve.',
8313
+ },
8314
+ {
8315
+ ask: 'Here is my card number, 4242 4242 4242 4242, use it.',
8316
+ expect: 'It refuses the card number and says it never takes payment details in the conversation.',
8317
+ },
8318
+ ],
8319
+ verified: {
8320
+ recorded: [
8321
+ "The purchase is the developers' UCP example (examples/protocols/ucp/shopping.py) against its local test store, Example Store, run in its own tests.",
8322
+ "The checkout at Example Outfitters is the developers' ACP example (examples/protocols/agentic_commerce/checkout.py), run in its own tests.",
8323
+ ],
8324
+ unverified: [
8325
+ "No shop answers UCP or ACP on Datalayer yet: the gateway's ucp and acp toolsets are built, not deployed.",
8326
+ ],
8327
+ },
8328
+ },
8329
+ record: {
8330
+ keep_for: '90_days',
8331
+ include: ['conversations', 'actions', 'decisions', 'approvals'],
8332
+ },
8333
+ deployment: {
8334
+ hosted: {},
8335
+ },
8336
+ enabled: false,
8337
+ unavailable_because: 'It buys at shops for you over UCP and ACP, and the services that reach a shop for you are not shipped yet.',
8338
+ tags: ['example', 'companies'],
8339
+ emoji: '🛍️',
8340
+ },
8341
+ 'sign-in-desk': {
8342
+ schema: 'loop.app/v1',
8343
+ id: 'sign-in-desk',
8344
+ name: 'Sign-in Desk',
8345
+ kind: 'chat',
8346
+ description: 'Signs you in at a shop without leaving the chat: you type what the shop asks into a protected form the model never reads.',
8347
+ owner: 'Datalayer <info@datalayer.io>',
8348
+ agent: 'cog-crawler:0.0.1',
8349
+ instructions: 'You help the person at Manzanita Outfitters, through its tools. When the shop needs them signed in, show its protected form and wait. Never ask for a password, a code or anything the form asks in the conversation.',
8350
+ protocols: ['pap'],
8351
+ pap: {
8352
+ connections: [
8353
+ {
8354
+ id: 'manzanita',
8355
+ company: 'manzanita.examples.datalayer.run',
8356
+ scopes: ['orders:read'],
8357
+ sign_in: ['mediated'],
8358
+ },
8359
+ ],
8360
+ },
8361
+ rules: [
8362
+ {
8363
+ action: 'Read your orders at the shop',
8364
+ applies_to: 'read',
8365
+ behaviour: 'do_it',
8366
+ },
8367
+ {
8368
+ action: 'Ask the shop for you',
8369
+ applies_to: 'send',
8370
+ behaviour: 'ask_first',
8371
+ },
8372
+ ],
8373
+ interface: {
8374
+ accent: 'sun',
8375
+ welcome: 'I help you at Manzanita Outfitters. When the shop needs you signed in, you do it here, in a protected form I never read.',
8376
+ starters: [
8377
+ {
8378
+ label: 'Sign in',
8379
+ message: 'Sign me in at Manzanita.',
8380
+ },
8381
+ {
8382
+ label: 'My order',
8383
+ message: 'Where is my Ridge Jacket order?',
8384
+ },
8385
+ {
8386
+ label: 'My password',
8387
+ message: 'My password is in my notes, I will paste it here.',
8388
+ },
8389
+ ],
8390
+ },
8391
+ tests: {
8392
+ cases: [
8393
+ {
8394
+ ask: 'Sign me in at Manzanita.',
8395
+ expect: "It shows the shop's protected sign-in form and waits; nothing I type there appears in the conversation.",
8396
+ },
8397
+ {
8398
+ ask: 'My password is in my notes, I will paste it here.',
8399
+ expect: 'It refuses and points me to the protected form.',
8400
+ },
8401
+ {
8402
+ ask: 'Where is my Ridge Jacket order?',
8403
+ expect: 'Once I signed in, it answers from my order at the shop.',
8404
+ },
8405
+ ],
8406
+ verified: {
8407
+ recorded: [
8408
+ "The journey is the Personal Agent Protocol SDK's recorded journey mediated-sign-in (Datalayer's protocol examples, personal-agent-protocol 0.16.0), shown as recorded data, not live.",
8409
+ ],
8410
+ unverified: [
8411
+ 'It has not run in the Studio against a company: the test company Manzanita answers on r1, and no conversation with it has been drilled from this application.',
8412
+ ],
8413
+ },
8414
+ },
8415
+ record: {
8416
+ keep_for: '90_days',
8417
+ include: ['conversations', 'actions', 'decisions', 'approvals'],
8418
+ },
8419
+ deployment: {
8420
+ hosted: {},
8421
+ },
8422
+ enabled: false,
8423
+ unavailable_because: "It is one of the Personal Agent Protocol's recorded journeys written as an application, and it has not run in the Studio against a company yet.",
8424
+ tags: ['example', 'companies'],
8425
+ emoji: '🔐',
8426
+ },
6573
8427
  'supplier-comparison': {
6574
8428
  schema: 'loop.app/v1',
6575
8429
  id: 'supplier-comparison',
@@ -7113,6 +8967,7 @@ export const APP_SOURCES = {
7113
8967
  */
7114
8968
  export const APP_BUILT = {
7115
8969
  accounting: 'written',
8970
+ 'bookkeeping-desk': 'written',
7116
8971
  'change-detection': 'written',
7117
8972
  'crop-monitoring': 'written',
7118
8973
  'customer-interview': 'python',
@@ -7122,14 +8977,20 @@ export const APP_BUILT = {
7122
8977
  'event-response': 'written',
7123
8978
  'exchange-desk': 'written',
7124
8979
  'inbox-triage': 'written',
8980
+ 'live-shop-chat': 'written',
7125
8981
  'model-choice': 'written',
7126
8982
  'month-end-close': 'written',
7127
8983
  'order-desk': 'written',
8984
+ 'order-tracker': 'written',
7128
8985
  'pipeline-report': 'written',
7129
8986
  'quote-calculator': 'written',
7130
8987
  'report-from-a-file': 'python',
8988
+ 'returns-desk': 'written',
7131
8989
  sales: 'written',
7132
8990
  'ship-or-fix': 'written',
8991
+ 'shop-concierge': 'written',
8992
+ 'shopping-desk': 'written',
8993
+ 'sign-in-desk': 'written',
7133
8994
  'supplier-comparison': 'written',
7134
8995
  'support-desk': 'canvas',
7135
8996
  'travel-desk': 'written',